# HG changeset patch # User Pat Downey # Date 1245941994 -3600 # Node ID 0a7b44b102068464f33d270fa641a9616948680a # Parent c550164313580a42d6e7abbe0f965a121e2eff50 Catch up of Symbian tools for @1627812 diff -r c55016431358 -r 0a7b44b10206 symport/bafl/inc/bacline.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/inc/bacline.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,72 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __BACLINE_H +#define __BACLINE_H + +#ifndef __E32BASE_H +#include +#endif + +/** +Not available until Platform 003 +@internalComponent +*/ +typedef TBuf<0x100> TBaCommand; + +class CCommandLineArguments : public CBase +/** Parses command line arguments. + +The class provides functions to access the arguments that are supplied when +a program is launched as a new process. + +The program name is returned as argument 0. Other arguments are returned as +arguments 1, 2 etc. + +The Count() function indicates how many arguments there are, including the +program name. Arguments may be quoted to contain blanks and quotes. + +The command line arguments and process name occupy 256 characters each. In +order to minimise the space used throughout the lifetime of a program, it +is recommended that the program parse the arguments shortly after initialisation, +save the argument values appropriately, and then destroy the CCommandLineArguments +object. + +The main use of this class is in parsing the arguments of WINC command-line +utilities. + +This class is not intended for user derivation +@publishedAll +@released +*/ + { +public: + // construct/destruct + IMPORT_C static CCommandLineArguments* NewLC(); + IMPORT_C static CCommandLineArguments* NewL(); + IMPORT_C ~CCommandLineArguments(); + // extract + IMPORT_C TPtrC Arg(TInt aArg) const; + IMPORT_C TInt Count() const; +private: + CCommandLineArguments(); + void ConstructL(); +private: + CArrayFixFlat* iArgs; + HBufC* iCommandLine; + TFileName iFileName; + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/bafl/inc/stringpool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/inc/stringpool.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,291 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __STRINGPOOL_H__ +#define __STRINGPOOL_H__ + +#include +#include +#include + +class RStringF; +class RString; +class RStringToken; +class RStringTokenF; +class MStringPoolCloseCallBack; +class RStringBase; +class CStringPoolImplementation; + + +class MStringPoolCloseCallBack +/** +Abstract callback interface that alerts implementors to when a string pool +closes. +@publishedAll +@released +*/ + { + ///Implement this function to perform some operation when the string pool is being closed + public: + /** Called when the string pool is about to close. */ + virtual void StringPoolClosing()=0; + }; + +/** The string pool handle object. A string pool can have several + distinct handles associated with it, each associated with a + different pre-loaded table. The difference between them is that + creating a string from an enum will interpret the enum as an + offset into the relevant pre-loaded table */ +class RStringPool +/** +String pool handle. + +A string pool can have several distinct handles associated with it, each associated +with a different pre-loaded table. Creating a string from an enum value interprets +the value as an offset into the relevant pre-loaded table. +@publishedAll +@released +*/ + { + public: + inline RStringPool(); + + IMPORT_C void OpenL(); + + IMPORT_C void OpenL(const TStringTable& aTable); + + IMPORT_C void OpenL(const TStringTable& aTable,MStringPoolCloseCallBack& aCallBack); + + IMPORT_C void Close(); + + IMPORT_C RStringF OpenFStringL(const TDesC8& aString) const; + + IMPORT_C RString OpenStringL(const TDesC8& aString) const; + + IMPORT_C RString String(RStringToken aString) const; + + IMPORT_C RString String(TInt aIndex,const TStringTable& aTable) const; + + IMPORT_C RStringF StringF(RStringTokenF aString) const; + + IMPORT_C RStringF StringF(TInt aIndex,const TStringTable& aTable) const; + + private: + friend class RStringBase; + friend class RString; + friend class RStringF; + friend class CStringPoolImplementation; + + CStringPoolImplementation* iImplementation; + }; + +/** A compact (4 byte) representation of a string in the string pool. This + class must be turned into a RStringBase (or one of its derived classes) before you can do anything + useful with it. It is only intended to be used when storing strings + in situations where space matters; normaly use RStringBase. + @see RStringBase +*/ +class RStringTokenBase +/** +Base class for the RStringToken and RStringTokenF string representations. +A compact (4 byte) representation of a string in the string pool. This +class must be turned into a RStringBase (or one of its derived classes) before you can do anything +useful with it. It is only intended to be used when storing strings +in situations where space matters; normaly use RStringBase. +@see RStringBase +@publishedAll +@released +*/ + { + public: + inline RStringTokenBase(); + + inline RStringTokenBase operator=(RStringBase aVal); + + inline TBool IsNull() const; + + protected: + friend class RStringPool; + friend class RStringBase; + friend class RStringTokenEither; + friend class CStringPoolImplementation; + + TUint32 iVal; + }; + + +class RStringToken : public RStringTokenBase +/** +A compact (4 byte) representation of a string in the string pool. + +This class must be turned into a RString before you can do anything useful +with it. It is only intended to be used when storing strings in situations +where space matters. You should normally use RString. +@publishedAll +@released +*/ + { + public: + inline TBool operator==(RStringToken aVal) const; + + inline TBool operator!=(RStringToken aVal) const; + + inline RStringToken operator=(RString aVal); + + friend class RStringPool; + friend class RString; + friend class CStringPoolImplementation; + }; + +class RStringTokenF : public RStringTokenBase +/** +A compact (4 byte) representation of a RStringF string in the string pool. + +This class must be turned into a RStringF before you can do anything useful +with it. It is only intended to be used when storing strings in situations +where space matters. You should normally use RStringF. +@publishedAll +@released +*/ + { + public: + inline TBool operator==(RStringTokenF aVal) const; + + inline TBool operator!=(RStringTokenF aVal) const; + + inline RStringTokenF operator=(RStringF aVal); + + friend class RStringPool; + friend class RStringF; + friend class CStringPoolImplementation; + }; + +class RStringBase +/** +Base class for classes that represent a string in a string pool. + +There are sub-classes for folded and non-folded strings. Use this class when +you want to receive a string, but have no intention of comparing it with anything. + + +@see RStringPool +@publishedAll +@released +*/ + { + public: + inline RStringBase(); + + IMPORT_C void Close(); + + IMPORT_C RStringBase Copy(); + + IMPORT_C const TDesC8& DesC() const; + + inline operator RStringTokenBase() const; + + IMPORT_C TInt Index(const TStringTable& aTable) const; + + IMPORT_C const TStringTable* OriginalTableRef() const; + + inline RStringPool Pool() const; + + protected: + friend class RStringPool; + friend class RStringTokenBase; + + RStringPool iPool; + TUint32 iVal; + }; + +class RString : public RStringBase +/** +A string that is stored in a string pool, with case-sensitive comparisons. + +To initialise values of this class, you need to use the operator() functions +on the RStringPool. + +This class performs comparisons in a non-folded (case sensitive) manner. + +@see RStringPool +@publishedAll +@released +*/ + { + public: + inline RString Copy(); + + inline operator RStringToken() const; + + inline TBool operator==(const RString& aVal) const; + + inline TBool operator!=(const RString& aVal) const; + + friend class RStringPool; + friend class RStringToken; + }; + +class RStringF : public RStringBase +/** +A string that is stored in a string pool, with case-insensitive comparisons. + +To initialise values of this class, you need to use the operator() functions +on the RStringPool. + +Comparisons with this class use folded (case insensitive) comparisons. +@publishedAll +@released +*/ + { + public: + inline RStringF Copy(); + + inline operator RStringTokenF() const; + + inline TBool operator==(const RStringF& aVal) const; + + inline TBool operator!=(const RStringF& aVal) const; + + friend class RStringPool; + friend class RStringTokenF; + }; + +/** +A pointer to a string table. +@publishedAll +@released +*/ + +struct TStringTable + { + /// The number of elements in the table + /** The number of elements in the table. */ + TUint iCount; + /// A pointer to an array of pointers to the strings + /** A pointer to an array of pointers to the strings. */ + const void* const * iTable; + + /// ETrue if the table should be considered case-sensitive. + /** Flag that is ETrue if the table should be considered case-sensitive, otherwise + EFalse. */ + TBool iCaseSensitive; + }; + +// Include the inline functions +#include + +#endif // __STRINGPOOL_H__ + + diff -r c55016431358 -r 0a7b44b10206 symport/bafl/inc/stringpool.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/inc/stringpool.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,222 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __STRINGPOOL_INL__ +#define __STRINGPOOL_INL__ + + + +inline RStringTokenBase::RStringTokenBase() + : iVal(0) +/** Default constructor. */ + { + } + + +inline RStringTokenBase RStringTokenBase::operator=(RStringBase aVal) +/** Assignment operator, which makes a string token from a string. + +@param aVal The value of the string to copy. +@return The string token base. */ + { + iVal = aVal.iVal; + return *this; + } + + +inline TBool RStringTokenBase::IsNull() const +/** Tests if the string is null or not. + +@return ETrue if the string is null, otherwise EFalse. */ + { + return (iVal == 0); + } + + +inline TBool RStringToken::operator==(RStringToken aVal) const +/** Equality operator. + +@param aVal The string to compare. +@return ETrue if the strings are the same, otherwise EFalse. */ + { + return iVal == aVal.iVal; + } + + +inline TBool RStringToken::operator!=(RStringToken aVal) const +/** Inequality operator. + +@param aVal The string to compare. +@return ETrue if the strings are different, else EFalse */ + { + return iVal != aVal.iVal; + } + + +inline RStringToken RStringToken::operator=(RString aVal) +/** Assignment operator, which makes a string token from a string. + +@param aVal The string to copy. +@return The string token. */ + { + iVal = aVal.iVal; + return *this; + } + + +inline TBool RStringTokenF::operator==(RStringTokenF aVal) const +/** Equality operator. + +@param aVal The string to compare. +@return ETrue if the strings are the same, otherwise EFalse. */ + { + return iVal == aVal.iVal; + } + + +inline TBool RStringTokenF::operator!=(RStringTokenF aVal) const +/** Inequality operator. + +@param aVal The string to compare. +@return ETrue if any strings are different, else EFalse */ + { + return iVal != aVal.iVal; + } + + +inline RStringTokenF RStringTokenF::operator=(RStringF aVal) +/** Assignment operator that makes a string token from a string. + +@param aVal The string to compare. +@return The string token. */ + { + iVal = aVal.iVal; + return *this; + } + + +inline RStringBase::RStringBase() + : iVal(0) +/** Default constructor. */ + { + } + +/** Returns a compact string equivalent to the string */ +inline RStringBase::operator RStringTokenBase() const + { + RStringTokenBase s; + s.iVal = iVal; + return s; + } + +inline RString RString::Copy() +/** Copies a string. + +Both the original and the copy must be separately closed. + +@return The string to copy. */ + { + RStringBase::Copy(); + return *this; + } + +/** Returns a compact string equivalent to the string (for case-sensitive strings) */ +inline RString::operator RStringToken() const + { + RStringToken s; + s.iVal = iVal; + return s; + } + +inline RStringF RStringF::Copy() +/** Copies a string. + +Both the original and the copy must be separately closed. + +@return The string to copy. */ + { + RStringBase::Copy(); + return *this; + } + + +inline TBool RStringF::operator==(const RStringF& aVal) const +/** Equality operator. + +@param aVal The string to compare. +@return ETrue if the strings are equal, else EFalse */ + { + __ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed)); + return (iVal == aVal.iVal); + } + + +inline TBool RStringF::operator!=(const RStringF& aVal) const +/** Inequality operator. + +@param aVal The string to compare. +@return ETrue if the strings are not equal, else EFalse */ + { + __ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed)); + return (iVal != aVal.iVal); + } + + +inline RStringF::operator RStringTokenF() const + { + RStringTokenF s; + s.iVal = iVal; + return s; + } + + +inline RStringPool RStringBase::Pool() const +/** Gets the string pool. + +@return The string pool. */ + { + return iPool; + } + + +inline TBool RString::operator==(const RString& aVal) const +/** Equality operator. + +@param aVal The string to compare. +@return ETrue if the strings are equal, else EFalse */ + { + __ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed)); + return (iVal == aVal.iVal); + } + + +inline TBool RString::operator!=(const RString& aVal) const +/** Inequality operator. + +@param aVal The string to compare. +@return ETrue if the strings are not equal, else EFalse */ + { + __ASSERT_DEBUG(iPool.iImplementation==aVal.iPool.iImplementation || aVal.iVal==0 || iVal==0, StringPoolPanic::Panic(StringPoolPanic::EComparisonBetweenTwoStringPoolsNotAllowed)); + return (iVal != aVal.iVal); + } + +inline RStringPool::RStringPool() + : iImplementation(0) +/** Default constructor. */ + { + } + + +#endif // __STRINGPOOL_INL__ diff -r c55016431358 -r 0a7b44b10206 symport/bafl/inc/stringpoolerr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/inc/stringpoolerr.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,46 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __STRINGPOOLERR_H +#define __STRINGPOOLERR_H + +#include +#include + +class StringPoolPanic +/** +@internalComponent +*/ + { +public: + enum TStringPoolPanic + { + EComparisonBetweenTwoStringPoolsNotAllowed=0,// We are trying to compare a string from one string pool to a string from another string pool + EIllegalUseOfNullString, + ECreatingStringWithWrongCase, + EStringNotTableEntry, + EStringTableNotFound + }; + static void Panic(TStringPoolPanic aPanic); + }; + +inline void StringPoolPanic::Panic(StringPoolPanic::TStringPoolPanic aPanic) + { + _LIT(KStringPoolPanic,"StringPool"); + User::Panic(KStringPoolPanic,aPanic); + } + +#endif // __STRINGPOOLERR_H + diff -r c55016431358 -r 0a7b44b10206 symport/bafl/inc/stringtablesupport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/inc/stringtablesupport.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,69 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// StringTableSupport.h +// +// This file contains defines needed by the auto-generated string table files. +// There is no reason why a manualy written cpp file outsinde the string pool +// implementation should include it. +// + +#ifndef __STRINGTABLESUPPORT_H__ +#define __STRINGTABLESUPPORT_H__ + +/** +@internalComponent +*/ +#define _STLIT8(name,s) const static TStLitC8 name={sizeof(s)-1,s} + +// A class that differs from TLitC only in that it does not have a +// dereference operator defined +//##ModelId=3B1E52AB0100 +template +class TStLitC8 +/** +@internalComponent +*/ + { +public: + inline operator const TDesC8&() const; + inline const TDesC8& operator()() const; + inline operator const __TRefDesC8() const; +public: + //##ModelId=3B1E52AB0120 + TUint iTypeLength; + //##ModelId=3B1E52AB0117 + TText8 iBuf[__Align8(S)]; + }; + +template +inline const TDesC8& TStLitC8::operator()() const + { + return *REINTERPRET_CAST(const TDesC8*,this); + } + +template +inline TStLitC8::operator const TDesC8&() const + { + return *REINTERPRET_CAST(const TDesC8*,this); + } + +template +inline TStLitC8::operator const __TRefDesC8() const + { + return *REINTERPRET_CAST(const TDesC8*,this); + } + +struct TStringTable; + +#endif // __STRINGTABLESUPPORT_H__ diff -r c55016431358 -r 0a7b44b10206 symport/bafl/src/bacline.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/src/bacline.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,150 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifdef __TOOLS2__ +#ifndef _WIN32 +#define __TOOLS__ +#endif +#endif + +#include + +#ifdef __TOOLS2__ +#include +extern char **gArgv; +#endif + +EXPORT_C CCommandLineArguments* CCommandLineArguments::NewLC() +/** Allocates and constructs a command line arguments parser, putting the returned +pointer onto the cleanup stack. The function leaves if there is insufficient +memory. + +@return The command line arguments parser. */ + { + CCommandLineArguments* self=new (ELeave) CCommandLineArguments; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +EXPORT_C CCommandLineArguments* CCommandLineArguments::NewL() +/** Allocates and constructs a command line arguments parser. The function leaves +if there is insufficient memory. + +@return The command line arguments parser. */ + { + CCommandLineArguments* self=CCommandLineArguments::NewLC(); + CleanupStack::Pop(); + return self; + } + +EXPORT_C CCommandLineArguments::~CCommandLineArguments() +/** Frees resources prior to destruction. */ + { + delete iArgs; + delete iCommandLine; + } + +CCommandLineArguments::CCommandLineArguments() + { + } + +void CCommandLineArguments::ConstructL() + { + // allocate args array + iArgs=new (ELeave) CArrayFixFlat (10); + // get raw command line + +#ifndef __TOOLS2__ + RProcess me; +#endif + iCommandLine=HBufC::NewL(User::CommandLineLength()); + TPtr commandLine(iCommandLine->Des()); + User::CommandLine(commandLine); +#ifndef __TOOLS2__ + iFileName=me.FileName(); +#else + iFileName.Copy(TPtrC8((TUint8*)gArgv[0], strlen(gArgv[0]))); +#endif + + // scan for each argument + TText* out=CONST_CAST(TText*,iCommandLine->Ptr()); + const TText* scan=out; + const TText* end=scan+iCommandLine->Length(); + while (scan < end) // scan one argument + { + while (scan < end && *scan==' ') // skip leading space + scan++; + if (scan == end) // ignore if blank + break; + TBool quoted=*scan=='\"'; // note leading quote + if (quoted) + scan++; + TText* start=out; // note start in output + if (!quoted) // if not quoted, scan for blank + { + while (scan < end && *scan!=' ') + *out++ = *scan++; + } + else // quoted, scan for quote + { + for (;;) // one quote-or-double sequence + { + while (scan < end && *scan!='\"') // all up to quote + *out++ = *scan++; + if (scan < end) // skip quote + scan++; + if (scan < end && *scan=='\"') // transfer if quote is doubled + *out++ = *scan++; + else // finished this arg + break; + } + } + TPtrC arg(start, out-start); + iArgs->AppendL(arg); + } + } + + +EXPORT_C TPtrC CCommandLineArguments::Arg(TInt aArg) const +/** Returns a non-modifiable pointer descriptor representing the specified command-line +argument. + +Arg(0) is the file name as specified on the command line. Arg(1), Arg(2) etc. +are the arguments specified to the command. + +The pointer descriptor is valid throughout the lifetime of the CCommandLineArguments +object. If you wish to retain argument values after the CCommandLineArguments +object is destroyed, you should copy the argument data into a different object. + +@param aArg The index of the desired argument. This number must be less than +Count(). Specify 0 for the name used to invoke the process. Specify 1, 2 etc. +for the arguments. +@return Non-modifiable pointer descriptor to the specified argument text. */ + { + if (aArg > 0 ) // a normal argument + return iArgs->operator[](aArg-1); + else // process name + return TPtrC(iFileName); + } + +EXPORT_C TInt CCommandLineArguments::Count() const +/** Returns the number of command line arguments, including the program name. + +@return The number of command line arguments, plus one for the program name. +Returns 1, if no arguments are specified. */ + { + return iArgs->Count()+1; + } diff -r c55016431358 -r 0a7b44b10206 symport/bafl/src/stringpoolapi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/src/stringpoolapi.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,292 @@ +// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include "stringpoolimplementation.h" + + + +EXPORT_C void RStringBase::Close() +/** Closes a string. + +You must close every string you open. In other words, every call to RStringBase::Copy(), +RStringPool::OpenStringL() and RStringPool::OpenFStringL() must be matched +by a close. + +Strings created through RStringPool::String() or RStringPool::StringF() with +an integer argument need not be closed (but closing is harmless). + +Strings created through RStringPool::String() or RStringPool::StringF() with +a StringToken or StringTokenF argument must not be closed, as they're just +changing the external representation. */ + { + if (iVal) + //harmless for empty strings + iPool.iImplementation->Close(RStringTokenEither(iVal)); + // invalidate the string if it's a dinamic one otherwise do nothing + if(!StringUtils::IsTableEntry(this->iVal)) + iVal=0U; + } + + +EXPORT_C RStringBase RStringBase::Copy() +/** Copies a string. + +Both the original and the copy string must be separately closed. + +@return The string base. */ + { + if (iVal) + iPool.iImplementation->IncrementCount(RStringTokenEither(iVal)); + return *this; + } + + +/** Returns the content of the string + */ +EXPORT_C const TDesC8& RStringBase::DesC() const +/** Gets the content of the string. + +@return Descriptor containing the content of the string. */ + { + // check for empty string + if (iVal == 0) + return KNullDesC8(); + if (StringUtils::IsTableEntry(iVal)) + { + TInt index = StringUtils::TableIndex(iVal); + TInt tableUid= StringUtils::TableUid(iVal); + return iPool.iImplementation->TableLookup(index, tableUid); + } + else + return *StringUtils::NodePtr(iVal)->iDes; + } + + +EXPORT_C TInt RStringBase::Index(const TStringTable& aTable) const +/** Gets the enumeration value corresponding to this string. + +@param aTable String table to look in +@return The string's enumeration value, or -1 if there is no such value +@panic EStringTableNotFound If the table supplied is not found. This panic is raised in debug builds only, in release mode the behaviour is undefined*/ + { + //return an error for empty strings(i.e. with iVal=0 ) + if(!this->iVal) + return KErrNotFound; + TInt tableId=iPool.iImplementation->TableUid(aTable); + __ASSERT_DEBUG(tableId!=KErrNotFound,StringPoolPanic::Panic(StringPoolPanic::EStringTableNotFound)); + // First check the iVal is part of the same table + if (StringUtils::IsTableEntry(iVal)) + { + if (tableId==StringUtils::TableUid(iVal)) + return StringUtils::TableIndex(iVal); + } + // Then check if the iVal is in the reverse duplicate list + TInt index=iPool.iImplementation->FindTableIndexFromFirstVal(iVal, tableId); + return index; + } + + +EXPORT_C const TStringTable* RStringBase::OriginalTableRef() const +/** Gets the table (if any) that first added the current string to the pool. + +Note there multiple tables can contain the same string. + +@return The table or NULL if the string was created dynamically (not from +a table) */ + { + if(StringUtils::IsTableEntry(iVal)) + return &iPool.iImplementation->TableRef(iVal); + else + return NULL; + } + +/** Implementation of RStringPool class*/ + +EXPORT_C void RStringPool::OpenL() +/** Creates an initialised string pool with no pre-loaded string tables. + +@leave KErrNoMemory Not enough memory to open the pool */ + { + iImplementation = new (ELeave) CStringPoolImplementation; + } + +EXPORT_C void RStringPool::OpenL(const TStringTable& aTable,MStringPoolCloseCallBack& aCallBack) +/** Creates an initialised string pool with a pre-loaded string table, and a string-pool-closing +callback. + +@param aTable The pre-loaded string table. +@param aCallBack Callback interface that is called when the string pool closes +@leave KErrNoMemory Not enough memory to open the pool */ + { + if (!iImplementation) + { + iImplementation = new (ELeave) CStringPoolImplementation; + CleanupClosePushL(*this); + iImplementation->AddTableL(aTable); + iImplementation->AddCallBackL(aCallBack); + CleanupStack::Pop(); //this + } + else + { + iImplementation->AddTableL(aTable); + iImplementation->AddCallBackL(aCallBack); + } + } + +EXPORT_C void RStringPool::OpenL(const TStringTable& aTable) +/** Creates an initialised string pool with a pre-loaded string table. + +@param aTable The pre-loaded string table. +@leave KErrNoMemory Not enough memory to open the pool */ + { + if (!iImplementation) + { + iImplementation = new (ELeave) CStringPoolImplementation; + CleanupClosePushL(*this); + iImplementation->AddTableL(aTable); + CleanupStack::Pop(); //this + } + else + { + iImplementation->AddTableL(aTable); + } + } + + +EXPORT_C void RStringPool::Close() +/** Closes the string pool table. + +This invalidates all other handles to the table. */ + { + delete iImplementation; + iImplementation = NULL; + } + +EXPORT_C RStringF RStringPool::OpenFStringL(const TDesC8& aString) const +/** Creates an RStringF using the current string pool. + +The string is opened as case-insensitive. + +@param aString The value of the string. +@leave KErrNoMemory Not enough memory to open the string +@return Initialised RStringF object */ + { + RStringTokenEither newString = iImplementation->OpenL(aString, ETrue); + RStringF r; + r.iPool = *this; + r.iVal = newString.iVal; + return r; + } + +EXPORT_C RString RStringPool::OpenStringL(const TDesC8& aString) const +/** Creates an RString using the current string pool. + +The string is opened as case-sensitive. + +@param aString The value of the string. +@leave KErrNoMemory Not enough memory to open the string +@return Initialised RString object */ + { + RStringTokenEither newString = iImplementation->OpenL(aString, EFalse); + RString r; + r.iPool = *this; + r.iVal = newString.iVal; + return r; + } + +EXPORT_C RString RStringPool::String(RStringToken aString) const +/** Creates an RString from the supplied RStringToken. + +@param aString The string token +@return Initialised RString object */ + { + RString r; + r.iPool = *this; + r.iVal = aString.iVal; + return r; + } + +EXPORT_C RString RStringPool::String(TInt aIndex,const TStringTable& aTable) const +/** Gets a case-sensitive string specified by a string table enumeration value. + +aIndex is interpreted as an offset into the handle's pre-loaded string table. + +@param aIndex The string table enumeration value +@param aTable The string table from which to read the string +@return Initialised RString object +@panic EStringTableNotFound If the table supplied is not found. This panic is raised in debug builds only, in release mode the behaviour is undefined*/ + { + __ASSERT_DEBUG(aTable.iCaseSensitive==1,StringPoolPanic::Panic(StringPoolPanic::ECreatingStringWithWrongCase)); + if(aIndex <(TInt)aTable.iCount) + {//the index is in valid range the index + RString r; + r.iPool = *this; + TInt16 tableUid = iImplementation->TableUid(aTable); + __ASSERT_DEBUG(tableUid!=KErrNotFound,StringPoolPanic::Panic(StringPoolPanic::EStringTableNotFound)); + r.iVal = StringUtils::ValFromIndex(aIndex, tableUid); + TInt originalVal; + if (KErrNotFound!=(originalVal=iImplementation->FindFirstValFromDuplicate(r.iVal))) + { + r.iVal=originalVal; + } + return r; + } + else // the index is out of range + return RString(); + } + +EXPORT_C RStringF RStringPool::StringF(RStringTokenF aString) const +/** Creates a RStringF from the supplied RStringToken. + +@param aString The value of the string +@return Initialised RStringF object */ + { + RStringF r; + r.iPool = *this; + r.iVal = aString.iVal; + return r; + } + +EXPORT_C RStringF RStringPool::StringF(TInt aIndex,const TStringTable& aTable) const +/** Gets a case-insensitive string specified by a string table enumeration value. + +Creates an RStringF from a string table enumeration value. + +aIndex is interpreted as an offset into the handle's pre-loaded string table. + +@param aIndex The string table enumeration value +@param aTable The string table from which to read the string +@return Initialised RStringF object +@panic EStringTableNotFound If the table supplied is not found. This panic is raised in debug builds only, in release mode the behaviour is undefined*/ + { + __ASSERT_DEBUG(aTable.iCaseSensitive==0,StringPoolPanic::Panic(StringPoolPanic::ECreatingStringWithWrongCase)); + if(aIndex <(TInt)aTable.iCount) + {//the index is in valid range the index + RStringF r; + r.iPool = *this; + TInt16 tableUid = iImplementation->TableUid(aTable); + __ASSERT_DEBUG(tableUid!=KErrNotFound,StringPoolPanic::Panic(StringPoolPanic::EStringTableNotFound)); + r.iVal = StringUtils::ValFromIndexF(aIndex, tableUid); + TInt originalVal; + if (KErrNotFound!=(originalVal=iImplementation->FindFirstValFromDuplicate(r.iVal))) + { + r.iVal=originalVal; + } + return r; + } + else // the index is out of range so return an empty string + return RStringF(); + } diff -r c55016431358 -r 0a7b44b10206 symport/bafl/src/stringpoolimplementation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/src/stringpoolimplementation.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,566 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include "stringpoolimplementation.h" + +const TInt KMapGranularity=20; + +CStringPoolNode::~CStringPoolNode() + { + delete iDes; + } + +CStringPoolImplementation::CStringPoolImplementation() : iStringMapList(KMapGranularity, _FOFF(TStringIdMap, iSourceTableVal)), iStringMapListReverse(KMapGranularity, _FOFF(TStringIdMap, iTargetTableVal)) + { + } + +CStringPoolImplementation::~CStringPoolImplementation() + { + // Look for non-expirable strings + TInt i; + for (i = 0; i < KHashModulo; i++ ) + { + DeleteUndeletableStrings(iCIHashTable, i); + DeleteUndeletableStrings(iCSHashTable, i); + } +#ifdef _DEBUG + + __LOG(_L8(":Closing String Pool.\n")) + TBool leaksFound = EFalse; + // Check that the string pool is empty, or more accurately that + // everything in it is a pre-loaded string + for (i = 0; i < KHashModulo; i++ ) + { + if (iCIHashTable[i]) + { + for (TInt j = 0; j < iCIHashTable[i]->Count(); j++) + { + if (!StringUtils::IsTableEntry(iCIHashTable[i]->At(j).iVal)) + { + if (!leaksFound) + { + __LOG(_L8("The following strings were leaked through not being Closed:\n")) + leaksFound = ETrue; + } + + // Get the problem string + __LOG((reinterpret_cast + (iCIHashTable[i]->At(j).iVal & KTokenToNode))->iDes->Des()); + } + } + } + if (iCSHashTable[i]) + { + for (TInt j = 0; j < iCSHashTable[i]->Count(); j++) + { + if (!StringUtils::IsTableEntry(iCSHashTable[i]->At(j).iVal)) + { + if (!leaksFound) + { + __LOG(_L8("The following strings were leaked through not being Closed:\n")) + leaksFound = ETrue; + } + + // Get the problem string + __LOG((reinterpret_cast( + iCSHashTable[i]->At(j).iVal & KTokenToNode))->iDes->Des()); + } + } + } + if (leaksFound) + __DEBUGGER(); + } + + if (!leaksFound) + __LOG(_L8("No leakages were detected\n")); + +#endif //_DEBUG + for (TInt ii = 0; ii < KHashModulo; ii++) + { + delete iCIHashTable[ii]; + delete iCSHashTable[ii]; + } + + iTablePtrs.Close(); + iStringMapList.Close(); + iStringMapListReverse.Close(); + iRollbackMapList.Close(); + iRollbackHashListCS.Close(); + iRollbackHashListCI.Close(); + // Notify the external users of the StringPool that the object is getting closed + TInt cBCounter = iCallBacks.Count(); + if(cBCounter>0) + { + while (--cBCounter>=0) + { + iCallBacks[cBCounter]->StringPoolClosing(); + } + } + iCallBacks.Close(); + } + +// Check for any undeletable string and delete them now +void CStringPoolImplementation::DeleteUndeletableStrings(CArrayFixSeg* aArray[KHashModulo], TInt i) + { + if (aArray[i]) + { + for (TInt j = 0; j < aArray[i]->Count(); ++j) + { + if (!StringUtils::IsTableEntry(aArray[i]->At(j).iVal)) + { + CStringPoolNode* node= reinterpret_cast(aArray[i]->At(j).iVal & KTokenToNode); + if (KMarkedForNoDeleted==node->iRefcount) + { + delete node; + aArray[i]->Delete(j); + j--; + } + } + } + } + } + +CStringPoolImplementation* CStringPoolImplementation::NewL() + { + CStringPoolImplementation* table = new (ELeave) CStringPoolImplementation(); + return table; + } + +void CStringPoolImplementation::CleanupHashCS(TAny* aImplementation) + { + CStringPoolImplementation* imp=reinterpret_cast(aImplementation); + CleanUpHash(&imp->iRollbackHashListCS, imp->iCSHashTable); + } + +void CStringPoolImplementation::CleanupHashCI(TAny* aImplementation) + { + CStringPoolImplementation* imp=reinterpret_cast(aImplementation); + CleanUpHash(&imp->iRollbackHashListCI, imp->iCIHashTable); + } + +void CStringPoolImplementation::CleanUpHash(RPointerArray * aHashCleanup, CArrayFixSeg* aHash[KHashModulo]) + { + if (aHashCleanup->Count()>0) + { + RStringTokenEither* token=(*aHashCleanup)[0]; // Get first entry + for (TInt i = 0; i < KHashModulo; i++ ) + { + if (aHash[i]) + { + for (TInt j = 0; j < aHash[i]->Count(); j++) + { + if (!StringUtils::IsTableEntry(aHash[i]->At(j).iVal)) + { + if (aHash[i]->At(j).iVal==token->iVal) + { + CStringPoolNode* node= reinterpret_cast(aHash[i]->At(j).iVal & KTokenToNode); + delete node; + aHash[i]->Delete(j); + aHashCleanup->Remove(0); + break; + } + } + } + } + + } + } + } + +void CStringPoolImplementation::CleanupIdMap(TAny* aImplementation) + { + CStringPoolImplementation* imp=reinterpret_cast(aImplementation); + if (imp->iRollbackMapList.Count()>0) + { + TStringIdMap* map=imp->iRollbackMapList[0]; + TInt index=imp->iStringMapList.FindInUnsignedKeyOrder(*map); + imp->iRollbackMapList.Remove(0); + if (index!=KErrNotFound) + { + imp->iStringMapList.Remove(index); + } + index=imp->iStringMapListReverse.FindInUnsignedKeyOrder(*map); + if (index!=KErrNotFound) + { + for (TInt count=index;countiStringMapListReverse.Count();++count) + { + if (imp->iStringMapListReverse[count].iTargetTableVal==map->iTargetTableVal && imp->iStringMapListReverse[count].iSourceTableVal==map->iSourceTableVal) + { + imp->iStringMapListReverse.Remove(index); + } + } + } + } + } + +void CStringPoolImplementation::AddTableL(const TStringTable& aTable) + { + for (TInt count=0;count** hashTableToUse = + aTable.iCaseSensitive ? iCSHashTable :iCIHashTable ; + TInt cleanupCounter=0; + for (TUint i = 0; i < aTable.iCount; ++i) + { + const TStLitC8<1>* string=reinterpret_cast* >(aTable.iTable[i]); + + // Try to find the string in memory, maybe as a dynamic string or as a member of an another table + RStringTokenEither token=FindDes(*string, !aTable.iCaseSensitive); + if (!token.IsNull()) + { + TStringIdMap map; + map.iSourceTableVal=StringUtils::ValFromIndex(i, (TInt16)(iTablePtrs.Count()-1),aTable.iCaseSensitive); + map.iTargetTableVal=token.iVal; + + // Put on cleanup stack + User::LeaveIfError(iRollbackMapList.Append(&map)); + TCleanupItem cleanup(CleanupIdMap, this); + CleanupStack::PushL(cleanup); + ++cleanupCounter; + + User::LeaveIfError(iStringMapList.InsertInUnsignedKeyOrder(map)); + + // Check if this is a link to a dynamic string + if (!StringUtils::IsTableEntry(token.iVal)) + { + CStringPoolNode* node = StringUtils::NodePtr(token.iVal); + node->iRefcount=KMarkedForNoDeleted; // Make sure this string never gets deleted + } + + // Now store the reverse array + User::LeaveIfError(iStringMapListReverse.InsertInUnsignedKeyOrderAllowRepeats(map)); + } + else + { + TUint8 hash = static_cast(Hash(*string)); + CArrayFixSeg* collisionList = hashTableToUse[hash]; + if ( !collisionList ) + //HashTableToUse now is used as list of all entry with the same hash + collisionList = hashTableToUse[hash] = + new (ELeave) CArrayFixSeg( 2 ); + RStringTokenEither s; + s.iVal = genericValFromIndex(i, (TInt16)(iTablePtrs.Count()-1)); + + __LOG2(_L8("Table entry being added with hash %d, val %d"), hash, s.iVal); + __LOG(*reinterpret_cast* >(aTable.iTable[i])); + // Put on cleanup stack + if (aTable.iCaseSensitive==1) + { + User::LeaveIfError(iRollbackHashListCS.Append(&s)); + TCleanupItem cleanup(CleanupHashCS, this); + CleanupStack::PushL(cleanup); + } + else + { + User::LeaveIfError(iRollbackHashListCI.Append(&s)); + TCleanupItem cleanup(CleanupHashCI, this); + CleanupStack::PushL(cleanup); + } + + ++cleanupCounter; + collisionList->AppendL(s); + } + } + CleanupStack::Pop(cleanupCounter); + iRollbackMapList.Reset(); + iRollbackHashListCS.Reset(); + iRollbackHashListCI.Reset(); + } + +// Find FirstVal given duplicate val +TInt32 CStringPoolImplementation::FindFirstValFromDuplicate(TInt32 aDuplicateVal) const + { + TStringIdMap map; + map.iSourceTableVal=aDuplicateVal; + TInt index=iStringMapList.FindInUnsignedKeyOrder(map); + if (index!=KErrNotFound) + return iStringMapList[index].iTargetTableVal; + else + return KErrNotFound; + } + + + +// Find table index Val given first val & table UID +TInt CStringPoolImplementation::FindTableIndexFromFirstVal(TInt32 aFirstVal, TInt aTableUid) const + { + TStringIdMap map; + map.iTargetTableVal=aFirstVal; + TInt index=iStringMapListReverse.FindInUnsignedKeyOrder(map); + if (KErrNotFound==index) + return KErrNotFound; + + for (TInt count=index;count>20); + const TStringTable* theTableRef=(iTablePtrs[tableUid]); + return *theTableRef; + } + +// Find the descriptor for a given table and index +const TDesC8& CStringPoolImplementation::TableLookup(TInt aIndex, TInt aTableUid) const + { + return *reinterpret_cast*>(iTablePtrs[aTableUid]->iTable[aIndex]); + } + + +// Lookup with allocating +// +RStringTokenEither +CStringPoolImplementation::OpenL( const TDesC8& aAttributeName, + TBool aCaseInsensitive) + { + // lookup the attribute + RStringTokenEither s(FindDes( aAttributeName , aCaseInsensitive)); + if (!s.IsNull()) + { + if (!StringUtils::IsTableEntry(s.iVal)) + { + + CStringPoolNode* node = StringUtils::NodePtr(s.iVal); + if (KMarkedForNoDeleted!=node->iRefcount) + node->iRefcount++; + __LOG1(_L8("String copied (during open). Count is now %d"), node->iRefcount); + __LOG(*node->iDes); + } + return s; + } + + // create a new node at the end of the appropriate array + CStringPoolNode* newnode = new (ELeave) CStringPoolNode(); + CleanupStack::PushL( newnode ); + newnode->iDes = aAttributeName.AllocL(); + newnode->iRefcount = 1; + + TInt hash = Hash( aAttributeName ); + CArrayFixSeg** hashTableToUse = + aCaseInsensitive ? iCIHashTable : iCSHashTable; + __LOG2(_L8("Newly added with hash value %d, node val 0x%x\n"), hash, newnode) + __LOG(aAttributeName); + + newnode->iHash = static_cast(hash); + CArrayFixSeg* collisionList = hashTableToUse[hash]; + if ( !collisionList ) + collisionList = hashTableToUse[hash] = new (ELeave) CArrayFixSeg( 2 ); + + s.iVal = reinterpret_cast(newnode); + if (aCaseInsensitive) + s.iVal += 2; + collisionList->AppendL(s); + + CleanupStack::Pop(); // newnode + + return s; + } + +void CStringPoolImplementation::Close(RStringTokenEither aString) + { + if (StringUtils::IsTableEntry(aString.iVal)) + return; + + CStringPoolNode* node = StringUtils::NodePtr(aString.iVal); + if (KMarkedForNoDeleted == node->iRefcount) // -1 means a non-expirable string + return; + if (--node->iRefcount == 0) + { + //this is the last reference of this string + CArrayFixSeg** hashTableToUse = + aString.iVal & 2 ? iCIHashTable : iCSHashTable; + + // Delete the node and delete the entry in the relevant collision list + CArrayFixSeg* collisionList = hashTableToUse[node->iHash]; + TInt count = collisionList->Count(); + for (TInt i = 0; i < count; i++) + { + if (collisionList->At(i) == aString) + { + // Log the fact that a string reference is about to die... + __LOG1(_L8("Removing string with hash value %d\n"), node->iHash) + __LOG(node->iDes->Des()); + collisionList->Delete(i); + break; + } + } + delete node; + } + else + { + __LOG1(_L8("String closed. Count is now %d"), + node->iRefcount); + __LOG(node->iDes->Des()); + } + } + +void CStringPoolImplementation::IncrementCount(RStringTokenEither aString) + { + if (StringUtils::IsTableEntry(aString.iVal)) + return; + CStringPoolNode* node = StringUtils::NodePtr(aString.iVal); + if (KMarkedForNoDeleted!=node->iRefcount) + node->iRefcount++; + __LOG1(_L8("String copied. Count is now %d"), node->iRefcount); + __LOG(*node->iDes); + } + +// Very simple case-sensitive comparison. We can assume that the +// strings are the same length, and we only care if the strings are +// the same. (Unlike normal comparison functions that also tell you +// which one is 'smaller') +TBool CStringPoolImplementation::CompareCS(const TDesC8& s1, const TDesC8& s2) + { + const TUint8* ptr1 = s1.Ptr(); + const TUint8* ptr2 = s2.Ptr(); + const TUint8* stop = &ptr1[s1.Length()]; + for (; ptr1 < stop; ptr1++,ptr2++) + { + if (*ptr1 != *ptr2) + return EFalse; + } + return ETrue; + } + +// Note that the hash function must generate the same hash values for +// strings that differ by case. If changing the algorithm here make +// sure this is still true. +TBool CStringPoolImplementation::CompareCI(const TDesC8& s1, const TDesC8& s2) + { + const TUint8* ptr1 = s1.Ptr(); + const TUint8* ptr2 = s2.Ptr(); + const TUint8* stop = &ptr1[s1.Length()]; + for (; ptr1 < stop; ptr1++,ptr2++) + { + if (*ptr1 != *ptr2) + { + // They're not exactly the same; see if they differ only + // by case. If one character is a letter, we can do a + // comparison ignoring bit 5 in both cases. If that + // matches, they are the same. + if (!((*ptr1 & KCaseInsensitive) == (*ptr2 & KCaseInsensitive) && + (*ptr1 >= 'A' && *ptr1 <= 'Z' || + *ptr1 >= 'a' && *ptr1 <= 'z'))) + return EFalse; + } + } + return ETrue; + } + +// Find the given descriptor in the hash table +// +RStringTokenEither +CStringPoolImplementation::FindDes( const TDesC8& aAttributeName, TBool aCaseInsensitive) + { + CArrayFixSeg** hashTableToUse = + aCaseInsensitive ? iCIHashTable : iCSHashTable; + CArrayFixSeg* collisionList =hashTableToUse[Hash(aAttributeName)]; + RStringPool pool; + TBool (*compareFunction)(const TDesC8&, const TDesC8&); + if (aCaseInsensitive) + compareFunction = CompareCI; + else + compareFunction = CompareCS; + pool.iImplementation = this; + if ( collisionList ) + { + TInt length=aAttributeName.Length(); + TInt count = collisionList->Count(); + for ( TInt i = 0; i < count; i++ ) + { + RStringTokenEither token = collisionList->At(i); + RStringEither s(this, token); + const TDesC8& string = s.DesC(); + if ( string.Length()==length && + (*compareFunction)(aAttributeName, string)) + return token; + } + } + return RStringTokenEither(); + } + + +// Generate a hash value +// +TUint CStringPoolImplementation::Hash( const TDesC8& aDes ) const + { + // We ignore bit 5, which is a crude way of making the hash case + // insensitive. This means that things that might differ only by + // case end up in the same bucket, and we can then worry about + // whether they're really the same later. + TInt len=aDes.Length(); + TUint hash = 0; + const TUint8* ptr=aDes.Ptr(); + for ( TInt i = 0; i < len; i++ ) + hash = 131*hash + (*ptr++ & KCaseInsensitive); + return hash % KHashModulo; + } + +TInt StringUtils::ValFromIndex(TInt aIndex, TUint16 aTableId) + { + return (aTableId << 20) + (aIndex << 2) + 1; + } + +TInt StringUtils::ValFromIndexF(TInt aIndex, TUint16 aTableId) + { + return (aTableId << 20) + (aIndex << 2) + 3; + } + +TInt StringUtils::ValFromIndex(TInt aIndex, TUint16 aTableId, TBool aCaseSensitive) + { + if (aCaseSensitive) + return ValFromIndex(aIndex, aTableId); + else + return ValFromIndexF(aIndex, aTableId); + } +void CStringPoolImplementation::AddCallBackL( MStringPoolCloseCallBack& aCallBack) + { + User::LeaveIfError(iCallBacks.Append(&aCallBack)); + } diff -r c55016431358 -r 0a7b44b10206 symport/bafl/src/stringpoolimplementation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bafl/src/stringpoolimplementation.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,334 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __STRINGPOOLIMPLEMENTATION_H__ +#define __STRINGPOOLIMPLEMENTATION_H__ + +#include +#include +#include + +/** +This is an 8 bit value with every bit set except bit 5 (value +32). The ASCII codes of upper and lower case characters differ by +32. +@internalComponent +*/ +const TUint KCaseInsensitive = 223; + +/** +@internalComponent +*/ +const TInt KHashModulo = 32; + +/** +Bit 0 represents if it is a table (set) or not (unset). +Bit 1 represents case sensitivity (set) or not (unset) + +For non-static table values (dynamic strings), the remaining bits +are interpreted as a pointer to a CStringPoolNode (which is assumed +to be word aligned). + +Bits 2-20 represent the table index. +Bits 21-31 represent the table uid (that is the address of the table). +*/ + +/** +Bit 1 is used in tokens to indicate case sensitivity. So mask it +out to get the node. +@internalComponent +*/ +const TUint KTokenToNode = 0xfffffffd; + +/** +Determine if this id corresponds to a table. +@internalComponent +*/ +#define IS_TABLE_ENTRY(tableId)(tableId & 0x01) + +/** +Obtain the Table Index. +@internalComponent +*/ +#define TABLE_INDEX(val)((val & 0xffffc)>>2) + +/** +Obtain the Table UID. +@internalComponent +*/ +#define TABLE_UID(val)(val>>20) + +/** +This is used to mark the reference count of a node so that is will not be deleted when closed +@internalComponent +*/ +const TUint KMarkedForNoDeleted = 0xffff; + + + +class RStringTokenEither; + +/** +@internalComponent +*/ +struct TStringIdMap + { + TInt32 iSourceTableVal; + TInt32 iTargetTableVal; + }; + + +/** +Internal node class +@internalComponent +*/ +NONSHARABLE_CLASS(CStringPoolNode) : public CBase + { +public: + ~CStringPoolNode(); + + public: + HBufC8* iDes; + TUint16 iRefcount; + TUint8 iHash; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CStringPoolImplementation) : public CBase + { +public: + CStringPoolImplementation(); + /// Destructor + ~CStringPoolImplementation(); + + /// Constructs a string pool + static CStringPoolImplementation* NewL(); + + // USed for cleaning up when a OpenTableL leaves + static void CleanupHashCS(TAny* aImplementation); + static void CleanupHashCI(TAny* aImplementation); + static void CleanupIdMap(TAny* aImplementation); + static void CleanUpHash(RPointerArray * aHashCleanup, CArrayFixSeg* hash[KHashModulo]); + + /// Adds a table to the pool. (Note this currently only works once) + void AddTableL(const TStringTable& aTable); + void AddCallBackL( MStringPoolCloseCallBack& aCallBack); + + + // Find FirstVal given duplicate val + TInt32 FindFirstValFromDuplicate(TInt32 aDuplicateVal) const; + + // Find table index Val given first val & table UID + TInt FindTableIndexFromFirstVal(TInt32 aDuplicateVal, TInt aTableUid) const; + + + TInt16 TableUid(const TStringTable& aTable) const; + + const TStringTable& TableRef(TInt32 aVal) const; + + /// Looks up a particular index in the pre-loaded tables + const TDesC8& TableLookup(TInt aIndex, TInt aTableUid) const; + + /// Finds or creates a string. Increments the reference count if needed. + RStringTokenEither OpenL( const TDesC8& aString, TBool aCaseInsensitive); + + /// Closes a string (decrements the reference count and deletes if 0 + void Close(RStringTokenEither aString); + + /// Increments the reference count on a string + void IncrementCount(RStringTokenEither aString); + + inline RStringPool Handle(); + +private: + + // Check for any undeletable string and delete them now + void DeleteUndeletableStrings(CArrayFixSeg* aArray[KHashModulo], TInt i); + +private: + + /// Finds a string in the pool. + RStringTokenEither FindDes( const TDesC8& aString, TBool aCaseInsensitive); + + /// Calculates a hash for a descriptor + TUint Hash( const TDesC8& ) const; + + static TBool CompareCS(const TDesC8& s1, const TDesC8& s2); + static TBool CompareCI(const TDesC8& s1, const TDesC8& s2); + + private: + /// The table. + CArrayFixSeg* iCSHashTable[KHashModulo]; + CArrayFixSeg* iCIHashTable[KHashModulo]; + RPointerArray iTablePtrs; // Stores array of tables, where the index is the table UID + RArray iStringMapList; + RArray iStringMapListReverse; + + // For rolling back when a leave occurs during CreateTableL + RPointerArray iRollbackMapList; + RPointerArray iRollbackHashListCS; + RPointerArray iRollbackHashListCI; + RPointerArray iCallBacks; + }; + +/** +An internal version of the string token class. This class can hold +either folding or non-folding versions, and it is up to the user +to get it right. +@internalComponent +*/ +class RStringTokenEither : public RStringTokenBase + { + public: + inline RStringTokenEither(); + + inline RStringTokenEither(TUint32 aVal); + + /** Comparison operator + @param aVal The string to compare. */ + inline TBool operator==(RStringTokenEither aVal) const; + + /** Comparison operator + @param aVal The string to compare. */ + inline TBool operator!=(RStringTokenEither aVal) const; + + /** Assignment operator; makes a string token from a string. + @param aVal The string to copy */ + inline RStringTokenEither operator=(RStringBase aVal); + + friend class RStringPool; + friend class RStringEither; + friend class CStringPoolImplementation; + }; + +class RStringEither : public RStringBase +/** +@internalComponent +*/ + { + public: + RStringEither(CStringPoolImplementation* aPool, RStringTokenEither aVal); + }; + +class StringUtils +/** +@internalComponent +*/ + { + public: + static inline TBool IsTableEntry(TInt aVal); + static inline TInt TableIndex(TInt aVal); + static inline TInt16 TableUid(TInt aVal); + static inline CStringPoolNode* NodePtr(TInt aVal); + static TInt ValFromIndex(TInt aIndex, TUint16 aTableId); + static TInt ValFromIndexF(TInt aIndex, TUint16 aTableId); + static TInt ValFromIndex(TInt aIndex, TUint16 aTableId, TBool aCaseSensitive); + + static void LogIt(TRefByValue aFmt, ...); + static void LogIt1(TRefByValue aFmt); + }; + +#ifndef __TOOLS2__ +#define _LOGGING +#endif + +#if defined (_DEBUG) && defined (_LOGGING) + +/** +HTTP Logging macros +@internalComponent +*/ +#define __LOG(C) StringUtils::LogIt1(C); +#define __LOG1(C, X) StringUtils::LogIt(C, X); +#define __LOG2(C, X, Y) StringUtils::LogIt(C, X, Y); +#define __LOG3(C, X, Y, Z) StringUtils::LogIt(C, X, Y, Z); + +#else + +/** +NULL macros +@internalComponent +*/ +#define __LOG(C) +#define __LOG1(C, X) +#define __LOG2(C, X, Y) +#define __LOG3(C, X, Y, Z) +#endif // !_DEBUG + + +inline TBool StringUtils::IsTableEntry(TInt aVal) + { + return IS_TABLE_ENTRY(aVal); + } + +inline TInt StringUtils::TableIndex(TInt aVal) + { + return TABLE_INDEX(aVal); + } + +inline TInt16 StringUtils::TableUid(TInt aVal) + { + return (TInt16) TABLE_UID(aVal); + } + +inline CStringPoolNode* StringUtils::NodePtr(TInt aVal) + { + return reinterpret_cast(aVal & KTokenToNode); + } + +inline RStringEither::RStringEither(CStringPoolImplementation* aPool, + RStringTokenEither aVal) + { + iPool = aPool->Handle(); + iVal = aVal.iVal; + } + +inline RStringPool CStringPoolImplementation::Handle() + { + RStringPool p; + p.iImplementation = this; + return p; + } + +inline RStringTokenEither::RStringTokenEither() + { + } + +inline RStringTokenEither::RStringTokenEither(TUint32 aVal) + { + iVal = aVal; + } + +inline TBool RStringTokenEither::operator==(RStringTokenEither aVal) const + { + return iVal == aVal.iVal; + } + +inline TBool RStringTokenEither::operator!=(RStringTokenEither aVal) const + { + return iVal != aVal.iVal; + } + +inline RStringTokenEither RStringTokenEither::operator=(RStringBase aVal) + { + RStringTokenBase b = aVal; + iVal = b.iVal; + return *this; + } + + +#endif // __STRINGPOOLIMPLEMENTATION_H__ diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/bld.inf Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,57 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_PLATFORMS +TOOLS2 + +PRJ_TESTEXTENSIONS + +#ifdef TOOLS2 +start extension tools/x86tool + + option TARGET_NAME teststatic + option TARGET_TYPE lib + option SOURCE teststatic.cpp +end + +start extension tools/x86tool + + option TARGET_NAME testdll + option TARGET_TYPE dll + option SOURCE testdll.cpp + + option LIBS teststatic + option SHARED_LIBS symport +end + +start extension tools/x86tool + + option TARGET_NAME testexe + option TARGET_TYPE exe + option SOURCE testexe.cpp + + option LIBS teststatic + option SHARED_LIBS symport testdll +end + +start extension tools/x86tool + + option TARGET_NAME testexe_main.test + option TARGET_TYPE exe + option SOURCE testexe_main.cpp + + option LIBS teststatic symuser +end +#endif diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/test.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/test.pl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,315 @@ +#!/usr/bin/perl + +# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +use strict; +use warnings; +use Test; +use Getopt::Long qw(:config auto_version auto_help); +use File::Spec::Functions; +use File::Basename; +use Cwd; + +# The following are the tests to run +BEGIN { plan tests => 96 } + +# Make sure we're in the correct folder +chdir('../bldtest') or die "Failed to set folder: $!"; + +# Version of the script - just use the date +$main::VERSION = '09-Oct-08'; + +# Get command line arguments +print "\n"; +my ( $verbose, $ignore ); +GetOptions("verbose" => \$verbose, "ignore" => \$ignore) or pod2usage(2); + +my $win32 = 1 if $^O =~ /MSWin32/; +print "Running on Win32\n" if $win32 && $verbose; +print "Running on Linux\n" if !$win32 && $verbose; + +# Test new build system +my $flm = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml'); +my $tem = catfile($ENV{EPOCROOT}, 'epoc32', 'tools', 'makefile_templates', 'tools', 'x86tool.mk'); + +warn "FLM $flm doesn't exist?" if !-e $flm; +print "Testing SBSv2 with FLM\n"; +rename $tem, "$tem.disabled"; +$ENV{SBS_VERSION} = 2 if $win32; +doCheck('deb'); +doCheck('rel'); +rename "$tem.disabled", $tem; + +# Disable the FLM if it exists and run test with the TEM +print "Testing SBSv2 with TEM\n"; +rename $flm, "$flm.disabled"; +doCheck('deb'); +doCheck('rel'); +rename "$flm.disabled", $flm; + +# Test old build system +print "Testing SBSv1 with TEM\n"; +if ($win32) + { + $ENV{SBS_VERSION} = 1; + doCheck('deb'); + doCheck('rel'); + } +else + { + # No such thing on Linux - just keep Test happy + for(my $i = 1; $i <= 32; $i++) + { + ok(1); + } + } + +# *** +# Check everything works +# +sub doCheck + { + my $variant = shift; + + # Have to set library path for Linux + if (!$win32) + { + $ENV{LD_LIBRARY_PATH} =~ s[/epoc32[^:]+:/][]; + $ENV{LD_LIBRARY_PATH} = "$ENV{EPOCROOT}epoc32/release/tools2/linux-i386/$variant:$ENV{LD_LIBRARY_PATH}"; + } + + # Build the code + my $sbs_ver = doBuild($variant); + + # File extensions differ on Windows and Linux + my ( $ext_exe, $ext_dll ) = $win32 ? ( '.exe', '.dll' ) : ( '', '.so' ); + + # Generate string for the location of built file in epoc tree + my $release = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2'); + $release = catfile($release, 'linux-i386') if !$win32; + $release = catfile($release, '%s', '%s%s'); + + # The simple test should pass + doTest(sprintf($release, $variant, 'testexe', $ext_exe)); + doTest(sprintf($release, $variant, 'testexe_main.test', '')); + + # Check that the exe and lib have been built + checkExist(sprintf($release, $variant, 'testexe', $ext_exe)); + checkExist(sprintf($release, $variant, 'testexe_main.test', '')); + checkExist(sprintf($release, $variant, 'libteststatic', '.a')); + checkExist(sprintf($release, $variant, 'libtestdll', $ext_dll)); + + # Check all the files exist + if ($sbs_ver == 1) + { + my $build = catfile($ENV{EPOCROOT}, 'epoc32', 'build', cwd(), 'wrappermakefiles', '%s', cwd(), '%s'); + $build =~ s/\w:\\//g; + + # Check the object files exist + checkExist(sprintf($build, $variant, 'testexe.cpp.o')); + checkExist(sprintf($build, $variant, 'teststatic.cpp.o')); + checkExist(sprintf($build, $variant, 'testdll.cpp.o')); + + # Clean should delete everything + doClean($sbs_ver, $variant); + + # Object files should be gone now + checkMissing(sprintf($build, $variant, 'testexe.cpp.o')); + checkMissing(sprintf($build, $variant, 'teststatic.cpp.o')); + checkMissing(sprintf($build, $variant, 'testdll.cpp.o')); + } + else + { + my $build; + + # Build location differs between the TEM and FLM + my $flm = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml'); + if (-e $flm) + { + my $cwd = cwd(); + $cwd =~ s/$ENV{HOME}// if $ENV{HOME}; + $build = catfile($ENV{EPOCROOT}, 'epoc32', 'build', 'x86tools', '%s', '%s', $cwd, '%s'); + $build =~ s/\w:\\//g; + + # Check the object files exist + checkExist(sprintf($build, $variant, 'testexe', 'testexe.cpp.o')); + checkExist(sprintf($build, $variant, 'teststatic', 'teststatic.cpp.o')); + checkExist(sprintf($build, $variant, 'testdll', 'testdll.cpp.o')); + + # Clean should delete everything + doClean($sbs_ver, $variant); + + # Object files should be gone now + checkMissing(sprintf($build, $variant, 'testexe', 'testexe.cpp.o')); + checkMissing(sprintf($build, $variant, 'teststatic', 'teststatic.cpp.o')); + checkMissing(sprintf($build, $variant, 'testdll', 'testdll.cpp.o')); + } + else + { + $build = catfile($ENV{EPOCROOT}, 'epoc32', 'build', '%s', cwd(), '%s'); + $build =~ s/\w:\\//g; + + # Check the object files exist + checkExist(sprintf($build, $variant, 'testexe.cpp.o')); + checkExist(sprintf($build, $variant, 'teststatic.cpp.o')); + checkExist(sprintf($build, $variant, 'testdll.cpp.o')); + + # Clean should delete everything + doClean($sbs_ver, $variant); + + # Object files should be gone now + checkMissing(sprintf($build, $variant, 'testexe.cpp.o')); + checkMissing(sprintf($build, $variant, 'teststatic.cpp.o')); + checkMissing(sprintf($build, $variant, 'testdll.cpp.o')); + } + } + + # Releaseables should be gone + checkMissing(sprintf($release, $variant, 'testexe', $ext_exe)); + checkMissing(sprintf($release, $variant, 'testexe_main.test', '')); + checkMissing(sprintf($release, $variant, 'libteststatic', '.a')); + checkMissing(sprintf($release, $variant, 'libtestdll', $ext_dll)); + } + +sub checkExist + { + my $file = shift; + print "Checking file exists: $file\n" if $verbose; + ok(-e $file); + } + +sub checkMissing + { + my $file = shift; + print "Checking file missing: $file\n" if $verbose; + ok(!-e $file); + } + +# *** +# Runs test code +# +sub doTest + { + my $test = shift; + warn "Can't find test exe: $test" if (!-e $test); + + my $pass; + if (-e $test) + { + print "Running test: $test\n" if $verbose; + open TEST, "$test|" or die "Failed to start test $test: $!"; + while() + { + $pass = 1 if /^RTEST: SUCCESS/ or /TEST Successfully Completed/; + } + close TEST; + } + ok($pass); + } + +# *** +# Cleans the test code +# * +sub doClean + { + my $sbs_ver = shift; + my $variant = shift; + + my $redir = $verbose?'':' >nul 2>&1'; + print "Cleaning component for $variant\n" if $verbose; + if ($sbs_ver == 1) + { + # Use the old build system + system("bldmake bldfiles$redir"); + system("abld test makefile tools2$redir"); + system("abld test clean tools2 $variant$redir"); + } + else + { + # Use the new build system + system("sbs -c tools2_$variant.test CLEAN$redir"); + } + } + +# *** +# Builds the test code +# * +sub doBuild + { + my $variant = shift; + + # First of all see if SBSv2 is installed + my $sbs_ver = 1; + open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!"; + while() + { + if (/^sbs version/) + { + $sbs_ver = 2; + last; + } + } + close SBS; + die "This test requires SBSv2. Run with -ignore to run this test anyway" if $sbs_ver == 1 && !$ignore; + + # Override the result using environment variable + $sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1; + + # Now build the test code - assumes current working directory is correct! + my $redir = $verbose?'':' >nul 2>&1'; + print "Building test code using SBSv$sbs_ver for $variant\n" if $verbose; + if ($sbs_ver == 1) + { + print "Building using sbsv1\n" if $verbose; + + # Use the old build system + system("bldmake bldfiles$redir"); + system("abld test makefile tools2$redir"); + system("abld test clean tools2$redir"); + system("abld test library tools2$redir"); + system("abld test target tools2 $variant$redir"); + } + else + { + print "Building using sbsv2\n" if $verbose; + + # TEM can't handle parallel builds due to dependencies between extension makefiles + my $flm = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml'); + my $jopt = (!-e $flm) ? '-j 1' : ''; + + # Use the new build system + system("sbs $jopt -c tools2_$variant.test CLEAN$redir"); + system("sbs $jopt -c tools2_$variant.test$redir"); + } + + # Return the sbs version for later + return $sbs_ver; + } + +=head1 NAME + +test.pl - A script for running tests + +=head1 SYNOPSIS + +test.pl [-help] [-version] [-verbose] [-ignore] + + Options: + -help brief help message + -version version of the script + -verbose print what the scripts does + -ignore ignore lack of SBSv2 and run tests anyway +=cut diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/testdll.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/testdll.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,77 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include + +#include "testdll.h" + +EXPORT_C CTestDll::CTestDll() + { + } + +EXPORT_C CTestDll::~CTestDll() + { + } + +void LeavingFuncL() + { + User::Leave(-777); + } + +EXPORT_C void CTestDll::LeaveL() + { + TRAPD(err, LeavingFuncL()); + User::Leave(err); + } + +EXPORT_C TInt CTestDll::ArrayL() + { + RArray array; + array.Append(1); + array.Append(2); + array.Append(3); + + TInt count = array.Count(); + array.Close(); + return count; + } + +EXPORT_C void CTestDll::DescriptorL() + { + TBuf<256> des1; + TBuf<256> des2(_L("... TBuf descriptors are okay\n")); + des1.Format(_L("%S"), &des2); + RDebug::Print(des1); + + HBufC8* hbuf1 = HBufC8::NewLC(76); + hbuf1->Des().Copy(_L8("... Heap descriptors are okay\n")); + des1.Copy(*hbuf1); + RDebug::Print(des1); + + des1.Zero(); + des1.AppendNum(TReal(3.14), TRealFormat()); + RDebug::Print(_L("... The value of PI=%S\n"), &des1); + + des1.Zero(); + des1.AppendFormat(_L("... More accurate value of PI=%e\n"), TReal(3.14159)); + RDebug::Print(des1); + + // DEF132478: libsymport.a is out of date + RThread().Id(); + + CleanupStack::PopAndDestroy(hbuf1); + } diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/testdll.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/testdll.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,30 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef _TESTDLL_H__ +#define _TESTDLL_H__ + +class CTestDll : public CBase + { +public: + IMPORT_C CTestDll(); + IMPORT_C ~CTestDll(); +public: + IMPORT_C void LeaveL(); + IMPORT_C TInt ArrayL(); + IMPORT_C void DescriptorL(); + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/testexe.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/testexe.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,80 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include + +#include "teststatic.h" +#include "testdll.h" + +RTest test(_L("Simple tests")); + +EXPORT_C void HashL() + { + TInt in = 0x12345678; + TInt out = 0; + out = DefaultHash::Integer(in); + test(in != out); + } + +void DefectsL() + { + // DEF132826: symport User:Alloc family error checking + test(User::Alloc(-10) == NULL); + } + +void doMainL() + { + CTestDll dll; + + test.Start(_L("Leaving")); + TRAPD(err, TestStatic::LeaveL()); + RDebug::Print(_L("... Leave code from lib: %d\n"), err); + TRAP(err, dll.LeaveL()); + RDebug::Print(_L("... Leave code from dll: %d\n"), err); + test(err != KErrNone); + + test.Next(_L("Arrays")); + test(TestStatic::ArrayL() == 3); + test(dll.ArrayL() == 3); + + test.Next(_L("Descriptors")); + TestStatic::DescriptorL(); + dll.DescriptorL(); + + test.Next(_L("Hash")); + HashL(); + + test.Next(_L("Defects")); + DefectsL(); + + test.End(); + } + +int E32Main() + { + RDebug::Print(_L("Called from E32Main\n")); + + __UHEAP_MARK; + CTrapCleanup* theCleanup = CTrapCleanup::New(); + TRAPD(ret, doMainL()); + test(ret == KErrNone); + test.Close(); + delete theCleanup; + __UHEAP_MARKEND; + return ret; + } diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/testexe_main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/testexe_main.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,66 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include + +#include "teststatic.h" + +RTest test(_L("Simple tests")); + +EXPORT_C void HashL() + { + TInt in = 0x12345678; + TInt out = 0; + out = DefaultHash::Integer(in); + test(in != out); + } + +void doMainL() + { + test.Start(_L("Leaving")); + TRAPD(err, TestStatic::LeaveL()); + RDebug::Print(_L("... Leave code: %d\n"), err); + test(err != KErrNone); + + test.Next(_L("Arrays")); + test(TestStatic::ArrayL() == 3); + + test.Next(_L("Descriptors")); + TestStatic::DescriptorL(); + + test.Next(_L("Hash")); + HashL(); + + test.End(); + } + +// Note - no E32Main! +int main(int argc, char *argv[]) + { + RDebug::Print(_L("Called from main\n")); + + __UHEAP_MARK; + CTrapCleanup* theCleanup = CTrapCleanup::New(); + TRAPD(ret, doMainL()); + test(ret == KErrNone); + test.Close(); + delete theCleanup; + __UHEAP_MARKEND; + return ret; + } + diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/teststatic.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/teststatic.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,60 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include + +#include "teststatic.h" + +EXPORT_C void TestStatic::LeaveL() + { + User::Leave(-666); + } + +EXPORT_C TInt TestStatic::ArrayL() + { + RArray array; + array.Append(1); + array.Append(2); + array.Append(3); + + TInt count = array.Count(); + array.Close(); + return count; + } + +EXPORT_C void TestStatic::DescriptorL() + { + TBuf<256> des1; + TBuf<256> des2(_L("... TBuf descriptors are okay\n")); + des1.Format(_L("%S"), &des2); + RDebug::Print(des1); + + HBufC8* hbuf1 = HBufC8::NewLC(76); + hbuf1->Des().Copy(_L8("... Heap descriptors are okay\n")); + des1.Copy(*hbuf1); + RDebug::Print(des1); + + des1.Zero(); + des1.AppendNum(TReal(3.14), TRealFormat()); + RDebug::Print(_L("... The value of PI=%S\n"), &des1); + + des1.Zero(); + des1.AppendFormat(_L("... More accurate value of PI=%e\n"), TReal(3.14159)); + RDebug::Print(des1); + + CleanupStack::PopAndDestroy(hbuf1); + } diff -r c55016431358 -r 0a7b44b10206 symport/bldtest/teststatic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/bldtest/teststatic.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,27 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef _TESTSTATIC_H__ +#define _TESTSTATIC_H__ + +class TestStatic + { +public: + IMPORT_C static void LeaveL(); + IMPORT_C static TInt ArrayL(); + IMPORT_C static void DescriptorL(); + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/charconv/framework/inc/utf.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/charconv/framework/inc/utf.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,86 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#if !defined(__UTF_H__) +#define __UTF_H__ + +#if !defined(__E32STD_H__) +#include +#endif + + +class CnvUtfConverter +/** +Converts text between Unicode (UCS-2) and the two Unicode transformation +formats UTF-7 and UTF-8. There are no functions to convert directly between +UTF-7 and UTF-8. + +Objects of this class do not need to be created because all the member functions +are static. The four functions are passed text in the second argument and +output the resulting text in the first argument. Sixteen-bit descriptors are +used to hold text encoded in UCS-2 (i.e. normal 16 bit Unicode), and eight-bit +descriptors are used to hold text encoded in either of the transformation +formats. + +The conversion functions return the number of characters which were not converted +because the output descriptor was not long enough to hold all of the converted +text. This allows users of this class to perform partial conversions on an +input descriptor, handling the case when the input descriptor is truncated +mid way through a multi-byte character. The caller does not have to guess +how big to make the output descriptor for a given input descriptor- they +can simply do the conversion in a loop using a small output descriptor. The +ability to handle truncated descriptors is particularly useful if the caller +is receiving information in chunks from an external source. +@publishedAll +@released +*/ + { +public: + /** Conversion error flags. At this stage there is only one error flag + - others may be added in the future. */ + enum TError + { + /** The input descriptor contains a single corrupt character. This + might occur when the input descriptor only contains some of the bytes + of a single multi-byte character. */ + EErrorIllFormedInput=KErrCorrupt + }; + + /** Initial value for the state argument in a set of related calls to + ConvertToUnicode(). */ + enum {KStateDefault=0}; +public: + // the conversion functions return either one of the TError values above, or the number of unconverted elements left at the end of the input descriptor + IMPORT_C static TInt ConvertFromUnicodeToUtf7(TDes8& aUtf7, const TDesC16& aUnicode, TBool aEncodeOptionalDirectCharactersInBase64); + static TInt ConvertFromUnicodeToUtf7(TDes8& aUtf7, const TDesC16& aUnicode, TBool aIsImapUtf7, TBool aEncodeOptionalDirectCharactersInBase64); + IMPORT_C static TInt ConvertFromUnicodeToUtf8(TDes8& aUtf8, const TDesC16& aUnicode); + static TInt ConvertFromUnicodeToUtf8(TDes8& aUtf8, const TDesC16& aUnicode, TBool aGenerateJavaConformantUtf8); + IMPORT_C static TInt ConvertToUnicodeFromUtf7(TDes16& aUnicode, const TDesC8& aUtf7, TInt& aState); + static TInt ConvertToUnicodeFromUtf7(TDes16& aUnicode, const TDesC8& aUtf7, TBool aIsImapUtf7, TInt& aState); + IMPORT_C static TInt ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8); + static TInt ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8); + static TInt ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8, + TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter); + + IMPORT_C static HBufC8* ConvertFromUnicodeToUtf7L(const TDesC16& aUnicode,TBool aEncodeOptionalDirectCharactersInBase64); + IMPORT_C static HBufC8* ConvertFromUnicodeToUtf8L(const TDesC16& aUnicode); + IMPORT_C static HBufC16* ConvertToUnicodeFromUtf7L(const TDesC8& aUtf7); + IMPORT_C static HBufC16* ConvertToUnicodeFromUtf8L(const TDesC8& aUtf8); + + + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/charconv/framework/src/charconv/utf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/charconv/framework/src/charconv/utf.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1437 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include + +const TUint KNotInBase64Alphabet=KMaxTUint; + +enum TPanic + { + EPanicBad6BitNumber=1, + EPanicBadUtf7Pointers1, + EPanicBadUtf7Pointers2, + EPanicBadUtf7Pointers3, + EPanicBadUtf7Pointers4, + EPanicBadUtf7Pointers5, + EPanicBadUtf7Pointers6, + EPanicBadUtf7Pointers7, + EPanicBadUtf7Pointers8, + EPanicBadUtf7Pointers9, + EPanicBadUtf7Pointers10, + EPanicBadUtf7Pointers11, + EPanicNotInBase64Block, + EPanicBadUnicodePointers1, + EPanicBadUnicodePointers2, + EPanicBadUnicodePointers3, + EPanicBadUnicodePointers4, + EPanicBadUnicodePointers5, + EPanicBadUnicodePointers6, + EPanicBadUnicodePointers7, + EPanicBadUnicodePointers8, + EPanicBadUnicodePointers9, + EPanicBadUnicodePointers10, + EPanicBadBitBufferState1, + EPanicBadBitBufferState2, + EPanicBadBitBufferState3, + EPanicBadBitBufferState4, + EPanicBadBitBufferState5, + EPanicBadBitBufferState6, + EPanicBadBitBufferState7, + EPanicBadBitBufferState8, + EPanicBadBitBufferState9, + EPanicBadBitBufferState10, + EPanicBadBitBufferState11, + EPanicBadBitBufferState12, + EPanicBadBitBufferState13, + EPanicBadBitBufferState14, + EPanicBadBitBufferState15, + EPanicBadBitBufferState16, + EPanicBadBitBufferState17, + EPanicUnexpectedNumberOfLoopIterations, + EPanicInitialEscapeCharacterButNoBase64, + EPanicBase64SequenceDoesNotFallOnUnicodeCharacterBoundary, + EPanicBadUtf8Pointers1, + EPanicBadUtf8Pointers2, + EPanicBadUtf8Pointers3, + EPanicBadUtf8Pointers4, + EPanicBadUtf8Pointers5, + EPanicBadUtf8Pointers6, + EPanicBadUtf8Pointers7, + EPanicOutOfSyncUtf7Byte1, + EPanicOutOfSyncUtf7Byte2, + EPanicOutOfSyncBase64Decoding + }; + +_LIT(KLitPanicText, "CHARCONV-UTF"); + +LOCAL_C void Panic(TPanic aPanic) + { + User::Panic(KLitPanicText, aPanic); + } + +inline TUint EscapeCharacterForStartingBase64Block(TBool aIsImapUtf7) {return aIsImapUtf7? '&': '+';} + +LOCAL_C TUint Base64Decoding(TUint aMemberOfBase64Alphabet, TBool aIsImapUtf7) + { + if ((aMemberOfBase64Alphabet>='A') && (aMemberOfBase64Alphabet<='Z')) + { + return aMemberOfBase64Alphabet-'A'; + } + if ((aMemberOfBase64Alphabet>='a') && (aMemberOfBase64Alphabet<='z')) + { + return aMemberOfBase64Alphabet-('a'-26); + } + if ((aMemberOfBase64Alphabet>='0') && (aMemberOfBase64Alphabet<='9')) + { + return aMemberOfBase64Alphabet+((26*2)-'0'); + } + if (aMemberOfBase64Alphabet=='+') + { + return 62; + } + if (aMemberOfBase64Alphabet==STATIC_CAST(TUint, aIsImapUtf7? ',': '/')) + { + return 63; + } + return KNotInBase64Alphabet; + } + +LOCAL_C TUint Base64Encoding(TUint a6BitNumber, TBool aIsImapUtf7) + { + __ASSERT_DEBUG(a6BitNumber<64, Panic(EPanicBad6BitNumber)); + if ((a6BitNumber==63) && aIsImapUtf7) + { + return ','; + } + static const TUint8 base64Alphabet[64]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; + return base64Alphabet[a6BitNumber]; + } + +LOCAL_C TUint8* PointerToEscapeCharacterStartingBase64Block(TUint8* aPointerToUtf7Byte, const TUint8* aPointerToFirstUtf7Byte, TBool aIsImapUtf7) + { + __ASSERT_DEBUG(aPointerToUtf7Byte>=aPointerToFirstUtf7Byte, Panic(EPanicBadUtf7Pointers1)); + TUint8* pointerToCandidateEscapeCharacter=NULL; + FOREVER + { + const TUint utf7Byte=*aPointerToUtf7Byte; + if (utf7Byte==EscapeCharacterForStartingBase64Block(aIsImapUtf7)) + { + pointerToCandidateEscapeCharacter=aPointerToUtf7Byte; + } + else if (Base64Decoding(utf7Byte, aIsImapUtf7)==KNotInBase64Alphabet) + { + break; + } + __ASSERT_DEBUG(aPointerToUtf7Byte>=aPointerToFirstUtf7Byte, Panic(EPanicBadUtf7Pointers2)); + if (aPointerToUtf7Byte<=aPointerToFirstUtf7Byte) + { + break; + } + --aPointerToUtf7Byte; + } + __ASSERT_DEBUG(pointerToCandidateEscapeCharacter!=NULL, Panic(EPanicNotInBase64Block)); + return pointerToCandidateEscapeCharacter; + } + +LOCAL_C TBool EncodeInUtf7Directly(TUint aUnicodeCharacter, TBool aIsImapUtf7, TBool aEncodeOptionalDirectCharactersInBase64) + { + if (aIsImapUtf7) + { + return (aUnicodeCharacter>=0x0020) && (aUnicodeCharacter<=0x007e); + } + if ((aUnicodeCharacter>=0x0021) && (aUnicodeCharacter<=0x007d)) + { + if (aEncodeOptionalDirectCharactersInBase64) + { + return (((aUnicodeCharacter>=0x0041) && (aUnicodeCharacter<=0x005a)) || + ((aUnicodeCharacter>=0x0061) && (aUnicodeCharacter<=0x007a)) || + ((aUnicodeCharacter>=0x0027) && (aUnicodeCharacter<=0x0029)) || + ((aUnicodeCharacter>=0x002b) && (aUnicodeCharacter<=0x003a)) || + (aUnicodeCharacter==0x003f)); + } + return aUnicodeCharacter!=0x005c; + } + return (aUnicodeCharacter==0x0020) || (aUnicodeCharacter==0x0009) || (aUnicodeCharacter==0x000d) || (aUnicodeCharacter==0x000a); + } + +inline TBool BitBufferContainsNonZeroBits(TUint aBitBuffer, TInt aNumberOfBitsInBuffer) + { + return (aBitBuffer&((1< buf; + HBufC8* hBuf8 = HBufC8::NewLC(length); + TPtr8 utf7 = hBuf8->Des(); + + FOREVER + { + TInt unconverted = ConvertFromUnicodeToUtf7(buf, unicode, aEncodeOptionalDirectCharactersInBase64); + if( unconverted == EErrorIllFormedInput || unconverted < 0) + User::Leave(KErrCorrupt); + + if (utf7.Length() + buf.Length() > utf7.MaxLength()) + { + // Reallocate the hBuf8 + hBuf8 = hBuf8->ReAllocL(utf7.Length() + buf.Length()); + CleanupStack::Pop(); + CleanupStack::PushL(hBuf8); + utf7.Set(hBuf8->Des()); + } + utf7.Append(buf); + if (unconverted ==0) + break; + unicode.Set(unicode.Right(unconverted)); + } + CleanupStack::Pop(); + return hBuf8; + + } + +/** Converts Unicode text into UTF-7 encoding. + +@param aUtf7 On return, contains the UTF-7 encoded output string. +@param aUnicode A UCS-2 encoded input string. +@param aEncodeOptionalDirectCharactersInBase64 If ETrue then characters from +UTF-7 set O (optional direct characters) are encoded in Modified Base64. If +EFalse the characters are encoded directly, as their ASCII equivalents. +@return The number of unconverted characters left at the end of the input +descriptor, or one of the error values defined in TError. */ +EXPORT_C TInt CnvUtfConverter::ConvertFromUnicodeToUtf7( + TDes8& aUtf7, + const TDesC16& aUnicode, + TBool aEncodeOptionalDirectCharactersInBase64) + { + return ConvertFromUnicodeToUtf7(aUtf7, aUnicode, EFalse, aEncodeOptionalDirectCharactersInBase64); + } + +TInt CnvUtfConverter::ConvertFromUnicodeToUtf7(TDes8& aUtf7, + const TDesC16& aUnicode, + TBool aIsImapUtf7, + TBool aEncodeOptionalDirectCharactersInBase64) + { + if (aUnicode.Length()==0) + { + aUtf7.SetLength(0); + return 0; + } + if (aUtf7.MaxLength()==0) + { + return aUnicode.Length(); + } + const TUint escapeCharacterForStartingBase64Block=EscapeCharacterForStartingBase64Block(aIsImapUtf7); + TUint8* pointerToPreviousUtf7Byte=CONST_CAST(TUint8*, aUtf7.Ptr()-1); + const TUint8* const pointerToLastUtf7Byte=pointerToPreviousUtf7Byte+aUtf7.MaxLength(); + const TUint16* pointerToPreviousUnicodeCharacter=aUnicode.Ptr()-1; + const TUint16* const pointerToLastUnicodeCharacter=pointerToPreviousUnicodeCharacter+aUnicode.Length(); + const TUint KIsInBase64Block=0x80000000u; + TUint bitBuffer=0; + TInt numberOfBitsInBuffer=0; + FOREVER + { + __ASSERT_DEBUG(pointerToPreviousUtf7Byte<=pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers3)); + __ASSERT_DEBUG(pointerToPreviousUnicodeCharacter<=pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers1)); + TUint currentUnicodeCharacter=(pointerToPreviousUnicodeCharacter==pointerToLastUnicodeCharacter)? 0: *(pointerToPreviousUnicodeCharacter+1); + if ((pointerToPreviousUnicodeCharacter==pointerToLastUnicodeCharacter) || EncodeInUtf7Directly(currentUnicodeCharacter, aIsImapUtf7, aEncodeOptionalDirectCharactersInBase64)) + { + __ASSERT_DEBUG((bitBuffer&KIsInBase64Block) || (numberOfBitsInBuffer==0), Panic(EPanicBadBitBufferState1)); + __ASSERT_DEBUG((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4), Panic(EPanicBadBitBufferState2)); + if (bitBuffer&KIsInBase64Block) + { + if (numberOfBitsInBuffer!=0) + { + if (pointerToLastUtf7Byte-pointerToPreviousUtf7Byte<2) // make sure there is enough space for the trailing '-' as well as the remains of the bitBuffer as the KIsInBase64Block flag is about to turned off, thus the trailing '-' may never get written + { + break; + } + ++pointerToPreviousUtf7Byte; + *pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, Base64Encoding((bitBuffer<<(6-numberOfBitsInBuffer))&0x3f, aIsImapUtf7)); + } + else + { + if (pointerToPreviousUtf7Byte==pointerToLastUtf7Byte) + { + break; + } + } + ++pointerToPreviousUtf7Byte; + *pointerToPreviousUtf7Byte='-'; + bitBuffer=0; + numberOfBitsInBuffer=0; + } + __ASSERT_DEBUG(pointerToPreviousUnicodeCharacter<=pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers2)); + if (pointerToPreviousUnicodeCharacter>=pointerToLastUnicodeCharacter) + { + break; + } + __ASSERT_DEBUG(pointerToPreviousUtf7Byte<=pointerToLastUtf7Byte, Panic(EPanicBadUtf7Pointers4)); + if (pointerToLastUtf7Byte-pointerToPreviousUtf7Byte<((currentUnicodeCharacter==escapeCharacterForStartingBase64Block)? 2: 1)) + { + break; + } + ++pointerToPreviousUtf7Byte; + *pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, currentUnicodeCharacter); + ++pointerToPreviousUnicodeCharacter; + if (currentUnicodeCharacter==escapeCharacterForStartingBase64Block) + { + ++pointerToPreviousUtf7Byte; + *pointerToPreviousUtf7Byte='-'; + } + } + else + { + { + TInt numberOfUtf7BytesRequired=(numberOfBitsInBuffer+16)/6; // "(numberOfBitsInBuffer+16)/6" is the number of iterations that will happen in the while loop below + if (~bitBuffer&KIsInBase64Block) + { + ++numberOfUtf7BytesRequired; // for the initial escapeCharacterForStartingBase64Block + } + if (pointerToLastUtf7Byte-pointerToPreviousUtf7Byte=6) + { + numberOfBitsInBuffer-=6; + __ASSERT_DEBUG(pointerToPreviousUtf7Byte>numberOfBitsInBuffer)&0x3f, aIsImapUtf7)); + } + bitBuffer&=((1<=((numberOfBitsInBuffer==0)? 1: 2)) // if there's room to finish off the base-64 sequence by (i) flushing the bit-buffer and (ii) appending the trailing '-' + { + if (numberOfBitsInBuffer!=0) + { + __ASSERT_DEBUG(pointerToPreviousUtf7Byte0, Panic(EPanicInitialEscapeCharacterButNoBase64)); + __ASSERT_DEBUG(((oldNumberOfBase64Characters*6)+numberOfBitsInBuffer)%16==0, Panic(EPanicBase64SequenceDoesNotFallOnUnicodeCharacterBoundary)); + pointerToPreviousUnicodeCharacter-=((oldNumberOfBase64Characters*6)+numberOfBitsInBuffer)/16; // move back pointerToPreviousUnicodeCharacter to before the equivalent of the base-64 sequence + pointerToPreviousUtf7Byte=pointerToEscapeCharacterStartingBase64Block; + __ASSERT_DEBUG(*pointerToPreviousUtf7Byte==escapeCharacterForStartingBase64Block, Panic(EPanicBadUtf7Pointers10)); + if (oldNumberOfBase64Characters<4) // if the new base-64 sequence will be so short that it won't even be able to contain the UTF-7 encoding of a single Unicode character + { + --pointerToPreviousUtf7Byte; // move back pointerToPreviousUtf7Byte to before the escapeCharacterForStartingBase64Block + break; + } + const TInt newNumberOfUnicodeCharacters=((oldNumberOfBase64Characters-1)*3)/8; + pointerToPreviousUnicodeCharacter+=newNumberOfUnicodeCharacters; + pointerToPreviousUtf7Byte+=((newNumberOfUnicodeCharacters*8)+2)/3; + const TInt numberOfBitsToBeZeroedInLastBase64Character=(newNumberOfUnicodeCharacters%3)*2; + if (numberOfBitsToBeZeroedInLastBase64Character!=0) + { + *pointerToPreviousUtf7Byte=STATIC_CAST(TUint8, Base64Encoding(Base64Decoding(*pointerToPreviousUtf7Byte, aIsImapUtf7)&0x3f&~((1< buf; + HBufC8* hBuf8 = HBufC8::NewLC(length); + TPtr8 utf8 = hBuf8->Des(); + + FOREVER + { + TInt unconverted = ConvertFromUnicodeToUtf8(buf, unicode); + if( unconverted == EErrorIllFormedInput || unconverted < 0) + User::Leave(KErrCorrupt); + + if (utf8.Length() + buf.Length() > utf8.MaxLength()) + { + // Reallocate the hBuf8 + hBuf8 = hBuf8->ReAllocL(utf8.Length() + buf.Length()); + CleanupStack::Pop(); + CleanupStack::PushL(hBuf8); + utf8.Set(hBuf8->Des()); + } + utf8.Append(buf); + if (unconverted ==0) + break; + unicode.Set(unicode.Right(unconverted)); + } + CleanupStack::Pop(); + return hBuf8; + } + +/** Converts Unicode text into UTF-8 encoding. + +Surrogate pairs can be input which will result in a valid 4 byte UTF-8 value. + +The variant of UTF-8 used internally by Java differs slightly from standard +UTF-8. The TBool argument controls the UTF-8 variant generated by this function. + +@param aUtf8 On return, contains the UTF-8 encoded output string. +@param aUnicode A UCS-2 encoded input string. +@param aGenerateJavaConformantUtf8 EFalse for orthodox UTF-8. ETrue for Java +UTF-8. The default is EFalse. +@return The number of unconverted characters left at the end of the input descriptor, +or one of the error values defined in TError. */ +TInt CnvUtfConverter::ConvertFromUnicodeToUtf8(TDes8& aUtf8, + const TDesC16& aUnicode, + TBool aGenerateJavaConformantUtf8) + { + if (aUnicode.Length() == 0) + { + aUtf8.SetLength(0); + return 0; + } + if (aUtf8.MaxLength() == 0) + { + return aUnicode.Length(); + } + + TUint8* pUtf8 = CONST_CAST(TUint8*, aUtf8.Ptr()); + const TUint8* pointerToLastUtf8Byte = pUtf8 + (aUtf8.MaxLength() - 1); + TBool inputIsTruncated = EFalse; + const TUint16* pUnicode = aUnicode.Ptr(); + const TUint16* pointerToLastUnicodeCharacter = pUnicode + (aUnicode.Length() - 1); + + FOREVER + { + __ASSERT_DEBUG(pUtf8 <= pointerToLastUtf8Byte, Panic(EPanicBadUtf8Pointers1)); + __ASSERT_DEBUG(pUnicode <= pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers3)); + + if (pUnicode[0] < 0x80) + { + // ascii - 1 byte + + // internally java is different since the \x0000 character is + // translated into \xC0 \x80. + + if ((aGenerateJavaConformantUtf8) && (pUnicode[0] == 0x0000)) + { + if (pUtf8 == pointerToLastUtf8Byte) + { + pUtf8--; + pUnicode--; + break; + } + *pUtf8++ = STATIC_CAST(TUint8, 0xc0); + *pUtf8 = STATIC_CAST(TUint8, 0x80); + } + else + { + *pUtf8 = STATIC_CAST(TUint8, pUnicode[0]); + } + } + else if (pUnicode[0] < 0x800) + { + // U+0080..U+07FF - 2 bytes + + if (pUtf8 == pointerToLastUtf8Byte) + { + pUtf8--; + pUnicode--; + break; + } + + *pUtf8++ = STATIC_CAST(TUint8, 0xc0|(pUnicode[0]>>6)); + *pUtf8 = STATIC_CAST(TUint8, 0x80|(pUnicode[0]&0x3f)); + + } + + // check to see if we have a surrogate in the stream, surrogates encode code points outside + // the BMP and are 4 utf-8 chars, otherwise what we have here is 3 utf-8 chars. + + else if (((pUnicode[0] & 0xfc00) == 0xd800) && !aGenerateJavaConformantUtf8) + { + // surrogate pair - 4 bytes in utf-8 + // U+10000..U+10FFFF + + __ASSERT_DEBUG(pUtf8 <= pointerToLastUtf8Byte, Panic(EPanicBadUtf8Pointers2)); + // is there enough space to hold the character + if ((pointerToLastUtf8Byte - pUtf8) < 3) + { + pUtf8--; + pUnicode--; + break; // no go to the exit condition + } + + __ASSERT_DEBUG(pUnicode <= pointerToLastUnicodeCharacter, Panic(EPanicBadUnicodePointers4)); + if (pUnicode >= pointerToLastUnicodeCharacter) + { + pUtf8--; + pUnicode--; + inputIsTruncated = ETrue; + break; // middle of a surrogate pair. go to end condition + } + + if ((pUnicode[1] & 0xfc00) != 0xdc00) + { + return EErrorIllFormedInput; + } + + // convert utf-16 surrogate to utf-32 + TUint ch = ((pUnicode[0] - 0xD800) << 10 | (pUnicode[1] - 0xDC00)) + 0x10000; + + // convert utf-32 to utf-8 + *pUtf8++ = STATIC_CAST(TUint8,0xf0 | (ch >> 18)); + *pUtf8++ = STATIC_CAST(TUint8,0x80 | ((ch >> 12) & 0x3f)); + *pUtf8++ = STATIC_CAST(TUint8,0x80 | ((ch >> 6) & 0x3f)); + *pUtf8 = STATIC_CAST(TUint8,0x80 | (ch & 0x3f)); + + // we consumed 2 utf-16 values, move this pointer + pUnicode++; + } + else + { + // 3 byte - utf-8, U+800..U+FFFF rest of BMP. + + if (pointerToLastUtf8Byte - pUtf8 < 2) + { + pUtf8--; + pUnicode--; + break; + } + *pUtf8++ = STATIC_CAST(TUint8, 0xe0|(pUnicode[0]>>12)); + *pUtf8++ = STATIC_CAST(TUint8, 0x80|((pUnicode[0]>>6)&0x3f)); + *pUtf8 = STATIC_CAST(TUint8, 0x80|(pUnicode[0]&0x3f)); + } + + if ((pUnicode == pointerToLastUnicodeCharacter) || (pUtf8 == pointerToLastUtf8Byte)) + { + break; + } + + pUtf8++; + pUnicode++; + + } + + if ((pUnicode < aUnicode.Ptr()) && inputIsTruncated) + { + return EErrorIllFormedInput; + } + + aUtf8.SetLength((pUtf8 - aUtf8.Ptr())+1); + return pointerToLastUnicodeCharacter-pUnicode; + } + + + +/** Converts text encoded using the Unicode transformation format UTF-7 +into the Unicode UCS-2 character set. + +@param aUtf7 The UTF-7 encoded input string. +@return A pointer to an HBufC16 containing the converted Unicode string */ +EXPORT_C HBufC16* CnvUtfConverter::ConvertToUnicodeFromUtf7L(const TDesC8& aUtf7) + { + // If aUtf8 is an empty string return + if (aUtf7.Length()==0) + { + HBufC16* hBuf = HBufC16::NewL(1); + return hBuf; + } + + // else convert aUtf8 to Unicode storing the result in a buffer, reallocating + // it when needed. + TInt length = aUtf7.Length(); + const TInt bufsize = 100; + TInt state = KStateDefault; + + TPtrC8 utf7 (aUtf7); + TBuf buf; + HBufC16* hBuf = HBufC16::NewLC(length); + TPtr unicode = hBuf->Des(); + + FOREVER + { + TInt unconverted = ConvertToUnicodeFromUtf7(buf, utf7, state); + if( unconverted == EErrorIllFormedInput || unconverted < 0) + User::Leave(KErrCorrupt); + + if (unicode.Length() + buf.Length() > unicode.MaxLength()) + { + // Reallocate hBuf + hBuf = hBuf->ReAllocL(unicode.Length() + buf.Length()); + CleanupStack::Pop(); + CleanupStack::PushL(hBuf); + unicode.Set(hBuf->Des()); + } + unicode.Append(buf); + if (unconverted ==0) + break; + utf7.Set(utf7.Right(unconverted)); + } + CleanupStack::Pop(); + return hBuf; + } + + + +/** Converts text encoded using the Unicode transformation format UTF-7 into the +Unicode UCS-2 character set. + +If the conversion is achieved using a series of calls to this function, where +each call starts off where the previous call reached in the input descriptor, +the state of the conversion is stored. The initial value of the state variable +should be set as KStateDefault when the conversion is started, and afterwards +simply passed unchanged into each function call. + +@param aUnicode On return, contains the Unicode encoded output string. +@param aUtf7 The UTF-7 encoded input string. +@param aState For the first call of the function set to KStateDefault. For +subsequent calls, pass in the variable unchanged. +@return The number of unconverted bytes left at the end of the input descriptor, +or one of the error values defined in TError. */ +EXPORT_C TInt CnvUtfConverter::ConvertToUnicodeFromUtf7(TDes16& aUnicode, + const TDesC8& aUtf7, + TInt& aState) + { + return ConvertToUnicodeFromUtf7(aUnicode, aUtf7, EFalse, aState); + } + +TInt CnvUtfConverter::ConvertToUnicodeFromUtf7(TDes16& aUnicode, + const TDesC8& aUtf7, + TBool aIsImapUtf7, + TInt& aState) + { + if (aUtf7.Length()==0) + { + aUnicode.SetLength(0); + return 0; + } + if (aUnicode.MaxLength()==0) + { + return aUtf7.Length(); + } + const TUint escapeCharacterForStartingBase64Block=EscapeCharacterForStartingBase64Block(aIsImapUtf7); + TUint16* pointerToPreviousUnicodeCharacter=CONST_CAST(TUint16*, aUnicode.Ptr()-1); + const TUint16* pointerToLastUnicodeCharacter=pointerToPreviousUnicodeCharacter+aUnicode.MaxLength(); + const TUint8* pointerToCurrentUtf7Byte=aUtf7.Ptr(); + const TUint8* pointerToLastUtf7Byte=pointerToCurrentUtf7Byte+(aUtf7.Length()-1); + TUint currentUtf7Byte=*pointerToCurrentUtf7Byte; + const TUint KIsInBase64Block=0x80000000u; + TUint bitBuffer=STATIC_CAST(TUint, aState); + TInt numberOfBitsInBuffer=((bitBuffer&0xf0)>>4); + bitBuffer&=~0xf0; // turn off the bits that stored numberOfBitsInBuffer + if (bitBuffer&KIsInBase64Block) + { + __ASSERT_ALWAYS((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4) || ((numberOfBitsInBuffer<16) && (numberOfBitsInBuffer%2==0) && !BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer)), Panic(EPanicBadBitBufferState7)); + __ASSERT_ALWAYS((bitBuffer&~(KIsInBase64Block|0x0000000f))==0, Panic(EPanicBadBitBufferState8)); + } + else + { + __ASSERT_ALWAYS(bitBuffer==0, Panic(EPanicBadBitBufferState9)); + __ASSERT_ALWAYS(numberOfBitsInBuffer==0, Panic(EPanicBadBitBufferState10)); + } + aState=KStateDefault; + if (bitBuffer&KIsInBase64Block) + { + currentUtf7Byte=Base64Decoding(currentUtf7Byte, aIsImapUtf7); + } + TBool inputIsTruncated=EFalse; + FOREVER + { + __ASSERT_DEBUG(pointerToPreviousUnicodeCharacter=16+6) || ((numberOfBitsInBuffer>=16) && !BitBufferContainsNonZeroBits(bitBuffer, numberOfBitsInBuffer-16))) + { + numberOfBitsInBuffer-=16; + __ASSERT_DEBUG(pointerToPreviousUnicodeCharacter>numberOfBitsInBuffer); + bitBuffer&=((1<=6, Panic(EPanicBadBitBufferState14)); + pointerToCurrentUtf7Byte-=numberOfBitsInBuffer/6; + const TInt newNumberOfBitsInBuffer=numberOfBitsInBuffer%6; + bitBuffer&=~KIsInBase64Block; // temporarily turn off the KIsInBase64Block for the right-shift + bitBuffer>>=(numberOfBitsInBuffer-newNumberOfBitsInBuffer); + bitBuffer|=KIsInBase64Block; // must be turned back on again as the bit-buffer is packed into aState + numberOfBitsInBuffer=newNumberOfBitsInBuffer; + __ASSERT_DEBUG((numberOfBitsInBuffer==0) || (numberOfBitsInBuffer==2) || (numberOfBitsInBuffer==4), Panic(EPanicBadBitBufferState15)); + } + __ASSERT_DEBUG((numberOfBitsInBuffer<16) && (numberOfBitsInBuffer%2==0), Panic(EPanicBadBitBufferState16)); + aState=STATIC_CAST(TInt, bitBuffer); + aState|=(numberOfBitsInBuffer<<4); + __ASSERT_DEBUG(aState&KIsInBase64Block, Panic(EPanicBadBitBufferState17)); + bitBuffer=0; + numberOfBitsInBuffer=0; + } + if ((pointerToCurrentUtf7Byte buf; + HBufC16* hBuf = HBufC16::NewLC(length); + TPtr unicode = hBuf->Des(); + + FOREVER + { + TInt unconverted = ConvertToUnicodeFromUtf8(buf, utf8); + if( unconverted == EErrorIllFormedInput || unconverted < 0) + User::Leave(KErrCorrupt); + + if (unicode.Length() + buf.Length() > unicode.MaxLength()) + { + // Reallocate hBuf + hBuf = hBuf->ReAllocL(unicode.Length() + buf.Length()); + CleanupStack::Pop(); + CleanupStack::PushL(hBuf); + unicode.Set(hBuf->Des()); + } + unicode.Append(buf); + if (unconverted ==0) + break; + utf8.Set(utf8.Right(unconverted)); + } + CleanupStack::Pop(); + return hBuf; + } + +/** Converts text encoded using the Unicode transformation format UTF-8 into the +Unicode UCS-2 character set. + +@param aUnicode On return, contains the Unicode encoded output string. +@param aUtf8 The UTF-8 encoded input string +@return The number of unconverted bytes left at the end of the input descriptor, +or one of the error values defined in TError. */ +EXPORT_C TInt CnvUtfConverter::ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8) + { + return ConvertToUnicodeFromUtf8(aUnicode, aUtf8, EFalse); + } + +static void UpdateUnconvertibleInfo(TInt& aNumberOfUnconvertibleCharacters, + TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter, TUint8 aIndex) + { + if (aNumberOfUnconvertibleCharacters<=0) + { + aIndexOfFirstByteOfFirstUnconvertibleCharacter = aIndex; + } + ++aNumberOfUnconvertibleCharacters; + } + +/** Converts text encoded using the Unicode transformation format UTF-8 into the +Unicode UCS-2 character set. + +@param aUnicode On return, contains the Unicode encoded output string. +@param aUtf8 The UTF-8 encoded input string +@param aGenerateJavaConformantUtf8 EFalse for orthodox UTF-8. ETrue for Java +@return The number of unconverted bytes left at the end of the input descriptor, +or one of the error values defined in TError. */ +TInt CnvUtfConverter::ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8) + { + TInt dummyUnconverted, dummyUnconvertedIndex; + return ConvertToUnicodeFromUtf8(aUnicode, aUtf8, aGenerateJavaConformantUtf8, dummyUnconverted, dummyUnconvertedIndex); + } + +/** Converts text encoded using the Unicode transformation format UTF-8 into the +Unicode UCS-2 character set. Surrogate pairs can be created when a valid 4 byte UTF-8 is input. + +The variant of UTF-8 used internally by Java differs slightly from standard +UTF-8. The TBool argument controls the UTF-8 variant generated by this function. + +@param aUnicode On return, contains the Unicode encoded output string. +@param aUtf8 The UTF-8 encoded input string +@param aGenerateJavaConformantUtf8 EFalse for orthodox UTF-8. ETrue for Java +UTF-8. The default is EFalse. +@param aNumberOfUnconvertibleCharacters On return, contains the number of bytes +which were not converted. +@param aIndexOfFirstByteOfFirstUnconvertibleCharacter On return, the index +of the first byte of the first unconvertible character. For instance if the +first character in the input descriptor (aForeign) could not be converted, +then this parameter is set to the first byte of that character, i.e. zero. +A negative value is returned if all the characters were converted. +@return The number of unconverted bytes left at the end of the input descriptor, +or one of the error values defined in TError. */ + +/* of note: conformance. Unicode standard 5.0 section 3.9, table 3-7 + * Well formed UTF-8 Byte Sequences, full table. + * +----------------------------------------------------------------+ + * | Code Points | 1st byte | 2nd byte | 3rd byte | 4th byte | + * +--------------------+----------+----------+----------+----------+ + * | U+0000..U+007F | 00..7D | | | | 1 byte, ascii + * | U+0080..U+07FF | C2..DF | 80..BF | | | 2 bytes, error if 1st < 0xC2 + * | U+0800..U+0FFF | E0 | A0..BF | 80..BF | | 3 bytes, 1st == 0xE0, error if 2nd < 0xA0 + * | U+1000..U+CFFF | E1..EC | 80..BF | 80..BF | | normal + * | U+D000..U+D7FF | ED | 80..9F | 80..BF | | 3 bytes, 1st == 0xED, error if 2nd > 0x9F + * | U+E000..U+FFFF | EE..EF | 80..BF | 80..BF | | normal + * | U+10000..U+3FFFF | F0 | 90..BF | 80..BF | 80..BF | 4 bytes, 1st == 0xf0, error if 2nd < 0x90 + * | U+40000..U+FFFFF | F1..F3 | 80..BF | 80..BF | 80..BF | normal + * | U+100000..U+10FFFF | F4 | 80..8F | 80..BF | 80..BF | 4 bytes, 1st == 0xF4, error if 2nd > 0x8F + * +--------------------+----------+----------+----------+----------+ + * + * As a consequence of the well-formedness conditions specified in table 3-7, + * the following byte values are disallowed in UTF-8: C0-C1, F5-FF. + */ +TInt CnvUtfConverter::ConvertToUnicodeFromUtf8(TDes16& aUnicode, const TDesC8& aUtf8, TBool aGenerateJavaConformantUtf8, + TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter) + { + aUnicode.SetLength(0); + + if ((aUtf8.Length() == 0) || (aUnicode.MaxLength() == 0)) + { + return aUtf8.Length(); + } + + TUint16* pUnicode = CONST_CAST(TUint16*, aUnicode.Ptr()); + const TUint16* pLastUnicode = pUnicode + (aUnicode.MaxLength() - 1); + const TUint8* pUtf8 = aUtf8.Ptr(); + const TUint8* pLastUtf8 = pUtf8 + (aUtf8.Length() - 1); + const TUint16 replacementcharacter = 0xFFFD; + TUint currentUnicodeCharacter; + TInt sequenceLength; + + + FOREVER + { + TBool illFormed=EFalse; + + __ASSERT_DEBUG(pUnicode <= pLastUnicode, Panic(EPanicBadUnicodePointers8)); + __ASSERT_DEBUG(pUtf8 <= pLastUtf8, Panic(EPanicBadUtf8Pointers3)); + + sequenceLength = 1; + + // ascii - optimisation (i.e. it isn't a sequence) + if (pUtf8[0] < 0x80) + { + currentUnicodeCharacter = pUtf8[0]; + } + else + { + // see if well formed utf-8, use table above for reference + if ((pUtf8[0] >= 0xc2) && (pUtf8[0] <= 0xdf)) + { + // 0xc1-0xc2 are not valid bytes + sequenceLength = 2; + } + else if ((pUtf8[0] & 0xf0) == 0xe0) + { + sequenceLength = 3; + } + else if ((pUtf8[0] >= 0xf0) && (pUtf8[0] < 0xf5)) + { + // 0xf5-0xff, are not valid bytes + sequenceLength = 4; + } + else if ((pUtf8[0] == 0xc0) && aGenerateJavaConformantUtf8) + { + if ((pUtf8 == pLastUtf8) || (pUtf8[1] == 0x80)) + { + // either we've split the 0xc0 0x80 (i.e. 0xc0 is + // the last character in the string) or we've + // discovered a valid 0xc0 0x80 sequence. + sequenceLength = 2; + } + } + + /* checking to see if we got a valid sequence */ + if (sequenceLength == 1) + { + // bad value in the leading byte, 0xc0-0xc1,0x5f-0xff for example + currentUnicodeCharacter = replacementcharacter; + UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters, + aIndexOfFirstByteOfFirstUnconvertibleCharacter, pUtf8-aUtf8.Ptr()); + } + else + { + // this is a check to see if the sequence goes beyond the input + // stream. if its not the first and only character in the input + // stream this isn't an error, otherwise it is. + if ((pUtf8 + sequenceLength - 1) > pLastUtf8) + { + // check to see if this sequence was the first character + if ((pUnicode - aUnicode.Ptr()) == 0) + { + return EErrorIllFormedInput; + } + break; + } + + currentUnicodeCharacter = pUtf8[0] & (0x7F>>sequenceLength); + + /* check the trailing bytes, they should begin with 10 */ + TUint i = 1; + + do + { + if ((pUtf8[i] & 0xc0) == 0x80) + { + // add the trailing 6 bits to the current unicode char + currentUnicodeCharacter = (currentUnicodeCharacter <<6 ) | (pUtf8[i] & 0x3F); + } + else + { + // ill formed character (doesn't have a lead 10) + currentUnicodeCharacter = replacementcharacter; + UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters, + aIndexOfFirstByteOfFirstUnconvertibleCharacter, pUtf8-aUtf8.Ptr()); + illFormed=ETrue; + break; + } + i++; + } + while (i < (unsigned)sequenceLength); + } + + /* conformance check. bits of above table for reference. + * +----------------------------------------------------------------+ + * | Code Points | 1st byte | 2nd byte | 3rd byte | 4th byte | + * +--------------------+----------+----------+----------+----------+ + * | U+0800..U+0FFF | E0 | A0..BF | 80..BF | | 3 bytes, 1st == 0xE0, 2nd < 0xA0 + * | U+D000..U+D7FF | ED | 80..9F | 80..BF | | 3 bytes, 1st == 0xED, 2nd > 0x9F + * | U+10000..U+3FFFF | F0 | 90..BF | 80..BF | 80..BF | 4 bytes, 1st == 0xf0, 2nd < 0x90 + * | U+100000..U+10FFFF | F4 | 80..8F | 80..BF | 80..BF | 4 bytes, 1st == 0xF4, 2nd > 0x8F + * +--------------------+----------+----------+----------+----------+ + */ + + if (currentUnicodeCharacter != replacementcharacter) + { + if (sequenceLength == 3) + { + if ((pUtf8[0] == 0xE0) && (pUtf8[1] < 0xA0)) + { + currentUnicodeCharacter = replacementcharacter; + UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters, + aIndexOfFirstByteOfFirstUnconvertibleCharacter, pUtf8-aUtf8.Ptr()); + illFormed=ETrue; + } + else if ((pUtf8[0] == 0xED) && (pUtf8[1] > 0x9F)) + { + currentUnicodeCharacter = replacementcharacter; + UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters, + aIndexOfFirstByteOfFirstUnconvertibleCharacter, pUtf8-aUtf8.Ptr()); + illFormed=ETrue; + } + } + else if (sequenceLength == 4) + { + if ((pUtf8[0] == 0xF0) && (pUtf8[1] < 0x90)) + { + currentUnicodeCharacter = replacementcharacter; + UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters, + aIndexOfFirstByteOfFirstUnconvertibleCharacter, pUtf8-aUtf8.Ptr()); + illFormed=ETrue; + } + else if ((pUtf8[0] == 0xF4) && (pUtf8[1] > 0x8F)) + { + currentUnicodeCharacter = replacementcharacter; + UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters, + aIndexOfFirstByteOfFirstUnconvertibleCharacter, pUtf8-aUtf8.Ptr()); + illFormed=ETrue; + } + } + + + /* last conformance check - Unicode 5.0 section 3.9 D92 Because surrogate code points + * are not Unicode scalar values, any UTF-8 byte sequence that would map to code + * points D800..DFFF is ill formed */ + + if ((currentUnicodeCharacter >= 0xD800) && (currentUnicodeCharacter <= 0xDFFF)) + { + currentUnicodeCharacter = replacementcharacter; + UpdateUnconvertibleInfo(aNumberOfUnconvertibleCharacters, + aIndexOfFirstByteOfFirstUnconvertibleCharacter, pUtf8-aUtf8.Ptr()); + illFormed=ETrue; + } + } + // end conformance check + } + + // would this character generate a surrogate pair in UTF-16? + if (currentUnicodeCharacter > 0xFFFF) + { + // is there enough space to hold a surrogate pair in the output? + if (pUnicode >= pLastUnicode) + { + break; // no, end processing. + } + + TUint surrogate = (currentUnicodeCharacter>>10) + 0xD7C0; + *pUnicode++ = STATIC_CAST(TUint16, surrogate); + + surrogate = (currentUnicodeCharacter & 0x3FF) + 0xDC00; + *pUnicode++ = STATIC_CAST(TUint16, surrogate); + } + else + { + *pUnicode++ = STATIC_CAST(TUint16, currentUnicodeCharacter); + } + + // move the input pointer + if (currentUnicodeCharacter != replacementcharacter) + { + pUtf8 += sequenceLength; + } + else if(illFormed == EFalse) + { + pUtf8 += (sequenceLength); + } + else + { + // we had a character we didn't recognize (i.e. it was invalid) + // so move to the next character in the input + pUtf8++; + } + + if ((pUtf8 > pLastUtf8) || (pUnicode > pLastUnicode)) + { + break; // we've either reached the end of the input or the end of output + } + } + + aUnicode.SetLength(pUnicode - aUnicode.Ptr()); + return (pLastUtf8 - pUtf8 + 1); + } + +/** Given a sample text this function attempts to determine whether or not + * the same text is encoded using the UTF-8 standard encoding scheme. + +@param TInt a confidence level, given at certain value. if the given sample + is UTF-8 this value will not be changed (unless > 100) then its + set to 100. Otherwise if the same isn't UTF-8, its set to 0. +@param TDesC8 sample text. +UTF-8. The default is EFalse. +@return void + */ + +/* of note: conformance. Unicode standard 5.0 section 3.9, table 3-7 + * Well formed UTF-8 Byte Sequences, full table. + * +----------------------------------------------------------------+ + * | Code Points | 1st byte | 2nd byte | 3rd byte | 4th byte | + * +--------------------+----------+----------+----------+----------+ + * | U+0000..U+007F | 00..7D | | | | 1 byte, ascii + * | U+0080..U+07FF | C2..DF | 80..BF | | | 2 bytes, error if 1st < 0xC2 + * | U+0800..U+0FFF | E0 | A0..BF | 80..BF | | 3 bytes, 1st == 0xE0, error if 2nd < 0xA0 + * | U+1000..U+CFFF | E1..EC | 80..BF | 80..BF | | normal + * | U+D000..U+D7FF | ED | 80..9F | 80..BF | | 3 bytes, 1st == 0xED, error if 2nd > 0x9F + * | U+E000..U+FFFF | EE..EF | 80..BF | 80..BF | | normal + * | U+10000..U+3FFFF | F0 | 90..BF | 80..BF | 80..BF | 4 bytes, 1st == 0xf0, error if 2nd < 0x90 + * | U+40000..U+FFFFF | F1..F3 | 80..BF | 80..BF | 80..BF | normal + * | U+100000..U+10FFFF | F4 | 80..8F | 80..BF | 80..BF | 4 bytes, 1st == 0xF4, error if 2nd > 0x8F + * +--------------------+----------+----------+----------+----------+ + * + * As a consequence of the well-formedness conditions specified in table 3-7, + * the following byte values are disallowed in UTF-8: C0-C1, F5-FF. + * + * Code Rules: + * R1: If the string contains any non-UTF-8 characters the returned confidence + * is 0. Valid UTF-8 combinations are listed in the above table. + * R2: Otherwise if the string starts with a UTF-8 BOM (byte order mark) in + * the (see ) the returned confidence is 95. + * R3: Otherwise the confidence returned is based upon the sample string + * length. + * R4: If the sample string is under 75 characters, the confidence is set to + * 75. + */ +GLREF_C void IsCharacterSetUTF8(TInt& aConfidenceLevel, const TDesC8& aSample) + { + + TInt sampleLength = aSample.Length(); + + if (sampleLength == 0) + { + aConfidenceLevel = 89; + return; + } + TInt bytesRemaining = 0; + TInt sequenceLength = 0; + + aConfidenceLevel = sampleLength; + + const TUint8* buffer = &aSample[0]; + + if (sampleLength < 95) + { + // check for the BOM + if ((sampleLength >= 3) && + ((buffer[0] == 0xEF) && + (buffer[1] == 0xBB) && + (buffer[2] == 0xBF)) + ) + { + aConfidenceLevel = 95; + } + else if (sampleLength < 75) + { + aConfidenceLevel = 75; + } + } + + for (TInt index = 0;index != sampleLength;index++) + { + + if (bytesRemaining > 0) + { + // bytesRemaining > 0, means that a byte representing the start of a + // multibyte sequence was encountered and the bytesRemaining is the + // number of bytes to follow. + + if ((buffer[index] & 0xc0) == 0x80) + { + // need to check for ill-formed sequences -- all are in the 2nd byte + + if ((sequenceLength == 3) && (bytesRemaining == 2)) + { + if ((buffer[index - 1] == 0xe0) && (buffer[index] < 0xa0)) + { + aConfidenceLevel = 0; + break; + } + else if ((buffer[index - 1] == 0xed) && (buffer[index] > 0x9f)) + { + aConfidenceLevel = 0; + break; + } + } + else if ((sequenceLength == 4) && (bytesRemaining == 3)) + { + if ((buffer[index - 1] == 0xf0) && (buffer[index] < 0x90)) + { + aConfidenceLevel = 0; + break; + } + else if ((buffer[index - 1] == 0xf4) && (buffer[index] > 0x8f)) + { + aConfidenceLevel = 0; + break; + } + } + + --bytesRemaining; + continue; + } + else + { + aConfidenceLevel = 0; + break; + } + } + + if (bytesRemaining == 0) + { + if (buffer[index] < 0x80) + { + // The value of aSample[index] is in the range 0x00-0x7f + //UTF8 maintains ASCII transparency. So it's a valid + //UTF8. Do nothing, check next value. + continue; + } + else if ((buffer[index] >= 0xc2) && (buffer[index] < 0xe0)) + { + // valid start of a 2 byte sequence (see conformance note) + sequenceLength = 2; + bytesRemaining = 1; + } + else if ((buffer[index] & 0xf0) == 0xe0) + { + // valid start of a 3 byte sequence + sequenceLength = 3; + bytesRemaining = 2; + } + else if ((buffer[index] >= 0xf0) && (buffer[index] < 0xf5)) + { + // valid start of a 4 byte sequence (see conformance note) + sequenceLength = 4; + bytesRemaining = 3; + } + else + { + // wasn't anything expected so must be an illegal/irregular UTF8 coded value + aConfidenceLevel = 0; + break; + } + } + } // for + + aConfidenceLevel = (aConfidenceLevel > 0)? ((aConfidenceLevel > 100)? 100: aConfidenceLevel): 0; + } + +GLREF_C void IsCharacterSetUTF7(TInt& aConfidenceLevel, const TDesC8& aSample) + { + TInt sampleLength = aSample.Length(); + aConfidenceLevel = 70; + for (TInt i=0; i= sampleLength) + break; + for (TInt j=0; j < 11; ++j) + { + if (aSample[increment1] == smsExtensionTable[j]) + { + aConfidenceLevel-=10; + } + } + } + // The UTF-7 escape char is 0x2b. The values that follow the escape sequence + // the values following the escape char value must belong to the modified base64 + // or '-' else it is an ill-formed sequence, so probably not UTF-7 + else if ( (aSample[i]==0x2b) && (i = 0x41) && (aSample[increment1] <= 0x5a)) || + ((aSample[increment1] >= 0x61) && (aSample[increment1] <= 0x7a))) + { + aConfidenceLevel+=5; + } + else + { + aConfidenceLevel-=15; + } + i++; // should this be here or up in the if loop ?? + } + } //for + aConfidenceLevel =(aConfidenceLevel >0)? ((aConfidenceLevel > 100)? 100: aConfidenceLevel): 0; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/common/array.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/common/array.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1179 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\common\array.cpp +// +// + +#include "common.h" +#ifdef __KERNEL_MODE__ +#include +#endif + +const TInt KDefaultPtrArrayGranularity =8; +const TInt KPtrArrayMaxGranularity =0x10000000; +const TInt KDefaultSimpleArrayGranularity =8; +const TInt KSimpleArrayMaxGranularity =0x10000000; +const TInt KSimpleArrayMaxEntrySize =640; // allow room for a unicode TFullName +const TInt KMaxArrayGrowBy =65535; +const TInt KMinArrayFactor =257; +const TInt KMaxArrayFactor =32767; + +EXPORT_C RPointerArrayBase::RPointerArrayBase() + : iCount(0), iEntries(NULL), iAllocated(0), iGranularity(KDefaultPtrArrayGranularity), iSpare1(0), iSpare2(0) + {} + +EXPORT_C RPointerArrayBase::RPointerArrayBase(TInt aGranularity) + : iCount(0), iEntries(NULL), iAllocated(0), iGranularity(aGranularity), iSpare1(0), iSpare2(0) + { + __ASSERT_ALWAYS(aGranularity>0 && aGranularity<=KPtrArrayMaxGranularity, + Panic(EBadArrayGranularity)); + } + +EXPORT_C RPointerArrayBase::RPointerArrayBase(TInt aMinGrowBy, TInt aFactor) + : iCount(0), iEntries(NULL), iAllocated(0), iSpare1(0), iSpare2(0) + { + __ASSERT_ALWAYS(aMinGrowBy>0 && aMinGrowBy<=KMaxArrayGrowBy, Panic(EBadArrayMinGrowBy)); + __ASSERT_ALWAYS(aFactor>=KMinArrayFactor && aFactor<=KMaxArrayFactor, Panic(EBadArrayFactor)); + iGranularity = aMinGrowBy | (aFactor << 16) | 0x80000000; + } + +#ifndef __KERNEL_MODE__ +EXPORT_C RPointerArrayBase::RPointerArrayBase(TAny** aEntries, TInt aCount) + : iCount(aCount), iEntries(aEntries), iAllocated(aCount), iGranularity(aCount), iSpare1(0), iSpare2(0) + { + __ASSERT_ALWAYS(aCount>0,Panic(EBadArrayCount)); + } +#endif + +EXPORT_C void RPointerArrayBase::Close() + { + iCount=0; + STD_CLASS::Free(iEntries); + iEntries=NULL; + iAllocated=0; + } + +EXPORT_C TInt RPointerArrayBase::Count() const + { + return iCount; + } + +#ifndef __ARRAY_MACHINE_CODED__ +EXPORT_C TAny*& RPointerArrayBase::At(TInt anIndex) const + { + __ASSERT_ALWAYS((anIndex>=0 && anIndex= 0) + { + if (aOrigSize > aLimit - aGranularity) + return KErrNoMemory; // array can't be >2GB + return aOrigSize + aGranularity; + } + TUint minStep = (TUint)(aGranularity & 65535); + TUint factor = TUint(aGranularity & 0x7fff0000) >> 16; + Uint64 na64 = aOrigSize; + na64 *= (Uint64)factor; + na64 += 128; + na64 >>= 8; + Uint64 min_na64 = (Uint64)aOrigSize + (Uint64)minStep; + if (min_na64 > na64) + na64 = min_na64; + if (na64 > (Uint64)aLimit) + return KErrNoMemory; // array can't be >2GB + return (TInt)na64; + } + +TInt CalculateArraySizeAfterShrink(TInt aOrigSize, TInt aGranularity, TInt aUsed) + { + TInt step = aGranularity; + if (step < 0) + step &= 65535; + if (aOrigSize - aUsed < step) + return aOrigSize; + aUsed += step - 1; + aUsed /= step; + aUsed *= step; + return aUsed; + } + +TInt RPointerArrayBase::Grow() + { + TInt newAlloc = CalculateArraySizeAfterGrow(iAllocated, iGranularity, KMaxTInt >> 2); + if (newAlloc < 0) + return newAlloc; + TAny** pA = (TAny**)STD_CLASS::ReAlloc(iEntries, newAlloc*sizeof(TAny*)); + if (!pA) + return KErrNoMemory; + iEntries = pA; + iAllocated = newAlloc; + return KErrNone; + } + +#ifndef __ARRAY_MACHINE_CODED__ +EXPORT_C TInt RPointerArrayBase::Append(const TAny* anEntry) + { + if (iCount==iAllocated) + { + TInt r=Grow(); + if (r!=KErrNone) + return r; + } + iEntries[iCount++]=(TAny*)anEntry; + return KErrNone; + } +#endif + +EXPORT_C TInt RPointerArrayBase::Insert(const TAny* anEntry, TInt aPos) + { + __ASSERT_ALWAYS((aPos>=0 && aPos<=iCount),Panic(EBadArrayPosition)); + if (iCount==iAllocated) + { + TInt r=Grow(); + if (r!=KErrNone) + return r; + } + TInt entries=iCount-aPos; + if (entries!=0) + wordmove(iEntries+aPos+1,iEntries+aPos,entries*sizeof(TAny*)); + iCount++; + iEntries[aPos]=(TAny*)anEntry; + return KErrNone; + } + +EXPORT_C void RPointerArrayBase::Remove(TInt anIndex) + { + __ASSERT_ALWAYS((anIndex>=0 && anIndex=0, Panic(EArrayBadReserveCount)); + if (aCount <= iAllocated) + return KErrNone; // if allocated space is already sufficient, nothing to do + + const TInt KLimit = TInt(0x80000000u / sizeof(TAny*)); + if (aCount >= KLimit) + return KErrNoMemory; + + TAny** pA = (TAny**)STD_CLASS::ReAlloc(iEntries, aCount*sizeof(TAny*)); + if (!pA) + return KErrNoMemory; + iEntries = pA; + iAllocated = aCount; + return KErrNone; + } +#endif + +EXPORT_C void RPointerArrayBase::Reset() + { + iCount=0; + STD_CLASS::Free(iEntries); + iEntries=NULL; + iAllocated=0; + } + +EXPORT_C TInt RPointerArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const + { + return BinarySearch(anEntry, anIndex, anOrder, EArrayFindMode_Any); + } + +#ifndef __ARRAY_MACHINE_CODED__ +EXPORT_C TInt RPointerArrayBase::Find(const TAny* anEntry) const + { + TInt i; + for (i=0; il) + { + TInt m=(l+r)>>1; + TInt h=(TInt)iEntries[m]; + if (anEntry==h) + { + if (aMode == EArrayFindMode_Any) + { + anIndex=m; + return KErrNone; + } + ret = KErrNone; + if (aMode == EArrayFindMode_First) + r=m; + else + l=m+1; + } + else if (anEntry>h) + l=m+1; + else + r=m; + } + anIndex=r; + return ret; + } + +EXPORT_C TInt RPointerArrayBase::BinarySearchUnsigned(TUint anEntry, TInt& anIndex) const + { + return BinarySearchUnsigned(anEntry, anIndex, EArrayFindMode_Any); + } + +EXPORT_C TInt RPointerArrayBase::BinarySearchUnsigned(TUint anEntry, TInt& anIndex, TInt aMode) const + { + __ASSERT_DEBUG(TUint(aMode)l) + { + TUint m=(l+r)>>1; + TUint h=(TUint)iEntries[m]; + if (anEntry==h) + { + if (aMode == EArrayFindMode_Any) + { + anIndex=m; + return KErrNone; + } + ret = KErrNone; + if (aMode == EArrayFindMode_First) + r=m; + else + l=m+1; + } + else if (anEntry>h) + l=m+1; + else + r=m; + } + anIndex=r; + return ret; + } + +EXPORT_C TInt RPointerArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const + { + __ASSERT_DEBUG(TUint(aMode)l) + { + TInt m=(l+r)>>1; + TInt k=(*anOrder)(anEntry,iEntries[m]); + if (k==0) + { + if (aMode == EArrayFindMode_Any) + { + anIndex=m; + return KErrNone; + } + ret = KErrNone; + if (aMode == EArrayFindMode_First) + r=m; + else + l=m+1; + } + else if (k>0) + l=m+1; + else + r=m; + } + anIndex=r; + return ret; + } + +EXPORT_C TInt RPointerArrayBase::FindIsqSigned(TInt anEntry) const + { + return FindIsqSigned(anEntry, EArrayFindMode_Any); + } + +EXPORT_C TInt RPointerArrayBase::FindIsqUnsigned(TUint anEntry) const + { + return FindIsqUnsigned(anEntry, EArrayFindMode_Any); + } + +EXPORT_C TInt RPointerArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const + { + return FindIsq(anEntry, anOrder, EArrayFindMode_Any); + } + +EXPORT_C TInt RPointerArrayBase::FindIsqSigned(TInt anEntry, TInt aMode) const + { + TInt i; + TInt r=BinarySearchSigned(anEntry,i,aMode); + return (r==KErrNone)?i:r; + } + +EXPORT_C TInt RPointerArrayBase::FindIsqUnsigned(TUint anEntry, TInt aMode) const + { + TInt i; + TInt r=BinarySearchUnsigned(anEntry,i,aMode); + return (r==KErrNone)?i:r; + } + +EXPORT_C TInt RPointerArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const + { + TInt i; + TInt r=BinarySearch(anEntry,i,anOrder,aMode); + return (r==KErrNone)?i:r; + } +#else +extern "C" void PanicBadArrayFindMode() + { + Panic(EBadArrayFindMode); + } +#endif + + +EXPORT_C TInt RPointerArrayBase::FindReverse(const TAny* anEntry) const + { + TInt i=iCount; + while (i--) + { + if (iEntries[i]==anEntry) + return i; + } + return KErrNotFound; + } + +EXPORT_C TInt RPointerArrayBase::FindReverse(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const + { + TInt i=iCount; + while (i--) + { + if ((*anIdentity)(anEntry,iEntries[i])) + return i; + } + return KErrNotFound; + } + + +EXPORT_C TInt RPointerArrayBase::InsertIsqSigned(TInt anEntry, TBool aAllowRepeats) + { + TInt i; + TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any; + TInt r=BinarySearchSigned(anEntry,i,mode); + if (r==KErrNotFound || aAllowRepeats) + return Insert((const TAny*)anEntry,i); + return KErrAlreadyExists; + } + +EXPORT_C TInt RPointerArrayBase::InsertIsqUnsigned(TUint anEntry, TBool aAllowRepeats) + { + TInt i; + TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any; + TInt r=BinarySearchUnsigned(anEntry,i,mode); + if (r==KErrNotFound || aAllowRepeats) + return Insert((const TAny*)anEntry,i); + return KErrAlreadyExists; + } + +EXPORT_C TInt RPointerArrayBase::InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats) + { + TInt i; + TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any; + TInt r=BinarySearch(anEntry,i,anOrder,mode); + if (r==KErrNotFound || aAllowRepeats) + return Insert((const TAny*)anEntry,i); + return KErrAlreadyExists; + } + +#ifndef __ARRAY_MACHINE_CODED__ +void HeapSortUnsigned(TUint* aEntries,TInt aCount) + { + TInt ss = aCount; + if (ss>1) + { + TInt sh = ss>>1; + FOREVER + { + TUint si; + if (sh!=0) + { + --sh; + si = aEntries[sh]; + } + else + { + --ss; + si = aEntries[ss]; + aEntries[ss]=aEntries[0]; + if (ss==1) + { + aEntries[0]=si; + break; + } + } + TInt ii = sh; + TInt jj = sh; + FOREVER + { + jj = (jj+1)<<1; + if (jj>=ss || TUint(aEntries[jj-1])>TUint(aEntries[jj]) ) + --jj; + if (jj>=ss || TUint(aEntries[jj])<=si) + break; + aEntries[ii]=aEntries[jj]; + ii = jj; + } + aEntries[ii]=si; + } + } + } +#endif // !__ARRAY_MACHINE_CODED__ + + +#ifndef __KERNEL_MODE__ +#ifndef __ARRAY_MACHINE_CODED__ +EXPORT_C void RPointerArrayBase::HeapSortSigned() + { + TInt ss = iCount; + if (ss>1) + { + TInt sh = ss>>1; + FOREVER + { + TInt si; + if (sh!=0) + { + --sh; + si = (TInt)iEntries[sh]; + } + else + { + --ss; + si = (TInt)iEntries[ss]; + iEntries[ss]=iEntries[0]; + if (ss==1) + { + iEntries[0]=(TAny*)si; + break; + } + } + TInt ii = sh; + TInt jj = sh; + FOREVER + { + jj = (jj+1)<<1; + if (jj>=ss || TInt(iEntries[jj-1])>TInt(iEntries[jj]) ) + --jj; + if (jj>=ss || TInt(iEntries[jj])<=si) + break; + iEntries[ii]=iEntries[jj]; + ii = jj; + } + iEntries[ii]=(TAny*)si; + } + } + } + +EXPORT_C void RPointerArrayBase::HeapSortUnsigned() + { + ::HeapSortUnsigned((TUint*)iEntries,iCount); + } + +EXPORT_C void RPointerArrayBase::HeapSort(TGeneralLinearOrder anOrder) + { + TInt ss = iCount; + if (ss>1) + { + TInt sh = ss>>1; + FOREVER + { + TAny* si; + if (sh!=0) + { + --sh; + si = iEntries[sh]; + } + else + { + --ss; + si = iEntries[ss]; + iEntries[ss]=iEntries[0]; + if (ss==1) + { + iEntries[0]=si; + break; + } + } + TInt ii = sh; + TInt jj = sh; + FOREVER + { + jj = (jj+1)<<1; + if (jj>=ss || (*anOrder)(iEntries[jj-1],iEntries[jj])>0 ) + --jj; + if (jj>=ss || (*anOrder)(iEntries[jj],si)<=0 ) + break; + iEntries[ii]=iEntries[jj]; + ii = jj; + } + iEntries[ii]=si; + } + } + } +#endif + +EXPORT_C TInt RPointerArrayBase::GetCount(const CBase* aPtr) + { + return ((RPointerArrayBase*)aPtr)->Count(); + } + +EXPORT_C const TAny* RPointerArrayBase::GetElementPtr(const CBase* aPtr, TInt aIndex) + { + return &(((RPointerArrayBase*)aPtr)->At(aIndex)); + } +#endif // __KERNEL_MODE__ + +EXPORT_C RArrayBase::RArrayBase(TInt anEntrySize) + : iCount(0), iEntries(NULL), iKeyOffset(0), iAllocated(0), + iGranularity(KDefaultSimpleArrayGranularity), iSpare1(0), iSpare2(0) + { + __ASSERT_ALWAYS(anEntrySize>0 && anEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize)); + iEntrySize=(anEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1); + } + +EXPORT_C RArrayBase::RArrayBase(TInt anEntrySize, TInt aGranularity) + : iCount(0), iEntries(NULL), iKeyOffset(0), iAllocated(0), + iGranularity(aGranularity), iSpare1(0), iSpare2(0) + { + __ASSERT_ALWAYS(anEntrySize>0 && anEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize)); + __ASSERT_ALWAYS(aGranularity>0 && (aGranularity*anEntrySize)<=KSimpleArrayMaxGranularity, Panic(EBadArrayGranularity)); + iEntrySize=(anEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1); + } + +EXPORT_C RArrayBase::RArrayBase(TInt aEntrySize,TAny* aEntries, TInt aCount) + : iCount(aCount), iEntries(aEntries), iKeyOffset(0), iAllocated(aCount), + iGranularity(KDefaultSimpleArrayGranularity), iSpare1(0), iSpare2(0) + { + __ASSERT_ALWAYS(aEntrySize>0 && aEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize)); + __ASSERT_ALWAYS(aCount>0,Panic(EBadArrayCount)); + iEntrySize=(aEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1); + } + +EXPORT_C RArrayBase::RArrayBase(TInt anEntrySize, TInt aGranularity, TInt aKeyOffset) + : iCount(0), iEntries(NULL), iKeyOffset(aKeyOffset), iAllocated(0), + iGranularity(aGranularity), iSpare1(0), iSpare2(0) + { + __ASSERT_ALWAYS(anEntrySize>0 && anEntrySize<=KSimpleArrayMaxEntrySize,Panic(EBadArrayEntrySize)); + __ASSERT_ALWAYS(aGranularity>0 && (aGranularity*anEntrySize)<=KSimpleArrayMaxGranularity, Panic(EBadArrayGranularity)); + __ASSERT_ALWAYS(aKeyOffset>=0 && (aKeyOffset&3)==0 && aKeyOffset0 && aEntrySize<=KSimpleArrayMaxEntrySize, Panic(EBadArrayEntrySize)); + __ASSERT_ALWAYS(aKeyOffset>=0 && (aKeyOffset&3)==0 && aKeyOffset0 && aMinGrowBy<=KMaxArrayGrowBy, Panic(EBadArrayMinGrowBy)); + __ASSERT_ALWAYS(aFactor>=KMinArrayFactor && aFactor<=KMaxArrayFactor, Panic(EBadArrayFactor)); + iEntrySize=(aEntrySize+(TInt)sizeof(TInt)-1)&~((TInt)sizeof(TInt)-1); + iGranularity = aMinGrowBy | (aFactor << 16) | 0x80000000; + } + +EXPORT_C void RArrayBase::Close() + { + iCount=0; + STD_CLASS::Free(iEntries); + iEntries=NULL; + iAllocated=0; + } + +EXPORT_C TInt RArrayBase::Count() const + { + return iCount; + } + +#ifndef __ARRAY_MACHINE_CODED__ +EXPORT_C TAny* RArrayBase::At(TInt anIndex) const + { + __ASSERT_ALWAYS((anIndex>=0 && anIndex=0 && aPos<=iCount),Panic(EBadArrayPosition)); + if (iCount==iAllocated) + { + TInt r=Grow(); + if (r!=KErrNone) + return r; + } + TUint8 *pS=(TUint8*)iEntries+aPos*iEntrySize; + TUint8 *pD=pS+iEntrySize; + TInt entries=iCount-aPos; + if (entries!=0) + wordmove(pD,pS,entries*iEntrySize); + wordmove(pS,anEntry,iEntrySize); + iCount++; + return KErrNone; + } + +EXPORT_C void RArrayBase::Remove(TInt anIndex) + { + __ASSERT_ALWAYS((anIndex>=0 && anIndex=0, Panic(EArrayBadReserveCount)); + if (aCount <= iAllocated) + return KErrNone; // if allocated space is already sufficient, nothing to do + + Int64 size = Int64(aCount) * Int64(iEntrySize); + if (size > Int64(KMaxTInt)) + return KErrNoMemory; + + TAny** pA = (TAny**)STD_CLASS::ReAlloc(iEntries, aCount*iEntrySize); + if (!pA) + return KErrNoMemory; + iEntries = pA; + iAllocated = aCount; + return KErrNone; + } +#endif + +EXPORT_C void RArrayBase::Reset() + { + iCount=0; + STD_CLASS::Free(iEntries); + iEntries=NULL; + iAllocated=0; + } + +EXPORT_C TInt RArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const + { + return BinarySearch(anEntry, anIndex, anOrder, EArrayFindMode_Any); + } + +#ifndef __ARRAY_MACHINE_CODED__ +EXPORT_C TInt RArrayBase::Find(const TAny* anEntry) const + { + TUint8 *pS=(TUint8*)iEntries+iKeyOffset; + TInt match=*(TInt*)((TUint8*)anEntry+iKeyOffset); + TInt i; + for (i=0; il) + { + TInt m=(l+r)>>1; + TInt h=*(TInt*)(pK+m*iEntrySize); + if (match==h) + { + if (aMode == EArrayFindMode_Any) + { + anIndex=m; + return KErrNone; + } + ret = KErrNone; + if (aMode == EArrayFindMode_First) + r=m; + else + l=m+1; + } + else if (match>h) + l=m+1; + else + r=m; + } + anIndex=r; + return ret; + } + +EXPORT_C TInt RArrayBase::BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex) const + { + return BinarySearchUnsigned(anEntry, anIndex, EArrayFindMode_Any); + } + +EXPORT_C TInt RArrayBase::BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const + { + __ASSERT_DEBUG(TUint(aMode)l) + { + TInt m=(l+r)>>1; + TUint h=*(TUint*)(pK+m*iEntrySize); + if (match==h) + { + if (aMode == EArrayFindMode_Any) + { + anIndex=m; + return KErrNone; + } + ret = KErrNone; + if (aMode == EArrayFindMode_First) + r=m; + else + l=m+1; + } + else if (match>h) + l=m+1; + else + r=m; + } + anIndex=r; + return ret; + } + +EXPORT_C TInt RArrayBase::BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const + { + __ASSERT_DEBUG(TUint(aMode)l) + { + TInt m=(l+r)>>1; + TInt k=(*anOrder)(anEntry,(TUint8*)iEntries+m*iEntrySize); + if (k==0) + { + if (aMode == EArrayFindMode_Any) + { + anIndex=m; + return KErrNone; + } + ret = KErrNone; + if (aMode == EArrayFindMode_First) + r=m; + else + l=m+1; + } + else if (k>0) + l=m+1; + else + r=m; + } + anIndex=r; + return ret; + } + +EXPORT_C TInt RArrayBase::FindIsqSigned(const TAny* anEntry) const + { + return FindIsqSigned(anEntry, EArrayFindMode_Any); + } + +EXPORT_C TInt RArrayBase::FindIsqUnsigned(const TAny* anEntry) const + { + return FindIsqUnsigned(anEntry, EArrayFindMode_Any); + } + +EXPORT_C TInt RArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const + { + return FindIsq(anEntry, anOrder, EArrayFindMode_Any); + } + +EXPORT_C TInt RArrayBase::FindIsqSigned(const TAny* anEntry, TInt aMode) const + { + TInt i; + TInt r=BinarySearchSigned(anEntry,i,aMode); + return (r==KErrNone)?i:r; + } + +EXPORT_C TInt RArrayBase::FindIsqUnsigned(const TAny* anEntry, TInt aMode) const + { + TInt i; + TInt r=BinarySearchUnsigned(anEntry,i,aMode); + return (r==KErrNone)?i:r; + } + +EXPORT_C TInt RArrayBase::FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const + { + TInt i; + TInt r=BinarySearch(anEntry,i,anOrder,aMode); + return (r==KErrNone)?i:r; + } +#endif + +EXPORT_C TInt RArrayBase::FindReverse(const TAny* anEntry) const + { + TUint8 *pS=(TUint8*)iEntries+(iCount-1)*iEntrySize+iKeyOffset; + TInt match=*(TInt*)((TUint8*)anEntry+iKeyOffset); + TInt i=iCount; + while(i--) + { + TInt key=*(TInt*)pS; + if (key==match) + return i; + pS-=iEntrySize; + } + return KErrNotFound; + } + +EXPORT_C TInt RArrayBase::FindReverse(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const + { + TUint8 *pS=(TUint8*)iEntries+(iCount-1)*iEntrySize; + TInt i=iCount; + while (i--) + { + if ((*anIdentity)(anEntry,pS)) + return i; + pS-=iEntrySize; + } + return KErrNotFound; + } + +EXPORT_C TInt RArrayBase::InsertIsqSigned(const TAny* anEntry, TBool aAllowRepeats) + { + TInt i; + TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any; + TInt r=BinarySearchSigned(anEntry,i,mode); + if (r==KErrNotFound || aAllowRepeats) + return Insert((const TAny*)anEntry,i); + return KErrAlreadyExists; + } + +EXPORT_C TInt RArrayBase::InsertIsqUnsigned(const TAny* anEntry, TBool aAllowRepeats) + { + TInt i; + TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any; + TInt r=BinarySearchUnsigned(anEntry,i,mode); + if (r==KErrNotFound || aAllowRepeats) + return Insert((const TAny*)anEntry,i); + return KErrAlreadyExists; + } + +EXPORT_C TInt RArrayBase::InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats) + { + TInt i; + TInt mode = aAllowRepeats ? EArrayFindMode_Last : EArrayFindMode_Any; + TInt r=BinarySearch(anEntry,i,anOrder,mode); + if (r==KErrNotFound || aAllowRepeats) + return Insert((const TAny*)anEntry,i); + return KErrAlreadyExists; + } + +#ifndef __KERNEL_MODE__ +#ifndef __ARRAY_MACHINE_CODED__ +EXPORT_C void RArrayBase::HeapSortSigned() + { + TUint32 si[KSimpleArrayMaxEntrySize/4]; + TInt ss = iCount; + if (ss>1) + { + TInt sh = ss>>1; + FOREVER + { + if (sh!=0) + { + --sh; + wordmove(si,(TUint8*)iEntries+sh*iEntrySize,iEntrySize); + } + else + { + --ss; + wordmove(si,(TUint8*)iEntries+ss*iEntrySize,iEntrySize); + wordmove((TUint8*)iEntries+ss*iEntrySize,iEntries,iEntrySize); + if (ss==1) + { + wordmove(iEntries,si,iEntrySize); + break; + } + } + TInt ii = sh; + TInt jj = sh; + TInt sikey=*(TInt*)((TUint8*)si+iKeyOffset); + FOREVER + { + jj = (jj+1)<<1; + TUint8* pKey=((TUint8*)iEntries+jj*iEntrySize+iKeyOffset); + if (jj>=ss || (*(TInt*)(pKey-iEntrySize))>*(TInt*)pKey ) + { + --jj; + pKey-=iEntrySize; + } + if (jj>=ss || *(TInt*)pKey<=sikey) + break; + wordmove((TUint8*)iEntries+ii*iEntrySize,(TUint8*)iEntries+jj*iEntrySize,iEntrySize); + ii = jj; + } + wordmove((TUint8*)iEntries+ii*iEntrySize,si,iEntrySize); + } + } + } + +EXPORT_C void RArrayBase::HeapSortUnsigned() + { + TUint32 si[KSimpleArrayMaxEntrySize/4]; + TInt ss = iCount; + if (ss>1) + { + TInt sh = ss>>1; + FOREVER + { + if (sh!=0) + { + --sh; + wordmove(si,(TUint8*)iEntries+sh*iEntrySize,iEntrySize); + } + else + { + --ss; + wordmove(si,(TUint8*)iEntries+ss*iEntrySize,iEntrySize); + wordmove((TUint8*)iEntries+ss*iEntrySize,iEntries,iEntrySize); + if (ss==1) + { + wordmove(iEntries,si,iEntrySize); + break; + } + } + TInt ii = sh; + TInt jj = sh; + TUint sikey=*(TUint*)((TUint8*)si+iKeyOffset); + FOREVER + { + jj = (jj+1)<<1; + TUint8* pKey=((TUint8*)iEntries+jj*iEntrySize+iKeyOffset); + if (jj>=ss || (*(TUint*)(pKey-iEntrySize))>*(TUint*)pKey ) + { + --jj; + pKey-=iEntrySize; + } + if (jj>=ss || *(TUint*)pKey<=sikey) + break; + wordmove((TUint8*)iEntries+ii*iEntrySize,(TUint8*)iEntries+jj*iEntrySize,iEntrySize); + ii = jj; + } + wordmove((TUint8*)iEntries+ii*iEntrySize,si,iEntrySize); + } + } + } + +EXPORT_C void RArrayBase::HeapSort(TGeneralLinearOrder anOrder) + { + TUint32 si[KSimpleArrayMaxEntrySize/4]; + TInt ss = iCount; + if (ss>1) + { + TInt sh = ss>>1; + FOREVER + { + if (sh!=0) + { + --sh; + wordmove(si,(TUint8*)iEntries+sh*iEntrySize,iEntrySize); + } + else + { + --ss; + wordmove(si,(TUint8*)iEntries+ss*iEntrySize,iEntrySize); + wordmove((TUint8*)iEntries+ss*iEntrySize,iEntries,iEntrySize); + if (ss==1) + { + wordmove(iEntries,si,iEntrySize); + break; + } + } + TInt ii = sh; + TInt jj = sh; + FOREVER + { + jj = (jj+1)<<1; + TUint8* pJJ=((TUint8*)iEntries+jj*iEntrySize); + if (jj>=ss || (*anOrder)(pJJ-iEntrySize,pJJ)>0) + { + --jj; + pJJ-=iEntrySize; + } + if (jj>=ss || (*anOrder)(pJJ,si)<=0) + break; + wordmove((TUint8*)iEntries+ii*iEntrySize,(TUint8*)iEntries+jj*iEntrySize,iEntrySize); + ii = jj; + } + wordmove((TUint8*)iEntries+ii*iEntrySize,si,iEntrySize); + } + } + } +#endif + +EXPORT_C TInt RArrayBase::GetCount(const CBase* aPtr) + { + return ((RArrayBase*)aPtr)->Count(); + } + +EXPORT_C const TAny* RArrayBase::GetElementPtr(const CBase* aPtr, TInt aIndex) + { + return ((RArrayBase*)aPtr)->At(aIndex); + } +#endif // __KERNEL_MODE__ + diff -r c55016431358 -r 0a7b44b10206 symport/e32/common/common.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/common/common.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,81 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\common\common.h +// +// + +#ifndef __E32_COMMON_H__ +#define __E32_COMMON_H__ + +#ifdef __KERNEL_MODE__ +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +GLREF_C void Panic(TCdtPanic aPanic); +GLDEF_C void PanicBadArrayIndex(); +GLREF_C TInt __DoConvertNum(TUint, TRadix, TUint, TUint8*&); +GLREF_C TInt __DoConvertNum(Uint64, TRadix, TUint, TUint8*&); + +#ifdef __KERNEL_MODE__ +GLREF_C void KernHeapFault(TCdtPanic aPanic); +GLREF_C void KHeapCheckThreadState(); +TInt StringLength(const TUint16* aPtr); +TInt StringLength(const TUint8* aPtr); + +#define STD_CLASS Kern +#define STRING_LENGTH(s) StringLength(s) +#define STRING_LENGTH_16(s) StringLength(s) +#define PANIC_CURRENT_THREAD(c,r) Kern::PanicCurrentThread(c, r) +#define __KERNEL_CHECK_RADIX(r) __ASSERT_ALWAYS(((r)==EDecimal)||((r)==EHex),Panic(EInvalidRadix)) +#define APPEND_BUF_SIZE 10 +#define APPEND_BUF_SIZE_64 20 +#define HEAP_PANIC(r) RHeapK::Fault(r) +#define GET_PAGE_SIZE(x) x = M::PageSizeInBytes() +#define DIVISION_BY_ZERO() FAULT() + +#ifdef _DEBUG +#define __CHECK_THREAD_STATE RHeapK::CheckThreadState() +#else +#define __CHECK_THREAD_STATE +#endif + +#else + +#define STD_CLASS User +#define STRING_LENGTH(s) User::StringLength(s) +#define STRING_LENGTH_16(s) User::StringLength(s) +#define PANIC_CURRENT_THREAD(c,r) User::Panic(c, r) +#define MEM_COMPARE_16 Mem::Compare +#define __KERNEL_CHECK_RADIX(r) +#define APPEND_BUF_SIZE 32 +#define APPEND_BUF_SIZE_64 64 +#define HEAP_PANIC(r) Panic(r) +#define GET_PAGE_SIZE(x) UserHal::PageSizeInBytes(x) +#define DIVISION_BY_ZERO() User::RaiseException(EExcIntegerDivideByZero) +#define __CHECK_THREAD_STATE + +#endif // __KERNEL_MODE__ + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/common/des16.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/common/des16.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,4316 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\common\des16.cpp +// +// + +#include "common.h" +#include +#ifdef _UNICODE +#include +#include "collateimp.h" +#endif +#include "compareimp.h" + + +#define __CHECK_ALIGNMENT(p,c) __ASSERT_DEBUG(!(TUint(p)&1),Des16Panic(c)) + +enum TDes16Panic + { + ETDesC16ConstructCString=0, + ETDesC16ConstructBufLength=1, + ETDesC16ConstructBufLengthMax=2, + ETDesC16FindPtrLen=3, + ETDesC16FindFPtrLen=4, + ETDesC16FindCPtrLen=5, + ETBufCBase16CopyStringMax=6, + EHBufC16AssignCString=7, + ETDes16AssignCString=8, + ETDes16CopyCString=9, + ETDes16CopyBufLength=10, + ETDes16AppendBufLength=11, + ETDes16RepeatBufLength=12, + ETDes16AppendJustify1=13, + ETDes16AppendJustify2=14, + ETPtrC16SetBufLength=15, + ETPtr16SetBufLengthMax=16, + ETDesC16Invariant=17, + ETDesC16Ptr=18 + }; + +#ifdef _DEBUG +_LIT(KLitDes16Align,"Des16Align"); +void Des16Panic(TDes16Panic aPanic) + { + PANIC_CURRENT_THREAD(KLitDes16Align,aPanic); + } +#endif + +inline TUint16* memCopy(TUint16* aPtr, const TUint16* aSrc, TInt aLength) + { + return (TUint16 *)Mem::Copy(aPtr,aSrc,aLength<<1); + } + +#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__) +inline TInt StringLength(const TUint16* aPtr) + { + const TUint16* p = aPtr; + while (*p) + ++p; + return p-aPtr; + } +#endif + +inline TDesC16::TDesC16(TInt aType,TInt aLength) + :iLength(aLength|(aType<>KShiftDesType16); + } + +inline TDes16::TDes16(TInt aType,TInt aLength,TInt aMaxLength) + : TDesC16(aType,aLength),iMaxLength(aMaxLength) + {} + +// Class TBufCBase16 +inline TBufCBase16::TBufCBase16(TInt aLength) + :TDesC16(EBufC,aLength) + {} +inline TUint16* TBufCBase16::WPtr() const + {return const_cast(Ptr());} + +#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TPtr16::TPtr16(TBufCBase16& aLcb, TInt aMaxLength) + : TDes16(EBufCPtr,aLcb.Length(),aMaxLength),iPtr((TUint16*)&aLcb) + { + __ASSERT_DEBUG(aLcb.Length()<=aMaxLength,Panic(ETDes16LengthOutOfRange)); + } +#endif + +#if !defined( __DES16_MACHINE_CODED__) +/** +Gets a pointer to the data represented by the descriptor. + +The data cannot be changed through the returned pointer. + +@return A pointer to the data +*/ +EXPORT_C const TUint16 *TDesC16::Ptr() const + { + + const TUint16* p=NULL; + switch (Type()) + { + case EBufC: + p=(&((SBufC16 *)this)->buf[0]); break; + case EPtrC: + p=(((SPtrC16 *)this)->ptr); break; + case EPtr: + p=(((SPtr16 *)this)->ptr); break; + case EBuf: + p=(&((SBuf16 *)this)->buf[0]); break; + case EBufCPtr: + p=(&((SBufCPtr16 *)this)->ptr->buf[0]); break; + default: + Panic(ETDes16BadDescriptorType); + } + __CHECK_ALIGNMENT(p,ETDesC16Ptr); + return p; + } + +EXPORT_C const TUint16 &TDesC16::AtC(TInt anIndex) const +// +// Return a reference to the character in the buffer. +// + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndexDes().Ptr(); + TInt preAllocateCount= outBuf->Des().MaxLength(); + + for (;!output.AtEnd();output.Next(),currentAllocateCount++) + { + if (currentAllocateCount>=preAllocateCount) + { + const TInt KMaxGrowSize=16; + HBufC16* newOutBuf = outBuf->ReAlloc(preAllocateCount+KMaxGrowSize); + if(!newOutBuf) + { + delete outBuf; + User::Leave(KErrNoMemory); + } + outBuf = newOutBuf; + preAllocateCount = outBuf->Des().MaxLength(); + } + outPtr[currentAllocateCount] = (TUint16)(TUint)(output.Current()); + } + // update the length of the buffer... + outBuf->Des().SetLength(currentAllocateCount); + + //compress the unused slot + if (currentAllocateCountReAlloc(currentAllocateCount); // can't fail to shrink memory + return outBuf; + } + +/** +Get the folded decomposed form of this 16 bit descriptor +@return A pointer to the 16-bit heap buffer containing folded decomposed form + if creation is succesful +@leave KErrNoMemory if not enough memory to construct the output buffer +*/ +EXPORT_C HBufC16* TDesC16::GetFoldedDecomposedFormL() const + { + //pre create a buffer with of size Length + TInt strLength=Length(); + HBufC16* outBuf=HBufC16::NewL(strLength); + + TUTF32Iterator input(Ptr(),Ptr()+strLength); + TFoldedCanonicalIterator output (input); + + TInt currentAllocateCount=0; + TUint16* outPtr = (TUint16* )outBuf->Des().Ptr(); + TInt preAllocateCount= outBuf->Des().MaxLength(); + const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet; + for (;!output.AtEnd();output.Next(charDataSet),currentAllocateCount++) + { + if (currentAllocateCount>=preAllocateCount) + { + const TInt KMaxGrowSize=16; + HBufC16* newOutBuf = outBuf->ReAlloc(preAllocateCount+KMaxGrowSize); + if(!newOutBuf) + { + delete outBuf; + User::Leave(KErrNoMemory); + } + outBuf = newOutBuf; + preAllocateCount = outBuf->Des().MaxLength(); + } + outPtr[currentAllocateCount] = (TUint16)(TUint)(output.Current()); + } + // update the length of the buffer... + outBuf->Des().SetLength(currentAllocateCount); + + //compress the unused slot + if (currentAllocateCountReAlloc(currentAllocateCount); // can't fail to shrink memory + return outBuf; + } + +//some utils function +static void ResetAndDestroyArray(TAny* aPtr) + { + (STATIC_CAST(RPointerArray*,aPtr))->ResetAndDestroy(); + } + +/** +Get the collation keys of this 16 bit descriptor for a given collation level +If no collation method is supplied, a default method is used that uses a +locale-independent collation table. +@param aMaxLevel The maximum collation level. This is an integer with + values: 0, 1, 2 or 3. Level 3 is always + used if the aim is to sort strings. +@param aCollationMethod A pointer to the collation method or NULL. Collation + methods can be retrieved by calls to + Mem::CollationMethodByIndex() + and Mem::CollationMethodById(). + Specifying NULL means that the default method is used. +@return A pointer to the 8-bit heap buffer containing the collation keys if + creation is succesful +@leave KErrNoMemory if not enough memory to construct the output buffer +*/ +EXPORT_C HBufC8* TDesC16::GetCollationKeysL(TInt aMaxLevel,const TCollationMethod* aCollationMethod) const + { + // Clamp the maximum level of the comparison. + if(aMaxLevel < 0) + aMaxLevel = 0; + if(aMaxLevel > 3) + aMaxLevel = 3; + + RPointerArray levelBuffer; + CleanupStack::PushL(TCleanupItem(ResetAndDestroyArray, &levelBuffer)); + TInt strLength=Length(); + TInt outputBufferSize=0; + + //preallocate some initial buffer size as it is not possible to determine the max buffer + //required as a character can be further decomposed and each character can possibly + //have up to 8 collation keys and this limit might still change. + for (TInt i=0;i<=aMaxLevel;i++) + { + TInt levelKeySize=TCollationKey::MaxSizePerKey(i); + HBufC8* buffer=HBufC8::NewLC(strLength*levelKeySize); + levelBuffer.AppendL(buffer); + CleanupStack::Pop(); + outputBufferSize+=levelKeySize; + } + TCollationMethod clm; + + //if collationMethod is NULL, use the default one + if (aCollationMethod==NULL) + { + clm=*(GetLocaleCharSet()->iCollationDataSet->iMethod); + } + else + { + clm = *aCollationMethod; + } + //if the main table is empty use the standard table + if (clm.iMainTable==NULL) + clm.iMainTable=StandardCollationMethod(); + + TCollationValueIterator tvi(clm); + TUTF32Iterator input(Ptr(),Ptr()+strLength); + tvi.SetSourceIt(input); + + //Expand the buffer by 16 bytes if buffer is exhausted + const TInt KMaxBufferGrowSize=16; + TInt currentKeyCount=0; + TInt preAllocateCount=strLength; + TCollationKey collateKey; + for (;tvi.GetCurrentKey(collateKey);tvi.Increment(),currentKeyCount++) + { + for (TInt i=0;i<=aMaxLevel;i++) + { + if (currentKeyCount==preAllocateCount) + levelBuffer[i]=levelBuffer[i]->ReAllocL((currentKeyCount+KMaxBufferGrowSize)*TCollationKey::MaxSizePerKey(i)); + + collateKey.AppendToDescriptor(levelBuffer[i]->Des(),i); + } + if (currentKeyCount==preAllocateCount) + preAllocateCount+=KMaxBufferGrowSize; + } + //append the level separator which is a "\x00\x00" for level 0 and \x00 for other level + outputBufferSize=(outputBufferSize*currentKeyCount)+(aMaxLevel==0?0:4+(aMaxLevel-1)*2); + HBufC8* outputResult=HBufC8::NewL(outputBufferSize); + TPtr8 outputResultPtr(outputResult->Des()); + for (TInt count=0;count<=aMaxLevel;count++) + { + outputResultPtr.Append(*levelBuffer[count]); + if (count!=aMaxLevel) + { + if (count==0) + outputResultPtr.Append(0); + outputResultPtr.Append(0); + } + } + CleanupStack::PopAndDestroy(); + return outputResult; + } + +#endif + +/** +Searches for the first occurrence of the specified data sequence within this +descriptor. + +Searching always starts at the beginning of this descriptor's data. + +@param pS A pointer to a location containing the data sequence to be searched + for. + +@param aLenS The length of the data sequence to be searched for. This value + must not be negative, otherwise the function raises a panic. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. + +@panic USER 17 if aLenS is negative. +*/ +EXPORT_C TInt TDesC16::Find(const TUint16 *pS,TInt aLenS) const + { + + if (!aLenS) + return(0); + __ASSERT_ALWAYS(aLenS>0,Panic(ETDes16LengthNegative)); + __CHECK_ALIGNMENT(pS,ETDesC16FindPtrLen); + const TUint16 *pB=Ptr(); + TInt aLenB=Length(); + const TUint16 *pC=pB-1; // using pre-increment addressing + TInt i=aLenB-aLenS; + if (i>=0) + { + const TUint16* pEndS=pS+aLenS-1; // using pre-increment addressing + const TUint16 *pEndB=pB+i; // using pre-increment addressing + TUint s=*pS; + for (;;) + { + do + { + if (pC==pEndB) + return KErrNotFound; + } while (*++pC!=s); + const TUint16 *p1=pC; + const TUint16 *p2=pS; + do + { + if (p2==pEndS) + return (pC-pB); + } while (*++p1==*++p2); + } + } + return(KErrNotFound); + } + + + + +/** +Searches for the first occurrence of the specified data sequence within this +descriptor. + +Searching always starts at the beginning of this descriptor's +data. + +@param aDes The 16-bit non-modifiable descriptor containing the data sequence + to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. +*/ +EXPORT_C TInt TDesC16::Find(const TDesC16 &aDes) const + { + + return(Find(aDes.Ptr(),aDes.Length())); + } + + + + +/** +Searches for the first occurrence of the specified folded data sequence within +this descriptor's folded data. + +Searching always starts at the beginning of this descriptor's data. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for finding strings in natural language; +use FindC() for this. + +@param pS A pointer to a location containing the data sequence to be + searched for. +@param aLenS The length of the data sequence to be searched for. This value + must not be negative, otherwise the function raises a panic. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. Zero, if the + length of the search data sequence is zero. + +@panic USER 17 if aLenS is negative + +@see TDesC16::FindC() +*/ +EXPORT_C TInt TDesC16::FindF(const TUint16 *pS,TInt aLenS) const + { + __CHECK_ALIGNMENT(pS,ETDesC16FindFPtrLen); + TUTF32Iterator candidateStrIt(Ptr(), Ptr() + Length()); + TUTF32Iterator searchTermIt(pS, pS + aLenS); + return ::FindFolded(candidateStrIt, searchTermIt); + } + + + + +/** +Searches for the first occurrence of the specified folded data sequence within +this descriptor's folded data. + +Searching always starts at the beginning of this descriptor's data. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for finding strings in natural language; +use FindC() for this. + +@param aDes The 16-bit non-modifable descriptor containing the data sequence + to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. + Zero, if the length of the search data sequence is zero. + +@see TDesC16::FindC() +*/ +EXPORT_C TInt TDesC16::FindF(const TDesC16 &aDes) const + { + TUTF32Iterator candidateStrIt(Ptr(), Ptr() + Length()); + TUTF32Iterator searchTermIt(aDes.Ptr(), aDes.Ptr() + aDes.Length()); + return ::FindFolded(candidateStrIt, searchTermIt); + } + + + + +/** +Searches for the first occurrence of the specified collated data sequence within +this descriptor's collated data. + +Searching always starts at the beginning of this descriptor's data. The function +uses the standard collation method appropriate to the current locale. + +@param aText A pointer to a location containing the data sequence to be + searched for. +@param aLength The length of the data sequence to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's data. + KErrNotFound, if the data sequence cannot be found. + +@panic USER 17 if aLength is negative. +*/ +EXPORT_C TInt TDesC16::FindC(const TUint16 *aText,TInt aLength) const + { + __CHECK_ALIGNMENT(aText,ETDesC16FindCPtrLen); + + TCollate c(GetLocaleCharSet(),TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase); + return c.Find(Ptr(),Length(),aText,aLength,1); + } + + + + +/** +Searches for the first occurrence of the specified collated data sequence +within this descriptor's collated data to the specified maximum collation +level. + +@param aText A pointer to a location containing the data sequence to + be searched for. + +@param aLength The length of the data sequence to be searched for. + +@param aMaxLevel The maximum collation level. This is an integer with + values: 0, 1, 2 or 3, which, effectively, determines + how 'tight' the matching should be. Level 3 is always + used if the aim is to sort strings. + +@return The offset of the data sequence from the beginning of this descriptor's data. + KErrNotFound, if the data sequence cannot be found. +*/ +EXPORT_C TInt TDesC16::FindC(const TUint16 *aText,TInt aLength, TInt aMaxLevel) const + + { + __CHECK_ALIGNMENT(aText,ETDesC16FindCPtrLen); + + TCollate c(GetLocaleCharSet(),TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase); + return c.Find(Ptr(),Length(),aText,aLength,aMaxLevel); + } + + + + +/** +Searches for the first occurrence of the specified collated data sequence +within this descriptor's collated data. + +Searching always starts at the beginning of this descriptor's data. The +function uses the standard collation method appropriate to the current +locale. + +@param aDes The 16-bit non-modifable descriptor containing the data sequence + to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. +*/ +EXPORT_C TInt TDesC16::FindC(const TDesC16 &aDes) const + { + + return(FindC(aDes.Ptr(),aDes.Length())); + } + +/** +Searches for the first occurrence of the specified collated data sequence +within this descriptor's collated data. + +Searching always starts at the beginning of this descriptor's data. The +function uses the standard collation method appropriate to the current +locale. + +@param aDes The 16-bit non-modifable descriptor containing the data sequence + to be searched for. + +@param aLengthFound A refernce to the maximal length of the match found in the candidate + string. KErrNotFound, if the data sequence cannot be found. + +@param aCollationMethod A pointer to the collation method or NULL. Collation + methods can be retrieved by calls to + Mem::CollationMethodByIndex() + and Mem::CollationMethodById(). + Specifying NULL means that the default method is used. + +@param aMaxLevel The maximum collation level. This is an integer with + values: 0, 1, 2 or 3, which, effectively, determines + how 'tight' the matching should be. Level 3 is always + used if the aim is to sort strings. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. +*/ +EXPORT_C TInt TDesC16::FindC(const TDesC16 &aDes, TInt &aLengthFound, const TCollationMethod &aMethod, TInt aMaxLevel) const + { + TCollate c(aMethod); + return c.Find(Ptr(),Length(),aDes.Ptr(),aDes.Length(),aLengthFound,aMaxLevel); + } + + +#ifdef _UNICODE +LOCAL_C const TText* convTable(TMatchType aType) + { + switch (aType) + { + case EMatchFolded: // at present, folding is... + case EMatchCollated: return (const TText *)(TChar::EFoldStandard); // ...the same as collation: use all folding methods + default: return 0; + } + } +#else +LOCAL_C const TText* convTable(TMatchType aType) + { + switch (aType) + { + case EMatchFolded: return Locl::FoldTable(); + case EMatchCollated: return Locl::CollTable(); + default: return NULL; + } + } +#endif + +inline TUint conv(const TUint16* aStr,const TText *aConv, const TUnicodeDataSet* aCharDataSet) +// +// If aConv is not NULL then convert the character. +// + { + +#ifdef _UNICODE + if (aConv) + return TUnicode(*aStr).Fold((TInt)aConv, aCharDataSet); + else + return *aStr; +#else + TUint c=*aStr; + return aConv && c<0x100 ? aConv[c] : c; +#endif + } + +inline TUint lookup(const TUint16* aStr,const TText *aConv) + { +#ifdef _UNICODE + return TUnicode(*aStr).Fold((TInt)aConv,GetLocaleCharSet()->iCharDataSet); +#else + TUint c=*aStr; + return c<0x100 ? aConv[c] : c; +#endif + } + +TInt DoMatch16(const TDesC16 &aLeftD,const TDesC16 &aRightD,TMatchType aType) + { + const TText* table=convTable(aType); + const TUint16* pRight=aRightD.Ptr(); + const TUint16* pM=pRight-1; // pre-increment addressing + const TUint16* pP=pM+aRightD.Length(); + const TUint16* pLeft=aLeftD.Ptr()-1; // pre-increment addressing + const TUint16* pB=pLeft; + const TUint16* pE=pB+aLeftD.Length(); + + + const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet; + + // Match any pattern up to the first star + TUint c; + for (;;) + { + if (pM==pP) // exhausted the pattern + return pB==pE ? 0 : KErrNotFound; + TUint c=conv(++pM,table, charDataSet); + if (c==KMatchAny) + break; + if (pB==pE) // no more input + return KErrNotFound; + if (c!=conv(++pB,table, charDataSet) && c!=KMatchOne) // match failed + return KErrNotFound; + } + // reached a star + if (pM==pP) + return 0; + TInt r=pM==pRight ? -1 : 0; + for (;;) + { + c=conv(++pM,table, charDataSet); + if (c==KMatchAny) + { +star: if (pM==pP) // star at end of pattern, always matches + return Max(r,0); + if (r<-1) // skipped some '?', matches at beginning + r=0; + continue; + } + if (pB==pE) // no more input + return KErrNotFound; + if (c==KMatchOne) + { // skip a character in the input + if (pM==pP) + return r+((r>=0) ? 0 : (pE-pLeft)); + ++pB; + if (r<0) + --r; + continue; + } + // Matching a non-wild character + for (;;) + { + if (table) + { + while (lookup(++pB,table)!=c) + { + if (pB==pE) // no more input + return KErrNotFound; + } + } + else + { + while (*++pB!=c) + { + if (pB==pE) // no more input + return KErrNotFound; + } + } + // Try to match up to the next star + const TUint16* pb=pB; + const TUint16* pm=pM; + for (;;) + { + if (pm=0 ? 0 : pB-pLeft); + pB=pb; + pM=pm; + goto star; + } + if (pb==pE) + return KErrNotFound; // no more input + if (cc!=conv(++pb,table, charDataSet) && cc!=KMatchOne) + break; // sub-match failed, try next input character + } + else if (pb==pE) // end of matching pattern + return r+(r>=0 ? 0 : pB-pLeft); // end of input, so have a match + else + break; // try next input character + } + } + } + } + + + +EXPORT_C TDesC16::TPrefix TDesC16::HasPrefixC(const TDesC16& aPossiblePrefix, + TInt aLevel, const TCollationMethod* aCollationMethod) const +/** +Compares aPossiblePrefix against the start of the descriptor, using a +collated comparison. + +@param aLevel The maximum level at which to perform the collation. + + 0: Only check character identities. + + 1: Check accents as well. + + 2: Check case as well. + + 3: Check Unicode values. + + Currently only level 0 is supported. + +@param aCollationMethod The collation method to be used for the matching. + +@return EIsPrefix, if aPossiblePrefix can be extended to + be equivalent to the text at the start of this descriptor. + EIsNotPrefix if aPossiblePrefix cannot + be extended to be equivalent to the text at the start of this descriptor. + EMightBePrefix if it currently does not seem to be a prefix, but it + is possible that it could be extended to become equivalent to text at + the start of this descriptor. + EMightBePrefix is returned in cases where it would be expensive + to determine for sure. +*/ + { + const TText16* lp = aPossiblePrefix.Ptr(); + const TText16* rp = Ptr(); + TInt ll = aPossiblePrefix.Length(); + TInt rl = Length(); + TInt r; + if (!aCollationMethod) + { + TCollate c(GetLocaleCharSet()); + r = c.Compare(rp, rl, lp, ll, aLevel); + } + else + { + TCollate c(*aCollationMethod); + r = c.Compare(rp, rl, lp, ll, aLevel); + } + return r == 1 || r == 0? EIsPrefix : EIsNotPrefix; + } + +EXPORT_C TInt TDesC16::Match(const TDesC16 &aDes) const +/** +Searches this descriptor's data for a match with the match pattern supplied +in the specified descriptor. + +The match pattern can contain the wildcard characters "*" and "?", where "*" +matches zero or more consecutive occurrences of any character and "?" matches +a single occurrence of any character. + +Note that there is no 'escape character', which means that it is not possible +to match either the "*" character itself or the "?" character itself using +this function. + +@param aDes A 16-bit non-modifable descriptor containing the match pattern. + +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. +*/ + { + + return DoMatch16(*this,aDes,EMatchNormal); + + } + +EXPORT_C TInt TDesC16::MatchF(const TDesC16 &aDes) const +/** +Searches this descriptor's folded data for a match with the folded match pattern +supplied in the specified descriptor. + +The match pattern can contain the wildcard characters "*" and "?", where "*" +matches zero or more consecutive occurrences of any character and "?" matches +a single occurrence of any character. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for matching strings in natural language; +use MatchC() for this. + +Note that there is no 'escape character', which means that it is not possible +to match either the "*" character itself or the "?" character itself using +this function. + +@param aDes A 16-bit non-modifable descriptor containing the match pattern. + +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. + +@see TDesC16::MatchC() +*/ + { + const TText16* csp = Ptr(); + const TText16* stp = aDes.Ptr(); + return LocateMatchStringFolded(csp, csp + Length(), stp, stp + aDes.Length()); + } + +EXPORT_C TInt TDesC16::MatchC(const TDesC16 &aPattern) const +/** +Searches this descriptor's collated data for a match with the collated match +pattern supplied in the specified descriptor. + +The function uses the standard collation method appropriate to +the current locale. + +The match pattern can contain the wildcard characters "*" and "?", where "*" +matches zero or more consecutive occurrences of any character and "?" matches +a single occurrence of any character. + +Note that there is no 'escape character', which means that it is not possible +to match either the "*" character itself or the "?" character itself using +this function. + +@param aPattern A 16-bit non-modifable descriptor containing the match pattern. + +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. +*/ + { + TCollationMethod m=*Mem::GetDefaultMatchingTable(); + m.iFlags |= (TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase); + TCollate c(m); + return c.Match(Ptr(), Length(), aPattern.Ptr(), aPattern.Length(), 0, '?', '*'); + } + +/** +Searches this descriptor's collated data for a match with the collated match +pattern supplied in the specified descriptor. + +The function uses the standard collation method appropriate to +the current locale. + +The match pattern can contain the wildcard characters specified by aWildChar and aWildSequenceChar +parameters, where aWildSequenceChar matches zero or more consecutive occurrences of any character and +aWildChar matches a single occurrence of any character. + +@param aPattern A 16-bit non-modifable descriptor containing the match pattern. +@param aWildChar Wild card character which may be specified for aSearchTerm. +@param aWildSequenceChar Wild card sequence character which may be specified for aSearchTerm. +@param aEscapeChar The escape character, or 0 if there is to be none. The escape character removes any + special meaning from the subsequent character. For example, if the escape, wild card + and wild sequence characters are \, ? And * respectively, the search term "\?\*\\" matches + only the candidate string "?*\"; +@param aMaxLevel Determines the tightness of the collation. At level 0, only + character identities are distinguished. At level 1 accents are + distinguished as well. At level 2 case is distinguishes as well. At + level 3 all valid different Unicode characters are considered different. +@param aCollationMethod A pointer to the collation method or NULL. Collation methods can be retrieved by calls to + Mem::CollationMethodByIndex() and Mem::CollationMethodById(). + Specifying NULL means that the default method is used. + +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. +*/ +EXPORT_C TInt TDesC16::MatchC(const TDesC16 &aPattern, TInt aWildChar, TInt aWildSequenceChar, + TInt aEscapeChar, TInt aMaxLevel, const TCollationMethod* aCollationMethod) const + { + TCollationMethod m(aCollationMethod ? *aCollationMethod : *Mem::GetDefaultMatchingTable()); + m.iFlags |= (TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase); + TCollate c(m); + return c.Match(Ptr(), Length(), aPattern.Ptr(), aPattern.Length(), aMaxLevel, aWildChar, aWildSequenceChar, aEscapeChar); + } + + +/** +Searches this descriptor's collated data for a match with the collated match +pattern supplied in the specified descriptor. + +The function uses the standard collation method appropriate to +the current locale. + +The match pattern can contain the wildcard characters specified by aWildChar and aWildSequenceChar +parameters, where aWildSequenceChar matches zero or more consecutive occurrences of any character and +aWildChar matches a single occurrence of any character. + +@param aPattern A 16-bit non-modifable descriptor containing the match pattern. +@param aFlags Flags providing advanced control of the collation algorithm @see TCollationFlag +@param aWildChar Wild card character which may be specified for aSearchTerm. Defaulted to '?' if omitted. +@param aWildSequenceChar Wild card sequence character which may be specified for aSearchTerm. + Defaulted to '*' if omitted. +@param aEscapeChar The escape character, or 0 if there is to be none. The escape character removes any + special meaning from the subsequent character. For example, if the escape, wild card + and wild sequence characters are \, ? And * respectively, the search term "\?\*\\" matches + only the candidate string "?*\". Defaulted to 0 if omitted. +@param aMaxLevel Determines the tightness of the collation. Defaulted to 3 if omitted. At level 0, only + character identities are distinguished. At level 1 accents are + distinguished as well. At level 2 case is distinguishes as well. At + level 3 all valid different Unicode characters are considered different. +@param aCollationMethod A pointer to the collation method. Collation methods can be retrieved by calls to + Mem::CollationMethodByIndex(), Mem::CollationMethodById() or by custom defined name. + Flags can be set on definition of the custom TCollationMethod, or by const_cast-ing + the returned pointer and setting the iFlags field directly. @see TCollationMethod +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. +*/ +EXPORT_C TInt TDesC16::MatchC(const TDesC16 &aPattern, const TCollationMethod* aCollationMethod, + TInt aMaxLevel, TInt aWildChar, TInt aWildSequenceChar, TInt aEscapeChar) const + { + TCollate c(*aCollationMethod); + return c.Match(Ptr(), Length(), aPattern.Ptr(), aPattern.Length(), aMaxLevel, aWildChar, aWildSequenceChar, aEscapeChar); + } + + +#ifndef __DES16_MACHINE_CODED_HWORD__ +EXPORT_C TInt TDesC16::Locate(TChar aChar) const +/** +Searches for the first occurrence of a character within this descriptor's +data. + +The search starts at the beginning of the data, i.e. at the leftmost +position. + +@param aChar The character to be found. + +@return The offset of the character position from the beginning of the data. + KErrNotFound, if no matching character can be found. +*/ + { + + const TUint16 *pBuf=Ptr(); + const TUint16 *pB=pBuf-1; + const TUint16 *pE=pB+Length(); + do + { + if (pB==pE) + return KErrNotFound; + } while (TUint(*++pB)!=aChar); + return pB-pBuf; + } +#endif + +LOCAL_C TInt DoLocateF16(const TDesC16& aDes,TUint aChar) +// +// Locate character aChar in the descriptor folded. +// + { +#ifdef _UNICODE + const TText* table = convTable(EMatchFolded); + TUint16 aChar16 = (TUint16)aChar; + aChar = lookup(&aChar16,table); +#else + const TText* table=Locl::FoldTable; + if (aChar<0x100) + aChar=table[aChar]; +#endif + const TUint16 *pBuf=aDes.Ptr(); + const TUint16 *pB=pBuf-1; + const TUint16 *pE=pB+aDes.Length(); + do + { + if (pB==pE) + return KErrNotFound; + } while (lookup(++pB,table)!=aChar); + return pB-pBuf; + } + +EXPORT_C TInt TDesC16::LocateF(TChar aChar) const +/** +Searches for the first occurrence of a folded character within this +descriptor's folded data. + +The search starts at the beginning of the data, i.e. at the leftmost +position. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for searching strings in natural language. + +@param aChar The character to be found. + +@return The offset of the character position from the beginning of the data. + KErrNotFound, if no matching character can be found. +*/ + { + + return DoLocateF16(*this,aChar); + + } + +#ifndef __DES16_MACHINE_CODED_HWORD__ +EXPORT_C TInt TDesC16::LocateReverse(TChar aChar) const +/** +Searches for the first occurrence of a character within this descriptor's +data, searching from the end of the data. + +The search starts at the rightmost position. + +@param aChar The character to be found. + +@return The offset of the character position from the beginning of the data. + KErrNotFound, if no matching character can be found. +*/ + { + + TInt len=Length(); + if (len==0) + return(KErrNotFound); + const TUint16 *pB=Ptr(); + const TUint16 *pE=pB+len-1; + while (pE>=pB) + { + if (TUint(*pE)==aChar) + break; + pE--; + } + return(pE=pB) + { + TCharF c(*pE); + if (c==aChar) + break; + pE--; + } + return(pE=0,Panic(ETDes16PosOutOfRange)); + return(TPtrC16(Ptr(),Min(aLength,Length()))); + } + +EXPORT_C TPtrC16 TDesC16::Right(TInt aLength) const +/** +Extracts the rightmost part of the data. + +The function does not cut or remove any data but constructs a non-modifiable +pointer descriptor to represent the rightmost part of the data. + +@param aLength The length of data to be extracted. If this value + is greater than the length of the descriptor, the function + extracts the whole of the descriptor. + +@return The 16-bit non-modifiable pointer descriptor representing the rightmost + part of the data. + +@panic USER 10 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes16PosOutOfRange)); + TInt len=Length(); + if (aLength>len) + aLength=len; + return(TPtrC16(Ptr()+len-aLength,aLength)); + } + +EXPORT_C TPtrC16 TDesC16::Mid(TInt aPos) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a non-modifiable +pointer descriptor to represent the defined portion. + +The portion is identified by its starting position and by the length of the +remainder of the data starting from the specified position. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. + +@return The 16-bit non-modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 10 if aPos is negative or aPos is greater than the + length of the descriptor. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange)); + return(TPtrC16(Ptr()+aPos,len-aPos)); + } + +EXPORT_C TPtrC16 TDesC16::Mid(TInt aPos,TInt aLength) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a non-modifiable +pointer descriptor to represent the defined portion. + +The portion is identified by its starting position and by its length. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. +@param aLength The length of data to be extracted. + +@return The 16-bit non-modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 10 if aPos is negative or aPos plus aLength is greater than the + length of the descriptor. +*/ + { + + __ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes16PosOutOfRange)); + return(TPtrC16(Ptr()+aPos,aLength)); + } + +#endif // !defined(__DES16_MACHINE_CODED__) + +#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TBufCBase16::TBufCBase16() +// +// Constructor +// + : TDesC16(EBufC,0) + {} +#endif + +#if !defined( __DES16_MACHINE_CODED_HWORD__) | defined(__EABI_CTORS__) +EXPORT_C TBufCBase16::TBufCBase16(const TUint16 *aString,TInt aMaxLength) +// +// Constructor +// + : TDesC16(EBufC,0) + { + Copy(aString,aMaxLength); + } +#endif + +#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TBufCBase16::TBufCBase16(const TDesC16 &aDes,TInt aMaxLength) +// +// Constructor +// + : TDesC16(EBufC,0) + { + Copy(aDes,aMaxLength); + } +#endif + +#ifndef __DES16_MACHINE_CODED_HWORD__ +EXPORT_C void TBufCBase16::Copy(const TUint16 *aString,TInt aMaxLength) +// +// Copy from a string. +// + { + + __CHECK_ALIGNMENT(aString,ETBufCBase16CopyStringMax); + TInt len=STRING_LENGTH_16(aString); + __ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes16Overflow)); + memCopy(WPtr(),aString,len); + DoSetLength(len); + } +#endif + +#ifndef __DES16_MACHINE_CODED__ +EXPORT_C void TBufCBase16::Copy(const TDesC16 &aDes,TInt aMaxLength) +// +// Copy from a descriptor. +// + { + + TInt len=aDes.Length(); + __ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes16Overflow)); + memCopy(WPtr(),aDes.Ptr(),len); + DoSetLength(len); + } +#endif + +inline HBufC16::HBufC16(TInt aLength) + :TBufCBase16(aLength) + {} + +EXPORT_C HBufC16 *HBufC16::New(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 16-bit heap descriptor. + +The heap descriptor is empty and its length is zero. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger than + requested. + +@return A pointer to the new 16-bit heap descriptor. NULL, if the 16-bit heap + descriptor cannot be created. + +@panic USER 18 if aMaxLength is negative. + +@see HBufC16::operator=() +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + return new(STD_CLASS::Alloc(_FOFF(HBufC16,iBuf[aMaxLength]))) HBufC16(0); + } + +EXPORT_C HBufC16 *HBufC16::NewL(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 16-bit heap descriptor, and leaves +on failure. + +The heap descriptor is empty and its length is zero. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. + +@return A pointer to the new 16-bit heap descriptor. The function leaves, if + the new 16-bit heap descriptor cannot be created. + + +@panic USER 18 if aMaxLength is negative. + +@see HBufC16::operator=() +*/ + { + return static_cast(User::LeaveIfNull(New(aMaxLength))); + } + +EXPORT_C HBufC16 *HBufC16::NewLC(TInt aMaxLength) +/** +Creates, adds a pointer onto the cleanup stack and returns a pointer to, a +new 16-bit heap descriptor; leaves on failure. + +The heap descriptor is empty and its length is zero. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. + +@return A pointer to the new 16-bit heap descriptor. The function leaves, if + the new 16-bit heap descriptor cannot be created. + +@panic USER 18 if aMaxLength is negative. + +@see HBufC16::operator=() +*/ + { + HBufC16* buf=NewL(aMaxLength); + CleanupStack::PushL(buf); + return buf; + } + +EXPORT_C HBufC16 *HBufC16::NewMax(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 16-bit heap descriptor. + +No data is assigned into the new descriptor but its length +is set to aMaxLength. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. This also means that the resulting maximum + length of the descriptor may be greater than its length. +@return A pointer to the new 16-bit heap descriptor. NULL, if the new 16-bit + heap descriptor cannot be created. + +@panic USER 18 if aMaxLength is negative. + +@see HBufC16::operator=() +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + return new(STD_CLASS::Alloc(_FOFF(HBufC16,iBuf[aMaxLength]))) HBufC16(aMaxLength); + } + +EXPORT_C HBufC16 *HBufC16::NewMaxL(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 16-bit heap descriptor; +leaves on failure. + +No data is assigned into the new descriptor but its length is set +to aMaxLength. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. This also means that the resulting + maximum length of the descriptor may be greater than its length. + +@return A pointer to the new 16-bit heap descriptor. The function leaves, if + the new 16-bit heap descriptor cannot be created. + +@panic USER 18 if aMaxLength is negative. + +@see HBufC16::operator=() +*/ + { + return static_cast(User::LeaveIfNull(NewMax(aMaxLength))); + } + +EXPORT_C HBufC16 *HBufC16::NewMaxLC(TInt aMaxLength) +/** +Creates, adds a pointer onto the cleanup stack and returns a pointer to, a +new 16-bit heap descriptor; leaves on failure. + +No data is assigned into the new descriptor but its length +is set to aMaxLength. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger than requested. + +@return A pointer to the new 16-bit heap descriptor. This is also put onto + the cleanup stack. The function leaves, if the new 16-bit heap descriptor + cannot be created. + +@panic USER 18 if aMaxLength is negative. + +@see HBufC16::operator=() +*/ + { + HBufC16* buf=NewMaxL(aMaxLength); + CleanupStack::PushL(buf); + return buf; + } + +EXPORT_C HBufC16 &HBufC16::operator=(const TUint16 *aString) +/** +Copies data into this 16-bit heap descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +Note that the maximum length of this (target) descriptor is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length specified when this descriptor was created or +last re-allocated. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this 16-bit heap descriptor. + +@panic USER 11 if the length of the string, excluding the zero terminator, + is greater than the maximum length of this (target) descriptor. +*/ + { + + __CHECK_ALIGNMENT(aString,EHBufC16AssignCString); + Copy(aString,(STD_CLASS::AllocLen(this)-sizeof(TDesC16))/sizeof(TUint16)); + return(*this); + } + +EXPORT_C HBufC16 &HBufC16::operator=(const TDesC16 &aDes) +/** +Copies data into this 16-bit heap descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +Note that the maximum length of this (target) descriptor is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length specified when this descriptor was created or +last re-allocated. + +@param aDes A 16-bit non-modifiable descriptor. + +@return A reference to this 16-bit heap descriptor. + +@panic USER 11 if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor +*/ + { + + Copy(aDes,(STD_CLASS::AllocLen(this)-sizeof(TDesC16))/sizeof(TUint16)); + return(*this); + } + +EXPORT_C HBufC16 *HBufC16::ReAlloc(TInt aMaxLength) +/** +Expands or contracts this 16-bit heap descriptor. + +This is done by: + +1. creating a new heap descriptor. + +2. copying the original data into the new descriptor. + +3. deleting the original descriptor. + +@param aMaxLength The new requested maximum length of the descriptor. + Note that the resulting heap cell size and, therefore, + the resulting maximum length of the descriptor may be + larger than requested. + +@return A pointer to the new expanded or contracted 16-bit heap descriptor - + the original descriptor is deleted. NULL, if the new 16-bit heap descriptor + cannot be created - the original descriptor remains unchanged. + +@panic USER 14 if aMaxLength is less than the length of the existing data. +@panic USER 18 if aMaxLength is negative. +*/ + { + + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + __ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes16ReAllocTooSmall)); + return((HBufC16 *)STD_CLASS::ReAlloc(this,(aMaxLength*sizeof(TUint16))+sizeof(TDesC16))); + } + +EXPORT_C HBufC16 *HBufC16::ReAllocL(TInt aMaxLength) +/** +Expands or contracts this 16-bit heap descriptor; leaves on failure. + +This is done by: + +1. creating a new heap descriptor. + +2. copying the original data into the new descriptor. + +3. deleting the original descriptor. + +@param aMaxLength The new requested maximum length of the descriptor. + Note that the resulting heap cell size and, therefore, + the resulting maximum length of the descriptor may be + larger than requested. + +@return A pointer to the new expanded or contracted 16-bit heap descriptor - + the original descriptor is deleted. The function leaves, if the new + 16-bit heap descriptor cannot be created - the original descriptor + remains unchanged. + +@panic USER 14 if aMaxLength is less than the length of the existing data. +@panic USER 18 if aMaxLength is negative. +*/ + { + + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + __ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes16ReAllocTooSmall)); + return((HBufC16 *)STD_CLASS::ReAllocL(this,(aMaxLength*sizeof(TUint16))+sizeof(TDesC16))); + } + +EXPORT_C TPtr16 HBufC16::Des() +/** +Creates and returns a 16-bit modifiable pointer descriptor for the data +represented by this 16-bit heap descriptor. + +The content of a heap descriptor normally cannot be altered, other than by +complete replacement of the data. Creating a modifiable pointer descriptor +provides a way of changing the data. + +The modifiable pointer descriptor is set to point to this heap descriptor's +data. + +The length of the modifiable pointer descriptor is set to the length of this +heap descriptor. + +The maximum length of the modifiable pointer descriptor is set to the length +of the heap descriptor's buffer. Note that the maximum length is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length requested when this descriptor was originally created +or last re-allocated. + +When data is modified through this new pointer descriptor, the lengths of +both it and this heap descriptor are changed. + +Note that it is a common mistake to use Des() to create a TDesC16& reference. +While not incorrect, it is simpler and much more efficient to simply dereference +the heap descriptor. + +@return A 16-bit modifiable pointer descriptor representing the data in this + 16-bit heap descriptor. +*/ + { + + return DoDes((STD_CLASS::AllocLen(this)-sizeof(TDesC16))/sizeof(TUint16)); + } + +#ifndef __DES16_MACHINE_CODED__ +EXPORT_C void TDes16::SetLength(TInt aLength) +/** +Sets the length of the data represented by the descriptor to the +specified value. + +@param aLength The new length of the descriptor. + +@panic USER 11 if aLength is negative or is greater than the maximum length of + this (target) descriptor. +*/ + { + + __ASSERT_ALWAYS(TUint(aLength)<=TUint(MaxLength()),Panic(ETDes16Overflow)); + DoSetLength(aLength); + if (Type()==EBufCPtr) + ((SBufCPtr16 *)this)->ptr->length=aLength; // Relies on iType==0 for an TBufC + } + +EXPORT_C void TDes16::SetMax() +/** +Sets the length of the data to the maximum length of the descriptor. +*/ + { + + SetLength(iMaxLength); + } +#endif + +#ifndef __DES16_MACHINE_CODED_HWORD__ +EXPORT_C void TDes16::Copy(const TUint16 *aString) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@panic USER 11 if the length of aString, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + { + + __CHECK_ALIGNMENT(aString,ETDes16CopyCString); + TInt len=STRING_LENGTH_16(aString); + SetLength(len); + memCopy(WPtr(),aString,len); + } +#endif + +#ifndef __DES16_MACHINE_CODED__ +EXPORT_C void TDes16::Copy(const TUint16 *aBuf,TInt aLength) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aBuf The start address of data to be copied. +@param aLength The length of data to be copied. + +@panic USER 11 if aLength is negative or is greater than maximum length + of this (target) descriptor. +*/ + { + + __CHECK_ALIGNMENT(aBuf,ETDes16CopyBufLength); + SetLength(aLength); + memCopy(WPtr(),aBuf,aLength); + } + +EXPORT_C void TDes16::Copy(const TDesC16 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit non modifiable descriptor. + +@panic USER 11 if the length of aDes is greater than the maximum length + of this (target) descriptor. +*/ + { + + TInt len=aDes.Length(); + SetLength(len); + memCopy(WPtr(),aDes.Ptr(),len); + } +#endif + +EXPORT_C void TDes16::Copy(const TDesC8 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8 bit non modifiable descriptor. + +@panic USER 11 if the length of aDes is greater than the maximum + length of this (target) descriptor. +*/ + { + + TInt len=aDes.Length(); + SetLength(len); + const TUint8 *pS=aDes.Ptr(); + const TUint8 *pE=pS+len; + TUint16 *pT=WPtr(); + while (pS=0,Panic(ETDes16LengthNegative)); + __CHECK_ALIGNMENT(aBuf,ETDes16AppendBufLength); + TInt len=Length(); + SetLength(len+aLength); + memCopy(WPtr()+len,aBuf,aLength); + } + +EXPORT_C void TDes16::Append(const TDesC16 &aDes) +/** +Appends data onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +@param aDes A 16-bit non modifiable descriptor whose data is to be appended. + +@panic USER 11 if the resulting new length of this descriptor is greater than + its maximum length. +*/ + { + + TInt len=Length(); + TInt n=aDes.Length(); + SetLength(len+n); + memCopy(WPtr()+len,aDes.Ptr(),n); + } +#endif + +EXPORT_C void TDes16::Swap(TDes16 &aDes) +/** +Swaps the data represented by this descriptor with the data represented by +the specified descriptor. + +The lengths of both descriptors are also swapped to reflect the change. + +Note that each descriptor must be capable of accommodating the contents of +the other descriptor. + +Each descriptor must be capable of accommodating the contents of the other +descriptor. If the maximum length of either descriptor is smaller than the +length of the other descriptor, then the function raises a USER 11 panic. + +@param aDes The 16-bit modifiable descriptor whose data is to be swapped with + the data of this descriptor. + +@panic USER 11 if the maximum length of either descriptor is smaller than the + length of the other descriptor. +*/ + { + + TInt l=Length(); + TInt r=aDes.Length(); + aDes.SetLength(l); + SetLength(r); + TInt s=Min(l,r); + l-=s; + r-=s; + TUint16 *pL=WPtr(); + TUint16 *pR=aDes.WPtr(); + while (s--) + { + TChar a=(*pL); + *pL++=(*pR); + *pR++=(TUint16)a; + } + while (l--) + *pR++=(*pL++); + while (r--) + *pL++=(*pR++); + } + +#ifndef __DES16_MACHINE_CODED_HWORD__ +EXPORT_C void TDes16::Fill(TChar aChar) +/** +Fills the descriptor's data area with the specified character, replacing any +existing data. + +The descriptor is filled from the beginning up to its current length. The +descriptor's length does not change. It is not filled to its maximum length. + +@param aChar The fill character. +*/ + { + + TUint16 *pB=WPtr(); + TUint16 *pE=pB+Length(); + while (pB=0,Panic(ETDes16LengthNegative)); + __CHECK_ALIGNMENT(aBuf,ETDes16RepeatBufLength); + TUint16 *pB=WPtr(); + TInt len=Length(); + if (len && aLength) + { + while (len) + { + TInt i=Min(len,aLength); + pB=memCopy(pB,aBuf,i); + len-=i; + } + } + } + +EXPORT_C void TDes16::Repeat(const TDesC16 &aDes) +/** +Copies data with repetition into this descriptor, from another descriptor, +replacing any existing data. + +Copying proceeds until this descriptor is filled up to its current length. +If it cannot contain a whole number of copies of the source data, then the +last copy is truncated. + +@param aDes A 16-bit non modifiable descriptor whose data is to be repeatedly + copied. +*/ + { + + Repeat(aDes.Ptr(),aDes.Length()); + } + +EXPORT_C void TDes16::Trim() +/** +Deletes leading and trailing whitespace characters from the descriptor's data. + +The length of the descriptor is reduced to reflect the loss of the whitespace characters. + +@see TDes16::TrimLeft() +@see TDes16::TrimRight() +*/ + { + + TrimLeft(); + TrimRight(); + } + +EXPORT_C void TDes16::TrimAll() +/** +Deletes leading and trailing whitespace characters from the descriptor's data +and replaces each contiguous set of whitespace characters within the data by one +whitespace character. + +The length of the descriptor is reduced to reflect the loss of the whitespace +characters. + +@see TDes16::Trim() +*/ + { + + TrimLeft(); + TrimRight(); + TUint16 *pBuf=(TUint16 *)Ptr(); + TUint16 *pSrc=pBuf; + TUint16 *pDst=pBuf; + TInt len=Length(); + TInt spaces=0; + while (len--) + { + TChar c=*pSrc; + if (c.IsSpace()) + { + if (spaces++==0) + { + if (pDst!=pSrc) + *pDst=*pSrc; + pDst++; + } + } + else + { + spaces=0; + if (pDst!=pSrc) + *pDst=*pSrc; + pDst++; + } + pSrc++; + } + Delete(pDst-pBuf, pSrc-pDst); + } + +EXPORT_C void TDes16::TrimLeft() +/** +Deletes leading whitespace characters from the descriptor's data. + +All whitespace characters up to, but not including the first +non-whitespace character, are deleted. + +The length of the descriptor is reduced to reflect the loss +of the whitespace characters. +*/ + { + + const TUint16 *pBuf=Ptr(); + const TUint16 *pB=pBuf; + TInt len=Length(); + while (len--) + { + TChar c=(*pB); + if (!c.IsSpace()) + break; + pB++; + } + Delete(0,pB-pBuf); + } + +EXPORT_C void TDes16::TrimRight() +/** +Deletes trailing whitespace characters from the descriptor's data. + +The process starts on the right hand side of the descriptor's data +and proceeds to the left. + +All whitespace characters up to, but not including the first non-whitespace character, +are deleted. + +The length of the descriptor is reduced to reflect the loss of the whitespace +characters. +*/ + { + + TInt len=Length(); + if (len==0) + return; + const TUint16 *pB=Ptr()+len-1; + TInt s=len; + while (s) + { + TChar c=(*pB--); + if (!c.IsSpace()) + break; + s--; + } + Delete(s,len-s); + } + +EXPORT_C void TDes16::Insert(TInt aPos,const TDesC16 &aDes) +/** +Inserts data into this descriptor. + +The length of this descriptor is changed to reflect the extra data. + +@param aPos The position within the data where insertion is to start. This + is an offset value; a zero value refers to the leftmost data + position. + +@param aDes A 16-bit non modifiable descriptor whose data is to be inserted. + +@panic USER 10 if aPos is negative or is greater than the length of this + descriptor. +@panic USER 11 if the resulting length of this descriptor is greater than its + maximum length. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange)); + TInt s=aDes.Length(); + __ASSERT_ALWAYS((len+s)<=MaxLength(),Panic(ETDes16Overflow)); + TUint16 *pB=WPtr(); + memCopy(pB+aPos+s,pB+aPos,len-aPos); + memCopy(pB+aPos,aDes.Ptr(),aDes.Length()); + SetLength(len+s); + } + +EXPORT_C void TDes16::Delete(TInt aPos,TInt aLength) +/** +Deletes data from this descriptor. + +The length of this descriptor is changed to reflect the loss of data. + +@param aPos The position within the data where deletion is to start. This + is an offset value; a zero value refers to the leftmost data + position. + +@param aLength The length of data to be deleted. If necessary, the function + adjusts this value to ensure that no data beyond the end of + the descriptor data area is deleted. + +@panic USER 10 if aPos is negative or is greater than the length of this + descriptor. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange)); + TInt d=Min(len-aPos,aLength); + TUint16 *pB=WPtr(); + memCopy(pB+aPos,pB+aPos+d,len-aPos-d); + SetLength(len-d); + } + +EXPORT_C void TDes16::Replace(TInt aPos,TInt aLength,const TDesC16 &aDes) +/** +Replaces data in this descriptor. + +The specified length can be different to the length of the replacement data. +The length of this descriptor changes to reflect the change of data. + +@param aPos The position within the data where replacement is to start. + This is an offset value; a zero value refers to the leftmost + data position. + +@param aLength The length of data to be replaced. + +@param aDes The source 16-bit non modifiable descriptor whose data is to + replace the target descriptor's data at aPos. + +@panic USER 8 if aLength is negative or the sum of aLength and aPos is + greater than the length of this descriptor. + +@panic USER 10 if aPos is negative or is greater than the length of this + descriptor. + +@panic USER 11 if the resulting length of this descriptor is greater than its + maximum length. + +@panic USER 16 if the length of the source descriptor aDes is negative or is + greater than the maximum length of this target descriptor, +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange)); + __ASSERT_ALWAYS(aLength>=0 && aPos+aLength<=len,Panic(ETDes16LengthOutOfRange)); + TInt s=aDes.Length(); + TInt maxlen=MaxLength(); + __ASSERT_ALWAYS(s>=0 && s<=maxlen,Panic(ETDes16RemoteLengthOutOfRange)); + __ASSERT_ALWAYS((len+s-aLength)<=maxlen,Panic(ETDes16Overflow)); + TUint16 *pB=WPtr(); + memCopy(pB+aPos+s,pB+aPos+aLength,len-aPos-aLength); + memCopy(pB+aPos,aDes.Ptr(),s); + SetLength(len+s-aLength); + } + +EXPORT_C void TDes16::Justify(const TDesC16 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Copies data into this descriptor and justifies it, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The target area is considered to be an area of specified width positioned at +the beginning of this descriptor's data area. Source data is copied into, and +aligned within this target area according to the specified alignment +instruction. + +If the length of the target area is larger than the length of the source, then +spare space within the target area is padded with the fill character. + +@param aDes A 16-bit non-modifiable descriptor containing the source data. + The length of the data to be copied is the smaller of: + the length of the source descriptor, and + the width of the target area (only if this is not the + explicit negative value KDefaultJustifyWidth). + +@param aWidth The width of the target area. If this has the specific + negative value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area + +@param aFill The fill character used to pad the target area. + +@panic USER 11 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + Zero(); + AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes16::AppendJustify(const TDesC16 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends data onto the end of this descriptor's data and justifies it. + +The source of the appended data is an existing descriptor. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aDes A 16-bit non-modifiable descriptor containing the source + data. The length of the data to be copied is the smaller of: + the length of the source descriptor, and + the width of the target area (only if this is not the + explicit negative value KDefaultJustifyWidth). + +@param aWidth The width of the target area. If this has the specific + negative value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 11 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes16::AppendJustify(const TDesC16 &aDes,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends data onto the end of this descriptor's data and justifies it. + +The source of the appended data is an existing descriptor. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aDes An 8-bit non-modifiable descriptor containing the source data. + +@param aLength The length of data to be copied from the source descriptor. + If this is greater than the width of the target area, then + the length of data copied is limited to the width. + The length of data to be copied must not be greater than + the length of the source descriptor. Note that this + condition is not automatically tested. + +@param aWidth The width of the target area. If this has the specific negative + value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 11 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + AppendJustify(aDes.Ptr(),aLength,aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes16::AppendJustify(const TUint16 *aString,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends a zero terminated string onto the end of this descriptor's data and +justifies it. + +The zero terminator is not copied. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within, this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aString A pointer to a zero terminated string The length of the data + to be copied is the smaller of: the length of the string (excluding the zero + terminator), the width of the target area (only if this is not the explicit + negative value KDefaultJustifyWidth). + +@param aWidth The width of the target area. If this has the specific negative + value KDefaultJustifyWidth, then the width is re-set to the length of the + zero terminated string (excluding the zero terminator). + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 11 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + __CHECK_ALIGNMENT(aString,ETDes16AppendJustify1); + AppendJustify(aString,STRING_LENGTH_16(aString),aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes16::AppendJustify(const TUint16 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends data onto the end of this descriptor's data and justifies it. + +The source of the appended data is a memory location. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within, this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aString A pointer to a source memory location. + +@param aLength The length of data to be copied. If this is greater than the + width of the target area, then the length of data copied is + limited to the width. + +@param aWidth The width of the target area. If this has the specific negative + value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 11 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. + +@panic USER 17 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes16LengthNegative)); + __CHECK_ALIGNMENT(aString,ETDes16AppendJustify2); + if (aWidth==KDefaultJustifyWidth) + aWidth=aLength; + if (aLength>aWidth) + aLength=aWidth; + TInt offset=Length(); + AppendFill(aFill,aWidth); + TInt r=aWidth-aLength; + if (anAlignment==ECenter) + r>>=1; + else if (anAlignment==ELeft) + r=0; + memCopy(WPtr()+offset+r,aString,aLength); + } + +EXPORT_C void TDes16::NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and copies the conversion +into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The function generates the exact number of specified characters, either padding +to the left with character zeroes or discarding low order characters as necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +This function is equivalent to using Format() with parameters which specify: + +1. a fixed length target field + +2. padding with zero characters, for example "%08x". + +When this is the case, always use NumFixedWidth() in preference +to Format() as it is more efficient. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters: to be used to contain the conversion, + to be copied into this descriptor. +*/ + { + + Zero(); + AppendNumFixedWidth(aVal,aRadix,aWidth); + } + +EXPORT_C void TDes16::NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and copies the conversion +into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The function generates the exact number of specified characters, either padding +to the left with character zeroes or discarding low order characters as +necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +This function is equivalent to using Format() with parameters which specify: + +1. a fixed length target field + +2. padding with zero characters, for example "%08x". + +When this is the case, always use NumFixedWidthUC() in +preference to Format() as it is more efficient. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters: to be used to contain the conversion, + to be copied into this descriptor. + +@see TDes16::Format() +*/ + { + + Zero(); + AppendNumFixedWidthUC(aVal,aRadix,aWidth); + } + +EXPORT_C void TDes16::Num(TInt64 aVal) +/** +Converts the 64-bit signed integer into a decimal character representation +and copies the conversion into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +If the integer is negative, the character representation is prefixed by a +minus sign. + +@param aVal The 64-bit signed integer value. +*/ + { + Zero(); + AppendNum(aVal); + } + +EXPORT_C void TDes16::Num(TUint64 aVal, TRadix aRadix) +/** +Converts the specified 64 bit unsigned integer into a character representation +based on the specified number system and copies the conversion into this +descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +@param aVal The 64 bit integer value. This is treated as an unsigned + value for all builds. +@param aRadix The number system representation for the 64 bit integer. +*/ + { + + Zero(); + AppendNum(aVal,aRadix); + } + +EXPORT_C void TDes16::NumUC(TUint64 aVal, TRadix aRadix) +/** +Converts the specified 64 bit unsigned integer into a character representation +based on the specified number system and copies the conversion into this +descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +@param aVal The 64 bit integer value. This is always treated as an unsigned + value for all builds. +@param aRadix The number system representation for the 64 bit integer. If no + explicit value is specified, then EDecimal is the default. +*/ + { + + Zero(); + AppendNumUC(aVal,aRadix); + } + +void TDes16::DoPadAppendNum(TInt l, TInt aW, const TUint8* p) + { + __ASSERT_DEBUG( ((l|(TInt)p)&1)==0, Panic(EDes16PadAppendBadAlign)); + l>>=1; + if (aW<=0) + { + Append((const TUint16*)p, l); + return; + } + TInt l0 = Length(); + SetLength(l0 + aW); + TUint16* d = WPtr() + l0; + for (; aW>l; --aW) *d++ = (TUint16)'0'; + memcpy(d, p, aW*2); + } + +EXPORT_C void TDes16::AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and appends the conversion +onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function generates the exact number of specified characters, either padding +to the left with character zeroes or discarding low order characters as +necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters to be used to contain the conversion, + and to be appended to this descriptor. +*/ + { + + TBuf16<32> buf; + buf.Num(aVal,aRadix); + if (buf.Length()>=aWidth) + Append(buf.Left(aWidth)); + else + { + TInt i=aWidth-buf.Length(); + while(i--) + Append(TChar('0')); + Append(buf); + } + } + +#ifndef __DES16_MACHINE_CODED__ +EXPORT_C TPtr16 TDes16::LeftTPtr(TInt aLength) const +/** +Extracts the leftmost part of the data. + +The function does not cut or remove any data but constructs a modifiable pointer +descriptor to represent the leftmost part of the data. + +@param aLength The length of the data to be extracted. If this value is + greater than the length of the descriptor, the function + extracts the whole of the descriptor. + +@return The 16-bit modifiable pointer descriptor representing the leftmost part + of the data. + +@panic USER 10 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes16PosOutOfRange)); + TInt len = Min(aLength,Length()); + return(TPtr16((TUint16*)Ptr(),len,len)); + } + +EXPORT_C TPtr16 TDes16::RightTPtr(TInt aLength) const +/** +Extracts the rightmost part of the data. + +The function does not cut or remove any data but constructs a modifiable pointer +descriptor to represent the rightmost part of the data. + +@param aLength The length of data to be extracted. If this value + is greater than the length of the descriptor, the function + extracts the whole of the descriptor. + +@return The 16-bit modifiable pointer descriptor representing the rightmost part + of the data. + +@panic USER 10 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes16PosOutOfRange)); + TInt len=Length(); + if (aLength>len) + aLength=len; + return(TPtr16((TUint16*)Ptr()+len-aLength,aLength,aLength)); + } + +EXPORT_C TPtr16 TDes16::MidTPtr(TInt aPos) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a modifiable pointer +descriptor to represent the defined portion. + +The portion is identified by its starting position and by the length of the +remainder of the data starting from the specified position. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. + +@return The 16-bit modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 10 if aPos is negative or aPos is greater than the + length of the descriptor. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes16PosOutOfRange)); + return(TPtr16((TUint16*)Ptr()+aPos,len-aPos,len-aPos)); + } + +EXPORT_C TPtr16 TDes16::MidTPtr(TInt aPos,TInt aLength) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a modifiable pointer +descriptor to represent the defined portion. + +The portion is identified by its starting position and by its length. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. +@param aLength The length of data to be extracted. + +@return The 16-bit modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 10 if aPos is negative or aPos plus aLength is greater than the + length of the descriptor. +*/ + { + + __ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes16PosOutOfRange)); + return(TPtr16((TUint16*)Ptr()+aPos,aLength,aLength)); + } +#endif + +EXPORT_C void TDes16::AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and appends the conversion +onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function generates the exact number of specified characters, either +padding to the left with character zeroes or discarding low order characters +as necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters: to be used to contain the conversion, + to be appended to this descriptor. +*/ + { + + TBuf16<32> buf; + buf.NumUC(aVal,aRadix); + if (buf.Length()>=aWidth) + Append(buf.Left(aWidth)); + else + { + TInt i=aWidth-buf.Length(); + while(i--) + Append(TChar('0')); + Append(buf); + } + } + +EXPORT_C void TDes16::AppendNum(TInt64 aVal) +/** +Converts the 64-bit signed integer into a decimal character representation +and appends the conversion onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +If the integer is negative, the character representation is prefixed by a +minus sign. + +@param aVal The 64-bit signed integer value. +*/ + { + + if (aVal<0) + { + Append('-'); + aVal=-aVal; + } + AppendNum(static_cast(aVal), EDecimal); + } + +void TDes16::DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW) +// +// Convert a TUint64 into the descriptor. +// + { + + TUint16 buf[APPEND_BUF_SIZE_64]; + TUint8* p = (TUint8*)(buf + APPEND_BUF_SIZE_64); + TInt l = __DoConvertNum(aVal, aRadix, aA|256, p); + DoPadAppendNum(l, aW, p); + } + +EXPORT_C void TDes16::AppendNum(TUint64 aVal, TRadix aRadix) +/** +Converts the specified 64 bit integer into a character representation +based on the specified number system and appends the conversion onto the end +of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +@param aVal The 64 bit integer value. This is always treated as an unsigned + value. +@param aRadix The number system representation for the 64 bit integer. +*/ + { + DoAppendNum(aVal, aRadix, 'a', 0); + } + +EXPORT_C void TDes16::AppendNumUC(TUint64 aVal,TRadix aRadix) +/** +Converts the specified 64 bit integer into a character representation +based on the specified number system and appends the conversion onto the end +of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +@param aVal The 64 bit integer value. This is always treated as an unsigned + value. +@param aRadix The number system representation for the 64 bit integer. If no + explicit value is specified, then EDecimal is the default. +*/ + + { + DoAppendNum(aVal, aRadix, 'A', 0); + } + +EXPORT_C void TDes16::Format(TRefByValue aFmt,...) +/** +Formats and copies text into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The function takes a format string and a variable number of arguments. +The format string contains literal text embedded with directives for converting +the trailing list of arguments into text. + +The embedded directives are character sequences prefixed with the '%' character. +The literal text is simply copied into this descriptor unaltered while +the '%' directives are used to convert successive arguments from the +trailing list. + +The resulting stream of literal text and converted arguments is copied into +this descriptor. + +The syntax of the embedded directives follows one of four general patterns. + +Note that formatting of single numerical values can be achieved more +conveniently using the Num() and NumUC() member functions of this class. + +The full description of the syntax of a format string cannot be included here. +For full details, navigate to the Symbian OS guide, and follow the hierarchy of links: + +@code +Symbian OS Guide + Base + Using User Library (E32) + Buffers and Strings + Using Descriptors + How to Use Descriptors + Format string syntax +@endcode + +@param aFmt The descriptor containing the format string. + The TRefByValue class provides a constructor which takes a + TDesC8 type. + +@param ... A variable number of arguments to be converted to text as + dictated by the format string. + +@panic USER 11 if the resulting length of text in this descriptor exceeds + the descriptor's maximum length. +@panic USER 12 if the format string has incorrect syntax. + +@see TDes16::Num() +@see TDes16::NumUC() +*/ + { + + VA_LIST list; + VA_START(list,aFmt); + FormatList(aFmt,list); + } + +EXPORT_C void TDes16::FormatList(const TDesC16 &aFmt,VA_LIST aList) +/** +Formats and copies text into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The behaviour of this function is the same as Format(). In practice, it is +better and easier to use Format(), passing a variable number of arguments +as required by the format string. + +@param aFmt The descriptor containing the format string. +@param aList A pointer to an argument list. + +@see TDes16::Format() +@see VA_LIST +*/ + { + + Zero(); + AppendFormatList(aFmt,aList); + } + +EXPORT_C void TDes16::AppendFormat(TRefByValue aFmt,TDes16Overflow *aOverflowHandler,...) +/** +Formats and appends text onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function takes a format string and a variable number of arguments. +The format string contains literal text, embedded with directives, +for converting the trailing list of arguments into text. + +The embedded directives are character sequences prefixed with the '%' character. +The literal text is simply copied into this descriptor unaltered while +the '%' directives are used to convert successive arguments from the +trailing list. See the description of the Format() function. + +Literal text is appended on a character by character basis. +If it results in the length of this descriptor exceeding its maximum length, +then the function: + +1. calls the Overflow() member function of the overflow handler, if an overflow + handler is supplied +2 raises a USER 11 panic, if no overflow handler is supplied. + +As much literal text as possible will have been copied into this descriptor +and this descriptor will have reached its maximum length. + +Text converted from a trailing argument is appended as a complete string. +If an attempt to append this string fails because the resulting length +of this descriptor would exceed its maximum length, then the function: + +1. calls the Overflow() member function of the overflow handler, if an overflow + handler is supplied + +2 raises a USER 11 panic, if no overflow handler is supplied. + +None of the generated text is appended and length of this descriptor +may be less than the maximum. + +@param aFmt The 16-bit non-modifiable descriptor containing the + format string. The TRefByValue class provides a + constructor which takes a TDesC16 type. + +@param aOverflowHandler A pointer to the overflow handler. + +@param ... A variable number of arguments to be converted to text + as dictated by the format string. + +@panic USER 11 if the length of the descriptor exceeds its maximum length and + no overflow handler has been supplied. +@panic USER 12 if the format string has incorrect syntax. + +@see TDes16::Format() +@see TDes16Overflow::Overflow() +*/ + { + + VA_LIST list; + VA_START(list, aOverflowHandler); + AppendFormatList(aFmt,list,aOverflowHandler); + } + +EXPORT_C void TDes16::AppendFormat(TRefByValue aFmt,...) +/** +Formats and appends text onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function takes a format string and a variable number of arguments. +The format string contains literal text, embedded with directives, +for converting the trailing list of arguments into text. + +The embedded directives are character sequences prefixed with the '%' character. +The literal text is simply copied into this descriptor unaltered while +the '%' directives are used to convert successive arguments from the +trailing list. See the description of the Format() function. + +Literal text is appended on a character by character basis. + +Text converted from a trailing argument is appended as a complete string. + +@param aFmt The 16-bit non-modifiable descriptor containing the + format string. The TRefByValue class provides a + constructor which takes a TDesC16 type. + +@param ... A variable number of arguments to be converted to text + as dictated by the format string. + +@panic USER 11 if the resulting length of text in this descriptor exceeds + the descriptor's maximum length. +@panic USER 12 if the format string has incorrect syntax. + +@see TDes16::Format() +*/ + { + + VA_LIST list; + VA_START(list,aFmt); + AppendFormatList(aFmt,list); + } + +#if !defined(__DES16_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TPtrC16::TPtrC16() + : TDesC16(EPtrC,0),iPtr(0) +/** +Constructs an empty 16-bit non-modifiable pointer descriptor. + +It represents no data and its length is zero. + +The non-modifiable pointer descriptor can, subsequently, be set to represent +data. + +@see TPtrC16::Set() +*/ + {} + +EXPORT_C TPtrC16::TPtrC16(const TDesC16 &aDes) + : TDesC16(EPtrC,aDes.Length()),iPtr(aDes.Ptr()) +/** +Constructs the 16-bit non-modifiable pointer descriptor from any existing +descriptor. + +It is set to point to the same data and is given the same length as the source +descriptor. + +@param aDes A reference to a 16-bit non-modifiable descriptor. +*/ + {} +#endif + +#if !defined(__DES16_MACHINE_CODED_HWORD__) | defined(__EABI_CTORS__) +EXPORT_C TPtrC16::TPtrC16(const TUint16 *aString) + : TDesC16(EPtrC,STRING_LENGTH_16(aString)),iPtr(aString) +/** +Constructs the 16-bit non-modifiable pointer descriptor to point to a zero +terminated string, whether in RAM or ROM. + +The length of the descriptor is set to the length of the zero terminated string, +excluding the zero terminator. + +@param aString A pointer to a zero terminated string. +*/ + { + __CHECK_ALIGNMENT(aString,ETDesC16ConstructCString); + } +#endif + +#if !defined(__DES16_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TPtrC16::TPtrC16(const TUint16 *aBuf,TInt aLength) + : TDesC16(EPtrC,aLength),iPtr(aBuf) +/** +Constructs the 16-bit non-modifiable pointer descriptor to point to the +specified location in memory, whether in RAM or ROM. + +The length of the descriptor is set to the specified length. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aLength The length of the descriptor.This value must be non-negative. + +@panic USER 17 if aLength is negative. +*/ + { + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes16LengthNegative)); + __CHECK_ALIGNMENT(aBuf,ETDesC16ConstructBufLength); + } + +EXPORT_C TPtr16::TPtr16(TUint16 *aBuf,TInt aMaxLength) + : TDes16(EPtr,0,aMaxLength),iPtr(aBuf) +/** +Constructs the 16-bit modifiable pointer descriptor to point to the specified +location in memory, whether in RAM or ROM. + +The length of the descriptor is set to zero, and its maximum length is set to +the specified value. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 18 if aMaxLength is negative. +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + __CHECK_ALIGNMENT(aBuf,ETDesC16ConstructBufLengthMax); + } + +EXPORT_C TPtr16::TPtr16(TUint16 *aBuf,TInt aLength,TInt aMaxLength) + : TDes16(EPtr,aLength,aMaxLength),iPtr(aBuf) +/** +Constructs the 16-bit modifiable pointer descriptor to point to the specified +location in memory, whether in RAM or ROM. + +The length of the descriptor and its maximum length are set to the specified +values. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aLength The length of the descriptor. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 8 if aLength is negative, or is greater than the descriptor's + maximum length, + +@panic USER 18 if aMaxLength is negative. +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + __ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes16LengthOutOfRange)); + __CHECK_ALIGNMENT(aBuf,ETDesC16ConstructBufLengthMax); + } + +EXPORT_C TBufBase16::TBufBase16(TInt aMaxLength) + :TDes16(EBuf,0,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + } + +EXPORT_C TBufBase16::TBufBase16(TInt aLength,TInt aMaxLength) + :TDes16(EBuf,aLength,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + __ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes16LengthOutOfRange)); + } +#endif + +#if !defined( __DES16_MACHINE_CODED_HWORD__) | defined(__EABI_CTORS__) +EXPORT_C TBufBase16::TBufBase16(const TUint16* aString,TInt aMaxLength) + :TDes16(EBuf,0,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + Copy(aString); + } +#endif + +#if !defined( __DES16_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TBufBase16::TBufBase16(const TDesC16& aDes,TInt aMaxLength) + :TDes16(EBuf,0,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes16MaxLengthNegative)); + Copy(aDes); + } +#endif + +EXPORT_C void TDesC16::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + switch (Type()) + { + case EBufC: + case EPtrC: + case EPtr: + case EBuf: + case EBufCPtr: + break; + default: + User::Invariant(); + } + if (Ptr() != NULL) // TPtr and TPtrC can be null + __CHECK_ALIGNMENT(Ptr(),ETDesC16Invariant); +#endif + } + +EXPORT_C void TPtrC16::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDesC16::__DbgTestInvariant(); // Test base class + if (Type()!=EPtrC) + User::Invariant(); +#endif + } + +EXPORT_C void TDes16::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDesC16::__DbgTestInvariant(); // Test base class + if (Length()>MaxLength() || !(Type()==EPtr || Type()==EBufCPtr || Type()==EBuf)) + User::Invariant(); +#endif + } + +EXPORT_C void HBufC16::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDesC16::__DbgTestInvariant(); // Test base class + if (Length()>(TInt)(STD_CLASS::AllocLen(this)-sizeof(TDesC16)) || Type()!=EBufC) + User::Invariant(); +#endif + } + +EXPORT_C void TPtr16::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDes16::__DbgTestInvariant(); // Test base class + if (!(Type()==EPtr || Type()==EBufCPtr)) + User::Invariant(); +#endif + } + +/** Collapse all characters from 16 to 8 bits + +@return 8-bit pointer descriptor to transformed text +*/ +EXPORT_C TPtr8 TDes16::Collapse() + { + TInt l = Length(); + TInt ml = MaxLength(); + TText8* d = (TText8*)Ptr(); + TText8* d0 = d; + const TText16* s = (const TText16*)d; + const TText16* sE = s + l; + while (s < sE) + *d++ = (TText8)*s++; + return TPtr8(d0, l, ml*sizeof(TText)); + } + +// Truncate literal string to fit into descriptor +EXPORT_C void TDes16IgnoreOverflow::Overflow(TDes16& /*aDes*/) + {} + +#ifndef __KERNEL_MODE__ + +/** +Default constructor. + +Constructs a zero-length 16-bit resizable buffer descriptor. + +Note that the object owns no allocated memory. +*/ +EXPORT_C RBuf16::RBuf16() + :TDes16(EPtr,0,0),iEPtrType(NULL) + { + // Zero-length RBuf16 is of type EPtr with NULL pointer. + } + + + + +/** +Constructor. + +Constructs a 16-bit resizable buffer descriptor, transferring ownership of the +specified heap descriptor to this object. + +@param aHBuf The heap descriptor to be transferred to this object. This pointer + can be NULL, which means that a zero length 16-bit resizable + buffer descriptor is constructed, and the object will not own any + allocated memory. +*/ +EXPORT_C RBuf16::RBuf16(HBufC16* aHBuf) + { + if(aHBuf) + //Create EBufCPtr type descriptor that points to aHBuf + new(this) TPtr16(aHBuf->Des()); + else + //Create zero-length RBuf16. It is EPtr type of descriptor that points to NULL. + new(this) RBuf16(); + } + + + + +/** +Protected constructor. +*/ +EXPORT_C RBuf16::RBuf16(TInt aType,TInt aLength,TInt aMaxLength) + :TDes16(aType,aLength,aMaxLength) + { + } + + + + +/** +Transfers ownership of the specified 16-bit resizable buffer descriptor's +buffer to this object. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aRBuf The source 16-bit resizable buffer. The ownership of this + object's buffer is to be transferred. + +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::Assign(const RBuf16& aRBuf) + { + Mem::Copy(this, &aRBuf, sizeof(*this)); + __TEST_INVARIANT; + } + + + + +/** +Assigns ownership of the specified allocated memory to this object. + +The allocated memory forms the buffer for this descriptor. The current length +of the descriptor is set to zero. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aHeapCell The allocated memory to be assigned to this object. This + pointer can be NULL, which means that a zero length 16-bit + resizable buffer descriptor is created. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 8 If the specified maximum length is greater then the size of + the allocated heap cell, or the specified maximum length + is NOT zero when the pointer to the heap cell is NULL. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::Assign(TUint16 *aHeapCell,TInt aMaxLength) + { + Assign(aHeapCell,0,aMaxLength); + } + + + + +/** +Assigns ownership of the specified allocated memory to this object. + +The allocated memory forms the buffer for this descriptor. The current length +of the descriptor is set to the value of the second parameter. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aHeapCell The allocated memory to be assigned to this object. +@param aLength The length of the descriptor. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 8 If the specified maximum length is greater then the size of + the allocated heap cell, or the specified length is greater then + the specified maximum length, or the specified maximum length + is NOT zero when the pointer to the heap cell is NULL. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::Assign(TUint16 *aHeapCell,TInt aLength,TInt aMaxLength) + { + __ASSERT_ALWAYS(aLength<=aMaxLength, Panic(ETDes16LengthOutOfRange)); + if(aHeapCell) + { + __ASSERT_ALWAYS(User::AllocLen(aHeapCell) >= aMaxLength * (TInt)sizeof(TUint16), Panic(ETDes16LengthOutOfRange)); + //Create EPtr type descriptor that points to aHeapCell + new(this) TPtr16(aHeapCell,aLength,aMaxLength); + } + else + { + __ASSERT_ALWAYS(aMaxLength == 0, Panic(ETDes16LengthOutOfRange)); + //Create zero-length RBuf. It is EPtr type of descriptor that points to NULL. + new(this) RBuf16(); + } + __TEST_INVARIANT; + } + + + + +/** +Transfers ownership of the specified heap descriptor to this object. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aHBuf The heap descriptor to be transferred to this object. + This pointer can be NULL, which means that a zero length + 16-bit resizable buffer descriptor is created. + +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::Assign(HBufC16* aHBuf) + { + new(this) RBuf16(aHBuf); + } + + + + +/** +Swaps the content of two 16-bit resizable buffer descriptors. + +@param aRBuf The 16-bit resizable buffer descriptor whose contents are to be + swapped with this one. +*/ +EXPORT_C void RBuf16::Swap(RBuf16& aRBuf) + { + Mem::Swap(this,&aRBuf,sizeof(*this)); + } + + + + +/** +Creates a 16-bit resizable buffer descriptor. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +The current length of the descriptor is set to zero. The maximum length of +the descriptor is set to the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The maximum length of the descriptor. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see RBuf16::Close() +*/ +EXPORT_C TInt RBuf16::Create(TInt aMaxLength) + { + if (aMaxLength) + { + //Allocate memory + TUint16* buf=(TUint16*)User::Alloc(aMaxLength*sizeof(TUint16)); + if(!buf) return KErrNoMemory; + iEPtrType = buf; + } + else + iEPtrType = NULL; //Zero-length descriptor. + + + //Create EPtr type descriptor. + new(this) RBuf16(EPtr,0,aMaxLength); + __TEST_INVARIANT; + return KErrNone; + } + + + + +/** +Creates 16-bit resizable buffer descriptor, and leaves on failure. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +The current length of the descriptor is set to zero. The maximum length of +the descriptor is set to the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The maximum length of the descriptor. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::CreateL(TInt aMaxLength) + { + User::LeaveIfError(Create(aMaxLength)); + } + + + + +/** +Creates a 16-bit resizable buffer descriptor. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +Both the current length and the maximum length of the descriptor are set to +the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The length and the maximum length of the descriptor. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see RBuf16::Close() +*/ +EXPORT_C TInt RBuf16::CreateMax(TInt aMaxLength) + { + TInt err=Create(aMaxLength); + if(err==KErrNone) + SetMax(); + return err; + } + + + + +/** +Creates a 16-bit resizable buffer descriptor, and leaves on failure. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +Both the current length and the maximum length of the descriptor are set to +the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The length and the maximum length of the descriptor. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::CreateMaxL(TInt aMaxLength) + { + User::LeaveIfError(CreateMax(aMaxLength)); + } + + + + +/** +Creates a 16-bit resizable buffer descriptor to contain a copy of the +specified (source) descriptor. + +The function allocates sufficient memory so that this descriptor's maximum +length is the same as the length of the source descriptor. Both the current +length and the maximum length of this descriptor are set to +the length of the source descriptor. + +The data contained in the source descriptor is copied into this +descriptor. + +Note that the function assumes that this descriptor does not +already own any allocated memory. It does not check, nor does it free any +pre-existing owned allocated memory. If this descriptor does already own +allocated memory, RBuf16::Close() should be invoked on this descriptor before +this function is invoked. + +@param aDes Source descriptor to be copied into this object. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see TDes16::Copy() +@see RBuf16::Close() +*/ +EXPORT_C TInt RBuf16::Create(const TDesC16& aDes) + { + return Create(aDes,aDes.Length()); + } + + + + + +/** +Creates a 16-bit resizable buffer descriptor to contain a copy of the specified +(source) descriptor, and leaves on failure. + +The function allocates sufficient memory so that this descriptor's maximum +length is the same as the length of the source descriptor.Both the current +length and the maximum length of this descriptor are set to the length +of the source descriptor. + +The data contained in the source descriptor is copied into this descriptor. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any +pre-existing owned allocated memory. If this descriptor does already own +allocated memory, RBuf16::Close() should be invoked on this descriptor before +this function is invoked. + +@param aDes Source descriptor to be copied into this object. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see TDes16::Copy() +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::CreateL(const TDesC16& aDes) + { + CreateL(aDes,aDes.Length()); + } + + + + +/** +Creates a 16-bit resizable buffer descriptor to contain a copy of the +specified (source) descriptor. + +The function allocates sufficient memory so that this descriptor's maximum length +is the same as the value of the aMaxLength parameter. + +The data contained in the source descriptor is copied into this descriptor. +The length of data copied is either + +- the length of the source descriptor aDes + +or + +- the value of the aMaxLength parameter + +whichever is the smaller value. The current length of this descriptor is also +set to the smaller value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aDes Source descriptor to be copied into this object. + +@param aMaxLength The maximum length of this descriptor. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see TDes16::Copy() +@see RBuf16::Close() +*/ +EXPORT_C TInt RBuf16::Create(const TDesC16& aDes,TInt aMaxLength) + { + TInt err=Create(aMaxLength); + if(err==KErrNone) + Copy(aDes.Left(aMaxLength)); + return err; + } + + + + +/** +Creates a 16-bit resizable buffer descriptor to contain a copy of the specified +(source) descriptor, and leaves on failure. + +The function allocates sufficient memory so that this descriptor's maximum +length is the same as the value of the aMaxLength parameter. + +The data contained in the source descriptor is copied into this descriptor. +The length of data copied is either + +- the length of the source descriptor aDes + +or + +- the value of the aMaxLength parameter + +whichever is the smaller value. The current length of this descriptor is also +set to the smaller value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf16::Close() should be invoked on this descriptor before this function is +invoked. + +@param aDes Source descriptor to be copied into this object. + +@param aMaxLength The maximum length of this descriptor. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC16::Length() +@see TDes16::MaxLength() +@see TDes16::Copy() +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::CreateL(const TDesC16& aDes,TInt aMaxLength) + { + CreateL(aMaxLength); + Copy(aDes.Left(aMaxLength)); + } + + + + +/** +Resizes this 16-bit resizable buffer descriptor. + +The length and contents of the descriptor are unchanged. + +If the buffer descriptor was created from a zero-length heap descriptor +HBufC, this method might leak memory (the heap descriptor is not freed). +It is possible to avoid this by calling the Close() method prior to ReAlloc(), +but this should be done only in this situation (otherwise the buffer contents +will be lost). + +For example, add +@code + if (desc.MaxLength() == 0) desc.Close(); +@endcode +before the call to ReAlloc(). + +@param aMaxLength The new maximum length of the descriptor. This can be zero, + which results in a descriptor with zero maximum length and no + allocated memory. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@panic USER 14 If the new maximum length is less then the current descriptor length. +*/ +EXPORT_C TInt RBuf16::ReAlloc(TInt aMaxLength) + { + __ASSERT_ALWAYS(Length()<=aMaxLength, Panic(ETDes16ReAllocTooSmall)); + __TEST_INVARIANT; + + if (!aMaxLength) //Reallocation to zero length + { + User::Free(iEPtrType); //Free memory + new (this) RBuf16(); //Create zero-length RBuf + return KErrNone; + } + + if (!iMaxLength) //Reallocation from zero length + return Create(aMaxLength); + + switch(Type()) + { + case EPtr: + { + TUint16* buf = (TUint16*)User::ReAlloc(iEPtrType,aMaxLength*sizeof(TUint16)); + if(!buf) return KErrNoMemory; + iEPtrType = buf; + iMaxLength = aMaxLength; + break; + } + case EBufCPtr: + { + HBufC16* hbufc = iEBufCPtrType->ReAlloc(aMaxLength); + if(!hbufc) return KErrNoMemory; + Assign(hbufc); + break; + } + } + + __TEST_INVARIANT; + return KErrNone; + } + + + + +/** +Resizes this 16-bit resizable buffer descriptor, leaving on failure. + +The length and contents of the descriptor are unchanged. + +If the buffer descriptor was created from a zero-length heap descriptor +HBufC, this method might leak memory (the heap descriptor is not freed). +It is possible to avoid this by calling the Close() method prior to ReAllocL(), +but this should be done only in this situation (otherwise the buffer contents +will be lost). + +For example, add +@code + if (desc.MaxLength() == 0) desc.Close(); +@endcode +before the call to ReAlloc(). + +@param aMaxLength The new maximum length of the descriptor. This can be zero, + which results in a descriptor with zero maximum length and no + allocated memory. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@panic USER 14 If the new maximum length is less then the current descriptor length. +*/ +EXPORT_C void RBuf16::ReAllocL(TInt aMaxLength) + { + User::LeaveIfError(ReAlloc(aMaxLength)); + } + + + + +/** +Deallocates memory assigned to this object, and re-initializes the object as +a zero-length descriptor. +*/ +EXPORT_C void RBuf16::Close() + { + User::Free(iEPtrType); + //Create zero-length RBuf. It is EPtr type of descriptor that points to NULL. + new(this) RBuf16(); + } + + + + +/** +Pushes a cleanup item for this object onto the cleanup stack. + +The effect of this is to cause Close() to be called on this 16-bit resizable +buffer descriptor, when CleanupStack::PopAndDestroy() is called at some later time. + +@code +... +RBuf16 x; +.... +x.CleanupClosePushL(); +... +CleanupStack::PopAndDestroy(); +... +@endcode + +@see RBuf16::Close() +*/ +EXPORT_C void RBuf16::CleanupClosePushL() + { + ::CleanupClosePushL(*this); + } + + + + +/** +Tests that the class obeys its invariant. +*/ +EXPORT_C void RBuf16::__DbgTestInvariant() const + { +#ifdef _DEBUG + TDes16::__DbgTestInvariant(); + switch(Type()) + { + case EPtr: + if (iEPtrType) + { + __ASSERT_DEBUG(User::AllocLen(iEPtrType) >= iMaxLength*(TInt)sizeof(TUint16), Panic(EInvariantFalse)); + } + break; + case EBufCPtr: + iEBufCPtrType->__DbgTestInvariant(); + __ASSERT_DEBUG(iEBufCPtrType->Des().MaxLength() == iMaxLength, Panic(EInvariantFalse)); + __ASSERT_DEBUG(iEBufCPtrType->Length() == Length(), Panic(EInvariantFalse)); + break; + default: + User::Invariant(); + } +#endif // _DEBUG + } + +#endif // __KERNEL_MODE__ + + +#if defined(__DES16_MACHINE_CODED__) || defined(__EABI__) +GLDEF_C void Des16PanicBadDesType() + { + Panic(ETDes16BadDescriptorType); + } + +GLDEF_C void Des16PanicPosOutOfRange() + { + Panic(ETDes16PosOutOfRange); + } +#endif + +#ifdef __DES16_MACHINE_CODED__ +GLDEF_C void Des16PanicLengthNegative() + { + Panic(ETDes16LengthNegative); + } + +GLDEF_C void Des16PanicMaxLengthNegative() + { + Panic(ETDes16MaxLengthNegative); + } + +GLDEF_C void Des16PanicLengthOutOfRange() + { + Panic(ETDes16LengthOutOfRange); + } + +GLDEF_C void Des16PanicDesOverflow() + { + Panic(ETDes16Overflow); + } + +GLDEF_C void Des16PanicDesIndexOutOfRange() + { + Panic(ETDes16IndexOutOfRange); + } +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/common/des8.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/common/des8.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,3955 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\common\des8.cpp +// +// + +#include "common.h" +#ifndef __KERNEL_MODE__ +#include +#else +#include +#endif +#include + +// Folding/Collation for 8 bit characters + +extern const TUint8 __FoldCollTab8[256]; + +const TUint8 __FoldCollTab8[256] = + { + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, // 0x00 + 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, // 0x10 + 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, // 0x20 + 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, // 0x30 + 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, + 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67, // 0x40 + 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, // 0x50 + 0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, // 0x60 + 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, // 0x70 + 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, // 0x80 + 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, // 0x90 + 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, + 0x20,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, // 0xa0 + 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, + 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, // 0xb0 + 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, + 0x61,0x61,0x61,0x61,0x61,0x61,0xe6,0x63, // 0xc0 + 0x65,0x65,0x65,0x65,0x69,0x69,0x69,0x69, + 0xf0,0x6e,0x6f,0x6f,0x6f,0x6f,0x6f,0xd7, // 0xd0 + 0xf8,0x75,0x75,0x75,0x75,0x79,0xfe,0xdf, + 0x61,0x61,0x61,0x61,0x61,0x61,0xe6,0x63, // 0xe0 + 0x65,0x65,0x65,0x65,0x69,0x69,0x69,0x69, + 0xf0,0x6e,0x6f,0x6f,0x6f,0x6f,0x6f,0xf7, // 0xf0 + 0xf8,0x75,0x75,0x75,0x75,0x79,0xfe,0x79 + }; + +#ifndef __KERNEL_MODE__ +inline TUint8* memCopy(TUint8* aPtr, const TUint8* aSrc, TInt aLength) +// +// Copy 8 bit values. +// + { + + return Mem::Copy(aPtr, aSrc, aLength); + } +#endif + +#if (defined(__KERNEL_MODE__) && !defined(__DES8_MACHINE_CODED__)) | defined(__EABI_CTORS__) +inline TInt StringLength(const TUint8* aPtr) + { + const TUint8* p = aPtr; + while (*p) + ++p; + return p-aPtr; + } +#endif + +inline TDesC8::TDesC8(TInt aType,TInt aLength) + :iLength(aLength|(aType<>KShiftDesType8); + } + +inline TDes8::TDes8(TInt aType,TInt aLength,TInt aMaxLength) + : TDesC8(aType,aLength),iMaxLength(aMaxLength) + {} + +// Class TBufCBase8 +inline TBufCBase8::TBufCBase8(TInt aLength) + :TDesC8(EBufC,aLength) + {} + +inline TUint8* TBufCBase8::WPtr() const + {return const_cast(Ptr());} + + +#ifndef __DES8_MACHINE_CODED__ +EXPORT_C const TUint8* TDesC8::Ptr() const +/** +Gets a pointer to the data represented by the descriptor. + +The data cannot be changed through the returned pointer. + +@return A pointer to the data +*/ + { + + switch (Type()) + { + case EBufC: + return(&((SBufC8 *)this)->buf[0]); + case EPtrC: + return(((SPtrC8 *)this)->ptr); + case EPtr: + return(((SPtr8 *)this)->ptr); + case EBuf: + return(&((SBuf8 *)this)->buf[0]); + case EBufCPtr: + return(&((SBufCPtr8 *)this)->ptr->buf[0]); + } + Panic(ETDes8BadDescriptorType); + return(NULL); + } + +EXPORT_C const TUint8 &TDesC8::AtC(TInt anIndex) const +// +// Return a reference to the character in the buffer. +// + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndex0,Panic(ETDes8LengthNegative)); + const TUint8 *pB=Ptr(); + TInt aLenB=Length(); + const TUint8 *pC=pB-1; // using pre-increment addressing + TInt i=aLenB-aLenS; + if (i>=0) + { + const TUint8* pEndS=pS+aLenS-1; // using pre-increment addressing + const TUint8 *pEndB=pB+i; // using pre-increment addressing + TUint s=*pS; + for (;;) + { + do + { + if (pC==pEndB) + return KErrNotFound; + } while (*++pC!=s); + const TUint8 *p1=pC; + const TUint8 *p2=pS; + do + { + if (p2==pEndS) + return (pC-pB); + } while (*++p1==*++p2); + } + } + return(KErrNotFound); + } + +EXPORT_C TInt TDesC8::Find(const TDesC8 &aDes) const +/** +Searches for the first occurrence of the specified data sequence within this +descriptor. + +Searching always starts at the beginning of this descriptor's data. + +@param aDes The 8-bit non modifable descriptor containing the data sequence + to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. +*/ + { + + return(Find(aDes.Ptr(),aDes.Length())); + } + +const TUint8* convTable(TMatchType aType) + { + switch (aType) + { + case EMatchFolded: + case EMatchCollated: return __FoldCollTab8; + default: return NULL; + } + } + +inline TUint conv(const TUint8* aStr,const TUint8* aConv) + { + TUint c=*aStr; + return aConv ? aConv[c] : c; + } + + +inline TUint lookup(const TUint8* aStr,const TUint8* aConv) + { + return aConv[*aStr]; + } + +TInt DoMatch8(const TDesC8 &aLeftD,const TDesC8 &aRightD,TMatchType aType) + { + const TUint8* table=convTable(aType); + const TUint8* pRight=aRightD.Ptr(); + const TUint8* pM=pRight-1; // pre-increment addressing + const TUint8* pP=pM+aRightD.Length(); + const TUint8* pLeft=aLeftD.Ptr()-1; // pre-increment addressing + const TUint8* pB=pLeft; + const TUint8* pE=pB+aLeftD.Length(); + + // Match any pattern up to the first star + TUint c; + for (;;) + { + if (pM==pP) // exhausted the pattern + return pB==pE ? 0 : KErrNotFound; + TUint c=conv(++pM,table); + if (c==KMatchAny) + break; + if (pB==pE) // no more input + return KErrNotFound; + if (c!=conv(++pB,table) && c!=KMatchOne) // match failed + return KErrNotFound; + } + // reached a star + if (pM==pP) + return 0; + TInt r=pM==pRight ? -1 : 0; + for (;;) + { + c=conv(++pM,table); + if (c==KMatchAny) + { +star: if (pM==pP) // star at end of pattern, always matches + return Max(r,0); + if (r<-1) // skipped some '?', matches at beginning + r=0; + continue; + } + if (pB==pE) // no more input + return KErrNotFound; + if (c==KMatchOne) + { // skip a character in the input + if (pM==pP) + return r+((r>=0) ? 0 : (pE-pLeft)); + ++pB; + if (r<0) + --r; + continue; + } + // Matching a non-wild character + for (;;) + { + if (table) // pull this test out of the tight loop (10-20% faster) + { + while (lookup(++pB,table)!=c) + { + if (pB==pE) // no more input + return KErrNotFound; + } + } + else + { + while (*++pB!=c) + { + if (pB==pE) // no more input + return KErrNotFound; + } + } + // Try to match up to the next star + const TUint8* pb=pB; + const TUint8* pm=pM; + for (;;) + { + if (pm=0 ? 0 : pB-pLeft); + pB=pb; + pM=pm; + goto star; + } + if (pb==pE) + return KErrNotFound; // no more input + if (cc!=conv(++pb,table) && cc!=KMatchOne) + break; // sub-match failed, try next input character + } + else if (pb==pE) // end of matching pattern + return r+(r>=0 ? 0 : pB-pLeft); // end of input, so have a match + else + break; // try next input character + } + } + } + } + +EXPORT_C TInt TDesC8::Match(const TDesC8 &aDes) const +/** +Searches this descriptor's data for a match with the match pattern supplied +in the specified descriptor. + +The match pattern can contain the wildcard characters "*" and "?", where "*" +matches zero or more consecutive occurrences of any character and "?" matches +a single occurrence of any character. + +Note that there is no 'escape character', which means that it is not possible +to match either the "*" character itself or the "?" character itself using +this function. + +@param aDes An 8-bit non-modifable descriptor containing the match pattern. + +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. +*/ + { + + return DoMatch8(*this,aDes,EMatchNormal); + } + +EXPORT_C TInt TDesC8::MatchF(const TDesC8 &aDes) const +/** +Searches this descriptor's folded data for a match with the folded match +pattern supplied in the specified descriptor. + +The match pattern can contain the wildcard characters "*" and "?", where "*" +matches zero or more consecutive occurrences of any character and "?" matches +a single occurrence of any character. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for matching strings in natural language; +use MatchC() for this. + +Note that there is no 'escape character', which means that it is not possible +to match either the "*" character itself or the "?" character itself using +this function. + +@param aDes An 8-bit non-modifable descriptor containing the match pattern. + +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. + +@see TDesC8::MatchC() +*/ + { + + return DoMatch8(*this,aDes,EMatchFolded); + } + +EXPORT_C TInt TDesC8::MatchC(const TDesC8 &aPattern) const +/** +Searches this descriptor's collated data for a match with the collated match +pattern supplied in the specified descriptor. + +The function uses the standard collation method for narrow text appropriate to +the current locale. + +The match pattern can contain the wildcard characters "*" and "?", where "*" +matches zero or more consecutive occurrences of any character and "?" matches +a single occurrence of any character. + +Note that there is no 'escape character', which means that it is not possible +to match either the "*" character itself or the "?" character itself using +this function. + +@param aPattern An 8-bit non-modifable descriptor containing the match pattern. + +@return If a match is found, the offset within this descriptor's data where + the match first occurs. KErrNotFound, if there is no match. +@deprecated +*/ + { +#ifndef __KERNEL_MODE__ + return MatchF(aPattern); +#else + return DoMatch8(*this,aPattern,EMatchCollated); +#endif + } + +#ifndef __KERNEL_MODE__ + +EXPORT_C TInt TDesC8::FindF(const TUint8 *pS,TInt aLenS) const +/** +Searches for the first occurrence of the specified folded data sequence within +this descriptor's folded data. + +Searching always starts at the beginning of this descriptor's data. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for finding strings in natural language; +use FindC() for this. + +@param pS A pointer to a location containing the data sequence to be + searched for. +@param aLenS The length of the data sequence to be searched for. This value + must not be negative, otherwise the function raises a panic. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. Zero, if the + length of the search data sequence is zero. + +@panic USER 29 if aLenS is negative + +@see TDesC8::FindC() +*/ + { + if (!aLenS) + return(0); + const TUint8* table=convTable(EMatchFolded); + const TUint8 *pB=Ptr(); + TInt aLenB=Length(); + const TUint8 *pC=pB-1; // using pre-increment addressing + TInt i=aLenB-aLenS; + if (i>=0) + { + const TUint8* pEndS=pS+aLenS-1; // using pre-increment addressing + const TUint8 *pEndB=pB+i; // using pre-increment addressing + TUint s=lookup(pS,table); + for (;;) + { + do + { + if (pC==pEndB) + return KErrNotFound; + } while (lookup(++pC,table)!=s); + const TUint8 *p1=pC; + const TUint8 *p2=pS; + do + { + if (p2==pEndS) + return (pC-pB); + } while (lookup(++p1,table)==lookup(++p2,table)); + } + } + return(KErrNotFound); + } + +EXPORT_C TInt TDesC8::FindF(const TDesC8 &aDes) const +/** +Searches for the first occurrence of the specified folded data sequence within +this descriptor's folded data. + +Searching always starts at the beginning of this descriptor's data. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for finding strings in natural language; +use FindC() for this. + +@param aDes The 8-bit non-modifable descriptor containing the data sequence + to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. Zero, if the + length of the search data sequence is zero. + +@see TDesC8::FindC() +*/ + { + + return(FindF(aDes.Ptr(),aDes.Length())); + } + +EXPORT_C TInt TDesC8::FindC(const TUint8* aText,TInt aLength) const +/** +Searches for the first occurrence of the specified collated data sequence within +this descriptor's collated data. + +Searching always starts at the beginning of this descriptor's data. The function +uses the standard collation method for narrow text appropriate to the current +locale. + +@param aText A pointer to a location containing the data sequence to be + searched for. +@param aLength The length of the data sequence to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. + +@panic USER 29 if aLength is negative. +@deprecated +*/ + { + return FindF(aText, aLength); + } + +EXPORT_C TInt TDesC8::FindC(const TDesC8 &aDes) const +/** +Searches for the first occurrence of the specified collated data sequence within +this descriptor's collated data. + +Searching always starts at the beginning of this descriptor's data. The function +uses the standard collation method for narrow text appropriate to the current +locale. + +@param aDes The 8-bit non-modifable descriptor containing the data sequence + to be searched for. + +@return The offset of the data sequence from the beginning of this descriptor's + data. KErrNotFound, if the data sequence cannot be found. +@deprecated +*/ + { + + return(FindC(aDes.Ptr(),aDes.Length())); + } + +EXPORT_C TInt TDesC8::LocateF(TChar aChar) const +/** +Searches for the first occurrence of a folded character within this +descriptor's folded data. + +The search starts at the beginning of the data,i.e. at the leftmost position. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for searching strings in natural language. + +@param aChar The character to be found. + +@return The offset of the character position from the beginning of the data. + KErrNotFound, if no matching character can be found. +*/ + { + TUint c = User::Fold(aChar); + if(c>=0x100) + return KErrNotFound; + const TUint8 *pBuf=Ptr(); + const TUint8 *pB=pBuf-1; + const TUint8 *pE=pB+Length(); + const TUint8* table=__FoldCollTab8; + do + { + if (pB==pE) + return KErrNotFound; + } while (table[*++pB]!=c); + return pB-pBuf; + } +#endif // __KERNEL_MODE__ + +#ifndef __DES8_MACHINE_CODED__ +EXPORT_C TInt TDesC8::Locate(TChar aChar) const +/** +Searches for the first occurrence of a character within this descriptor's +data. + +The search starts at the beginning of the data, i.e. at the leftmost position. + +@param aChar The character to be found. + +@return The offset of the character position from the beginning of the data. + KErrNotFound, if no matching character can be found. +*/ + { + + const TUint8 *pBuf=Ptr(); + const TUint8 *pB=pBuf-1; + const TUint8 *pE=pB+Length(); + do + { + if (pB==pE) + return KErrNotFound; + } while (*++pB!=aChar); + return pB-pBuf; + } +#endif + +#ifndef __DES8_MACHINE_CODED__ +EXPORT_C TInt TDesC8::LocateReverse(TChar aChar) const +/** +Searches for the first occurrence of a character within this descriptor's data, +searching from the end of the data. + +The search starts at the rightmost position. + +@param aChar The character to be found. + +@return The offset of the character position from the beginning of the data. + KErrNotFound, if no matching character can be found. +*/ + { + + TInt len=Length(); + if (len==0) + return(KErrNotFound); + const TUint8 *pB=Ptr(); + const TUint8 *pE=pB+len-1; + while (pE>=pB) + { + if (*pE==aChar) + break; + pE--; + } + return(pE=pB) + { + if (table[*pE]==c) + break; + pE--; + } + return(pE=0,Panic(ETDes8PosOutOfRange)); + return(TPtrC8(Ptr(),Min(aLength,Length()))); + } + +EXPORT_C TPtrC8 TDesC8::Right(TInt aLength) const +/** +Extracts the rightmost part of the data. + +The function does not cut or remove any data but constructs a non-modifiable +pointer descriptor to represent the rightmost part of the data. + +@param aLength The length of data to be extracted. If this value + is greater than the length of the descriptor, the function + extracts the whole of the descriptor. + +@return The 8 bit non-modifiable pointer descriptor representing the rightmost + part of the data. + +@panic USER 22 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange)); + TInt len=Length(); + if (aLength>len) + aLength=len; + return(TPtrC8(Ptr()+len-aLength,aLength)); + } + +EXPORT_C TPtrC8 TDesC8::Mid(TInt aPos) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a non-modifiable +pointer descriptor to represent the defined portion. + +The portion is identified by its starting position and by the length of the +remainder of the data starting from the specified position. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. + +@return The 8-bit non-modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 22 if aPos is negative or aPos is greater than the + length of the descriptor. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange)); + return(TPtrC8(Ptr()+aPos,len-aPos)); + } + +EXPORT_C TPtrC8 TDesC8::Mid(TInt aPos,TInt aLength) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a non-modifiable +pointer descriptor to represent the defined portion. + +The portion is identified by its starting position and by its length. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. +@param aLength The length of data to be extracted. + +@return The 8 bit non-modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 22 if aPos is negative or aPos plus aLength is greater than the + length of the descriptor. +*/ + { + + __ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes8PosOutOfRange)); + return(TPtrC8(Ptr()+aPos,aLength)); + } + +#endif // !defined(__DES8_MACHINE_CODED__) + +#if !defined( __DES8_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TBufCBase8::TBufCBase8() +// +// Constructor +// + : TDesC8(EBufC,0) + {} + +EXPORT_C TBufCBase8::TBufCBase8(const TUint8 *aString,TInt aMaxLength) +// +// Constructor +// + : TDesC8(EBufC,0) + { + Copy(aString,aMaxLength); + } + +EXPORT_C TBufCBase8::TBufCBase8(const TDesC8 &aDes,TInt aMaxLength) +// +// Constructor +// + : TDesC8(EBufC,0) + { + Copy(aDes,aMaxLength); + } +#endif + +#ifndef __DES8_MACHINE_CODED__ +EXPORT_C void TBufCBase8::Copy(const TUint8 *aString,TInt aMaxLength) +// +// Copy from a string. +// + { + + TInt len=STRING_LENGTH(aString); + __ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes8Overflow)); + memmove(WPtr(), aString, len); + DoSetLength(len); + } + +EXPORT_C void TBufCBase8::Copy(const TDesC8 &aDes,TInt aMaxLength) +// +// Copy from a descriptor. +// + { + + TInt len=aDes.Length(); + __ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes8Overflow)); + memmove(WPtr(), aDes.Ptr(), len); + DoSetLength(len); + } +#endif + +#ifndef __KERNEL_MODE__ +inline HBufC8::HBufC8(TInt aLength) + :TBufCBase8(aLength) + {} + +EXPORT_C HBufC8 *HBufC8::New(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 8-bit heap descriptor. + +The heap descriptor is empty and its length is zero. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. + +@return A pointer to the new 8-bit heap descriptor. NULL, if the 8-bit heap + descriptor cannot be created. + +@panic USER 30 if aMaxLength is negative. + +@see HBufC8::operator=() +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + return new(STD_CLASS::Alloc(_FOFF(HBufC8,iBuf[aMaxLength]))) HBufC8(0); + } + +EXPORT_C HBufC8 *HBufC8::NewL(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 8-bit heap descriptor, and leaves +on failure. + +The heap descriptor is empty and its length is zero. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. + +@return A pointer to the new 8 bit heap descriptor. The function leaves, if + the new 8-bit heap descriptor cannot be created. + +@panic USER 30 if aMaxLength is negative. + +@see HBufC8::operator=() +*/ + { + return static_cast(User::LeaveIfNull(New(aMaxLength))); + } + +EXPORT_C HBufC8 *HBufC8::NewLC(TInt aMaxLength) +/** +Creates, adds a pointer onto the cleanup stack, and returns a pointer to, a +new 8 bit heap descriptor; leaves on failure. + +The heap descriptor is empty and its length is zero. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. + +@return A pointer to the new 8-bit heap descriptor. The function leaves, if + the new 8-bit heap descriptor cannot be created. + +@panic USER 30 if aMaxLength is negative. + +@see HBufC8::operator=() +*/ + { + HBufC8* buf=NewL(aMaxLength); + CleanupStack::PushL(buf); + return buf; + } + +EXPORT_C HBufC8 *HBufC8::NewMax(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 8-bit heap descriptor. + +No data is assigned into the new descriptor but its length +is set to aMaxLength. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. This also means that the resulting maximum + length of the descriptor may be greater than its length. + +@return A pointer to the new 8-bit heap descriptor. NULL, if the new 8-bit + heap descriptor cannot be created. + +@panic USER 30 if aMaxLength is negative. + +@see HBufC8::operator=() +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + return new(STD_CLASS::Alloc(_FOFF(HBufC8,iBuf[aMaxLength]))) HBufC8(aMaxLength); + } + +EXPORT_C HBufC8 *HBufC8::NewMaxL(TInt aMaxLength) +/** +Creates, and returns a pointer to, a new 8-bit heap descriptor; +leaves on failure. + +No data is assigned into the new descriptor but its length +is set to aMaxLength. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger + than requested. This also means that the resulting maximum + length of the descriptor may be greater than its length. + +@return A pointer to the new 8-bit heap descriptor. The function leaves, if + the new 8-bit heap descriptor cannot be created. + +@panic USER 30 if aMaxLength is negative. + +@see HBufC8::operator=() +*/ + { + return static_cast(User::LeaveIfNull(NewMax(aMaxLength))); + } + +EXPORT_C HBufC8 *HBufC8::NewMaxLC(TInt aMaxLength) +/** +Creates, adds a pointer onto the cleanup stack and returns a pointer to, a +new 8-bit heap descriptor; leaves on failure. + +No data is assigned into the new descriptor but its length +is set to aMaxLength. + +Data can, subsequently, be assigned into it using the assignment operators. + +@param aMaxLength The requested maximum length of the descriptor. Note that + the resulting heap cell size and, therefore, the resulting + maximum length of the descriptor may be larger than requested. + This also means that the resulting maximum + length of the descriptor may be greater than its length. + +@return A pointer to the new 8-bit heap descriptor. This is also put onto the + cleanup stack. The function leaves, if the new 8-bit heap descriptor + cannot be created. + +@panic USER 30 if aMaxLength is negative. + +@see HBufC8::operator=() +*/ + { + HBufC8* buf=NewMaxL(aMaxLength); + CleanupStack::PushL(buf); + return buf; + } + +EXPORT_C HBufC8 &HBufC8::operator=(const TUint8 *aString) +/** +Copies data into this 8-bit heap descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +Note that the maximum length of this (target) descriptor is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length specified when this descriptor was created or +last re-allocated. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this 8 bit heap descriptor. + +@panic USER 23 if the length of the string, excluding the zero terminator, + is greater than the maximum length of this (target) descriptor, +*/ + { + + Copy(aString,(STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8)); + return(*this); + } + +EXPORT_C HBufC8 &HBufC8::operator=(const TDesC8 &aDes) +/** +Copies data into this 8-bit heap descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +Note that the maximum length of this (target) descriptor is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length specified when this descriptor was created or last +re-allocated. + +@param aDes An 8-bit non-modifiable descriptor. + +@return A reference to this 8-bit heap descriptor. + +@panic USER 23 if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor +*/ + { + + Copy(aDes,(STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8)); + return(*this); + } + +EXPORT_C HBufC8 *HBufC8::ReAlloc(TInt aMaxLength) +/** +Expands or contracts the heap descriptor. + +This is done by: + +1. creating a new heap descriptor. + +2. copying the original data into the new descriptor. + +3. deleting the original descriptor. + +@param aMaxLength The new requested maximum length of the descriptor. + Note that the resulting heap cell size and, therefore, + the resulting maximum length of the descriptor may be + larger than requested. + +@return A pointer to the new expanded or contracted 8 bit heap descriptor - + the original descriptor is deleted. NULL, if the new 8-bit heap descriptor + cannot be created - the original descriptor remains unchanged + +@panic USER 26 if aMaxLength is less than the length of the existing data. +@panic USER 30 if aMaxLength is negative. +*/ + { + + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + __ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes8ReAllocTooSmall)); + return((HBufC8 *)STD_CLASS::ReAlloc(this,(aMaxLength*sizeof(TUint8))+sizeof(TDesC8))); + } + +EXPORT_C HBufC8 *HBufC8::ReAllocL(TInt aMaxLength) +/** +Expands or contracts the descriptor; leaves on failure. + +This is done by: + +1. creating a new heap descriptor. + +2. copying the original data into the new descriptor. + +3. deleting the original descriptor. + +@param aMaxLength The new requested maximum length of the descriptor. + Note that the resulting heap cell size and, therefore, + the resulting maximum length of the descriptor may be + larger than requested. + +@return A pointer to the new expanded or contracted 8 bit heap descriptor - + the original descriptor is deleted. NULL, if the new 8-bit heap descriptor + cannot be created - the original descriptor remains unchanged + +@panic USER 26 if aMaxLength is less than the length of the existing data. +@panic USER 30 if aMaxLength is negative. +*/ + { + + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + __ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes8ReAllocTooSmall)); + return((HBufC8 *)STD_CLASS::ReAllocL(this,(aMaxLength*sizeof(TUint8))+sizeof(TDesC8))); + } + +EXPORT_C TPtr8 HBufC8::Des() +/** +Creates and returns an 8-bit modifiable pointer descriptor for the data +represented by this 8-bit heap descriptor. + +The content of a heap descriptor normally cannot be altered, other than by +complete replacement of the data. Creating a modifiable pointer descriptor +provides a way of changing the data. + +The modifiable pointer descriptor is set to point to this heap descriptor's +data. + +The length of the modifiable pointer descriptor is set to the length of this +heap descriptor. + +The maximum length of the modifiable pointer descriptor is set to the length +of the heap descriptor's buffer. Note that the maximum length is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length requested when this descriptor was originally created +or last re-allocated. + +When data is modified through this new pointer descriptor, the lengths of +both it and this heap descriptor are changed. + +Note that it is a common mistake to use Des() to create a TDesC8& reference. +While not incorrect, it is simpler and much more efficient to simply dereference +the heap descriptor. + +@return An 8-bit modifiable pointer descriptor representing the data in this + 8-bit heap descriptor. +*/ + { + return DoDes((STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8)); + } +#endif // __KERNEL_MODE__ + +#ifndef __DES8_MACHINE_CODED__ +EXPORT_C void TDes8::SetLength(TInt aLength) +/** +Sets the length of the data represented by the descriptor to the +specified value. + +@param aLength The new length of the descriptor. + +@panic USER 23 if alength is negative or is greater than the maximum length of + this (target) descriptor. +*/ + { + + __ASSERT_ALWAYS(TUint(aLength)<=TUint(MaxLength()),Panic(ETDes8Overflow)); + DoSetLength(aLength); + if (Type()==EBufCPtr) + ((SBufCPtr8 *)this)->ptr->length=aLength; // Relies on iType==0 for an TBufC + } + +EXPORT_C void TDes8::SetMax() +/** +Sets the length of the data to the maximum length of the descriptor. +*/ + { + + SetLength(iMaxLength); + } + +EXPORT_C void TDes8::Copy(const TUint8 *aString) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@panic USER 23 if the length of aString, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + { + + TInt len=STRING_LENGTH(aString); + SetLength(len); + memmove(WPtr(), aString, len); + } + +EXPORT_C void TDes8::Copy(const TUint8 *aBuf,TInt aLength) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aBuf The start address of data to be copied. +@param aLength The length of data to be copied. + +@panic USER 23 if aLength is greater than the maximum length of + this (target) descriptor. +*/ + { + + SetLength(aLength); + memmove(WPtr(), aBuf, aLength); + } + +EXPORT_C void TDes8::Copy(const TDesC8 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8-bit non-modifiable descriptor. The length of the data cannot + be greater than the maximum length of the target descriptor. + +@panic USER 23 if the length of aDes is greater than the maximum length of + this (target) descriptor. +*/ + { + + TInt len=aDes.Length(); + SetLength(len); + memmove(WPtr(), aDes.Ptr(), len); + } +#endif + +#ifndef __KERNEL_MODE__ +EXPORT_C void TDes8::Copy(const TDesC16 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit non-modifiable descriptor. Each double-byte value can + only be copied into the corresponding single byte when the + double-byte value is less than decimal 256. A double-byte value of + 256 or greater cannot be copied and the corresponding single byte + is set to a value of decimal 1. + +@panic USER 23 if the length of the aDes is greater than the maximum length + of this (target) descriptor. +*/ + { + + TInt len=aDes.Length(); + SetLength(len); + const TUint16 *pS=aDes.Ptr(); + const TUint16 *pE=pS+len; + TUint8 *pT=WPtr(); + while (pS=0x100) + c=1; + *pT++=(TUint8)c; + } + } +#endif + +#ifndef __DES8_MACHINE_CODED__ +EXPORT_C void TDes8::Append(TChar aChar) +/** +Appends a character onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +@param aChar The single character to be appended. The length of the descriptor + is incremented by one. The function assumes that the character + is non-Unicode and that it can be represented by a single byte. + +@panic USER 23 if the resulting new length of this descriptor is greater than + its maximum length. +*/ + { + + TInt len=Length(); + TUint8 *pB=WPtr()+len; + SetLength(len+1); + *pB++=(TUint8)aChar; + } + +EXPORT_C void TDes8::Append(const TUint8 *aBuf,TInt aLength) +/** +Appends data onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +@param aBuf A pointer to the data to be copied. +@param aLength The length of the data to be copied. + +@panic USER 23 if the resulting new length of this descriptor is greater than + its maximum length. +@panic USER 29 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative)); + TInt len=Length(); + SetLength(len+aLength); + memmove(WPtr()+len, aBuf, aLength); + } + +EXPORT_C void TDes8::Append(const TDesC8 &aDes) +/** +Appends data onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +@param aDes An 8-bit non-modifiable descriptor whose data is to be appended. + +@panic USER 23 if the resulting new length of this descriptor is greater than + its maximum length. +*/ + { + + TInt len=Length(); + TInt n=aDes.Length(); + SetLength(len+n); + memmove(WPtr()+len, aDes.Ptr(), n); + } +#endif + +#ifndef __KERNEL_MODE__ +EXPORT_C void TDes8::Append(const TDesC16 &aDes) +/** +Appends data onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +@param aDes A 16-bit non-modifiable descriptor whose data is to be appended. + Each double-byte value can only be appended as a single byte when + the double-byte value is less than decimal 256. A double-byte value + of 256 or greater cannot be appended and the corresponding single + byte is set to a value of decimal 1. + +@panic USER 23 if the resulting new length of this descriptor is greater than + its maximum length. +*/ + { + + TInt len=Length(); + TInt n=aDes.Length(); + const TUint16* pS=aDes.Ptr(); + const TUint16* pE=pS+n; + TUint8 *pT=WPtr()+len; + SetLength(len+n); + while (pS=0x100) + c=1; + *pT++=(TUint8)c; + } + } +#endif + +#ifndef __KERNEL_MODE__ +EXPORT_C void TDes8::Swap(TDes8 &aDes) +/** +Swaps the data represented by this descriptor with the data represented by +the specified descriptor. + +The lengths of both descriptors are swapped to reflect the change. + +Note that each descriptor must be capable of accommodating the contents of +the other descriptor. + +@param aDes The 8-bit modifiable descriptor whose data is to be swapped with + the data of this descriptor. + +@panic USER 23 if the maximum length of either descriptor is smaller than the + length of the other descriptor. +*/ + { + + TInt l=Length(); + TInt r=aDes.Length(); + aDes.SetLength(l); + SetLength(r); + TInt s=Min(l,r); + l-=s; + r-=s; + TUint8 *pL=WPtr(); + TUint8 *pR=aDes.WPtr(); + while (s--) + { + TChar a=(*pL); + *pL++=(*pR); + *pR++=(TUint8)a; + } + while (l--) + *pR++=(*pL++); + while (r--) + *pL++=(*pR++); + } +#endif + +#ifndef __DES8_MACHINE_CODED__ +EXPORT_C void TDes8::Fill(TChar aChar) +/** +Fills the descriptor's data area with the specified character, replacing any +existing data. + +The descriptor is filled from the beginning up to its current length. The +descriptor's length does not change. It is not filled to its maximum length. + +@param aChar The fill character. The function assumes that the character is + non-Unicode, and that it can be represented by a single byte. +*/ + { + + memset(WPtr(), (TInt)(aChar.operator TUint()), Length()); + } +#endif + +EXPORT_C void TDes8::Fill(TChar aChar,TInt aLength) +/** +Fills the descriptor's data area with the specified character, replacing any +existing data. + +The descriptor is filled with the specified number of characters. +and its length is changed to reflect this. + +@param aChar The fill character. The function assumes that the character is + non-Unicode, and that it can be represented by a single byte. +@param aLength The new length of the descriptor and the number of fill + characters to be copied into it. + +@panic USER 23 if aLength is negative or is greater than the maximum length + of this descriptor. +*/ + { + + SetLength(aLength); + memset(WPtr(), (TInt)(aChar.operator TUint()), aLength); + } + +#ifndef __KERNEL_MODE__ +EXPORT_C void TDes8::AppendFill(TChar aChar,TInt aLength) +/** +Appends and fills this descriptor with the specified character. + +The descriptor is appended with the specified number of characters. +and its length is changed to reflect this. + +@param aChar The fill character. The function assumes that the character + is non-Unicode and that it can be represented by a single byte. +@param aLength The number of fill characters to be appended. + +@panic USER 23 if aLength is negative, or the resulting length of this + descriptor is greater than its maximum length. +*/ + { + + TInt len=Length(); + SetLength(len+aLength); + memset(WPtr()+len, (TInt)(aChar.operator TUint()), aLength); + } +#endif + +#ifndef __DES8_MACHINE_CODED__ +#ifndef __KERNEL_MODE__ +EXPORT_C void TDes8::ZeroTerminate() +/** +Appends a zero terminator onto the end of this descriptor's data. + +The length of the descriptor is not changed. It must, however, be strictly +less than the descriptor's maximum length. +This condition guarantees that there is sufficient space for the +zero terminator. + +@panic USER 23 if the descriptor's length is not strictly less than its + maximum length. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(len=0,Panic(ETDes8LengthNegative)); + TUint8 *pB=WPtr(); + TInt len=Length(); + if (len && aLength) + { + while (len) + { + TInt i=Min(len,aLength); + pB=memCopy(pB,aBuf,i); + len-=i; + } + } + } + +EXPORT_C void TDes8::Repeat(const TDesC8 &aDes) +/** +Copies data with repetition into this descriptor, from another descriptor, +replacing any existing data. + +Copying proceeds until this descriptor is filled up to its current length. +If it cannot contain a whole number of copies of the source data, then the +last copy is truncated. + +@param aDes An 8-bit non-modifiable descriptor whose data is to be repeatedly + copied. +*/ + { + + Repeat(aDes.Ptr(),aDes.Length()); + } + +EXPORT_C void TDes8::Trim() +/** +Deletes leading and trailing whitespace characters from the descriptor's data. + +The length of the descriptor is reduced to reflect the loss of the whitespace characters. + +@see TDes8::TrimLeft() +@see TDes8::TrimRight() +*/ + { + + TrimLeft(); + TrimRight(); + } + +EXPORT_C void TDes8::TrimAll() +/** +Deletes leading and trailing whitespace characters from the descriptor's data and +replaces each contiguous set of whitespace characters within the data by one whitespace +character. + +The length of the descriptor is reduced to reflect the loss of the whitespace +characters. + +@see TDes8::Trim() +*/ + { + + TrimLeft(); + TrimRight(); + TUint8 *pBuf=(TUint8 *)Ptr(); + TUint8 *pSrc=pBuf; + TUint8 *pDst=pBuf; + TInt len=Length(); + TInt spaces=0; + while (len--) + { + TChar c=*pSrc; + if (c.IsSpace()) + { + if (spaces++==0) + { + if (pDst!=pSrc) + *pDst=*pSrc; + pDst++; + } + } + else + { + spaces=0; + if (pDst!=pSrc) + *pDst=*pSrc; + pDst++; + } + pSrc++; + } + Delete(pDst-pBuf, pSrc-pDst); + } + +EXPORT_C void TDes8::TrimLeft() +/** +Deletes leading whitespace characters from the descriptor's data. + +All whitespace characters up to, but not including the first non-whitespace +character, are deleted. + +The length of the descriptor is reduced to reflect the loss of the +whitespace characters. +*/ + { + + const TUint8 *pBuf=Ptr(); + const TUint8 *pB=pBuf; + TInt len=Length(); + while (len--) + { + TChar c=(*pB); + if (!c.IsSpace()) + break; + pB++; + } + Delete(0,pB-pBuf); + } + +EXPORT_C void TDes8::TrimRight() +/** +Deletes trailing whitespace characters from the descriptor's data. + +The process starts on the right hand side of the descriptor's data +and proceeds to the left. + +All whitespace characters up to, but not including the first non-whitespace character, +are deleted. + +The length of the descriptor is reduced to reflect the loss of the whitespace +characters. +*/ + { + + TInt len=Length(); + if (len==0) + return; + const TUint8 *pB=Ptr()+len-1; + TInt s=len; + while (s) + { + TChar c=(*pB--); + if (!c.IsSpace()) + break; + s--; + } + Delete(s,len-s); + } + +EXPORT_C void TDes8::Insert(TInt aPos,const TDesC8 &aDes) +/** +Inserts data into this descriptor. + +The length of this descriptor is changed to reflect the extra data. + +@param aPos The position within the data where insertion is to start. This + is an offset value; a zero value refers to the leftmost data + position. + +@param aDes An 8 bit non modifiable descriptor whose data is to be inserted. + +@panic USER 22 if aPos is negative or is greater than the length of this + descriptor. +@panic USER 23 if the resulting length of this descriptor is greater than its + maximum length. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange)); + TInt s=aDes.Length(); + __ASSERT_ALWAYS((len+s)<=MaxLength(),Panic(ETDes8Overflow)); + TUint8 *pB=WPtr(); + memmove(pB+aPos+s,pB+aPos,len-aPos); + memmove(pB+aPos,aDes.Ptr(),aDes.Length()); + SetLength(len+s); + } + +EXPORT_C void TDes8::Delete(TInt aPos,TInt aLength) +/** +Deletes data from this descriptor. + +The length of this descriptor is changed to reflect the loss of data. + +@param aPos The position within the data where deletion is to start. This + is an offset value; a zero value refers to the leftmost data + position. + +@param aLength The length of data to be deleted. If necessary, the function + adjusts this value to ensure that no data beyond the end of the + descriptor data area is deleted. + +@panic USER 22 if aPos is negative or is greater than the length of this + descriptor. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange)); + TInt d=Min(len-aPos,aLength); + TUint8 *pB=WPtr(); + memmove(pB+aPos,pB+aPos+d,len-aPos-d); + SetLength(len-d); + } + +EXPORT_C void TDes8::Replace(TInt aPos,TInt aLength,const TDesC8 &aDes) +/** +Replaces data in this descriptor. + +The specified length can be different to the length of the replacement data. +The length of this descriptor changes to reflect the change of data. + +@param aPos The position within the data where replacement is to start. + This is an offset value; a zero value refers to the leftmost + data position. + +@param aLength The length of data to be replaced. + +@param aDes The source 8-bit non-modifiable descriptor whose data is to + replace the target descriptor's data at aPos. + +@panic USER 20 if aLength is negative or the sum of aLength and aPos is + greater than the length of this descriptor. + +@panic USER 22 if aPos is negative or is greater than the length of this + descriptor. + +@panic USER 23 if the resulting length of this descriptor is greater than its + maximum length. + +@panic USER 28 if the length of the source descriptor aDes is negative or is + greater than the maximum length of this target descriptor, +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange)); + __ASSERT_ALWAYS(aLength>=0 && aPos+aLength<=len,Panic(ETDes8LengthOutOfRange)); + TInt s=aDes.Length(); + TInt maxlen=MaxLength(); + __ASSERT_ALWAYS(s>=0 && s<=maxlen,Panic(ETDes8RemoteLengthOutOfRange)); + __ASSERT_ALWAYS((len+s-aLength)<=maxlen,Panic(ETDes8Overflow)); + TUint8 *pB=WPtr(); + memmove(pB+aPos+s,pB+aPos+aLength,len-aPos-aLength); + memmove(pB+aPos,aDes.Ptr(),s); + SetLength(len+s-aLength); + } + +EXPORT_C void TDes8::Justify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Copies data into this descriptor and justifies it, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The target area is considered to be an area of specified width positioned at +the beginning of this descriptor's data area. Source data is copied into, and +aligned within this target area according to the specified alignment +instruction. + +If the length of the target area is larger than the length of the source, then +spare space within the target area is padded with the fill character. + +@param aDes An 8-bit non-modifiable descriptor containing the source data. + The length of the data to be copied is the smaller of: + the length of the source descriptor, and + the width of the target area (only if this is not the + explicit negative value KDefaultJustifyWidth). + +@param aWidth The width of the target area. If this has the specific + negative value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area + +@param aFill The fill character used to pad the target area. + +@panic USER 23 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + Zero(); + AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes8::AppendJustify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends data onto the end of this descriptor's data and justifies it. + +The source of the appended data is an existing descriptor. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aDes An 8-bit non-modifiable descriptor containing the source + data. The length of the data to be copied is the smaller of: + the length of the source descriptor, and + the width of the target area (only if this is not the + explicit negative value KDefaultJustifyWidth). + +@param aWidth The width of the target area. If this has the specific + negative value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 23 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes8::AppendJustify(const TDesC8 &aDes,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends data onto the end of this descriptor's data and justifies it. + +The source of the appended data is an existing descriptor. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aDes An 8-bit non-modifiable descriptor containing the source data. + +@param aLength The length of data to be copied from the source descriptor. + If this is greater than the width of the target area, then + the length of data copied is limited to the width. + The length of data to be copied must not be greater than + the length of the source descriptor. Note that this + condition is not automatically tested. + +@param aWidth The width of the target area. If this has the specific negative + value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 23 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + AppendJustify(aDes.Ptr(),aLength,aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes8::AppendJustify(const TUint8 *aString,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends a zero terminated string onto the end of this descriptor's data and +justifies it. + +The zero terminator is not copied. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within, this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aString A pointer to a zero terminated string. The length of the + data to be copied is the smaller of: + the length of the string (excluding the zero terminator), + and the width of the target area (only if this is not the + explicit negative value KDefaultJustifyWidth). + +@param aWidth The width of the target area. If this has the specific + negative value KDefaultJustifyWidth, then the width + is re-set to the length of the zero terminated string + (excluding the zero terminator). + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 23 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. +*/ + { + + AppendJustify(aString,STRING_LENGTH(aString),aWidth,anAlignment,aFill); + } + +EXPORT_C void TDes8::AppendJustify(const TUint8 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill) +/** +Appends data onto the end of this descriptor's data and justifies it. + +The source of the appended data is a memory location. + +The target area is considered to be an area of specified width, immediately +following this descriptor's existing data. Source data is copied into, and +aligned within, this target area according to the specified alignment instruction. + +If the length of the target area is larger than the length of the source, +then spare space within the target area is padded with the fill character. + +@param aString A pointer to a source memory location. + +@param aLength The length of data to be copied. If this is greater than the + width of the target area, then the length of data copied is + limited to the width. + +@param aWidth The width of the target area. If this has the specific + negative value KDefaultJustifyWidth, then the width is + re-set to the length of the data source. + +@param anAlignment The alignment of the data within the target area. + +@param aFill The fill character used to pad the target area. + +@panic USER 23 if the resulting length of this descriptor is greater than + its maximum length or aWidth has a negative value other + than KDefaultJustifyWidth. + +@panic USER 29 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative)); + if (aWidth==KDefaultJustifyWidth) + aWidth=aLength; + if (aLength>aWidth) + aLength=aWidth; + TInt offset=Length(); + AppendFill(aFill,aWidth); + TInt r=aWidth-aLength; + if (anAlignment==ECenter) + r>>=1; + else if (anAlignment==ELeft) + r=0; + memmove(WPtr()+offset+r,aString,aLength); + } +#endif // __KERNEL_MODE__ + +EXPORT_C void TDes8::Num(TInt64 aVal) +// +// Convert a TInt64 to the descriptor. +// +/** +Converts the 64-bit signed integer into a decimal character representation +and copies the conversion into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +If the integer is negative, the character representation is prefixed by a +minus sign. + +@param aVal The 64-bit signed integer value. +*/ + { + Zero(); + AppendNum(aVal); + } + +EXPORT_C void TDes8::Num(TUint64 aVal, TRadix aRadix) +/** +Converts the specified 64-bit unsigned integer into a character representation +based on the specified number system and copies the conversion into this descriptor, +replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +@param aVal The 64-bit integer value. This is treated as an unsigned value. +@param aRadix The number system representation for the 64-bit integer. +*/ + { + Zero(); + AppendNum(aVal, aRadix); + } + +EXPORT_C void TDes8::NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and copies the conversion +into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The function generates the exact number of specified characters, either padding +to the left with character zeroes or discarding low order characters as necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +This function is equivalent to using Format() with parameters which specify: + +1. a fixed length target field + +2. padding with zero characters, for example "%08x". + +When this is the case, always use NumFixedWidth() in preference +to Format() as it is more efficient. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters: to be used to contain the conversion, + to be copied into this descriptor. + +@see TDes8::Format() +*/ + { + + Zero(); + AppendNumFixedWidth(aVal,aRadix,aWidth); + } + +#ifndef __KERNEL_MODE__ +EXPORT_C void TDes8::NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and copies the conversion +into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The function generates the exact number of specified characters, either padding +to the left with character zeroes or discarding low order characters as +necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +This function is equivalent to using Format() with parameters which specify: + +1. a fixed length target field + +2. padding with zero characters, for example "%08x". + +When this is the case, always use NumFixedWidthUC() in +preference to Format() as it is more efficient. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters to be used to contain the conversion, + and to be copied into this descriptor. + +@see TDes8::Format() +*/ + { + + Zero(); + AppendNumFixedWidthUC(aVal,aRadix,aWidth); + } + +EXPORT_C void TDes8::NumUC(TUint64 aVal, TRadix aRadix) //NOT __KERNEL_MODE__ +/** +Converts the specified 64-bit unsigned integer into a character representation +based on the specified number system and copies the conversion into this descriptor, +replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +@param aVal The 64-bit integer value. This is treated as an unsigned value. +@param aRadix The number system representation for the 64-bit integer. If no + explicit value is specified, then EDecimal is the default. +*/ + { + Zero(); + AppendNumUC(aVal,aRadix); + } +#endif // __KERNEL_MODE__ + +EXPORT_C void TDes8::AppendNum(TInt64 aVal) +/** +Converts the 64-bit signed integer into a decimal character representation +and appends the conversion onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +If the integer is negative, the character representation is prefixed by a +minus sign. + +@param aVal The 64-bit signed integer value. +*/ + { + if (aVal < 0) + { + Append('-'); + aVal = -aVal; + } + + AppendNum(aVal, EDecimal); + } + +#ifndef __DES_MACHINE_CODED__ +GLDEF_C TInt __DoConvertNum(TUint aVal, TRadix aRadix, TUint aA, TUint8*& aDest) + { + __KERNEL_CHECK_RADIX(aRadix); + TUint radix = (TUint)aRadix; + TUint8* p = aDest; + TBool out16 = (aA>255); + aA &= 0xff; + do { + TUint q = aVal/radix; + TUint c = aVal-q*radix; + (c>9) ? c+=(aA-10) : c+='0'; + aVal = q; + if (out16) + *--p = 0; + *--p = (TUint8)c; + } while (aVal); + TInt l = aDest - p; + aDest = p; + return l; + } + +GLDEF_C TInt __DoConvertNum(TUint64 aVal, TRadix aRadix, TUint aA, TUint8*& aDest) + { + __KERNEL_CHECK_RADIX(aRadix); + TUint radix = (TUint)aRadix; + TUint8* p = aDest; + TBool out16 = (aA>255); + TUint8 a = static_cast(aA); + while (aVal >= UI64LIT(0x100000000)) + { + TUint8 c = static_cast(aVal % radix); + aVal /= radix; + (c > 9) ? c = static_cast(c + a - 10) : c = static_cast(c + '0'); + if (out16) + *--p = 0; + *--p = c; + } + TInt l = aDest - p; + aDest = p; + return l + __DoConvertNum((TUint)aVal, aRadix, aA, aDest); + } +#endif + +void TDes8::DoPadAppendNum(TInt l, TInt aW, const TUint8* p) + { + if (aW<=0) + { + Append(p, l); + return; + } + TInt l0 = Length(); + SetLength(l0 + aW); + TUint8* d = WPtr() + l0; + for (; aW>l; --aW) *d++ = (TUint8)'0'; + memcpy(d, p, aW); + } + +void TDes8::DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW) +// +// Convert a TUint64 into the descriptor. +// + { + TUint8 buf[APPEND_BUF_SIZE_64]; + TUint8* p = buf + APPEND_BUF_SIZE_64; + TInt l = __DoConvertNum(aVal, aRadix, aA, p); + DoPadAppendNum(l, aW, p); + } + +EXPORT_C void TDes8::AppendNum(TUint64 aVal, TRadix aRadix) +/** +Converts the specified 64-bit unsigned integer into a character representation +based on the specified number system and appends the conversion onto the end +of this descriptor's data. The length of this descriptor is incremented to +reflect the new content + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +@param aVal The 64-bit integer value. This is treated as an unsigned value. +@param aRadix The number system representation for the 64-bit integer. +*/ + { + DoAppendNum(aVal, aRadix, 'a', 0); + } + +EXPORT_C void TDes8::AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and appends the conversion +onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function generates the exact number of specified characters, either padding +to the left with character zeroes or discarding low order characters as +necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +lower case. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters to be used to contain the conversion, + and to be appended to this descriptor. +*/ + { + DoAppendNum(aVal, aRadix, 'a', aWidth); + } + +#if (!defined(__DES8_MACHINE_CODED__) && !defined(__KERNEL_MODE__)) +EXPORT_C TPtr8 TDes8::LeftTPtr(TInt aLength) const +/** +Extracts the leftmost part of the data. + +The function does not cut or remove any data but constructs a modifiable +pointer descriptor to represent the leftmost part of the data. + +@param aLength The length of the data to be extracted. If this value + is greater than the length of the descriptor, the function + extracts the whole of the descriptor. + +@return The 8-bit modifiable pointer descriptor representing the leftmost + part of the data. + +@panic USER 22 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange)); + TInt len=Min(aLength,Length()); + return(TPtr8((TUint8*)Ptr(),len,len)); + } + +EXPORT_C TPtr8 TDes8::RightTPtr(TInt aLength) const +/** +Extracts the rightmost part of the data. + +The function does not cut or remove any data but constructs a modifiable +pointer descriptor to represent the rightmost part of the data. + +@param aLength The length of data to be extracted. If this value + is greater than the length of the descriptor, the function + extracts the whole of the descriptor. + +@return The 8 bit modifiable pointer descriptor representing the rightmost + part of the data. + +@panic USER 22 if aLength is negative. +*/ + { + + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange)); + TInt len=Length(); + if (aLength>len) + aLength=len; + return(TPtr8((TUint8*)Ptr()+len-aLength,aLength,aLength)); + } + +EXPORT_C TPtr8 TDes8::MidTPtr(TInt aPos) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a modifiable +pointer descriptor to represent the defined portion. + +The portion is identified by its starting position and by the length of the +remainder of the data starting from the specified position. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. + +@return The 8-bit modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 22 if aPos is negative or aPos is greater than the + length of the descriptor. +*/ + { + + TInt len=Length(); + __ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange)); + return(TPtr8((TUint8*)Ptr()+aPos,len-aPos,len-aPos)); + } + +EXPORT_C TPtr8 TDes8::MidTPtr(TInt aPos,TInt aLength) const +/** +Extracts a portion of the data. + +The function does not cut or remove any data but constructs a modifiable +pointer descriptor to represent the defined portion. + +The portion is identified by its starting position and by its length. + +@param aPos The starting position of the data to be extracted. This is an + offset value; a zero value refers to the leftmost data position. +@param aLength The length of data to be extracted. + +@return The 8 bit modifiable pointer descriptor representing the specified + portion of the data. + +@panic USER 22 if aPos is negative or aPos plus aLength is greater than the + length of the descriptor. +*/ + { + + __ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes8PosOutOfRange)); + return(TPtr8((TUint8*)Ptr()+aPos,aLength,aLength)); + } +#endif + +#ifndef __KERNEL_MODE__ +EXPORT_C void TDes8::AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth) +/** +Converts the specified unsigned integer into a fixed width character +representation based on the specified number system and appends the conversion +onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function generates the exact number of specified characters, either +padding to the left with character zeroes or discarding low order characters +as necessary. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +@param aVal The unsigned integer value. +@param aRadix The number system representation for the unsigned integer. +@param aWidth The number of characters to be used to contain the conversion, + and to be appended to this descriptor. +*/ + { + DoAppendNum(aVal, aRadix, 'A', aWidth); + } + +EXPORT_C void TDes8::AppendNumUC(TUint64 aVal, TRadix aRadix) +/** Converts the specified 64-bit unsigned integer into a character +representation based on the specified number system and appends the conversion +onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +When a hexadecimal conversion is specified, hexadecimal characters are in +upper case. + +@param aVal The 64-bit integer value. This is treated as an unsigned value. +@param aRadix The number system representation for the 64-bit integer. If no + explicit value is specified, then EDecimal is the default. +*/ + { + DoAppendNum(aVal, aRadix, 'A', 0); + } + +EXPORT_C void TDes8::Format(TRefByValue aFmt,...) +/** +Formats and copies text into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The function takes a format string and a variable number of arguments. +The format string contains literal text embedded with directives for converting +the trailing list of arguments into text. + +The embedded directives are character sequences prefixed with the '%' character. +The literal text is simply copied into this descriptor unaltered while +the '%' directives are used to convert successive arguments from the +trailing list. + +The resulting stream of literal text and converted arguments is copied into +this descriptor. + +The syntax of the embedded directives follows one of four general patterns. + +Note that formatting of single numerical values can be achieved more +conveniently using the Num() and NumUC() member functions of this class. + +The full description of the syntax of a format string cannot be included here. +For full details, navigate to the Symbian OS guide, and follow the hierarchy of links: + +@code +Symbian OS Guide + Base + Using User Library (E32) + Buffers and Strings + Using Descriptors + How to Use Descriptors + Format string syntax +@endcode + +@param aFmt The descriptor containing the format string. + The TRefByValue class provides a constructor which takes a + TDesC8 type. + +@param ... A variable number of arguments to be converted to text as + dictated by the format string. + +@panic USER 23 if the resulting length of text in this descriptor exceeds + the descriptor's maximum length. +@panic USER 24 if the format string has incorrect syntax. + +@see TDes8::Num() +@see TDes8::NumUC() +*/ + { + + VA_LIST list; + VA_START(list,aFmt); + FormatList(aFmt,list); + } + +EXPORT_C void TDes8::FormatList(const TDesC8 &aFmt,VA_LIST aList) +/** +Formats and copies text into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The behaviour of this function is the same as Format(). In practice, it is +better and easier to use Format(), passing a variable number of arguments +as required by the format string. + +@param aFmt The descriptor containing the format string. +@param aList A pointer to an argument list. + +@see TDes8::Format() +@see VA_LIST +*/ + { + + Zero(); + AppendFormatList(aFmt,aList); + } + +EXPORT_C void TDes8::AppendFormat(TRefByValue aFmt,TDes8Overflow *aOverflowHandler,...) +/** +Formats and appends text onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function takes a format string and a variable number of arguments. +The format string contains literal text, embedded with directives, +for converting the trailing list of arguments into text. + +The embedded directives are character sequences prefixed with the '%' character. +The literal text is simply copied into this descriptor unaltered while +the '%' directives are used to convert successive arguments from the +trailing list. See the description of the Format() function. + +Literal text is appended on a character by character basis. +If it results in the length of this descriptor exceeding its maximum length, +then the function: + +1. calls the Overflow() member function of the overflow handler, if an overflow + handler is supplied +2 raises a USER 23 panic, if no overflow handler is supplied. + +As much literal text as possible will have been copied into this descriptor +and this descriptor will have reached its maximum length. + +Text converted from a trailing argument is appended as a complete string. +If an attempt to append this string fails because the resulting length +of this descriptor would exceed its maximum length, then the function: + +1. calls the Overflow() member function of the overflow handler, if an overflow + handler is supplied + +2 raises a USER 23 panic, if no overflow handler is supplied. + +None of the generated text is appended and length of this descriptor +may be less than the maximum. + +@param aFmt The 8-bit non-modifiable descriptor containing the + format string. The TRefByValue class provides a + constructor which takes a TDesC8 type. + +@param aOverflowHandler A pointer to the overflow handler. + +@param ... A variable number of arguments to be converted to text + as dictated by the format string. + +@panic USER 23 if the length of the descriptor exceeds its maximum length and + no overflow handler has been supplied. +@panic USER 24 if the format string has incorrect syntax. + +@see TDes8::Format() +@see TDes8Overflow::Overflow() +*/ + { + + VA_LIST list; + VA_START(list, aOverflowHandler); + AppendFormatList(aFmt,list,aOverflowHandler); + } + +EXPORT_C void TDes8::AppendFormat(TRefByValue aFmt,...) +/** +Formats and appends text onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The function takes a format string and a variable number of arguments. +The format string contains literal text, embedded with directives, +for converting the trailing list of arguments into text. + +The embedded directives are character sequences prefixed with the '%' character. +The literal text is simply copied into this descriptor unaltered while +the '%' directives are used to convert successive arguments from the +trailing list. See the description of the Format() function. + +Literal text is appended on a character by character basis. + +Text converted from a trailing argument is appended as a complete string. + +@param aFmt The 8-bit non-modifiable descriptor containing the + format string. The TRefByValue class provides a + constructor which takes a TDesC8 type. + +@param ... A variable number of arguments to be converted to text + as dictated by the format string. + + +@panic USER 23 if the resulting length of text in this descriptor exceeds + the descriptor's maximum length. +@panic USER 24 if the format string has incorrect syntax. + +@see TDes8::Format() +*/ + { + + VA_LIST list; + VA_START(list,aFmt); + AppendFormatList(aFmt,list); + } +#endif // __KERNEL_MODE__ + +#if !defined(__DES8_MACHINE_CODED__) | defined(__EABI_CTORS__) +EXPORT_C TPtrC8::TPtrC8() + : TDesC8(EPtrC,0),iPtr(0) +/** +Default constructor. + +Constructs an empty 8-bit non-modifiable pointer descriptor. + +It represents no data and its length is zero. + +The non-modifiable pointer descriptor can, subsequently, be set to represent +data. + +@see TPtrC8::Set() +*/ + {} + +EXPORT_C TPtrC8::TPtrC8(const TDesC8 &aDes) + : TDesC8(EPtrC,aDes.Length()),iPtr(aDes.Ptr()) +/** +Constructs the 8-bit non-modifiable pointer descriptor from any existing +descriptor. + +It is set to point to the same data and is given the same length as the source +descriptor. + +@param aDes A reference to an 8bit non-modifiable descriptor. +*/ + {} + +EXPORT_C TPtrC8::TPtrC8(const TUint8 *aString) + : TDesC8(EPtrC,STRING_LENGTH(aString)),iPtr(aString) +/** +Constructs the 8-bit non-modifiable pointer descriptor to point to a zero +terminated string, whether in RAM or ROM. + +The length of the descriptor is set to the length of the zero terminated +string, excluding the zero terminator. + +@param aString A pointer to a zero terminated string. +*/ + {} + +EXPORT_C TPtrC8::TPtrC8(const TUint8 *aBuf,TInt aLength) + : TDesC8(EPtrC,aLength),iPtr(aBuf) +/** +Constructs the 8-bit non-modifiable pointer descriptor to point to the +specified location in memory, whether in RAM or ROM. + +The length of the descriptor is set to the specified length. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aLength The length of the descriptor. This value must be non-negative. + +@panic USER 29 if aLength is negative. +*/ + { + __ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative)); + } + +EXPORT_C TPtr8::TPtr8(TUint8 *aBuf,TInt aMaxLength) + : TDes8(EPtr,0,aMaxLength),iPtr(aBuf) +/** +Constructs the 8-bit modifiable pointer descriptor to point to the specified +location in memory, whether in RAM or ROM. + +The length of the descriptor is set to zero and its maximum length is set +to the specified value. + +@param aBuf A pointer to the location that the descriptor is to + represent. + +@param aMaxLength The maximum length of the descriptor. + +@panic USER 30 if aMaxLength is negative. +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + } + +EXPORT_C TPtr8::TPtr8(TUint8 *aBuf,TInt aLength,TInt aMaxLength) + : TDes8(EPtr,aLength,aMaxLength),iPtr(aBuf) +/** +Constructs the 8-bit modifiable pointer descriptor to point to the specified +location in memory, whether in RAM or ROM. + +The length of the descriptor and its maximum length are set to the specified +values. + +@param aBuf A pointer to the location that the descriptor is + to represent. +@param aLength The length of the descriptor. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 20 if aLength is negative, or is greater than the descriptor's + maximum length, +@panic USER 30 if aMaxLength is negative. +*/ + { + __ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + __ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes8LengthOutOfRange)); + } + +EXPORT_C TPtr8::TPtr8(TBufCBase8 &aLcb,TInt aMaxLength) + : TDes8(EBufCPtr,aLcb.Length(),aMaxLength),iPtr((TUint8*)&aLcb) + { + __ASSERT_DEBUG(aLcb.Length()<=aMaxLength,Panic(ETDes8LengthOutOfRange)); + } + +EXPORT_C TBufBase8::TBufBase8(TInt aMaxLength) + :TDes8(EBuf,0,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + } + +EXPORT_C TBufBase8::TBufBase8(TInt aLength,TInt aMaxLength) + :TDes8(EBuf,aLength,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + __ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes8LengthOutOfRange)); + } + +EXPORT_C TBufBase8::TBufBase8(const TUint8* aString,TInt aMaxLength) + :TDes8(EBuf,0,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + Copy(aString); + } + +EXPORT_C TBufBase8::TBufBase8(const TDesC8& aDes,TInt aMaxLength) + :TDes8(EBuf,0,aMaxLength) + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative)); + Copy(aDes); + } + +#endif + +// Truncate literal string to fit into descriptor +EXPORT_C void TDes8IgnoreOverflow::Overflow(TDes8& /*aDes*/) + {} + +#ifndef __KERNEL_MODE__ +EXPORT_C void TDesC8::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + switch (Type()) + { + case EBufC: + case EPtrC: + case EPtr: + case EBuf: + case EBufCPtr: + break; + default: + User::Invariant(); + } +#endif + } + +EXPORT_C void TPtrC8::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDesC8::__DbgTestInvariant(); // Test base class + if (Type()!=EPtrC) + User::Invariant(); +#endif + } + +EXPORT_C void TDes8::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDesC8::__DbgTestInvariant(); // Test base class + if (Length()>MaxLength() || !(Type()==EPtr || Type()==EBufCPtr || Type()==EBuf)) + User::Invariant(); +#endif + } + +EXPORT_C void HBufC8::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDesC8::__DbgTestInvariant(); // Test base class + if (Length()>(TInt)(User::AllocLen(this)-sizeof(TDesC8)) || Type()!=EBufC) + User::Invariant(); +#endif + } + +EXPORT_C void TPtr8::__DbgTestInvariant() const +// +// Test that the class obeys its invariant. +// + { + +#if defined(_DEBUG) + TDes8::__DbgTestInvariant(); // Test base class + if (!(Type()==EPtr || Type()==EBufCPtr)) + User::Invariant(); +#endif + } + +/** Expand all characters from 8 to 16 bits + +@return 16-bit pointer descriptor to transformed text + +The length of descriptor increased by 2 (length *= 2). + +@panic USER 187 if either the descriptor length or the maximum length is odd +or data pointer is not aligned by 2-bytes boundary +*/ +EXPORT_C TPtr16 TDes8::Expand() + { + TInt l = Length(); + TInt ml = MaxLength(); + const TText8* s0 = Ptr(); + const TText8* s = s0 + l; + __ASSERT_ALWAYS( !((ml|(TInt)s0)&1), Panic(EDes8ExpandOdd) ); + SetLength(l<<1); + TText16* d = ((TText16*)s0) + l; + while (s > s0) + *--d = *--s; + return TPtr16(d, l, ml>>1); + } + + +/** Collapse all characters from 16 to 8 bits + +The length of descriptor truncated by 2 (length /= 2). + +@panic USER 188 if either the descriptor length or the maximum length is odd +or data pointer is not aligned by 2-bytes boundary. +*/ + +EXPORT_C void TDes8::Collapse() + { + TInt l = Length(); + TInt ml = MaxLength(); + TText8* d = (TText8*)Ptr(); + __ASSERT_ALWAYS( !((l|ml|(TInt)d)&1), Panic(EDes8CollapseOdd) ); + const TText16* s = (const TText16*)d; + const TText16* sE = s + (l>>1); + while (s < sE) + *d++ = (TText8)*s++; + SetLength(l>>1); + } +#else // __KERNEL_MODE__ + +EXPORT_C TInt TDesC8::CompareF(const TDesC8 &aDes) const +/** +Compares this descriptor's folded data with the specified descriptor's folded +data. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for comparing strings in natural language; +use CompareC() for this. + +@param aDes The 8-bit non modifable descriptor whose data is to be compared + with this descriptor's data. + +@return Positive, if this descriptor is greater than the specified descriptor. + Negative, if this descriptor is less than the specified descriptor. + Zero, if both descriptors have the same length and the their contents + are the same. + +@see TDesC8::Compare() +*/ + { + + TInt ll = Length(); + TInt rl = aDes.Length(); + TInt r = memicmp(Ptr(), aDes.Ptr(), Min(ll, rl)); + if (r == 0) + r = ll - rl; + return r; + } + +#endif // __KERNEL_MODE__ + +#ifndef __KERNEL_MODE__ + +/** +Default constructor. + +Constructs a zero-length 8-bit resizable buffer descriptor. + +Note that the object owns no allocated memory. +*/ +EXPORT_C RBuf8::RBuf8() + :TDes8(EPtr,0,0),iEPtrType(NULL) + { + // Zero-length RBuf8 is of type EPtr with NULL pointer. + } + + + + +/** +Constructor. + +Constructs an 8-bit resizable buffer descriptor, transferring ownership of the +specified heap descriptor to this object. + +@param aHBuf The heap descriptor to be transferred to this object. This pointer + can be NULL, which means that a zero length 8-bit resizable + buffer descriptor is constructed, and the object will not own any + allocated memory. +*/ +EXPORT_C RBuf8::RBuf8(HBufC8* aHBuf) + { + if(aHBuf) + //Create EBufCPtr type descriptor that points to aHBuf + new(this) TPtr8(aHBuf->Des()); + else + //Create zero-length RBuf8. It is EPtr type of descriptor that points to NULL. + new(this) RBuf8(); + } + + + + +/** +Protected constructor. +*/ +EXPORT_C RBuf8::RBuf8(TInt aType,TInt aLength,TInt aMaxLength) + :TDes8(aType,aLength,aMaxLength) + { + } + + + + +/** +Transfers ownership of the specified 8-bit resizable buffer descriptor's +buffer to this object. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aRBuf The source 8-bit resizable buffer. The ownership of this + object's buffer is to be transferred. + +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::Assign(const RBuf8& aRBuf) + { + Mem::Copy(this, &aRBuf, sizeof(RBuf8)); + __TEST_INVARIANT; + } + + + + +/** +Assigns ownership of the specified allocated memory to this object. + +The allocated memory forms the buffer for this descriptor. The current length +of the descriptor is set to zero. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aHeapCell The allocated memory to be assigned to this object. This + pointer can be NULL, which means that a zero length 8-bit + resizable buffer descriptor is created. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 20 If the specified maximum length is greater then the size of + the allocated heap cell, or the specified maximum length + is NOT zero when the pointer to the heap cell is NULL. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::Assign(TUint8 *aHeapCell,TInt aMaxLength) + { + Assign(aHeapCell,0,aMaxLength); + } + + + + +/** +Assigns ownership of the specified allocated memory to this object. + +The allocated memory forms the buffer for this descriptor. The current length +of the descriptor is set to the value of the second parameter. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aHeapCell The allocated memory to be assigned to this object. +@param aLength The length of the descriptor. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 20 If the specified maximum length is greater then the size of + the allocated heap cell, or the specified length is greater then + the specified maximum length, or the specified maximum length + is NOT zero when the pointer to the heap cell is NULL. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::Assign(TUint8 *aHeapCell,TInt aLength,TInt aMaxLength) + { + __ASSERT_ALWAYS(aLength<=aMaxLength, Panic(ETDes8LengthOutOfRange)); + if(aHeapCell) + { + __ASSERT_ALWAYS(User::AllocLen(aHeapCell) >= aMaxLength * (TInt)sizeof(TUint8), Panic(ETDes8LengthOutOfRange)); + //Create EPtr type descriptor that points to aHeapCell + new(this) TPtr8(aHeapCell,aLength,aMaxLength); + } + else + { + __ASSERT_ALWAYS(aMaxLength == 0, Panic(ETDes8LengthOutOfRange)); + //Create zero-length RBuf. It is EPtr type of descriptor that points to NULL. + new(this) RBuf8(); + } + __TEST_INVARIANT; + } + + + + +/** +Transfers ownership of the specified heap descriptor to this object. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aHBuf The heap descriptor to be transferred to this object. + This pointer can be NULL, which means that a zero length + 8-bit resizable buffer descriptor is created. +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::Assign(HBufC8* aHBuf) + { + new(this) RBuf8(aHBuf); + } + + + + +/** +Swaps the content of two 8-bit resizable buffer descriptors. + +@param aRBuf The 8-bit resizable buffer descriptor whose contents are to be + swapped with this one. +*/ +EXPORT_C void RBuf8::Swap(RBuf8& aRBuf) + { + Mem::Swap(this,&aRBuf,sizeof(*this)); + } + + + + +/** +Creates an 8-bit resizable buffer descriptor. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +The current length of the descriptor is set to zero. The maximum length of +the descriptor is set to the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The maximum length of the descriptor. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see RBuf8::Close() +*/ +EXPORT_C TInt RBuf8::Create(TInt aMaxLength) + { + if (aMaxLength) + { + //Allocate memory + TUint8* buf=(TUint8*)User::Alloc(aMaxLength*sizeof(TUint8)); + if(!buf) return KErrNoMemory; + iEPtrType = buf; + } + else + iEPtrType = NULL; //Zero-length descriptor. + + + //Create EPtr type descriptor. + new(this) RBuf8(EPtr,0,aMaxLength); + __TEST_INVARIANT; + return KErrNone; + } + + + + +/** +Creates an 8-bit resizable buffer descriptor, and leaves on failure. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +The current length of the descriptor is set to zero. The maximum length of +the descriptor is set to the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The length and the maximum length of the descriptor. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::CreateL(TInt aMaxLength) + { + User::LeaveIfError(Create(aMaxLength)); + } + + + + +/** +Creates an 8-bit resizable buffer descriptor. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +Both the current length and the maximum length of the descriptor are set to +the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The length and the maximum length of the descriptor. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see RBuf8::Close() +*/ +EXPORT_C TInt RBuf8::CreateMax(TInt aMaxLength) + { + TInt err=Create(aMaxLength); + if(err==KErrNone) + SetMax(); + return err; + } + + + + +/** +Creates an 8-bit resizable buffer descriptor, and leaves on failure. + +The function allocates sufficient memory to contain descriptor data up to +the specified maximum length. + +Both the current length and the maximum length of the descriptor are set to +the specified value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aMaxLength The length and the maximum length of the descriptor. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::CreateMaxL(TInt aMaxLength) + { + User::LeaveIfError(CreateMax(aMaxLength)); + } + + + + +/** +Creates a 8-bit resizable buffer descriptor to contain a copy of the +specified (source) descriptor. + +The function allocates sufficient memory so that this descriptor's maximum +length is the same as the length of the source descriptor. Both the current +length and the maximum length of this descriptor are set to +the length of the source descriptor. + +The data contained in the source descriptor is copied into this +descriptor. + +Note that the function assumes that this descriptor does not +already own any allocated memory. It does not check, nor does it free any +pre-existing owned allocated memory. If this descriptor does already own +allocated memory, RBuf8::Close() should be invoked on this descriptor before +this function is invoked. + +@param aDes Source descriptor to be copied into this object. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see TDes8::Copy() +@see RBuf8::Close() +*/ +EXPORT_C TInt RBuf8::Create(const TDesC8& aDes) + { + return Create(aDes,aDes.Length()); + } + + + + +/** +Creates an 8-bit resizable buffer descriptor to contain a copy of the specified +(source) descriptor, and leaves on failure. + +The function allocates sufficient memory so that this descriptor's maximum +length is the same as the length of the source descriptor.Both the current +length and the maximum length of this descriptor are set to the length +of the source descriptor. + +The data contained in the source descriptor is copied into this descriptor. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any +pre-existing owned allocated memory. If this descriptor does already own +allocated memory, RBuf8::Close() should be invoked on this descriptor before +this function is invoked. + +@param aDes Source descriptor to be copied into this object. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see TDes8::Copy() +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::CreateL(const TDesC8& aDes) + { + CreateL(aDes,aDes.Length()); + } + + + + +/** +Creates an 8-bit resizable buffer descriptor to contain a copy of the +specified (source) descriptor. + +The function allocates sufficient memory so that this descriptor's maximum length +is the same as the value of the aMaxLength parameter. + +The data contained in the source descriptor is copied into this descriptor. +The length of data copied is either + +- the length of the source descriptor aDes + +or + +- the value of the aMaxLength parameter + +whichever is the smaller value. The current length of this descriptor is also +set to the smaller value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aDes Source descriptor to be copied into this object. + +@param aMaxLength The maximum length of this descriptor. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see TDes8::Copy() +@see RBuf8::Close() +*/ +EXPORT_C TInt RBuf8::Create(const TDesC8& aDes,TInt aMaxLength) + { + TInt err=Create(aMaxLength); + if(err==KErrNone) + Copy(aDes.Left(aMaxLength)); + return err; + } + + + + +/** +Creates an 8-bit resizable buffer descriptor to contain a copy of the specified +(source) descriptor, and leaves on failure. + +The function allocates sufficient memory so that this descriptor's maximum +length is the same as the value of the aMaxLength parameter. + +The data contained in the source descriptor is copied into this descriptor. +The length of data copied is either + +- the length of the source descriptor aDes + +or + +- the value of the aMaxLength parameter + +whichever is the smaller value. The current length of this descriptor is also +set to the smaller value. + +Note that the function assumes that this descriptor does not already own any +allocated memory. It does not check, nor does it free any pre-existing owned +allocated memory. If this descriptor does already own allocated memory, +RBuf8::Close() should be invoked on this descriptor before this function is +invoked. + +@param aDes Source descriptor to be copied into this object. + +@param aMaxLength The maximum length of this descriptor. + +@leave KErrNoMemory If there is insufficient memory. + +@see TDesC8::Length() +@see TDes8::MaxLength() +@see TDes8::Copy() +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::CreateL(const TDesC8& aDes,TInt aMaxLength) + { + CreateL(aMaxLength); + Copy(aDes.Left(aMaxLength)); + } + + + + +/** +Resizes this 8-bit resizable buffer descriptor. + +The length and contents of the descriptor are unchanged. + +If the buffer descriptor was created from a zero-length heap descriptor +HBufC, this method might leak memory (the heap descriptor is not freed). +It is possible to avoid this by calling the Close() method prior to ReAlloc(), +but this should be done only in this situation (otherwise the buffer contents +will be lost). + +For example, add +@code + if (desc.MaxLength() == 0) desc.Close(); +@endcode +before the call to ReAlloc(). + +@param aMaxLength The new maximum length of the descriptor. This can be zero, + which results in a descriptor with zero maximum length and no + allocated memory. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@panic USER 26 If the new maximum length is less then the current descriptor length. +*/ +EXPORT_C TInt RBuf8::ReAlloc(TInt aMaxLength) + { + __ASSERT_ALWAYS(Length()<=aMaxLength, Panic(ETDes8ReAllocTooSmall)); + __TEST_INVARIANT; + + if (!aMaxLength) //Reallocation to zero length + { + User::Free(iEPtrType); //Free memory + new (this) RBuf8(); //Create zero-length RBuf + return KErrNone; + } + + if (!iMaxLength) //Reallocation from zero length + return Create(aMaxLength); + + switch(Type()) + { + case EPtr: + { + TUint8* buf = (TUint8*)User::ReAlloc(iEPtrType,aMaxLength*sizeof(TUint8)); + if(!buf) return KErrNoMemory; + iEPtrType = buf; + iMaxLength = aMaxLength; + break; + } + case EBufCPtr: + { + HBufC8* hbufc = iEBufCPtrType->ReAlloc(aMaxLength); + if(!hbufc) return KErrNoMemory; + Assign(hbufc); + break; + } + } + + __TEST_INVARIANT; + return KErrNone; + } + + + + +/** +Resizes this 8-bit resizable buffer descriptor, leaving on failure. + +The length and contents of the descriptor are unchanged. + +If the buffer descriptor was created from a zero-length heap descriptor +HBufC, this method might leak memory (the heap descriptor is not freed). +It is possible to avoid this by calling the Close() method prior to ReAllocL(), +but this should be done only in this situation (otherwise the buffer contents +will be lost). + +For example, add +@code + if (desc.MaxLength() == 0) desc.Close(); +@endcode +before the call to ReAlloc(). + +@param aMaxLength The new maximum length of the descriptor. This can be zero, + which results in a descriptor with zero maximum length and no + allocated memory. + +@return KErrNone, if successful; KErrNoMemory, if there is insufficient memory. + +@panic USER 26 If the new maximum length is less then the current descriptor length. +*/ +EXPORT_C void RBuf8::ReAllocL(TInt aMaxLength) + { + User::LeaveIfError(ReAlloc(aMaxLength)); + } + + + + +/** +Deallocates memory assigned to this object, and re-initializes the object as +a zero-length descriptor. +*/ +EXPORT_C void RBuf8::Close() + { + User::Free(iEPtrType); + //Create zero-length RBuf. It is EPtr type of descriptor that points to NULL. + new(this) RBuf8(); + } + + + + +/** +Pushes a cleanup item for this object onto the cleanup stack. + +The effect of this is to cause Close() to be called on this 8-bit resizable +buffer descriptor, when CleanupStack::PopAndDestroy() is called at some later time. + +@code +... +RBuf8 x; +.... +x.CleanupClosePushL(); +... +CleanupStack::PopAndDestroy(); +... +@endcode + +@see RBuf8::Close() +*/ +EXPORT_C void RBuf8::CleanupClosePushL() + { + ::CleanupClosePushL(*this); + } + + + + +/** +Tests that the class obeys its invariant. +*/ +EXPORT_C void RBuf8::__DbgTestInvariant() const + { +#ifdef _DEBUG + TDes8::__DbgTestInvariant(); + switch(Type()) + { + case EPtr: + if (iEPtrType) + { + __ASSERT_DEBUG(User::AllocLen(iEPtrType) >= iMaxLength*(TInt)sizeof(TUint8), Panic(EInvariantFalse)); + } + break; + case EBufCPtr: + iEBufCPtrType->__DbgTestInvariant(); + __ASSERT_DEBUG(iEBufCPtrType->Des().MaxLength() == iMaxLength, Panic(EInvariantFalse)); + __ASSERT_DEBUG(iEBufCPtrType->Length() == Length(), Panic(EInvariantFalse)); + break; + default: + User::Invariant(); + } +#endif // _DEBUG + } + +#endif // __KERNEL_MODE__ + + +#if defined(__DES8_MACHINE_CODED__) || defined(__EABI__) +GLDEF_C void Des8PanicBadDesType() + { + Panic(ETDes8BadDescriptorType); + } + +GLDEF_C void Des8PanicPosOutOfRange() + { + Panic(ETDes8PosOutOfRange); + } +#endif + +#ifdef __DES8_MACHINE_CODED__ +GLDEF_C void Des8PanicLengthNegative() + { + Panic(ETDes8LengthNegative); + } + +GLDEF_C void Des8PanicMaxLengthNegative() + { + Panic(ETDes8MaxLengthNegative); + } + +GLDEF_C void Des8PanicLengthOutOfRange() + { + Panic(ETDes8LengthOutOfRange); + } + +GLDEF_C void Des8PanicDesOverflow() + { + Panic(ETDes8Overflow); + } + +GLDEF_C void Des8PanicDesIndexOutOfRange() + { + Panic(ETDes8IndexOutOfRange); + } +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/common/mem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/common/mem.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,241 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\common\mem.cpp +// +// + +#include "common.h" + +//This is used in heap.cpp and it is defined here, as a requirement for patchdata +EXPORT_D extern const TInt KHeapMinCellSize = 0; +EXPORT_D extern const TInt KHeapShrinkHysRatio = RHeap::EShrinkRatioDflt; +//NOTE - if these values are changed then the WINS test case value must be updated + +#ifndef __MEM_MACHINE_CODED__ + +extern "C" { + +// See header file e32cmn.h for the in-source documentation. +EXPORT_C TAny* memcpy(TAny* aTrg, const TAny* aSrc, unsigned int aLength) + { + return memmove(aTrg, aSrc, aLength); + } + + + +// See header file e32cmn.h for the in-source documentation. +EXPORT_C TAny* memmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength) + { + if (aLength==0) + return((TUint8*)aTrg); + TInt aLen32=0; + TUint32* pT32=(TUint32*)aTrg; + const TUint32* pS32=(TUint32 *)aSrc; + if (((TInt)pT32&3)==0 && ((TInt)pS32&3)==0) + aLen32=aLength>>2; + TInt aLen8=aLength-(aLen32<<2); + TUint32* pE32=pT32+aLen32; + TUint8* pT; + TUint8* pE; + TUint8* pS; + if (aTrgaSrc) + { + pT=(TUint8*)(pT32+aLen32); + pE=pT+aLen8; + pS=(TUint8*)aSrc+aLength; + while (pE>pT) + *--pE=(*--pS); + pS32=(TUint32*)pS; + while (pE32>pT32) + *--pE32=(*--pS32); + } + return aTrg; + } + + + +// See header file e32cmn.h for the in-source documentation. +EXPORT_C TAny* memclr(TAny* aTrg, unsigned int aLength) + { + return memset(aTrg, 0, aLength); + } + + + +// See header file e32cmn.h for the in-source documentation. +EXPORT_C TAny* memset(TAny* aTrg, TInt aValue, unsigned int aLength) + { + TInt aLen32=0; + TUint32 *pM32=(TUint32 *)aTrg; + if (((TInt)aTrg&3)==0) + { + aLen32=aLength>>2; + TUint32 *pE32=pM32+aLen32; + TUint c = aValue & 0xff; + TUint32 fillChar=c+(c<<8)+(c<<16)+(c<<24); + while (pM32>2; + TUint32* pT=(TUint32*)aTrg; + const TUint32* pS=(const TUint32*)aSrc; + const TUint32* pE=pS+len; + if (pTpS) + { + pT+=len; + while (pE>pS) + *--pT=(*--pE); + } + return aTrg; + } + + + + +// See header file e32cmn.h for the in-source documentation. +EXPORT_C TInt memcompare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL) + { + + __ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative)); + __ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative)); + const TUint8 *pE=aLeft+Min(aLeftL,aRightL); + while (aLeft +#include +#endif + +// Check that the layout of TSecurityInfo and SSecurityInfo are the same +// because we use this assumption in the TSecurityInfo::Set methods +__ASSERT_COMPILE(_FOFF(TSecurityInfo,iSecureId)==_FOFF(SSecurityInfo,iSecureId)); +__ASSERT_COMPILE(_FOFF(TSecurityInfo,iVendorId)==_FOFF(SSecurityInfo,iVendorId)); +__ASSERT_COMPILE(_FOFF(TSecurityInfo,iCaps)==_FOFF(SSecurityInfo,iCaps)); + +#ifndef __TOOLS2__ +#ifdef __KERNEL_MODE__ + + +/** +Construct a TSecurityInfo setting it to the security attributes of aProcess. +@param aProcess A process. +*/ +EXPORT_C TSecurityInfo::TSecurityInfo(DProcess* aProcess) + { + memcpy(this, &aProcess->iS, sizeof(SSecurityInfo)); + } + +/** +Construct a TSecurityInfo setting it to the security attributes to those of the process +owning the specified thread. +@param aThread A thread. +*/ +EXPORT_C TSecurityInfo::TSecurityInfo(DThread* aThread) + { + memcpy(this, &aThread->iOwningProcess->iS, sizeof(SSecurityInfo)); + } + +#else + +/** +Construct a TSecurityInfo setting it to the security attributes of aProcess. +@param aProcess A process. +*/ +EXPORT_C TSecurityInfo::TSecurityInfo(RProcess aProcess) + { + Exec::ProcessSecurityInfo(aProcess.Handle(),*(SSecurityInfo*)this); + } + +/** +Construct a TSecurityInfo setting it to the security attributes to those of the process +owning the specified thread. +@param aThread A thread. +*/ +EXPORT_C TSecurityInfo::TSecurityInfo(RThread aThread) + { + Exec::ThreadSecurityInfo(aThread.Handle(),*(SSecurityInfo*)this); + } + +/** +Construct a TSecurityInfo setting it to the security attributes of the process +which sent the message aMsgPtr +@param aMsgPtr a message +*/ +EXPORT_C TSecurityInfo::TSecurityInfo(RMessagePtr2 aMsgPtr) + { + Exec::MessageSecurityInfo(aMsgPtr.Handle(),*(SSecurityInfo*)this); + } + +TInt TSecurityInfo::Set(RSessionBase aSession) + { + return Exec::SessionSecurityInfo(aSession.Handle(),*(SSecurityInfo*)this); + } + +/** +Sets this TSecurityInfo to the security attributes of this process' creator. +*/ +EXPORT_C void TSecurityInfo::SetToCreatorInfo() + { + Exec::CreatorSecurityInfo(*(SSecurityInfo*)this); + } + +#endif //__KERNEL_MODE__ +#endif // __TOOLS2__ + +/** +Construct a set consisting of two capabilities. +@param aCapability1 The first capability. +@param aCapability2 The second capability. +*/ +EXPORT_C TCapabilitySet::TCapabilitySet(TCapability aCapability1, TCapability aCapability2) + { + SetEmpty(); + AddCapability(aCapability1); + AddCapability(aCapability2); + } + +/** +Make this set empty. I.e. Containing no capabilities. +*/ +EXPORT_C void TCapabilitySet::SetEmpty() + { + memset(iCaps,0,sizeof(iCaps)); + } + + +/** +Make this set consist of all capabilities supported by this OS version. +*/ +EXPORT_C void TCapabilitySet::SetAllSupported() + { + *(SCapabilitySet*)&iCaps=AllSupportedCapabilities; + } + +#ifndef __TOOLS2__ +#ifndef __KERNEL_MODE__ +// Documented in header file +EXPORT_C void TCapabilitySet::SetDisabled() + { + Exec::DisabledCapabilities(*(SCapabilitySet*)this); + } +#endif // __KERNEL_MODE__ +#endif // __TOOLS2__ + +/** +Add a single capability to the set. +If the capability is not supported by this OS version then it is not added and +the set is left unchanged. +@see TCapabilitySet::SetAllSupported() +@param aCapability Capability to add. +*/ +EXPORT_C void TCapabilitySet::AddCapability(TCapability aCapability) + { + if((TUint32)aCapability<(TUint32)ECapability_Limit) + { + TInt index = aCapability>>3; + TUint8 mask = (TUint8)(1<<(aCapability&7)); + mask &= ((TUint8*)&AllSupportedCapabilities)[index]; + ((TUint8*)iCaps)[index] |= mask; + } + } + +/** +Remove a single capability from the set, if it is present. +@param aCapability Capability to remove. +*/ +EXPORT_C void TCapabilitySet::RemoveCapability(TCapability aCapability) + { + if((TUint32)aCapability<(TUint32)ECapability_Limit) + { + TInt index = aCapability>>3; + TUint8 mask = (TUint8)(1<<(aCapability&7)); + ((TUint8*)iCaps)[index] &= ~mask; + } + } + +/** +Perform a union of this capability set with another. +The result replaces the content of 'this'. +@param aCapabilities A cpability set +*/ +EXPORT_C void TCapabilitySet::Union(const TCapabilitySet& aCapabilities) + { + for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--) + iCaps[n] |= aCapabilities.iCaps[n]; + } + +/** +Perform an intersection of this capability set with another. +The result replaces the content of 'this'. +@param aCapabilities A capability set +*/ +EXPORT_C void TCapabilitySet::Intersection(const TCapabilitySet& aCapabilities) + { + for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--) + iCaps[n] &= aCapabilities.iCaps[n]; + } + +/** +Remove a set of capabilities from this set. +@param aCapabilities The set of capabilities to remove +*/ +EXPORT_C void TCapabilitySet::Remove(const TCapabilitySet& aCapabilities) + { + for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--) + iCaps[n] &= ~aCapabilities.iCaps[n]; + } + +/** +Test if a single capability is present in the set. +The capability ECapability_None is always treated as being present. +@param aCapability The capability to test +@return 1 if the capability is present, 0 if it is not. +*/ +EXPORT_C TBool TCapabilitySet::HasCapability(TCapability aCapability) const + { + if((TUint32)aCapability<(TUint32)ECapability_Limit) + return (((TUint8*)iCaps)[aCapability>>3]>>(aCapability&7))&1; + if(aCapability==ECapability_None) + return ETrue; + return EFalse; // Handles illegal argument and ECapability_Denied + } + +/** +Test if all the capabilities in a given set are present in this set +@param aCapabilities The capability set to test +@return A non-zero value if all the capabilities are present, zero otherwise. +*/ +EXPORT_C TBool TCapabilitySet::HasCapabilities(const TCapabilitySet& aCapabilities) const + { + TUint32 checkFail=0; + for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--) + checkFail |= aCapabilities.iCaps[n]&~iCaps[n]; + return checkFail?0:1; + } + +// Documented in header file +TBool TCapabilitySet::NotEmpty() const + { + TUint32 notEmpty=0; + for(TInt n = (ECapability_Limit-1)>>5; n>=0; n--) + notEmpty |= iCaps[n]; + return notEmpty; + } + +//ECapability_None is assumed to be -1 in the internals of TSecurityPolicy +__ASSERT_COMPILE(ECapability_None == -1); + +/** Constructs a TSecurityPolicy to either always pass or always fail checks made +against it, depending on the value of aType. +@param aType Must be one of EAlwaysPass or EAlwaysFail +@panic USER 191 if aType is not a valid value +*/ +EXPORT_C TSecurityPolicy::TSecurityPolicy(TSecPolicyType aType) + : iType((TUint8)aType), iSecureId(TUint32(ECapability_None)) + { + //This constructor uses TSecPolicyType as public alias for the internal + //TType. Thus EAlwaysFail must have the same value as ETypeFail (same with the + //pass case too). + __ASSERT_COMPILE(EAlwaysFail == (TSecPolicyType)ETypeFail); + __ASSERT_COMPILE(EAlwaysPass == (TSecPolicyType)ETypePass); + + __ASSERT_ALWAYS(aType == EAlwaysFail || aType == EAlwaysPass, Panic(ETSecPolicyTypeInvalid)); + iCaps[0] = (TUint8)ECapability_None; + iCaps[1] = (TUint8)ECapability_None; + iCaps[2] = (TUint8)ECapability_None; + } + +/** Construct a TSecurityPolicy object to check up to 3 capabilties. +@param aCap1 The first capability to add to this policy +@param aCap2 An optional second capability to add to this policy +@param aCap3 An optional third capability to add to this policy +@panic USER 189 If any of the supplied capabilities are not valid. +*/ +EXPORT_C TSecurityPolicy::TSecurityPolicy(TCapability aCap1, TCapability aCap2, TCapability aCap3) + //iSecureId=0xFFFFFFFF sets iExtraCaps[0-3] each to ECapability_None (==0xFF) + : iType(ETypeC3), iSecureId(TUint32(ECapability_None)) + { + ConstructAndCheck3(aCap1, aCap2, aCap3); + } + +/** Construct a TSecurityPolicy object to check up to 7 capabilties. +@param aCap1 The first capability to add to this policy +@param aCap2 The second capability to add to this policy +@param aCap3 The third capability to add to this policy +@param aCap4 The fourth capability to add to this policy +@param aCap5 An optional fifth capability to add to this policy +@param aCap6 An optional sixth capability to add to this policy +@param aCap7 An optional seventh capability to add to this policy +@panic USER 189 If any of the supplied capabilities are not valid. +*/ +EXPORT_C TSecurityPolicy::TSecurityPolicy(TCapability aCap1, TCapability aCap2, + TCapability aCap3, TCapability aCap4, TCapability aCap5, TCapability aCap6, TCapability aCap7) + : iType(ETypeC7) + { + ConstructAndCheck3(aCap1, aCap2, aCap3); + __ASSERT_COMPILE(ECapability_None==-1); // Our argument check below assumes this + __ASSERT_ALWAYS( (TUint)(aCap4+1)<=(TUint)ECapability_Limit + &&(TUint)(aCap5+1)<=(TUint)ECapability_Limit + &&(TUint)(aCap6+1)<=(TUint)ECapability_Limit + &&(TUint)(aCap7+1)<=(TUint)ECapability_Limit + ,Panic(ECapabilityInvalid)); + iExtraCaps[0] = (TUint8)aCap4; + iExtraCaps[1] = (TUint8)aCap5; + iExtraCaps[2] = (TUint8)aCap6; + iExtraCaps[3] = (TUint8)aCap7; + } + +/** Construct a TSecurityPolicy object to check a secure id and up to 3 capabilties. +@param aSecureId The secure id to add to this policy +@param aCap1 The first capability to add to this policy +@param aCap2 The second capability to add to this policy +@param aCap3 The third capability to add to this policy +@panic USER 189 If any of the supplied capabilities are not valid. +*/ +EXPORT_C TSecurityPolicy::TSecurityPolicy(TSecureId aSecureId, + TCapability aCap1, TCapability aCap2, TCapability aCap3) + : iType(ETypeS3), iSecureId(aSecureId) + { + ConstructAndCheck3(aCap1, aCap2, aCap3); + } + +/** Construct a TSecurityPolicy object to check a vendor id and up to 3 capabilties. +@param aVendorId The vendor id to add to this policy +@param aCap1 The first capability to add to this policy +@param aCap2 The second capability to add to this policy +@param aCap3 The third capability to add to this policy +@panic USER 189 If any of the supplied capabilities are not valid. +*/ +EXPORT_C TSecurityPolicy::TSecurityPolicy(TVendorId aVendorId, + TCapability aCap1, TCapability aCap2, TCapability aCap3) + : iType(ETypeV3), iVendorId(aVendorId) + { + ConstructAndCheck3(aCap1, aCap2, aCap3); + } + +/** Sets up iCaps[0-2] with supplied values and checks for their validity. +@panic USER 189 If any of the supplied capabilities are invalid. +*/ +void TSecurityPolicy::ConstructAndCheck3(TCapability aCap1, TCapability aCap2, TCapability aCap3) + { + __ASSERT_COMPILE(ECapability_None==-1); // Our argument check below assumes this + __ASSERT_ALWAYS( (TUint)(aCap1+1)<=(TUint)ECapability_Limit + &&(TUint)(aCap2+1)<=(TUint)ECapability_Limit + &&(TUint)(aCap3+1)<=(TUint)ECapability_Limit + ,Panic(ECapabilityInvalid)); + iCaps[0] = (TUint8)aCap1; + iCaps[1] = (TUint8)aCap2; + iCaps[2] = (TUint8)aCap3; + } + +/** +Checks that this object is in a valid state +@return A non-zero value if this object is valid, zero otherwise. +@internalComponent +*/ +TBool TSecurityPolicy::Validate() const + { + switch(iType) + { + case ETypeFail: + case ETypePass: + if(iSecureId!=TUint32(ECapability_None)) + return EFalse; + __ASSERT_COMPILE(TUint8(ECapability_None)==0xffu); // Test below assumes this... + if((iCaps[0]&iCaps[1]&iCaps[2])!=TUint8(ECapability_None)) // check caps 0 to 2 are each == ECapability_None + return EFalse; + return ETrue; + + case ETypeC7: + return ETrue; + + case ETypeC3: + if(iSecureId!=TUint32(ECapability_None)) + return EFalse; + return ETrue; + + case ETypeS3: + case ETypeV3: + return ETrue; + + default: + return EFalse; + } + } + +/** Sets this TSecurityPolicy to a copy of the policy described by the +supplied descriptor. Such a descriptor can be obtained from +TSecurityPolicy::Package(). +@see TSecurityPolicy::Package() +@param aDes A descriptor representing the state of another TSecurityPolicy. +@return KErrNone, if successful, otherwise one of the other system-wide error +codes. +*/ +EXPORT_C TInt TSecurityPolicy::Set(const TDesC8& aDes) + { + if(aDes.Size() == sizeof(TSecurityPolicy)) + { + *this = *(TSecurityPolicy*)aDes.Ptr(); + if(Validate()) + return KErrNone; + } + // Set failed so set up the policy as an EAlwaysFail case. + iType = EAlwaysFail; + iCaps[0] = TUint8(ECapability_None); + iCaps[1] = TUint8(ECapability_None); + iCaps[2] = TUint8(ECapability_None); + iSecureId = TUint32(ECapability_None); + return KErrArgument; + } + +/** +Constructs a TPtrC8 wrapping the platform security attributes of this +TSecurityPolicy. Such a descriptor is suitable for passing across the +client server boundary. + +The format of the descriptor is determined by the first byte which specifies +the type of this TSecurityPolicy. The first byte is one of the constants +specified in the enum TSecurityPolicy::TType. + +For TSecurityPolicy objects of types ETypeC3, ETypeS3, ETypePass or ETypeFail +the descriptor will contain the following data in the order listed: +@code + TUint8 iType; // set to ETypeC3, ETypeS3, ETypePass or ETypeFail + TUint8 iCaps[3]; + TUint32 iSecureId; +@endcode +ETypeC3 descriptors will contain capabilities in iCaps but have iSecureId set +to ECapability_None. ETypeS3 are similar to ETypeC3 descriptors but will have +iSecureId set to the secure ID value of the TSecurityPolicy object. +ETypePass and ETypeFail objects will have values of all of the elements of iCaps +and iSecureId set to ECapability_None. + +For TSecurityPolicy objects of type ETypeV3 the descriptor will contain the +following data in the order listed: +@code + TUint8 iType; // set to ETypeV3 + TUint8 iCaps[3]; // set to the values of 3 capabilities + TUint32 iVendorId; // set to the value of the vendor ID of the TSecurityPolicy +@endcode + +For TSecurityPolicy objects of type ETypeC7 the descriptor will contain the +following data in the order listed: +@code + TUint8 iType; // set to ETypeC7 + TUint8 iCaps[3]; // set to the values of 3 of the objects capabilities + TUint8 iExtraCaps[4]; // set to the values of 4 of the objects capabilities +@endcode +@see TSecurityPolicy::TType +@see TSecurityPolicy::Set() +@return A TPtrC8 wrapping the platform security attributes of this TSecurityPolicy. +*/ +EXPORT_C TPtrC8 TSecurityPolicy::Package() const + { + return TPtrC8((TUint8*)(this), sizeof(TSecurityPolicy)); + } + +/** Checks this policy against the supplied SSecurityInfo. +@param aSecInfo The SSecurityInfo object to check against this TSecurityPolicy. +@param aMissing A SSecurityInfo object which this method fills with any capabilities or IDs + it finds to be missing. This is designed to help generating diagnostic messages. +@return ETrue if all the requirements of this TSecurityPolicy are met, EFalse +@panic USER 190 if aSecInfo is an invalid SSecurityInfo object +otherwise. +*/ +TBool TSecurityPolicy::CheckPolicy(const SSecurityInfo& aSecInfo, SSecurityInfo& aMissing) const + { + TBool result = EFalse; + //It is thought to be by far the most common case to have 3 or less + //capabilities in a policy. Hence we'll set this for all of them even + //though ETypePass doesn't need it. + aMissing.iSecureId = 0; + aMissing.iVendorId = 0; + __ASSERT_COMPILE(SCapabilitySet::ENCapW == 2); + aMissing.iCaps[0] = 0; + aMissing.iCaps[1] = 0; + aMissing.iCaps.AddCapability((TCapability)(iCaps[0])); + aMissing.iCaps.AddCapability((TCapability)(iCaps[1])); + aMissing.iCaps.AddCapability((TCapability)(iCaps[2])); + aMissing.iCaps.Remove(aSecInfo.iCaps); + switch(iType) + { + case ETypeFail: + //result already False; + break; + case ETypePass: + result = ETrue; + break; + case ETypeC7: + aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[0])); + aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[1])); + aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[2])); + aMissing.iCaps.AddCapability((TCapability)(iExtraCaps[3])); + aMissing.iCaps.Remove(aSecInfo.iCaps); + //It is intentional that there is no break statement here + case ETypeC3: + if(!aMissing.iCaps.NotEmpty()) + { + result = ETrue; + } + break; + case ETypeS3: + if(!aMissing.iCaps.NotEmpty() && iSecureId == aSecInfo.iSecureId) + { + result = ETrue; + } + //This else if required to set the aMissing.iCaps secure id for diagnostics. + //Doesn't affect pass case. + else if(iSecureId != aSecInfo.iSecureId) + { + aMissing.iSecureId = iSecureId; + } + break; + case ETypeV3: + if(!aMissing.iCaps.NotEmpty() && iVendorId == aSecInfo.iVendorId) + { + result = ETrue; + } + else if(iVendorId != aSecInfo.iVendorId) + { + aMissing.iVendorId = iVendorId; + } + break; + default: + Panic(ESecurityPolicyCorrupt); + break; + } + return result; + } + +#ifndef __TOOLS2__ +#ifndef __KERNEL_MODE__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The RProcess object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RProcess aProcess, const char* aDiagnostic) const + { + SSecurityInfo missing; + TSecurityInfo secInfo(aProcess); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = PlatSec::PolicyCheckFail(aProcess.Handle(),missing,aDiagnostic)==KErrNone; + return pass; + } +#else // !__REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RProcess aProcess, const char* /*aDiagnostic*/) const + { + return DoCheckPolicy(aProcess); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The RProcess object to check against this TSecurityPolicy. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RProcess aProcess) const + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + return DoCheckPolicy(aProcess, NULL); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + SSecurityInfo missing; + TSecurityInfo secInfo(aProcess); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = (PlatSec::EmitDiagnostic() == KErrNone); + return pass; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RThread aThread, const char* aDiagnostic) const + { + SSecurityInfo missing; + TSecurityInfo secInfo(aThread); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = PlatSec::PolicyCheckFail(aThread.Handle(),missing,aDiagnostic)==KErrNone; + return pass; + } +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RThread aThread, const char* /*aDiagnostic*/) const + { + return DoCheckPolicy(aThread); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RThread aThread) const + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + return DoCheckPolicy(aThread, NULL); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + SSecurityInfo missing; + TSecurityInfo secInfo(aThread); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = (PlatSec::EmitDiagnostic() == KErrNone); + return pass; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + +TInt TSecurityPolicy::CheckPolicy(RSessionBase aSession) const + { + SSecurityInfo missing; + TSecurityInfo secInfo; + TInt r = secInfo.Set(aSession); + if (r!=KErrNone) + return r; + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + r = PlatSec::PolicyCheckFail(aSession.Handle(),missing,NULL); +#else + r = PlatSec::EmitDiagnostic(); +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + return r; + } + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const + { + SSecurityInfo missing; + TSecurityInfo secInfo(aMsgPtr); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = PlatSec::PolicyCheckFail(aMsgPtr,missing,aDiagnostic)==KErrNone; + return pass; + } +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, const char* /*aDiagnostic*/) const + { + return DoCheckPolicy(aMsgPtr); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr) const + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + return DoCheckPolicy(aMsgPtr, NULL); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + SSecurityInfo missing; + TSecurityInfo secInfo(aMsgPtr); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = (PlatSec::EmitDiagnostic() == KErrNone); + return pass; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs + it finds to be missing. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const + { + TSecurityInfo secInfo(aMsgPtr); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), *((SSecurityInfo*)&aMissing)); + if(!pass) + pass = PlatSec::PolicyCheckFail(aMsgPtr,*((SSecurityInfo*)&aMissing),aDiagnostic)==KErrNone; + return pass; + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs + it finds to be missing. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +TBool TSecurityPolicy::DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing) const + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + return DoCheckPolicy(aMsgPtr, aMissing, NULL); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + TSecurityInfo secInfo(aMsgPtr); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), *((SSecurityInfo*)&aMissing)); + if(!pass) + pass = (PlatSec::EmitDiagnostic() == KErrNone); + return pass; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + +/** Checks this policy against the platform security attributes of this process' creator. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The RProcess object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of this process' creator, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicyCreator(const char* aDiagnostic) const + { + SSecurityInfo missing; + TSecurityInfo secInfo; + secInfo.SetToCreatorInfo(); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = PlatSec::CreatorPolicyCheckFail(missing,aDiagnostic)==KErrNone; + return pass; + } +#else // !__REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicyCreator(const char* /*aDiagnostic*/) const + { + return DoCheckPolicyCreator(); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** Checks this policy against the platform security attributes of this process' creator. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The RProcess object to check against this TSecurityPolicy. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of this process' creator, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicyCreator() const + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + return DoCheckPolicyCreator(NULL); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + SSecurityInfo missing; + TSecurityInfo secInfo; + secInfo.SetToCreatorInfo(); + TBool pass = CheckPolicy(*((SSecurityInfo*)&secInfo), missing); + if(!pass) + pass = (PlatSec::EmitDiagnostic() == KErrNone); + return pass; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + +#else //__KERNEL_MODE__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The DProcess object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DProcess* aProcess, const char* aDiagnostic) const + { + SSecurityInfo missing; + TBool pass = CheckPolicy(aProcess->iS, missing); + if(!pass) + pass = PlatSec::PolicyCheckFail(aProcess,missing,aDiagnostic)==KErrNone; + return pass; + } +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DProcess* aProcess, const char* /*aDiagnostic*/) const + { + return DoCheckPolicy(aProcess); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The DProcess object to check against this TSecurityPolicy. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DProcess* aProcess) const + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + return DoCheckPolicy(aProcess, NULL); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + SSecurityInfo missing; + TBool pass = CheckPolicy(aProcess->iS, missing); + if(!pass) + pass = (PlatSec::EmitDiagnostic() == KErrNone); + return pass; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DThread* aThread, const char* aDiagnostic) const + { + SSecurityInfo missing; + TBool pass = CheckPolicy(aThread->iOwningProcess->iS, missing); + if(!pass) + pass = PlatSec::PolicyCheckFail(aThread,missing,aDiagnostic)==KErrNone; + return pass; + } +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DThread* aThread, const char* /*aDiagnostic*/) const + { + return DoCheckPolicy(aThread); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +EXPORT_C TBool TSecurityPolicy::DoCheckPolicy(DThread* aThread) const + { +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + return DoCheckPolicy(aThread, NULL); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + SSecurityInfo missing; + TBool pass = CheckPolicy(aThread->iOwningProcess->iS, missing); + if(!pass) + pass = (PlatSec::EmitDiagnostic() == KErrNone); + return pass; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + } + +#endif // !__KERNEL_MODE__ + + +#ifndef __KERNEL_MODE__ + +EXPORT_C TInt PlatSec::ConfigSetting(TConfigSetting aSetting) + { + TUint32 flags = Exec::KernelConfigFlags(); + switch(aSetting) + { + case EPlatSecEnforcement: + flags &= EKernelConfigPlatSecEnforcement; + break; + case EPlatSecDiagnotics: +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + flags &= EKernelConfigPlatSecDiagnostics; +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ + flags=0; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + break; + case EPlatSecProcessIsolation: + flags &= EKernelConfigPlatSecProcessIsolation; + break; + case EPlatSecEnforceSysBin: + flags &= EKernelConfigPlatSecEnforceSysBin; + break; + case EPlatSecLocked: + flags &= EKernelConfigPlatSecLocked; + break; + default: + flags = 0; + break; + } + if(flags) + flags = 1; + return flags; + } + +EXPORT_C TBool PlatSec::IsCapabilityEnforced(TCapability aCapability) + { + if(!((TCapabilitySet&)AllSupportedCapabilities).HasCapability(aCapability)) + return EFalse; + + SCapabilitySet disabled; + Exec::DisabledCapabilities(disabled); + if(((TCapabilitySet&)disabled).HasCapability(aCapability)) + return EFalse; + + return PlatSec::ConfigSetting(EPlatSecEnforcement); + } + +#endif // Not __KERNEL_MODE__ +#endif // __TOOLS2__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/cbase/ub_array.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/cbase/ub_array.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1480 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\cbase\ub_array.cpp +// +// + +#include "ub_std.h" + +struct SVarRec + { + TInt len; + TAny *data; + }; + +NONSHARABLE_CLASS(TSwapArray) : public TSwap + { +public: + inline TSwapArray(CBufBase *aBase,TInt aRecordLength); + TUint8 *At(TInt anIndex) const; + virtual void Swap(TInt aLeft,TInt aRight) const; +private: + CBufBase *iBase; + TInt iLength; + }; +inline TSwapArray::TSwapArray(CBufBase *aBase,TInt aRecordLength) + : iBase(aBase),iLength(aRecordLength) + {} + +TUint8 *TSwapArray::At(TInt anIndex) const +// +// Return a pointer to the array element +// + { + + return((TUint8 *)iBase->Ptr(anIndex*iLength).Ptr()); + } + +void TSwapArray::Swap(TInt aLeft,TInt aRight) const +// +// Swap two elements of the array. +// + { + + Mem::Swap(At(aLeft),At(aRight),iLength); + } + + + + +EXPORT_C TKeyArrayFix::TKeyArrayFix(TInt anOffset,TKeyCmpText aType) + : TKey(anOffset,aType) +/** +Constructs the characteristics of a descriptor key. + +No length value is passed as this is taken from the descriptor type key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of comparison to be made + between two descriptor keys. +@see TKeyCmpText +*/ + {} + + + + +EXPORT_C TKeyArrayFix::TKeyArrayFix(TInt anOffset,TKeyCmpText aType,TInt aLength) + : TKey(anOffset,aType,aLength) +/** +Constructs the characteristics of a text key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of comparison to be made + between two text keys. +@param aLength The length of the text key. + +@see TKeyCmpText +*/ + {} + + + + +EXPORT_C TKeyArrayFix::TKeyArrayFix(TInt anOffset,TKeyCmpNumeric aType) + : TKey(anOffset,aType) +/** +Constructs the characteristics of a numeric key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of the numeric key. + +@see TKeyCmpNumeric +*/ + {} + + + + +EXPORT_C void TKeyArrayFix::Set(CBufBase *aBase,TInt aRecordLength) +// +// Set the base and record length +// + { + + iBase=aBase; + iRecordLength=aRecordLength; + } + +EXPORT_C TAny *TKeyArrayFix::At(TInt anIndex) const +// +// Return an address in the array. +// + { + + if (anIndex==KIndexPtr) + return((TUint8 *)iPtr+iKeyOffset); + return((TAny *)(iBase->Ptr(anIndex*iRecordLength).Ptr()+iKeyOffset)); + } + + + + +EXPORT_C TKeyArrayVar::TKeyArrayVar(TInt anOffset,TKeyCmpText aType) + : TKey(anOffset,aType) +/** +Constructs the characteristics of a descriptor key. + +No length value is passed as this is taken from the descriptor type key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of comparison to be made + between two descriptor keys. + +@see TKeyCmpText +*/ + {} + + + + +EXPORT_C TKeyArrayVar::TKeyArrayVar(TInt anOffset,TKeyCmpText aType,TInt aLength) + : TKey(anOffset,aType,aLength) +/** +Constructs the characteristics of a text key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of comparison to be made + between two text keys. +@param aLength The length of the text key. + +@see TKeyCmpText +*/ + {} + + + + +EXPORT_C TKeyArrayVar::TKeyArrayVar(TInt anOffset,TKeyCmpNumeric aType) + : TKey(anOffset,aType) +/** +Constructs the characteristics of a numeric key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of the numeric key. + +@see TKeyCmpNumeric +*/ + {} + + + + +EXPORT_C void TKeyArrayVar::Set(CBufBase *aBase) +// +// Set the private variable iBase to aBase. +// + { + + iBase=aBase; + } + +EXPORT_C TAny *TKeyArrayVar::At(TInt anIndex) const +// +// Return an address in the array. +// + { + + if (anIndex==KIndexPtr) + return((TUint8 *)iPtr+iKeyOffset); + SVarRec *pV=(SVarRec *)iBase->Ptr(anIndex*sizeof(SVarRec)).Ptr(); + return(((TUint8 *)pV->data)+iKeyOffset); + } + + + + +EXPORT_C TKeyArrayPak::TKeyArrayPak(TInt anOffset,TKeyCmpText aType) + : TKeyArrayVar(anOffset,aType) +/** +Constructs the characteristics of a descriptor key. + +No length value is passed as this is taken from the descriptor type key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of comparison to be made + between two descriptor keys. + +@see TKeyCmpText +*/ + {} + + + + +EXPORT_C TKeyArrayPak::TKeyArrayPak(TInt anOffset,TKeyCmpText aType,TInt aLength) + : TKeyArrayVar(anOffset,aType,aLength) +/** +Constructs the characteristics of a text key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of comparison to be made + between two text keys. +@param aLength The length of the text key. + +@see TKeyCmpText +*/ + {} + + + + +EXPORT_C TKeyArrayPak::TKeyArrayPak(TInt anOffset,TKeyCmpNumeric aType) + : TKeyArrayVar(anOffset,aType) +/** +Constructs the characteristics of a numeric key. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of the numeric key. + +@see TKeyCmpNumeric +*/ + {} + + + + +EXPORT_C void TKeyArrayPak::Set(CBufBase *aBase) +// +// Set the private variable iBase to aBase. +// + { + + iBase=aBase; + iCacheIndex=0; + iCacheOffset=0; + } + +EXPORT_C TAny *TKeyArrayPak::At(TInt anIndex) const +// +// Return a pointer to the data in the record with index anIndex. +// + { +// +// When anIndex is equal to KIndexPtr (HighValues) this means that we should return the address of +// the iPtr+iKeyOffset which will have been set up by the TKeyArrayPak constructor. +// + if (anIndex==KIndexPtr) + return((TUint8 *)iPtr+iKeyOffset); +// +// Otherwise get the offset into the buffer of the record with index anIndex. +// + TInt offset=0; + TInt curIndex=0; + if (iCacheIndex<=anIndex) + { + curIndex=iCacheIndex; + offset=iCacheOffset; + } + TAny *pRecord=(TAny *)iBase->Ptr(offset).Ptr(); + while (curIndexPtr(offset).Ptr(); + curIndex++; + } + (TInt &)iCacheIndex=anIndex; + (TInt &)iCacheOffset=offset; + TAny *pData=(TAny *)((TInt *)pRecord + 1); + return((TUint8 *)pData+iKeyOffset); + } + +EXPORT_C CArrayFixBase::CArrayFixBase(TBufRep aRep,TInt aRecordLength,TInt aGranularity) +// +// Constructor +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(aRecordLength>0,Panic(EArrayFixInvalidLength)); + __ASSERT_ALWAYS(aGranularity>0,Panic(EArrayFixInvalidGranularity)); +// iCount=0; +// iBase=NULL; + iLength=aRecordLength; + iGranularity=aGranularity; + iCreateRep=aRep; + } + +EXPORT_C CArrayFixBase::~CArrayFixBase() +/** +Destructor. + +This frees all resources owned by the object, prior to its destruction. +*/ + { + + delete iBase; + } + +EXPORT_C void CArrayFixBase::Compress() +/** +Compresses the array. + +The function removes the excess space from the array buffer. The effect is +to reduce the memory allocated to the array buffer so that it is just +sufficient to contain the elements of the array. This applies to both flat +and segmented array buffers. + +If the array is empty, then the memory allocated to the array buffer is freed. +*/ + { + + if (iBase) + iBase->Compress(); + } + +EXPORT_C void CArrayFixBase::Reset() +/** +Deletes all elements from the array and frees the memory allocated +to the array buffer. +*/ + { + + iCount=0; + if (iBase) + iBase->Reset(); + } + +EXPORT_C TInt CArrayFixBase::Sort(TKeyArrayFix &aKey) +/** +Sorts the elements of the array into key sequence. + +@param aKey The key object defining the properties of the key. + +@return KErrNone if the sort completes successfully. + KErrGeneral if the stack overflows +*/ + { + + if (iCount==0) + return KErrNone; + TSwapArray aSwap(iBase,iLength); + SetKey(aKey); + return(User::QuickSort(iCount,aKey,aSwap)); + } + +EXPORT_C TAny *CArrayFixBase::At(TInt anIndex) const +// +// Index into the array. +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndexPtr(anIndex*iLength).Ptr()); + } + +EXPORT_C TAny *CArrayFixBase::End(TInt anIndex) const +// +// Return a pointer past contiguous elements starting at anIndex. +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange)); + TPtr8 p=iBase->Ptr(anIndex*iLength); + return((TAny *)(p.Ptr()+p.Length())); + } + +EXPORT_C TAny *CArrayFixBase::Back(TInt anIndex) const +// +// Return a pointer to contiguous elements before anIndex. +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange)); + TPtr8 p=iBase->BackPtr(anIndex*iLength); + return((TAny *)p.Ptr()); + } + +EXPORT_C void CArrayFixBase::Delete(TInt anIndex) +/** +Deletes a single element from the array at a specified position. + +Deleting elements from the array does not cause the array buffer to be +automatically compressed. Call CArrayFixBase::Compress() to return excess space +to the heap. + +@param anIndex The position within the array at which to delete the element, + This is a value relative to zero. + +@panic E32USER-CBase 21, if anIndex is negative or is greater + than or equal to the number of elements currently + in the array. +@see CArrayFixBase::Compress +*/ + { + + Delete(anIndex,1); + } + +EXPORT_C void CArrayFixBase::Delete(TInt anIndex,TInt aCount) +/** +Deletes one or more contiguous elements from the array, starting at a specific +position. + +Deleting elements from the array does not cause the array buffer to be +automatically compressed. Call CArrayFixBase::Compress() to return excess space +to the heap. + +@param anIndex The position within the array from where deletion of elements + is to start. The position is relative to zero, i.e. zero implies + that elements, starting with the first, are deleted from the + array. + +@param aCount The number of contiguous elements to be deleted from the array. + +@panic E32USER-CBase 21, if anIndex is negative, or is greater than or equal to + the number of elements currently in the array. +@panic E32USER-CBase 22, if aCount is negative. +@panic E32USER-CBase 29, if the sum of anIndex and aCount is greater than or equal + to the number of elements currently in the array. +*/ + { + + if (aCount==0) + return; + __ASSERT_ALWAYS(aCount>0,Panic(EArrayCountNegative)); + __ASSERT_ALWAYS(anIndex>=0 && anIndexDelete(anIndex*iLength,aCount*iLength); + iCount-=aCount; + } + +EXPORT_C TAny *CArrayFixBase::ExpandL(TInt anIndex) +// +// Expand the array to make room for a new record at anIndex. +// +/** +@internalComponent +*/ + { + + if (iBase==NULL) + iBase=(*iCreateRep)(iLength*iGranularity); + __ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange)); + iBase->ExpandL(anIndex*iLength,iLength); + ++iCount; + return((TAny *)iBase->Ptr(anIndex*iLength).Ptr()); + } + +EXPORT_C TInt CArrayFixBase::Find(const TAny *aPtr,TKeyArrayFix &aKey,TInt &anIndex) const +// +// Find in the array using a sequential search. +// +/** +@internalComponent +*/ + { + + if (iCount==0) + { + anIndex=0; + return(-1); + } + aKey.SetPtr(aPtr); + SetKey(aKey); + TInt r=1; + TInt i=0; + while (i0,Panic(EArrayCountNegative2)); + __ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange)); + iBase->InsertL(anIndex*iLength,aPtr,aCount*iLength); + iCount+=aCount; + } + +EXPORT_C void CArrayFixBase::InsertRepL(TInt anIndex,const TAny *aPtr,TInt aReplicas) +// +// Insert aReplicas copies of a record into the array. +// +/** +@internalComponent +*/ + { + + if (aReplicas==0) + return; + if (iBase==NULL) + iBase=(*iCreateRep)(iLength*iGranularity); + __ASSERT_ALWAYS(aReplicas>0,Panic(EArrayReplicasNegative)); + __ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange)); + TInt pos=anIndex*iLength; + TInt len=aReplicas*iLength; + iBase->ExpandL(pos,len); + for (TInt end=pos+len;posWrite(pos,aPtr,iLength); + iCount+=aReplicas; + } + +EXPORT_C TInt CArrayFixBase::InsertIsqL(const TAny *aPtr,TKeyArrayFix &aKey) +// +// Insert in sequence, no duplicates allowed. +// +/** +@internalComponent +*/ + { + + TInt i=0; + TInt r=FindIsq(aPtr,aKey,i); + if (r==0) // a duplicate, leave + User::Leave(KErrAlreadyExists); + InsertL(i,aPtr,1); + return(i); + } + +EXPORT_C TInt CArrayFixBase::InsertIsqAllowDuplicatesL(const TAny *aPtr,TKeyArrayFix &aKey) +// +// Insert in sequence, allow duplicates. +// +/** +@internalComponent +*/ + { + + TInt i=0; + TInt r=FindIsq(aPtr,aKey,i); + if (r==0) // a duplicate, insert after + ++i; + InsertL(i,aPtr,1); + return(i); + } + +EXPORT_C void CArrayFixBase::ResizeL(TInt aCount,const TAny *aPtr) +// +// Resize the array to contain aCount records, copying a record into any new slots. +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(aCount>=0,Panic(EArrayCountNegative3)); + TInt excess=iCount-aCount; + if (excess>0) + Delete(aCount,excess); + else + InsertRepL(iCount,aPtr,-excess); + } + +EXPORT_C void CArrayFixBase::SetReserveFlatL(TInt aCount) +// +// Reserve space to contain aCount items. Only for flat arrays! +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(aCount>=iCount,Panic(EArrayReserveTooSmall)); + if (iBase==NULL) + iBase=(*iCreateRep)(iLength*iGranularity); + ((CBufFlat*)iBase)->SetReserveL(iLength*aCount); // dodgy cast. Can we assert the type? + } + +EXPORT_C void CArrayFixBase::SetKey(TKeyArrayFix &aKey) const +// +// Set the key data. +// +/** +@internalComponent +*/ + { + + aKey.Set(iBase,iLength); + } + +EXPORT_C TInt CArrayFixBase::CountR(const CBase *aPtr) +// +// Return the number of items in the array. +// +/** +@internalComponent +*/ + { + + return(((CArrayFixBase *)aPtr)->Count()); + } + +EXPORT_C const TAny *CArrayFixBase::AtR(const CBase *aPtr,TInt anIndex) +// +// Return the address of an item in the array. +// +/** +@internalComponent +*/ + { + + return(((CArrayFixBase *)aPtr)->At(anIndex)); + } + +EXPORT_C CArrayVarBase::CArrayVarBase(TBufRep aRep,TInt aGranularity) +// +// Constructor +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(aGranularity>0,Panic(EArrayVarInvalidGranularity)); +// iCount=0; +// iBase=NULL; + iGranularity=aGranularity; + iCreateRep=aRep; + } + +EXPORT_C CArrayVarBase::~CArrayVarBase() +/** +Destructor. + +Frees all resources owned by the object, prior to its destruction. +*/ + { + + if (iBase) + { + Reset(); + delete iBase; + } + } + +EXPORT_C TInt CArrayVarBase::Length(TInt anIndex) const +/** +Gets the length of a specific element. + +@param anIndex The position of the element within the array. The position + is relative to zero, (i.e. the first element in the array is + at position 0). + +@return The length of the element at position anIndex. + +@panic E32USER-CBase 21, if anIndex is negative or is greater than the number + of elements currently in the array. +*/ + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndexPtr(anIndex*sizeof(SVarRec)).Ptr())->len); + } + +EXPORT_C void CArrayVarBase::Compress() +/** +Removes excess space from the array buffer. + +The effect is to reduce the memory allocated to the array buffer so that it is +just sufficient to represent the array. This applies to both flat and segmented +array buffers. + +If the array is empty, then the memory allocated to the array buffer is freed. +*/ + { + + if (iBase) + iBase->Compress(); + } + +EXPORT_C void CArrayVarBase::Reset() +/** +Deletes all elements from the array and frees the memory allocated to the array +buffer. + +As each element of a variable array is contained within its own heap cell, +this function has the effect of freeing all such cells. +*/ + { + + Delete(0,Count()); + } + +EXPORT_C TInt CArrayVarBase::Sort(TKeyArrayVar &aKey) +/** +Sorts the elements of the array into key sequence. + +@param aKey The key object defining the properties of the key. + +@return KErrNone, if the sort completes successfully. + KErrGeneral, if the stack overflows. +*/ + { + + if (iCount==0) + return KErrNone; + TSwapArray aSwap(iBase,sizeof(SVarRec)); + SetKey(aKey); + return(User::QuickSort(iCount,aKey,aSwap)); + } + +EXPORT_C TAny * CArrayVarBase::At(TInt anIndex) const +// +// Return a pointer to the data in the array. +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndexPtr(anIndex*sizeof(SVarRec)).Ptr())->data); + } + +EXPORT_C void CArrayVarBase::Delete(TInt anIndex) +/** +Removes one element from the array. + +Deleting elements from the array does not cause the array buffer to be +automatically compressed. Call CArrayVarBase::Compress() to return excess +space to the heap. + +@param anIndex The position within the array of the element to delete. The + position is relative to zero. + +@panic E32USER-CBase 21, if anIndex is negative or greater than the number + of elements currently in the array. +*/ + { + + Delete(anIndex,1); + } + +EXPORT_C void CArrayVarBase::Delete(TInt anIndex,TInt aCount) +/** +Removes one or more contiguous elements from the array, starting at the +specified position. + +Deleting elements from the array does not cause the array buffer to be +automatically compressed. Call CArrayVarBase::Compress() to return excess +space to the heap. + +@param anIndex The position within the array from where deletion of elements is + to start. The position is relative to zero, i.e. zero implies + that elements, starting with the first, are deleted from the + array. + +@param aCount The number of elements to be deleted from the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of elements currently in the array. +@panic E32USER-CBase 25, if aCount is negative. +@panic E32USER-CBase 29, if the sum of anIndexPos and aCount is greater than + the number of elements currently in the array. +*/ + { + + if (aCount==0) + return; + __ASSERT_ALWAYS(aCount>0,Panic(EArrayCountNegative4)); + __ASSERT_ALWAYS(anIndex>=0 && anIndexPtr(i*sizeof(SVarRec)); + User::Free(((SVarRec *)p.Ptr())->data); + } + iBase->Delete(anIndex*sizeof(SVarRec),aCount*sizeof(SVarRec)); + iCount-=aCount; + } + +EXPORT_C TAny *CArrayVarBase::ExpandL(TInt anIndex,TInt aLength) +// +// Expand the array at anIndex. +// +/** +@internalComponent +*/ + { + + if (iBase==NULL) + iBase=(*iCreateRep)(sizeof(SVarRec)*iGranularity); + __ASSERT_ALWAYS(aLength>=0,Panic(EArrayLengthNegative)); + __ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange)); + TAny *pV=User::AllocL(aLength); + SVarRec s; + s.data=pV; + s.len=aLength; + TRAPD(r,iBase->InsertL(anIndex*sizeof(SVarRec),&s,sizeof(SVarRec))); + if (r!=KErrNone) + { + User::Free(pV); + User::Leave(r); + } + iCount++; + return(pV); + } + +EXPORT_C TInt CArrayVarBase::Find(const TAny *aPtr,TKeyArrayVar &aKey,TInt &anIndex) const +// +// Find using a sequential search. +// +/** +@internalComponent +*/ + { + + if (iCount==0) + { + anIndex=0; + return(-1); + } + aKey.SetPtr(aPtr); + SetKey(aKey); + TInt ret=(-1); + TInt i=0; + while (iCount()); + } + +EXPORT_C const TAny *CArrayVarBase::AtR(const CBase *aPtr,TInt anIndex) +// +// Return the address of an item in the array. +// +/** +@internalComponent +*/ + { + + return(((CArrayVarBase *)aPtr)->At(anIndex)); + } + +EXPORT_C CArrayPakBase::CArrayPakBase(TBufRep aRep,TInt aGranularity) +// +// Constructor +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(aGranularity>0,Panic(EArrayPakInvalidGranularity)); +// iCount=0; +// iBase=NULL; + iGranularity=aGranularity; + iCreateRep=aRep; + } + +EXPORT_C CArrayPakBase::~CArrayPakBase() +/** +Destructor. + +Frees all resources owned by the object, prior to its destruction. +*/ + { + + if (iBase) + { + Reset(); + delete iBase; + } + } + +EXPORT_C TInt CArrayPakBase::Length(TInt anIndex) const +/** +Gets the length of the specified element. + +@param anIndex The position of the element within the array. The position + is relative to zero, (i.e. the first element in the array is + at position 0). + +@return The length of the element at position anIndex. + +@panic E32USER-CBase 21, if anIndex is negative or is greater than the number + of elements currently in the array. +*/ + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndexPtr(GetOffset(anIndex)).Ptr())); + } + +EXPORT_C void CArrayPakBase::Compress() +/** +Removes excess space from the array buffer. + +The effect is to reduce the memory allocated to the array buffer so that it +is just sufficient to contain the elements of the array. + +If the array is empty, then the memory allocated to the array buffer is freed. +*/ + { + + if (iBase) + iBase->Compress(); + } + +EXPORT_C void CArrayPakBase::Reset() +/** +Deletes all elements from the array and frees the memory allocated to the array +buffer. +*/ + { + + Delete(0,Count()); + } + +EXPORT_C void CArrayPakBase::SortL(TKeyArrayVar &aKey) +// +// Builds a transient CArrayVarFlat array, sorts it +// and then copies it back to the original array. +// +/** +Sorts the elements of the array into key sequence. + +Note that the function requires a TKeyArrayVar key object because SortL() +creates a temporary CArrayVarFlat array in its implementation and uses that array's +Sort() member function. + +@param aKey The key object defining the properties of the key. + +@see CArrayVarFlat +*/ + { + + if (iCount==0) + return; +// +// First build a variable length flat array. +// + CArrayVarFlat *pVarFlat=NULL; + TRAPD(r,BuildVarArrayL(pVarFlat)) + if (r==KErrNone) + { +// +// Now sort it. +// + r=pVarFlat->Sort(aKey); + if (r==KErrNone) + { + // + // Delete the records and copy back from pVarFlat. + // + Reset(); // Deletes the records but leaves the memory + TInt tCount=pVarFlat->Count(); + for (TInt anIndex=0;anIndexLength(anIndex); + TAny *pdata=pVarFlat->At(anIndex); + TRAP(r,InsertL(anIndex,pdata,lenData)); + if (r!=KErrNone) + break; + } + } + } + delete pVarFlat; + User::LeaveIfError(r); + } + +EXPORT_C TAny *CArrayPakBase::At(TInt anIndex) const +// +// TAny points to the data associated with the record with anIndex. +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(anIndex>=0 && anIndexPtr(GetOffset(anIndex)).Ptr(); + return((TAny *)(pR+1)); + } + +EXPORT_C void CArrayPakBase::Delete(TInt anIndex) +/** +Removes a single element from the array. + +Deleting elements from the array does not cause the array buffer to be +automatically compressed. Call CArrayPakBase::Compress() to return excess +space to the heap. + +@param anIndex The position within the array of the element to delete, relative + to zero. +@panic E32USER-CBase 21, if anIndex is negative or is greater than the + number of elements currently in the array. + +@see CArrayPakBase::Compress +*/ + { + + Delete(anIndex,1); + } + +EXPORT_C void CArrayPakBase::Delete(TInt anIndex,TInt aCount) +/** +Removes one or more contiguous elements from the array, starting at a specific +position. + +Deleting elements from the array does not cause the array buffer to be +automatically compressed. Call CArrayPakBase::Compress() to return excess +space to the heap. + +@param anIndex The position within the array from where deletion of elements + is to start, relative to zero. + +@param aCount The number of elements to be deleted from the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than the number of + elements currently in the array. +@panic E32USER-CBase 26, if aCount is negative. + +@see CArrayPakBase::Compress +*/ + { + + if (aCount==0) + return; + __ASSERT_ALWAYS(aCount>0,Panic(EArrayCountNegative5)); + __ASSERT_ALWAYS(anIndex>=0 && anIndexPtr(offset).Ptr(); + TInt lenData=(*(TInt *)pRecord); + totalToDelete+=Align4(lenData)+sizeof(TUint); + } + iBase->Delete(firstRecOffset,totalToDelete); + iCount-=aCount; + } + +EXPORT_C TAny *CArrayPakBase::ExpandL(TInt anIndex,TInt aLength) +// +// Expand the array at anIndex. +// +/** +@internalComponent +*/ + { + + if (iBase==NULL) + iBase=(*iCreateRep)(iGranularity); + __ASSERT_ALWAYS(aLength>=0,Panic(EArrayLengthNegative)); + __ASSERT_ALWAYS(anIndex>=0 && anIndex<=iCount,Panic(EArrayIndexOutOfRange)); + TInt offset=GetOffset(anIndex); + iCacheIndex=anIndex; + iCacheOffset=offset; + iBase->ExpandL(offset,Align4(aLength+sizeof(TInt))); + TInt *pR=(TInt *)iBase->Ptr(offset).Ptr(); + *pR=aLength; + iCount++; + return((TAny *)(pR+1)); + } + +EXPORT_C TInt CArrayPakBase::Find(const TAny *aPtr,TKeyArrayPak &aKey,TInt &anIndex) const +// +// Find using a sequential search. +// +/** +@internalComponent +*/ + { + + if (iCount==0) + { + anIndex=0; + return(-1); + } + aKey.SetPtr(aPtr); + SetKey(aKey); + TInt ret=(-1); + TInt i=0; + while (iPtr(offset).Ptr(); + while (curIndexPtr(offset).Ptr(); + curIndex++; + } + (TInt &)iCacheIndex=anIndex; + (TInt &)iCacheOffset=offset; + return(offset); + } + +EXPORT_C void CArrayPakBase::BuildVarArrayL(CArrayVarFlat * &aVarFlat) +// +// Make a copy of the current array as a CArrayVarFlat +// +/** +@internalComponent +*/ + { + + aVarFlat=new(ELeave) CArrayVarFlat(iGranularity); + for (TInt anIndex=0;anIndexPtr(offset).Ptr(); + TInt lengthData=(*(TInt *)pRecord); + TAny *pData=(TAny *)((TInt *)pRecord+1); + aVarFlat->InsertL(anIndex,pData,lengthData); + } + } + +EXPORT_C TInt CArrayPakBase::CountR(const CBase *aPtr) +// +// Return the number of items in the array. +// +/** +@internalComponent +*/ + { + + return(((CArrayPakBase *)aPtr)->Count()); + } + +EXPORT_C const TAny *CArrayPakBase::AtR(const CBase *aPtr,TInt anIndex) +// +// Return the address of an item in the array. +// +/** +@internalComponent +*/ + { + + return(((CArrayPakBase *)aPtr)->At(anIndex)); + } + +EXPORT_C CArrayFixFlat::CArrayFixFlat(TInt aGranularity) + : CArrayFix((TBufRep)CBufFlat::NewL,aGranularity) +/** +Constructs the array, with the specified granularity, to contain elements of +TInt type. + +Note that no memory is allocated to the array buffer by this C++ constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 18 if aGranularity is not positive. +*/ + {} + +EXPORT_C CArrayFixFlat::~CArrayFixFlat() +/** +Destructor. +*/ + {} + +EXPORT_C CArrayFixFlat::CArrayFixFlat(TInt aGranularity) + : CArrayFix((TBufRep)CBufFlat::NewL,aGranularity) +/** +Constructs the array, with the specified granularity, to contain elements of +TUid type. + +Note that no memory is allocated to the array buffer by this C++ constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 18 if aGranularity is not positive. +*/ + {} + +EXPORT_C CArrayFixFlat::~CArrayFixFlat() +/** +Destructor. +*/ + {} diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/cbase/ub_buf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/cbase/ub_buf.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1023 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\cbase\ub_buf.cpp +// +// + +#include "ub_std.h" + +class TBufSegLink : public TDblQueLink + { +public: + inline TBufSegLink() : iLen(0) {} + inline TBufSegLink *Next() const {return((TBufSegLink *)iNext);} + inline TBufSegLink *Prev() const {return((TBufSegLink *)iPrev);} +public: + TInt iLen; + }; + +EXPORT_C CBufBase::CBufBase(TInt anExpandSize) +// +// Constructor +// +/** +@internalComponent +*/ + { + + __ASSERT_ALWAYS(anExpandSize>=0,Panic(EBufExpandSizeNegative)); +// iSize=0; + iExpandSize=anExpandSize; + } + +EXPORT_C CBufBase::~CBufBase() +/** +Destructor +*/ + { + } + +EXPORT_C void CBufBase::Reset() +/** +Deletes all data in the buffer. + +Its behaviour is the same as calling Delete(0,Size()). +The buffer is compressed before the function returns. +*/ + { + + if (iSize) + Delete(0,iSize); + Compress(); + } + +EXPORT_C void CBufBase::Read(TInt aPos,TDes8 &aDes) const +// +// Read up to aDes.MaxLength() bytes. +// +/** +Reads data from the buffer into a descriptor. + +Data, starting at the specified buffer position is written to the descriptor, +filling the descriptor. + +@param aPos Buffer position from which data is read: must be in range zero + to Size(). +@param aDes On return, contains the data read from the buffer; its MaxLength() + specifies the amount of data to be read. +*/ + { + + Read(aPos,aDes,aDes.MaxLength()); + } + +EXPORT_C void CBufBase::Read(TInt aPos,TDes8 &aDes,TInt aLength) const +/** +Reads the specified number of bytes of data from the buffer into a descriptor. + +@param aPos Buffer position from which data is read: must be in range zero + to (Size() minus the length of the data to be read). +@param aDes On return, contains data read from the buffer. +@param aLength The length of the data to be read. +*/ + { + + aDes.SetLength(aLength); + Read(aPos,(TAny *)aDes.Ptr(),aLength); + } + +EXPORT_C void CBufBase::Read(TInt aPos,TAny *aPtr,TInt aLength) const +/** +Reads the specified number of bytes of data from the buffer into a specified +address. + +@param aPos Buffer position from which data is read: must be in range zero + to (Size() minus the length of the data to be read). +@param aPtr The address into which the data should be read. +@param aLength The length of the data to be read. +*/ + { + + if (aLength==0) + return; + __ASSERT_ALWAYS(aLength>0,Panic(EBufReadLengthNegative)); + __ASSERT_ALWAYS((aPos+aLength)<=iSize,Panic(EBufReadBeyondEnd)); + TUint8 *pT=(TUint8 *)aPtr; + while (aLength) + { + TPtr8 p=((CBufBase *)this)->Ptr(aPos); + TInt s=Min(p.Length(),aLength); + pT=Mem::Copy(pT,p.Ptr(),s); + aLength-=s; + aPos+=s; + } + } + +EXPORT_C void CBufBase::Write(TInt aPos,const TDesC8 &aDes) +// +// Write aDes.Length() characters to the buffer. Does not cause any expansion. +// +/** +Writes data from a descriptor to the buffer. + +The data in the descriptor overwrites the data in the buffer from the insertion +point onwards. + +No new space is allocated; this function cannot fail (provided the parameters +are specified within the bounds of the buffer and descriptor). + +No shuffling occurs; new data is written to the memory locations occupied +by the data it overwrites. + +@param aPos Buffer position at which data will begin to be written; must be + in range zero to (Size() minus the length of the data + to be written). +@param aDes Contains the data to be written. The length of data to be written + is the descriptor length. +*/ + { + + Write(aPos,aDes.Ptr(),aDes.Length()); + } + +EXPORT_C void CBufBase::Write(TInt aPos,const TDesC8 &aDes,TInt aLength) +// +// Write aDes.Length() characters to the buffer. Does not cause any expansion. +// +/** +Writes the specified number of bytes of data from a descriptor to the buffer. + +The data in the descriptor overwrites the data in the buffer from the insertion +point onwards. + +No new space is allocated; this function cannot fail (provided the parameters +are specified within the bounds of the buffer and descriptor). + +No shuffling occurs; new data is written to the memory locations occupied +by the data it overwrites. + +@param aPos Buffer position at which data will begin to be written; must be + in range zero to (Size() minus the length of the data to + be written). +@param aDes Contains the data to be written. +@param aLength The length of the data to be written. +*/ + { + + Write(aPos,aDes.Ptr(),aLength); + } + +EXPORT_C void CBufBase::Write(TInt aPos,const TAny *aPtr,TInt aLength) +/** +Writes the specified number of bytes of data from the specified address to the +buffer. + +The data in the buffer is overwritten from the insertion point onwards. + +No new space is allocated; this function cannot fail (provided the parameters +are specified within the bounds of the buffer and descriptor). + +No shuffling occurs: new data is written to the memory locations occupied +by the data it overwrites. + +@param aPos Buffer position at which data will begin to be written; must be + in range zero to (Size() minus the length of the data to + be written). +@param aPtr The address of the data to be written. +@param aLength The length of the data to be written. + +@panic E32USER-CBase 7, if aLength is not positive +@panic E32USER-CBase 5, if aPos + aLength is greater than the number of + data bytes in the buffer, i.e. if the target appears + to be outside the buffer. +*/ + { + + if (aLength==0) + return; + __ASSERT_ALWAYS(aLength>0,Panic(EBufWriteLengthNegative)); + __ASSERT_ALWAYS((aPos+aLength)<=iSize,Panic(EBufWriteBeyondEnd)); + const TUint8 *pS=(const TUint8 *)aPtr; + while (aLength) + { + TPtr8 p=Ptr(aPos); + TInt s=Min(p.Length(),aLength); + Mem::Copy((TAny *)p.Ptr(),pS,s); + pS+=s; + aLength-=s; + aPos+=s; + } + } + +EXPORT_C void CBufBase::InsertL(TInt aPos,const TDesC8 &aDes) +// +// Insert aDes.Length() bytes into the buffer. +// +/** +Inserts data into the buffer. + +Data at and beyond the insertion position is moved to make way for the inserted +data. Data before the insertion position remains in place. + +Notes: + +1. Insertion may require more buffer space to be allocated. + +2. In the case of flat buffers, the buffer is extended by a ReAllocL() of the + buffer's heap cell, to the smallest multiple of the granularity that will + contain the data required. If this reallocation fails, the insertion is + impossible and a leave occurs. + +3. In the case of segmented buffers, a reallocation is performed if the segment + containing the insertion position has insufficient space, and + immediately-neighbouring segments cannot be used to contain the new data. + As many new segments as are necessary to contain the inserted data are + allocated. Each new segment's length is the buffer's granularity. + If extension or new allocation fails, a leave occurs. + +4. Insertion may also require data to be shuffled. In the case of flat buffers, + data beyond the insertion point is shuffled up to create a gap; the new data + is then inserted into this gap. In the case of segmented buffers, shuffling + is minimised by inserting the new data into newly-allocated buffers, and + shuffling only immediately-neighbouring buffers if possible. This may result + in some wastage of space, but is much more time-efficient for large amounts + of data. + +@param aPos Buffer position before which the data will be inserted; must be + in range zero to Size(). +@param aDes The data to be inserted; the length of the data is the descriptor + length. + +@leave KErrNoMemory If the insertion requires a bigger buffer, and the + necessary allocation or re-allocation fails. +*/ + { + + InsertL(aPos,aDes.Ptr(),aDes.Length()); + } + +EXPORT_C void CBufBase::InsertL(TInt aPos,const TDesC8 &aDes,TInt aLength) +// +// Insert aLength bytes into the buffer. +// +/** +Inserts the specified number of bytes of data from a descriptor into +the buffer. + +aLength bytes of data from aDes are inserted into the buffer at aPos. Data at +and beyond the insertion position is moved to make way for the inserted data. +Data before the insertion position remains in place. + +Notes: + +1. Insertion may require more buffer space to be allocated. + +2. In the case of flat buffers, the buffer is extended by a ReAllocL() of the + buffer's heap cell, to the smallest multiple of the granularity that will + contain the data required. If this reallocation fails, the insertion is + impossible and a leave occurs. + +3. In the case of segmented buffers, a reallocation is performed if the segment + containing the insertion position has insufficient space, and + immediately-neighbouring segments cannot be used to contain the new data. + As many new segments as are necessary to contain the inserted data are + allocated. Each new segment's length is the buffer's granularity. + If extension or new allocation fails, a leave occurs. + +4. Insertion may also require data to be shuffled. In the case of flat buffers, + data beyond the insertion point is shuffled up to create a gap: the new data + is then inserted into this gap. In the case of segmented buffers, shuffling + is minimised by inserting the new data into newly-allocated buffers, + and shuffling only immediately-neighbouring buffers if possible. + This may result in some wastage of space, but is much more time-efficient + for large amounts of data. + +@param aPos Buffer position before which the data will be inserted; must be + in range zero to Size(). +@param aDes The data to be inserted. +@param aLength The length of data to be inserted. + +@leave KErrNoMemory If the insertion requires a bigger buffer, and the + necessary allocation or re-allocation fails. +*/ + { + + InsertL(aPos,aDes.Ptr(),aLength); + } + +EXPORT_C void CBufBase::InsertL(TInt aPos,const TAny *aPtr,TInt aLength) +/** +Inserts bytes of data from the specified address into the buffer. + +Inserts aLength bytes of data found at address aPtr into the buffer at aPos. +Data at and beyond the insertion position is moved to make way for the inserted +data. Data before the insertion position remains in place. + +Notes: + +1. Insertion may require more buffer space to be allocated. + +2. In the case of flat buffers, the buffer is extended by a ReAllocL() of the + buffer's heap cell, to the smallest multiple of the granularity that will + contain the data required. If this reallocation fails, the insertion is + impossible and a leave occurs. + +2. In the case of segmented buffers, a reallocation is performed if the segment + containing the insertion position has insufficient space, and + immediately-neighbouring segments cannot be used to contain the new data. + As many new segments as are necessary to contain the inserted data are + allocated. Each new segment's length is the buffer's granularity. + If extension or new allocation fails, a leave occurs. + +4. Insertion may also require data to be shuffled. In the case of flat buffers, + data beyond the insertion point is shuffled up to create a gap: the new data + is then inserted into this gap. In the case of segmented buffers, shuffling + is minimised by inserting the new data into newly-allocated buffers, and + shuffling only immediately-neighbouring buffers if possible. This may result + in some wastage of space, but is much more time-efficient for large amounts + of data. + +@param aPos Buffer position before which the data will be inserted: must be + in range zero to Size(). +@param aPtr The address of the data to be inserted. +@param aLength The length of the data to be inserted. + +@leave KErrNoMemory If the insertion requires a bigger buffer, and the + necessary allocation or re-allocation fails. +*/ + { + + if (aLength==0) + return; + __ASSERT_ALWAYS(aLength>0,Panic(EBufInsertLengthNegative)); + __ASSERT_ALWAYS(aPtr,Panic(EBufInsertBadPtr)); + DoInsertL(aPos,aPtr,aLength); + } + +EXPORT_C void CBufBase::ExpandL(TInt aPos,TInt aLength) +/** +Inserts an uninitialised region into the buffer. + +Data at and beyond the insertion position is moved to make way for the inserted +region. Data before the insertion position remains in place. + +Note: + +1. The inserted region is not initialised. After using ExpandL(), you should + then use a series of Write()s to fill this region with data. + +2. Use ExpandL() followed by a series of Write()s when you know the amount of + data to be inserted, in advance. It is more efficient than a series of + InsertL()s. In addition, once the result of the ExpandL() has been checked, + it is guaranteed that the Write()s do not leave, which can sometimes be + useful. + +@param aPos Buffer position before which the region will be inserted; must + be in range zero to Size(). +@param aLength The length of the region to be inserted. +*/ + { + + if (aLength==0) + return; + __ASSERT_ALWAYS(aLength>0,Panic(EBufInsertLengthNegative)); + DoInsertL(aPos,NULL,aLength); + } + +EXPORT_C void CBufBase::ResizeL(TInt aSize) +/** +Re-sizes the buffer to the specified size. + +The new size can be larger or smaller than the existing size. + +If the new size is larger than the existing size, the buffer is expanded by +adding uninitialised data to the end of it. + +If the new size is smaller than the existing size, the buffer is reduced; +any data at the end of the buffer is lost. + +Notes: + +1. If the new size is larger than the existing size, the function is equivalent + to Delete(aSize,Size()-aSize). + +2. If the new size is smaller than the existing size, the function is equivalent + to ExpandL((Size(),aSize-Size()). + +3. The motivations for using ResizeL() are the same as those for using Delete() + and ExpandL(). + +@param aSize The new size of the buffer; this value must be greater than or + equal to zero. +*/ + { + + TInt excess=iSize-aSize; + if (excess>0) + Delete(aSize,excess); + else + ExpandL(iSize,-excess); + } + +EXPORT_C CBufFlat *CBufFlat::NewL(TInt anExpandSize) +/** +Allocates and constructs a flat buffer. + +If there is insufficient memory available to allocate the flat buffer, the +function leaves. + +@param anExpandSize The granularity of buffer expansion. Additional space, + when required, is always allocated in multiples of + this number. Note: although a value of zero is permitted + by this interface, it has no meaning, and risks raising + panics later during execution. We suggest that you pass + a positive value. + +@return A pointer to the flat buffer object. + +@panic E32USER-CBase 3 if the granularity is negative. +*/ + { + + return(new(ELeave) CBufFlat(anExpandSize)); + } + +EXPORT_C CBufFlat::CBufFlat(TInt anExpandSize) +// +// Constructor +// +/** +@internalComponent +*/ + : CBufBase(anExpandSize) + { + +// iMaxSize=0; +// iPtr=NULL; + } + +EXPORT_C CBufFlat::~CBufFlat() +/** +Destructor. + +Frees all resources owned by the object, prior to its destruction. +Specifically, it frees the allocated cell used as a buffer. +*/ + { + + User::Free(iPtr); + } + +EXPORT_C void CBufFlat::Compress() +/** +Compresses the buffer so as to occupy minimal space. + +This frees any unused memory at the end of the buffer. + +@see CBufBase::Compress +*/ + { + + SetReserveL(iSize); + } + +EXPORT_C void CBufFlat::SetReserveL(TInt aSize) +/** +Specifies a minimum amount of space which the flat buffer should occupy. + +If the required size is zero, the heap cell is deleted. If it is different +from the current size, the heap cell is rellocated accordingly. + +@param aSize The size of the buffer required. If there is no data in the + buffer, i.e. Size() returns zero, then this value + can be zero, which causes the buffer's allocated heap cell + to be deleted. + +@panic E32USER-CBase 10, if aSize is negative. +@panic E32USER-CBase 11, if there is data in the buffer, and aSize is less than + the value returned by Size(). +*/ + { + + __ASSERT_ALWAYS(aSize>=0,Panic(EBufFlatReserveNegative)); + __ASSERT_ALWAYS(aSize>=iSize,Panic(EBufFlatReserveSetTooSmall)); + if (!aSize) + { + User::Free(iPtr); + iPtr=NULL; + } + else + iPtr=(TUint8 *)User::ReAllocL(iPtr,aSize); + iMaxSize=aSize; + } + +EXPORT_C void CBufFlat::DoInsertL(TInt aPos,const TAny *aPtr,TInt aLength) +// +// Insert into the buffer. Can cause expansion. +// + { + + __ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange)); + TInt len=iSize+aLength; + if (len>iMaxSize) + { + TInt r=len-iMaxSize; + r=((r/iExpandSize)+1)*iExpandSize; + SetReserveL(iMaxSize+r); + } + Mem::Copy(iPtr+aPos+aLength,iPtr+aPos,iSize-aPos); + if (aPtr) + Mem::Copy(iPtr+aPos,aPtr,aLength); + iSize+=aLength; + } + +EXPORT_C void CBufFlat::Delete(TInt aPos,TInt aLength) +/** +Deletes data from the buffer. + +During deletion, any data beyond the deleted data is shuffled up so that +the buffer contents are contiguous. No memory is freed. + +@param aPos Buffer position where the deletion will begin; must be in the + range zero to (Size() minus the length of the data + to be deleted). +@param aLength The number of bytes to be deleted. + +@panic E32USER-CBase 12, if aPos is negative or is greater than the + current size of the buffer. +@panic E32USER-CBase 13, if aPos + aLength is greater than the + current size of the buffer. + +@see CBufBase::Delete +*/ + { + + __ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange)); + __ASSERT_ALWAYS((aPos+aLength)<=iSize,Panic(EBufFlatDeleteBeyondEnd)); + Mem::Copy(iPtr+aPos,iPtr+aPos+aLength,iSize-aLength-aPos); + iSize-=aLength; + } + +EXPORT_C TPtr8 CBufFlat::Ptr(TInt aPos) +/** +Gets a pointer descriptor to represent the data starting at the specified +data byte through to the end of the contiguous region containing that byte. + +Calculation of the pointer and length involves only a few machine instructions +and is independent of the data contained in the buffer. + +@param aPos Buffer position: must be in range zero to Size(). + +@return Descriptor representing the data starting at aPos to the end of + the buffer. +*/ + { + + __ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange)); + TInt len=iSize-aPos; + return(TPtr8(iPtr+aPos,len,len)); + } + +EXPORT_C TPtr8 CBufFlat::BackPtr(TInt aPos) +// +// Return a pointer to the buffer which has the maximum amount of data +// before aPos, and the amount of data remaining. +// +/** +Gets a pointer descriptor to represent the data starting at the beginning +of the contiguous region containing that byte through to the byte immediately +preceding the specified byte. + +The descriptor always points to the beginning of the buffer containing +the specified byte. Calculation of the pointer and length involves only a few +machine instructions and is independent of the data contained in the buffer. + +@param aPos Buffer position: must be in range zero to Size(). + +@return Descriptor representing the back contiguous region. + +@see CBufBase::BackPtr +*/ + { + + __ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufFlatPosOutOfRange)); + return(TPtr8(iPtr,aPos,aPos)); + } + +void CBufSeg::InsertIntoSegment(TBufSegLink *aSeg,TInt anOffset,const TAny *aPtr,TInt aLength) +// +// Insert into the segment. +// + { + + if (aLength) + { + TUint8 *pS=((TUint8 *)(aSeg+1))+anOffset; + Mem::Copy(pS+aLength,pS,aSeg->iLen-anOffset); + if (aPtr) + Mem::Copy(pS,aPtr,aLength); + aSeg->iLen+=aLength; + } + } + +void CBufSeg::DeleteFromSegment(TBufSegLink *aSeg,TInt anOffset,TInt aLength) +// +// Delete from the segment. +// + { + + if (aLength) + { + TUint8 *pS=((TUint8 *)(aSeg+1))+anOffset; + Mem::Copy(pS,pS+aLength,aSeg->iLen-anOffset-aLength); + aSeg->iLen-=aLength; + } + } + +void CBufSeg::FreeSegment(TBufSegLink *aSeg) +// +// Free an entire segment. +// + { + + aSeg->Deque(); + User::Free(aSeg); + } + +void CBufSeg::SetSBO(TInt aPos) +// +// Set a segment-base-offset struct (SBO) to a new pos. +// If the initial psbo->seg is not NULL, it assumes that it is a valid +// SBO for a different position and counts relative to the initial SBO +// to set the desired position. If the initial psbo->seg is NULL, it starts +// scanning from the beginning ie pos=0. +// When the position is between segments A and B, there are two equivalent +// positions: (1) at the beginning of B and (2) at the end of A. +// Option (1) is suitable for referencing the data and deleting. +// Option (2) is best for insertion when A is not full. +// This function uses option (1) and will always set the SBO to the +// beginning of the next segment. It does however set to the end of the +// last segment when pos is equal to the number of bytes in the buffer. +// + { + + __ASSERT_ALWAYS(aPos>=0 && aPos<=iSize,Panic(EBufSegPosOutOfRange)); + if (aPos==iSize) + { // Positioning to end is treated as a special case + iSeg=0; + if (iSize) + iBase=aPos-(iOffset=(iSeg=iQue.Last())->iLen); + return; + } + TInt base=iBase; + TBufSegLink *next; + if ((next=iSeg)==NULL) + { // anSbo is not valid - set to pos=0 + next=iQue.First(); + base=0; + } + if (aPosPrev(); + base-=next->iLen; + } while (aPos=(base+next->iLen) && !iQue.IsHead(nn=next->Next())) + { + base+=next->iLen; + next=nn; + } + } + iSeg=next; + iBase=base; + iOffset=aPos-base; + __ASSERT_DEBUG(iOffset<=iExpandSize,Panic(EBufSegSetSBO)); + } + +void CBufSeg::AllocSegL(TBufSegLink *aSeg,TInt aNumber) +// +// Allocate a number of segments. +// + { + + for (TInt i=0;iNext()); + User::Leave(KErrNoMemory); + } + new(pL) TBufSegLink; + pL->Enque(aSeg); + } + } + +EXPORT_C CBufSeg *CBufSeg::NewL(TInt anExpandSize) +/** +Allocates and constructs a segmented buffer. + +If there is insufficient memory available to allocate the segmented buffer, +the function leaves. + +@param anExpandSize The granularity of the buffer. Each segment contains (in + addition to 16 bytes of overhead) this number of bytes for + data. Note: although a value of zero is permitted by this + interface, it has no meaning, and risks raising panics later + during execution. We suggest that you pass a positive value. + +@return If successful, a pointer to the segmented buffer object. + +@panic E32USER-CBase 3 if the granularity is negative. +*/ + { + + return(new(ELeave) CBufSeg(anExpandSize)); + } + +EXPORT_C CBufSeg::CBufSeg(TInt anExpandSize) +// +// Constructor +// + : CBufBase(anExpandSize) + { + +// iSeg=NULL; + } + +EXPORT_C CBufSeg::~CBufSeg() +/** +Destructor. + +Frees all resources owned by the object, prior to its destruction. + +Specifically, it frees all segments allocated to the buffer. +*/ + { + + Delete(0,iSize); + } + +EXPORT_C void CBufSeg::Compress() +/** +Compresses the buffer so as to occupy minimal space. + +Fills any space in each segment of the buffer by moving contents from the next +segment to the current one. Where this activity results in empty segments, +it frees the memory associated with these segments. + +@see CBufBase::Compress +*/ + { + + if (!iSize) + return; + iSeg=NULL; // Invalidate current position + TBufSegLink *p1=iQue.First(); + TBufSegLink *p2; + while (!iQue.IsHead(p2=p1->Next())) + { + TInt rem=iExpandSize-p1->iLen; + if (rem==0) + { + p1=p2; + continue; // Full + } + if (rem>=p2->iLen) + { // Zap the next segment + InsertIntoSegment(p1,p1->iLen,p2+1,p2->iLen); + FreeSegment(p2); + continue; + } + InsertIntoSegment(p1,p1->iLen,p2+1,rem); // Make full + DeleteFromSegment(p2,0,rem); + p1=p2; + } + } + +EXPORT_C void CBufSeg::DoInsertL(TInt aPos,const TAny *aPtr,TInt aLength) +// +// Insert data at the specified position. This is quite tricky. +// In general, the data to be copied may be broken down into the +// following elements: +// s1 bytes into the current segment (p1) +// nseg-1 segments of self->sgbuf.hd.len (ie full segments) +// s2 bytes into segment nseg +// s3 bytes into the next segment (p2) +// where p2 is the next segment before the insertion of nseg new segments. +// In addition, any remaining data to the right of the insertion point must +// be moved appropriately. In general, r1 bytes must be moved into segment +// nseg (r2 bytes) and segment p2 (r3 bytes) where r1=r2+r3. +// + { + + SetSBO(aPos); + TInt slen=iExpandSize; + TInt ofs=iOffset; + TInt ll=0; + TInt s1=0; + TInt r1=0; + TBufSegLink *p1=(TBufSegLink *)(&iQue); + TBufSegLink *p2=p1->Next(); + TUint8 *pR=NULL; + if (iSize) + { + p1=iSeg; + if (!iQue.IsHead(p2=p1->Prev()) && ofs==0 && p2->iLeniLen; + iBase-=ofs; + } + s1=slen-ofs; + if (s1>aLength) + s1=aLength; + TInt r2=slen-p1->iLen; + if (aLength>r2) + { + pR=((TUint8 *)(p1+1))+ofs; + r1=aLength-r2; + r2=p1->iLen-ofs; + if (r1>r2) + r1=r2; + else + pR+=(r2-r1); + } + p2=p1->Next(); + ll=slen-p1->iLen; + if (!iQue.IsHead(p2)) + ll+=slen-p2->iLen; + } + TUint8 *pB=((TUint8 *)aPtr)+s1; + TInt lrem=aLength-s1; + TBufSegLink *pP=p1; + if (aLength>ll) + {// Need some more segments + TInt nseg=(slen-1+aLength-ll)/slen; + AllocSegL(p1,nseg); // Could leave + while (nseg--) + { // Copy into allocated segments + pP=pP->Next(); + TInt gap=slen; + if (lremiLen; + if (r2>r1) + r2=r1; + } + InsertIntoSegment(pP,pP->iLen,pR,r2); // Moved from p1 + InsertIntoSegment(p2,0,pR+r2,r1-r2); // Also moved from p1 + } + p1->iLen-=r1; + InsertIntoSegment(p1,ofs,aPtr,s1); + iSize+=aLength; + } + +EXPORT_C void CBufSeg::Delete(TInt aPos,TInt aLength) +/** +Deletes data from the buffer. + +During deletion, shuffling is minimised by deleting intermediate segments +and allowing segments to contain less data than the buffer granularity. + +@param aPos Buffer position where the deletion will begin; must be in the + range zero to (Size() minus the length of the data + to be deleted). +@param aLength The number of bytes to be deleted. + +@see CBufBase::Delete +*/ + { + + if (aLength==0) + return; + SetSBO(aPos); + TInt ofs=iOffset; + __ASSERT_ALWAYS((iBase+ofs+aLength)<=iSize,Panic(EBufSegDeleteBeyondEnd)); + iSize-=aLength; + TBufSegLink *p1=iSeg; + TBufSegLink *p2; + TInt rem=p1->iLen-ofs; + FOREVER + { + p2=p1->Next(); + TInt gap=aLength; + if (gap>rem) + gap=rem; + DeleteFromSegment(p1,ofs,gap); + if (p1->iLen==0) + { + iSeg=NULL; + FreeSegment(p1); + } + p1=p2; + if ((aLength-=gap)==0) + break; + rem=p1->iLen; + ofs=0; + } + if (iSize) + { + p1=p2->Prev(); + if (!iQue.IsHead(p1) && !iQue.IsHead(p2)) + { + if ((p1->iLen+p2->iLen)<=iExpandSize) + { // Join to the right + InsertIntoSegment(p1,p1->iLen,p2+1,p2->iLen); + FreeSegment(p2); + } + } + } + SetSBO(aPos); + } + +EXPORT_C TPtr8 CBufSeg::Ptr(TInt aPos) +/** +Gets a pointer descriptor to represent the data starting at the specified +data byte through to the end of the contiguous region containing that byte. + +The time needed for calculation of the pointer depends on how many segments +there are in the buffer, and how near the target segment is to the segment +which was last used in the buffer. + +@param aPos Buffer position: must be in range zero to Size(). + +@return Descriptor representing the data starting at aPos to the end of + the contiguous region containing that byte. +*/ + { + + if (iSize==0) + return(TPtr8(NULL,0,0)); + SetSBO(aPos); + TInt len=iSeg->iLen-iOffset; + return(TPtr8(((TUint8 *)(iSeg+1))+iOffset,len,len)); + } + +EXPORT_C TPtr8 CBufSeg::BackPtr(TInt aPos) +// +// Return a pointer to the buffer which has the maximum amount of data +// before aPos, and the amount of data remaining. +// +/** +Gets a pointer descriptor to represent the data starting at the beginning +of the contiguous region containing that byte through to the byte immediately +preceding the specified byte. + +The descriptor always points to the beginning of the segment containing the +specified byte. The time needed for calculation of the pointer depends on how +many segments there are in the buffer, and how near the target segment is to +the segment which was last used in the buffer. + +@param aPos Buffer position: must be in range zero to Size(). + +@return Descriptor representing the back contiguous region. + +@see CBufBase::BackPtr +*/ + + + { + + if (aPos==0) + return(TPtr8(NULL,0,0)); + SetSBO(aPos); + if (iOffset) + return(TPtr8((TUint8 *)(iSeg+1),iOffset,iOffset)); + TBufSegLink *pL=iSeg->Prev(); + TInt len=pL->iLen; + return(TPtr8((TUint8 *)(pL+1),len,len)); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/cbase/ub_circ.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/cbase/ub_circ.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,312 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\cbase\ub_circ.cpp +// +// + +#include "ub_std.h" + +EXPORT_C CCirBufBase::CCirBufBase(TInt aSize) +/** +Constructor taking the size of an object within the buffer. + +@param aSize The size of an object in the buffer. + +@panic E32USER-CBase 72, if aSize is zero or negative. +*/ + : iSize(aSize) + { + + __ASSERT_ALWAYS(iSize>0,Panic(ECircItemSizeNegativeOrZero)); +// iCount=0; +// iLength=0; +// iPtr=NULL; +// iPtrE=NULL; +// iHead=NULL; +// iTail=NULL; + } + +EXPORT_C CCirBufBase::~CCirBufBase() +/** +Destructor. + +This frees the memory allocated to the buffer. +*/ + { + + User::Free(iPtr); + } + +EXPORT_C void CCirBufBase::SetLengthL(TInt aLength) +/** +Sets the maximum capacity of this circular buffer, and resets all +of the buffer pointers. + +The capacity is the maximum number of elements that the buffer can hold. + +The buffer itself is allocated as a result of a call to this function. If +the function has previously been called, then any existing buffer is freed and +any information in it is lost. + +Notes: + +1. This function must be called before attempting to add any objects to + the buffer. + +2. The function can leave if there is insufficient memory available to + allocate the buffer. + +@param aLength The maximum capacity of the circular buffer. + +@panic E32USER-CBase 73, if aLength is zero or negative. +*/ + { + + __ASSERT_ALWAYS(aLength>0,Panic(ECircSetLengthNegativeOrZero)); + iPtr=(TUint8 *)User::ReAllocL(iPtr,aLength*iSize); + iPtrE=iPtr+(aLength*iSize); + iHead=iTail=iPtr; + iLength=aLength; + iCount=0; + } + +EXPORT_C void CCirBufBase::Reset() +/** +Empties the buffer. +*/ + { + + iHead=iTail=iPtr; + iCount=0; +#if defined(_DEBUG) + Mem::FillZ(iPtr,iLength*iSize); +#endif + } + +EXPORT_C TInt CCirBufBase::DoAdd(const TUint8 *aPtr) +/** +Implementation function for CCirBuf::Add(const T*) + +Adds a single object to the circular buffer, but only if there is +space available. + +@param aPtr A pointer to the object to be added. + +@return 1 if the object is successfully added. 0 if the object cannot be added + because the circular buffer is full. + +@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been + made before calling this function. + +@see CCirBuf::Add +@see CCirBufBase::SetLengthL +*/ + { + + __ASSERT_ALWAYS(iPtr!=NULL,Panic(ECircNoBufferAllocated)); + if (iCount>=iLength) + return(KErrNone); + Mem::Copy(iHead,aPtr,iSize); + iCount++; + iHead+=iSize; + if (iHead>=iPtrE) + iHead=iPtr; + return(1); + } + +EXPORT_C TInt CCirBufBase::DoAdd(const TUint8 *aPtr,TInt aCount) +/** +Implementation function for CCirBuf::Add(const T*,TInt) + +Adds multiple objects to the circular buffer, but only if there is +space available. + +@param aPtr A pointer to a set of contiguous objects to be added. + +@param aCount The number of objects to be added. + +@return The number of objects successfully added to the buffer. This value + may be less than the number requested and can range from 0 to aCount. + +@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been + made before calling this function. +@panic E32USER-CBase 75, if aCount is not a positive value. + +@see CCirBuf::Add +@see CCirBufBase::SetLengthL +*/ + { + + __ASSERT_ALWAYS(iPtr!=NULL,Panic(ECircNoBufferAllocated)); + __ASSERT_ALWAYS(aCount>0,Panic(ECircAddCountNegative)); + TInt rem=iLength-iCount; + if (rem==0) + return(0); + aCount=Min(aCount,rem); + rem=(iPtrE-iHead)/iSize; + if (aCount<=rem) + iHead=Mem::Copy(iHead,aPtr,aCount*iSize); + else + { + TInt len=(rem*iSize); + Mem::Copy(iHead,aPtr,len); + iHead=Mem::Copy(iPtr,aPtr+len,(aCount*iSize)-len); + } + if (iHead>=iPtrE) + iHead=iPtr; + iCount+=aCount; + return(aCount); + } + +EXPORT_C TInt CCirBufBase::DoRemove(TUint8 *aPtr) +/** +Implementation function for CCirBuf::Remove(T*) + +Removes a single object from the circular buffer, but only if there are +objects in the buffer. + +A binary copy of the object is made to aPtr. + +@param aPtr A pointer to a location supplied by the caller. + +@return 1 if an object is successfully removed. 0 if an object cannot be removed + because the circular buffer is empty. + +@see CCirBuf::Remove +*/ + { + + if (iCount==0) + return(0); + Mem::Copy(aPtr,iTail,iSize); + iTail+=iSize; + if (iTail>=iPtrE) + iTail=iPtr; + iCount--; + return(1); + } + +EXPORT_C TInt CCirBufBase::DoRemove(TUint8 *aPtr,TInt aCount) +/** +Implementation function for CCirBuf::Remove(T*,TInt) + +Attempts to remove aCount objects from the circular buffer, but only if there +are objects in the buffer. + +A binary copy of the objects is made to aPtr. + +@param aPtr A pointer to a location supplied by the caller capable of + holding aCount objects. + +@param aCount The number of objects to be removed from the circular buffer. + +@return The number of objects successfully removed from the buffer. This value + may be less than the number requested, and can range from 0 to aCount. + +@panic E32USER-CBase 76, if aCount is not a positive value. + +@see CCirBuf::Remove +*/ + { + + if (iCount==0) + return(0); + __ASSERT_ALWAYS(aCount>0,Panic(ECircRemoveCountNegative)); + aCount=Min(aCount,iCount); + TInt rem=(iPtrE-iTail)/iSize; + TInt len=rem*iSize; + if (aCount<=rem) + { + Mem::Copy(aPtr,iTail,aCount*iSize); + iTail+=aCount*iSize; + } + else + { + Mem::Copy(aPtr,iTail,len); + rem=(aCount*iSize)-len; + Mem::Copy(aPtr+len,iPtr,rem); + iTail=iPtr+rem; + } + if (iTail>=iPtrE) + iTail=iPtr; + iCount-=aCount; + return(aCount); + } + +EXPORT_C CCirBuffer::CCirBuffer() + : CCirBuf() +/** +Default C++ constructor. +*/ + {} + +EXPORT_C CCirBuffer::~CCirBuffer() +/** +Destructor +*/ + { + } + +EXPORT_C TInt CCirBuffer::Get() +/** +Removes an unsigned 8-bit integer value from the circular buffer and returns +its value. + +The returned TUint8 is promoted to a TInt to allow for negative error codes, +e.g. KErrGeneral. + +@return The unsigned 8-bit integer value removed from the circular buffer. + KErrGeneral, if the circular buffer is empty. +*/ + { + + if (iCount==0) + return(KErrGeneral); + TUint8 *p=iTail++; + if (iTail>=iPtrE) + iTail=iPtr; + iCount--; + return(*p); + } + +EXPORT_C TInt CCirBuffer::Put(TInt aVal) +/** +Adds an unsigned 8-bit integer value in the range 0 to 255 to the circular buffer. + +If the specified integer is outside the range 0 to 255, +this method discards all but the lowest 8 bits and treats those +as the unsigned integer to store. +For example, specifying -2 (or 510, or -258, etc) will result in 254 being stored, +and therefore in 254 being returned by the Get() method +(and not the number passed to Put()). + +@param aVal The unsigned 8-bit integer value to be added. +@return KErrNone, if the unsigned integer is successfully added. + KErrGeneral, if the unsigned integer cannnot be added because + the circular buffer is full. + +@see CCirBuffer::Get() +*/ + { + + __ASSERT_ALWAYS(iPtr!=NULL,Panic(ECircNoBufferAllocated)); + if (iCount>=iLength) + return(KErrGeneral); + *iHead++=(TUint8)aVal; + if (iHead>=iPtrE) + iHead=iPtr; + iCount++; + return(KErrNone); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/cbase/ub_cln.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/cbase/ub_cln.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,780 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\cbase\ub_cln.cpp +// +// + +#include "ub_std.h" +#include "us_data.h" + +const TInt KCleanupGranularity=4; +const TInt KCleanupInitialSlots=8; + +LOCAL_C void doDelete(CBase *aPtr) +// +// Delete the CBase pointer +// + { + + delete aPtr; + } + +LOCAL_C CCleanup &cleanup() +// +// Return the CTrapHandler's cleanup list. +// + { + + TCleanupTrapHandler *pH=(TCleanupTrapHandler *)GetTrapHandler(); + __ASSERT_ALWAYS(pH!=NULL,Panic(EClnNoTrapHandlerInstalled)); + return(pH->Cleanup()); + } + + + + +TCleanupTrapHandler::TCleanupTrapHandler() + : iCleanup(NULL) +/** +Default constructor. +*/ + {} + + + + +void TCleanupTrapHandler::Trap() +/** +Deals with the invocation of a call to TRAP. +*/ + { + + iCleanup->NextLevel(); + } + + + + +void TCleanupTrapHandler::UnTrap() +/** +Deals with a function exiting a TRAP without leaving. +*/ + { + + iCleanup->PreviousLevel(); + } + + + + +void TCleanupTrapHandler::Leave(TInt /*aValue*/) +/** +Deals with a function within a TRAP leaving. + +@param aValue The leave value. +*/ + { + + iCleanup->PopAndDestroyAll(); + } + + + + +class TCleanupStackItem + { +public: + void Set(const TCleanupItem &aItem); + inline void Cleanup(); + inline TBool IsLevelMarker() const; + inline void MarkLevel(); + inline void PushLevel(); + inline TInt PopLevel(); + inline TBool Check(TAny* aExpectedItem) const; +private: + TCleanupOperation iOperation; + union + { + TAny *iPtr; + TInt iLevelCount; // may stack >1 level on this entry + }; + }; +inline void TCleanupStackItem::MarkLevel() + { iOperation=NULL; iLevelCount=1; } +inline TBool TCleanupStackItem::IsLevelMarker() const + { return (iOperation==NULL); } +inline void TCleanupStackItem::Cleanup() + { (*iOperation)(iPtr); } +inline void TCleanupStackItem::PushLevel() + { ++iLevelCount; } +inline TInt TCleanupStackItem::PopLevel() + { return (--iLevelCount); } +inline TBool TCleanupStackItem::Check(TAny* aExpectedItem) const + { return (iOperation && iPtr==aExpectedItem); } + +void TCleanupStackItem::Set(const TCleanupItem &anItem) +// +// Initialise an entry as a cleanup item. +// + { + + __ASSERT_ALWAYS(anItem.iOperation!=NULL,Panic(EClnNoCleanupOperation)); + iOperation=anItem.iOperation; + iPtr=anItem.iPtr; + } + + + + +EXPORT_C CCleanup *CCleanup::New() +/** +Creates a new cleanup stack object. + +The cleanup stack itself is allocated with enough space initially to hold +a number of stack items. + +@return A pointer to the new cleanup stack object. This is Null if there is + insufficient memory. +*/ + { + + CCleanup *pC=new CCleanup; + if (pC!=NULL) + { + TCleanupStackItem *base=(TCleanupStackItem *)User::Alloc(KCleanupInitialSlots*sizeof(TCleanupStackItem)); + if (base!=NULL) + { + pC->iBase=base; + pC->iNext=base; + pC->iTop=base+KCleanupInitialSlots; + } + else + { + delete pC; + pC=NULL; + } + } + return(pC); + } + + + + +EXPORT_C CCleanup *CCleanup::NewL() +/** +Creates a new cleanup stack object, and leaves if there is insufficient memory +to create it. + +The cleanup stack itself is allocated with enough space initially to hold +a number of stack items. + +@return A pointer to the new cleanup stack object. This is Null if there is + nsufficient memory. +*/ + { + + CCleanup *pC=New(); + User::LeaveIfNull(pC); + return(pC); + } + + + + +EXPORT_C CCleanup::CCleanup() +/** +Default constructor. +*/ + { + +// iBase=NULL; +// iTop=NULL; +// iNext=NULL; + } + + + + +EXPORT_C CCleanup::~CCleanup() +/** +Destructor. + +Pops and destroys all items from the cleanup stack and then destroys +the cleanup stack itself. +*/ + { + + while (iNext>iBase) + PopAndDestroyAll(); + User::Free(iBase); + } + + + + +EXPORT_C void CCleanup::NextLevel() +/** +Goes to the next cleanup level. +*/ + { + + if (iNext>iBase && (iNext-1)->IsLevelMarker()) + (iNext-1)->PushLevel(); + else + { + iNext->MarkLevel(); + ++iNext; + } + } + + + + +EXPORT_C void CCleanup::PreviousLevel() +/** +Goes to the previous cleanup level. + +@panic E32USER-CBase 71 If the previous stack item does not represent a cleanup + level. +*/ + { + + TCleanupStackItem *item=iNext; + --item; + // current level must be empty + __ASSERT_ALWAYS(item->IsLevelMarker(), Panic(EClnLevelNotEmpty)); + if (item->PopLevel()) + ++item; + iNext=item; + } + + + + +EXPORT_C void CCleanup::PushL(TAny *aPtr) +/** +Pushes a cleanup item onto the cleanup stack. + +The cleanup item represents an operation that frees the specified heap cell. + +@param aPtr A pointer to a heap cell that will be freed by + the cleanup operation. +*/ + { + + PushL(TCleanupItem(User::Free,aPtr)); + } + + + + +EXPORT_C void CCleanup::PushL(CBase *anObject) +/** +Pushes a cleanup item onto the cleanup stack. + +The cleanup item represents an operation that deletes the specified CBase +derived object. + +@param anObject A pointer to CBase derived object that will be deleted by + the cleanup operation. +*/ + { + + PushL(TCleanupItem(TCleanupOperation(doDelete),anObject)); + } + + + + +EXPORT_C void CCleanup::PushL(TCleanupItem anItem) +/** +Pushes a cleanup item onto the cleanup stack. + +The cleanup item represents a call back operation that performs the required +cleanup. + +@param anItem Encapsulates a cleanup operation and an object on which the + cleanup operation is to be performed. + +@see CleanupClosePushL +@see CleanupReleasePushL +@see CleanupDeletePushL +*/ + { + + TCleanupStackItem *item=iNext; + __ASSERT_ALWAYS(item>iBase,Panic(EClnPushAtLevelZero)); + __ASSERT_ALWAYS(itemSet(anItem); + iNext=++item; +// +// We always try and make sure that there are two free slots in the cleanup array. +// one for a level marker and one for an item to follow it +// If this fails its o.k. as we have already added the entry to the list, so +// it will be cleaned up o.k. +// + if (item+1>=iTop) + { + TInt size=(TUint8 *)(iTop+KCleanupGranularity)-(TUint8 *)iBase; + TCleanupStackItem *base=(TCleanupStackItem *)User::ReAllocL(iBase,size); + iNext=PtrAdd(base,(TUint8 *)item-(TUint8 *)iBase); + iBase=base; + iTop=PtrAdd(base,size); + } + } + + + + +EXPORT_C void CCleanup::DoPop(TInt aCount,TBool aDestroy) +/** +Provides an implementation for Pop() and PopAndDestroy(). + +@param aCount The number of cleanup items to be popped from + the cleanup stack. +@param aDestroy ETrue, if cleanup is to be performed; EFalse, otherwise. +*/ + { + + __ASSERT_ALWAYS(aCount>=0,Panic(EClnPopCountNegative)); + __ASSERT_ALWAYS((iNext-aCount)>=iBase,Panic(EClnPopUnderflow)); + while (aCount--) + { + --iNext; + __ASSERT_ALWAYS(!iNext->IsLevelMarker(),Panic(EClnPopAcrossLevels)); + if (aDestroy) + { + TInt offset = iNext - iBase; + iNext->Cleanup(); + // Check that there are no extra items on the cleanup stack + // (if there are, we will not be deleting the right aCount items) + __ASSERT_ALWAYS((iNext - iBase) == offset,Panic(EClnStackModified)); + } + } + } + + + + +EXPORT_C void CCleanup::DoPopAll(TBool aDestroy) +/** +Provides an implementation for PopAll() and PopAndDestroyAll(). + +@param aDestroy ETrue, if cleanup is to be performed; EFalse, otherwise. +*/ + { + + __ASSERT_ALWAYS(iNext>iBase,Panic(EClnLevelUnderflow)); + while (!(--iNext)->IsLevelMarker()) + { + if (aDestroy) + iNext->Cleanup(); + } + if (iNext->PopLevel()) + ++iNext; // still marks a level + } + + + + +EXPORT_C void CCleanup::Pop() +/** +Pops a single cleanup item from the cleanup stack. + +@panic E32USER-CBase 64 If there are no items on the cleanup stack. +@panic E32USER-CBase 63 If a cleanup level is crossed. +*/ + { + + DoPop(1,EFalse); + } + + + + +EXPORT_C void CCleanup::Pop(TInt aCount) +/** +Pops the specified number of cleanup items from the cleanup stack. + +@param aCount The number of cleanup items to be popped from the cleanup stack. + +@panic E32USER-CBase 70 If the specified number of cleanup items is negative. +@panic E32USER-CBase 64 If the specifed number of items is greater than the + number of items on the cleanup stack. +@panic E32USER-CBase 63 If the specified number of items is such that it causes + a cleanup level to be crossed. +*/ + { + + DoPop(aCount,EFalse); + } + + + + +EXPORT_C void CCleanup::PopAll() +/** +Pops all cleanup items at the current level, and then decrements the level. +*/ + { + + DoPopAll(EFalse); + } + + + + +EXPORT_C void CCleanup::PopAndDestroy() +/** +Pops a single cleanup item from the cleanup stack, and invokes its cleanup +operation. + +@panic E32USER-CBase 64 If there are no items on the cleanup stack. +@panic E32USER-CBase 63 If a cleanup level is crossed. +*/ + { + + DoPop(1,ETrue); + } + + + + +EXPORT_C void CCleanup::PopAndDestroy(TInt aCount) +/** +Pops the specified number of cleanup items from the cleanup stack, and invokes +their cleanup operations. + +@param aCount The number of cleanup items to be popped from the cleanup stack. + +@panic E32USER-CBase 70 If the specified number of cleanup items is negative. +@panic E32USER-CBase 64 If the specifed number of items is greater than the + number of items on the cleanup stack. +@panic E32USER-CBase 63 If the specified number of items is such that it causes + a cleanup level to be crossed. +*/ + { + + DoPop(aCount,ETrue); + } + + + + +EXPORT_C void CCleanup::PopAndDestroyAll() +/** +Pops all cleanup items at the current level, invokes their cleanup operations +and then decrements the level. +*/ + { + + DoPopAll(ETrue); + } + + + + +EXPORT_C void CCleanup::Check(TAny* aExpectedItem) +/** +Checks that the cleanup item at the top of the cleanup stack +represents a cleanup operation for the specified object. + +@param aExpectedItem The object which is the subject of the test. +*/ + { + + TCleanupStackItem* last=iNext-1; + __ASSERT_ALWAYS(last>=iBase && last->Check(aExpectedItem), Panic(EClnCheckFailed)); + } + + + + +EXPORT_C CTrapCleanup *CTrapCleanup::New() +/** +Allocates and constructs a cleanup stack. + +If successfully constructed, this cleanup stack becomes +the current cleanup stack. + +@return A pointer to the new cleanup stack. This pointer is NULL, if allocation + fails. +*/ + { + + CTrapCleanup *pT=new CTrapCleanup; + if (pT!=NULL) + { + CCleanup *pC=CCleanup::New(); + if (pC!=NULL) + { + pT->iHandler.iCleanup=pC; + pT->iOldHandler=User::SetTrapHandler(&pT->iHandler); + } + else + { + delete pT; + pT=NULL; + } + } + return(pT); + } + + + + +EXPORT_C CTrapCleanup::CTrapCleanup() +/** +Default constructor. +*/ +// : iHandler() + { + } + + + + +EXPORT_C CTrapCleanup::~CTrapCleanup() +/** +Destructor. + +Frees resources owned by the object, prior to its destruction. This cleanup +stack ceases to be the current cleanup stack. + +If there is a stack of cleanup stacks, then the next cleanup stack becomes +the current cleanup stack. +*/ + { + + if (iHandler.iCleanup!=NULL) + { + User::SetTrapHandler(iOldHandler); + delete iHandler.iCleanup; + } + } + + + + +EXPORT_C void CleanupStack::PushL(TAny *aPtr) +/** +Pushes a pointer to an object onto the cleanup stack. + +If a leave occurs while an object is on the stack, it is cleaned +up automatically. Untyped objects are cleaned up with User::Free() +(a rather limited form of cleanup, not even the C++ destructor is called). + +Typically, when an object has been fully constructed and it can be guaranteed +that a pointer to this new object is stored in some other object before a leave +occurs, issue CleanupStack::Pop() to pop it back off the stack. + +If no cleanup stack has been allocated, a panic occurs. + +It is guaranteed that the object is pushed onto the cleanup stack. However, +this function may leave if a stack frame for the next PushL() cannot be +allocated. In this case, the cleanup stack will be cleaned up as normal, and +no extra programmer intervention is needed. + +@param aPtr Pointer to any object. If cleanup is necessary, the object will be + freed by User::Free(), which does not invoke any destructor: it + simply frees its memory + +@panic E32USER-CBase 66 if a call to this function is made when no prior + call to TRAP has been made. +*/ + { + + cleanup().PushL(aPtr); + } + + + + +EXPORT_C void CleanupStack::PushL(CBase *aPtr) +/** +Pushes a pointer to an object onto the cleanup stack. + +If a leave occurs while an object is on the stack, it is cleaned +up automatically. CBase derived objects are cleaned up with delete. + +Typically, when an object has been fully constructed and it can be guaranteed +that a pointer to this new object is stored in some other object before a leave +occurs, issue CleanupStack::Pop() to pop it back off the stack. + +If no cleanup stack has been allocated, a panic occurs. + +It is guaranteed that the object is pushed onto the cleanup stack. However, +this function may leave if a stack frame for the next PushL() cannot be +allocated. In this case, the cleanup stack will be cleaned up as normal, +and no extra programmer intervention is needed. + +@param aPtr Pointer to a CBase-derived object. If cleanup is necessary, the + object will be freed by delete, thus invoking its destructor, + and freeing its memory. + +@panic E32USER-CBase 66 if a call to this function is made when no prior + call to TRAP has been made. +*/ + { + + cleanup().PushL(aPtr); + } + + + + +EXPORT_C void CleanupStack::PushL(TCleanupItem anItem) +/** +Pushes a cleanup item onto the cleanup stack. + +If a leave occurs while a cleanup item is on the stack, the cleanup operation +defined in the construction of the TCleanupItem, is invoked. + +Typically, when an object has been fully constructed and it can be guaranteed +that a pointer to this new object is stored in some other object before a leave +occurs, issue CleanupStack::Pop() to pop it back off the stack. + +If no cleanup stack has been allocated, a panic occurs. + +It is guaranteed that the object is pushed onto the cleanup stack. However, +this function may leave if a stack frame for the next PushL() cannot be +allocated. In this case, the cleanup stack will be cleaned up as normal, +and no extra programmer intervention is needed. + +@param anItem A cleanup item. If cleanup is necessary, the cleanup operation + defined in the construction of anItem is called. + +@panic E32USER-CBase 66 if a call to this function is made when no prior + call to TRAP has been made. +*/ + { + + cleanup().PushL(anItem); + } + + + + +EXPORT_C void CleanupStack::Pop() +/** +Pops an object previously pushed onto the cleanup stack +by CleanupStack::PushL(). + +After an object has been successfully constructed and stored within +another object, it cannot be orphaned and, therefore, the object +(i.e. a pointer or a cleanup item) can be popped from the cleanup stack. + +If no cleanup stack has been allocated, or there is nothing on the stack, +a panic is raised. +*/ + { + + cleanup().Pop(); + } + + + + +EXPORT_C void CleanupStack::Pop(TInt aCount) +/** +Pops a specified number of objects previously pushed onto the +cleanup stack by CleanupStack::PushL(). + +After an object has been successfully constructed and stored within another +object, it cannot be orphaned and, therefore, the object(s), that is, pointers +and cleanup items can be popped from the cleanup stack. + +If no cleanup stack has been allocated, or there is nothing on the stack, +a panic is raised. + +@param aCount The number of objects to be popped off the cleanup stack. +*/ + { + + cleanup().Pop(aCount); + } + + + + +EXPORT_C void CleanupStack::PopAndDestroy() +/** +Pops and cleans up an item pushed onto the stack. + +If the item on the stack is a CBase* pointer, the pointer is removed from +the stack and the object is destroyed with delete. + +If the item on the stack is a TAny* pointer, the pointer is removed from +the stack and the memory occupied by the object is freed with User::Free(). + +If the item on the stack is a cleanup item, i.e. an object of +type TCleanupItem, the item is removed from the stack and the cleanup +operation defined during construction of the TCleanupItem object is invoked. + +If no cleanup stack has been allocated, or there is nothing on the stack, +a panic occurs. +*/ + { + + cleanup().PopAndDestroy(); + } + + + + +EXPORT_C void CleanupStack::PopAndDestroy(TInt aCount) +/** +Pops and cleans up the specified number of items pushed onto the stack. + +If an item on the stack is a CBase* pointer, the pointer is removed from +the stack and the object is destroyed with delete. + +If an item on the stack is a TAny* pointer, the pointer is removed from the +stack and the memory occupied by the object is freed with User::Free(). + +If an item on the stack is a cleanup item, i.e. an object of type TCleanupItem, +the item is removed from the stack and the cleanup operation defined during +construction of the TCleanupItem object is invoked. + +If no cleanup stack has been allocated, or there is nothing on the stack, +a panic occurs. + +@param aCount The number of objects to be popped off the cleanup stack and +destroyed. +*/ + { + + cleanup().PopAndDestroy(aCount); + } + + + + +EXPORT_C void CleanupStack::Check(TAny* aExpectedItem) +/** +Checks that the specified object is at the top of the cleanup stack. + +If the specified item is not at the top of the cleanup stack, then the function +raises an E32USER-CBase 90 panic. + +The function is part of Symbian OS in both debug and release builds, and is +an aid to debugging. + +@param aExpectedItem A pointer to the item expected to be at the top of the + cleanup stack. +*/ + { + + cleanup().Check(aExpectedItem); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/cbase/ub_cons.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/cbase/ub_cons.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,415 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\cbase\ub_cons.cpp +// +// + +#include "ub_std.h" +#ifndef __TOOLS2__ +#include +#include +#else +#if defined _WIN32 +#include +#else +#include +#include +#endif +#endif + + +/** +Default constructor. +*/ +EXPORT_C CConsoleBase::CConsoleBase() + { + } + + + +/** +Destructor. +*/ +EXPORT_C CConsoleBase::~CConsoleBase() + { + } + + + + +/** +Gets a character from the console. + +@return the key code from the console. +*/ +EXPORT_C TKeyCode CConsoleBase::Getch() + { + + TRequestStatus s; + Read(s); + User::WaitForRequest(s); + __ASSERT_ALWAYS(s==KErrNone,Panic(EConsGetchFailed)); + return(KeyCode()); + } + + + + +/** +Prints characters to the console window. + +@param aFmt The non-modifiable descriptor containing the + format string. The TRefByValue class provides a + constructor which takes a TDesC type. + +@param ... A variable number of arguments to be converted to text + as dictated by the format string. +*/ +EXPORT_C void CConsoleBase::Printf(TRefByValue aFmt,...) + { + + TestOverflowTruncate overflow; + VA_LIST list; + VA_START(list,aFmt); + TBuf<0x100> aBuf; + aBuf.AppendFormatList(aFmt,list,&overflow); + Write(aBuf); + } + + + +/** +Sets the cursor's x-position. + +@param aX The x-position. +*/ +EXPORT_C void CConsoleBase::SetPos(TInt aX) + { + + SetCursorPosAbs(TPoint(aX,WhereY())); + } + + + + +/** +Sets the cursor's x-position and y-position. + +@param aX The x-position. +@param aY The y-position. +*/ +EXPORT_C void CConsoleBase::SetPos(TInt aX,TInt aY) + { + + SetCursorPosAbs(TPoint(aX,aY)); + } + + + + +/** +Gets the cursor's x-position. + +@return The cursor's x-position. +*/ +EXPORT_C TInt CConsoleBase::WhereX() const + { + + return(CursorPos().iX); + } + + + +/** +Gets the cursor's y-position. + +@return The cursor's y-position. +*/ +EXPORT_C TInt CConsoleBase::WhereY() const + { + + return(CursorPos().iY); + } + + +/** +Extension function + + +*/ +EXPORT_C TInt CConsoleBase::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1) + { + return CBase::Extension_(aExtensionId, a0, a1); + } + + +#ifndef __TOOLS2__ + +void CColorConsoleBase::SetTextAttribute(TTextAttribute /*anAttribute*/) +// +// +// + { + } + + +/** +Extension function + + +*/ +EXPORT_C TInt CColorConsoleBase::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1) + { + return CConsoleBase::Extension_(aExtensionId, a0, a1); + } + + +NONSHARABLE_CLASS(CProxyConsole) : public CColorConsoleBase + { +public: + ~CProxyConsole(); + TInt Construct(const TDesC& aImplDll); +public: +// implement for CConsoleBase + TInt Create(const TDesC &aTitle,TSize aSize); + void Read(TRequestStatus &aStatus); + void ReadCancel(); + void Write(const TDesC &aDes); + TPoint CursorPos() const; + void SetCursorPosAbs(const TPoint &aPoint); + void SetCursorPosRel(const TPoint &aPoint); + void SetCursorHeight(TInt aPercentage); + void SetTitle(const TDesC &aTitle); + void ClearScreen(); + void ClearToEndOfLine(); + TSize ScreenSize() const; + TKeyCode KeyCode() const; + TUint KeyModifiers() const; +// implement for CColorConsoleBase + void SetTextAttribute(TTextAttribute anAttribute); + virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +private: + RLibrary iLib; + CColorConsoleBase* iConsole; + }; + +TInt CProxyConsole::Construct(const TDesC& aImplDll) + { + const TUidType type(KNullUid, KSharedLibraryUid, KConsoleDllUid); + TInt r=iLib.Load(aImplDll,type); + if (r==KErrNone) + { + iConsole=(CColorConsoleBase*)(iLib.Lookup(1)()); + if (!iConsole) + r=KErrNoMemory; + } + return r; + } + +CProxyConsole::~CProxyConsole() + { + delete iConsole; + iLib.Close(); + } + +TInt CProxyConsole::Create(const TDesC &aTitle,TSize aSize) + { + return iConsole->Create(aTitle,aSize); + } + +void CProxyConsole::Read(TRequestStatus &aStatus) + { + iConsole->Read(aStatus); + } + +void CProxyConsole::ReadCancel() + { + iConsole->ReadCancel(); + } + +void CProxyConsole::Write(const TDesC &aDes) + { + iConsole->Write(aDes); + } + +TPoint CProxyConsole::CursorPos() const + { + return iConsole->CursorPos(); + } + +void CProxyConsole::SetCursorPosAbs(const TPoint &aPoint) + { + iConsole->SetCursorPosAbs(aPoint); + } + +void CProxyConsole::SetCursorPosRel(const TPoint &aPoint) + { + iConsole->SetCursorPosRel(aPoint); + } + +void CProxyConsole::SetCursorHeight(TInt aPercentage) + { + iConsole->SetCursorHeight(aPercentage); + } + +void CProxyConsole::SetTitle(const TDesC &aTitle) + { + iConsole->SetTitle(aTitle); + } + +void CProxyConsole::ClearScreen() + { + iConsole->ClearScreen(); + } + +void CProxyConsole::ClearToEndOfLine() + { + iConsole->ClearToEndOfLine(); + } + +TSize CProxyConsole::ScreenSize() const + { + return iConsole->ScreenSize(); + } + +TKeyCode CProxyConsole::KeyCode() const + { + return iConsole->KeyCode(); + } + +TUint CProxyConsole::KeyModifiers() const + { + return iConsole->KeyModifiers(); + } + +void CProxyConsole::SetTextAttribute(TTextAttribute anAttribute) + { + iConsole->SetTextAttribute(anAttribute); + } + +TInt CProxyConsole::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1) + { + return iConsole->Extension_(aExtensionId, a0, a1); + } + +_LIT(KConsImpl,"econs"); +#ifdef __WINS__ +_LIT(KConsGuiImpl,"econseik"); +_LIT(KConsNoGuiImpl,"econsnogui"); +#endif + + + +/** +Creates a new console object. + +@param aTitle The title text for the console. + This should not be longer than 256 characters. +@param aSize The size of the console window. + +@return A pointer to the new console object. + +@see CConsoleBase::Create() +*/ +EXPORT_C CConsoleBase *Console::NewL(const TDesC &aTitle,TSize aSize) + { + CProxyConsole *pC=new(ELeave) CProxyConsole; + TInt r=pC->Construct(KConsImpl); + if (r==KErrNone) + r=pC->Create(aTitle,aSize); +#ifdef __WINS__ + if (r!=KErrNone) + { + delete pC; + pC=new(ELeave) CProxyConsole; + if (EmulatorNoGui()) + { + // try and create a dummy console via ECONSNOGUI + r=pC->Construct(KConsNoGuiImpl); + } + else + { + // try and create a GUI console via ECONSEIK instead + r=pC->Construct(KConsGuiImpl); + } + if (r==KErrNone) + r=pC->Create(aTitle,aSize); + } +#endif + if (r!=KErrNone) + { + delete pC; + User::Leave(r); + } + return(pC); + } +#else // __TOOLS2__ +class CStdConsole : public CConsoleBase + { +public: + CStdConsole() {}; + ~CStdConsole() {}; + // + TInt Create(const TDesC &aTitle,TSize aSize) { return KErrNone; }; + void ReadCancel() {}; + TPoint CursorPos() const { return TPoint(0,0); }; + void SetCursorPosAbs(const TPoint &aPoint) {}; + void SetCursorPosRel(const TPoint &aPoint) {}; + void SetCursorHeight(TInt aPercentage) {}; + void SetTitle(const TDesC &aTitle) {}; + void ClearScreen() {}; + void ClearToEndOfLine() {}; + TSize ScreenSize() const { return TSize(0,0); }; + TUint KeyModifiers() const { return 0; }; + // + void Read(TRequestStatus &aStatus); + void Write(const TDesC &aDes); + TKeyCode KeyCode() const { return iKey; }; + // +private: + TKeyCode iKey; + TBuf16<256> iBuf; + }; + +void CStdConsole::Read(TRequestStatus &aStatus) + { + iKey = TKeyCode(getchar()); + aStatus = KErrNone; + } + +void CStdConsole::Write(const TDesC &aDes) + { + TInt pos = 0; +#ifdef _WIN32 + while(pos < aDes.Length()) + { + TInt len = Min(aDes.Length() - pos, iBuf.MaxLength() - 1); + iBuf.Copy(aDes.Mid(pos, len)); + + pos += iBuf.Length(); + wprintf(reinterpret_cast(iBuf.PtrZ())); + } +#else + while(pos < aDes.Length()) + { + putchar(aDes[pos++]); + } +#endif + } + +EXPORT_C CConsoleBase *Console::NewL(const TDesC &aTitle, TSize aSize) + { + return new(ELeave)CStdConsole; + } +#endif // __TOOLS2__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/cbase/ub_std.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/cbase/ub_std.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,27 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\cbase\ub_std.h +// +// + +#include +#include +#include +#include +#include +#include + + +GLREF_C void Panic(TBasePanic aPanic); + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/cbase/ub_utl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/cbase/ub_utl.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,67 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\cbase\ub_utl.cpp +// +// + +#include "ub_std.h" + +_LIT(KE32UserCBase, "E32USER-CBase"); +GLDEF_C void Panic(TBasePanic aPanic) +// +// Panic the process with E32USER-ADT as the category. +// + { + + User::Panic(KE32UserCBase, aPanic); + } + + + + +/** +Virtual destructor. + +Enables any derived object to be deleted through a CBase* pointer. +*/ +EXPORT_C CBase::~CBase() + { + } + + + +/** +Extension function + + +*/ +EXPORT_C TInt CBase::Extension_(TUint, TAny*& a0, TAny*) + { + a0 = NULL; + return KErrExtensionNotSupported; + } + + + + +/** +Deletes the specified object. + +@param aPtr Pointer to the CBase derived object to be deleted. +*/ +EXPORT_C void CBase::Delete(CBase* aPtr) + { + delete aPtr; + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/epoc/x86/uc_i64.cia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/epoc/x86/uc_i64.cia Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,233 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\epoc\x86\uc_i64.cia +// +// + +#include "u32std.h" +#include + +extern "C" void UDiv64(); + +EXPORT_C __NAKED__ void Math::Mul64(Int64 /*aX*/, Int64 /*aY*/, Int64& /*aOutH*/, Uint64& /*aOutL*/) +/** +Multiply aX by aY to generate a 128 bit result. + +The high order 64 bits of this calculation are stored in aOutH, +and the low order 64 bits are stored in aOutL. + +@param aX The first 64-bit operand. +@param aY The second 64-bit operand. +@param aOutH The high order 64 bits of the result. +@param aOutL The low order 64 bits of the result. +*/ + { + asm("mov eax, [esp+4]"); + asm("mul dword ptr [esp+12]"); // edx:eax = x0*y0 + asm("push edi"); + asm("push esi"); + asm("push ebx"); // [esp+16]=&aX, [esp+24]=&aY, [esp+32]=&aOutH, [esp+36]=&aOutL + asm("mov ecx, eax"); + asm("mov ebx, edx"); // ebx:ecx = x0*y0 + asm("mov eax, [esp+16]"); + asm("mul dword ptr [esp+28]"); // edx:eax = x0*y1 + asm("xor esi, esi"); + asm("add ebx, eax"); + asm("adc esi, edx"); // esi:ebx:ecx = x0*y + asm("mov eax, [esp+20]"); // eax=x1 + asm("imul dword ptr [esp+28]"); // edx:eax = x1*y1 + asm("mov edi, edx"); + asm("add esi, eax"); + asm("adc edi, 0"); // partial result in edi:esi:ebx:ecx + asm("cmp dword ptr [esp+28],0");// y<0 ? + asm("jns mul64_ypos"); + asm("sub esi, [esp+16]"); // if so, subtract x0<<64 + asm("sbb edi, 0"); + asm("mul64_ypos:"); + asm("mov eax, [esp+20]"); // eax=x1 + asm("cmp eax, 0"); // x<0 ? + asm("jns mul64_xpos"); + asm("sub esi, [esp+24]"); // if so, subtract y0<<64 + asm("sbb edi, 0"); + asm("mul64_xpos:"); + asm("mul dword ptr [esp+24]"); // edx:eax = x1*y0 + asm("add ebx, eax"); + asm("mov eax, [esp+32]"); // eax=&aOutH + asm("adc esi, edx"); + asm("mov edx, [esp+36]"); // edx=&aOutL + asm("adc edi, 0"); // full result now in edi:esi:ebx:ecx + asm("mov [eax], esi"); + asm("mov [eax+4], edi"); // store high 64 + asm("mov [edx], ecx"); + asm("mov [edx+4], ebx"); // store low 64 + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("ret"); + } + + + + +EXPORT_C __NAKED__ void Math::UMul64(Uint64 /*aX*/, Uint64 /*aY*/, Uint64& /*aOutH*/, Uint64& /*aOutL*/) +/** +Multiply aX by aY to generate a 128 bit result. + +The high order 64 bits of this calculation are stored in aOutH, +and the low order 64 bits are stored in aOutL. + +@param aX The first 64-bit operand. +@param aY The second 64-bit operand. +@param aOutH The high order 64 bits of the result. +@param aOutL The low order 64 bits of the result. +*/ + { + asm("mov eax, [esp+4]"); + asm("mul dword ptr [esp+12]"); // edx:eax = x0*y0 + asm("push edi"); + asm("push esi"); + asm("push ebx"); // [esp+16]=&aX, [esp+24]=&aY, [esp+32]=&aOutH, [esp+36]=&aOutL + asm("mov ecx, eax"); + asm("mov ebx, edx"); // ebx:ecx = x0*y0 + asm("mov eax, [esp+16]"); + asm("mul dword ptr [esp+28]"); // edx:eax = x0*y1 + asm("xor esi, esi"); + asm("add ebx, eax"); + asm("adc esi, edx"); // esi:ebx:ecx = x0*y + asm("mov eax, [esp+20]"); // eax=x1 + asm("mul dword ptr [esp+28]"); // edx:eax = x1*y1 + asm("mov edi, edx"); + asm("add esi, eax"); + asm("adc edi, 0"); // partial result in edi:esi:ebx:ecx + asm("mov eax, [esp+20]"); + asm("mul dword ptr [esp+24]"); // edx:eax = x1*y0 + asm("add ebx, eax"); + asm("mov eax, [esp+32]"); // eax=&aOutH + asm("adc esi, edx"); + asm("mov edx, [esp+36]"); // edx=&aOutL + asm("adc edi, 0"); // full result now in edi:esi:ebx:ecx + asm("mov [eax], esi"); + asm("mov [eax+4], edi"); // store high 64 + asm("mov [edx], ecx"); + asm("mov [edx+4], ebx"); // store low 64 + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("ret"); + } + + + + +EXPORT_C __NAKED__ Int64 Math::DivMod64(Int64 /*aDividend*/, Int64 /*aDivisor*/, Int64& /*aRemainder*/) +/** +Divides aDividend by aDivisor. + +The quotient is returned, and the remainder is stored in aRemainder. +The remainder has same sign as the dividend. + +@param aDividend The 64-bit dividend. +@param aDivisor The 64-bit divisor. +@param aRemainder The 64-bit remainder. + +@return The 64-bit quotient. +*/ + { + asm("mov eax, [esp+4]"); + asm("mov edx, [esp+8]"); // edx:eax = dividend + asm("cmp edx, 0"); + asm("jns divmod64_0"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + + asm("divmod64_0:"); // edx:eax = ABS{dividend} + asm("push edi"); + asm("push esi"); + asm("push ebx"); + asm("push ebp"); + asm("mov esi, [esp+28]"); + asm("mov edi, [esp+32]"); // edi:esi = dividend + asm("cmp edi, 0"); + asm("jns divmod64_1"); + asm("neg edi"); + asm("neg esi"); + asm("sbb edi, 0"); // edi:esi = ABS{dividend} + + asm("divmod64_1:"); + asm("call %a0": : "i"(&UDiv64)); // do division, quotient in ebx:eax remainder in edi:edx + asm("xchg ebx, edx"); // quotient in edx:eax, remainder in edi:ebx + asm("mov ecx, [esp+24]"); // ecx=dividend high + asm("xor ecx, [esp+32]"); // ecx=dividend high ^ divisor high + asm("jns divmod64_2"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + + asm("divmod64_2:"); // edx:eax = quotient with correct sign + asm("cmp dword ptr [esp+24], 0"); + asm("jns divmod64_3"); + asm("neg edi"); + asm("neg ebx"); + asm("sbb edi, 0"); + + asm("divmod64_3:"); // edi:ebx = remainder with correct sign + asm("mov ecx, [esp+36]"); // ecx=&aRemainder + asm("mov [ecx], ebx"); + asm("mov [ecx+4], edi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("ret"); + } + + + + +EXPORT_C __NAKED__ Uint64 Math::UDivMod64(Uint64 /*aDividend*/, Uint64 /*aDivisor*/, Uint64& /*aRemainder*/) +/** +Divides aDividend by aDivisor. + +The quotient is returned, and the remainder is stored in aRemainder. + +@param aDividend The 64-bit dividend. +@param aDivisor The 64-bit divisor. +@param aRemainder The 64-bit remainder. + +@return The 64-bit quotient. +*/ + { + asm("mov eax, [esp+4]"); + asm("mov edx, [esp+8]"); // edx:eax = dividend + asm("push edi"); + asm("push esi"); + asm("push ebx"); + asm("push ebp"); + asm("mov esi, [esp+28]"); + asm("mov edi, [esp+32]"); // edi:esi = dividend + asm("call %a0": : "i"(&UDiv64)); // do division, quotient in ebx:eax remainder in edi:edx + asm("xchg ebx, edx"); // quotient in edx:eax, remainder in edi:ebx + asm("mov ecx, [esp+36]"); // ecx=&aRemainder + asm("mov [ecx], ebx"); + asm("mov [ecx+4], edi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("ret"); + } + + + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/epoc/x86/uc_realx.cia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/epoc/x86/uc_realx.cia Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,3348 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\epoc\x86\uc_realx.cia +// +// + + +#include "u32std.h" +#include + + +void TRealXPanic(TInt aErr); + +LOCAL_C __NAKED__ void TRealXPanicEax(void) + { + asm("push eax"); + asm("call %a0": : "i"(&TRealXPanic)); + } + +LOCAL_C __NAKED__ void TRealXRealIndefinite(void) + { + // return 'real indefinite' NaN in ecx,edx:ebx + asm("mov ecx, 0xFFFF0001"); // exponent=FFFF, sign negative + asm("mov edx, 0xC0000000"); // mantissa=C0000000 00000000 + asm("xor ebx, ebx"); + asm("mov eax, -6"); // return KErrArgument + asm("ret"); + } + +LOCAL_C __NAKED__ void TRealXBinOpNaN(void) + { + // generic routine to process NaN's in binary operations + // destination operand in ecx,edx:eax + // source operand at [esi] + + asm("mov eax, [esi+8]"); // source operand into eax,edi:ebp + asm("mov edi, [esi+4]"); + asm("mov ebp, [esi]"); + asm("cmp ecx, 0xFFFF0000"); // check if dest is a NaN + asm("jb short TRealXBinOpNaN1"); // if not, swap them + asm("cmp edx, 0x80000000"); + asm("jne short TRealXBinOpNaN2"); + asm("test ebx, ebx"); + asm("jne short TRealXBinOpNaN2"); + asm("TRealXBinOpNaN1:"); // swap the operands + asm("xchg ecx, eax"); + asm("xchg edx, edi"); + asm("xchg ebx, ebp"); + asm("TRealXBinOpNaN2:"); + asm("cmp eax, 0xFFFF0000"); // check if both operands are NaNs + asm("jb short TRealXBinOpNaN4"); // if not, ignore non-NaN operand + asm("cmp edi, 0x80000000"); + asm("jne short TRealXBinOpNaN3"); + asm("test ebp, ebp"); + asm("je short TRealXBinOpNaN4"); + asm("TRealXBinOpNaN3:"); // if both operands are NaN's, compare significands + asm("cmp edx, edi"); + asm("ja short TRealXBinOpNaN4"); + asm("jb short TRealXBinOpNaN5"); + asm("cmp ebx, ebp"); + asm("jae short TRealXBinOpNaN4"); + asm("TRealXBinOpNaN5:"); // come here if dest is smaller - copy source to dest + asm("mov ecx, eax"); + asm("mov edx, edi"); + asm("mov ebx, ebp"); + asm("TRealXBinOpNaN4:"); // NaN with larger significand is in ecx,edx:ebx + asm("or edx, 0x40000000"); // convert an SNaN to a QNaN + asm("mov eax, -6"); // return KErrArgument + asm("ret"); + } + +// Add TRealX at [esi] + ecx,edx:ebx +// Result in ecx,edx:ebx +// Error code in eax +// Note: +0 + +0 = +0, -0 + -0 = -0, +0 + -0 = -0 + +0 = +0, +// +/-0 + X = X + +/-0 = X, X + -X = -X + X = +0 +LOCAL_C __NAKED__ void TRealXAdd() + { + asm("xor ch, ch"); // clear rounding flags + asm("cmp ecx, 0xFFFF0000"); // check if dest=NaN or infinity + asm("jnc addfpsd"); // branch if it is + asm("mov eax, [esi+8]"); // fetch sign/exponent of source + asm("cmp eax, 0xFFFF0000"); // check if source=NaN or infinity + asm("jnc addfpss"); // branch if it is + asm("cmp eax, 0x10000"); // check if source=0 + asm("jc addfp0s"); // branch if it is + asm("cmp ecx, 0x10000"); // check if dest=0 + asm("jc addfp0d"); // branch if it is + asm("and cl, 1"); // clear bits 1-7 of ecx + asm("and al, 1"); // clear bits 1-7 of eax + asm("mov ch, cl"); + asm("xor ch, al"); // xor of signs into ch bit 0 + asm("add ch, ch"); + asm("or cl, ch"); // and into cl bit 1 + asm("or al, ch"); // and al bit 1 + asm("xor ch, ch"); // clear rounding flags + asm("mov ebp, [esi]"); // fetch source mantissa 0-31 + asm("mov edi, [esi+4]"); // fetch source mantissa 32-63 + asm("ror ecx, 16"); // dest exponent into cx + asm("ror eax, 16"); // source exponent into ax + asm("push ecx"); // push dest exponent/sign + asm("sub cx, ax"); // cx = dest exponent - source exponent + asm("je short addfp3b"); // if equal, no shifting required + asm("ja short addfp1"); // branch if dest exponent >= source exponent + asm("xchg ebx, ebp"); // make sure edi:ebp contains the mantissa to be shifted + asm("xchg edx, edi"); + asm("xchg eax, [esp]"); // and larger exponent and corresponding sign is on the stack + asm("neg cx"); // make cx positive = number of right shifts needed + asm("addfp1:"); + asm("cmp cx, 64"); // if more than 64 shifts needed + asm("ja addfp2"); // branch to output larger number + asm("jb addfp3"); // branch if <64 shifts + asm("mov eax, edi"); // exactly 64 shifts needed - rounding word=mant high + asm("test ebp, ebp"); // check bits lost + asm("jz short addfp3a"); + asm("or ch, 1"); // if not all zero, set rounded-down flag + asm("addfp3a:"); + asm("xor edi, edi"); // clear edx:ebx + asm("xor ebp, ebp"); + asm("jmp short addfp5"); // finished shifting + asm("addfp3b:"); // exponents equal + asm("xor eax, eax"); // set rounding word=0 + asm("jmp short addfp5"); + asm("addfp3:"); + asm("cmp cl, 32"); // 32 or more shifts needed ? + asm("jb short addfp4"); // skip if <32 + asm("mov eax, ebp"); // rounding word=mant low + asm("mov ebp, edi"); // mant low=mant high + asm("xor edi, edi"); // mant high=0 + asm("sub cl, 32"); // reduce count by 32 + asm("jz short addfp5"); // if now zero, finished shifting + asm("shrd edi, eax, cl"); // shift ebp:eax:edi right by cl bits + asm("shrd eax, ebp, cl"); // + asm("shr ebp, cl"); // + asm("test edi, edi"); // check bits lost in shift + asm("jz short addfp5"); // if all zero, finished + asm("or ch, 1"); // else set rounded-down flag + asm("xor edi, edi"); // clear edx again + asm("jmp short addfp5"); // finished shifting + asm("addfp4:"); // <32 shifts needed now + asm("xor eax, eax"); // clear rounding word initially + asm("shrd eax, ebp, cl"); // shift edi:ebp:eax right by cl bits + asm("shrd ebp, edi, cl"); // + asm("shr edi, cl"); // + + asm("addfp5:"); + asm("mov [esp+3], ch"); // rounding flag into ch image on stack + asm("pop ecx"); // recover sign and exponent into ecx, with rounding flag + asm("ror ecx, 16"); // into normal position + asm("test cl, 2"); // addition or subtraction needed ? + asm("jnz short subfp1"); // branch if subtraction + asm("add ebx,ebp"); // addition required - add mantissas + asm("adc edx,edi"); // + asm("jnc short roundfp"); // branch if no carry + asm("rcr edx,1"); // shift carry right into mantissa + asm("rcr ebx,1"); // + asm("rcr eax,1"); // and into rounding word + asm("jnc short addfp5a"); + asm("or ch, 1"); // if 1 shifted out, set rounded-down flag + asm("addfp5a:"); + asm("add ecx, 0x10000"); // and increment exponent + + // perform rounding based on rounding word in eax and rounding flag in ch + asm("roundfp:"); + asm("cmp eax, 0x80000000"); + asm("jc roundfp0"); // if rounding word<80000000, round down + asm("ja roundfp1"); // if >80000000, round up + asm("test ch, 1"); + asm("jnz short roundfp1"); // if rounded-down flag set, round up + asm("test ch, 2"); + asm("jnz short roundfp0"); // if rounded-up flag set, round down + asm("test bl, 1"); // else test mantissa lsb + asm("jz short roundfp0"); // round down if 0, up if 1 [round to even] + asm("roundfp1:"); // Come here to round up + asm("add ebx, 1"); // increment mantissa + asm("adc edx,0"); // + asm("jnc roundfp1a"); // if no carry OK + asm("rcr edx,1"); // else shift carry into mantissa [edx:ebx=0 here] + asm("add ecx, 0x10000"); // and increment exponent + asm("roundfp1a:"); + asm("cmp ecx, 0xFFFF0000"); // check for overflow + asm("jae short addfpovfw"); // jump if overflow + asm("mov ch, 2"); // else set rounded-up flag + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + asm("roundfp0:"); // Come here to round down + asm("cmp ecx, 0xFFFF0000"); // check for overflow + asm("jae short addfpovfw"); // jump if overflow + asm("test eax, eax"); // else check if rounding word zero + asm("jz short roundfp0a"); // if so, leave rounding flags as they are + asm("mov ch, 1"); // else set rounded-down flag + asm("roundfp0a:"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + asm("addfpovfw:"); // Come here if overflow occurs + asm("xor ch, ch"); // clear rounding flags, exponent=FFFF + asm("xor ebx, ebx"); + asm("mov edx, 0x80000000"); // mantissa=80000000 00000000 for infinity + asm("mov eax, -9"); // return KErrOverflow + asm("ret"); + + // exponents differ by more than 64 - output larger number + asm("addfp2:"); + asm("pop ecx"); // recover exponent and sign + asm("ror ecx, 16"); // into normal position + asm("or ch, 1"); // set rounded-down flag + asm("test cl, 2"); // check if signs the same + asm("jz addfp2a"); + asm("xor ch, 3"); // if not, set rounded-up flag + asm("addfp2a:"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // signs differ, so must subtract mantissas + asm("subfp1:"); + asm("add ch, ch"); // if rounded-down flag set, change it to rounded-up + asm("neg eax"); // subtract rounding word from 0 + asm("sbb ebx, ebp"); // and subtract mantissas with borrow + asm("sbb edx, edi"); // + asm("jnc short subfp2"); // if no borrow, sign is correct + asm("xor cl, 1"); // else change sign of result + asm("shr ch, 1"); // change rounding back to rounded-down + asm("not eax"); // negate rounding word + asm("not ebx"); // and mantissa + asm("not edx"); // + asm("add eax,1"); // two's complement negation + asm("adc ebx,0"); // + asm("adc edx,0"); // + asm("subfp2:"); + asm("jnz short subfp3"); // branch if edx non-zero at this point + asm("mov edx, ebx"); // else shift ebx into edx + asm("or edx, edx"); // + asm("jz short subfp4"); // if still zero, branch + asm("mov ebx, eax"); // else shift rounding word into ebx + asm("xor eax, eax"); // and zero rounding word + asm("sub ecx, 0x200000"); // decrease exponent by 32 due to shift + asm("jnc short subfp3"); // if no borrow, carry on + asm("jmp short subfpundflw"); // if borrow here, underflow + asm("subfp4:"); + asm("mov edx, eax"); // move rounding word into edx + asm("or edx, edx"); // is edx still zero ? + asm("jz short subfp0"); // if so, result is precisely zero + asm("xor ebx, ebx"); // else zero ebx and rounding word + asm("xor eax, eax"); // + asm("sub ecx, 0x400000"); // and decrease exponent by 64 due to shift + asm("jc short subfpundflw"); // if borrow, underflow + asm("subfp3:"); + asm("mov edi, ecx"); // preserve sign and exponent + asm("bsr ecx, edx"); // position of most significant 1 into ecx + asm("neg ecx"); // + asm("add ecx, 31"); // cl = 31-position of MS 1 = number of shifts to normalise + asm("shld edx, ebx, cl"); // shift edx:ebx:eax left by cl bits + asm("shld ebx, eax, cl"); // + asm("shl eax, cl"); // + asm("mov ebp, ecx"); // bit count into ebp for subtraction + asm("shl ebp, 16"); // shift left by 16 to align with exponent + asm("mov ecx, edi"); // exponent, sign, rounding flags back into ecx + asm("sub ecx, ebp"); // subtract shift count from exponent + asm("jc short subfpundflw"); // if borrow, underflow + asm("cmp ecx, 0x10000"); // check if exponent 0 + asm("jnc roundfp"); // if not, jump to round result, else underflow + + // come here if underflow + asm("subfpundflw:"); + asm("and ecx, 1"); // set exponent to zero, leave sign + asm("xor edx, edx"); + asm("xor ebx, ebx"); + asm("mov eax, -10"); // return KErrUnderflow + asm("ret"); + + // come here to return zero result + asm("subfp0:"); + asm("xor ecx, ecx"); // set exponent to zero, positive sign + asm("xor edx, edx"); + asm("xor ebx, ebx"); + asm("addfp0snzd:"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // come here if source=0 - eax=source exponent/sign + asm("addfp0s:"); + asm("cmp ecx, 0x10000"); // check if dest=0 + asm("jnc addfp0snzd"); // if not, return dest unaltered + asm("and ecx, eax"); // else both zero, result negative iff both zeros negative + asm("and ecx, 1"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // come here if dest=0, source nonzero + asm("addfp0d:"); + asm("mov ebx, [esi]"); // return source unaltered + asm("mov edx, [esi+4]"); + asm("mov ecx, [esi+8]"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // come here if dest=NaN or infinity + asm("addfpsd:"); + asm("cmp edx, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebx, ebx"); + _ASM_jn(e,TRealXBinOpNaN) + asm("mov eax, [esi+8]"); // eax=second operand exponent + asm("cmp eax, 0xFFFF0000"); // check second operand for NaN or infinity + asm("jae short addfpsd1"); // branch if NaN or infinity + asm("addfpsd2:"); + asm("mov eax, -9"); // else return dest unaltered [infinity] and KErrOverflow + asm("ret"); + asm("addfpsd1:"); + asm("mov ebp, [esi]"); // source mantissa into edi:ebp + asm("mov edi, [esi+4]"); + asm("cmp edi, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebp, ebp"); + _ASM_jn(e,TRealXBinOpNaN) + asm("xor al, cl"); // both operands are infinity - check signs + asm("test al, 1"); + asm("jz short addfpsd2"); // if both the same, return KErrOverflow + asm("jmp %a0": : "i"(&TRealXRealIndefinite)); // else return 'real indefinite' + + // come here if source=NaN or infinity, dest finite + asm("addfpss:"); + asm("mov ebp, [esi]"); // source mantissa into edi:ebp + asm("mov edi, [esi+4]"); + asm("cmp edi, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebp, ebp"); + _ASM_jn(e,TRealXBinOpNaN) + asm("mov ecx, eax"); // if source=infinity, return source unaltered + asm("mov edx, edi"); + asm("mov ebx, ebp"); + asm("mov eax, -9"); // return KErrOverflow + asm("ret"); + } + +// Subtract TRealX at [esi] - ecx,edx:ebx +// Result in ecx,edx:ebx +// Error code in eax +LOCAL_C __NAKED__ void TRealXSubtract() + { + asm("xor cl, 1"); // negate subtrahend + asm("jmp %a0": :"i"(&TRealXAdd)); + } + +// Multiply TRealX at [esi] * ecx,edx:ebx +// Result in ecx,edx:ebx +// Error code in eax +LOCAL_C __NAKED__ void TRealXMultiply() + { + asm("xor ch, ch"); // clear rounding flags + asm("mov eax, [esi+8]"); // fetch sign/exponent of source + asm("xor cl, al"); // xor signs + asm("cmp ecx, 0xFFFF0000"); // check if dest=NaN or infinity + asm("jnc mulfpsd"); // branch if it is + asm("cmp eax, 0xFFFF0000"); // check if source=NaN or infinity + asm("jnc mulfpss"); // branch if it is + asm("cmp eax, 0x10000"); // check if source=0 + asm("jc mulfp0"); // branch if it is + asm("cmp ecx, 0x10000"); // check if dest=0 + asm("jc mulfp0"); // branch if it is + asm("push ecx"); // save result sign + asm("shr ecx, 16"); // dest exponent into cx + asm("shr eax, 16"); // source exponent into ax + asm("add eax, ecx"); // add exponents + asm("sub eax, 0x7FFE"); // eax now contains result exponent + asm("push eax"); // save it + asm("mov edi, edx"); // save dest mantissa high + asm("mov eax, ebx"); // dest mantissa low -> eax + asm("mul dword ptr [esi]"); // dest mantissa low * source mantissa low -> edx:eax + asm("xchg ebx, eax"); // result dword 0 -> ebx, dest mant low -> eax + asm("mov ebp, edx"); // result dword 1 -> ebp + asm("mul dword ptr [esi+4]"); // dest mant low * src mant high -> edx:eax + asm("add ebp, eax"); // add in partial product to dwords 1 and 2 + asm("adc edx, 0"); // + asm("mov ecx, edx"); // result dword 2 -> ecx + asm("mov eax, edi"); // dest mant high -> eax + asm("mul dword ptr [esi+4]"); // dest mant high * src mant high -> edx:eax + asm("add ecx, eax"); // add in partial product to dwords 2, 3 + asm("adc edx, 0"); // + asm("mov eax, edi"); // dest mant high -> eax + asm("mov edi, edx"); // result dword 3 -> edi + asm("mul dword ptr [esi]"); // dest mant high * src mant low -> edx:eax + asm("add ebp, eax"); // add in partial product to dwords 1, 2 + asm("adc ecx, edx"); // + asm("adc edi, 0"); // 128-bit mantissa product is now in edi:ecx:ebp:ebx + asm("mov edx, edi"); // top 64 bits into edx:ebx + asm("mov edi, ebx"); + asm("mov ebx, ecx"); // bottom 64 bits now in ebp:edi + asm("pop ecx"); // recover exponent + asm("js short mulfp1"); // skip if mantissa normalised + asm("add edi, edi"); // else shift left [only one shift will be needed] + asm("adc ebp, ebp"); + asm("adc ebx, ebx"); + asm("adc edx, edx"); + asm("dec ecx"); // and decrement exponent + asm("mulfp1:"); + asm("cmp ebp, 0x80000000"); // compare bottom 64 bits with 80000000 00000000 for rounding + asm("ja short mulfp2"); // branch to round up + asm("jb short mulfp3"); // branch to round down + asm("test edi, edi"); + asm("jnz short mulfp2"); // branch to round up + asm("test bl, 1"); // if exactly half-way, test LSB of result mantissa + asm("jz short mulfp4"); // if LSB=0, round down [round to even] + asm("mulfp2:"); + asm("add ebx, 1"); // round up - increment mantissa + asm("adc edx, 0"); + asm("jnc short mulfp2a"); + asm("rcr edx, 1"); + asm("inc ecx"); + asm("mulfp2a:"); + asm("mov al, 2"); // set rounded-up flag + asm("jmp short mulfp5"); + asm("mulfp3:"); // round down + asm("xor al, al"); // clear rounding flags + asm("or ebp, edi"); // check for exact result + asm("jz short mulfp5"); // skip if exact + asm("mulfp4:"); // come here to round down when we know result inexact + asm("mov al, 1"); // else set rounded-down flag + asm("mulfp5:"); // final mantissa now in edx:ebx, exponent in ecx + asm("cmp ecx, 0xFFFF"); // check for overflow + asm("jge short mulfp6"); // branch if overflow + asm("cmp ecx, 0"); // check for underflow + asm("jle short mulfp7"); // branch if underflow + asm("shl ecx, 16"); // else exponent up to top end of ecx + asm("mov ch, al"); // rounding flags into ch + asm("pop eax"); // recover result sign + asm("mov cl, al"); // into cl + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // come here if overflow + asm("mulfp6:"); + asm("pop eax"); // recover result sign + asm("mov ecx, 0xFFFF0000"); // exponent=FFFF + asm("mov cl, al"); // sign into cl + asm("mov edx, 0x80000000"); // set mantissa to 80000000 00000000 for infinity + asm("xor ebx, ebx"); + asm("mov eax, -9"); // return KErrOverflow + asm("ret"); + + // come here if underflow + asm("mulfp7:"); + asm("pop eax"); // recover result sign + asm("xor ecx, ecx"); // exponent=0 + asm("mov cl, al"); // sign into cl + asm("xor edx, edx"); + asm("xor ebx, ebx"); + asm("mov eax, -10"); // return KErrUnderflow + asm("ret"); + + // come here if either operand zero + asm("mulfp0:"); + asm("and ecx, 1"); // set exponent=0, keep sign + asm("xor edx, edx"); + asm("xor ebx, ebx"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // come here if destination operand NaN or infinity + asm("mulfpsd:"); + asm("cmp edx, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebx, ebx"); + _ASM_jn(e,TRealXBinOpNaN) + asm("cmp eax, 0xFFFF0000"); // check second operand for NaN or infinity + asm("jae short mulfpsd1"); // branch if NaN or infinity + asm("cmp eax, 0x10000"); // check if second operand zero + _ASM_j(c,TRealXRealIndefinite) // if so, return 'real indefinite' + asm("mov eax, -9"); // else return dest [infinity] with xor sign and KErrOverflow + asm("ret"); + asm("mulfpsd1:"); + asm("mov ebp, [esi]"); // source mantissa into edi:ebp + asm("mov edi, [esi+4]"); + asm("cmp edi, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebp, ebp"); + _ASM_jn(e,TRealXBinOpNaN) + asm("mov eax, -9"); // both operands infinity - return infinity with xor sign + asm("ret"); // and KErrOverflow + + // come here if source operand NaN or infinity, destination finite + asm("mulfpss:"); + asm("mov ebp, [esi]"); // source mantissa into edi:ebp + asm("mov edi, [esi+4]"); + asm("cmp edi, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebp, ebp"); + _ASM_jn(e,TRealXBinOpNaN) + asm("cmp ecx, 0x10000"); // source=infinity, check if dest=0 + _ASM_j(c,TRealXRealIndefinite) // if so, return 'real indefinite' + asm("or ecx, 0xFFFF0000"); // set exp=FFFF, leave xor sign in cl + asm("mov edx, edi"); // set mantissa for infinity + asm("mov ebx, ebp"); + asm("mov eax, -9"); // return KErrOverflow + asm("ret"); + } + +// Divide 96-bit unsigned dividend EDX:EAX:0 by 64-bit unsigned divisor ECX:EBX +// Assume ECX bit 31 = 1, ie 2^63 <= divisor < 2^64 +// Assume the quotient fits in 32 bits +// Return 32 bit quotient in EDI +// Return 64 bit remainder in EBP:ESI +LOCAL_C __NAKED__ void LongDivide(void) + { + asm("push edx"); // save dividend + asm("push eax"); // + asm("cmp edx, ecx"); // check if truncation of divisor will overflow DIV instruction + asm("jb short longdiv1"); // skip if not + asm("xor eax, eax"); // else return quotient of 0xFFFFFFFF + asm("dec eax"); // + asm("jmp short longdiv2"); // + asm("longdiv1:"); + asm("div ecx"); // divide EDX:EAX by ECX to give approximate quotient in EAX + asm("longdiv2:"); + asm("mov edi, eax"); // save approx quotient + asm("mul ebx"); // multiply approx quotient by full divisor ECX:EBX + asm("mov esi, eax"); // first partial product into EBP:ESI + asm("mov ebp, edx"); // + asm("mov eax, edi"); // approx quotient back into eax + asm("mul ecx"); // upper partial product now in EDX:EAX + asm("add eax, ebp"); // add to form 96-bit product in EDX:EAX:ESI + asm("adc edx, 0"); // + asm("neg esi"); // remainder = dividend - approx quotient * divisor + asm("mov ebp, [esp]"); // fetch dividend bits 32-63 + asm("sbb ebp, eax"); // + asm("mov eax, [esp+4]"); // fetch dividend bits 64-95 + asm("sbb eax, edx"); // remainder is now in EAX:EBP:ESI + asm("jns short longdiv4"); // if remainder positive, quotient is correct, so exit + asm("longdiv3:"); + asm("dec edi"); // else quotient is too big, so decrement it + asm("add esi, ebx"); // and add divisor to remainder + asm("adc ebp, ecx"); // + asm("adc eax, 0"); // + asm("js short longdiv3"); // if still negative, repeat [requires <4 iterations] + asm("longdiv4:"); + asm("add esp, 8"); // remove dividend from stack + asm("ret"); // return with quotient in EDI, remainder in EBP:ESI + } + +// Divide TRealX at [esi] / ecx,edx:ebx +// Result in ecx,edx:ebx +// Error code in eax +LOCAL_C __NAKED__ void TRealXDivide(void) + { + asm("xor ch, ch"); // clear rounding flags + asm("mov eax, [esi+8]"); // fetch sign/exponent of dividend + asm("xor cl, al"); // xor signs + asm("cmp eax, 0xFFFF0000"); // check if dividend=NaN or infinity + asm("jnc divfpss"); // branch if it is + asm("cmp ecx, 0xFFFF0000"); // check if divisor=NaN or infinity + asm("jnc divfpsd"); // branch if it is + asm("cmp ecx, 0x10000"); // check if divisor=0 + asm("jc divfpdv0"); // branch if it is + asm("cmp eax, 0x10000"); // check if dividend=0 + asm("jc divfpdd0"); // branch if it is + asm("push esi"); // save pointer to dividend + asm("push ecx"); // save result sign + asm("shr ecx, 16"); // divisor exponent into cx + asm("shr eax, 16"); // dividend exponent into ax + asm("sub eax, ecx"); // subtract exponents + asm("add eax, 0x7FFE"); // eax now contains result exponent + asm("push eax"); // save it + asm("mov ecx, edx"); // divisor mantissa into ecx:ebx + asm("mov edx, [esi+4]"); // dividend mantissa into edx:eax + asm("mov eax, [esi]"); + asm("xor edi, edi"); // clear edi initially + asm("cmp edx, ecx"); // compare EDX:EAX with ECX:EBX + asm("jb short divfp1"); // if EDX:EAX < ECX:EBX, leave everything as is + asm("ja short divfp2"); // + asm("cmp eax, ebx"); // if EDX=ECX, then compare ls dwords + asm("jb short divfp1"); // if dividend mant < divisor mant, leave everything as is + asm("divfp2:"); + asm("sub eax, ebx"); // else dividend mant -= divisor mant + asm("sbb edx, ecx"); // + asm("inc edi"); // and EDI=1 [bit 0 of EDI is the integer part of the result] + asm("inc dword ptr [esp]"); // also increment result exponent + asm("divfp1:"); + asm("push edi"); // save top bit of result + asm("call %a0": : "i"(&LongDivide)); // divide EDX:EAX:0 by ECX:EBX to give next 32 bits of result in EDI + asm("push edi"); // save next 32 bits of result + asm("mov edx, ebp"); // remainder from EBP:ESI into EDX:EAX + asm("mov eax, esi"); // + asm("call %a0": : "i"(&LongDivide)); // divide EDX:EAX:0 by ECX:EBX to give next 32 bits of result in EDI + asm("test byte ptr [esp+4], 1"); // test integer bit of result + asm("jnz short divfp4"); // if set, no need to calculate another bit + asm("xor eax, eax"); // + asm("add esi, esi"); // 2*remainder into EAX:EBP:ESI + asm("adc ebp, ebp"); // + asm("adc eax, eax"); // + asm("sub esi, ebx"); // subtract divisor to generate final quotient bit + asm("sbb ebp, ecx"); // + asm("sbb eax, 0"); // + asm("jnc short divfp3"); // skip if no borrow - in this case eax=0 + asm("add esi, ebx"); // if borrow add back - final remainder now in EBP:ESI + asm("adc ebp, ecx"); // + asm("adc eax, 0"); // eax will be zero after this and carry will be set + asm("divfp3:"); + asm("cmc"); // final bit = 1-C + asm("rcr eax, 1"); // shift it into eax bit 31 + asm("mov ebx, edi"); // result into EDX:EBX:EAX, remainder in EBP:ESI + asm("pop edx"); + asm("add esp, 4"); // discard integer bit [zero] + asm("jmp short divfp5"); // branch to round + + asm("divfp4:"); // integer bit was set + asm("mov ebx, edi"); // result into EDX:EBX:EAX + asm("pop edx"); // + asm("pop eax"); // integer part of result into eax [=1] + asm("stc"); // shift a 1 into top end of mantissa + asm("rcr edx,1"); // + asm("rcr ebx,1"); // + asm("rcr eax,1"); // bottom bit into eax bit 31 + + // when we get to here we have 65 bits of quotient mantissa in + // EDX:EBX:EAX (bottom bit in eax bit 31) + // and the remainder is in EBP:ESI + asm("divfp5:"); + asm("pop ecx"); // recover result exponent + asm("add eax, eax"); // test rounding bit + asm("jnc short divfp6"); // branch to round down + asm("or ebp, esi"); // test remainder to see if we are exactly half-way + asm("jnz short divfp7"); // if not, round up + asm("test bl, 1"); // exactly halfway - test LSB of mantissa + asm("jz short divfp8"); // round down if LSB=0 [round to even] + asm("divfp7:"); + asm("add ebx, 1"); // round up - increment mantissa + asm("adc edx, 0"); + asm("jnc short divfp7a"); + asm("rcr edx, 1"); // if carry, shift 1 into mantissa MSB + asm("inc ecx"); // and increment exponent + asm("divfp7a:"); + asm("mov al, 2"); // set rounded-up flag + asm("jmp short divfp9"); + asm("divfp6:"); + asm("xor al, al"); // round down - first clear rounding flags + asm("or ebp, esi"); // test if result exact + asm("jz short divfp9"); // skip if exact + asm("divfp8:"); // come here to round down when we know result is inexact + asm("mov al, 1"); // set rounded-down flag + asm("divfp9:"); // final mantissa now in edx:ebx, exponent in ecx + asm("cmp ecx, 0xFFFF"); // check for overflow + asm("jge short divfp10"); // branch if overflow + asm("cmp ecx, 0"); // check for underflow + asm("jle short divfp11"); // branch if underflow + asm("shl ecx, 16"); // else exponent up to top end of ecx + asm("mov ch, al"); // rounding flags into ch + asm("pop eax"); // recover result sign + asm("mov cl, al"); // into cl + asm("pop esi"); // recover dividend pointer + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // come here if overflow + asm("divfp10:"); + asm("pop eax"); // recover result sign + asm("mov ecx, 0xFFFF0000"); // exponent=FFFF + asm("mov cl, al"); // sign into cl + asm("mov edx, 0x80000000"); // set mantissa to 80000000 00000000 for infinity + asm("xor ebx, ebx"); + asm("mov eax, -9"); // return KErrOverflow + asm("pop esi"); // recover dividend pointer + asm("ret"); + + // come here if underflow + asm("divfp11:"); + asm("pop eax"); // recover result sign + asm("xor ecx, ecx"); // exponent=0 + asm("mov cl, al"); // sign into cl + asm("xor edx, edx"); + asm("xor ebx, ebx"); + asm("mov eax, -10"); // return KErrUnderflow + asm("pop esi"); // recover dividend pointer + asm("ret"); + + + // come here if divisor=0, dividend finite + asm("divfpdv0:"); + asm("cmp eax, 0x10000"); // check if dividend also zero + _ASM_j(c,TRealXRealIndefinite) // if so, return 'real indefinite' + asm("or ecx, 0xFFFF0000"); // else set exponent=FFFF, leave xor sign in cl + asm("mov edx, 0x80000000"); // set mantissa for infinity + asm("xor ebx, ebx"); + asm("mov eax, -41"); // return KErrDivideByZero + asm("ret"); + + // come here if dividend=0, divisor finite and nonzero + asm("divfpdd0:"); + asm("and ecx, 1"); // exponent=0, leave xor sign in cl + asm("xor eax, eax"); // return KErrNone + asm("ret"); + + // come here if dividend is a NaN or infinity + asm("divfpss:"); + asm("mov ebp, [esi]"); // dividend mantissa into edi:ebp + asm("mov edi, [esi+4]"); + asm("cmp edi, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebp, ebp"); + _ASM_jn(e,TRealXBinOpNaN) + asm("cmp ecx, 0xFFFF0000"); // check divisor for NaN or infinity + asm("jae short divfpss1"); // branch if NaN or infinity + asm("or ecx, 0xFFFF0000"); // infinity/finite - return infinity with xor sign + asm("mov edx, 0x80000000"); + asm("xor ebx, ebx"); + asm("mov eax, -9"); // return KErrOverflow + asm("ret"); + asm("divfpss1:"); + asm("cmp edx, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebx, ebx"); + _ASM_jn(e,TRealXBinOpNaN) + asm("jmp %a0": : "i"(&TRealXRealIndefinite)); // if both operands infinite, return 'real indefinite' + + // come here if divisor is a NaN or infinity, dividend finite + asm("divfpsd:"); + asm("cmp edx, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebx, ebx"); + _ASM_jn(e,TRealXBinOpNaN) + asm("and ecx, 1"); // dividend is finite, divisor=infinity, so return 0 with xor sign + asm("xor edx, edx"); + asm("xor ebx, ebx"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + } + +// TRealX modulo - dividend at [esi], divisor in ecx,edx:ebx +// Result in ecx,edx:ebx +// Error code in eax +LOCAL_C __NAKED__ void TRealXModulo(void) + { + asm("mov eax, [esi+8]"); // fetch sign/exponent of dividend + asm("mov cl, al"); // result sign=dividend sign + asm("xor ch, ch"); // clear rounding flags + asm("cmp eax, 0xFFFF0000"); // check if dividend=NaN or infinity + asm("jnc short modfpss"); // branch if it is + asm("cmp ecx, 0xFFFF0000"); // check if divisor=NaN or infinity + asm("jnc short modfpsd"); // branch if it is + asm("cmp ecx, 0x10000"); // check if divisor=0 + _ASM_j(c,TRealXRealIndefinite) // if so, return 'real indefinite' + asm("shr eax, 16"); // ax=dividend exponent + asm("ror ecx, 16"); // cx=divisor exponent + asm("sub ax, cx"); // ax=dividend exponent-divisor exponent + asm("jc short modfpdd0"); // if dividend exponent is smaller, return dividend + asm("cmp ax, 64"); // check if exponents differ by >= 64 bits + asm("jnc short modfplp"); // if so, underflow + asm("mov ah, 0"); // ah bit 0 acts as 65th accumulator bit + asm("mov ebp, [esi]"); // edi:ebp=dividend mantissa + asm("mov edi, [esi+4]"); // + asm("jmp short modfp2"); // skip left shift on first iteration + asm("modfp1:"); + asm("add ebp, ebp"); // shift accumulator left [65 bits] + asm("adc edi, edi"); + asm("adc ah, ah"); + asm("modfp2:"); + asm("sub ebp, ebx"); // subtract divisor from dividend + asm("sbb edi, edx"); + asm("sbb ah, 0"); + asm("jnc short modfp3"); // skip if no borrow + asm("add ebp, ebx"); // else add back + asm("adc edi, edx"); + asm("adc ah, 0"); + asm("modfp3:"); + asm("dec al"); // any more bits to do? + asm("jns short modfp1"); // loop if there are + asm("mov edx, edi"); // result mantissa [not yet normalised] into edx:ebx + asm("mov ebx, ebp"); + asm("or edi, ebx"); // check for zero + asm("jz short modfp0"); // jump if result zero + asm("or edx, edx"); // check if ms dword zero + asm("jnz short modfp4"); + asm("mov edx, ebx"); // if so, shift left by 32 + asm("xor ebx, ebx"); + asm("sub cx, 32"); // and decrement exponent by 32 + asm("jbe short modfpund"); // if borrow or exponent zero, underflow + asm("modfp4:"); + asm("mov edi, ecx"); // preserve sign and exponent + asm("bsr ecx, edx"); // position of most significant 1 into ecx + asm("neg ecx"); // + asm("add ecx, 31"); // cl = 31-position of MS 1 = number of shifts to normalise + asm("shld edx, ebx, cl"); // shift edx:ebx left by cl bits + asm("shl ebx, cl"); // + asm("mov ebp, ecx"); // bit count into ebp for subtraction + asm("mov ecx, edi"); // exponent & sign back into ecx + asm("sub cx, bp"); // subtract shift count from exponent + asm("jbe short modfpund"); // if borrow or exponent 0, underflow + asm("rol ecx, 16"); // else ecx=exponent:sign + asm("xor eax, eax"); // normal exit, result in ecx,edx:ebx + asm("ret"); + + // dividend=NaN or infinity + asm("modfpss:"); + asm("mov ebp, [esi]"); // dividend mantissa into edi:ebp + asm("mov edi, [esi+4]"); + asm("cmp edi, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebp, ebp"); + _ASM_jn(e,TRealXBinOpNaN) + asm("cmp ecx, 0xFFFF0000"); // check divisor for NaN or infinity + _ASM_j(b,TRealXRealIndefinite) // infinity%finite - return 'real indefinite' + asm("cmp edx, 0x80000000"); // check for divisor=infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebx, ebx"); + _ASM_jn(e,TRealXBinOpNaN) + asm("jmp %a0": : "i"(&TRealXRealIndefinite)); // if both operands infinite, return 'real indefinite' + + // divisor=NaN or infinity, dividend finite + asm("modfpsd:"); + asm("cmp edx, 0x80000000"); // check for infinity + _ASM_jn(e,TRealXBinOpNaN) // branch if NaN + asm("test ebx, ebx"); + _ASM_jn(e,TRealXBinOpNaN) + // finite%infinity - return dividend unaltered + + asm("modfpdd0:"); + asm("mov ebx, [esi]"); // normal exit, return dividend unaltered + asm("mov edx, [esi+4]"); + asm("mov ecx, [esi+8]"); + asm("xor eax, eax"); + asm("ret"); + + asm("modfp0:"); + asm("shr ecx, 16"); // normal exit, result 0 + asm("xor eax, eax"); + asm("ret"); + + asm("modfpund:"); + asm("shr ecx, 16"); // underflow, result 0 + asm("mov eax, -10"); // return KErrUnderflow + asm("ret"); + + asm("modfplp:"); + asm("shr ecx, 16"); // loss of precision, result 0 + asm("mov eax, -7"); // return KErrTotalLossOfPrecision + asm("ret"); + } + + + + +__NAKED__ EXPORT_C TRealX::TRealX() +/** +Constructs a default extended precision object. + +This sets the value to zero. +*/ + { + THISCALL_PROLOG0() + asm("xor eax, eax"); + asm("mov [ecx], eax"); // set value to zero + asm("mov [ecx+4], eax"); + asm("mov [ecx+8], eax"); + asm("mov eax, ecx"); // must return this + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TRealX::TRealX(TUint /*aExp*/, TUint /*aMantHi*/, TUint /*aMantLo*/) +/** +Constructs an extended precision object from an explicit exponent and +a 64 bit mantissa. + +@param aExp The exponent +@param aMantHi The high order 32 bits of the 64 bit mantissa +@param aMantLo The low order 32 bits of the 64 bit mantissa +*/ + { + THISCALL_PROLOG3() + asm("mov eax, [esp+4]"); // eax=aExp + asm("mov [ecx+8], eax"); + asm("mov eax, [esp+8]"); // eax=aMantHi + asm("mov [ecx+4], eax"); + asm("mov eax, [esp+12]"); // eax=aMantLo + asm("mov [ecx], eax"); + asm("mov eax, ecx"); // must return this + THISCALL_EPILOG3() + } + + +__NAKED__ EXPORT_C TInt TRealX::Set(TInt /*aInt*/) +/** +Gives this extended precision object a new value taken +from a signed integer. + +@param aInt The signed integer value. + +@return KErrNone, always. +*/ + { + THISCALL_PROLOG1() + // on entry ecx=this, [esp+4]=aInt, return code in eax + asm("mov edx, [esp+4]"); // edx=aInt + asm("or edx, edx"); // test sign/zero + asm("mov eax, 0x7FFF"); + asm("jz short trealxfromint0_2"); // branch if 0 + asm("jns short trealxfromint1_2");// skip if positive + asm("neg edx"); // take absolute value + asm("add eax, 0x10000"); // sign bit in eax bit 16 + asm("trealxfromint1_2:"); + asm("push ecx"); // save this + asm("bsr ecx, edx"); // bit number of edx MSB into ecx + asm("add eax, ecx"); // add to eax to form result exponent + asm("neg cl"); + asm("add cl, 31"); // 31-bit number = number of shifts to normalise edx + asm("shl edx, cl"); // normalise edx + asm("pop ecx"); // this back into ecx + asm("ror eax, 16"); // sign/exponent into normal positions + asm("mov [ecx+4], edx"); // store mantissa high word + asm("mov [ecx+8], eax"); // store sign/exponent + asm("xor eax, eax"); + asm("mov [ecx], eax"); // zero mantissa low word + THISCALL_EPILOG1() // return KErrNone + asm("trealxfromint0_2:"); + asm("mov [ecx], edx"); + asm("mov [ecx+4], edx"); // store mantissa high word=0 + asm("mov [ecx+8], edx"); // store sign/exponent=0 + asm("xor eax, eax"); // return KErrNone + THISCALL_EPILOG1() + } + + + +__NAKED__ EXPORT_C TInt TRealX::Set(TUint /*aInt*/) +/** +Gives this extended precision object a new value taken from +an unsigned integer. + +@param aInt The unsigned integer value. + +@return KErrNone, always. +*/ + { + THISCALL_PROLOG1() + asm("mov edx, [esp+4]"); // edx=aInt + asm("mov eax, 0x7FFF"); + asm("or edx, edx"); // test for 0 + asm("jz short trealxfromuint0_");// branch if 0 + asm("push ecx"); // save this + asm("bsr ecx, edx"); // bit number of edx MSB into ecx + asm("add eax, ecx"); // add to eax to form result exponent + asm("neg cl"); + asm("add cl, 31"); // 31-bit number = number of shifts to normalise edx + asm("shl edx, cl"); // normalise edx + asm("pop ecx"); // this back into ecx + asm("shl eax, 16"); // exponent into normal position + asm("mov [ecx+4], edx"); // store mantissa high word + asm("mov [ecx+8], eax"); // store exponent + asm("xor eax, eax"); + asm("mov [ecx], eax"); // zero mantissa low word + THISCALL_EPILOG1() // return KErrNone + asm("trealxfromuint0_:"); + asm("mov [ecx], edx"); + asm("mov [ecx+4], edx"); // store mantissa high word=0 + asm("mov [ecx+8], edx"); // store sign/exponent=0 + asm("xor eax, eax"); // return KErrNone + THISCALL_EPILOG1() + } + + + + +LOCAL_C __NAKED__ void TRealXFromTInt64(void) + { + // Convert TInt64 in edx:ebx to TRealX in ecx,edx:ebx + asm("mov eax, 0x7FFF"); + asm("or edx, edx"); // test sign/zero + asm("jz short trealxfromtint64a"); // branch if top word zero + asm("jns short trealxfromtint64b"); + asm("add eax, 0x10000"); // sign bit into eax bit 16 + asm("neg edx"); // take absolute value + asm("neg ebx"); + asm("sbb edx, 0"); + asm("jz short trealxfromtint64d"); // branch if top word zero + asm("trealxfromtint64b:"); + asm("bsr ecx, edx"); // ecx=bit number of edx MSB + asm("add eax, ecx"); // add to exponent in eax + asm("add eax, 32"); + asm("neg cl"); + asm("add cl, 31"); // 31-bit number = number of left shifts to normalise + asm("shld edx, ebx, cl"); // shift left to normalise edx:ebx + asm("shl ebx, cl"); + asm("mov ecx, eax"); // sign/exponent into ecx + asm("ror ecx, 16"); // and into normal positions + asm("ret"); + asm("trealxfromtint64a:"); // come here if top word zero + asm("or ebx, ebx"); // test for bottom word also zero + asm("jz short trealxfromtint64c"); // branch if it is + asm("trealxfromtint64d:"); // come here if top word zero, bottom word not + asm("mov edx, ebx"); // shift edx:ebx left 32 + asm("xor ebx, ebx"); + asm("bsr ecx, edx"); // ecx=bit number of edx MSB + asm("add eax, ecx"); // add to exponent in eax + asm("neg cl"); + asm("add cl, 31"); // 31-bit number = number of left shifts to normalise + asm("shl edx, cl"); // normalise + asm("mov ecx, eax"); // sign/exponent into ecx + asm("ror ecx, 16"); // and into normal positions + asm("ret"); + asm("trealxfromtint64c:"); // entire number is zero + asm("xor ecx, ecx"); + asm("ret"); + } + + + + +__NAKED__ EXPORT_C TInt TRealX::Set(const TInt64& /*aInt*/) +/** +Gives this extended precision object a new value taken from +a 64 bit integer. + +@param aInt The 64 bit integer value. + +@return KErrNone, always. +*/ + { + // on entry ecx=this, [esp+4]=address of aInt, return code in eax + THISCALL_PROLOG1() + asm("push ebx"); + asm("push ecx"); + asm("mov edx, [esp+12]"); // edx=address of aInt + asm("mov ebx, [edx]"); + asm("mov edx, [edx+4]"); // edx:ebx=aInt + asm("call %a0": : "i"(&TRealXFromTInt64)); // convert to TRealX in ecx,edx:ebx + asm("pop eax"); // eax=this + asm("mov [eax], ebx"); // store result + asm("mov [eax+4], edx"); + asm("mov [eax+8], ecx"); + asm("xor eax, eax"); // return KErrNone + asm("pop ebx"); + THISCALL_EPILOG1() + } + + + +LOCAL_C __NAKED__ void __6TRealXi() + { + // common function for int to TRealX + THISCALL_PROLOG1() + asm("mov edx, [esp+4]"); // edx=aInt + asm("or edx, edx"); // test sign/zero + asm("mov eax, 0x7FFF"); + asm("jz short trealxfromint0"); // branch if 0 + asm("jns short trealxfromint1"); // skip if positive + asm("neg edx"); // take absolute value + asm("add eax, 0x10000"); // sign bit in eax bit 16 + asm("trealxfromint1:"); + asm("push ecx"); // save this + asm("bsr ecx, edx"); // bit number of edx MSB into ecx + asm("add eax, ecx"); // add to eax to form result exponent + asm("neg cl"); + asm("add cl, 31"); // 31-bit number = number of shifts to normalise edx + asm("shl edx, cl"); // normalise edx + asm("pop ecx"); // this back into ecx + asm("ror eax, 16"); // sign/exponent into normal positions + asm("mov [ecx+4], edx"); // store mantissa high word + asm("mov [ecx+8], eax"); // store sign/exponent + asm("xor eax, eax"); + asm("mov [ecx], eax"); // zero mantissa low word + asm("mov eax, ecx"); // return eax=this + THISCALL_EPILOG1() + asm("trealxfromint0:"); + asm("mov [ecx], edx"); + asm("mov [ecx+4], edx"); // store mantissa high word=0 + asm("mov [ecx+8], edx"); // store sign/exponent=0 + asm("mov eax, ecx"); // return eax=this + THISCALL_EPILOG1() + } + + +__NAKED__ EXPORT_C TRealX::TRealX(TInt /*aInt*/) +/** +Constructs an extended precision object from a signed integer value. + +@param aInt The signed integer value. +*/ + { + // on entry ecx=this, [esp+4]=aInt, return eax=this + asm("jmp %a0": : "i"(&__6TRealXi)); + } + + + + +__NAKED__ EXPORT_C TRealX& TRealX::operator=(TInt /*aInt*/) +/** +Assigns the specified signed integer value to this extended precision object. + +@param aInt The signed integer value. + +@return A reference to this extended precision object. +*/ + { + // on entry ecx=this, [esp+4]=aInt, return eax=this + asm("jmp %a0": : "i"(&__6TRealXi)); + } + + + +LOCAL_C __NAKED__ void __6TRealXui() + { + // common function for unsigned int to TRealX + THISCALL_PROLOG1() + asm("mov edx, [esp+4]"); // edx=aInt + asm("mov eax, 0x7FFF"); + asm("or edx, edx"); // test for zero + asm("jz short trealxfromuint0"); // branch if 0 + asm("push ecx"); // save this + asm("bsr ecx, edx"); // bit number of edx MSB into ecx + asm("add eax, ecx"); // add to eax to form result exponent + asm("neg cl"); + asm("add cl, 31"); // 31-bit number = number of shifts to normalise edx + asm("shl edx, cl"); // normalise edx + asm("pop ecx"); // this back into ecx + asm("shl eax, 16"); // exponent into normal position + asm("mov [ecx+4], edx"); // store mantissa high word + asm("mov [ecx+8], eax"); // store exponent + asm("xor eax, eax"); + asm("mov [ecx], eax"); // zero mantissa low word + asm("mov eax, ecx"); // return eax=this + THISCALL_EPILOG1() + asm("trealxfromuint0:"); + asm("mov [ecx], edx"); + asm("mov [ecx+4], edx"); // store mantissa high word=0 + asm("mov [ecx+8], edx"); // store sign/exponent=0 + asm("mov eax, ecx"); // return eax=this + THISCALL_EPILOG1() + } + + + +__NAKED__ EXPORT_C TRealX::TRealX(TUint /*aInt*/) +/** +Constructs an extended precision object from an unsigned integer value. + +@param aInt The unsigned integer value. +*/ + { + // on entry ecx=this, [esp+4]=aInt, return eax=this + asm("jmp %a0": : "i"(&__6TRealXui)); + } + + + + +__NAKED__ EXPORT_C TRealX& TRealX::operator=(TUint /*aInt*/) +/** +Assigns the specified unsigned integer value to this extended precision object. + +@param aInt The unsigned integer value. + +@return A reference to this extended precision object. +*/ + { + // on entry ecx=this, [esp+4]=aInt, return eax=this + asm("jmp %a0": : "i"(&__6TRealXui)); + } + + + + +LOCAL_C __NAKED__ void __6TRealXRC6TInt64() + { + // common function for TInt64 to TRealX + THISCALL_PROLOG1() + asm("push ebx"); // preserve ebx + asm("push ecx"); // save this + asm("mov edx, [esp+12]"); // edx=address of aInt + asm("mov ebx, [edx]"); + asm("mov edx, [edx+4]"); // edx:ebx=aInt + asm("call %a0": : "i"(&TRealXFromTInt64)); // convert to TRealX in ecx,edx:ebx + asm("pop eax"); // eax=this + asm("mov [eax], ebx"); // store result + asm("mov [eax+4], edx"); + asm("mov [eax+8], ecx"); + asm("mov ecx, eax"); // restore this ptr + asm("pop ebx"); // restore ebx + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C TRealX::TRealX(const TInt64& /*aInt*/) +/** +Constructs an extended precision object from a 64 bit integer. + +@param aInt A reference to a 64 bit integer. +*/ + { + // on entry ecx=this, [esp+4]=address of aInt, return eax=this + asm("jmp %a0": : "i"(&__6TRealXRC6TInt64)); + } + + + + +__NAKED__ EXPORT_C TRealX& TRealX::operator=(const TInt64& /*aInt*/) +/** +Assigns the specified 64 bit integer value to this extended precision object. + +@param aInt A reference to a 64 bit integer. + +@return A reference to this extended precision object. +*/ + { + // on entry ecx=this, [esp+4]=address of aInt, return eax=this + asm("jmp %a0": : "i"(&__6TRealXRC6TInt64)); + } + + + + +LOCAL_C __NAKED__ void ConvertTReal32ToTRealX(void) + { + // Convert TReal32 in edx to TRealX in ecx:edx,ebx + asm("xor ebx, ebx"); // mant low always zero + asm("mov eax, edx"); + asm("shr eax, 23"); // exponent now in al, sign in ah bit 0 + asm("test al, al"); // check for denormal/zero + asm("jz short treal32totrealx2"); // branch if denormal/zero + asm("xor ecx, ecx"); + asm("mov cl, al"); + asm("add ecx, 0x7F80"); // bias exponent correctly for TRealX + asm("cmp al, 0xFF"); // check for infinity/NaN + asm("jnz short treal32totrealx1"); // skip if neither + asm("mov cl, al"); // else set TRealX exponent to FFFF + asm("mov ch, al"); + asm("treal32totrealx1:"); + asm("shl edx, 8"); // left-justify mantissa in edx + asm("or edx, 0x80000000"); // put in implied integer bit + asm("shl ecx, 16"); // exponent into ecx bits 16-31 + asm("mov cl, ah"); // sign into ecx bit 0 + asm("ret"); + asm("treal32totrealx2:"); // come here if exponent 0 + asm("shl edx, 9"); // left-justify mantissa in edx [shift out integer bit as well] + asm("jnz short treal32totrealx3"); // jump if denormal + asm("xor ecx, ecx"); // else return 0 + asm("mov cl, ah"); // with same sign as input value + asm("ret"); + asm("treal32totrealx3:"); // come here if denormal + asm("bsr ecx, edx"); // ecx=bit number of MSB of edx + asm("neg ecx"); + asm("add ecx, 31"); // ecx=number of left shifts to normalise edx + asm("shl edx, cl"); // normalise + asm("neg ecx"); + asm("add ecx, 0x7F80"); // exponent=7F80-number of shifts + asm("shl ecx, 16"); // exponent into ecx bits 16-31 + asm("mov cl, ah"); // sign into ecx bit 0 + asm("ret"); + } + + + + +LOCAL_C __NAKED__ void ConvertTReal64ToTRealX(void) + { + // Convert TReal64 in edx:ebx to TRealX in ecx:edx,ebx + asm("mov eax, edx"); + asm("shr eax, 20"); + asm("mov ecx, 0x7FF"); + asm("and ecx, eax"); // ecx=exponent + asm("jz short treal64totrealx1"); // branch if zero/denormal + asm("add ecx, 0x7C00"); // else bias exponent correctly for TRealX + asm("cmp ecx, 0x83FF"); // check for infinity/NaN + asm("jnz short treal64totrealx2"); + asm("mov ch, cl"); // if so, set exponent to FFFF + asm("treal64totrealx2:"); + asm("shl ecx, 16"); // exponent into ecx bits 16-31 + asm("mov cl, 11"); // number of shifts needed to justify mantissa correctly + asm("shld edx, ebx, cl"); // shift mantissa left + asm("shl ebx, cl"); + asm("or edx, 0x80000000"); // put in implied integer bit + asm("shr eax, 11"); // sign bit into al bit 0 + asm("mov cl, al"); // into ecx bit 0 + asm("ret"); + asm("treal64totrealx1:"); // come here if zero/denormal + asm("mov cl, 12"); // number of shifts needed to justify mantissa correctly + asm("shld edx, ebx, cl"); // shift mantissa left + asm("shl ebx, cl"); + asm("test edx, edx"); // check for zero + asm("jnz short treal64totrealx3"); + asm("test ebx, ebx"); + asm("jnz short treal64totrealx4"); + asm("shr eax, 11"); // sign bit into eax bit 0, rest of eax=0 + asm("mov ecx, eax"); // return 0 result with correct sign + asm("ret"); + asm("treal64totrealx4:"); // come here if denormal, edx=0 + asm("mov edx, ebx"); // shift mantissa left 32 + asm("xor ebx, ebx"); + asm("bsr ecx, edx"); // ecx=bit number of MSB of edx + asm("neg ecx"); + asm("add ecx, 31"); // ecx=number of left shifts to normalise edx + asm("shl edx, cl"); // normalise + asm("neg ecx"); + asm("add ecx, 0x7BE0"); // exponent=7BE0-number of shifts + asm("shl ecx, 16"); // exponent into bits 16-31 of ecx + asm("shr eax, 11"); + asm("mov cl, al"); // sign into bit 0 of ecx + asm("ret"); + asm("treal64totrealx3:"); // come here if denormal, edx nonzero + asm("bsr ecx, edx"); // ecx=bit number of MSB of edx + asm("neg ecx"); + asm("add ecx, 31"); // ecx=number of left shifts to normalise edx:ebx + asm("shld edx, ebx, cl"); // normalise + asm("shl ebx, cl"); + asm("neg ecx"); + asm("add ecx, 0x7C00"); // exponent=7C00-number of shifts + asm("shl ecx, 16"); // exponent into bits 16-31 of ecx + asm("shr eax, 11"); + asm("mov cl, al"); // sign into bit 0 of ecx + asm("ret"); + } + + + + +__NAKED__ EXPORT_C TInt TRealX::Set(TReal32 /*aReal*/) +/** +Gives this extended precision object a new value taken from +a single precision floating point number. + +@param aReal The single precision floating point value. + +@return KErrNone, if a valid number; +KErrOverflow, if the number is infinite; +KErrArgument, if not a number. +*/ + { + // on entry, ecx=this and aReal is in [esp+4] + // on exit, error code in eax + THISCALL_PROLOG1() + asm("push ecx"); + asm("push ebx"); // save ebx + asm("push ecx"); // save this + asm("mov edx, [esp+16]"); // aReal into edx + asm("call %a0": : "i"(&ConvertTReal32ToTRealX)); + asm("pop eax"); // eax=this + asm("mov [eax], ebx"); // store result + asm("mov [eax+4], edx"); + asm("mov [eax+8], ecx"); + asm("xor eax, eax"); // error code=KErrNone initially + asm("cmp ecx, 0xFFFF0000"); // check for infinity/NaN + asm("jb short trealxsettreal32a"); // if neither, return KErrNone + asm("mov eax, -9"); // eax=KErrOverflow + asm("cmp edx, 0x80000000"); // check for infinity + asm("je short trealxsettreal32a"); // if infinity, return KErrOverflow + asm("mov eax, -6"); // if NaN, return KErrArgument + asm("trealxsettreal32a:"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C TInt TRealX::Set(TReal64 /*aReal*/) +/** +Gives this extended precision object a new value taken from +a double precision floating point number. + +@param aReal The double precision floating point value. + +@return KErrNone, if a valid number; +KErrOverflow, if the number is infinite; +KErrArgument, if not a number. +*/ + { + // on entry, ecx=this and aReal is in [esp+4] (mant low) and [esp+8] (sign/exp/mant high) + // on exit, error code in eax + THISCALL_PROLOG2() + asm("push ecx"); + asm("push ebx"); // save ebx + asm("push ecx"); // save this + asm("mov ebx, [esp+16]"); // aReal into edx:ebx + asm("mov edx, [esp+20]"); + asm("call %a0": : "i"(&ConvertTReal64ToTRealX)); + asm("pop eax"); // eax=this + asm("mov [eax], ebx"); // store result + asm("mov [eax+4], edx"); + asm("mov [eax+8], ecx"); + asm("xor eax, eax"); // error code=KErrNone initially + asm("cmp ecx, 0xFFFF0000"); // check for infinity/NaN + asm("jb short trealxsettreal64a"); // if neither, return KErrNone + asm("mov eax, -9"); // eax=KErrOverflow + asm("cmp edx, 0x80000000"); // check for infinity + asm("jne short trealxsettreal64b"); // branch if NaN + asm("test ebx, ebx"); + asm("je short trealxsettreal64a"); // if infinity, return KErrOverflow + asm("trealxsettreal64b:"); + asm("mov eax, -6"); // if NaN, return KErrArgument + asm("trealxsettreal64a:"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG2() + } + + + + +LOCAL_C __NAKED__ void __6TRealXf() + { + // common function for float to TRealX + THISCALL_PROLOG1() + asm("push ebx"); // save ebx + asm("push ecx"); // save this + asm("mov edx, [esp+12]"); // aReal into edx + asm("call %a0": : "i"(&ConvertTReal32ToTRealX)); + asm("pop eax"); // eax=this + asm("mov [eax], ebx"); // store result + asm("mov [eax+4], edx"); + asm("mov [eax+8], ecx"); + asm("pop ebx"); + asm("mov ecx,eax"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C TRealX::TRealX(TReal32 /*aReal*/) +/** +Constructs an extended precision object from +a single precision floating point number. + +@param aReal The single precision floating point value. +*/ + { + // on entry, ecx=this and aReal is in [esp+4] + // on exit, eax=this + asm("jmp %a0": : "i"(&__6TRealXf)); + } + + + + +__NAKED__ EXPORT_C TRealX& TRealX::operator=(TReal32 /*aReal*/) +/** +Assigns the specified single precision floating point number to +this extended precision object. + +@param aReal The single precision floating point value. + +@return A reference to this extended precision object. +*/ + { + // on entry, ecx=this and aReal is in [esp+4] + // on exit, eax=this + asm("jmp %a0": : "i"(&__6TRealXf)); + } + + + + +LOCAL_C __NAKED__ void __6TRealXd() + { + // common function for double to TRealX + THISCALL_PROLOG2() + asm("push ebx"); // save ebx + asm("push ecx"); // save this + asm("mov ebx, [esp+12]"); // aReal into edx:ebx + asm("mov edx, [esp+16]"); + asm("call %a0": : "i"(&ConvertTReal64ToTRealX)); + asm("pop eax"); // eax=this + asm("mov [eax], ebx"); // store result + asm("mov [eax+4], edx"); + asm("mov [eax+8], ecx"); + asm("pop ebx"); + asm("mov ecx,eax"); + THISCALL_EPILOG2() + } + + + + +__NAKED__ EXPORT_C TRealX::TRealX(TReal64 /*aReal*/) +/** +Constructs an extended precision object from +a double precision floating point number. + +@param aReal The double precision floating point value. +*/ + { + // on entry, ecx=this and aReal is in [esp+4] (mant low) and [esp+8] (sign/exp/mant high) + // on exit, eax=this + asm("jmp %a0": : "i"(&__6TRealXd)); + } + + + + +__NAKED__ EXPORT_C TRealX& TRealX::operator=(TReal64 /*aReal*/) +/** +Assigns the specified double precision floating point number to +this extended precision object. + +@param aReal The double precision floating point value. + +@return A reference to this extended precision object. +*/ + { + // on entry, ecx=this and aReal is in [esp+4] (mant low) and [esp+8] (sign/exp/mant high) + // on exit, eax=this + asm("jmp %a0": : "i"(&__6TRealXd)); + } + + + + +__NAKED__ EXPORT_C TRealX::operator TInt() const +/** +Gets the extended precision value as a signed integer value. + +The operator asm("returns:"); + +1. zero , if the extended precision value is not a number + +2. 0x7FFFFFFF, if the value is positive and too big to fit into a TInt. + +3. 0x80000000, if the value is negative and too big to fit into a TInt. +*/ + { + // on entry ecx=this, return value in eax + THISCALL_PROLOG0() + asm("push ecx"); + asm("mov edx, [ecx]"); // edx=mantissa low + asm("mov eax, [ecx+4]"); // eax=mantissa high + asm("mov ecx, [ecx+8]"); // ecx=exponent/sign + asm("ror ecx, 16"); // exponent into cx + asm("cmp cx, 0xFFFF"); + asm("jz short trealxtoint1"); // branch if exp=FFFF + asm("mov dx, cx"); + asm("mov cx, 0x801E"); + asm("sub cx, dx"); // cx=number of right shifts needed to convert mantissa to int + asm("jbe short trealxtoint2"); // if exp>=801E, saturate result + asm("cmp cx, 31"); // more than 31 shifts needed? + asm("ja short trealxtoint0"); // if so, underflow to zero + asm("shr eax, cl"); // else ABS[result]=eax>>cl + asm("test ecx, 0x10000"); // test sign + asm("jz short trealxtoint3"); // skip if + + asm("neg eax"); + asm("trealxtoint3:"); + asm("pop ecx"); + THISCALL_EPILOG0() + asm("trealxtoint1:"); // come here if exponent=FFFF + asm("cmp eax, 0x80000000"); // check for infinity + asm("jnz short trealxtoint0"); // if NaN, return 0 + asm("test edx, edx"); + asm("jnz short trealxtoint0"); // if NaN, return 0 + asm("trealxtoint2:"); // come here if argument too big for 32-bit integer + asm("mov eax, 0x7FFFFFFF"); + asm("shr ecx, 17"); // sign bit into carry flag + asm("adc eax, 0"); // eax=7FFFFFFF if +, 80000000 if - + asm("pop ecx"); + THISCALL_EPILOG0() // return saturated value + asm("trealxtoint0:"); // come here if INT{argument}=0 or NaN + asm("xor eax, eax"); // return 0 + asm("pop ecx"); + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TRealX::operator TUint() const +/** +Returns the extended precision value as an unsigned signed integer value. + +The operator asm("returns:"); + +1. zero, if the extended precision value is not a number + +2. 0xFFFFFFFF, if the value is positive and too big to fit into a TUint. + +3. zero, if the value is negative and too big to fit into a TUint. +*/ + { + // on entry ecx=this, return value in eax + THISCALL_PROLOG0() + asm("push ecx"); + asm("mov edx, [ecx]"); // edx=mantissa low + asm("mov eax, [ecx+4]"); // eax=mantissa high + asm("mov ecx, [ecx+8]"); // ecx=exponent/sign + asm("ror ecx, 16"); // exponent into cx + asm("cmp cx, 0xFFFF"); + asm("jz short trealxtouint1"); // branch if exp=FFFF + asm("mov dx, cx"); + asm("mov cx, 0x801E"); + asm("sub cx, dx"); // cx=number of right shifts needed to convert mantissa to int + asm("jb short trealxtouint2"); // if exp>801E, saturate result + asm("cmp cx, 31"); // more than 31 shifts needed? + asm("ja short trealxtouint0"); // if so, underflow to zero + asm("test ecx, 0x10000"); // test sign + asm("jnz short trealxtouint0"); // if -, return 0 + asm("shr eax, cl"); // else result=eax>>cl + asm("pop ecx"); + THISCALL_EPILOG0() + asm("trealxtouint1:"); // come here if exponent=FFFF + asm("cmp eax, 0x80000000"); // check for infinity + asm("jnz short trealxtouint0"); // if NaN, return 0 + asm("test edx, edx"); + asm("jnz short trealxtouint0"); // if NaN, return 0 + asm("trealxtouint2:"); // come here if argument too big for 32-bit integer + asm("mov eax, 0xFFFFFFFF"); + asm("shr ecx, 17"); // sign bit into carry flag + asm("adc eax, 0"); // eax=FFFFFFFF if +, 0 if - + asm("pop ecx"); + THISCALL_EPILOG0() // return saturated value + asm("trealxtouint0:"); // come here if INT{argument}=0 or NaN + asm("xor eax, eax"); // return 0 + asm("pop ecx"); + THISCALL_EPILOG0() + } + + + + +LOCAL_C __NAKED__ void ConvertTRealXToTInt64(void) + { + // Convert TRealX in ecx,edx:ebx to TInt64 in edx:ebx + asm("ror ecx, 16"); // exponent into cx + asm("cmp cx, 0xFFFF"); + asm("jz short trealxtoint64a"); // branch if exp=FFFF + asm("mov ax, cx"); + asm("mov cx, 0x803E"); + asm("sub cx, ax"); // cx=number of right shifts needed to convert mantissa to int + asm("jbe short trealxtoint64b"); // if exp>=803E, saturate result + asm("cmp cx, 63"); // more than 63 shifts needed? + asm("ja short trealxtoint64z"); // if so, underflow to zero + asm("cmp cl, 31"); // more than 31 shifts needed? + asm("jbe short trealxtoint64d"); // branch if not + asm("sub cl, 32"); // cl=shift count - 32 + asm("mov ebx, edx"); // shift right by 32 + asm("xor edx, edx"); + asm("trealxtoint64d:"); + asm("shrd ebx, edx, cl"); // shift edx:ebx right by cl to give ABS{result} + asm("shr edx, cl"); + asm("test ecx, 0x10000"); // test sign + asm("jz short trealxtoint64c"); // skip if + + asm("neg edx"); // if -, negate + asm("neg ebx"); + asm("sbb edx, 0"); + asm("trealxtoint64c:"); + asm("ret"); + asm("trealxtoint64a:"); // come here if exponent=FFFF + asm("cmp edx, 0x80000000"); // check for infinity + asm("jnz short trealxtoint64z"); // if NaN, return 0 + asm("test ebx, ebx"); + asm("jnz short trealxtoint64z"); // if NaN, return 0 + asm("trealxtoint64b:"); // come here if argument too big for 32-bit integer + asm("mov edx, 0x7FFFFFFF"); + asm("mov ebx, 0xFFFFFFFF"); + asm("shr ecx, 17"); // sign bit into carry flag + asm("adc ebx, 0"); // edx:ebx=7FFFFFFF FFFFFFFF if +, + asm("adc edx, 0"); // or 80000000 00000000 if - + asm("ret"); // return saturated value + asm("trealxtoint64z:"); // come here if INT{argument}=0 or NaN + asm("xor edx, edx"); // return 0 + asm("xor ebx, ebx"); + asm("ret"); + } + + + + +/** +Returns the extended precision value as a 64 bit integer value. + +The operator asm("returns:"); + +1. zero, if the extended precision value is not a number + +2. 0x7FFFFFFF FFFFFFFF, if the value is positive and too big to fit +into a TInt64 + +3. 0x80000000 00000000, if the value is negative and too big to fit +into a TInt. +*/ +__NAKED__ EXPORT_C TRealX::operator TInt64() const + { + // on entry, ecx=this, return value in edx:eax + THISCALL_PROLOG0() + asm("push ecx"); + asm("push ebx"); + asm("mov ebx, [ecx]"); // get TRealX value into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&ConvertTRealXToTInt64)); + asm("mov eax, ebx"); // result low into eax + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG0() + } + + + + +LOCAL_C __NAKED__ void TRealXGetTReal32(void) + { + // Convert TRealX in ecx,edx:ebx to TReal32 in edx + // Return error code in eax + asm("cmp ecx, 0xFFFF0000"); // check for infinity/NaN + asm("jnc short trealxgettreal32a"); + asm("xor eax, eax"); + asm("ror ecx, 16"); // exponent into cx + asm("sub cx, 0x7F80"); // cx=result exponent if normalised + asm("jbe short trealxgettreal32b"); // jump if denormal, zero or underflow + asm("cmp cx, 0xFF"); // check if overflow + asm("jb short trealxgettreal32c"); // jump if not + asm("trealxgettreal32d:"); // come here if overflow + asm("xor edx, edx"); // set mantissa=0 to generate infinity + asm("ror ecx, 16"); // ecx back to normal format + asm("trealxgettreal32a:"); // come here if infinity or NaN + asm("shr edx, 7"); + asm("or edx, 0xFF000000"); // set exponent to FF + asm("shr ecx, 1"); // sign bit -> carry + asm("rcr edx, 1"); // sign bit -> MSB of result + asm("mov eax, edx"); + asm("shl eax, 9"); // test for infinity or NaN + asm("mov eax, -9"); // eax=KErrOverflow + asm("jz short trealxgettreal32e"); + asm("mov eax, -6"); // if NaN, eax=KErrArgument + asm("trealxgettreal32e:"); + asm("ret"); + asm("trealxgettreal32b:"); // come here if exponent<=7F80 + asm("cmp cx, -24"); // check for zero or total underflow + asm("jle short trealxgettreal32z"); + asm("neg cl"); + asm("inc cl"); // cl=number of right shifts to form denormal mantissa + asm("shrd eax, ebx, cl"); // shift mantissa right into eax + asm("shrd ebx, edx, cl"); + asm("shr edx, cl"); + asm("or edx, 0x80000000"); // set top bit to ensure correct rounding up + asm("xor cl, cl"); // cl=result exponent=0 + asm("trealxgettreal32c:"); // come here if result normalised + asm("cmp dl, 0x80"); // check rounding bits + asm("ja short trealxgettreal32f"); // branch to round up + asm("jb short trealxgettreal32g"); // branch to round down + asm("test ebx, ebx"); + asm("jnz short trealxgettreal32f"); // branch to round up + asm("test eax, eax"); + asm("jnz short trealxgettreal32f"); // branch to round up + asm("test ecx, 0x01000000"); // check rounded-down flag + asm("jnz short trealxgettreal32f"); // branch to round up + asm("test ecx, 0x02000000"); // check rounded-up flag + asm("jnz short trealxgettreal32g"); // branch to round down + asm("test dh, 1"); // else round to even + asm("jz short trealxgettreal32g"); // branch to round down if LSB=0 + asm("trealxgettreal32f:"); // come here to round up + asm("add edx, 0x100"); // increment mantissa + asm("jnc short trealxgettreal32g"); + asm("rcr edx, 1"); + asm("inc cl"); // if carry, increment exponent + asm("cmp cl, 0xFF"); // and check for overflow + asm("jz short trealxgettreal32d"); // branch out if overflow + asm("trealxgettreal32g:"); // come here to round down + asm("xor dl, dl"); + asm("add edx, edx"); // shift out integer bit + asm("mov dl, cl"); + asm("ror edx, 8"); // exponent->edx bits 24-31, mantissa in 23-1 + asm("test edx, edx"); // check if underflow + asm("jz short trealxgettreal32h"); // branch out if underflow + asm("shr ecx, 17"); // sign bit->carry + asm("rcr edx, 1"); // ->edx bit 31, exp->edx bits 23-30, mant->edx bits 22-0 + asm("xor eax, eax"); // return KErrNone + asm("ret"); + asm("trealxgettreal32z:"); // come here if zero or underflow + asm("xor eax, eax"); + asm("cmp cx, 0x8080"); // check for zero + asm("jz short trealxgettreal32y"); // if zero, return KErrNone + asm("trealxgettreal32h:"); // come here if underflow after rounding + asm("mov eax, -10"); // eax=KErrUnderflow + asm("trealxgettreal32y:"); + asm("xor edx, edx"); + asm("shr ecx, 17"); + asm("rcr edx, 1"); // sign bit into edx bit 31, rest of edx=0 + asm("ret"); + } + + + + +LOCAL_C __NAKED__ void TRealXGetTReal64(void) + { + // Convert TRealX in ecx,edx:ebx to TReal64 in edx:ebx + // Return error code in eax + // edi, esi also modified + asm("ror ecx, 16"); // exponent into cx + asm("cmp cx, 0xFFFF"); // check for infinity/NaN + asm("jnc short trealxgettreal64a"); + asm("xor eax, eax"); + asm("xor edi, edi"); + asm("sub cx, 0x7C00"); // cx=result exponent if normalised + asm("jbe short trealxgettreal64b"); // jump if denormal, zero or underflow + asm("cmp cx, 0x07FF"); // check if overflow + asm("jb short trealxgettreal64c"); // jump if not + asm("trealxgettreal64d:"); // come here if overflow + asm("xor edx, edx"); // set mantissa=0 to generate infinity + asm("xor ebx, ebx"); + asm("trealxgettreal64a:"); // come here if infinity or NaN + asm("mov cl, 10"); + asm("shrd ebx, edx, cl"); + asm("shr edx, cl"); + asm("or edx, 0xFFE00000"); // set exponent to 7FF + asm("shr ecx, 17"); // sign bit -> carry + asm("rcr edx, 1"); // sign bit -> MSB of result + asm("rcr ebx, 1"); + asm("mov eax, edx"); + asm("shl eax, 12"); // test for infinity or NaN + asm("mov eax, -9"); // eax=KErrOverflow + asm("jnz short trealxgettreal64n"); + asm("test ebx, ebx"); + asm("jz short trealxgettreal64e"); + asm("trealxgettreal64n:"); + asm("mov eax, -6"); // if NaN, eax=KErrArgument + asm("trealxgettreal64e:"); + asm("ret"); + asm("trealxgettreal64b:"); // come here if exponent<=7C00 + asm("cmp cx, -53"); // check for zero or total underflow + asm("jle short trealxgettreal64z"); + asm("neg cl"); + asm("inc cl"); // cl=number of right shifts to form denormal mantissa + asm("cmp cl, 32"); + asm("jb trealxgettreal64x"); + asm("mov eax, ebx"); // if >=32 shifts, do 32 shifts and decrement count by 32 + asm("mov ebx, edx"); + asm("xor edx, edx"); + asm("trealxgettreal64x:"); + asm("shrd edi, eax, cl"); + asm("shrd eax, ebx, cl"); // shift mantissa right into eax + asm("shrd ebx, edx, cl"); + asm("shr edx, cl"); + asm("or edx, 0x80000000"); // set top bit to ensure correct rounding up + asm("xor cx, cx"); // cx=result exponent=0 + asm("trealxgettreal64c:"); // come here if result normalised + asm("mov esi, ebx"); + asm("and esi, 0x7FF"); // esi=rounding bits + asm("cmp esi, 0x400"); // check rounding bits + asm("ja short trealxgettreal64f"); // branch to round up + asm("jb short trealxgettreal64g"); // branch to round down + asm("test eax, eax"); + asm("jnz short trealxgettreal64f"); // branch to round up + asm("test edi, edi"); + asm("jnz short trealxgettreal64f"); // branch to round up + asm("test ecx, 0x01000000"); // check rounded-down flag + asm("jnz short trealxgettreal64f"); // branch to round up + asm("test ecx, 0x02000000"); // check rounded-up flag + asm("jnz short trealxgettreal64g"); // branch to round down + asm("test ebx, 0x800"); // else round to even + asm("jz short trealxgettreal64g"); // branch to round down if LSB=0 + asm("trealxgettreal64f:"); // come here to round up + asm("add ebx, 0x800"); // increment mantissa + asm("adc edx, 0"); + asm("jnc short trealxgettreal64g"); + asm("rcr edx, 1"); + asm("inc cx"); // if carry, increment exponent + asm("cmp cx, 0x7FF"); // and check for overflow + asm("jz short trealxgettreal64d"); // branch out if overflow + asm("trealxgettreal64g:"); // come here to round down + asm("xor bl, bl"); // clear rounding bits + asm("and bh, 0xF8"); + asm("mov di, cx"); // save exponent + asm("mov cl, 10"); + asm("and edx, 0x7FFFFFFF"); // clear integer bit + asm("shrd ebx, edx, cl"); // shift mantissa right by 10 + asm("shr edx, cl"); + asm("shl edi, 21"); // exponent into edi bits 21-31 + asm("or edx, edi"); // into edx bits 21-31 + asm("test edx, edx"); // check if underflow + asm("jnz short trealxgettreal64i"); + asm("test ebx, ebx"); + asm("jz short trealxgettreal64h"); // branch out if underflow + asm("trealxgettreal64i:"); + asm("shr ecx, 17"); // sign bit->carry + asm("rcr edx, 1"); // ->edx bit 31, exp->edx bits 20-30, mant->edx bits 20-0 + asm("rcr ebx, 1"); + asm("xor eax, eax"); // return KErrNone + asm("ret"); + asm("trealxgettreal64z:"); // come here if zero or underflow + asm("xor eax, eax"); + asm("cmp cx, 0x8400"); // check for zero + asm("jz short trealxgettreal64y"); // if zero, return KErrNone + asm("trealxgettreal64h:"); // come here if underflow after rounding + asm("mov eax, -10"); // eax=KErrUnderflow + asm("trealxgettreal64y:"); + asm("xor edx, edx"); + asm("xor ebx, ebx"); + asm("shr ecx, 17"); + asm("rcr edx, 1"); // sign bit into edx bit 31, rest of edx=0, ebx=0 + asm("ret"); + } + + + + +__NAKED__ EXPORT_C TRealX::operator TReal32() const +/** +Returns the extended precision value as +a single precision floating point value. +*/ + { + // On entry, ecx=this + // On exit, TReal32 value on top of FPU stack + THISCALL_PROLOG0() + asm("push ecx"); + asm("push ebx"); + asm("mov ebx, [ecx]"); // *this into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXGetTReal32)); // Convert to TReal32 in edx + asm("push edx"); // push TReal32 onto stack + asm("fld dword ptr [esp]"); // push TReal32 onto FPU stack + asm("pop edx"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TRealX::operator TReal64() const +/** +Returns the extended precision value as +a double precision floating point value. +*/ + { + // On entry, ecx=this + // On exit, TReal64 value on top of FPU stack + THISCALL_PROLOG0() + asm("push ecx"); + asm("push ebx"); + asm("push esi"); + asm("push edi"); + asm("mov ebx, [ecx]"); // *this into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXGetTReal64)); // Convert to TReal32 in edx:ebx + asm("push edx"); // push TReal64 onto stack + asm("push ebx"); + asm("fld qword ptr [esp]"); // push TReal64 onto FPU stack + asm("add esp, 8"); + asm("pop edi"); + asm("pop esi"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TInt TRealX::GetTReal(TReal32& /*aVal*/) const +/** +Extracts the extended precision value as +a single precision floating point value. + +@param aVal A reference to a single precision object which contains +the result of the operation. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow. +*/ + { + // On entry, ecx=this, [esp+4]=address of aVal + // On exit, eax=return code + THISCALL_PROLOG1() + asm("push ecx"); + asm("push ebx"); + asm("mov ebx, [ecx]"); // *this into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXGetTReal32)); + asm("mov ecx, [esp+12]"); // ecx=address of aVal + asm("mov [ecx], edx"); // store result + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::GetTReal(TReal64& /*aVal*/) const +/** +Extracts the extended precision value as +a double precision floating point value. + +@param aVal A reference to a double precision object which +contains the result of the operation. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow. +*/ + { + // On entry, ecx=this, [esp+4]=address of aVal + // On exit, eax=return code + THISCALL_PROLOG1() + asm("push ecx"); + asm("push ebx"); + asm("push esi"); + asm("push edi"); + asm("mov ebx, [ecx]"); // *this into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXGetTReal64)); + asm("mov ecx, [esp+20]"); // ecx=address of aVal + asm("mov [ecx], ebx"); // store result + asm("mov [ecx+4], edx"); + asm("pop edi"); + asm("pop esi"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C void TRealX::SetZero(TBool /*aNegative*/) +/** +Sets the value of this extended precision object to zero. + +@param aNegative ETrue, the value is a negative zero; +EFalse, the value is a positive zero, this is the default. +*/ + { + THISCALL_PROLOG1() + asm("mov edx, [esp+4]"); // aNegative into edx + asm("xor eax, eax"); // eax=0 + asm("mov [ecx], eax"); + asm("mov [ecx+4], eax"); + asm("test edx, edx"); + asm("jz short setzero1"); + asm("inc eax"); // eax=1 if aNegative!=0 + asm("setzero1:"); + asm("mov [ecx+8], eax"); // generate positive or negative zero + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C void TRealX::SetNaN() +/** +Sets the value of this extended precision object to 'not a number'. +*/ + { + THISCALL_PROLOG0() + asm("xor eax, eax"); // set *this to 'real indefinite' + asm("mov [ecx], eax"); + asm("mov eax, 0xC0000000"); + asm("mov [ecx+4], eax"); + asm("mov eax, 0xFFFF0001"); + asm("mov [ecx+8], eax"); + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C void TRealX::SetInfinite(TBool /*aNegative*/) +/** +Sets the value of this extended precision object to infinity. + +@param aNegative ETrue, the value is a negative zero; +EFalse, the value is a positive zero. +*/ + { + THISCALL_PROLOG1() + asm("mov edx, [esp+4]"); // aNegative into edx + asm("mov eax, 0xFFFF0000"); // exponent=FFFF, sign=0 initially + asm("test edx, edx"); + asm("jz short setinf1"); + asm("inc eax"); // sign=1 if aNegative!=0 + asm("setinf1:"); + asm("mov [ecx+8], eax"); + asm("mov eax, 0x80000000"); // generate positive or negative infinity + asm("mov [ecx+4], eax"); + asm("xor eax, eax"); + asm("mov [ecx], eax"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C TBool TRealX::IsZero() const +/** +Determines whether the extended precision value is zero. + +@return True, if the extended precision value is zero, false, otherwise. +*/ + { + THISCALL_PROLOG0() + asm("mov eax, [ecx+8]"); // check exponent + asm("shr eax, 16"); // move exponent into ax + asm("jz short iszero1"); // branch if zero + asm("xor eax, eax"); // else return 0 + THISCALL_EPILOG0() + asm("iszero1:"); + asm("inc eax"); // if zero, return 1 + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TBool TRealX::IsNaN() const +/** +Determines whether the extended precision value is 'not a number'. + +@return True, if the extended precision value is 'not a number', +false, otherwise. +*/ + { + THISCALL_PROLOG0() + asm("mov eax, [ecx+8]"); // check exponent + asm("cmp eax, 0xFFFF0000"); + asm("jc short isnan0"); // branch if not FFFF + asm("mov eax, [ecx+4]"); + asm("cmp eax, 0x80000000"); // check for infinity + asm("jne short isnan1"); + asm("mov eax, [ecx]"); + asm("test eax, eax"); + asm("jne short isnan1"); + asm("isnan0:"); + asm("xor eax, eax"); // return 0 if not NaN + THISCALL_EPILOG0() + asm("isnan1:"); + asm("mov eax, 1"); // return 1 if NaN + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TBool TRealX::IsInfinite() const +/** +Determines whether the extended precision value has a finite value. + +@return True, if the extended precision value is finite, +false, if the value is 'not a number' or is infinite, +*/ + { + THISCALL_PROLOG0() + asm("mov eax, [ecx+8]"); // check exponent + asm("cmp eax, 0xFFFF0000"); + asm("jc short isinf0"); // branch if not FFFF + asm("mov eax, [ecx+4]"); + asm("cmp eax, 0x80000000"); // check for infinity + asm("jne short isinf0"); + asm("mov eax, [ecx]"); + asm("test eax, eax"); + asm("jne short isinf0"); + asm("inc eax"); // return 1 if infinity + THISCALL_EPILOG0() + asm("isinf0:"); + asm("xor eax, eax"); // return 0 if not infinity + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TBool TRealX::IsFinite() const +/** +Determines whether the extended precision value has a finite value. + +@return True, if the extended precision value is finite, +false, if the value is 'not a number' or is infinite, +*/ + { + THISCALL_PROLOG0() + asm("mov eax, [ecx+8]"); // check exponent + asm("cmp eax, 0xFFFF0000"); // check for NaN or infinity + asm("jnc short isfinite0"); // branch if NaN or infinity + asm("mov eax, 1"); // return 1 if finite + THISCALL_EPILOG0() + asm("isfinite0:"); + asm("xor eax, eax"); // return 0 if NaN or infinity + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C const TRealX& TRealX::operator+=(const TRealX& /*aVal*/) +/** +Adds an extended precision value to this extended precision number. + +@param aVal The extended precision value to be added. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": :"i"(&TRealXAdd)); // do addition, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result in *this + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return this in eax + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C const TRealX& TRealX::operator-=(const TRealX& /*aVal*/) +/** +Subtracts an extended precision value from this extended precision number. + +@param aVal The extended precision value to be subtracted. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXSubtract)); // do subtraction, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result in *this + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return this in eax + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C const TRealX& TRealX::operator*=(const TRealX& /*aVal*/) +/** +Multiplies this extended precision number by an extended precision value. + +@param aVal The extended precision value to be subtracted. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // esi = this + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXMultiply)); // do multiplication, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result in *this + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return this in eax + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C const TRealX& TRealX::operator/=(const TRealX& /*aVal*/) +/** +Divides this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the divisor. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +@panic MATHX KErrDivideByZero if the divisor is zero. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXDivide)); // do division, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result in *this + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return this in eax + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C const TRealX& TRealX::operator%=(const TRealX& /*aVal*/) +/** +Modulo-divides this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the divisor. + +@return A reference to this object. + +@panic MATHX KErrTotalLossOfPrecision panic if precision is lost. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXModulo)); // do modulo, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result in *this + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return this in eax + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() + } + + + + +__NAKED__ EXPORT_C TInt TRealX::AddEq(const TRealX& /*aVal*/) +/** +Adds an extended precision value to this extended precision number. + +@param aVal The extended precision value to be added. + +@return KErrNone, if the operation is successful; +KErrOverflow,if the operation results in overflow; +KErrUnderflow, if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": :"i"(&TRealXAdd)); // do addition, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::SubEq(const TRealX& /*aVal*/) +/** +Subtracts an extended precision value from this extended precision number. + +@param aVal The extended precision value to be subtracted. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXSubtract)); // do subtraction, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::MultEq(const TRealX& /*aVal*/) +/** +Multiplies this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the multiplier. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXMultiply)); // do multiplication, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::DivEq(const TRealX& /*aVal*/) +/** +Divides this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the divisor. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow; +KErrDivideByZero, if the divisor is zero. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXDivide)); // do division, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::ModEq(const TRealX& /*aVal*/) +/** +Modulo-divides this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the divisor. + +@return KErrNone, if the operation is successful; +KErrTotalLossOfPrecision, if precision is lost; +KErrUnderflow, if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aVal + THISCALL_PROLOG1() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+20]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXModulo)); // do modulo, result in ecx,edx:ebx, error code in eax + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("mov ecx, esi"); // restore registers + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator+() const +/** +Returns this extended precision number unchanged. + +Note that this may also be referred to as a unary plus operator. + +@return The extended precision number. +*/ + { + THISCALL_PROLOG0_BIGRETVAL() + asm("mov eax, [esp+4]"); // eax=address to write return value + asm("mov edx, [ecx]"); + asm("mov [eax], edx"); + asm("mov edx, [ecx+4]"); + asm("mov [eax+4], edx"); + asm("mov edx, [ecx+8]"); + asm("mov [eax+8], edx"); // return address of return value in eax + THISCALL_EPILOG0_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator-() const +/** +Negates this extended precision number. + +This may also be referred to as a unary minus operator. + +@return The negative of the extended precision number. +*/ + { + THISCALL_PROLOG0_BIGRETVAL() + asm("mov eax, [esp+4]"); // eax=address to write return value + asm("mov edx, [ecx]"); + asm("mov [eax], edx"); + asm("mov edx, [ecx+4]"); + asm("mov [eax+4], edx"); + asm("mov edx, [ecx+8]"); + asm("xor dl, 1"); // change sign bit + asm("mov [eax+8], edx"); + THISCALL_EPILOG0_BIGRETVAL() // return address of return value in eax + } + + + + +__NAKED__ EXPORT_C TRealX& TRealX::operator++() +/** +Increments this extended precision number by one, +and then returns a reference to it. + +This is also referred to as a prefix operator. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // pre-increment + // on entry ecx=this, return this in eax + THISCALL_PROLOG0() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, 0x7FFF0000"); // set ecx,edx:ebx to 1.0 + asm("mov edx, 0x80000000"); + asm("xor ebx, ebx"); + asm("call %a0": :"i"(&TRealXAdd)); // add 1 to *this + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); // check error code + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // else return this in eax + asm("mov ecx, esi"); + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator++(TInt) +/** +Returns this extended precision number before incrementing it by one. + +This is also referred to as a postfix operator. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // post-increment + // on entry ecx=this, [esp+4]=address of return value, [esp+8]=dummy int + THISCALL_PROLOG1_BIGRETVAL() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov edi, [esp+20]"); // address of return value into edi + asm("mov eax, [ecx]"); // copy initial value of *this into [edi] + asm("mov [edi], eax"); + asm("mov eax, [ecx+4]"); + asm("mov [edi+4], eax"); + asm("mov eax, [ecx+8]"); + asm("mov [edi+8], eax"); + asm("mov ecx, 0x7FFF0000"); // set ecx,edx:ebx to 1.0 + asm("mov edx, 0x80000000"); + asm("xor ebx, ebx"); + asm("call %a0": :"i"(&TRealXAdd)); // add 1 to *this + asm("mov [esi], ebx"); // store result in *this + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); // check error code + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, [esp+20]"); // address of return value into eax + asm("mov ecx, esi"); + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TRealX& TRealX::operator--() +/** +Decrements this extended precision number by one, +and then returns a reference to it. + +This is also referred to as a prefix operator. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // pre-decrement + // on entry ecx=this, return this in eax + THISCALL_PROLOG0() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, 0x7FFF0001"); // set ecx,edx:ebx to -1.0 + asm("mov edx, 0x80000000"); + asm("xor ebx, ebx"); + asm("call %a0": :"i"(&TRealXAdd)); // add -1 to *this + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); // check error code + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // else return this in eax + asm("mov ecx, esi"); + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG0() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator--(TInt) +/** +Returns this extended precision number before decrementing it by one. + +This is also referred to as a postfix operator. + +@return A reference to this object. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // post-decrement + // on entry ecx=this, [esp+4]=address of return value, [esp+8]=dummy int + THISCALL_PROLOG1_BIGRETVAL() + asm("push ebx"); // save registers + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov edi, [esp+20]"); // address of return value into edi + asm("mov eax, [ecx]"); // copy initial value of *this into [edi] + asm("mov [edi], eax"); + asm("mov eax, [ecx+4]"); + asm("mov [edi+4], eax"); + asm("mov eax, [ecx+8]"); + asm("mov [edi+8], eax"); + asm("mov ecx, 0x7FFF0001"); // set ecx,edx:ebx to -1.0 + asm("mov edx, 0x80000000"); + asm("xor ebx, ebx"); + asm("call %a0": :"i"(&TRealXAdd)); // add -1 to *this + asm("mov [esi], ebx"); // store result in *this + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); // check error code + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, [esp+20]"); // address of return value into eax + asm("mov ecx, esi"); + asm("pop edi"); + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + THISCALL_EPILOG1_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator+(const TRealX& /*aVal*/) const +/** +Adds an extended precision value to this extended precision number. + +@param aVal The extended precision value to be added. + +@return An extended precision object containing the result. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal + THISCALL_PROLOG1_BIGRETVAL() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": :"i"(&TRealXAdd)); // do addition, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of return value + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return address of return value in eax + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator-(const TRealX& /*aVal*/) const +/** +Subtracts an extended precision value from this extended precision number. + +@param aVal The extended precision value to be subtracted. + +@return An extended precision object containing the result. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal + THISCALL_PROLOG1_BIGRETVAL() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXSubtract)); // do subtraction, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of return value + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return address of return value in eax + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator*(const TRealX& /*aVal*/) const +/** +Multiplies this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the multiplier. + +@return An extended precision object containing the result. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal + THISCALL_PROLOG1_BIGRETVAL() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXMultiply)); // do multiplication, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of return value + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return address of return value in eax + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator/(const TRealX& /*aVal*/) const +/** +Divides this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the divisor. + +@return An extended precision object containing the result. + +@panic MATHX KErrOverflow if the operation results in overflow. +@panic MATHX KErrUnderflow if the operation results in underflow. +@panic MATHX KErrDivideByZero if the divisor is zero. +*/ + { + // on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal + THISCALL_PROLOG1_BIGRETVAL() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXDivide)); // do division, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of return value + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return address of return value in eax + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TRealX TRealX::operator%(const TRealX& /*aVal*/) const +/** +Modulo-divides this extended precision number by an extended precision value. + +@param aVal The extended precision value to be used as the divisor. + +@return An extended precision object containing the result. + +@panic MATHX KErrTotalLossOfPrecision if precision is lost. +@panic MATHX KErrUnderflow if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of return value, [esp+8]=address of aVal + THISCALL_PROLOG1_BIGRETVAL() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXModulo)); // do modulo, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of return value + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("test eax, eax"); + _ASM_jn(z,TRealXPanicEax) // panic if error + asm("mov eax, esi"); // return address of return value in eax + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG1_BIGRETVAL() + } + + + + +__NAKED__ EXPORT_C TInt TRealX::Add(TRealX& /*aResult*/, const TRealX& /*aVal*/) const +/** +Adds an extended precision value to this extended precision number. + +@param aResult On return, a reference to an extended precision object +containing the result of the operation. +@param aVal The extended precision value to be added. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal + THISCALL_PROLOG2() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": :"i"(&TRealXAdd)); // do addition, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of aResult + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG2() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::Sub(TRealX& /*aResult*/, const TRealX& /*aVal*/) const +/** +Subtracts an extended precision value from this extended precision number. + +@param aResult On return, a reference to an extended precision object +containing the result of the operation. +@param aVal The extended precision value to be subtracted. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal + THISCALL_PROLOG2() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXSubtract)); // do subtraction, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of aResult + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG2() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::Mult(TRealX& /*aResult*/, const TRealX& /*aVal*/) const +/** +Multiplies this extended precision number by an extended precision value. + +@param aResult On return, a reference to an extended precision object +containing the result of the operation. +@param aVal The extended precision value to be used as the multiplier. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal + THISCALL_PROLOG2() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXMultiply)); // do multiplication, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of aResult + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG2() // return with error code in eax + } + + + +__NAKED__ EXPORT_C TInt TRealX::Div(TRealX& /*aResult*/, const TRealX& /*aVal*/) const +/** +Divides this extended precision number by an extended precision value. + +@param aResult On return, a reference to an extended precision object +containing the result of the operation. +@param aVal The extended precision value to be used as the divisor. + +@return KErrNone, if the operation is successful; +KErrOverflow, if the operation results in overflow; +KErrUnderflow, if the operation results in underflow; +KErrDivideByZero, if the divisor is zero. +*/ + { + // on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal + THISCALL_PROLOG2() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXDivide)); // do division, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of aResult + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG2() // return with error code in eax + } + + + + +__NAKED__ EXPORT_C TInt TRealX::Mod(TRealX& /*aResult*/, const TRealX& /*aVal*/) const +/** +Modulo-divides this extended precision number by an extended precision value. + +@param aResult On return, a reference to an extended precision object +containing the result of the operation. + +@param aVal The extended precision value to be used as the divisor. + +@return KErrNone, if the operation is successful; +KErrTotalLossOfPrecision, if precision is lost; +KErrUnderflow, if the operation results in underflow. +*/ + { + // on entry ecx=this, [esp+4]=address of aResult, [esp+8]=address of aVal + THISCALL_PROLOG2() + asm("push ecx"); // save registers + asm("push ebx"); + asm("push ebp"); + asm("push esi"); + asm("push edi"); + asm("mov esi, ecx"); // this into esi + asm("mov ecx, [esp+28]"); // address of aVal into ecx + asm("mov ebx, [ecx]"); // aVal into ecx,edx:ebx + asm("mov edx, [ecx+4]"); + asm("mov ecx, [ecx+8]"); + asm("call %a0": : "i"(&TRealXModulo)); // do modulo, result in ecx,edx:ebx, error code in eax + asm("mov esi, [esp+24]"); // esi=address of aResult + asm("mov [esi], ebx"); // store result + asm("mov [esi+4], edx"); + asm("mov [esi+8], ecx"); + asm("pop edi"); // restore registers + asm("pop esi"); + asm("pop ebp"); + asm("pop ebx"); + asm("pop ecx"); + THISCALL_EPILOG2() // return with error code in eax + } + +// Compare TRealX in ecx,edx:ebx (op1) to TRealX at [esi] (op2) +// Return 1 if op1op2 +// Return 8 if unordered +// Return value in eax +LOCAL_C __NAKED__ void TRealXCompare(void) + { + asm("cmp ecx, 0xFFFF0000"); // check if op1=NaN or infinity + asm("jc short fpcmp1"); // branch if not + asm("cmp edx, 0x80000000"); // check for infinity + asm("jnz short fpcmpunord"); // branch if NaN + asm("test ebx, ebx"); + asm("jz short fpcmp1"); // if infinity, process normally + asm("fpcmpunord:"); // come here if unordered + asm("mov eax, 8"); // return 8 + asm("ret"); + asm("fpcmp1:"); // op1 is not a NaN + asm("mov eax, [esi+8]"); // get op2 into eax,edi:ebp + asm("mov edi, [esi+4]"); + asm("mov ebp, [esi]"); + asm("cmp eax, 0xFFFF0000"); // check for NaN or infinity + asm("jc short fpcmp2"); // branch if neither + asm("cmp edi, 0x80000000"); // check for infinity + asm("jnz short fpcmpunord"); // branch if NaN + asm("test ebp, ebp"); + asm("jnz short fpcmpunord"); + asm("fpcmp2:"); // neither operand is a NaN + asm("cmp ecx, 0x10000"); // check if op1=0 + asm("jc short fpcmpop1z"); // branch if it is + asm("cmp eax, 0x10000"); // check if op2=0 + asm("jc short fpcmp4"); // branch if it is + asm("xor al, cl"); // check if signs the same + asm("test al, 1"); + asm("jnz short fpcmp4"); // branch if different + asm("push ecx"); + asm("shr ecx, 16"); // op1 exponent into cx + asm("shr eax, 16"); // op2 exponent into ax + asm("cmp ecx, eax"); // compare exponents + asm("pop ecx"); + asm("ja short fpcmp4"); // if op1 exp > op2 exp op1>op2 if +ve + asm("jb short fpcmp5"); // if op1 exp < op2 exp op1ABS{op2} or if signs different + // or if op2 zero, op1 nonzero + asm("mov eax, 4"); // return 4 if +ve + asm("test cl, 1"); // check sign + asm("jz short fpcmp4a"); // skip if + + asm("mov al, 1"); // return 1 if -ve + asm("fpcmp4a:"); + asm("ret"); + asm("fpcmp5:"); // come here if ABS{op1} + +EXPORT_C TWin32SEHTrap::TWin32SEHTrap() + { + } + +EXPORT_C void TWin32SEHTrap::Trap() + { + } + +EXPORT_C void TWin32SEHTrap::UnTrap() + { + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/epoc/x86/uc_trp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/epoc/x86/uc_trp.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,49 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\epoc\x86\uc_trp.cpp +// +// + +#include +#include + +GLREF_C void Panic(TCdtPanic); + +#ifndef __LEAVE_EQUALS_THROW__ + +void DoLeave(TTrap*); + +void __stdcall DoTrap(TTrap* aFrame) + { + TTrapHandler* pH=Exec::PushTrapFrame(aFrame); + if (pH) + pH->Trap(); + } + +EXPORT_C void User::Leave(TInt aReason) +// +// Leave to the current control region. +// + { + TTrap* pF=Exec::PopTrapFrame(); + if (!pF) + ::Panic(EUserLeaveWithoutTrap); + *pF->iResult=aReason; + TTrapHandler* pH=pF->iHandler; + if (pH) + pH->Leave(aReason); + DoLeave(pF); + } + +#endif // !__LEAVE_EQUALS_THROW__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/epoc/x86/uc_utl.cia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/epoc/x86/uc_utl.cia Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,270 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\epoc\x86\uc_utl.cia +// +// + +#include +#include +#include +#include +#include + + +// Dummy so we can use same DEF file as WINS +EXPORT_C void BootEpoc(TBool) + { + } + + +EXPORT_C __NAKED__ void RFastLock::Wait() + { + THISCALL_PROLOG0() + asm("lock sub dword ptr [ecx+4], 1"); + asm("jnc fast_lock_wait_sem"); + THISCALL_EPILOG0() + asm("fast_lock_wait_sem:"); + asm("mov eax, %0": : "i"(EExecSemaphoreWait)); + asm("mov ecx, [ecx]"); + asm("xor edx, edx"); + asm("int 0x21"); + THISCALL_EPILOG0() + } + +EXPORT_C __NAKED__ void RFastLock::Signal() + { + THISCALL_PROLOG0() + asm("lock add dword ptr [ecx+4], 1"); + asm("jne fast_lock_signal_sem"); + THISCALL_EPILOG0() + asm("fast_lock_signal_sem:"); + asm("mov eax, %0": : "i"(EExecSemaphoreSignal1)); + asm("mov ecx, [ecx]"); + asm("int 0x21"); + THISCALL_EPILOG0() + } + +#ifdef __MEM_MACHINE_CODED__ +__NAKED__ EXPORT_C void Mem::Swap( TAny* /*aPtr1*/, TAny* /*aPtr2*/, TInt /*aLength*/ ) +/** +Swaps a number of bytes of data between two specified locations. + +The source and target areas can overlap. + +@param aPtr1 A pointer to the first location taking part in the swap. +@param aPtr2 A pointer to second location taking part in the swap. +@param aLength The number of bytes to be swapped between the two locations. + This value must not be negative. + +@panic USER 94 In debug builds only, if aLength is negative. +*/ + +// +// Swap the contents of *aPtr1 with *aPtr2. +// NB We assume ES=DS on entry. +// + { + asm("push esi"); + asm("push edi"); + asm("mov edi,[esp+12]");// aPtr1 address into edi + asm("mov esi,[esp+16]");// aPtr2 address into esi + asm("mov ecx,[esp+20]");// byte count into ecx + asm("pushfd"); + + asm("test ecx,ecx"); // + asm("jz short memswap0");// if length=0, nothing to do + asm("cld"); // go forwards through array + asm("cmp ecx,7"); // if length<7 don't bother with alignment check + asm("jc short memswap1");// + asm("mov edx,ecx"); // length into edx + // number of bytes to align aPtr1 = 4-(edi mod 4) + asm("mov ecx,4"); + asm("sub ecx,edi"); // + asm("and ecx,3"); // into ecx + asm("jz short memswap2");// if aligned, proceed with dword swap + asm("sub edx,ecx"); // subtract number of bytes from length + asm("memswap3:"); + asm("mov al,[edi]"); // al = *aPtr1 + asm("mov ah,[esi]"); // ah = *aPtr2 + asm("mov [esi],al"); // *aPtr2=al + asm("mov [edi],ah"); // *aPtr1=ah + asm("inc esi"); // aPtr2++ + asm("inc edi"); // aPtr1++ + asm("dec ecx"); // + asm("jnz short memswap3");// loop ecx times - edi is now dword aligned + asm("memswap2:"); + asm("push ebx"); // preserve ebx + asm("mov ecx,edx"); // length back into ecx + asm("mov ah,cl"); // save lower two bits of dword count in ah bits 3,2 + asm("add ecx,12"); // divide dword count by 4, rounding to next higher integer + asm("shr ecx,4"); // this gives loop count for unfolded loop + asm("shl ah,4"); // lower two bits of dword count into ah bits 7,6 + asm("sahf"); // and into SF,ZF + asm("jns short memswap8");// branch if lower two bits of dword count = 0 or 1 + asm("jz short memswap5");// if lower two bits = 3, miss out first unfolding of loop + asm("jnz short memswap6"); // if lower two bits = 2, miss out first two unfoldings + asm("memswap8:"); + asm("jz short memswap7");// if lower two bits = 1, miss out first three unfoldings + asm("memswap4:"); + asm("mov eax,[edi]"); // eax = *aPtr1 + asm("mov ebx,[esi]"); // ebx = *aPtr2 + asm("mov [esi],eax"); // *aPtr2=eax + asm("mov [edi],ebx"); // *aPtr1=ebx + asm("add edi,4"); // aPtr1++ + asm("add esi,4"); // aPtr2++ + asm("memswap5:"); + asm("mov eax,[edi]"); // eax = *aPtr1 + asm("mov ebx,[esi]"); // ebx = *aPtr2 + asm("mov [esi],eax"); // *aPtr2=eax + asm("mov [edi],ebx"); // *aPtr1=ebx + asm("add edi,4"); // aPtr1++ + asm("add esi,4"); // aPtr2++ + asm("memswap6:"); + asm("mov eax,[edi]"); // eax = *aPtr1 + asm("mov ebx,[esi]"); // ebx = *aPtr2 + asm("mov [esi],eax"); // *aPtr2=eax + asm("mov [edi],ebx"); // *aPtr1=ebx + asm("add edi,4"); // aPtr1++ + asm("add esi,4"); // aPtr2++ + asm("memswap7:"); + asm("mov eax,[edi]"); // eax = *aPtr1 + asm("mov ebx,[esi]"); // ebx = *aPtr2 + asm("mov [esi],eax"); // *aPtr2=eax + asm("mov [edi],ebx"); // *aPtr1=ebx + asm("add edi,4"); // aPtr1++ + asm("add esi,4"); // aPtr2++ + asm("dec ecx"); + asm("jnz short memswap4"); // loop ecx times to do main part of swap + asm("mov ecx,edx"); // length back into ecx + asm("pop ebx"); // restore ebx + asm("and ecx,3"); // number of remaining bytes to move + asm("jz short memswap0");// if zero, we are finished + asm("memswap1:"); // *** come here for small swap + asm("mov al,[edi]"); // al = *aPtr1 + asm("mov ah,[esi]"); // ah = *aPtr2 + asm("mov [esi],al"); // *aPtr2=al + asm("mov [edi],ah"); // *aPtr1=ah + asm("inc esi"); // aPtr2++ + asm("inc edi"); // aPtr1++ + asm("dec ecx"); // + asm("jnz short memswap1"); // loop ecx times - edi is now dword aligned + + asm("memswap0:"); + asm("popfd"); + asm("pop edi"); + asm("pop esi"); + asm("ret"); + } +#endif + +// Hash an 8 bit string at aPtr, length aLen bytes. +__NAKED__ TUint32 DefaultStringHash(const TUint8* /*aPtr*/, TInt /*aLen*/) + { + asm("push esi"); + asm("mov esi, [esp+8]"); + asm("mov ecx, [esp+12]"); + asm("xor eax, eax"); + asm("sub ecx, 4"); + asm("jb lt4"); + asm("ge4:"); + asm("xor eax, [esi]"); + asm("add esi, 4"); + asm("mov edx, 0x9E3779B9"); + asm("mul edx"); + asm("sub ecx, 4"); + asm("jae ge4"); + asm("lt4:"); + asm("add ecx, 4"); + asm("jz done"); + asm("xor edx, edx"); + asm("cmp ecx, 2"); + asm("jbe le2"); + asm("mov dl, [esi+2]"); + asm("shl edx, 16"); + asm("le2:"); + asm("cmp ecx, 2"); + asm("jb onemore"); + asm("mov dh, [esi+1]"); + asm("onemore:"); + asm("mov dl, [esi]"); + asm("xor eax, edx"); + asm("mov edx, 0x9E3779B9"); + asm("mul edx"); + asm("done:"); + asm("pop esi"); + asm("ret"); + } + +// Hash a 16 bit string at aPtr, length aLen bytes. +__NAKED__ TUint32 DefaultWStringHash(const TUint16* /*aPtr*/, TInt /*aLen*/) + { + asm("push esi"); + asm("mov esi, [esp+8]"); + asm("mov ecx, [esp+12]"); + asm("xor eax, eax"); + asm("sub ecx, 8"); + asm("jb lt8"); + asm("ge8:"); + asm("mov edx, [esi+4]"); + asm("xor eax, [esi]"); + asm("add esi, 8"); + asm("rol edx, 8"); + asm("xor eax, edx"); + asm("mov edx, 0x9E3779B9"); + asm("mul edx"); + asm("sub ecx, 8"); + asm("jae ge8"); + asm("lt8:"); + asm("add ecx, 8"); + asm("jz done_defwstrhash"); + asm("xor edx, edx"); + asm("cmp ecx, 4"); + asm("jbe le4"); + asm("mov dx, [esi+4]"); + asm("rol edx, 8"); + asm("xor eax, edx"); + asm("xor edx, edx"); + asm("le4:"); + asm("cmp ecx, 4"); + asm("jb onemore_defwstrhash"); + asm("mov dx, [esi+2]"); + asm("shl edx, 16"); + asm("onemore_defwstrhash:"); + asm("mov dx, [esi]"); + asm("xor eax, edx"); + asm("mov edx, 0x9E3779B9"); + asm("mul edx"); + asm("done_defwstrhash:"); + asm("pop esi"); + asm("ret"); + } + + +/** +@publishedAll +@released + +Calculate a 32 bit hash from a 32 bit integer. + +@param aInt The integer to be hashed. +@return The calculated 32 bit hash value. +*/ +EXPORT_C __NAKED__ TUint32 DefaultHash::Integer(const TInt& /*aInt*/) + { + asm("mov edx, [esp+4]"); + asm("mov eax, 0x9E3779B9"); + asm("mul dword ptr [edx]"); + asm("ret"); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/epoc/x86/uc_utl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/epoc/x86/uc_utl.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,38 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\epoc\x86\uc_utl.cpp +// +// + +#include +#include +#include "us_std.h" + +EXPORT_C void EmptyFunction() + //Function with an empty body + { + } + +#ifdef __GCC32__ + +extern "C" EXPORT_C int __cxa_pure_virtual() +// +// Gets called for any unreplaced pure virtual methods. +// + { + Panic(EPureVirtualCalled); + return 0; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_asin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_asin.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,183 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_asin.cpp +// Arc sin. +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + +#ifndef __USE_VFP_MATH + +LOCAL_D const TUint32 ArcsinCoeffs[] = + { + 0x00000000,0x80000000,0x7FFF0000, // polynomial approximation to arcsin(x) + 0xAA893CD8,0xAAAAAAAA,0x7FFC0000, // for -0.5<=x<=0.5 + 0xD07ED410,0x99999999,0x7FFB0000, + 0xB6C64A72,0xB6DB6D94,0x7FFA0000, + 0xF5527DD4,0xF8E3995C,0x7FF90000, + 0xA87499FB,0xB744B969,0x7FF90000, + 0x2E8953AD,0x8E392B24,0x7FF90000, + 0xFEDBB4E4,0xE3481C4A,0x7FF80000, + 0x4A32ED70,0xC89998E1,0x7FF80000, + 0x848A2B53,0xCCAE4AE5,0x7FF70000, + 0x09C1F387,0xA587A043,0x7FF90000, + 0x722B9041,0x8C9BD20B,0x7FF90001, + 0xC88B75CC,0x850CE779,0x7FFA0000 + }; + +LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000}; // 1.0 +LOCAL_D const TUint32 Halfdata[] = {0x00000000,0x80000000,0x7FFE0000}; // 0.5 +LOCAL_D const TUint32 Pidata[] = {0x2168C235,0xC90FDAA2,0x80000000}; // pi +LOCAL_D const TUint32 PiBy2data[] = {0x2168C235,0xC90FDAA2,0x7FFF0000}; // pi/2 + +LOCAL_C TInt CalcArcsinArccos(TReal& aTrg, TRealX& x, TBool aCos) + { + // Calculate arcsin (if aCos false) or arccos (if aCos true) of x + // and write result to aTrg. + // Algorithm (arcsin): + // If x>0.5, replace x with Sqrt((1-x)/2) + // ( use identity cos(x)=2(cos(x/2))^2-1 ) + // Use polynomial approximation for arcsin(x), 0<=x<=0.5 + // If original x>0.5, replace result y with pi/2-2y + + const TRealX One = *(const TRealX*)Onedata; + const TRealX Half = *(const TRealX*)Halfdata; + const TRealX Pi = *(const TRealX*)Pidata; + const TRealX PiBy2 = *(const TRealX*)PiBy2data; + + TInt sign=x.iSign&1; + x.iSign=0; + if (x<=One) + { + TBool big=(x>Half); + if (big) + { + x=One-x; + if (x.iExp>1) + x.iExp--; + TReal temp; + Math::Sqrt(temp, (TReal)x); + x=temp; + } + TRealX y; + Math::PolyX(y,x*x,12,(const TRealX*)ArcsinCoeffs); + y*=x; + if (big) + { + if (y.iExp) + y.iExp++; + if (aCos) + { + if (sign) + y=Pi-y; + } + else + { + y=PiBy2-y; + y.iSign=TInt8(sign); + } + } + else + { + y.iSign=TInt8(sign); + if (aCos) + y=PiBy2-y; + } + return y.GetTReal(aTrg); + } + return KErrArgument; + } + + + + +EXPORT_C TInt Math::ASin(TReal& aTrg, const TReal& aSrc) +/** +Calculates the principal value of the inverse sine of a number. + +@param aTrg A reference containing the result in radians, + a value between -pi/2 and +pi/2. +@param aSrc The argument of the arcsin function, a value + between -1 and +1 inclusive. + +@return KErrNone if successful, otherwise another of the system-wide + error codes. +*/ + { + TRealX x; + TInt r=x.Set(aSrc); + if (r==KErrNone) + r=CalcArcsinArccos(aTrg,x,EFalse); + if (r==KErrNone) + return r; + SetNaN(aTrg); + return KErrArgument; + } + + + + +EXPORT_C TInt Math::ACos(TReal& aTrg, const TReal& aSrc) +/** +Calculates the principal value of the inverse cosine of a number. + +@param aTrg A reference containing the result in radians, + a value between 0 and pi. +@param aSrc The argument of the arccos function, a value + between -1 and +1 inclusive. + +@return KErrNone if successful, otherwise another of the system-wide + error codes. +*/ + { + TRealX x; + TInt r=x.Set(aSrc); + if (r==KErrNone) + r=CalcArcsinArccos(aTrg,x,ETrue); + if (r==KErrNone) + return r; + SetNaN(aTrg); + return KErrArgument; + } + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal asin(TReal); +extern "C" TReal acos(TReal); + +EXPORT_C TInt Math::ASin(TReal& aTrg, const TReal& aSrc) + { + aTrg = asin(aSrc); + if (Math::IsFinite(aTrg)) + return KErrNone; + SetNaN(aTrg); + return KErrArgument; + } + +EXPORT_C TInt Math::ACos(TReal& aTrg, const TReal& aSrc) + { + aTrg = acos(aSrc); + if (Math::IsFinite(aTrg)) + return KErrNone; + SetNaN(aTrg); + return KErrArgument; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_atan.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_atan.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,267 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_atan.cpp +// Floating point arc tangent +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + +#ifndef __USE_VFP_MATH + +LOCAL_D const TUint32 ArctanCoeffs[] = + { + 0x00000000,0x80000000,0x7FFF0000, // polynomial approximation to arctan(x) + 0xAA84D6EE,0xAAAAAAAA,0x7FFD0001, // for -(sqr2-1) <= x <= (sqr2-1) + 0x89C77453,0xCCCCCCCC,0x7FFC0000, + 0xEBC0261C,0x9249247B,0x7FFC0001, + 0x940BC4DB,0xE38E3121,0x7FFB0000, + 0x141C32F1,0xBA2DBF36,0x7FFB0001, + 0xA90615E7,0x9D7C807E,0x7FFB0000, + 0x1C632E93,0x87F6A873,0x7FFB0001, + 0x310FCFFD,0xE8BE5D0A,0x7FFA0000, + 0x92289F15,0xB17B930B,0x7FFA0001, + 0x546FE7CE,0xABDE562D,0x7FF90000 + }; + +LOCAL_D const TUint32 Sqr2m1data[] = {0xE7799211,0xD413CCCF,0x7FFD0000}; // sqr2-1 +LOCAL_D const TUint32 Sqr2p1data[] = {0xFCEF3242,0x9A827999,0x80000000}; // sqr2+1 +LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000}; // 1.0 +LOCAL_D const TUint32 PiBy8data[] = {0x2168C235,0xC90FDAA2,0x7FFD0000}; // pi/8 +LOCAL_D const TUint32 PiBy2data[] = {0x2168C235,0xC90FDAA2,0x7FFF0000}; // pi/2 +LOCAL_D const TUint32 ThreePiBy8data[] = {0x990E91A8,0x96CBE3F9,0x7FFF0000}; // 3*pi/8 + +LOCAL_C void Arctan(TRealX& y, TRealX& x) + { + // Calculate arctan(x), write result to y + // Algorithm: + // If x>1, replace x with 1/x and subtract result from pi/2 + // ( use identity tan(pi/2-x)=1/tan(x) ) + // If x>sqr(2)-1, replace x with (x-(sqr(2)-1))/(1-(sqr2-1)x) + // ( use identity tan(x-a)=(tanx-tana)/(1-tana.tanx) + // where a=pi/8, tan a = sqr2-1 + // and add pi/8 to result + // Use polynomial approximation to calculate arctan(x) for + // x in the interval [0,sqr2-1] + + const TRealX& Sqr2m1 = *(const TRealX*)Sqr2m1data; + const TRealX& Sqr2p1 = *(const TRealX*)Sqr2p1data; + const TRealX& One = *(const TRealX*)Onedata; + const TRealX& PiBy8 = *(const TRealX*)PiBy8data; + const TRealX& PiBy2 = *(const TRealX*)PiBy2data; + const TRealX& ThreePiBy8 = *(const TRealX*)ThreePiBy8data; + + TInt section=0; + TInt8 sign=x.iSign; + x.iSign=0; + if (x>Sqr2p1) + { + x=One/x; + section=3; + } + else if (x>One) + { + x=(One-Sqr2m1*x)/(x+Sqr2m1); + section=2; + } + else if (x>Sqr2m1) + { + x=(x-Sqr2m1)/(One+Sqr2m1*x); + section=1; + } + Math::PolyX(y,x*x,10,(const TRealX*)ArctanCoeffs); + y*=x; + if (section==1) + y+=PiBy8; + else if (section==2) + y=ThreePiBy8-y; + else if (section==3) + y=PiBy2-y; + y.iSign=sign; + } + + + + +EXPORT_C TInt Math::ATan(TReal& aTrg, const TReal& aSrc) +/** +Calculates the principal value of the inverse tangent of a number. + +@param aTrg A reference containing the result in radians, + a value between -pi/2 and +pi/2. +@param aSrc The argument of the arctan function, + a value between +infinity and +infinity. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + TRealX x; + TInt r=x.Set(aSrc); + if (r==KErrNone) + { + TRealX y; + Arctan(y,x); + return y.GetTReal(aTrg); + } + if (r==KErrArgument) + { + SetNaN(aTrg); + return KErrArgument; + } + aTrg=KPiBy2; // arctan(+/- infinity) = +/- pi/2 + if (x.iSign&1) + aTrg=-aTrg; + return KErrNone; + } + +LOCAL_D const TUint32 Pidata[] = {0x2168C235,0xC90FDAA2,0x80000000}; +LOCAL_D const TUint32 PiBy4data[] = {0x2168C235,0xC90FDAA2,0x7FFE0000}; +LOCAL_D const TUint32 MinusPiBy4data[] = {0x2168C235,0xC90FDAA2,0x7FFE0001}; +LOCAL_D const TUint32 ThreePiBy4data[] = {0x990E91A8,0x96CBE3F9,0x80000000}; +LOCAL_D const TUint32 MinusThreePiBy4data[] = {0x990E91A8,0x96CBE3F9,0x80000001}; +LOCAL_D const TUint32 Zerodata[] = {0x00000000,0x00000000,0x00000000}; + + + + +EXPORT_C TInt Math::ATan(TReal &aTrg,const TReal &aY,const TReal &aX) +/** +Calculates the angle between the x-axis and a line drawn from the origin +to a point represented by its (x,y) co-ordinates. + +The co-ordinates are passed as arguments to the function. +This function returns the same result as arctan(y/x), but: + +1. it adds +/-pi to the result, if x is negative + +2. it sets the result to +/-pi/2, if x is zero but y is non-zero. + +@param aTrg A reference containing the result in radians, + a value between -pi exclusive and +pi inclusive. +@param aY The y argument of the arctan(y/x) function. +@param aX The x argument of the arctan(y/x) function. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + const TRealX& Zero=*(const TRealX*)Zerodata; + const TRealX& Pi=*(const TRealX*)Pidata; + const TRealX& PiBy4=*(const TRealX*)PiBy4data; + const TRealX& MinusPiBy4=*(const TRealX*)MinusPiBy4data; + const TRealX& ThreePiBy4=*(const TRealX*)ThreePiBy4data; + const TRealX& MinusThreePiBy4=*(const TRealX*)MinusThreePiBy4data; + + TRealX x, y; + TInt rx=x.Set(aX); + TInt ry=y.Set(aY); + if (rx!=KErrArgument && ry!=KErrArgument) + { + if (x.iExp==0) + x.iSign=0; + TRealX q; + TInt rq=y.Div(q,x); + if (rq!=KErrArgument) + { + TRealX arg; + Arctan(arg,q); + if (x=Zero) + arg+=Pi; + else + arg-=Pi; + } + aTrg=arg; + return KErrNone; + } + if (!x.IsZero()) + { + // Both x and y must be infinite + TInt quadrant=((y.iSign & 1)<<1) + (x.iSign&1); + TRealX arg; + if (quadrant==0) + arg=PiBy4; + else if (quadrant==1) + arg=ThreePiBy4; + else if (quadrant==3) + arg=MinusThreePiBy4; + else + arg=MinusPiBy4; + aTrg=(TReal)arg; + return KErrNone; + } + } + SetNaN(aTrg); + return KErrArgument; + } + +#else // __USE_VFP_MATH + +LOCAL_D const TUint32 PiBy4data[] = {0x54442D18,0x3FE921FB}; +LOCAL_D const TUint32 MinusPiBy4data[] = {0x54442D18,0xBFE921FB}; +LOCAL_D const TUint32 ThreePiBy4data[] = {0x7F3321D2,0x4002D97C}; +LOCAL_D const TUint32 MinusThreePiBy4data[] = {0x7F3321D2,0xC002D97C}; + +// definitions come from RVCT math library +extern "C" TReal atan(TReal); +extern "C" TReal atan2(TReal,TReal); + +EXPORT_C TInt Math::ATan(TReal& aTrg, const TReal& aSrc) + { + aTrg = atan(aSrc); + if (Math::IsFinite(aTrg)) + return KErrNone; + SetNaN(aTrg); + return KErrArgument; + } + +EXPORT_C TInt Math::ATan(TReal &aTrg,const TReal &aY,const TReal &aX) + { + aTrg = atan2(aY,aX); + if (Math::IsFinite(aTrg)) + return KErrNone; + + // Return is a NaN, but ARM implementation returns NaN for atan(inf/inf) + // whereas implementation above returns multiples of pi/4 - fix up here + SReal64 *pY=(SReal64 *)&aY; + SReal64 *pX=(SReal64 *)&aX; + + if ( pY->msm==0 && pY->lsm==0 && pY->exp==KTReal64SpecialExponent + && pX->msm==0 && pX->lsm==0 && pX->exp==KTReal64SpecialExponent) + { + TInt quadrant=((pY->sign)<<1) + (pX->sign); + if (quadrant==0) + aTrg=*(const TReal*)PiBy4data; + else if (quadrant==1) + aTrg=*(const TReal*)ThreePiBy4data; + else if (quadrant==3) + aTrg=*(const TReal*)MinusThreePiBy4data; + else + aTrg=*(const TReal*)MinusPiBy4data; + return KErrNone; + } + + // If we get here then the args weren't inf/inf so one of them must've + // been a NaN to start with + SetNaN(aTrg); + return KErrArgument; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_dtor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_dtor.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,346 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_dtor.cpp +// +// + +#include "um_std.h" + + +void TLex8::Scndig(TInt &aSig,TInt &aExp,TInt64 &aDl) +// +// Scans a decimal digit field and accumulates the value to a TInt64 at aDl +// Used before decimal point - do not drop trailing zeros. +// + { + + FOREVER + { + if (iNext>=iEnd) + break; + TChar c=Peek(); + if (!c.IsDigit()) + break; + else + c=Get(); + if (aSig=iEnd) + break; + c=Peek(); + if (!c.IsDigit()) + break; + else + { + c=Get(); + if (c=='0') + { + if (aDl!=0) // possible trailing zeros + trailing++; + else // if aDl==0 multiplying by 10 and adding 0 has no effect + { + leading++; + aSig++; // leading zeros have significance + } + } + else if ((aSig=0; n--) + { + aDl *= 10; // Multiply accumulator by 10 + } + // now add current digit + aDl+=((TUint)c)-'0'; + // now update significant digits used + aSig+=trailing+1; + trailing=0; + } + } + } + } + +void TLex16::Scndig(TInt &aSig,TInt &aExp,TInt64 &aDl) +// +// Scans a decimal digit field and accumulates the value to a TInt64 at aDl +// + { + + FOREVER + { + TChar c=Peek(); + if (!c.IsDigit()) + break; + else + c=Get(); + if (aSig=iEnd) + return(KErrGeneral); + TInt64 n(0); + TBool minus=EFalse; + if (Peek()=='-') + { + Inc(); + minus=ETrue; + } + else if (Peek()=='+') + Inc(); + TInt digflg=Peek().IsDigit(); + while (Peek()=='0') // Skip leading zeros + Inc(); + TInt nsig=0; + TInt nskip=0; + Scndig(nsig,nskip,n); + TInt nint=nsig; + TInt nfract=0; + if (Peek()==aPoint) + { + Inc(); + if (!digflg) + digflg=Peek().IsDigit(); + ScndigAfterPoint(nsig,n); // skip trailing zeros + nfract=nsig-nint; + } + if (!digflg) + { + UnGetToMark(start); + return(KErrGeneral); // Not a number + } + TInt nexp=0; + TInt r; + if (Peek()=='E' || Peek()=='e') + { + TLexMark8 rollback(iNext); + Inc(); + r=Val(nexp); + if (r!=KErrNone) + { + if (r==KErrOverflow) + { + aVal.SetInfinite(minus); + return r; + } + else + { + //it wasn't a number after the 'e', so rollback to the 'e' + UnGetToMark(rollback); + } + } + } + + if (n == 0) + { + aVal.SetZero(); + return KErrNone; + } + + aVal=minus?-n:n; + nexp+=nskip-nfract; + r=Math::MultPow10X(aVal,nexp); + return r; + } + +EXPORT_C TInt TLex16::Val(TReal32& aVal) +// +// Convert a 32 bit real. +// + { + TRealX x; + TInt r=Val(x); + if (r==KErrNone) + r=x.GetTReal(aVal); + return r; + } + +EXPORT_C TInt TLex16::Val(TReal32& aVal, TChar aPoint) +// +// Convert a 32 bit real. +// + { + TRealX x; + TInt r=Val(x,aPoint); + if (r==KErrNone) + r=x.GetTReal(aVal); + return r; + } + +EXPORT_C TInt TLex16::Val(TReal64& aVal) +// +// Convert a 64 bit real. +// + { + TRealX x; + TInt r=Val(x); + if (r==KErrNone) + r=x.GetTReal(aVal); + return r; + } + +EXPORT_C TInt TLex16::Val(TReal64& aVal, TChar aPoint) +// +// Convert a 64 bit real. +// + { + TRealX x; + TInt r=Val(x,aPoint); + if (r==KErrNone) + r=x.GetTReal(aVal); + return r; + } + +TInt TLex16::Val(TRealX& aVal) +// +// Convert an extended real. Use the locale decimal point. +// + { + TLocale locale; + return(Val(aVal,locale.DecimalSeparator())); + } + +TInt TLex16::Val(TRealX& aVal, TChar aPoint) +// +// Convert a 64 bit real +// + { + + HBufC8 *temp=HBufC8::New(iEnd-iNext); + if (temp==NULL) + return(KErrNoMemory); + TPtr8 tdes(temp->Des()); + +// for (TUint8 *p=(TUint8*)iNext; p<(TUint8*)iEnd; p+=2) +// tdes.Append(*p); + + for (const TText* p = (TText*)iNext; p < (TText*)iEnd; p++) + { + TChar c = *p; + if (c == aPoint) + c = '.'; + else if (c == '.') + c = ' '; + else if (c > 255) + c = ' '; + tdes.Append((TUint8)c); + } + aPoint = '.'; + + TLex8 lex(tdes); + lex.Mark(); + TInt r=lex.Val(aVal,aPoint); + User::Free(temp); + if (r==KErrNone) + Inc(lex.TokenLength()); + return r; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_exp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_exp.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,149 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_exp.cpp +// Floating point exponentiation +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + +#ifndef __USE_VFP_MATH + +LOCAL_D const TUint32 ExpCoeffs[] = + { + 0x00000000,0x80000000,0x7FFF0000, // polynomial approximation to 2^(x/8) + 0xD1CF79AC,0xB17217F7,0x7FFB0000, // for 0<=x<=1 + 0x1591EF2B,0xF5FDEFFC,0x7FF60000, + 0x23B940A9,0xE35846B9,0x7FF10000, + 0xDD73C23F,0x9D955ADE,0x7FEC0000, + 0x8728EBE7,0xAEC4616C,0x7FE60000, + 0xAF177130,0xA1646F7D,0x7FE00000, + 0xC44EAC22,0x8542C46E,0x7FDA0000 + }; + +LOCAL_D const TUint32 TwoToNover8[] = + { + 0xEA8BD6E7,0x8B95C1E3,0x7FFF0000, // 2^0.125 + 0x8DB8A96F,0x9837F051,0x7FFF0000, // 2^0.250 + 0xB15138EA,0xA5FED6A9,0x7FFF0000, // 2^0.375 + 0xF9DE6484,0xB504F333,0x7FFF0000, // 2^0.500 + 0x5506DADD,0xC5672A11,0x7FFF0000, // 2^0.625 + 0xD69D6AF4,0xD744FCCA,0x7FFF0000, // 2^0.750 + 0xDD24392F,0xEAC0C6E7,0x7FFF0000 // 2^0.875 + }; + +LOCAL_D const TUint32 EightLog2edata[] = {0x5C17F0BC,0xB8AA3B29,0x80020000}; // 8/ln2 + + + + +EXPORT_C TInt Math::Exp(TReal& aTrg, const TReal& aSrc) +/** +Calculates the value of e to the power of x. + +@param aTrg A reference containing the result. +@param aSrc The power to which e is to be raised. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + // Calculate exp(aSrc) and write result to aTrg + // Algorithm: + // Let x=aSrc/ln2 and calculate 2^x + // 2^x = 2^int(x).2^frac(x) + // 2^int(x) just adds int(x) to the final result exponent + // Reduce frac(x) to the range [0,0.125] (modulo 0.125) + // Use polynomial to calculate 2^x for 0<=x<=0.125 + // Multiply by 2^(n/8) for n=0,1,2,3,4,5,6,7 to give 2^frac(x) + + const TRealX& EightLog2e=*(const TRealX*)EightLog2edata; + + TRealX x; + TRealX y; + TInt r=x.Set(aSrc); + if (r==KErrNone) + { + x*=EightLog2e; + TInt n=(TInt)x; + if (n<16384 && n>-16384) + { + if (x.iSign&1) + n--; + x-=TRealX(n); + PolyX(y,x,7,(const TRealX*)ExpCoeffs); + y.iExp=TUint16(TInt(y.iExp)+(n>>3)); + n&=7; + if (n) + y*= (*(const TRealX*)(TwoToNover8+3*n-3)); + return y.GetTReal(aTrg); + } + else + { + if (n<0) + { + SetZero(aTrg); + r=KErrUnderflow; + } + else + { + SetInfinite(aTrg,0); + r=KErrOverflow; + } + return r; + } + } + else + { + if (r==KErrArgument) + SetNaN(aTrg); + if (r==KErrOverflow) + { + if (x.iSign&1) + { + SetZero(aTrg); + r=KErrUnderflow; + } + else + { + SetInfinite(aTrg,0); + } + } + return r; + } + } + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal exp(TReal); + +EXPORT_C TInt Math::Exp(TReal& aTrg, const TReal& aSrc) + { + aTrg = exp(aSrc); + if (Math::IsZero(aTrg)) + return KErrUnderflow; + if (Math::IsFinite(aTrg)) + return KErrNone; + if (Math::IsInfinite(aTrg)) + return KErrOverflow; + SetNaN(aTrg); + return KErrArgument; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_frac.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_frac.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,105 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_frac.cpp +// Writes the fractional part of aTrg to aSrc +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + +#ifndef __USE_VFP_MATH + +#ifndef __REALS_MACHINE_CODED__ +EXPORT_C TInt Math::Frac(TReal &aTrg,const TReal &aSrc) +/** +Calculates the fractional part of a number. + +The fractional part is that after a decimal point. +Truncation is toward zero, so that +Frac(2.4)=0.4, Frac(2)=0, Frac(-1)=0, Frac(-1.4)=0.4. + +@param aTrg A reference containing the result. +@param aSrc The number whose fractional part is required. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + TRealX f; + TInt ret=f.Set(aSrc); + if (ret!=KErrNone) + { + if (ret==KErrArgument) + SetNaN(aTrg); + if (ret==KErrOverflow) + SetZero(aTrg,f.iSign&1); + return(ret); + } + TInt intbits=f.iExp-0x7FFE; + if (intbits<=0) // aSrc is already a fraction + { + aTrg=aSrc; + return(KErrNone); + } + if (intbits>KMantissaBits) + { + SetZero(aTrg,f.iSign&1); + return(KErrNone); + } + + // calculate integer part and subtract + // this means that the subtraction normalises the result + TRealX g=f; + + TUint64 mask = ~(UI64LIT(0)); + mask <<= (64 - intbits); + + g.iMantHi &= static_cast(mask >> 32); + g.iMantLo &= static_cast(mask); + + f-=g; + f.GetTReal(aTrg); + return(KErrNone); + } + +#endif //__REALS_MACHINE_CODED__ + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal modf(TReal,TReal*); + +EXPORT_C TInt Math::Frac(TReal& aTrg, const TReal& aSrc) + { + if (Math::IsNaN(aSrc)) + { + SetNaN(aTrg); + return KErrArgument; + } + if (Math::IsInfinite(aSrc)) + { + SetZero(aTrg); + return KErrOverflow; + } + + TReal temp; + aTrg = modf(aSrc,&temp); + return KErrNone; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_int.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_int.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,281 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_int.cpp +// Writes the integer part aTrg to aSrc (aSrc is either TReal,TInt16 orTInt32) +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + +#ifndef __USE_VFP_MATH + +#ifndef __REALS_MACHINE_CODED__ +EXPORT_C TInt Math::Int(TReal &aTrg,const TReal &aSrc) +/** +Calculates the integer part of a number. + +The integer part is that before a decimal point. +Truncation is toward zero, so that +int(2.4)=2, int(2)=2, int(-1)=-1, int(-1.4)=-1, int(-1.999)=-1. + + +@param aTrg A reference containing the result. +@param aSrc The number whose integer part is required. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + TRealX f; + TInt ret=f.Set(aSrc); + if (ret!=KErrNone) + { + aTrg=aSrc; + return(ret); + } + TInt intbits=f.iExp-0x7FFE; // number of integer bits in mantissa + if (intbits<=0) + { + SetZero(aTrg,f.iSign&1); // no integer part + return(KErrNone); + } + if (intbits>=KMantissaBits) + { + aTrg=aSrc; // fractional part is outside range of significance + return(KErrNone); + } + + TUint64 mask = ~(UI64LIT(0)); + mask <<= (64 - intbits); + + f.iMantHi &= static_cast(mask >> 32); + f.iMantLo &= static_cast(mask); + + f.GetTReal(aTrg); + return(KErrNone); + } + + + + +EXPORT_C TInt Math::Int(TInt16 &aTrg,const TReal &aSrc) +/** +Calculates the integer part of a number. + +The integer part is that before a decimal point. +Truncation is toward zero, so that +int(2.4)=2, int(2)=2, int(-1)=-1, int(-1.4)=-1, int(-1.999)=-1. + +This function is suitable when the result is known to be small enough +for a 16-bit signed integer. + +@param aTrg A reference containing the result. +@param aSrc The number whose integer part is required. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ +// +// If the integer part of aSrc is in the range -32768 to +32767 +// inclusive, write the integer part to the TInt16 at aTrg +// Negative numbers are rounded towards zero. +// If an overflow or underflow occurs, aTrg is set to the max/min value +// + { + TRealX f; + TInt ret=f.Set(aSrc); + + if (ret==KErrArgument) + { + aTrg=0; + return(ret); + } + + TInt intbits=f.iExp-0x7FFE; // number of integer bits in mantissa + + if (intbits<=0) + { + aTrg=0; + return(KErrNone); + } + + if (intbits>16) + { + aTrg=(TInt16)((f.iSign&1) ? KMinTInt16 : KMaxTInt16); + return((f.iSign&1) ? KErrUnderflow : KErrOverflow); + } + + TUint val = f.iMantHi >> (32 - intbits); + + if ((f.iSign&1)==0 && val>(TUint)KMaxTInt16) + { + aTrg=TInt16(KMaxTInt16); + return(KErrOverflow); + } + + if ((f.iSign&1) && val>(TUint)(KMaxTInt16+1)) + { + aTrg=TInt16(KMinTInt16); + return(KErrUnderflow); + } + + aTrg = (f.iSign&1) ? (TInt16)(-(TInt)val) : (TInt16)val; + + return(KErrNone); + } + + + + +EXPORT_C TInt Math::Int(TInt32 &aTrg,const TReal &aSrc) +/** +Calculates the integer part of a number. + +The integer part is that before a decimal point. +Truncation is toward zero, so that +int(2.4)=2, int(2)=2, int(-1)=-1, int(-1.4)=-1, int(-1.999)=-1. + +This function is suitable when the result is known to be small enough +for a 32-bit signed integer. + +@param aTrg A reference containing the result. +@param aSrc The number whose integer part is required. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ +// +// If the integer part of the float is in the range -2147483648 to +2147483647 +// inclusive, write the integer part to the TInt32 at aTrg +// Negative numbers are rounded towards zero. +// If an overflow or underflow occurs, aTrg is set to the max/min value +// + { + TRealX f; + TInt ret=f.Set(aSrc); + + if (ret==KErrArgument) + { + aTrg=0; + return(ret); + } + + TInt intbits=f.iExp-0x7FFE; // number of integer bits in mantissa + + if (intbits<=0) + { + aTrg=0; + return(KErrNone); + } + + if (intbits>32) + { + aTrg=((f.iSign&1) ? KMinTInt32 : KMaxTInt32); + return((f.iSign&1) ? KErrUnderflow : KErrOverflow); + } + + TUint val = f.iMantHi >> (32 - intbits); + + if ((f.iSign&1)==0 && val>(TUint)KMaxTInt32) + { + aTrg=KMaxTInt32; + return(KErrOverflow); + } + + if ((f.iSign&1) && val>((TUint)KMaxTInt32+1)) + { + aTrg=KMinTInt32; + return(KErrUnderflow); + } + + aTrg=(f.iSign&1) ? -(TInt32)val : val; + + return(KErrNone); + } + +#endif //__REALS_MACHINE_CODED__ + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal modf(TReal,TReal*); + +EXPORT_C TInt Math::Int(TReal& aTrg, const TReal& aSrc) + { + if (Math::IsNaN(aSrc)) + { + SetNaN(aTrg); + return KErrArgument; + } + if (Math::IsInfinite(aSrc)) + { + aTrg=aSrc; + return KErrOverflow; + } + + modf(aSrc,&aTrg); + return KErrNone; + } + +EXPORT_C TInt Math::Int(TInt32& aTrg, const TReal& aSrc) + { + TReal aIntPart; + TInt r = Math::Int(aIntPart,aSrc); + if (r==KErrArgument) + { + aTrg = 0; + return r; + } + if (aIntPart>KMaxTInt32) + { + aTrg = KMaxTInt32; + return KErrOverflow; + } + if (aIntPartKMaxTInt16) + { + aTrg = KMaxTInt16; + return KErrOverflow; + } + if (aIntPartSqr2, replace x with x/Sqr2 + // If xSqr2) + { + x*=Sqr2Inv; + n++; + } + } + else + { + n=0; + x.iExp=0x7FFE; + if (xKMantissaBits) + { + SetZero(aTrg); + return KErrTotalLossOfPrecision; + } + f1.ModEq(f2); + return f1.GetTReal(aTrg); + } + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal fmod(TReal,TReal); + +EXPORT_C TInt Math::Mod(TReal& aTrg, const TReal& aSrc, const TReal &aModulus) + { + SReal64 *pSrc=(SReal64 *)&aSrc; + SReal64 *pModulus=(SReal64 *)&aModulus; + + if (pSrc->exp==0 || pModulus->exp==0 || pSrc->exp==KSpecialExponent || pModulus->exp==KSpecialExponent) + { + TRealX f1,f2; + TInt r=f1.Set(aSrc); + if (r!=KErrNone) + { + SetNaN(aTrg); + return KErrArgument; + } + r=f2.Set(aModulus); + if (r==KErrArgument || f2.IsZero()) + { + SetNaN(aTrg); + return KErrArgument; + } + if (r==KErrOverflow) + { + aTrg=aSrc; + return KErrNone; + } + if ((TInt(f1.iExp)-TInt(f2.iExp))>KMantissaBits) + { + SetZero(aTrg); + return KErrTotalLossOfPrecision; + } + } + else if ((pSrc->exp - pModulus->exp) > KMantissaBits) + { + SetZero(aTrg); + return KErrTotalLossOfPrecision; + } + + aTrg = fmod(aSrc,aModulus); + return KErrNone; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_pow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_pow.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,374 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_pow.cpp +// Raise to the power. +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + + +#ifndef __USE_VFP_MATH + +LOCAL_D const TUint32 ArtanhCoeffs[] = + { + 0x5C17F0BC,0xB8AA3B29,0x80010000, // polynomial approximation to (4/ln2)artanh(x) + 0xD01FDDD8,0xF6384EE1,0x7FFF0000, // for |x| <= (sqr2-1)/(sqr2+1) + 0x7D0DDC69,0x93BB6287,0x7FFF0000, + 0x6564D4F5,0xD30BB153,0x7FFE0000, + 0x1546C858,0xA4258A33,0x7FFE0000, + 0xCCE50DA9,0x864D28DF,0x7FFE0000, + 0x8E1A5DBB,0xE35271A0,0x7FFD0000, + 0xF5A67D92,0xC3A36B08,0x7FFD0000, + 0x62D53E02,0xC4A1FFAC,0x7FFD0000 + }; + +LOCAL_D const TUint32 TwoToxCoeffs[] = + { + 0x00000000,0x80000000,0x7FFF0000, // polynomial approximation to 2^(x/8) for + 0xD1CF79AC,0xB17217F7,0x7FFB0000, // 0<=x<=1 + 0x162CF72B,0xF5FDEFFC,0x7FF60000, + 0x23EC0D04,0xE35846B8,0x7FF10000, + 0xBDB408D7,0x9D955B7E,0x7FEC0000, + 0xFDD8A678,0xAEC3FE73,0x7FE60000, + 0xBD6E3950,0xA184E90A,0x7FE00000, + 0xC1054DA3,0xFFB259D8,0x7FD90000, + 0x70893DE4,0xB8BEDE2F,0x7FD30000 + }; + +LOCAL_D const TUint32 TwoToNover8[] = + { + 0xEA8BD6E7,0x8B95C1E3,0x7FFF0000, // 2^0.125 + 0x8DB8A96F,0x9837F051,0x7FFF0000, // 2^0.250 + 0xB15138EA,0xA5FED6A9,0x7FFF0000, // 2^0.375 + 0xF9DE6484,0xB504F333,0x7FFF0000, // 2^0.500 + 0x5506DADD,0xC5672A11,0x7FFF0000, // 2^0.625 + 0xD69D6AF4,0xD744FCCA,0x7FFF0000, // 2^0.750 + 0xDD24392F,0xEAC0C6E7,0x7FFF0000 // 2^0.875 + }; + +LOCAL_D const TUint32 Sqr2data[] = {0xF9DE6484,0xB504F333,0x7FFF0000}; // sqr2 +LOCAL_D const TUint32 Sqr2Invdata[] = {0xF9DE6484,0xB504F333,0x7FFE0000}; // 1/sqr2 +LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000}; // 1.0 + +LOCAL_C void Log2(TRealX& y, TRealX& x) + { + // Calculate log2(x) and write to y + // Result to 64-bit precision to allow accurate powers + // Algorithm: + // log2(aSrc)=log2(2^e.m) e=exponent of aSrc, m=mantissa 1<=m<2 + // log2(aSrc)=e+log2(m) + // If e=-1 (0.5<=aSrc<1), let x=aSrc else let x=mantissa(aSrc) + // If x>Sqr2, replace x with x/Sqr2 + // If xSqr2) + { + x*=Sqr2Inv; + n++; + } + } + else + { + n=0; + x.iExp=0x7FFE; + if (x1) + y.iExp--; + else + y.iExp=0; + } + +LOCAL_C TInt TwoTox(TRealX& y, TRealX& x) + { + // Calculate 2^x and write result to y. Result to 64 bit precision. + // Algorithm: + // 2^x = 2^int(x).2^frac(x) + // 2^int(x) just adds int(x) to the final result exponent + // Reduce frac(x) to the range [0,0.125] (modulo 0.125) + // Use polynomial to calculate 2^x for 0<=x<=0.125 + // Multiply by 2^(n/8) for n=0,1,2,3,4,5,6,7 to give 2^frac(x) + + if (x.iExp) + x.iExp+=3; + TInt n=(TInt)x; + if (n<16384 && n>-16384) + { + if (x.iSign&1) + n--; + x-=TRealX(n); + Math::PolyX(y,x,8,(const TRealX*)TwoToxCoeffs); + y.iExp=TUint16(TInt(y.iExp)+(n>>3)); + n&=7; + if (n) + y*= (*(const TRealX*)(TwoToNover8+3*n-3)); + return KErrNone; + } + else + { + if (n<0) + { + y.SetZero(); + return KErrUnderflow; + } + else + { + y.SetInfinite(0); + return KErrOverflow; + } + } + } + + + + +EXPORT_C TInt Math::Pow(TReal &aTrg,const TReal &aSrc,const TReal &aPower) +/** +Calculates the value of x raised to the power of y. + +The behaviour conforms to that specified for pow() in the +ISO C Standard ISO/IEC 9899 (Annex F), although floating-point exceptions +are not supported. + +@param aTrg A reference containing the result. +@param aSrc The x argument of the function. +@param aPower The y argument of the function. + +@return KErrNone if successful; + KErrOverflow if the result is +/- infinity; + KErrUnderflow if the result is too small to be represented; + KErrArgument if the result is not a number (NaN). +*/ +// +// Evaluates aSrc raised to the power aPower and places the result in aTrg. +// For non-special values algorithm is aTrg=2^(aPower*log2(aSrc)) +// + { + TRealX x,p; + + TInt ret2=p.Set(aPower); + // pow(x, +/-0) -> 1 for any x, even a NaN + if (p.IsZero()) + { + aTrg=1.0; + return KErrNone; + } + + TInt ret1=x.Set(aSrc); + if (ret1==KErrArgument || ret2==KErrArgument) + { + // pow(+1, y) -> 1 for any y, even a NaN + // XXX First test should not be necessary, but on WINS + // aSrc == 1.0 is true when aSrc is NaN. + if (ret1 != KErrArgument && aSrc == 1.0) + { + aTrg=aSrc; + return KErrNone; + } + SetNaN(aTrg); + return KErrArgument; + } + + // Infinite power + if (ret2==KErrOverflow) + { + // figure out which of these cases we have: + // + // pow(x, -INF) -> +INF for |x| < 1 } flag = 0 + // pow(x, +INF) -> +INF for |x| > 1 } + // pow(x, -INF) -> +0 for |x| > 1 } flag = 1 + // pow(x, +INF) -> +0 for |x| < 1 } + // + // flag = 2 => |x| == 1.0 + // + TInt flag=2; + if (Abs(aSrc)>1.0) + flag=p.iSign&1; + if (Abs(aSrc)<1.0) + flag=1-(p.iSign&1); + if (flag==0) + { + SetInfinite(aTrg,0); + return KErrOverflow; + } + if (flag==1) + { + SetZero(aTrg,0); + return KErrNone; + } + if (Abs(aSrc)==1.0) + { + // pow(-1, +/-INF) -> 1 + aTrg=1.0; + return KErrNone; + } + // This should never happen (i.e. aSrc is NaN, which + // should be taken care of above) + SetNaN(aTrg); + return KErrArgument; + } + + // Negative Base raised to a power + TInt odd=1; + if (x.iSign & 1) + { + TReal pint; + Math::Int(pint,aPower); + if (aPower-pint) // Checks that if aSrc is less than zero, then aPower is integral + { + // pow(-INF, y) -> +0 for y < 0 and not an odd integer + // pow(-INF, y) -> +INF for y > 0 and not an odd integer + // Since we're here, aPower is not integral, so can't be odd, either + if (ret1 == KErrOverflow) + { + if (aPower < 0) + { + SetZero(aTrg); + return KErrNone; + } + else + { + SetInfinite(aTrg,0); + return KErrOverflow; + } + } + SetNaN(aTrg); + return KErrArgument; + } + TReal powerby2=aPower*0.5; + Math::Int(pint,powerby2); + if (powerby2-pint) + odd=(-1); + x.iSign=0; + } + + // Zero or infinity raised to a power + if (x.IsZero() || ret1==KErrOverflow) + { + if (x.IsZero() && p.IsZero()) + { + aTrg=1.0; + return KErrNone; + } + TInt sign=(odd==-1 ? 1 : 0); + if ((x.IsZero() && (p.iSign&1)==0) || (ret1==KErrOverflow && (p.iSign&1))) + { + SetZero(aTrg,sign); + return KErrNone; + } + else + { + SetInfinite(aTrg,sign); + return KErrOverflow; + } + } + + TRealX y; + Log2(y,x); + x=y*p; // this cannot overflow or underflow + TInt r=TwoTox(y,x); + if (odd<0) + y.iSign=1; + TInt r2=y.GetTReal(aTrg); + return (r==KErrNone)?r2:r; + } + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal pow(TReal,TReal); + +EXPORT_C TInt Math::Pow(TReal &aTrg,const TReal &aSrc,const TReal &aPower) + { + aTrg = pow(aSrc,aPower); + if (Math::IsZero(aTrg) && !Math::IsZero(aSrc) && !Math::IsInfinite(aSrc) && !Math::IsInfinite(aPower)) + return KErrUnderflow; + if (Math::IsFinite(aTrg)) + return KErrNone; + if (Math::IsZero(aPower)) // pow(x, +/-0) -> 1 for any x, even a NaN + { + aTrg = 1.0; + return KErrNone; + } + if (Math::IsInfinite(aTrg)) + return KErrOverflow; + if (aSrc==1.0) // pow(+1, y) -> 1 for any y, even a NaN + { + aTrg=aSrc; + return KErrNone; + } + if (Math::IsInfinite(aPower)) + { + if (aSrc == -1.0) // pow(-1, +/-INF) -> 1 + { + aTrg = 1.0; + return KErrNone; + } + if (((Abs(aSrc) < 1) && (aPower < 0)) || // pow(x, -INF) -> +INF for |x| < 1 + ((Abs(aSrc) > 1) && (aPower > 0))) // pow(x, +INF) -> +INF for |x| > 1 + { + SetInfinite(aTrg,0); + return KErrOverflow; + } + } + // pow(-INF, y) -> +INF for y > 0 and not an odd integer + if (Math::IsInfinite(aSrc) && (aSrc < 0) && (aPower > 0)) + { + TBool odd = EFalse; + TReal pint; + Math::Int(pint, aPower); + if (aPower == pint) + { + TReal halfPower = aPower * 0.5; + Math::Int(pint, halfPower); + if (halfPower != pint) + odd = ETrue; + } + if (odd == EFalse) + { + SetInfinite(aTrg,0); + return KErrOverflow; + } + } + + // Otherwise... + SetNaN(aTrg); + return KErrArgument; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_pow10.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_pow10.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,265 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_pow10.cpp +// Return a power of 10 as a TReal +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + + +// Tables of powers of 10 +LOCAL_D const TUint32 PositivePowersOfTen[] = + { +// Positive powers 1-31 + 0x00000000,0xA0000000,0x80020000, + 0x00000000,0xC8000000,0x80050000, + 0x00000000,0xFA000000,0x80080000, + 0x00000000,0x9C400000,0x800C0000, + 0x00000000,0xC3500000,0x800F0000, + 0x00000000,0xF4240000,0x80120000, + 0x00000000,0x98968000,0x80160000, + 0x00000000,0xBEBC2000,0x80190000, + 0x00000000,0xEE6B2800,0x801C0000, + 0x00000000,0x9502F900,0x80200000, + 0x00000000,0xBA43B740,0x80230000, + 0x00000000,0xE8D4A510,0x80260000, + 0x00000000,0x9184E72A,0x802A0000, + 0x80000000,0xB5E620F4,0x802D0000, + 0xA0000000,0xE35FA931,0x80300000, + 0x04000000,0x8E1BC9BF,0x80340000, + 0xC5000000,0xB1A2BC2E,0x80370000, + 0x76400000,0xDE0B6B3A,0x803A0000, + 0x89E80000,0x8AC72304,0x803E0000, + 0xAC620000,0xAD78EBC5,0x80410000, + 0x177A8000,0xD8D726B7,0x80440000, + 0x6EAC9000,0x87867832,0x80480000, + 0x0A57B400,0xA968163F,0x804B0000, + 0xCCEDA100,0xD3C21BCE,0x804E0000, + 0x401484A0,0x84595161,0x80520000, + 0x9019A5C8,0xA56FA5B9,0x80550000, + 0xF4200F3A,0xCECB8F27,0x80580000, + 0xF8940984,0x813F3978,0x805C0000, + 0x36B90BE5,0xA18F07D7,0x805F0000, + 0x04674EDF,0xC9F2C9CD,0x80620000, + 0x45812296,0xFC6F7C40,0x80650000, + +// Positive powers 32-31*32 in steps of 32 + 0x2B70B59E,0x9DC5ADA8,0x80690000, + 0xFFCFA6D5,0xC2781F49,0x80D30000, + 0xC59B14A3,0xEFB3AB16,0x813D0000, + 0x80E98CE0,0x93BA47C9,0x81A80000, + 0x7FE617AA,0xB616A12B,0x82120000, + 0x3927556B,0xE070F78D,0x827C0000, + 0xE33CC930,0x8A5296FF,0x82E70000, + 0x9DF9DE8E,0xAA7EEBFB,0x83510000, + 0x5C6A2F8C,0xD226FC19,0x83BB0000, + 0xF2CCE376,0x81842F29,0x84260000, + 0xDB900AD2,0x9FA42700,0x84900000, + 0xAEF8AA17,0xC4C5E310,0x84FA0000, + 0xE9B09C59,0xF28A9C07,0x85640000, + 0xEBF7F3D4,0x957A4AE1,0x85CF0000, + 0x0795A262,0xB83ED8DC,0x86390000, + 0xA60E91C7,0xE319A0AE,0x86A30000, + 0x432D7BC3,0x8BF61451,0x870E0000, + 0x6B6795FD,0xAC83FB89,0x87780000, + 0xB8FA79B0,0xD4A44FB4,0x87E20000, + 0xE54A9D1D,0x830CF791,0x884D0000, + 0xADE24964,0xA1884B69,0x88B70000, + 0x1F8F01CC,0xC71AA36A,0x89210000, + 0x437028F3,0xF56A298F,0x898B0000, + 0xCD00A68C,0x973F9CA8,0x89F60000, + 0xD7CC9ECD,0xBA6D9B40,0x8A600000, + 0x8D737F0E,0xE5CA5A0B,0x8ACA0000, + 0x1346BDA5,0x8D9E89D1,0x8B350000, + 0xE3D5DBEA,0xAE8F2B2C,0x8B9F0000, + 0x5A0C1B30,0xD7293020,0x8C090000, + 0x0D2ECFD2,0x849A672A,0x8C740000, + 0x41FA93DE,0xA3722C13,0x8CDE0000, + +// Positive powers 1024-8*1024 in steps of 1024 + 0x81750C17,0xC9767586,0x8D480000, + 0xC53D5DE5,0x9E8B3B5D,0x9A920000, + 0xD88B5A8B,0xF9895D25,0xA7DB0000, + 0x8A20979B,0xC4605202,0xB5250000, + 0xFED3AB23,0x9A8A7EF0,0xC26F0000, + 0x73A56037,0xF33C80E8,0xCFB80000, + 0x61889066,0xBF6B0EC4,0xDD020000, + 0x7FAF211A,0x96A3A1D1,0xEA4C0000 + }; + +LOCAL_D const TUint32 NegativePowersOfTen[] = + { +// Negative powers 1-31 + 0xCCCCCCCD,0xCCCCCCCC,0x7FFB0000, + 0x70A3D70A,0xA3D70A3D,0x7FF80000, + 0x8D4FDF3B,0x83126E97,0x7FF50000, + 0xE219652C,0xD1B71758,0x7FF10000, + 0x1B478423,0xA7C5AC47,0x7FEE0000, + 0xAF6C69B6,0x8637BD05,0x7FEB0000, + 0xE57A42BC,0xD6BF94D5,0x7FE70000, + 0x8461CEFD,0xABCC7711,0x7FE40000, + 0x36B4A597,0x89705F41,0x7FE10000, + 0xBDEDD5BF,0xDBE6FECE,0x7FDD0000, + 0xCB24AAFF,0xAFEBFF0B,0x7FDA0000, + 0x6F5088CC,0x8CBCCC09,0x7FD70000, + 0x4BB40E13,0xE12E1342,0x7FD30000, + 0x095CD80F,0xB424DC35,0x7FD00000, + 0x3AB0ACD9,0x901D7CF7,0x7FCD0000, + 0xC44DE15B,0xE69594BE,0x7FC90000, + 0x36A4B449,0xB877AA32,0x7FC60000, + 0x921D5D07,0x9392EE8E,0x7FC30000, + 0xB69561A5,0xEC1E4A7D,0x7FBF0000, + 0x92111AEB,0xBCE50864,0x7FBC0000, + 0x74DA7BEF,0x971DA050,0x7FB90000, + 0xBAF72CB1,0xF1C90080,0x7FB50000, + 0x95928A27,0xC16D9A00,0x7FB20000, + 0x44753B53,0x9ABE14CD,0x7FAF0000, + 0xD3EEC551,0xF79687AE,0x7FAB0000, + 0x76589DDB,0xC6120625,0x7FA80000, + 0x91E07E48,0x9E74D1B7,0x7FA50000, + 0x8300CA0E,0xFD87B5F2,0x7FA10000, + 0x359A3B3E,0xCAD2F7F5,0x7F9E0000, + 0x5E14FC32,0xA2425FF7,0x7F9B0000, + 0x4B43FCF5,0x81CEB32C,0x7F980000, + +// Negative powers 32-31*32 in steps of 32 + 0x453994BA,0xCFB11EAD,0x7F940000, + 0xA539E9A5,0xA87FEA27,0x7F2A0000, + 0xFD75539B,0x88B402F7,0x7EC00000, + 0x64BCE4A1,0xDDD0467C,0x7E550000, + 0xDB73A093,0xB3F4E093,0x7DEB0000, + 0x5423CC06,0x91FF8377,0x7D810000, + 0x4A314EBE,0xECE53CEC,0x7D160000, + 0x637A193A,0xC0314325,0x7CAC0000, + 0x836AC577,0x9BECCE62,0x7C420000, + 0x478238D1,0xFD00B897,0x7BD70000, + 0x46F34F7D,0xCD42A113,0x7B6D0000, + 0xB11B0858,0xA686E3E8,0x7B030000, + 0x3FFC68A6,0x871A4981,0x7A990000, + 0xB6074245,0xDB377599,0x7A2E0000, + 0x79007736,0xB1D983B4,0x79C40000, + 0xDB23D21C,0x9049EE32,0x795A0000, + 0x467F9466,0xEA1F3806,0x78EF0000, + 0xEE5092C7,0xBDF139F0,0x78850000, + 0xB4730DD0,0x9A197865,0x781B0000, + 0x8871347D,0xFA0A6CDB,0x77B00000, + 0x3C8736FC,0xCADB6D31,0x77460000, + 0x52EB8375,0xA493C750,0x76DC0000, + 0x774FB85E,0x85855C0F,0x76720000, + 0x505DE96B,0xD8A66D4A,0x76070000, + 0xCB39A7B1,0xAFC47766,0x759D0000, + 0xA9B05AC8,0x8E997872,0x75330000, + 0xFDC06462,0xE761832E,0x74C80000, + 0xBB827F2D,0xBBB7EF38,0x745E0000, + 0xE1F045DD,0x984B9B19,0x73F40000, + 0x3613F568,0xF71D01E0,0x73890000, + 0x3F64789E,0xC87B6D2F,0x731F0000, + +// Negative powers 1024-8*1024 in steps of 1024 + 0xDA57C0BE,0xA2A682A5,0x72B50000, + 0x34362DE4,0xCEAE534F,0x656B0000, + 0x91575A88,0x8350BF3C,0x58220000, + 0xD2CE9FDE,0xA6DD04C8,0x4AD80000, + 0x0DA5D8E8,0xD408CB01,0x3D8E0000, + 0x22EB58E9,0x86B77A60,0x30450000, + 0x4779611E,0xAB2F7655,0x22FB0000, + 0x686DA869,0xD986C20B,0x15B10000 + }; + +TInt Math::MultPow10X(TRealX& aTrg, TInt aPower) + { + if (aTrg.IsZero()) + return KErrNone; + if (!aTrg.IsFinite()) + { + if (aTrg.IsNaN()) + return KErrArgument; + return KErrOverflow; + } + if (aPower==0) + return KErrNone; + // smallest non-zero TRealX is 2^-32766=2.83E-9864 + // largest TRealX is 2^32768=1.42E+9864 + // Therefore aPower>=19728 guarantees an overflow + // and aPower<=-19728 guarantees an underflow + if (aPower>=19728) + { + aTrg.SetInfinite(aTrg.iSign); + return KErrOverflow; + } + if (aPower<=-19728) + { + aTrg.SetZero(aTrg.iSign); + return KErrUnderflow; + } + const TRealX* powTab; + if (aPower>0) + powTab=(const TRealX*)PositivePowersOfTen; + else + { + aPower=-aPower; + powTab=(const TRealX*)NegativePowersOfTen; + } + TInt r=KErrNone; + while(aPower>=8192) + { + aPower-=8192; + r=aTrg.MultEq(powTab[31+31+7]); + if (r!=KErrNone) + return r; + } + TInt bottom5=aPower & 0x1f; + TInt middle5=(aPower>>5)&0x1f; + TInt top3=(aPower>>10); + if (top3) + r=aTrg.MultEq(powTab[31+31+top3-1]); + if (r==KErrNone && middle5) + r=aTrg.MultEq(powTab[31+middle5-1]); + if (r==KErrNone && bottom5) + r=aTrg.MultEq(powTab[bottom5-1]); + return r; + } + + + + +EXPORT_C TInt Math::Pow10(TReal &aTrg,const TInt aExp) +/** +Calculates the value of 10 to the power of x. + +@param aTrg A reference containing the result. +@param aExp The power to which 10 is to be raised. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ +// +// Write the binary floating point representation of a power of 10 to aSrc +// Returns KErrNone if OK or a negative error number otherwise. +// + { +#ifndef __USE_VFP_MATH + TRealX x=1; + TInt r=Math::MultPow10X(x,aExp); + TInt s=x.GetTReal(aTrg); + return (r==KErrNone)?s:r; +#else // __USE_VFP_MATH + return Math::Pow(aTrg,10,aExp); +#endif + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_rand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_rand.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,64 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_rand.cpp +// +// + +#include "um_std.h" + + + + +EXPORT_C TInt Math::Rand(TInt64 &aSeed) +/** +Generates a stream of uniformly distributed pseudo-random integers +in the range, 0 to KMaxTInt. + +For each stream of pseudo-random numbers you wish to generate, you should +pass the reference to the same 64-bit seed on each call to this function. +You should not change the seed between calls. + +@param aSeed A reference to a 64-bit seed, which is updated + as a result of the call. + +@return The next pseudo-random number in the sequence. +*/ + { + + aSeed*=214013; + aSeed+=2531011; + return(((TInt)(aSeed>>16))&0x7fffffff); + } + + + + +EXPORT_C TReal Math::FRand(TInt64& aSeed) __SOFTFP +/** +Generates a stream of uniformly distributed pseudo-random real numbers +in the range, 0 to 1. + +@param aSeed A reference to a 64-bit seed, which is updated + as a result of the call. + +@return The next pseudo-random number in the sequence. +*/ + { + TUint low = (TUint)Math::Rand(aSeed); + TUint high = (TUint)Math::Rand(aSeed)&0x7FFFFFFF; // make sure TInt64 is positive + TRealX f((static_cast(high) << 32) | low); // construct TRealX 0<=f<2^63 + if (f.iExp) + f.iExp-=63; // Scale f to range 0<=f<1 + return(TReal(f)); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_rtod.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_rtod.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1073 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_rtod.cpp +// +// + +#include "um_std.h" + +#include + +#define KNeedsRounding 0x1000 +#if (KRealFormatTypeFlagsMask| KRealFormatTypesMask) & KNeedsRounding + #error KNeedsRounding already uses 0x1000 +#endif + +const TInt KMinThreeDigitExponent=100; + +_LIT8(KLit8Plus,"+"); +_LIT8(KLit8Minus,"-"); +_LIT8(KLit8Zero,"0"); +_LIT8(KLit8Inf,"Inf"); +_LIT8(KLit8Nan,"NaN"); + +LOCAL_C TInt round(const TText8* aBuf, const TInt aLen) +// +// Round number in buffer depending on digit at aBuf[aLen]. +// Return value is carry from most significant digit. +// + { + __ASSERT_DEBUG(aLen>=0,Panic(EMathUnexpectedError1)); + TText8* pB=(TText8*)aBuf+aLen; + if (*pB<'5') + return 0; // round down + while(--pB>=aBuf) + { + TText8 d=*pB; + if (d<'9') + { + ++d; + *pB=d; + return 0; + } + *pB='0'; + } + // carry propagates to exponent + *++pB='1'; + if (aLen>0) + pB[aLen]='0'; + return 1; + } + +TUint mult10(TUint64& a) +// +// Multiply a 64-bit binary fraction in a (MSB=2^-1) by 10 +// Return the fractional part in a, the integer part in the return value. +// + { + const TUint64 ten = 10; + TUint64 high; + Math::UMul64(a, ten, high, a); + return static_cast(high); + } + +LOCAL_C TInt fDigLim(TDes8& aTrg, const TReal& aSrc, TInt& aExp, const TBool aLimit) +// +// Convert the TReal at address aSrc to a decimal form suitable for use by a +// formatting routine. Writes the result into the descriptor at aTrg and the +// exponent in aExp. Returns the length of the string or a negative error number. +// +// AnnW, November 1996 - changed to handle all numbers in TReal64/96 range. +// +// The first character in aBuf is one of: +// +// '0' - indicates that aSrc is exactly zero. +// +// '+' - indicates a positive number and is followed by between 1 and KMaxPrecision +// decimal digits representing a mantissa in the range 0.1 to less than 1.0 which +// corresponds to the decimal exponent returned in aExp. +// +// '-' - indicates a negative mantissa and is otherwise the same as for '+'. +// +// If aLimit is ETrue then the format is limited to KPrecisionLimit significant digits +// + { + + TRealX x; + TInt r=x.Set(aSrc); + + if (x.IsZero()) + { + aTrg=KLit8Zero(); + return 1; + } + else // sets sign in all cases, including specials + aTrg=(x.iSign ? KLit8Minus() : KLit8Plus()); + + if (r!=KErrNone) + return r; + + x.iSign=0; + TInt e=TInt(x.iExp)-0x7fff; // 2^e<=Abs(x)<2^(e+1) + e*=19728; // log10(2)*65536 = 19728.301796... + // max error due to omission of fractional part is 9889 (towards zero) + e-=9889; // account for error, e may be too small by up to 19778 + // Now have 10^(e/65536)<=Abs(x)<4.007*10^(e/65536) + e>>=16; // Divide by 65536 - this always rounds towards -infinity + // Now have 10^e<=Abs(x)<40.07*10^e + e+=1; // Now have 0.1<=Abs(x)/10^e<4.07 + Math::MultPow10X(x,-e); // x*=10^-e so now 0.1<=x<4.07 + if (x.iExp>=0x7fff) + { + ++e; + Math::MultPow10X(x,-1); // if x>=1, multiply x by 10^-1 and increment e + } + + TUint64 mantissa = MAKE_TUINT64(x.iMantHi, x.iMantLo); + + if (x.iExp<0x7ffe) + mantissa >>= (0x7ffe - x.iExp); // shift to make exponent 0x7ffe, i.e. mantissa in range 0.1<=m<1 + + TInt prec=aLimit?KPrecisionLimit:KMaxPrecision; + + while ( mantissa && (aTrg.Length() < (prec + 2)) ) + { + TUint d = mult10(mantissa); + aTrg.Append(d+'0'); + } + if (aTrg.Length()>=prec+2) + { + e+=round(aTrg.Ptr()+1,prec); + aTrg.SetLength(prec+1); + } + aExp=e; + return aTrg.Length(); + } + +LOCAL_C TInt doExponent(TDes8* This, TDes8& aDigBuf, const TInt afDigLimSize, TInt aExp, + const TInt aNumPlcs, const TInt aNumSpace, const TText aPoint, const TUint flags) +// +// Convert the intermediate number represented in aDigBuf into its exponential representation +// and place into aTrg. +// This representation ensures that numbers are displayed to aNumDecPlcs+1 significant figures, +// but this is NOT a constant value in KTRealFormatGeneral mode. +// +// AnnW, November 1996 - changed to be able to take three-figure exponents if allowed by flags. +// + { + + TInt err; + TInt expSpace; + TInt useSigFigs=flags & KUseSigFigs; + TInt nDig=(useSigFigs ? Min(aNumPlcs,afDigLimSize) : aNumPlcs+1); + TInt threeDigitExp=flags & KAllowThreeDigitExp; + + if ((flags & KNeedsRounding) && afDigLimSize>nDig) + aExp+=round(aDigBuf.Ptr()+1,nDig); + + if (useSigFigs) // discard trailing zeros + { + while(nDig>1 && aDigBuf[nDig]=='0') + { + nDig--; + } + } + + if (aDigBuf[0]!='0') + // 100.5 is stored in aDigBuf as +1005 with and exp of 3, but it is to be displayed + // as 1.005 so exp must be decremented to 2 + aExp--; + + // Added by AnnW + if (threeDigitExp) + { + expSpace=(Abs(aExp)>=KMinThreeDigitExponent)?5:4; + } + else + { + err=(aExp<=-KMinThreeDigitExponent ? KErrUnderflow : (aExp>=KMinThreeDigitExponent ? KErrOverflow : KErrNone)); + if (err!=KErrNone) + return(err); + expSpace=4; + } + + // Check that number will fit in aNumSpace + if (aNumSpace<(expSpace+nDig+(nDig>1?1:0))) + // exponent + significant figures + point(if necessary) + return(KErrGeneral); + // end of added + + if (aDigBuf[0]=='0') // number to be converted is 0 + { + This->Append('0'); + if (nDig>1 && !useSigFigs) + { + This->Append(aPoint); + This->AppendFill('0',aNumPlcs); + } + } + else + { + This->Append(TChar(aDigBuf[1])); + if (nDig>1) + { + This->Append(aPoint); + for (TInt ii=2; ii<=nDig; ii++) + { + if (!useSigFigs) + // pad with zeros + This->Append(TChar(iiAppend(TChar(aDigBuf[ii])); + } + } + } + + This->Append('E'); + if (aExp<0) + { + aExp=-aExp; + This->Append('-'); + } + else + This->Append('+'); + + // Added by AnnW + TInt tempExp; + if (threeDigitExp && aExp>99) + { + This->Append(aExp/100+'0'); + tempExp=aExp%100; + } + else + tempExp = aExp; + // end of added + + This->Append(tempExp/10+'0'); + This->Append(tempExp%10+'0'); + return(KErrNone); + } + +LOCAL_C TInt doFixed(TDes8 *This,TDes8 &aDigBuf,const TInt afDigLimSize,TInt aExp,const TInt aNumDecPlcs, + const TInt aNumSpace,const TRealFormat &aFormat,const TUint flags) +// +// Convert the intermediate number represented in aDigBuf into its fixed representation and +// place into aTrg +// +// AnnW, November 1996 - changed to allow extra space to be left for potential sign, so that +// positive and negative numbers of the same exponent are displayed to the same precision. +// + { + + TInt err; + TInt doNotUseTriads=flags & KDoNotUseTriads; + TInt newNumSpace=aNumSpace; + // To allow positive and negative numbers with the same exponent to have the same number of + // significant figures. + if ((flags & KExtraSpaceForSign) && (aDigBuf[0]!='-')) + newNumSpace--; + + TInt roundOffset = aNumDecPlcs+aExp; + if (roundOffset>=0 && afDigLimSize>roundOffset && (flags & KNeedsRounding)) + aExp+=round(aDigBuf.Ptr()+1,roundOffset); + + if (newNumSpace<((aExp>0?aExp:1)+(aNumDecPlcs?aNumDecPlcs+1:0)+(!doNotUseTriads && aFormat.iTriLen && (aExp>(TInt)aFormat.iTriLen)?(aExp-1)/3:0))) + // exponent +ve and space < space needed for (digits before point + point + decimal places + triads) + { + err=(aExp>0 ? KErrOverflow : KErrGeneral); + return(err); + } + + if (aExp<=0) // hence number is of the form 0.NNNN + { + This->Append('0'); + if (aNumDecPlcs) + { + aExp=-aExp; + TInt nDig=aNumDecPlcs-aExp; // number of digits required from aDigBuf + This->Append(aFormat.iPoint); + if (aExp>aNumDecPlcs) + aExp=aNumDecPlcs; + This->AppendFill('0',aExp); + if (nDig>0) + { + for (TInt ii=1; iiAppend(TChar(iiDelete(0,2); // delete -0 from This + This->Append('0'); + } + } + } + else // aExp > 0 hence number is of the form NNNN.NNNN + { + for (TInt jj=1,ii=aExp; ii; ii--,jj++) + { + if (!doNotUseTriads && aFormat.iTriLen && aExp>(TInt)aFormat.iTriLen && !(ii%3) && ii!=aExp) + This->Append(aFormat.iTriad); + This->Append(TChar(jj>=aDigBuf.Length() ? '0' : aDigBuf[jj])); + } + if (aNumDecPlcs>0) + { + This->Append(aFormat.iPoint); + for (TInt ii=aExp+1; iiAppend(TChar(ii(TInt)aFormat.iTriLen))?(aExp-1)/3:0; + TInt maxDig=Min(aMaxSigFigs,afDigLimSize); + TInt maxSpace=numSpace-(aExp<=0?(2-aExp):((aExpnDig && nDig<15 && nDig>=0 && (flags & KNeedsRounding) && round(aDigBuf.Ptr()+1,nDig)) + aExp++; + + if (aDigBuf[0]=='0') // do zero first (numSpace>=0 so OK) + This->Append('0'); + else + { + // check for overflow/underflow + if ((aExp+nTriadSeps)>numSpace) + return(KErrOverflow); + if (nDig<=0) + return(KErrUnderflow); + + if ((flags&(TUint)KRealFormatTypesMask)!=(TUint)KRealFormatCalculator && aExp>aMaxSigFigs) + return(KErrOverflow); + + TInt nDecPlcs=nDig-aExp; + while(nDecPlcs>0 && aDigBuf[nDig]=='0') + { // discard trailing zeros (already done in calculator) + nDecPlcs--; + nDig--; + } + + if (aExp<=0) // hence number is of the form 0.NNNN + { + This->Append('0'); + aExp=-aExp; + // if (nDecPlcs<=0) do nothing + if (nDecPlcs>0) + { + This->Append(aFormat.iPoint); + This->AppendFill('0',aExp); + for (TInt ii=1; ii<=nDig; ii++) + This->Append(TChar(aDigBuf[ii])); + } + } + else // aExp > 0 hence number is of the form NNNN.NNNN + { + for (TInt jj=1,ii=aExp; ii; ii--,jj++) + { + if (!doNotUseTriads && aFormat.iTriLen && aExp>(TInt)aFormat.iTriLen && !(ii%3) && ii!=aExp) + This->Append(aFormat.iTriad); + This->Append(TChar(jj<=nDig ? aDigBuf[jj] : '0')); + } + if (nDecPlcs>0) + { + This->Append(aFormat.iPoint); + for (TInt ii=aExp+1; ii<=nDig; ii++) + This->Append(TChar(aDigBuf[ii])); + } + } + } + + return(KErrNone); + } + +LOCAL_C TInt doGeneral(TDes8 *This,TReal aSrc,TDes8 &aDigBuf,const TInt afDigLimSize,TInt aExp, + TInt aNumDecPlcs,const TInt aNumSpace,const TRealFormat &aFormat,TUint flags) __SOFTFP +// +// Convert the intermediate number represented in aDigBuf into either its fixed representation or +// its exponential representation as appropriate and place the result in aTrg +// +// Annw, November 1996 - changed to allow space for sign in fixed mode, three-figure exponent. + { + + TBool rounded=((flags & KNeedsRounding)==0); + TInt nDig=aDigBuf.Length()-1; // no of digits without sign + TInt type; + + // Set up tempNumSpace to allow for leaving one space free for +ve nos in fixed format + TInt fixedNumSpace=aNumSpace; + if ((flags & KExtraSpaceForSign) && (aDigBuf[0]!='-')) + fixedNumSpace--; + if (fixedNumSpace<=0) + return(KErrGeneral); + + FOREVER + { + // If aNumSpace < 5 cannot use exponential format, i.e. not enough space for XE+NN. + // If the exponent >= -3 (i.e. aExp >= -2), it is always more (or equally) efficient + // to use non-exponential format for negative exponents, i.e. XE-03 takes same no of + // spaces as 0.00X, and for positive exponents use fixed form as far as possible. + + // for Java do not used fixed format for exponents >=7 + // expMax=Min(fixedNumSpace,7) + // and replace "fixednumSpace" with "expMax" in next line + + if (aNumSpace<5 || (aExp>=-2 && aExp<=fixedNumSpace)) + { + type=KRealFormatFixed; + + // if there is at least one digit before decimal point or no. is zero + if (aExp>0 || !aSrc) + { + if (nDig!=aExp) + // nDig is the number of digits which will be used + // a decimal point needed if exponent < digits in digbuf and numspace < nDig, + // so nDig is one less than otherwise + nDig=((nDig-aExp)>0 && fixedNumSpace>aExp)?Min(fixedNumSpace-1,nDig):Min(fixedNumSpace,nDig); + aNumDecPlcs=nDig-aExp; + } + else + { + // need space for "0." and to avoid white spaces + aNumDecPlcs=Min(fixedNumSpace-2,nDig-aExp); + // need space for "0.0...0" before any digits used + nDig=aNumDecPlcs+aExp; + if (nDig<0) + return KErrGeneral; + } + } + else + { + type=KRealFormatExponent; // Do NOT use significant figures + // Need to allow space for exponent + TInt tempNumSpace=aNumSpace-4; // 4 = E+NN + if ((flags & KAllowThreeDigitExp) && (Abs(aExp-1)>=100)) + tempNumSpace--; // 5 = E+NNN + // if more than one digit available and enough digits to fill space, need to reduce + // number of digits to allow for '.' + if (((nDig=Min(tempNumSpace,nDig))>1) && nDig==tempNumSpace) + nDig--; + // in any case, aNumDecPlcs is one less that the number of digits, + // i.e. one digit before the point + aNumDecPlcs=nDig-1; + } + // if too many digbuf chars to fit then we need to round + // round() returns 1 if had to carry from msdigit + if ((afDigLimSize>nDig && !rounded) && ((rounded=round(aDigBuf.Ptr()+1,nDig))!=0)) + aExp++; + else + break; + } + while(aNumDecPlcs>0 && aDigBuf[nDig]=='0') + { // discard trailing zeros + aNumDecPlcs--; + nDig--; + } + flags=flags & ~KNeedsRounding; + + if (type==KRealFormatExponent) + return(doExponent(This,aDigBuf,afDigLimSize,aExp,aNumDecPlcs,aNumSpace,(TText)aFormat.iPoint,flags)); + return(doFixed(This,aDigBuf,afDigLimSize,aExp,aNumDecPlcs,aNumSpace,aFormat,flags)); + } + + LOCAL_C TInt doCalculator(TDes8 *This,TDes8 &aDigBuf,const TInt afDigLimSize,TInt aExp, + TInt aMaxSigFigs,const TInt aMaxSpace,const TRealFormat &aFormat, TUint flags) +// +// Added by AnnW, November 1996 +// Convert the intermediate number represented in aDigBuf into either its no exponent or its +// exponential representation with a fixed number of significant figures and place the result +// in aTrg +// + { + + TBool threeDigExp=((flags & KAllowThreeDigitExp)!=0); + + // first check that enough space has been allowed for all the possible characters + // point + sign + all sig figs + exponent + if (aMaxSpace<(2+aMaxSigFigs+(threeDigExp?5:4))) + return(KErrGeneral); + + // now discard trailing zeros + TInt nDig=afDigLimSize; + while(nDig>1 && aDigBuf[nDig]=='0') + { + nDig--; + } + + TInt maxDig=Min(aMaxSigFigs,nDig); // max digs available + TBool rounded=((flags & KNeedsRounding)==0); + TInt type; + TBool useNoExp; + + FOREVER + { + useNoExp=ETrue; + nDig=maxDig; + + // use no exponent for all numbers which will not use > aMaxSigFigs digits + if (aExp>aMaxSigFigs || (aExp<=0 && (1-aExp+nDig)>aMaxSigFigs)) + useNoExp=EFalse; + + if (useNoExp) + type=KRealFormatNoExponent; + else + { + type=KRealFormatExponent; + threeDigExp=((Abs(aExp-1)>=KMinThreeDigitExponent && threeDigExp)!=0); + TInt temp=aMaxSpace-(threeDigExp?5:4); + nDig=Min(maxDig,temp-((temp>1 && maxDig>1)?1:0)); + } + + // if too many digbuf chars to fit then we need to round + // round() returns 1 if had to carry from msdigit + if ((afDigLimSize>nDig && !rounded) && ((rounded=round(aDigBuf.Ptr()+1,nDig))!=0)) + { + aExp++; + maxDig=1; + } + else + break; + } + + TInt numSpace=aMaxSpace-(aDigBuf[0]=='-'?1:0); + flags=flags & ~KNeedsRounding; + + if (type==KRealFormatExponent) + return(doExponent(This,aDigBuf,afDigLimSize,aExp,nDig,numSpace,(TText)aFormat.iPoint,flags)); + else + { + flags|=KExtraSpaceForSign; + return(doNoExponent(This,aDigBuf,afDigLimSize,aExp,nDig,numSpace,aFormat,flags)); + } + } + +TInt ProcessErrors(TDes8* aDes, TInt anError) + { + if (anError==KErrNone) + return aDes->Length(); + if (anError==KErrUnderflow) + aDes->Append(TChar('0')); + if (anError==KErrOverflow) + aDes->Append(KLit8Inf()); + if (anError==KErrArgument) + aDes->Append(KLit8Nan()); + return anError; + } + +LOCAL_C TInt rtob(TDes8 *This,TReal aVal,const TRealFormat &aFormat) __SOFTFP +// +// Converts the real at aSrc. Returns the length of the converted string or an error number +// if the buffer is too small, the number is out of range or there is insufficient KMaxPrecision +// to represent the number. +// +// The conversion format is interpreted as follows: +// KRealFormatFixed - ndec decimal places (including zero), negative values with a leading minus +// sign, triad separators are available and a space may be left in front of positive numbers to +// allow negative positve numbers to be given to the same precision. +// KRealFormatExponent - exponent notation specifying either decimal places or significant +// figures in the mantissa and a signed exponent given to a maximum of two or three digits, +// and no triad separator. +// KTRealFormatGeneral - converts either as fixed or exponent to make best use of the available +// width. The number of decimal spaces is chosen automatically as a function of width +// (ndec is ignored), no triad. +// KRealFormatNoExponent - as KRealForamtFixed, but specifying maximum significant figures and +// not introducing trailing zeros. +// KRealFormatCalculator - as KRealFormatGeneral, but behaves as a conventional calculator. A +// maximum number of significant figures is specified and the number is displayed without an +// exponent whenever possible, with no trailing zeros and no triads. +// +// If an error value other than KErrGeneral is returned the real is converted to some string: +// "+/-Inf" if the error is KErrOverflow, "NaN" if the error is KErrArgument or "0" if it is +// KErrUnderflow. +// + { + if (aFormat.iWidth>This->MaxLength()) + return(KErrGeneral); + TBuf8<0x20> digbuf; + TInt exp=0; + TInt numspace=aFormat.iWidth; + TInt maxspace=numspace; + TInt ret=fDigLim(digbuf,aVal,exp,((aFormat.iType & KGeneralLimit)!=0)); + digbuf.ZeroTerminate(); + TInt type, flags; + + if (digbuf[0]=='0') + exp=0; + else + { + if (digbuf[0]=='-' && ret!=KErrArgument) // NaN has no sign + { + This->Append('-'); + numspace--; + } + if (ret<0) + return ProcessErrors(This, ret); + else + ret--; + } + + //Added by AnnW + if (numspace<=0) + return(KErrGeneral); + if (aFormat.iType & ~KRealFormatTypesMask & ~KRealFormatTypeFlagsMask) + return(KErrGeneral); + type=aFormat.iType & KRealFormatTypesMask; + flags=((aFormat.iType & KRealFormatTypeFlagsMask)| KNeedsRounding); + // end of added + + switch(type) + { + case KRealFormatFixed: + flags=flags & ~KUseSigFigs; // if flag is NOT set and iTriLen!=0, uses triads + ret=doFixed(This,digbuf,ret,exp,aFormat.iPlaces,numspace,aFormat,flags); + break; + case KRealFormatExponent: + ret=doExponent(This,digbuf,ret,exp,aFormat.iPlaces,numspace,(TText)aFormat.iPoint,flags); + break; + case KRealFormatGeneral: + flags=(flags & ~KUseSigFigs) | KDoNotUseTriads; + ret=doGeneral(This,aVal,digbuf,ret,exp,aFormat.iPlaces,numspace,aFormat,flags); + break; + case KRealFormatNoExponent: + flags=flags | KUseSigFigs; // if flag is NOT set and iTriLen!=0, uses triads + ret=doNoExponent(This,digbuf,ret,exp,aFormat.iPlaces,numspace,aFormat,flags); + break; + case KRealFormatCalculator: + flags=(flags | KUseSigFigs) | KDoNotUseTriads | KRealFormatCalculator; + ret=doCalculator(This,digbuf,ret,exp,aFormat.iPlaces,maxspace,aFormat,flags); + break; + default: + return(KErrGeneral); + } + return ProcessErrors(This, ret); + } + + + + +EXPORT_C TRealFormat::TRealFormat() +/** +Default constructor. + +The public data members of the constructed object are assigned +the following values: + +TRealFormat::iType - set to KRealFormatGeneral + +TRealFormat::iWidth - set to KDefaultRealWidth + +TRealFormat::iPlaces - set to 0 + +TRealFormat::iPoint - set to the decimal separator character defined in + a TLocale object and returned by the DecimalSeparator() + member function of that class. + +TRealFormat::iTriad - set to the character used to delimit groups of three + digits in the integer portion of a number; the character + is defined in a TLocale object and returned by the + ThousandsSeparator() member function of that class. + +TRealFormat::iTriLen - set to 1 + +@see TLocale::DecimalSeparator +@see TLocale::ThousandsSeparator +*/ + { + + iType=KRealFormatGeneral; + iWidth=KDefaultRealWidth; + iPlaces=0; + TLocale locale; + iPoint=locale.DecimalSeparator(); + iTriad=locale.ThousandsSeparator(); + iTriLen=1; + } + + + + +EXPORT_C TRealFormat::TRealFormat(TInt aWidth) +/** +Constructs the object taking the width of the character representation. + +The remaining public data members of the constructed object are assigned +the following values: + +TRealFormat::iType - set to KRealFormatGeneral + +TRealFormat::iWidth - set to the aWidth argument + +TRealFormat::iPlaces - set to 0 + +TRealFormat::iPoint - set to the decimal separator character defined in + a TLocale object and returned by the DecimalSeparator() + member function of that class. + +TRealFormat::iTriad - set to the character used to delimit groups of three + digits in the integer portion of a number; the character + is defined in a TLocale object and returned by the + ThousandsSeparator() member function of that class. + +TRealFormat::iTriLen - set to 1 + +@param aWidth The width of the character representation of the real number. + +@see TLocale::DecimalSeparator +@see TLocale::ThousandsSeparator +*/ + { + + iType=KRealFormatGeneral; + iWidth=aWidth; + iPlaces=0; + TLocale locale; + iPoint=locale.DecimalSeparator(); + iTriad=locale.ThousandsSeparator(); + iTriLen=1; + } + + + + +EXPORT_C TRealFormat::TRealFormat(TInt aWidth,TInt aDecimals) +/** +Constructs the object taking the width of the character representation +and a value which is interpreted as the number of digits to follow +the decimal point. + +The remaining public data members of the constructed object are assigned +the following values: + +TRealFormat::iType - set to KRealFormatFixed + +TRealFormat::iWidth - set to the aWidth argument + +TRealFormat::iPlaces - set to the aDecimals argument + +TRealFormat::iPoint - set to the decimal separator character defined in + a TLocale object and returned by the DecimalSeparator() + member function of that class. + +TRealFormat::iTriad - set to the character used to delimit groups of three + digits in the integer portion of a number; the character + is defined in a TLocale object and returned by the + ThousandsSeparator() member function of that class. + +TRealFormat::iTriLen - set to 1 + +Note that if the iType data member is changed after construction, aDecimalPlaces +may be interpreted as the number of significant digits. For more information, +see KRealFormatFixed and the other format types, and KExtraSpaceForSign and the +other format flags. + +@param aWidth The width of the character representation of the real number. +@param aDecimals The number of digits to follow the decimal point. + +@see TLocale::DecimalSeparator() +@see TLocale::ThousandsSeparator() +@see KRealFormatFixed +@see KExtraSpaceForSign +*/ + { + + iType=KRealFormatFixed; + iWidth=aWidth; + iPlaces=aDecimals; + TLocale locale; + iPoint=locale.DecimalSeparator(); + iTriad=locale.ThousandsSeparator(); + iTriLen=1; + } + + + + +EXPORT_C TInt Math::Round(TReal &aTrg,const TReal &aSrc,TInt aDecimalPlaces) +/** +Rounds to a specified number of decimal places. + +The function rounds a number to a given number, n, of decimal places. +Rounding may be thought of as multiplying the number by 10 to the power of n, +rounding to the nearest integer, and then dividing the result by 10 to +the power of n and returning that as the answer. + +In the process of rounding, numbers ending with .5 are rounded away from zero, +so that 1.5 becomes 2, 2.5 becomes 3, -1.5 becomes -2, etc. + +@param aTrg A reference containing the result. +@param aSrc The number to be rounded. +@param aDecimalPlaces The number of decimal places to round to: must be + zero or positive. + +@return KErrNone if successful, otherwise another of the system-wide error codes. +*/ + { + + if (aSrc==0.0) + { + aTrg=aSrc; + return(KErrNone); + } + TInt ret,exp; + TBuf8<0x20> rbuf; + if ((ret=fDigLim(rbuf,aSrc,exp,EFalse))<0) + return(ret); + if ((exp+aDecimalPlaces)<0) + { // Number too small to be rounded + aTrg=0; + return(KErrNone); + } + if ((ret-2)<(exp+aDecimalPlaces)) //ret is the string length, including prefixed +/- + { // Rounding will have no effect + aTrg=aSrc; + return(KErrNone); + } + if ((ret=round(rbuf.Ptr()+1,exp+aDecimalPlaces))!=KErrNone) + exp++; + rbuf.Insert(1,TPtrC8((TText8*)".",1)); + rbuf.SetLength(exp+aDecimalPlaces+2); + if (!(exp+aDecimalPlaces)) + rbuf.Append('0'); +// rbuf.AppendFormat(TPtrC8((TText8*)"%c%d",4),'E',exp); + rbuf.Append(TChar('E')); + rbuf.AppendNum(exp); + return(((TLex8)rbuf).Val(aTrg,(TChar)'.')); + } + +EXPORT_C TInt TDes8::Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP +/** +Converts the specified floating point number into a character representation +and copies the conversion into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The character representation of the real number is dictated by the specified +format. + +Note that the function leaves if the iType data member of the specified +TRealFormat object has both an invalid character representation format +(i.e. the format type) and invalid format flags. + +@param aVal The floating point number to be converted. +@param aFormat The format of the conversion. + +@return If the conversion is successful, the length of this descriptor. If + the conversion fails, a negative value indicating the cause of failure. + In addition, extra information on the cause of the failure may be + appended onto this descriptor. The possible values and their meaning + are: + + 1.KErrArgument - the supplied floating point number is not a valid + number. The three characters NaN are appended to this descriptor. + + 2.KErrOverflow - the number is too large to represent. + 2.1 For positive overflow, the three characters Inf are appended + to this descriptor. + 2.2 For negative overflow, the four characters -Inf are appended + to this descriptor. + + 3.KErrUnderflow - the number is too small to represent. + 3.1 For positive underflow, the three characters Inf are appended + to this descriptor. + 3.2 For negative underflow, the four characters -Inf are appended + to this descriptor. + + 4.KErrGeneral - the conversion cannot be completed. There are a + number of possible reasons for this, but the two most common + are: + 4.1 the maximum number of characters necessary to represent the number, + as defined in the TRealFormat object, is greater than the maximum + length of this descriptor + 4.2 the character representation format (i.e. the format type), as + defined in the TRealFormat object is not recognised. + +@see TRealFormat::iType +*/ + { + + Zero(); + return(rtob(this,aVal,aFormat)); + } + +EXPORT_C TInt TDes8::AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP +/** +Converts the specified floating point number into a character representation +and appends the conversion onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The character representation of the real number is dictated by the specified +format. + +@param aVal The floating point number to be converted. +@param aFormat The format of the conversion. + +@return If the conversion is successful, the length of this descriptor. If + the conversion fails, a negative value indicating the cause of failure. + In addition, extra information on the cause of the failure may be + appended onto this descriptor. The possible values and their meaning + are: + + 1.KErrArgument - the supplied floating point number is not a valid + number. The three characters NaN are appended to this descriptor. + + 2.KErrOverflow - the number is too large to represent. + 2.1 For positive overflow, the three characters Inf are appended + to this descriptor. + 2.2 For negative overflow, the four characters -Inf are appended + to this descriptor. + + 3.KErrUnderflow - the number is too small to represent. + 3.1 For positive underflow, the three characters Inf are appended + to this descriptor. + 3.2 For negative underflow, the four characters -Inf are appended + to this descriptor. + + 4.KErrGeneral - the conversion cannot be completed. There are a + number of possible reasons for this, but the two most common + are: + 4.1 the maximum number of characters necessary to represent the number, + as defined in the TRealFormat object, is greater than the maximum + length of this descriptor + 4.2 the character representation format (i.e. the format type), as + defined in the TRealFormat object is not recognised +*/ + { + + return(rtob(this,aVal,aFormat)); + } + +EXPORT_C TInt TDes16::Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP +/** +Converts the specified floating point number into a character representation +and copies the conversion into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +The character representation of the real number is dictated by the specified +format. + +Note that the function leaves if the iType data member of the specified +TRealFormat object has both an invalid character representation format +(i.e. the format type) and invalid format flags. + +@param aVal The floating point number to be converted. +@param aFormat The format of the conversion. + +@return If the conversion is successful, the length of this descriptor. If + the conversion fails, a negative value indicating the cause of failure. + In addition, extra information on the cause of the failure may be + appended onto this descriptor. The possible values and their meaning + are: + + 1.KErrArgument - the supplied floating point number is not a valid + number. The three characters NaN are appended to this descriptor. + + 2.KErrOverflow - the number is too large to represent. + 2.1 For positive overflow, the three characters Inf are appended + to this descriptor. + 2.2 For negative overflow, the four characters -Inf are appended + to this descriptor. + + 3.KErrUnderflow - the number is too small to represent. + 3.1 For positive underflow, the three characters Inf are appended + to this descriptor. + 3.2 For negative underflow, the four characters -Inf are appended + to this descriptor. + + 4.KErrGeneral - the conversion cannot be completed. There are a + number of possible reasons for this, but the two most common + are: + 4.1 the maximum number of characters necessary to represent the number, + as defined in the TRealFormat object, is greater than the maximum + length of this descriptor + 4.2 the character representation format (i.e. the format type), as + defined in the TRealFormat object is not recognised. + +@see TRealFormat::iType +*/ + { + + Zero(); + return (AppendNum(aVal,aFormat)); + } + +EXPORT_C TInt TDes16::AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP +/** +Converts the specified floating point number into a character representation +and appends the conversion onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The character representation of the real number is dictated by the specified +format. + +@param aVal The floating point number to be converted. +@param aFormat The format of the conversion. + +@return If the conversion is successful, the length of this descriptor. If + the conversion fails, a negative value indicating the cause of failure. + In addition, extra information on the cause of the failure may be + appended onto this descriptor. The possible values and their meaning + are: + + 1.KErrArgument - the supplied floating point number is not a valid + number. The three characters NaN are appended to this descriptor. + + 2.KErrOverflow - the number is too large to represent. + 2.1 For positive overflow, the three characters Inf are appended + to this descriptor. + 2.2 For negative overflow, the four characters -Inf are appended + to this descriptor. + + 3.KErrUnderflow - the number is too small to represent. + 3.1 For positive underflow, the three characters Inf are appended + to this descriptor. + 3.2 For negative underflow, the four characters -Inf are appended + to this descriptor. + + 4.KErrGeneral - the conversion cannot be completed. There are a + number of possible reasons for this, but the two most common + are: + 4.1 the maximum number of characters necessary to represent the number, + as defined in the TRealFormat object, is greater than the maximum + length of this descriptor + 4.2 the character representation format (i.e. the format type), as + defined in the TRealFormat object is not recognised +*/ + { + + HBufC8 *temp=HBufC8::New(MaxLength()); + if (temp==NULL) + return(KErrNoMemory); + TPtr8 p(temp->Des()); + TInt ret=rtob(&p,aVal,aFormat); + const TText8 *pTemp=temp->Ptr(); + for (TInt ii=temp->Length();ii>0;ii--) + Append(*pTemp++); + if (ret>0) + ret=Length(); + User::Free(temp); + return (ret); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_sin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_sin.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,190 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_sin.cpp +// Floating point sine and cosine functions +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + + +#ifndef __USE_VFP_MATH + +LOCAL_D const TUint32 SinCoeffs[] = + { + 0x2168C235,0xC90FDAA2,0x80000000, // polynomial approximation to sin(pi*x) + 0x2DF200BF,0xA55DE731,0x80010001, // for |x| <= 0.25 + 0xAC273AA1,0xA335E33B,0x80000000, + 0x5AB23F44,0x99696671,0x7FFE0001, + 0xD585EAFE,0xA83C17D9,0x7FFB0000, + 0xA30DE7AD,0xF1802BAC,0x7FF70001, + 0xF57FD821,0xF1F6A1C9,0x7FF30000 + }; + +LOCAL_D const TUint32 CosCoeffs[] = + { + 0x00000000,0x80000000,0x7FFF0000, // polynomial approximation to cos(pi*x) + 0xF22EF286,0x9DE9E64D,0x80010001, // for |x| <= 0.25 + 0xDAD59F90,0x81E0F840,0x80010000, + 0xE4E45144,0xAAE9E3F1,0x7FFF0001, + 0x3232D733,0xF0FA8342,0x7FFC0000, + 0x03E16BB8,0xD368F6A3,0x7FF90001, + 0x712FD084,0xFCE66DE2,0x7FF50000, + 0x9E5353EE,0xD94951B0,0x7FF10001 + }; + +LOCAL_D const TUint32 PiInvdata[] = {0x4E44152A,0xA2F9836E,0x7FFD0000}; // 1/pi +LOCAL_D const TUint32 Halfdata[] = {0x00000000,0x80000000,0x7FFE0000}; // 0.5 +LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000}; // 1.0 + +LOCAL_C TInt CalcSinCos(TReal& aTrg, TRealX& aSrc, TBool aCos) + { + // Calculate sin(aSrc) if aCos=false or cos(aSrc) if aCos=true + // and write result to aTrg. + // Algorithm: + // Divide aSrc by pi and throw away integer part, but change sign + // of result if integer part odd. Replace aSrc with remainder. + // ( use identities sin(x+n*pi)=(-1)^n*sin(x) + // cos(x+n*pi)=(-1)^n*cos(x) ) + // If aSrc>=0.5 replace aSrc with 1-aSrc, and change sign of result + // if cos required. + // ( use identities sin(pi-x)=sin(x), cos(pi-x)=-cos(x) ) + // If aSrc>=0.25 replace aSrc with 0.5-aSrc and swap sin and cos + // ( use identities sin(pi/2-x)=cos(x), cos(pi/2-x)=sin(x) ) + // Use polynomial approximation to evaluate sin(pi*x) or cos(pi*x) + // for |x|<=0.25 + + const TRealX& One = *(const TRealX*)Onedata; + const TRealX& Half = *(const TRealX*)Halfdata; + const TRealX& PiInv = *(const TRealX*)PiInvdata; + + TRealX y; + aSrc*=PiInv; + TInt n=(TInt)aSrc; + if (nKMinTInt) + { + aSrc-=TRealX(n); + TInt sign=0; + if (!aCos) + sign=aSrc.iSign & 1; + sign^=n; + aSrc.iSign=0; + if (aSrc.iExp>=0x7FFE) // if remainder>=pi/2 + { + aSrc=One-aSrc; + if (aCos) + sign^=1; + } + if (aSrc.iExp>=0x7FFD) // if remainder>=pi/4 + { + aSrc=Half-aSrc; // take complementary angle + aCos=!aCos; // and swap sin and cos + } + if (aCos) + Math::PolyX(y,aSrc*aSrc,7,(const TRealX*)CosCoeffs); + else + { + Math::PolyX(y,aSrc*aSrc,6,(const TRealX*)SinCoeffs); + y*=aSrc; + } + if (sign & 1) + y=-y; + return y.GetTReal(aTrg); + } + return KErrArgument; + } + + + + +EXPORT_C TInt Math::Sin(TReal& aTrg, const TReal& aSrc) +/** +Calculates the sine of a number. + +@param aTrg A reference containing the result. +@param aSrc The argument of the sin function in radians. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + TRealX x; + TInt r=x.Set(aSrc); + if (r==KErrNone) + r=CalcSinCos(aTrg,x,EFalse); + if (r==KErrNone) + return r; + SetNaN(aTrg); + return KErrArgument; + } + + + + +EXPORT_C TInt Math::Cos(TReal& aTrg, const TReal& aSrc) +/** +Calculates the cosine of a number. + +@param aTrg A reference containing the result. +@param aSrc The argument of the cos function in radians + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + TRealX x; + TInt r=x.Set(aSrc); + if (r==KErrNone) + r=CalcSinCos(aTrg,x,ETrue); + if (r==KErrNone) + return r; + SetNaN(aTrg); + return KErrArgument; + } + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal sin(TReal); +extern "C" TReal cos(TReal); + +EXPORT_C TInt Math::Sin(TReal& aTrg, const TReal& aSrc) + { + if (aSrcKMinTInt) + { + aTrg = sin(aSrc); + if (Math::IsFinite(aTrg)) + return KErrNone; + } + SetNaN(aTrg); + return KErrArgument; + } + +EXPORT_C TInt Math::Cos(TReal& aTrg, const TReal& aSrc) + { + if (aSrcKMinTInt) + { + aTrg = cos(aSrc); + if (Math::IsFinite(aTrg)) + return KErrNone; + } + SetNaN(aTrg); + return KErrArgument; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_spec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_spec.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,159 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_spec.cpp +// Functions to check for and set special values +// +// +// + + +#include "um_std.h" + + + + +#ifndef __REALS_MACHINE_CODED__ +EXPORT_C TBool Math::IsZero(const TReal &aVal) +/** +Determines whether a value is zero. + +@param aVal A reference to the value to be checked. + +@return True, if aVal is zero; false, otherwise. +*/ + { + + SReal64 *pS=(SReal64 *)&aVal; + + if (pS->msm==0U && pS->lsm==0U && pS->exp==(unsigned)KTReal64ZeroExponent) + return TRUE; + else + return FALSE; + } + + + + +EXPORT_C TBool Math::IsNaN(const TReal &aVal) +/** +Determines whether a value is not a number. + +@param aVal A reference to the value to be checked. + +@return True, if aVal is not a number; false, otherwise. +*/ + { + + SReal64 *pS=(SReal64 *)&aVal; + + if (pS->exp==(unsigned)KTReal64SpecialExponent && (pS->msm|pS->lsm)!= 0U) + return TRUE; + else + return FALSE; + } + + + + +EXPORT_C TBool Math::IsInfinite(const TReal &aVal) +/** +Determines whether a value is infinite. + +@param aVal A reference to the value to be checked. + +@return True, if aVal is infinite; false, otherwise. +*/ + { + + SReal64 *pS=(SReal64 *)&aVal; + + if (pS->msm==0U && pS->lsm==0U && pS->exp==(unsigned)KTReal64SpecialExponent) + return TRUE; + else + return FALSE; + } + + + + +EXPORT_C TBool Math::IsFinite(const TReal &aVal) +/** +Determines whether a value is finite. + +In this context, a value is finite if it is a valid number and +is not infinite. + +@param aVal A reference to the value to be checked. + +@return True, if aVal is finite; false, otherwise. +*/ + { + + SReal64 *pS=(SReal64 *)&aVal; + + if (pS->exp!=(unsigned)KTReal64SpecialExponent) + return TRUE; + else + return FALSE; + } + + + + +EXPORT_C void Math::SetZero(TReal &aVal,TInt aSign) +// +// Constructs zeros, assuming default sign is positive +// + { + + SReal64 *pS=(SReal64 *)&aVal; + pS->sign=aSign; + pS->exp=KTReal64ZeroExponent; + pS->msm=0; + pS->lsm=0; + } + + + + +EXPORT_C void Math::SetNaN(TReal &aVal) +// +// Constructs NaN (+ve sign for Java) +// + { + + SReal64 *pS=(SReal64 *)&aVal; + pS->sign=0; + pS->exp=KTReal64SpecialExponent; + pS->msm=0xfffffu; + pS->lsm=0xffffffffu; + } + + + + +EXPORT_C void Math::SetInfinite(TReal &aVal,TInt aSign) +// +// Constructs infinities +// + { + + SReal64 *pS=(SReal64 *)&aVal; + pS->sign=aSign; + pS->exp=KTReal64SpecialExponent; + pS->msm=0; + pS->lsm=0; + } +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_sqrt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_sqrt.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,90 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_sqrt.cpp +// Square root. +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + + +#ifndef __USE_VFP_MATH + +#ifndef __REALS_MACHINE_CODED__ +LOCAL_D const TUint32 KConstAdata[] = {0x00000000,0xD5A9A805,0x7FFD0000}; +LOCAL_D const TUint32 KConstBdata[] = {0x00000000,0x9714B9CB,0x7FFE0000}; +LOCAL_D const TUint32 Sqr2Invdata[] = {0xF9DE6484,0xB504F333,0x7FFE0000}; // 1/sqr2 + + + + +EXPORT_C TInt Math::Sqrt(TReal& aTrg,const TReal &aSrc) +/** +Calculates the square root of a number. + +@param aTrg A reference containing the result. +@param aSrc The number whose square-root is required. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ +// +// Fast sqrt routine. See Software manual by W.J.Cody & W.Waite Chapter 4. +// + { + const TRealX& KConstA=*(const TRealX*)KConstAdata; + const TRealX& KConstB=*(const TRealX*)KConstBdata; + const TRealX& Sqr2Inv=*(const TRealX*)Sqr2Invdata; + + TRealX x; + TInt r=x.Set(aSrc); + if (x.IsZero()) + { + aTrg=aSrc; + return(KErrNone); + } + if (r==KErrArgument || x.iSign&1) + { + SetNaN(aTrg); + return(KErrArgument); + } + if (r==KErrOverflow) // positive infinity + { + aTrg=aSrc; + return(r); + } + TInt n=x.iExp-0x7FFE; + x.iExp=0x7FFE; + TRealX y=KConstB*x+KConstA; + y=y+(x/y); + y.iExp--; + y=y+(x/y); + y.iExp--; + y=y+(x/y); + y.iExp--; + if (n&1) + { + y*=Sqr2Inv; + n++; + } + y.iExp=TUint16(TInt(y.iExp)+(n>>1)); + return y.GetTReal(aTrg); + } +#endif + +#endif // !__USE_VFP_MATH - VFP version is in assembler diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_std.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_std.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,60 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_std.h +// +// + +#include +#include +#include + +struct SReal32 + { + unsigned man:23; + unsigned exp:8; + unsigned sign:1; + }; + +#if defined(__DOUBLE_WORDS_SWAPPED__) +struct SReal64 + { + unsigned msm:20; + unsigned exp:11; + unsigned sign:1; + TUint lsm; + }; +#define DVAL(m0,m1,m2,m3,e) {(TUint)((m0<<16)|m1),e+KExponentBias,0,(TUint)((m2<<16)|m3)} +#else +struct SReal64 + { + TUint lsm; + unsigned msm:20; + unsigned exp:11; + unsigned sign:1; + }; +#define DVAL(m0,m1,m2,m3,e) {(TUint)((m2<<16)|m3),(TUint)((m0<<16)|m1),e+KExponentBias,0} +#endif + +enum TMathPanic + { + EMathDivideByZero, + EMathOverflow, + EMathUnderflow, + EMathBadOperand, + EMathUnknownError, + EMathUnexpectedError1 + }; + +GLREF_C void Panic(TMathPanic aPanic); + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_tan.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_tan.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,132 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_tan.cpp +// Tangent. +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + + +#ifndef __USE_VFP_MATH + +LOCAL_D const TUint32 TanCoeffs[] = + { + 0x2168C235,0xC90FDAA2,0x7FFF0000, // polynomial approximation to tan((pi/2)*x) + 0x2DF4707D,0xA55DE731,0x7FFF0000, // for |x|<=0.25 + 0xA9A1A71A,0xA335E33B,0x7FFF0000, + 0x0BB9E431,0xA2FFFCDD,0x7FFF0000, + 0x3E523A39,0xA2FA3863,0x7FFF0000, + 0x8A35C401,0xA2F9D38B,0x7FFF0000, + 0x91269411,0xA2F16003,0x7FFF0000, + 0xDA32CC78,0xA3A93B13,0x7FFF0000, + 0x4FB88317,0x9A146197,0x7FFF0000, + 0x0D787ECE,0xE131DEE5,0x7FFF0000 + }; + +LOCAL_D const TUint32 Onedata[] = {0x00000000,0x80000000,0x7FFF0000}; // 1.0 +LOCAL_D const TUint32 Halfdata[] = {0x00000000,0x80000000,0x7FFE0000}; // 0.5 +LOCAL_D const TUint32 PiBy2Invdata[] = {0x4E44152A,0xA2F9836E,0x7FFE0000}; // 2/pi + + + + +EXPORT_C TInt Math::Tan(TReal& aTrg, const TReal& aSrc) +/** +Calculates the tangent of a number. + +@param aTrg A reference containing the result. +@param aSrc The argument of the tan function in radians. + +@return KErrNone if successful, otherwise another of + the system-wide error codes. +*/ + { + // Calculate tan(aSrc) and write result to aTrg. + // Algorithm: + // Let x=aSrc/(pi/2). Throw away integer part, but if integer part odd + // then replace final result y with -1/y + // ( use identities tan(x+n*pi)=tan(x), tan(x+pi/2)=-1/tan(x) ) + // Replace x with fractional part after division. + // If x>=0.5, replace x with 1-x and replace result y with 1/y + // ( use identity tan(pi/2-x)=1/tan(x) ) + // If x>=0.25, replace x with 0.5-x and replace result y with (1-y)/(1+y) + // ( use identity tan(pi/4-x)=(1-tan(x))/(1+tan(x)) ) + // Use polynomial approximation to calculate tan(pi*x/2) for |x|<=0.25 + + const TRealX& One = *(const TRealX*)Onedata; + const TRealX& Half = *(const TRealX*)Halfdata; + const TRealX& PiBy2Inv = *(const TRealX*)PiBy2Invdata; + + TRealX x; + TInt r=x.Set(aSrc); + if (r==KErrNone) + { + TInt8 sign=x.iSign; + x.iSign=0; + x*=PiBy2Inv; + TInt n=(TInt)x; + if (nKMinTInt) + { + TInt flags=(n&1)<<1; + x-=TRealX(n); + if (x.iExp>=0x7FFE) + { + x=One-x; + flags^=2; + } + if (x.iExp>=0x7FFD) + { + x=Half-x; + flags^=1; + } + TRealX y; + PolyX(y,x*x,9,(const TRealX*)TanCoeffs); + y*=x; + if (flags==3) + y=(One+y)/(One-y); + else if (flags==2) + y=One/y; + else if (flags==1) + y=(One-y)/(One+y); + y.iSign=TInt8(sign ^ (n&1)); + return y.GetTReal(aTrg); + } + } + SetNaN(aTrg); + return KErrArgument; + } + +#else // __USE_VFP_MATH + +// definitions come from RVCT math library +extern "C" TReal tan(TReal); + +EXPORT_C TInt Math::Tan(TReal& aTrg, const TReal& aSrc) + { + if (aSrcKMinTInt) + { + aTrg = tan(aSrc); + if (Math::IsFinite(aTrg)) + return KErrNone; + } + SetNaN(aTrg); + return KErrArgument; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/maths/um_utl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/maths/um_utl.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,110 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\maths\um_utl.cpp +// +// + +#include "um_std.h" + +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP) +#error __USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh +#endif + +GLDEF_C void Panic(TMathPanic aPanic) +// +// Panic the process with USER-Math as the category. +// + { + + User::Panic(_L("USER-Math"),aPanic); + } + + + +#ifdef __USE_VFP_MATH +extern "C" void __set_errno(TInt errno) + { + // Do nothing, we don't have an errno to set as we use + // return values instead - return values are recosntructed + // from the results/inputs, not from this + } + +extern "C" IMPORT_C TReal __ARM_scalbn(TReal,TInt); +extern "C" TReal scalbn(TReal x,TInt n) + { + return __ARM_scalbn(x,n); + } +#endif + + + +#ifndef __REALS_MACHINE_CODED__ +EXPORT_C TReal Math::Poly(TReal aX,const SPoly *aPoly) +/** +Evaluates the polynomial: +{a[n]X^n + a[n-1]X^(n-1) + ... + a[2]X^2 + a[1]X^1 + a[0]}. + + +@param aX The value of the x-variable +@param aPoly A pointer to the structure containing the set of coefficients + in the order: a[0], a[1], ..., a[n-1], a[n]. + +@return The result of the evaluation. +*/ +// +// Evaluate a power series in x for a P_POLY coefficient table. +// Changed to use TRealX throughout the calculation +// + { + + const TReal *pR=(&aPoly->c[aPoly->num-1]); + TRealX r(*pR); + TRealX x(aX); + while (pR>&aPoly->c[0]) + { + r*=x; + r+=*--pR; + } + return(TReal(r)); + } + + + + +EXPORT_C void Math::PolyX(TRealX& aY, const TRealX& aX, TInt aDegree, const TRealX *aCoeff) +/** +Evaluates the polynomial: +{a[n]X^n + a[n-1]X^(n-1) + ... + a[2]X^2 + a[1]X^1 + a[0]}. + +@param aY A reference containing the result. +@param aX The value of the x-variable. +@param aDegree The degree of the polynomial (the highest power of x + which is present). +@param aCoeff A pointer to a contiguous set of TRealX values containing + the coefficients. + They must be in the order: a[0], a[1], ..., a[n-1], a[n]. +*/ + { + // Evaluate a polynomial with TRealX argument and TRealX coefficients. + // Return a TRealX result. + + const TRealX *pC=aCoeff+aDegree; + aY=*pC; + while(aDegree--) + { + aY*=aX; + aY+=*--pC; + } + } +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/collate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/collate.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1103 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// The Unicode collation system. +// +// + +#include "collateimp.h" +#include "foldtable.inl" + +#include +#include +#include "u32std.h" + +// maximum size of string which has its own sort key +static const TInt KKeyedStringBufferSize = 8; + +// Creates a one or two collation keys sequence corresponding to the input character. +// Returns the number of keys output. +static TInt CreateDefaultCollationKeySequence(TInt aChar, TCollationKey* aBuffer) + { + if (aChar >= 0x3400 && aChar <= 0x9FFF) // CJK + { + aBuffer[0].iLow = (TUint32)aChar << 16 | 0x0105; + aBuffer[0].iHigh = aChar; + return 1;//Collation key sequence consists of 1 key + } + aBuffer[0].iLow = 0xFF800000 | ((aChar << 1) & 0x3F0000) | 0x0104; // no stop bit + aBuffer[0].iHigh = 1; + aBuffer[1].iLow = (aChar << 16) | 0x80000105; // stop bit + aBuffer[1].iHigh = 0; + return 2;//Collation key sequence consists of 2 keys + } + +// Finds a character's key in the main index, or returns -1 if it is not there +static TInt FindCollationKeyIndex(TInt aChar, const TCollationKeyTable& aTable) + { + TInt n = aTable.iIndices; + const TUint32 *base = aTable.iIndex; + const TUint32 *p = base; + + while (n > 0) + { + TInt pivot = n / 2; + p += pivot; + TInt c = *p >> 16; + if (aChar == c) // found it + return *p & 0xFFFF; + if (aChar < c) // it's before + n = pivot; + else // it's after + { + base = p + 1; + n -= pivot + 1; + } + p = base; + } + return -1; + } + +static void ProcessKeys(TUint32& aKey1, TUint32& aKey2, TUint aFlags) + { + if (aFlags & TCollationMethod::EFoldCase) + { + static const TUint case_fold_table[21] = + { 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x2, 0x3, 0x4, 0x5, 0x6, + 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14 }; + aKey1 = case_fold_table[aKey1]; + aKey2 = case_fold_table[aKey2]; + } + if (aFlags & TCollationMethod::ESwapCase) + { + static const TUint case_swap_table[21] = + { 0, 0x1, 0x8, 0x9, 0xA, 0xB, 0xC, 0x7, 0x2, 0x3, 0x4, 0x5, 0x6, + 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14 }; + aKey1 = case_swap_table[aKey1]; + aKey2 = case_swap_table[aKey2]; + } + if (aFlags & TCollationMethod::ESwapKana) + { + static const TUint kana_swap_table[21] = + { 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, + 0x13, 0x14, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12 }; + aKey1 = kana_swap_table[aKey1]; + aKey2 = kana_swap_table[aKey2]; + } + } + +// Returns the position of the character in the string, or aLength if it is not present. +// If aChar is found but it is preceded by aEscapeChar (aEscapeChar != 0), then the search continues. +static TInt FindCharacter(TInt aChar, TInt aEscapeChar, const TUint16* aString, TInt aLength) + { + TBool isEscaped = EFalse; + for(TInt pos=0;pos!=aLength;++pos,++aString) + { + if(isEscaped) + { + isEscaped = EFalse; + } + else if(*aString == aEscapeChar) + { + isEscaped = ETrue; + } + else if(*aString == aChar) + { + if(!isEscaped) + { + return pos; + } + } + } + return aLength; + } + +/* +The standard collation data, containing keys for all the WGL4 characters, plus +commonly-used control characters and spaces. Generated by COLTAB. +*/ +static const TUint32 TheKey[] = + { + 0x21e0112,0x21e0113,0x2260112,0x2260112,0x2260113,0x2740112,0x2740113,0x6c60178, + 0x266017a,0x6c70179,0x6c60178,0x266017a,0x6c90179,0x6c60178,0x266017a,0x6cd0179, + 0x6c80178,0x266017a,0x6c90179,0x6c80178,0x266017a,0x6cd0179,0x6ca0178,0x266017a, + 0x6cd0179,0x6cc0178,0x266017a,0x6cd0179,0x6f70110,0x2650112,0x8050111,0x74b0110, + 0x78d0111,0x74b0110,0x7bd0111,0x78d0110,0x7a10111,0x78d0128,0x7a10129,0x7bd0110, + 0x2290113,0x7bd0128,0x2290113,0x7ed0128,0x8050111,0x805dd10,0x71f0111,0x805dd28, + 0x71f0129,0x85ddd10,0x85d0111,0x8750150,0x7e50151,0x9060110,0x7ed0111,0x3, + 0x201010b,0x202010b,0x203010b,0x204010b,0x205010b,0x206010b,0x207010b,0x208010b, + 0x209010b,0x2090113,0x209016f,0x209020b,0x209130b,0x209160b,0x209180b,0x2091d0b, + 0x209240b,0x209280b,0x2092a0b,0x2092f0b,0x209330b,0x209360b,0x209390b,0x2093b0b, + 0x2093f0b,0x2096b0b,0x20b010b,0x20c010b,0x20d010b,0x20d016f,0x20e010b,0x20f010b, + 0x210010b,0x211010b,0x214010b,0x21a010b,0x21c010b,0x21e010b,0x21f010b,0x221010b, + 0x222010b,0x226010b,0x229010b,0x22d010b,0x22e010b,0x22f010b,0x230010b,0x231010b, + 0x232010b,0x233010b,0x234010b,0x235010b,0x236010b,0x237010b,0x23c010b,0x23d010b, + 0x23e010b,0x23f010b,0x240010b,0x241010b,0x242010b,0x243010b,0x25e010b,0x25f010b, + 0x260010b,0x261010b,0x262010b,0x263010b,0x265010b,0x266010b,0x267010b,0x268010b, + 0x269010b,0x26a010b,0x26c010b,0x26e010b,0x26f010b,0x270010b,0x274010b,0x2ac010b, + 0x2ad010b,0x2af010b,0x2d6010b,0x2ff010b,0x300010b,0x301010b,0x302010b,0x303010b, + 0x304010b,0x317010b,0x35c010b,0x35f010b,0x366010b,0x368010b,0x369010b,0x36a010b, + 0x36b010b,0x36c010b,0x36d010b,0x36e010b,0x36f010b,0x370010b,0x371010b,0x372010b, + 0x374010b,0x375010b,0x378010b,0x37c010b,0x37d010b,0x381010b,0x382010b,0x38a010b, + 0x38c010b,0x3a2010b,0x3b9010b,0x3bb010b,0x3bc010b,0x42f010b,0x43d010b,0x44d010b, + 0x44e010b,0x4d6010b,0x4d8010b,0x4e2010b,0x4e6010b,0x4ea010b,0x4ee010b,0x4f2010b, + 0x4fa010b,0x502010b,0x50a010b,0x512010b,0x526010b,0x527010b,0x528010b,0x529010b, + 0x52a010b,0x52b010b,0x52c010b,0x52d010b,0x52e010b,0x52f010b,0x530010b,0x531010b, + 0x532010b,0x533010b,0x534010b,0x535010b,0x536010b,0x537010b,0x538010b,0x539010b, + 0x53a010b,0x53b010b,0x53c010b,0x53d010b,0x53e010b,0x53f010b,0x540010b,0x541010b, + 0x542010b,0x556010b,0x55a010b,0x55e010b,0x562010b,0x566010b,0x567010b,0x568010b, + 0x569010b,0x56c010b,0x56d010b,0x576010b,0x577010b,0x578010b,0x57e010b,0x586010b, + 0x588010b,0x590010b,0x596010b,0x597010b,0x59b010b,0x5a4010b,0x5a5010b,0x5b2010b, + 0x5f0010b,0x5f1010b,0x5f2010b,0x5f6010b,0x5f8010b,0x616010b,0x619010b,0x61b010b, + 0x61c010b,0x620010b,0x621010b,0x6b4010b,0x6b5010b,0x1309,0x1609,0x1809, + 0x1d09,0x2209,0x2409,0x2809,0x2f09,0x3009,0x3309,0x3609, + 0x3909,0x3b09,0x4109,0x2c20109,0x2c30109,0x2c40109,0x2c50109,0x2c60109, + 0x2cd0109,0x2ce0109,0x2d10109,0x2d50109,0x2fa0109,0x6c50109,0x6c60109,0x6c60151, + 0x6c70109,0x6c70151,0x6c80109,0x6c80151,0x6c90109,0x6ca0109,0x6cb0109,0x6cc0109, + 0x6cd0109,0x6ce0109,0x6cf0109,0x6cf0121,0x6cf0151,0x6d30109,0x6d30121,0x6e30109, + 0x6e30121,0x6f70109,0x6f70121,0x7030109,0x7030121,0x7070109,0x7070121,0x7170109, + 0x7170121,0x71f0109,0x71f0121,0x74b0109,0x74b0121,0x74f0109,0x7530109,0x7530121, + 0x7730109,0x7730121,0x77f0109,0x77f0121,0x78d0109,0x78d0121,0x7910109,0x7a10109, + 0x7a10121,0x7b10109,0x7b10121,0x7bd0109,0x7bd0115,0x7bd0121,0x7c50109,0x7c50121, + 0x7e50109,0x7e50121,0x7ed0109,0x7ed0121,0x7ed0151,0x8010109,0x8010121,0x8050109, + 0x8050121,0x8050151,0x80d0109,0x80d0121,0x81d0109,0x81d0121,0x8290109,0x8290121, + 0x8310109,0x8350109,0x8350121,0x85d0109,0x85d0121,0x85dde11,0x8750109,0x8750121, + 0x8790109,0x8790121,0x88d0109,0x88d0121,0x8a50109,0x8a50121,0x8b10109,0x8b10121, + 0x8b90109,0x8b90121,0x8bd0109,0x8bd0121,0x8c90109,0x8c90121,0x8e90109,0x8e90121, + 0x9360109,0x9360121,0x9370109,0x9370121,0x9380109,0x9380121,0x9390109,0x9390121, + 0x93a0109,0x93a0121,0x93d0109,0x93d0121,0x93e0109,0x93e0121,0x93f0109,0x93f0121, + 0x9400109,0x9400121,0x9420109,0x9420121,0x9430109,0x9430121,0x9440109,0x9440111, + 0x9440121,0x9450109,0x9450121,0x9460109,0x9460121,0x9470109,0x9470121,0x9480109, + 0x9480121,0x94a0109,0x94a0121,0x94b0109,0x94b0121,0x94c0109,0x94c0121,0x94d0109, + 0x94d0121,0x94e0109,0x94e0121,0x94f0109,0x94f0121,0x9500109,0x9500121,0x9510109, + 0x9510121,0x95a0109,0x95a0121,0x9660109,0x9660121,0x96a0109,0x96a0121,0x96e0109, + 0x96e0121,0x9720109,0x9720121,0x97e0109,0x97e0121,0x9820109,0x9820121,0x98a0109, + 0x98a0121,0x98e0109,0x98e0121,0x9920109,0x9920121,0x99a0109,0x99a0121,0x99e0109, + 0x99e0121,0x9a60109,0x9a60121,0x9aa0109,0x9aa0121,0x9ae0109,0x9ae0121,0x9b20109, + 0x9b20121,0x9ca0109,0x9ca0121,0x9ce0109,0x9ce0121,0x9d20109,0x9d20121,0x9d60109, + 0x9d60121,0x9e60109,0x9e60121,0x9ea0109,0x9ea0121,0x9f20109,0x9f20121,0x9fe0109, + 0x9fe0121,0xa020109,0xa020121,0xa0a0109,0xa0a0121,0xa120109,0xa120121,0xa160109, + 0xa160121,0xa260109,0xa260121,0xa2a0109,0xa2a0121,0xa460109,0xa460121,0xa4e0109, + 0xa4e0121,0xa660109,0xa660121,0xa6a0109,0xa6a0121,0xa6e0109,0xa6e0121,0xa720109, + 0xa720121,0xa760109,0xa760121,0xa7a0109,0xa7a0121,0xa820109,0xa820121,0xa860109, + 0xa860121,0xa8a0109,0xa8a0121, + }; + +static const TUint32 TheIndex[] = + { + 0x37,0x10037,0x20037,0x30037,0x40037,0x50037,0x60037,0x70037, + 0x80037,0x90038,0xa0039,0xb003a,0xc003b,0xd003c,0xe0037,0xf0037, + 0x100037,0x110037,0x120037,0x130037,0x140037,0x150037,0x160037,0x170037, + 0x180037,0x190037,0x1a0037,0x1b0037,0x1c0037,0x1d0037,0x1e0037,0x1f0037, + 0x200040,0x21005d,0x22006a,0x230080,0x24010d,0x250081,0x26007f,0x270063, + 0x280070,0x290071,0x2a007b,0x2b0096,0x2c005a,0x2d0053,0x2e0061,0x2f007c, + 0x300115,0x310116,0x320118,0x33011a,0x34011c,0x35011d,0x36011e,0x37011f, + 0x380120,0x390121,0x3a005c,0x3b005b,0x3c009a,0x3d009b,0x3e009c,0x3f005f, + 0x40007a,0x410123,0x420128,0x43012a,0x44012c,0x450132,0x460134,0x470137, + 0x480139,0x49013d,0x4a0140,0x4b0142,0x4c0145,0x4d0149,0x4e014b,0x4f0150, + 0x500155,0x510157,0x52015a,0x53015c,0x54015f,0x550163,0x560165,0x570167, + 0x580169,0x59016b,0x5a016d,0x5b0072,0x5c007e,0x5d0073,0x5e0047,0x5f0043, + 0x600045,0x610122,0x620127,0x630129,0x64012b,0x650131,0x660133,0x670136, + 0x680138,0x69013c,0x6a013f,0x6b0141,0x6c0143,0x6d0148,0x6e014a,0x6f014f, + 0x700154,0x710156,0x720159,0x73015b,0x74015e,0x750162,0x760164,0x770166, + 0x780168,0x79016a,0x7a016c,0x7b0074,0x7c009e,0x7d0075,0x7e00a0,0xa00042, + 0xa1005e,0xa2010c,0xa3010e,0xa4010b,0xa5010f,0xa6009f,0xa70076,0xa80049, + 0xa90078,0xaa0124,0xab006e,0xac009d,0xad0052,0xae0079,0xaf004f,0xb0008a, + 0xb10097,0xb20119,0xb3011b,0xb40044,0xb50187,0xb60077,0xb70062,0xb8004d, + 0xb90117,0xba0151,0xbb006f,0xbc000a,0xbd0007,0xbe0010,0xbf0060,0xc60126, + 0xd00130,0xd70099,0xd80153,0xde016f,0xdf0031,0xe60125,0xf0012f,0xf70098, + 0xf80152,0xfe016e,0x110012e,0x111012d,0x126013b,0x127013a,0x131013e,0x1320025, + 0x1330023,0x1380158,0x13f0029,0x1400027,0x1410147,0x1420146,0x1490035,0x14a014e, + 0x14b014d,0x152002f,0x153002d,0x1660161,0x1670160,0x17f015d,0x1920135,0x2c60087, + 0x2c70088,0x2c90089,0x2d80046,0x2d9004c,0x2da0048,0x2db004e,0x2dd004b,0x30000fe, + 0x30100fd,0x3020100,0x3030105,0x3040109,0x30600ff,0x3070106,0x3080103,0x30a0102, + 0x30b0104,0x30c0101,0x30d010a,0x3270107,0x3280108,0x3840044,0x385004a,0x3870062, + 0x3910171,0x3920173,0x3930175,0x3940177,0x3950179,0x396017b,0x397017d,0x398017f, + 0x3990181,0x39a0183,0x39b0185,0x39c0188,0x39d018a,0x39e018c,0x39f018e,0x3a00190, + 0x3a10192,0x3a30194,0x3a40196,0x3a50198,0x3a6019a,0x3a7019c,0x3a8019e,0x3a901a0, + 0x3b10170,0x3b20172,0x3b30174,0x3b40176,0x3b50178,0x3b6017a,0x3b7017c,0x3b8017e, + 0x3b90180,0x3ba0182,0x3bb0184,0x3bc0186,0x3bd0189,0x3be018b,0x3bf018d,0x3c0018f, + 0x3c10191,0x3c20193,0x3c30193,0x3c40195,0x3c50197,0x3c60199,0x3c7019b,0x3c8019d, + 0x3c9019f,0x40201ae,0x40401b2,0x40501b8,0x40601bc,0x40801be,0x40901c4,0x40a01ca, + 0x40b01d6,0x40f01e2,0x41001a2,0x41101a4,0x41201a6,0x41301a8,0x41401ac,0x41501b0, + 0x41601b4,0x41701b6,0x41801ba,0x41a01c0,0x41b01c2,0x41c01c6,0x41d01c8,0x41e01cc, + 0x41f01ce,0x42001d0,0x42101d2,0x42201d4,0x42301d8,0x42401da,0x42501dc,0x42601de, + 0x42701e0,0x42801e4,0x42901e6,0x42a01e8,0x42b01ea,0x42c01ec,0x42d01ee,0x42e01f0, + 0x42f01f2,0x43001a1,0x43101a3,0x43201a5,0x43301a7,0x43401ab,0x43501af,0x43601b3, + 0x43701b5,0x43801b9,0x43a01bf,0x43b01c1,0x43c01c5,0x43d01c7,0x43e01cb,0x43f01cd, + 0x44001cf,0x44101d1,0x44201d3,0x44301d7,0x44401d9,0x44501db,0x44601dd,0x44701df, + 0x44801e3,0x44901e5,0x44a01e7,0x44b01e9,0x44c01eb,0x44d01ed,0x44e01ef,0x44f01f1, + 0x45201ad,0x45401b1,0x45501b7,0x45601bb,0x45801bd,0x45901c3,0x45a01c9,0x45b01d5, + 0x45f01e1,0x49001aa,0x49101a9,0x20000041,0x20010041,0x20020041,0x20030041,0x20040041, + 0x20050041,0x20060041,0x20070042,0x20080041,0x20090041,0x200a0041,0x200b003f,0x200c0037, + 0x200d0037,0x200e0037,0x200f0037,0x20100054,0x20110055,0x20120056,0x20130057,0x20140058, + 0x20150059,0x20170051,0x20180064,0x20190065,0x201a0066,0x201b0067,0x201c006b,0x201d006c, + 0x201e006d,0x20200083,0x20210084,0x20220085,0x20260002,0x2028003d,0x2029003e,0x202a0037, + 0x202b0037,0x202c0037,0x202d0037,0x202e0037,0x20300082,0x20320086,0x20330005,0x20390068, + 0x203a0069,0x203c0000,0x203e0050,0x2044007d,0x207f014c,0x20a30110,0x20a40111,0x20a70112, + 0x20ac0113,0x2105001c,0x21130144,0x2116002b,0x21220033,0x212601a0,0x212e0114,0x215b000d, + 0x215c0013,0x215d0016,0x215e0019,0x2190008b,0x2191008d,0x2192008c,0x2193008e,0x2194008f, + 0x21950090,0x21a80091,0x22020092,0x22060093,0x220f0094,0x22110095,0x221200a1,0x221500a2, + 0x221900a3,0x221a00a4,0x221e00a5,0x221f00a6,0x222900a7,0x222b00a8,0x224800a9,0x226100aa, + 0x226400ab,0x226500ac,0x230200ad,0x231000ae,0x232000af,0x232100b0,0x250000b1,0x250200b2, + 0x250c00b3,0x251000b4,0x251400b5,0x251800b6,0x251c00b7,0x252400b8,0x252c00b9,0x253400ba, + 0x253c00bb,0x255000bc,0x255100bd,0x255200be,0x255300bf,0x255400c0,0x255500c1,0x255600c2, + 0x255700c3,0x255800c4,0x255900c5,0x255a00c6,0x255b00c7,0x255c00c8,0x255d00c9,0x255e00ca, + 0x255f00cb,0x256000cc,0x256100cd,0x256200ce,0x256300cf,0x256400d0,0x256500d1,0x256600d2, + 0x256700d3,0x256800d4,0x256900d5,0x256a00d6,0x256b00d7,0x256c00d8,0x258000d9,0x258400da, + 0x258800db,0x258c00dc,0x259000dd,0x259100de,0x259200df,0x259300e0,0x25a000e1,0x25a100e2, + 0x25aa00e3,0x25ab00e4,0x25ac00e5,0x25b200e6,0x25ba00e7,0x25bc00e8,0x25c400e9,0x25ca00ea, + 0x25cb00eb,0x25cf00ec,0x25d800ed,0x25d900ee,0x25e600ef,0x263a00f0,0x263b00f1,0x263c00f2, + 0x264000f3,0x264200f4,0x266000f5,0x266300f6,0x266500f7,0x266600f8,0x266a00f9,0x266b00fa, + 0xfb01001f,0xfb020021,0xfeff0037,0xfffc00fb,0xfffd00fc, + }; + +static const TCollationKeyTable TheStandardTable = + { TheKey, TheIndex, 517, NULL, NULL, 0 }; + +const TCollationKeyTable* StandardCollationMethod() + { + return &TheStandardTable; + }; + +inline void Increment(TUint16 const *& aPointer,TBool aNarrow) + { + aPointer = aNarrow ? (const TUint16*)(((const TUint8*)aPointer) + 1) : aPointer + 1; + } + +///////////////////////////////////////////////////////////////////////////////////////////////// +// TCollationValueIterator +///////////////////////////////////////////////////////////////////////////////////////////////// + +/** +Initializes TCollationValueIterator object with a new character sequence. +@param aSourceIt An iterator used to access the input character (non-normalized or + normalized) sequence. +@internalComponent +*/ +void TCollationValueIterator::SetSourceIt(TUTF32Iterator& aSourceIt) + { + iCurrentKeyPos = 0; + iKey.iKeys = 0; + iDecompStrIt.Set(aSourceIt); + } + +/** +Gets current raw key. +Note: the method may move the iterator one or more positions forward if there are no produced + collation keys. +@param aKey A reference to a TCollationKey object, initialized with the + current collation key after the call, if there is available key. +@return ETrue Successfull call, aKey initialized with the current collation key, + EFalse - the iteration has come to the end. +@internalComponent +*/ +TBool TCollationValueIterator::GetCurrentKey(TCollationKey& aKey) + { + ASSERT(iCurrentKeyPos <= iKey.iKeys); + if(!ProduceCollationKeys()) + { + return EFalse; + } + aKey = iKey.iKey[iCurrentKeyPos]; + return ETrue; + } + +/** +Gets current key at the specified level. +Note: the method may move the iterator one or more positions forward if there are no produced + collation keys. +@param aLevel Desired level of the collation key: 0..3 +@param aKey A reference to TUint32 where the retrieved key will be stored. +@return ETrue Success, EFalse - end of the iteration. +@internalComponent +*/ +TBool TCollationValueIterator::GetCurrentKey(TInt aLevel, TUint32& aKey) + { + TCollationKey rawKey; + if(GetCurrentKey(rawKey)) + { + //Key values are ignored if their ignore bit is set and the level is less than 3: in other words, the + //actual Unicode value is never ignored. This does NOT conform to the system of alternate weightings + //described in Unicode Technical Report 10, and will probably have to be changed. + aKey = (aLevel < 3 && (rawKey.iLow & TCollationKeyTable::EIgnoreFlag) && !IgnoringNone()) ? 0 : rawKey.Level(aLevel); + return ETrue; + } + return EFalse; + } + +/** +The method iterates through the controlled character sequence and tries to find first non-zero +corresponding collation key at the specified level. +@param aLevel Desired level of the collation key: 0..3 +@return Non-zero collation key value or 0 if the iteration has come to the end. +@internalComponent +*/ +TUint32 TCollationValueIterator::GetNextNonZeroKey(TInt aLevel) + { + TUint32 key = 0; + while(GetCurrentKey(aLevel, key) && key == 0) + { + Increment(); + } + return key; + } + +/** +The method determines wheter the specified as a parameter character matches current iterator's +character. +If there is a match, the iterator will be moved one position forward. +Note: the method may move the iterator one or more positions forward if there are no produced + collation keys. +@param aMatch The character to compare with the current iterator's character. +@return ETrue The characters match, EFalse otherwise (or the iteration has come to the end). +@internalComponent +*/ +TBool TCollationValueIterator::MatchChar(TChar aMatch) + { + TUint32 key; + if(GetCurrentKey(3, key)) + { + // Find a match for the quaternary key.. will probably be the unicode value + // This is a bit poor. + if(aMatch == key) + { + Increment(); + return ETrue; + } + } + return EFalse; + } + +/** +Note: the method may move the iterator one or more positions forward if there are no produced + collation keys. +@return The method returns ETrue if the iterator is at a combining character, EFalse otherwise + (or the iterator has come to the end) +@internalComponent +*/ +TBool TCollationValueIterator::AtCombiningCharacter() + { + TCollationKey rawKey; + if(!GetCurrentKey(rawKey)) + { + return EFalse; // iteration ended + } + return rawKey.IsStarter() ? (TBool)EFalse : (TBool)ETrue; + } + +/** +Skips the following combining characters if they are. +Note: the method may move the iterator one or more positions forward. +@return The number of skipped combining characters. +@internalComponent +*/ +TInt TCollationValueIterator::SkipCombiningCharacters() + { + TInt count; + for(count=0;AtCombiningCharacter();++count) + { + Increment(); + } + return count; + } + +/** +Moves the iterator one step forward making the next collation key available for getting +using GetCurrentKey(). +@return ETrue Successfull call, there is a collation key available. + EFalse - the iteration has come to the end. +@internalComponent +@see TCollationValueIterator::GetCurrentKey() +*/ +TBool TCollationValueIterator::Increment() + { + ASSERT(iCurrentKeyPos <= iKey.iKeys); + if(!ProduceCollationKeys()) + { + return EFalse; + } + ++iCurrentKeyPos; + return ETrue; + } + +/** +Returns the position in the underlying string of the iteration, +if this is well defined. It is not well defined if either we are +half way through keys defined as a string in the collation table +or if we are half way through a canonically reordered sequence. +@return The position in the underlying string if this is well + defined, or 0 if it is not. +*/ +const TText16* TCollationValueIterator::CurrentPositionIfAtCharacter() + { + if (!ProduceCollationKeys()) + return iCurrentPosition; + return iCurrentKeyPos == 0? iCurrentPosition : 0; + } + +/** +Produces the longest possible collation keys sequence using the decomposed character sequence, +pointed by iDecompStrIt iterator. But this will happen only if all keys from iKey array are +consumed. +@return ETrue Successfull call, iKey initialized with the produced collation keys sequence, + EFalse - the iteration has come to the end. +@internalComponent +*/ +TBool TCollationValueIterator::ProduceCollationKeys() + { + //iKey.iKeys represents the keys count in iKey array, so load more keys, only if all + //collation keys are already consumed. + if(iCurrentKeyPos == iKey.iKeys) + { + iCurrentPosition = iDecompStrIt.CurrentPositionIfAtCharacter(); + if(iDecompStrIt.AtEnd()) + {//No more characters in the input decomposed canonical string + return EFalse; + } + //Try to get the next collation key sequence. There should be at least one key. + GetNextRawKeySequence(); + ASSERT(iKey.iKeys > 0); + iCurrentKeyPos = 0; + } + return ETrue; + } + +/** +Consume zero or more characters from the input and convert them into zero or more collation keys. +@internalComponent +*/ +void TCollationValueIterator::GetNextRawKeySequence() + { + //Store the first character combining class type for later use. + TChar firstChar = iDecompStrIt.Get(0); + TBool combining = !::IsBaseCharacter(firstChar); + // Initialise. + iKey.iCharactersConsumed = 0; + iKey.iKeys = 0; + // See if the override table has a key for the current collation unit. + if(iMethod.iOverrideTable) + { + GetKeyFromTable(iMethod.iOverrideTable); + } + // If not, try the main table. + if(iKey.iCharactersConsumed == 0) + { + GetKeyFromTable(iMethod.iMainTable); + } + //If no key was found use a default value depending on the current character. + //For CJK characters: + //the Unicode value itself as the primary key and 1 as the secondary and tertiary keys; + //the lower 16 bits end up as 0x0105 because the bottom two bits are used for the ignorable bit, + //which is clear, and the stop bit, which is set. + //For other characters: + //Return two keys containing the 21 bits of the character code (anything from 0 to 0x10FFFF), as + //explained in Unicode Technical Report 10. + if(iKey.iCharactersConsumed == 0) + { + iKey.iCharactersConsumed = 1; + iDecompStrIt.Next(1); + iKey.iKeys = ::CreateDefaultCollationKeySequence(firstChar, iKey.iKey); + } + if(!combining) + { + iKey.iKey[0].iHigh |= (TUint32)TCollationKey::KFlagIsStarter; + } + } + +/** +Search for the string aText. +Put the key index in aIndex if found, otherwise set aIndex to -1. +If the sought string might be a prefix to a key in the table set aPossiblePrefix to TRUE. +@internalComponent +*/ +static void GetStringKey(const TCollationKeyTable* aTable,const TText* aText,TInt aLength, + TInt& aIndex,TBool& aPossiblePrefix) + { + aIndex = -1; + aPossiblePrefix = EFalse; + TInt n = aTable->iStringIndices; + const TUint32* base = aTable->iStringIndex; + const TUint32* p = base; + TInt pivot; + while (n > 0) + { + pivot = n / 2; + p += pivot; + TUint16 string_index = (TUint16)(*p >> 16); + const TText* cur_text = aTable->iString + string_index + 1; + TInt cur_length = aTable->iString[string_index]; + TInt order = TUnicode::Compare(aText,aLength,cur_text,cur_length); + if (order == 0) // found it + { + aIndex = *p & 0xFFFF; + aPossiblePrefix = ETrue; + break; + } + if (order < 1 && !aPossiblePrefix) + { + if (aLength < cur_length && TUnicode::Compare(aText,aLength,cur_text,aLength) == 0) + aPossiblePrefix = ETrue; + n = pivot; + } + else + { + base = p + 1; + n -= pivot + 1; + } + p = base; + } + } + +/** +Consumes output from iDecompStrIt, produces list of keys in iKey. +@param aTable A const pointer to the collation key table used by the method. +@internalComponent +*/ +void TCollationValueIterator::GetKeyFromTable(const TCollationKeyTable* aTable) + { + ASSERT(aTable != NULL); + iKey.iCharactersConsumed = 0; + iKey.iKeys = 0; + + TInt cur_char = iDecompStrIt.Get(0); + if (0xFFFF < cur_char) + // Supplementary character: we can't handle these yet. + return; + + // Find the longest matching string. + TInt index = -1; + if(aTable->iStringIndices > 0) + { + TInt moved = 0; + TText text[KKeyedStringBufferSize]; + text[0] = static_cast (cur_char); + TBool possible_prefix = ETrue; + for(TInt i = 1; (i < KKeyedStringBufferSize) && possible_prefix; i++) + { + ++moved; + TInt c = iDecompStrIt.Get(i);//get the next character + if(c == -1) + { + break; + } + text[i] = static_cast (c); + TInt cur_index = -1; + ::GetStringKey(aTable, text, i + 1, cur_index, possible_prefix); + if(cur_index != -1) + { + index = cur_index; + iKey.iCharactersConsumed = i + 1; + } + } + if (iKey.iCharactersConsumed < moved) + { + moved = 0; + } + while (moved != iKey.iCharactersConsumed) + { + ++moved; + } + if(moved > 0) + { + iDecompStrIt.Next(moved);//adjust the iterator start position + } + } + + // Now search the main index. + if(index == -1) + { + index = ::FindCollationKeyIndex(cur_char, *aTable); + if(0 <= index) + { + iKey.iCharactersConsumed = 1; + iDecompStrIt.Next(1);//adjust the iterator start position + } + } + + // Fill in the key or keys. + if(index != -1) + { + const TUint32* p = &aTable->iKey[index]; + TCollationKey* q = iKey.iKey; + iKey.iKeys = 0; + while(iKey.iKeys < TKeyInfo::EMaxKeys) + { + q->iLow = *p; + q->iHigh = cur_char; + iKey.iKeys++; + if(*p & 1) + { + break; + } + q++; + p++; + } + } + } + +///////////////////////////////////////////////////////////////////////////////////////////////// +// TCollate +///////////////////////////////////////////////////////////////////////////////////////////////// + +/** +Construct a TCollate object based on the collation method specified +within aCharSet, if any. If there is none, or aCharSet is null, the +standard collation method will be used. +aMask and aFlags provide a method for overriding the flags in the collation method: +Each flag set to 1 in aMask is a flag that will be overridden and set to the +corresponding flag value in aFlags. +Ownership of aCharSet is not passed. +@param aCharSet Locale-specific character attribute and collation data +@param aMask Provides a method for overriding the flags in the collation method +@param aFlags Provides a method for overriding the flags in the collation method +@internalComponent +*/ +TCollate::TCollate(const LCharSet* aCharSet, TUint aMask, TUint aFlags) + { + iMethod.iMainTable = NULL; + iMethod.iOverrideTable = NULL; + iMethod.iFlags = 0; + if (aCharSet && aCharSet->iCollationDataSet && aCharSet->iCollationDataSet->iMethod) + { + iMethod = aCharSet->iCollationDataSet->iMethod[0]; + } + if (iMethod.iMainTable == NULL) + { + iMethod.iMainTable = &TheStandardTable; + } + if (aMask) + { + iMethod.iFlags &= ~aMask; + iMethod.iFlags |= (aMask & aFlags); + } + } + +/** +Construct a TCollate object based on an already constructed +TCollationMethod specified in aMethod. +Ownership is not passed. +@param aMethod Collation keys table +@internalComponent +*/ +TCollate::TCollate(const TCollationMethod& aMethod) : + iMethod(aMethod) + { + if(!iMethod.iMainTable) + { + iMethod.iMainTable = &TheStandardTable; + } + } + +/** +Compare the string beginning at aString1 of length aLength1 against the +string beginning at aString2 of length aLength2. + +@param aString1 First string to compare +@param aLength1 Length of aString1 +@param aString2 Second string to compare +@param aLength2 Length of aString2 +@param aMaxLevel Determines the tightness of the collation. At level 0, only + character identities are distinguished. At level 1 accents are + distinguished as well. At level 2 case is distinguished as well. At + level 3 all non canonically equivalent Unicode characters are considered + different. By default aMaxLevel is 3. +@return EStringsIdentical The strings are identical. + ELeftComparesLessAndIsNotPrefix For example: aString1 = "aaa", aString2 = "zzzz". + ELeftIsPrefixOfRight For example: aString1 = "abc", aString2 = "abcd". + ERightIsPrefixOfLeft For example: aString1 = "abcd", aString2 = "abc". + ERightComparesLessAndIsNotPrefix For example: aString1 = "zzzz", aString2 = "aaa". +@internalComponent +*/ +TCollate::TComparisonResult TCollate::Compare(const TUint16 *aString1, TInt aLength1, + const TUint16 *aString2, TInt aLength2, + TInt aMaxLevel) const + { + TUTF32Iterator itL(aString1, aString1 + aLength1); + TUTF32Iterator itR(aString2, aString2 + aLength2); + return CompareKeySequences(itL, itR, aMaxLevel, 0, 0); + } + +/** +Find the string beginning at aString2 of length aLength2 in the string +beginning at aString1 of length aLength1. + +@param aString1 String to search +@param aLength1 Length of aString1 +@param aString2 String to search for +@param aLength2 Length of aString2 +@param aMaxLevel Determines the tightness of the collation. At level 0, only + character identities are distinguished. At level 1 accents are + distinguished as well. At level 2 case is distinguishes as well. At + level 3 all valid different Unicode characters are considered different. +@param aString2WildChar Wild card character which may be specified for aString2. By default + wild card character is not specified and not used. +@return KErrNotFound aString2 not found in aString1. + Non-negative value telling the position in aString1 where the first occurrence of + aString2 was found. +@internalComponent +*/ +TInt TCollate::Find(const TUint16 *aString1, TInt aLength1, + const TUint16 *aString2, TInt aLength2, + TInt aMaxLevel, TUint aString2WildChar) const + { + TInt dummy(0); + return Find(aString1, aLength1, aString2,aLength2, dummy, aMaxLevel,aString2WildChar ); + } + +/** +Find the string beginning at aString2 of length aLength2 in the string +beginning at aString1 of length aLength1. + +@param aString1 String to search +@param aLength1 Length of aString1 +@param aString2 String to search for +@param aLength2 Length of aString2 +@param aLengthFound A refernce to the length of the match found in the candidate string +@param aMaxLevel Determines the tightness of the collation. At level 0, only + character identities are distinguished. At level 1 accents are + distinguished as well. At level 2 case is distinguishes as well. At + level 3 all valid different Unicode characters are considered different. +@param aString2WildChar Wild card character which may be specified for aString2. By default + wild card character is not specified and not used. +@return KErrNotFound aString2 not found in aString1. + Non-negative value telling the position in aString1 where the first occurrence of + aString2 was found. +@internalComponent +*/ +TInt TCollate::Find(const TUint16 *aString1, TInt aLength1, + const TUint16 *aString2, TInt aLength2, + TInt &aLengthFound, TInt aMaxLevel, TUint aString2WildChar) const + { + TUTF32Iterator itL(aString1, aString1 + aLength1); + TUTF32Iterator itR(aString2, aString2 + aLength2); + return FindKeySequence(itL, itR, aMaxLevel, aString2WildChar, 0, aLengthFound); + } + +/** +Match the pattern defined by aSearchTerm with aCandidate. +Return the index in aCandidate of the start of the first pattern matched - +that is, the first character in aSearchTerm after all wild-sequence characters +have been matched. Return KErrNotFound if there is no match. + +For example, if aCandidate is "abcdefghijkl", the following values of aSearchTerm yield the +following results: +"abc*" gives 0 +"abc" gives KErrNotFound +"xyz" gives KErrNotFound +"*def" gives KErrNotFound +"*def*" gives 3 +"*d?f*" gives 3 +"a*kl" gives 0 +"*d*kl" gives 4 + +To match a pattern anywhere in aCandidate, aSearchTerm must both start and end +with aString2WildSequenceChar + +@param aCandidate String to search +@param aCandidateLength Length of aCandidate +@param aSearchTerm String to search for +@param aSearchTermLength Length of aSearchTerm +@param aMaxLevel Determines the tightness of the collation. At level 0, only + character identities are distinguished. At level 1 accents are + distinguished as well. At level 2 case is distinguishes as well. At + level 3 all valid different Unicode characters are considered different. +@param aWildChar Wild card character which may be specified for aSearchTerm. By default + the wild card character used is '?'. +@param aWildSequenceChar Wild card sequence character which may be specified for aSearchTerm. + Its default value is '*'. +@param aEscapeChar Escape character. If it is non-zero and precdes aWildChar and aWildSequenceChar characters in + aCandidate string, then these characters should be treated as normal characters. +@return The index in aCandidate of the start of the first pattern matched. + +@internalComponent. +*/ +TInt TCollate::Match(const TUint16 *aCandidate, TInt aCandidateLength, + const TUint16 *aSearchTerm,TInt aSearchTermLength, + TInt aMaxLevel, TUint aWildChar, TUint aWildSequenceChar, + TUint aEscapeChar) const + { + ASSERT(0 <= aSearchTermLength); + ASSERT(0 <= aCandidateLength); + + if(aMaxLevel == 3 && (iMethod.iFlags & TCollationMethod::EFoldCase)) + { + aMaxLevel = 2; + } + + TUTF32Iterator candidate(aCandidate, aCandidate + aCandidateLength); + TUTF32Iterator searchTerm(aSearchTerm, aSearchTerm + aSearchTermLength); + + TInt firstMatch = KErrNotFound; + TInt segEnd = ::FindCharacter(aWildSequenceChar, aEscapeChar, aSearchTerm, aSearchTermLength); + + // Is there any prefix that the candidate string must have? + // aSearchTerm looks like "abc*...". Then segEnd will be 3 (the position of '*'). + // Check that aCandidate begins with "abc" too. + if(segEnd != 0 || aSearchTermLength == 0) + { + searchTerm = TUTF32Iterator(aSearchTerm, aSearchTerm + segEnd); + TComparisonResult order = CompareKeySequences(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar); + if(order != ERightIsPrefixOfLeft && order != EStringsIdentical) + { + return KErrNotFound; + } + if(aSearchTermLength == segEnd) + { + return order == EStringsIdentical ? 0 : KErrNotFound; + } + firstMatch = 0; + } + + // search for all remaining segments + // For example: aSearchTerm = "abc*def*ghi", aCandidate = "abc...". + // aCandidate was already searched for "abc" and segEnd = 3. + // Search aCandidate for the remaining segments: "def" and "ghi". + while(aSearchTermLength != (segEnd + 1)) + { + ++segEnd; + aSearchTermLength -= segEnd; + aSearchTerm += segEnd; + segEnd = ::FindCharacter(aWildSequenceChar, aEscapeChar, aSearchTerm, aSearchTermLength); + searchTerm = TUTF32Iterator(aSearchTerm, aSearchTerm + segEnd);//searchTerm holds the next aSearchTerm segment + //We will store here the current position of candidate string. + const TUint16* candidateCurrentPos = candidate.CurrentPosition(); + TInt dummy(0); + TInt match = FindKeySequence(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar, dummy); + if (match < 0) + { + return KErrNotFound; + } + if (aSearchTermLength == segEnd) + { + candidate.SetStart(candidateCurrentPos + match); + TComparisonResult order = CompareKeySequences(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar); + if (order == EStringsIdentical) + return firstMatch < 0 ? (match + candidateCurrentPos - aCandidate): firstMatch; + while (match >= 0) + { + // We are at the very end of the search term, so this segment must + // match the end of the candidate string. + candidate.SetStart(candidateCurrentPos + match + 1); + candidateCurrentPos = candidate.CurrentPosition(); + match = FindKeySequence(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar, dummy); + candidate.SetStart(candidateCurrentPos + match); + order = CompareKeySequences(candidate, searchTerm, aMaxLevel, aWildChar, aEscapeChar); + if (order == EStringsIdentical) + return firstMatch < 0 ? (match + candidateCurrentPos - aCandidate): firstMatch; + } + return KErrNotFound; + } + //Initialize the first match position, if not initialized yet + if (firstMatch < 0 && segEnd != 0) + { + firstMatch = match; + } + } + return firstMatch < 0 ? aCandidateLength : firstMatch; + } + +/** +Compare values output from the iterators. After the comparison, if +ERightIsPrefixOfLeft or EStringsIdentical is returned, then aLeft +will be pointing at the next character (at MaxLevel) after the match. +If right is shown to be a prefix of left, this means that it has been +checked at all requested levels. If it is reported that the right is a +prefix of the left, then this will mean also that there are no unmatched +combining characters on the left. + +@internalComponent +*/ +TCollate::TComparisonResult TCollate::CompareKeySequences(TUTF32Iterator& aLeft, TUTF32Iterator& aRight, + TInt aMaxLevel, TInt aRightStringWildChar, TInt aEscapeChar) const + { + // Clamp the maximum level of the comparison. + if(aMaxLevel < 0) + { + aMaxLevel = 0; + } + if(aMaxLevel > 3) + { + aMaxLevel = 3; + } + //Case folding forces the maximum level to 2. Case folding could only be done at level 3, which + //makes use of the actual Unicode values, if we had access to a case conversion table appropriate for + //the collation method. + if(aMaxLevel == 3 && (iMethod.iFlags & TCollationMethod::EFoldCase)) + { + aMaxLevel = 2; + } + TCollationValueIterator itL(iMethod); + TCollationValueIterator itR(iMethod); + // Perform the comparison. + TComparisonResult order = EStringsIdentical; + TComparisonResult accumulatedOrder = EStringsIdentical; + const TText16* endOfLeft = 0; + for (int cur_level = 0; cur_level <= aMaxLevel; cur_level++) + { + itL.SetSourceIt(aLeft); + itR.SetSourceIt(aRight); + + for (;;) + { + TUint32 c2 = itR.GetNextNonZeroKey(cur_level); + if (c2 == 0) + { + TUint32 more = itL.GetNextNonZeroKey(cur_level); + if (cur_level == 0) + endOfLeft = itL.CurrentPositionIfAtCharacter(); + if (more == 0) + {//No non-zero keys at all + order = EStringsIdentical; + } + else if (!(TCollationMethod::EIgnoreCombining & iMethod.iFlags) + && itL.AtCombiningCharacter()) + { + order = ERightComparesLessAndIsNotPrefix; + } + else + { + order = ERightIsPrefixOfLeft; + } + break; + } + TUint32 c1 = itL.GetNextNonZeroKey(cur_level); + if (c1 == 0) + { + order = ELeftIsPrefixOfRight; + break; + } + + itL.Increment(); + if(cur_level == 0 && aEscapeChar != 0 && itR.MatchChar(aEscapeChar)) + {//Escape character found. Get the next key. + c2 = itR.GetNextNonZeroKey(cur_level); + itR.Increment(); + } + else + { + if(aRightStringWildChar && itR.MatchChar(aRightStringWildChar)) + { + itL.SkipCombiningCharacters(); + itR.SkipCombiningCharacters(); + c1 = c2; + } + else + { + itR.Increment(); + } + } + + // Has an order been determined by key difference? + if (c1 != c2) + { + // Fold to lower case, or switch ordering for case or kana syllabary if necessary. + if (cur_level == 2 && (c1 <= (0x14 * 4) && c2 <= (0x14 * 4))) + { + // Divide keys by 4 to get them back into the range 0..63 + // because keys returned by GetKey are masked but not shifted. + c1 /= 4; + c2 /= 4; + ProcessKeys(c1, c2, iMethod.iFlags); + } + if (c1 != c2) // test equality again because case folding might have made them equal + { + order = c1 > c2 ? ERightComparesLessAndIsNotPrefix : ELeftComparesLessAndIsNotPrefix; + TBool backwards = cur_level == 1 && (iMethod.iFlags & TCollationMethod::EAccentsBackwards); + if (order && !backwards) + { + break; + } + } + } + } + if (accumulatedOrder != order && order != EStringsIdentical) + { + if (accumulatedOrder == ERightIsPrefixOfLeft) + { + return ERightComparesLessAndIsNotPrefix; + } + else if (accumulatedOrder == ELeftIsPrefixOfRight) + { + return ELeftComparesLessAndIsNotPrefix; + } + else + { + // accumulatedOrder == EStringsIdentical + if (order == ELeftComparesLessAndIsNotPrefix || order == ERightComparesLessAndIsNotPrefix) + { + return order; + } + } + accumulatedOrder = order; + } + } + + if (accumulatedOrder == EStringsIdentical || accumulatedOrder == ERightIsPrefixOfLeft) + { + if (endOfLeft) + { + aLeft.SetStart(endOfLeft); + } + else if (accumulatedOrder == ERightIsPrefixOfLeft) + { + accumulatedOrder = ERightComparesLessAndIsNotPrefix; + } + } + return accumulatedOrder; + } + +/** +Finds search term inside candidate string. Returns KErrNotFound if there +is no match, returns the offset into the candidate string at which the +search term was found. If a string was found, the search term iterator is left +pointing at the end of the search term, and the candidate iterator is +left pointing just after the matched keys. aMatchPos returns where in +the candidate string the match was found. + +@internalComponent +*/ +TInt TCollate::FindKeySequence(TUTF32Iterator& aCandidate, TUTF32Iterator& aSearchTerm, + TInt aMaxLevel, TInt aWildChar, TInt aEscapeChar, TInt& aLengthFound) const + { + TInt matchOffset = 0; + //Save the start of the candidate string + const TText* candidateStart = aCandidate.CurrentPosition(); + //Create copies of aCandidate and aSearchTerm + TUTF32Iterator candidateCopy(aCandidate); + TUTF32Iterator searchTermCopy(aSearchTerm); + aLengthFound = KErrNotFound; + //Do the search + for(;;) + { + TComparisonResult order = CompareKeySequences(aCandidate, aSearchTerm, aMaxLevel, aWildChar, aEscapeChar); + if(order == ELeftIsPrefixOfRight) + { + return KErrNotFound; + } + if(order == ERightIsPrefixOfLeft || order == EStringsIdentical) + { + aLengthFound = (aCandidate.CurrentPosition() - candidateStart) - matchOffset; + return matchOffset; + } + + aCandidate = candidateCopy; + aCandidate.Next(); + ::SkipCombiningCharacters(aCandidate); + candidateCopy = aCandidate; + + matchOffset = aCandidate.CurrentPosition() - candidateStart; + + aSearchTerm = searchTermCopy; + } + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/collateimp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/collateimp.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,163 @@ +// Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +// Some internals of the Unicode collation system. +#ifndef __COLLATEIMP_H__ +#define __COLLATEIMP_H__ + +#include +#include "collate.h" +#include "compareimp.h" + +//Forward declarations +struct TCollationKeyTable; + +//External declarations +const TCollationKeyTable* StandardCollationMethod(); + +/** +@internalComponent +*/ +struct TCollationKey + { + enum { KHighValue = 0x00FFFFFF, KFlagIsStarter = 0x80000000 }; + TUint32 Level(TInt aLevel) const + { + static const TUint32 mask[3] = { 0xFFFF0000, 0xFF00, 0xFC }; + return aLevel == 3 ? iHigh & KHighValue : iLow & mask[aLevel]; + } + TBool IsStarter() const + { + return (TBool)(iHigh & (TUint32)KFlagIsStarter); + } + + enum {KLevel0KeySize=2, KLevel1KeySize=1,KLevel2KeySize=1,KLevel3KeySize=3 }; + + static TInt MaxSizePerKey(TInt aLevel) + { + if (aLevel==0) + return KLevel0KeySize; + if (aLevel==1 || aLevel==2) + return KLevel1KeySize; + return KLevel3KeySize; + } + + void AppendToDescriptor(TPtr8 aLevelBuffer,TInt aLevel) const + { + TBuf8<4> buffer; + switch (aLevel) + { + //for each level need to check for zero key + //i.e. only append non zero key + case 0: + { + if (((iLow>>16)&0xFFFF)!=0) + { + buffer.SetLength(KLevel0KeySize); + buffer[0]=(TUint8)((iLow>>24)&0xFF); + buffer[1]=(TUint8)((iLow>>16)&0xFF); + } + break; + } + case 1: + { + if (((iLow>>8)&0xFF)!=0) + { + buffer.SetLength(KLevel1KeySize); + buffer[0]=(TUint8)((iLow>>8)&0xFF); + } + break; + } + case 2: + { + if ((iLow&0xFC)!=0) + { + buffer.SetLength(KLevel2KeySize); + buffer[0]=(TUint8)(iLow&0xFC); + } + break; + } + case 3: + { + if ((iHigh&0xFFFFFF)!=0) + { + buffer.SetLength(KLevel3KeySize); + buffer[0]=(TUint8)((iHigh>>16)&0xFF); + buffer[1]=(TUint8)((iHigh>>8)&0xFF); + buffer[2]=(TUint8)(iHigh&0xFF); + } + break; + } + } + aLevelBuffer.Append(buffer); + } + + TUint32 iLow; // primary, secondary and tertiary keys + TUint32 iHigh; // quaternary key; usually the Unicode value + }; + +/** +@internalComponent +*/ +struct TKeyInfo + { + enum { EMaxKeys = 8 }; + + TCollationKey iKey[EMaxKeys]; // the keys + TInt iKeys; // the number of keys returned + TInt iCharactersConsumed; // number of characters consumed from the input to generate the keys + }; + +/** +Steps through a decomposed unicode string (using iDecompStrIt iterator), +outputting raw collation keys. +Every Increment() call will move to the next collation key (from iKey array), if available. +Every GetCurrentKey() call will retrieve current collation key, if available. +@internalComponent +*/ +class TCollationValueIterator + { +public: + inline TCollationValueIterator(const TCollationMethod& aMethod); + void SetSourceIt(TUTF32Iterator& aSourceIt); + TBool GetCurrentKey(TCollationKey& aKey); + TBool GetCurrentKey(TInt aLevel, TUint32& aKey); + TUint32 GetNextNonZeroKey(TInt aLevel); + TBool MatchChar(TChar aMatch); + TBool AtCombiningCharacter(); + TInt SkipCombiningCharacters(); + TBool Increment(); + inline TBool IgnoringNone() const; + inline const TCollationMethod& CollationMethod() const; + const TText16* CurrentPositionIfAtCharacter(); + +private: + TBool ProduceCollationKeys(); + void GetNextRawKeySequence(); + void GetKeyFromTable(const TCollationKeyTable* aTable); + +private: + TCanonicalDecompositionIteratorCached iDecompStrIt;//Used to iterate through the canonically decomposed input string + // Current position in the underlying iterator (if well defined) + // of the start of the keys stored in iKey. + const TText16* iCurrentPosition; + const TCollationMethod& iMethod;//Current (locale dependend) collation method + TKeyInfo iKey;//Each ProduceCollationKeys() call fills it with the longest possible collation keys sequence + TInt iCurrentKeyPos;//Current position in iKey array. Incremented/set to 0 after each Increment() call + }; + +#include "collateimp.inl" + +#endif //__COLLATEIMP_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/collateimp.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/collateimp.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,43 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + + @param aMethod Defines the collation method to be used in the iterations. + @internalComponent +*/ +inline TCollationValueIterator::TCollationValueIterator(const TCollationMethod& aMethod) : + iMethod(aMethod) + { + } + +/** +@return ETrue The method forbids ignoring characters, EFalse otherwise. +@internalComponent +*/ +inline TBool TCollationValueIterator::IgnoringNone() const + { + return iMethod.iFlags & TCollationMethod::EIgnoreNone; + } + +/** +@return A const reference to the used collation method. +@internalComponent +*/ +inline const TCollationMethod& TCollationValueIterator::CollationMethod() const + { + return iMethod; + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/compare.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/compare.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1375 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Folding and decomposition implementation +// +// + +#include "folddecomp.inl" +#include "compareimp.h" +#include "u32std.h" + +#define ARRAY_LENGTH(a) (static_cast(sizeof(a)/sizeof(a[0]))) + +//////////////////////////////////////////////////////////////////////////////////////////// +// Global functions +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +TChar UTF16ToChar(const TText16* a) + { + if (0xD800 <= a[0]) + { + if (a[0] < 0xE000) + { + if (a[0] < 0xDC00 && ::IsLowSurrogate(a[1])) + { + TChar c = ::PairSurrogates(a[0], a[1]); + if ((c & 0xFFFE) != 0xFFFE) + return c; + } + return 0xFFFF; + } + if (a[0] == 0xFFFE) + return 0xFFFF; + } + return a[0]; + } + +/** +Is a character a base character (ETrue) or a combiner (EFalse)? +For now, we will treat all control characters as base characters. +@internalComponent +*/ +TBool IsBaseCharacter(TChar a) + { + if(a < 0x220) + { + // These Unicode characters are all assigned + // and none of them is a combining character + return ETrue; + } + return (a.GetCategory() & 0xFFF0) - TChar::EMarkGroup; + } + +/** +@internalComponent +*/ +inline TInt GetDecompositionIndex(TChar a) + { + TInt i = DecompositionHashStart(a); + TUint32 v = KUnicodeToIndexHash[i]; + if (!v) + return -1; + if ((v & 0xFFFFF) != a) + { + TInt step = DecompositionHashStep(a); + do { + i = (i + step) & KDecompositionHashBitmask; + v = KUnicodeToIndexHash[i]; + if (!v) + return -1; + } while ((v & 0xFFFFF) != a); + } +// it is important that this is an unsigned shift + return static_cast(v >> 20); + } + +/** +Will not work if an invalid index is passed. +@internalComponent +*/ +static TUTF32Iterator GetFoldedDecomposition(TInt aIndex) + { + TInt singletonIndex = aIndex - (sizeof(KNonSingletonFolds)/sizeof(KNonSingletonFolds[0])/2); + if (0 <= singletonIndex) + return TUTF32Iterator(KSingletonFolds + singletonIndex); + const TText* start = KNonSingletonFolds + aIndex * 2; + if (*start != KLongD) + return TUTF32Iterator(start, start + 2, + TUTF32Iterator::EStartsWithValidCharacter); + TInt longDecompIndex = start[1]; + start = KLongDecompositions + (longDecompIndex & 0xFFF); + return TUTF32Iterator(start, start + (longDecompIndex >> 12) + 3, + TUTF32Iterator::EStartsWithValidCharacter); + } + +/** +@internalComponent +*/ +static TChar GetFirstFoldedChar(TChar a) + { + TInt index = ::GetDecompositionIndex(a); + return index < 0? a : ::GetFoldedDecomposition(index).Current(); + } + +/** +@internalComponent +*/ +static TBool FirstFoldedCodeIsNot(TInt aNonSurrogate, TInt aFoldedNonSurrogate) + { + TInt index = ::GetDecompositionIndex(aNonSurrogate); + if (index < 0) + return aNonSurrogate - aFoldedNonSurrogate; + TInt singletonIndex = index - (sizeof(KNonSingletonFolds)/sizeof(KNonSingletonFolds[0])/2); + if (0 < singletonIndex) + return KSingletonFolds[singletonIndex] - aFoldedNonSurrogate; + const TText* start = KNonSingletonFolds + index * 2; + if (start[0] == KLongD) + start = KLongDecompositions + (start[1] & 0xFFF); + return *start - aFoldedNonSurrogate; + } + +/** +@internalComponent +*/ +static TInt GetClass(TFoldedDecompIterator& a) + { + ASSERT(!a.AtEnd()); + a.EnterFoldedSequence(); + TChar ch = a.Current(); + TInt cl = ch.GetCombiningClass(); + if (cl == 0) + // Assume starters have been folded from ypogegrammeni + cl = 240; + return cl; + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TUTF32Iterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +void TUTF32Iterator::Next() + { + ASSERT(iStart != iEnd); + while (++iStart != iEnd) + { + iCurrent = ::UTF16ToChar(iStart); + if (iCurrent != 0xFFFF) + return; + } + } + +/** +Locates a base character in a string using a folded comparision. Will not find combining +characters, nor will it consider Korean combining Jamo to be equivalent to Hangul. +@internalComponent +*/ +TBool TUTF32Iterator::LocateFoldedBaseCharacter(TChar aChar) + { + // A quick shortcut for simple rejections + if (aChar < 0xFFFF) + { + while (iStart != iEnd && *iStart < 0xD800 && ::FirstFoldedCodeIsNot(*iStart, aChar)) + ++iStart; + if (iStart != iEnd) + { + iCurrent = ::UTF16ToChar(iStart); + if (iCurrent == 0xFFFF) + Next(); + } + } + while (!AtEnd()) + { + TChar foldedChar = ::GetFirstFoldedChar(iCurrent); + if (aChar == foldedChar) + return ETrue; + Next(); + } + return EFalse; + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TFoldedDecompIterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +TFoldedDecompIterator::TFoldedDecompIterator(const TUTF32Iterator& a) + { + Set(a); + } + +/** +@internalComponent +*/ +TBool TFoldedDecompIterator::AtEnd() const + { + return iOriginal.AtEnd(); + } + +/** +@internalComponent +*/ +TBool TFoldedDecompIterator::AtEndOrWildcard() const + { + // neither '?' nor '*' have decomposition sequences, so we can assume that + // if we are pointing at one or the other, we don't need to check if we + // are in a decomposition sequence or not. + return iOriginal.AtEnd() || iOriginal.Current() == '?' || iOriginal.Current() == '*'; + } + +/** +@internalComponent +*/ +TBool TFoldedDecompIterator::EnterFoldedSequence() + { + ASSERT(!AtEnd()); + return !IsInFoldedSequence() && StrictEnterFoldedSequence(); + } + +/** +Enter folded sequence, assuming that we are not already in one +@internalComponent +*/ +TBool TFoldedDecompIterator::StrictEnterFoldedSequence() + { + ASSERT(!AtEnd()); + ASSERT(!IsInFoldedSequence()); + TInt index = ::GetDecompositionIndex(iOriginal.Current()); + if (index < 0) + return EFalse; + iFolded = ::GetFoldedDecomposition(index); + return ETrue; + } + +/** +An iota might have folded from a combining ypogegrammeni. +If the current character is a base character, this function will +detect whether it was folded from a combining character (and +therefore does not constitute a grapheme boundary). +@internalComponent +*/ +TBool TFoldedDecompIterator::CurrentIsBaseFoldedFromCombiner() const + { + if (!IsInFoldedSequence()) + return EFalse; + // The only character that does this is Ypogerammeni, which folds to iota + if (iFolded.Current() != 0x3B9) + return EFalse; + // If the unfolded character is a combiner then it cannot contain an iota, + // so it must be an ypogegrammeni that has been folded to one. + // This will catch 0x345, the ypogegrammeni itself. + if (!::IsBaseCharacter(iOriginal.Current())) + return ETrue; + // Otherwise the base character will be at the start of the decomposition + // sequence. We will assume that it is folded from a genuine iota if and + // only if there is an iota at the start of the folded decomposition + // sequence. (In theory there might be an iota with a combining + // ypogegrammeni, but in practice this will not occur). + TInt index = ::GetDecompositionIndex(iOriginal.Current()); + ASSERT(0 <= index); + TUTF32Iterator folded = ::GetFoldedDecomposition(index); + return folded.Current() != 0x3B9; + } + +/** +@internalComponent +*/ +TChar TFoldedDecompIterator::Current() const + { + ASSERT(!AtEnd()); + return IsInFoldedSequence()? iFolded.Current() : iOriginal.Current(); + } + +/** +Move past this code if it matches unfolded or folded +@internalComponent +*/ +TBool TFoldedDecompIterator::Match(TChar aCode) + { + ASSERT(!AtEnd()); + if (!IsInFoldedSequence()) + { + if (aCode == iOriginal.Current()) + { + iOriginal.Next(); + return ETrue; + } + if (!StrictEnterFoldedSequence()) + return EFalse; + } + ASSERT(IsInFoldedSequence()); + if (aCode == iFolded.Current()) + { + iFolded.Next(); + if (iFolded.AtEnd()) + iOriginal.Next(); + return ETrue; + } + return EFalse; + } + +/** +Move this and argument past matching character. +@internalComponent +*/ +TBool TFoldedDecompIterator::Match(TFoldedDecompIterator& aThat) + { + ASSERT(!AtEnd()); + if (!IsInFoldedSequence()) + { + if ( aThat.Match(iOriginal.Current()) ) + { + iOriginal.Next(); + return ETrue; + } + if (!StrictEnterFoldedSequence()) + return EFalse; + } + ASSERT(IsInFoldedSequence()); + if ( aThat.Match(iFolded.Current()) ) + { + iFolded.Next(); + if (iFolded.AtEnd()) + iOriginal.Next(); + return ETrue; + } + return EFalse; + } + +/** +@internalComponent +*/ +void TFoldedDecompIterator::Next() + { + ASSERT(!AtEnd()); + if (IsInFoldedSequence()) + { + iFolded.Next(); + if (IsInFoldedSequence()) + return; + } + iOriginal.Next(); + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TFoldedSortedDecompIterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +Set this iterator to iterate over the next combining characters. +Iotas in folded sequences are assumed to be character class 240 +(combining ypogegrammeni). Next() must be used once before +the first call to Current(), as long as AtEnd() returns false. +@param aBase Sets the start of the iteration. This value is advanced to the + end of the iteration. +@return The number of codes in the iteration. +@internalComponent +*/ +TInt TFoldedSortedDecompIterator::Set(TFoldedDecompIterator &aBase) + { + iStart = aBase; + TInt length = 0; + iCurrentClass = 256; + + const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet; + + // Find the next starter (i.e. character with combining class 0). + // We must not count iota folded from ypogegrammeni. + // Ypogegrammeni has combining class 240. + // Iota has combining class 0. + // Also we will be searching for the character with the smallest + // combining class to start at. + while (!aBase.AtEnd()) + { + aBase.EnterFoldedSequence(); + TChar ch = aBase.Current(); + TInt cl = TUnicode(TUint(ch)).GetCombiningClass(charDataSet); + if (cl == 0) + { + if (aBase.CurrentIsBaseFoldedFromCombiner()) + cl = 240; + else + break; + } + if (cl < iCurrentClass) + { + iCurrentClass = cl; + iCurrent = aBase; + iCurrentCount = length; + } + ++length; + aBase.Next(); + } + iRemaining = length; + iLength = length; + ASSERT(iLength == 0 || iCurrentClass < 256); + return length; + } + +/** +Set this iterator so that AtEnd() returns ETrue. +@internalComponent +*/ +void TFoldedSortedDecompIterator::Set() + { + iRemaining = 0; + } + +/** +@internalComponent +*/ +TBool TFoldedSortedDecompIterator::AtEnd() const + { + return iRemaining == 0; + } + +/** +@internalComponent +*/ +TChar TFoldedSortedDecompIterator::Current() const + { + ASSERT(!AtEnd()); + return iCurrent.Current(); + } + +/** +@internalComponent +*/ +void TFoldedSortedDecompIterator::Next() + { + ASSERT(!AtEnd()); + --iRemaining; + while (++iCurrentCount != iLength) + { + iCurrent.Next(); + if (::GetClass(iCurrent) == iCurrentClass) + return; + } + // We have not found any more of the same class, so we will look + // for the smallest one larger. + TInt minClass = 256; + TFoldedDecompIterator searcher(iStart); + TInt searchCount = 0; + while (searchCount != iLength) + { + TInt cl = ::GetClass(searcher); + if (iCurrentClass < cl && cl < minClass) + { + minClass = cl; + iCurrentCount = searchCount; + iCurrent = searcher; + } + ++searchCount; + searcher.Next(); + } + iCurrentClass = minClass; + ASSERT(minClass < 256 || AtEnd()); + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TFoldedCanonicalIterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +TFoldedCanonicalIterator::TFoldedCanonicalIterator(const TUTF32Iterator& a) + { + iBase.Set(a); + iSorted.Set(); + if(!iBase.AtEnd()) + { + iBase.EnterFoldedSequence(); + if (iBase.Current().GetCombiningClass() != 0 || iBase.CurrentIsBaseFoldedFromCombiner()) + { + iSorted.Set(iBase); + } + } + } + +/** +@internalComponent +*/ +TBool TFoldedCanonicalIterator::AtEnd() const + { + return iSorted.AtEnd() && iBase.AtEnd(); + } + +/** +@internalComponent +*/ +TChar TFoldedCanonicalIterator::Current() const + { + ASSERT(!iBase.AtEnd() || !iSorted.AtEnd()); + return iSorted.AtEnd()? iBase.Current() : iSorted.Current(); + } + +/** +@internalComponent +*/ +void TFoldedCanonicalIterator::Next(const TUnicodeDataSet* aCharDataSet) + { + ASSERT(!iBase.AtEnd() || !iSorted.AtEnd()); + if (!iSorted.AtEnd()) + { + iSorted.Next(); + return; + } + iBase.Next(); + if(!iBase.AtEnd()) + { + iBase.EnterFoldedSequence(); + if (TUnicode(TUint(iBase.Current())).GetCombiningClass(aCharDataSet) != 0 || iBase.CurrentIsBaseFoldedFromCombiner()) + { + iSorted.Set(iBase); + } + } + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// Folding - Global functions and structures +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +struct TEndTester + { + typedef enum {EGenuine, EWildcard} TType; + + inline TEndTester(TType aType) : + iType(aType) + { + } + + inline TBool operator()(const TFoldedDecompIterator& a) const + { + return iType == EGenuine ? a.AtEnd() : a.AtEndOrWildcard(); + } + +private: + TType iType; + + }; + +/** +Consumes as much of aCandidate as matches aSearchTerm up to the next '?' or +'*' wildcard or the end of aSearchTerm. +It is assumed that the search term begins with a base character. +Returns true if and only if the whole search term was matched +with a whole number of UTF16s in the candidate string. +On return of ETrue the candidate string iterator will have consumed the +matching characters the search term will have had all its matching characters +consumed. +@internalComponent +*/ +TBool ConsumeFoldedMatch(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm, + const TEndTester& aEndTester) + { + TBool assumeBase = ETrue; + TFoldedDecompIterator st(aSearchTerm); + TFoldedDecompIterator cs(aCandidateString); + while (!aEndTester(st)) + { + if (cs.AtEnd()) + return EFalse; + if (st.Match(cs)) + { + assumeBase = EFalse; + if (aEndTester(st)) + { + // We have a match... + if (cs.IsInFoldedSequence()) + // but it was against only part of a character + // in the original string, so we fail. + return EFalse; + aCandidateString = cs.BaseIterator(); + aSearchTerm = st.BaseIterator(); + return ETrue; + } + continue; + } + // did not match. We need to re-order canonically. + if (assumeBase) + // The first characters did not match.. do not bother + // to re-order. + return EFalse; + TFoldedSortedDecompIterator csc; + TInt cscLength = csc.Set(cs); + if (cscLength < 2) + // If there are less than two characters to be reordered, + // there is no hope of getting a match by re-ordering + return EFalse; + TFoldedSortedDecompIterator stc; + if (cscLength != stc.Set(st)) + // if the strings have differing numbers of characters, + // there can be no match + return EFalse; + while (!stc.AtEnd()) + { + ASSERT(!csc.AtEnd()); + if (stc.Current() != csc.Current()) + // well, we tried. + return EFalse; + stc.Next(); + csc.Next(); + } + } + // If the candidate string is in a folded sequence, then + // we should not accept the match, as we require all matches + // to be for a whole number of characters in the original string. + if (cs.IsInFoldedSequence()) + return EFalse; + aCandidateString = cs.BaseIterator(); + aSearchTerm = st.BaseIterator(); + return ETrue; + } + +/** +@internalComponent +*/ +TBool ConsumeFoldedMatchWholeGraphemes(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm, + const TEndTester& aEndTester) + { + if (!::ConsumeFoldedMatch(aCandidateString, aSearchTerm, aEndTester)) + return EFalse; + return aCandidateString.AtEnd() || ::IsBaseCharacter(aCandidateString.Current()); + } + +/** +@internalComponent +*/ +static TBool ConsumeGrapheme(TUTF32Iterator& a) + { + if (a.AtEnd()) + return EFalse; + a.Next(); + while (!a.AtEnd() && !::IsBaseCharacter(a.Current())) + a.Next(); + return ETrue; + } + +/** +@internalComponent +*/ +TBool MatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm) + { + TEndTester endTester(TEndTester::EWildcard); + while(::ConsumeFoldedMatchWholeGraphemes(aCandidateString, aSearchTerm, endTester)) + { + if (aSearchTerm.AtEnd() || aSearchTerm.Current() == '*') + return ETrue; + ASSERT(aSearchTerm.Current() == '?'); + aSearchTerm.Next(); + if (!::ConsumeGrapheme(aCandidateString)) + return EFalse; + } + return EFalse; + } + +/** +@internalComponent +*/ +TBool FindMatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm) + { + // match as many graphemes as there are leading ?s + while (!aSearchTerm.AtEnd() + && aSearchTerm.Current() != '*' && aSearchTerm.Current() == '?') + { + if (!::ConsumeGrapheme(aCandidateString)) + return EFalse; + aSearchTerm.Next(); + } + if (aSearchTerm.AtEnd() || aSearchTerm.Current() == '*') + return ETrue; + TChar firstCharOfSearchTerm = ::GetFirstFoldedChar(aSearchTerm.Current()); + TUTF32Iterator savedST(aSearchTerm); + while (aCandidateString.LocateFoldedBaseCharacter(firstCharOfSearchTerm)) + { + TUTF32Iterator savedCS = aCandidateString; + if (::MatchSectionFolded(aCandidateString, aSearchTerm)) + return ETrue; + aSearchTerm = savedST; + aCandidateString = savedCS; + aCandidateString.Next(); + } + return EFalse; + } + +/** +@internalComponent +*/ +TBool MatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd, + const TText16* aSearchTermStart, const TText16* aSearchTermEnd) + { + TUTF32Iterator candidate(aCandidateStringStart, aCandidateStringEnd); + TUTF32Iterator searchTerm(aSearchTermStart, aSearchTermEnd); + // First section of search term must match exactly at the start of the + // candidate string. + if (!::MatchSectionFolded(candidate, searchTerm)) + return EFalse; + + // If there was only one section, it must match the whole candidate string. + if (searchTerm.AtEnd()) + return candidate.AtEnd(); + + while (!searchTerm.AtEnd()) + { + searchTerm.Next(); + if (!::FindMatchSectionFolded(candidate, searchTerm)) + return EFalse; + } + + // The last section must match exactly at the end of the candidate string. + if (candidate.AtEnd()) // shortcut + return ETrue; + const TText16* searchTermLastSection = aSearchTermEnd; + while (searchTermLastSection != aSearchTermStart + && searchTermLastSection[-1] != '*') + --searchTermLastSection; + if (searchTermLastSection == aSearchTermEnd) + // last section is null, so trivially matches + return ETrue; + // Count graphemes by counting the number of base characters. + // The first one is assumed to start a grapheme. + TInt graphemeCount = 1; + for (const TText16* s = searchTermLastSection + 1; s != aSearchTermEnd; ++s) + { + if (::IsBaseCharacter(*s)) + ++graphemeCount; + } + // Count this many graphemes back in the candidate string + const TText16* candidateLastSection = aCandidateStringEnd; + while (graphemeCount != 0 + && candidateLastSection != aCandidateStringStart) + { + if (::IsBaseCharacter(*--candidateLastSection)) + --graphemeCount; + } + TUTF32Iterator last(candidateLastSection, aCandidateStringEnd); + TUTF32Iterator st(searchTermLastSection, aSearchTermEnd); + return ::MatchSectionFolded(last, st); + } + +/** +Implementation of MatchF +(slow if there is a match: MatchStringFolded is better, but does not return +the position of the match) +@internalComponent +*/ +TInt LocateMatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd, + const TText16* aSearchTermStart, const TText16* aSearchTermEnd) + { + // Quick shortcut for simple non-match + if (aSearchTermStart != aSearchTermEnd && *aSearchTermStart != '*') + { + if (aCandidateStringStart == aCandidateStringEnd) + return KErrNotFound; + // We won't bother with non-characters and surrogate pairs. + if (*aSearchTermStart != '?' + && *aSearchTermStart < 0xD800 + && *aCandidateStringStart < 0xD800 + && ::GetFirstFoldedChar(*aSearchTermStart) != ::GetFirstFoldedChar(*aCandidateStringStart)) + return KErrNotFound; + } + if (!::MatchStringFolded(aCandidateStringStart, aCandidateStringEnd, + aSearchTermStart, aSearchTermEnd)) + return KErrNotFound; + // find where it matches + while (aSearchTermStart != aSearchTermEnd && *aSearchTermStart == '*') + ++aSearchTermStart; + const TText16* end = aSearchTermStart; + while (end != aSearchTermEnd && *end != '*') + ++end; + // To preserve existing behaviour, a search term consisting of nothing + // but stars is considered to match at 0. + if (end == aSearchTermStart) + return 0; + for (const TText16* csSection = aCandidateStringStart; + csSection <= aCandidateStringEnd; ++csSection) + { + TUTF32Iterator cs(csSection, aCandidateStringEnd); + TUTF32Iterator st(aSearchTermStart, end); + if (::MatchSectionFolded(cs, st)) + { + // If this match must match exactly at the end, we must keep + // going. + // This could be a lot faster, with some optimizations. + if (end == aSearchTermEnd) + { + if (!cs.AtEnd()) + continue; + } + return csSection - aCandidateStringStart; + } + } + // this should never happen! + ASSERT(0); + return KErrNotFound; + } + +/** +Implementation of FindF +@internalComponent +*/ +TInt FindFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm) + { + //Empty aSearchTerm string? - Then return 0 - keep the new implementation functionally + //compatible with the old one. + if(aSearchTerm.Length() == 0) + { + return 0; + } + const TText16* candidateStartPosition = aCandidateString.CurrentPosition(); + TChar firstCharOfSearchTerm = ::GetFirstFoldedChar(aSearchTerm.Current()); + TUTF32Iterator savedST(aSearchTerm); + while (aCandidateString.LocateFoldedBaseCharacter(firstCharOfSearchTerm)) + { + TUTF32Iterator savedCS = aCandidateString; + TEndTester endTester(TEndTester::EGenuine); + if (::ConsumeFoldedMatchWholeGraphemes(aCandidateString, aSearchTerm, endTester)) + return savedCS.CurrentPosition() - candidateStartPosition; + aSearchTerm = savedST; + aCandidateString = savedCS; + aCandidateString.Next(); + } + return KErrNotFound; + } + +/** +Implementation of boolean CompareF +@internalComponent +*/ +TBool EqualsFolded(TUTF32Iterator& aLeft, TUTF32Iterator& aRight) + { + TEndTester endTester(TEndTester::EGenuine); + if (::ConsumeFoldedMatchWholeGraphemes(aLeft, aRight, endTester)) + return aLeft.AtEnd(); + return EFalse; + } + +/** +Implementation of tri-state CompareF +@internalComponent +*/ +TInt CompareFolded(const TUTF32Iterator& aLeft, const TUTF32Iterator& aRight) + { + TFoldedCanonicalIterator left(aLeft); + TFoldedCanonicalIterator right(aRight); + + const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet; + + while (!left.AtEnd()) + { + if (right.AtEnd()) + return 1; + TChar cr = right.Current(); + TChar cl = left.Current(); + if (cr != cl) + return cl - cr; + right.Next(charDataSet); + left.Next(charDataSet); + } + return right.AtEnd()? 0 : -1; + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// Composition/Decomposition - Global functions and structures +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +static TUTF32Iterator IndexToNonSingletonDecomposition(TInt aIndex) + { + const TText* start = KNonSingletonDecompositions + aIndex * 2; + if (*start != KLongD) + return TUTF32Iterator(start, start + 2, TUTF32Iterator::EStartsWithValidCharacter); + TInt longDecompIndex = start[1]; + start = KLongDecompositions + (longDecompIndex & 0xFFF); + return TUTF32Iterator(start, start + (longDecompIndex >> 12) + 3, TUTF32Iterator::EStartsWithValidCharacter); + } + +/** +Come up with a decomposition for the current value pointed at by the iterator +@internalComponent +*/ +static TBool Decompose(const TUTF32Iterator& aUTF32It, TUTF32Iterator& aOutIt) + { + TInt index = ::GetDecompositionIndex(aUTF32It.Current()); + TInt singletonIndex = index - (sizeof(KNonSingletonFolds)/sizeof(KNonSingletonFolds[0])/2); + const TInt SizeOfSingletonTable = sizeof(KSingletonDecompositions)/sizeof(KSingletonDecompositions[0])/2; + if(index < 0 || SizeOfSingletonTable <= singletonIndex) + { + aOutIt = aUTF32It.CurrentAsIterator(); + return EFalse;//There is not any valid decomposition + } + if(0 <= singletonIndex) + { + aOutIt = TUTF32Iterator(KSingletonDecompositions + singletonIndex); + } + else + { + aOutIt = ::IndexToNonSingletonDecomposition(index); + } + return ETrue;//Valid decomposition + } + +/** +@internalComponent +*/ +static TUTF32Iterator CharToUTF32Iterator(TChar aChar, TDes16& aBuf) + { + aBuf.Zero(); + if (aChar < 0x10000) + aBuf.Append(aChar); + else + { + aBuf.Append((aChar >> 10) + 0xD7C0); + aBuf.Append((aChar & 0x3FF) + 0xDC00); + } + const TText16* t = aBuf.Ptr(); + return TUTF32Iterator(t, t + aBuf.Length()); + } + +/** +@internalComponent +*/ +TBool DecomposeChar(TChar aCh, TPtrC16& aResult) + { + aResult.Set(NULL, 0); + TBuf16<2> srcBuf; + TUTF32Iterator it = ::CharToUTF32Iterator(aCh, srcBuf); + TBool res = ::Decompose(it, it); + if(res) + { + aResult.Set(it.CurrentPosition(), it.Length()); + } + return res; + } + +/** +Turn an index into the hash table known to point to a non-singleton +decomposition into that decomposition. +@internalComponent +*/ +static TUTF32Iterator HashIndexToDecomposition(TInt aIndex) + { + TUint32 v = KUnicodeToIndexHash[aIndex]; + ASSERT(v != 0); + TInt index = static_cast(v >> 20); + ASSERT(index < ARRAY_LENGTH(KNonSingletonDecompositions)/2); + return ::IndexToNonSingletonDecomposition(index); + } + +/** +Takes a start and (one past the) end index into KCompostionMapping +and a number of UTF16 characters (aLengthSoFar). All of the compositions +within the range must have their first aLengthSoFar UTF16 characters +matching. + +On entry, if aStart == aEnd then there is no possibility of a match so return +immediately with EFalse. To continue, aStart must be strictly less than aEnd. + +Afterwards, aStart and aEnd will be narrowed to all those compositions +where the aLengthSoFar'th UTF16 character matches aNextCharacter. +No further compositions existing is indicated by aStart == aEnd. + +@return ETrue if the composition at aStart is exactly of length aLengthSoFar + 1. +@internalComponent +*/ +static TBool RefineComposition(TInt& aStart, TInt& aEnd, TInt aLengthSoFar, TInt aNextCharacter) + { + if (aStart == aEnd) + return EFalse; + ASSERT((TUint)aStart < (TUint)aEnd); + ASSERT((TUint)aEnd <= (TUint)ARRAY_LENGTH(KCompositionMapping)); + TUTF32Iterator startIterator(::HashIndexToDecomposition(KCompositionMapping[aStart])); + if (startIterator.Length() == aLengthSoFar) + ++aStart; + + // Find a single example of a decomposition that is suitable + TInt mid; + TUTF32Iterator midIt; + for (;;) + { + if (aStart == aEnd) + return EFalse; + mid = aStart + ((aEnd - aStart) >> 1); + midIt = ::HashIndexToDecomposition(KCompositionMapping[mid]); + ASSERT(aLengthSoFar < midIt.Length()); + TInt midItChar = midIt[aLengthSoFar]; + if (midItChar < aNextCharacter) + aStart = mid + 1; + else if (aNextCharacter < midItChar) + aEnd = mid; + else + { + startIterator = midIt; + break; + } + } + + // FInd the first decomposition that does not match + TInt start2 = mid + 1; + while (start2 != aEnd) + { + ASSERT(start2 < aEnd); + TInt mid2 = start2 + ((aEnd - start2) >> 1); + midIt = ::HashIndexToDecomposition(KCompositionMapping[mid2]); + ASSERT(aLengthSoFar < midIt.Length()); + TInt midItChar = midIt[aLengthSoFar]; + ASSERT(aNextCharacter <= midItChar); + if (aNextCharacter < midItChar) + aEnd = mid2; + else + start2 = mid2 + 1; + } + + // Find the first decomposition that matches + while (aStart != mid) + { + ASSERT(aStart < mid); + TInt mid2 = aStart + ((mid - aStart) >> 1); + midIt = ::HashIndexToDecomposition(KCompositionMapping[mid2]); + ASSERT(aLengthSoFar < midIt.Length()); + TInt midItChar = midIt[aLengthSoFar]; + ASSERT(midItChar <= aNextCharacter); + if (midItChar < aNextCharacter) + aStart = mid2 + 1; + else + { + startIterator = midIt; + mid = mid2; + } + } + + return startIterator.Length() == (aLengthSoFar + 1); + } + +/** +@internalComponent +*/ +static TBool RefineCompositionUTF32(TInt& aStart, TInt& aEnd, TInt& aLengthSoFar, TChar aChar) + { + if (aChar < 0x10000) + return ::RefineComposition(aStart, aEnd, aLengthSoFar++, aChar); + ::RefineComposition(aStart, aEnd, aLengthSoFar++, (aChar >> 10) + 0xD7C0); + if (aStart == aEnd) + return EFalse; + return ::RefineComposition(aStart, aEnd, aLengthSoFar++, (aChar & 0x3FF) + 0xDC00); + } + +/** +Combine as many of the characters presented as possible into a single +character. +@return The number of characters successfully combined. +@param aCombined If a nonzero value is returned, this contains + the character that is that number of characters from the start of + aDes combined. +@internalComponent +*/ +TInt CombineAsMuchAsPossible(const TDesC16& aDes, TChar& aCombined) + { + TInt start = 0; + TInt end = sizeof(KCompositionMapping)/sizeof(KCompositionMapping[0]); + TInt length = 0; + TInt bestIndex = 0; + TInt bestLength = 0; + const TText16* ptr = aDes.Ptr(); + TUTF32Iterator input(ptr, ptr + aDes.Length()); + while (!input.AtEnd()) + { + if (::RefineCompositionUTF32(start, end, length, input.Current())) + { + bestIndex = start; + bestLength = length; + } + input.Next(); + } + if (bestLength == 0) + return 0; + aCombined = KUnicodeToIndexHash[KCompositionMapping[bestIndex]] & 0xFFFFF; + return bestLength; + } + +////////////////////////////////////////////////////////////////////////////////////////////// +// COLLATION +////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////////////////////// +// TDecompositionIterator class + +/** +@internalComponent +*/ +void TDecompositionIterator::Set(const TUTF32Iterator& a) + { + iBase = a; + if (!iBase.AtEnd()) + { + (void)::Decompose(iBase, iDecomposition); + } + } + +/** +@internalComponent +*/ +TDecompositionIterator::TDecompositionIterator(const TUTF32Iterator& a) + { + Set(a); + } + +/** +@internalComponent +*/ +TBool TDecompositionIterator::AtEnd() const + { + return iBase.AtEnd(); + } + +/** +@internalComponent +*/ +TChar TDecompositionIterator::Current() const + { + return iDecomposition.Current(); + } + +/** +@internalComponent +*/ +void TDecompositionIterator::Next() + { + ASSERT(!iBase.AtEnd() && !iDecomposition.AtEnd()); + iDecomposition.Next(); + if (!iDecomposition.AtEnd()) + return; + iBase.Next(); + if (!iBase.AtEnd()) + { + (void)::Decompose(iBase, iDecomposition); + } + } + +/** +@internalComponent +*/ +const TText16* TDecompositionIterator::CurrentPosition() const + { + return iBase.CurrentPosition(); + } + +/** +Find out the length and minimum combining class of +the current run of characters of nonzero combining class. +aMinClass and aMinClassPos are not written to if the return +value is 0. +aEndOfRun is written to with the final position of the iteration +if 0 is returned and aEndOfRun is non-null +@internalComponent +*/ +static TInt ReorderingRun(TInt& aMinClass, TDecompositionIterator& aMinClassPos, + const TDecompositionIterator& aStart, TBool* aOpenSequence, + TInt aMaxDisallowedClass = 0, TDecompositionIterator* aEndOfRun = 0) + { + TInt comclass = aStart.AtEnd()? 0 : aStart.Current().GetCombiningClass(); + if (comclass == 0) + { + if (aEndOfRun) + *aEndOfRun = aStart; + if (aOpenSequence) + *aOpenSequence = aStart.AtEnd(); + return 0; + } + aMinClass = 256; + TDecompositionIterator i = aStart; + TInt count = 0; + while (comclass != 0) + { + if (aMaxDisallowedClass < comclass) + { + if (comclass < aMinClass) + { + aMinClass = comclass; + aMinClassPos = i; + } + ++count; + } + i.Next(); + comclass = i.AtEnd()? 0 : i.Current().GetCombiningClass(); + } + if (count == 0 && aEndOfRun) + *aEndOfRun = i; + if (aOpenSequence) + *aOpenSequence = i.AtEnd(); + return count; + } + +////////////////////////////////////////////////////////////////////////////////////////////// +// TCanonicalDecompositionIterator class + +/** +@internalComponent +*/ +void TCanonicalDecompositionIterator::Set(const TUTF32Iterator& a) + { + iBase.Set(a); + iLastPosition = 0; + if (ReorderingRun(iCurrentCombiningClass, iCurrent, iBase, &iInOpenSequence) < 2) + iCurrentCombiningClass = 0; + } + +/** +@internalComponent +*/ +TBool TCanonicalDecompositionIterator::AtEnd() const + { + return iBase.AtEnd(); + } + +/** +@internalComponent +*/ +TChar TCanonicalDecompositionIterator::Current() const + { + return iCurrentCombiningClass? iCurrent.Current() : iBase.Current(); + } + +/** +@internalComponent +*/ +void TCanonicalDecompositionIterator::Next() + { + iLastPosition = iBase.CurrentPosition(); + if (iCurrentCombiningClass == 0) + { + iBase.Next(); + if (ReorderingRun(iCurrentCombiningClass, iCurrent, iBase, &iInOpenSequence) < 2) + iCurrentCombiningClass = 0; + return; + } + // Find the next character in the run with the same combining class + iCurrent.Next(); + TInt curclass = iCurrent.AtEnd()? 0 : iCurrent.Current().GetCombiningClass(); + while (curclass != 0) + { + if (curclass == iCurrentCombiningClass) + // success + return; + iCurrent.Next(); + curclass = iCurrent.AtEnd()? 0 : iCurrent.Current().GetCombiningClass(); + } + // There are none left in the current class. Find out what the next one is. + if (0 == ReorderingRun(iCurrentCombiningClass, iCurrent, iBase, 0, iCurrentCombiningClass, &iBase)) + iCurrentCombiningClass = 0; + } + +/** +@internalComponent +*/ +const TText16* TCanonicalDecompositionIterator::CurrentPositionIfAtCharacter() const + { + if (iCurrentCombiningClass != 0) + return 0; + const TText16* p = iBase.CurrentPosition(); + return iLastPosition == p? 0 : p; + } + +/** +@internalComponent +*/ +TBool TCanonicalDecompositionIterator::IsInOpenSequence() const + { + return iInOpenSequence; + } + +////////////////////////////////////////////////////////////////////////////////////////////// +// TCanonicalDecompositionIteratorCached class + +/** +@internalComponent +*/ +void TCanonicalDecompositionIteratorCached::Set(const TUTF32Iterator& a) + { + iBase.Set(a); + iCacheStart = 0; + iCacheSize = 0; + } + +/** +@internalComponent +*/ +TBool TCanonicalDecompositionIteratorCached::AtEnd() const + { + return iCacheSize == 0 && iBase.AtEnd(); + } + +/** +@internalComponent +*/ +void TCanonicalDecompositionIteratorCached::Next(TInt aOffset) + { + ASSERT(0 <= aOffset); + ASSERT(0 <= iCacheSize); + ASSERT(0 != iCacheSize || !iBase.AtEnd()); + if (aOffset <= iCacheSize) + { + iCacheSize -= aOffset; + iCacheStart = (iCacheStart + aOffset) & (KMaxLookAhead - 1); + return; + } + aOffset -= iCacheSize; + iCacheSize = 0; + while (aOffset != 0) + { + iBase.Next(); + --aOffset; + } + } + +/** +Get the character at the position of the iterator plus aOffset steps. +Returns -1 if we are looking too far ahead. +@internalComponent +*/ +TChar TCanonicalDecompositionIteratorCached::Get(TInt aOffset) + { + // should be assert debug: there is a chance this could go off with + // bad collation tables + ASSERT(aOffset <= KMaxLookAhead); + while (iCacheSize <= aOffset) + { + if (iBase.AtEnd()) + return TChar(static_cast (-1)); + TInt cachePos = (iCacheStart + iCacheSize) & (KMaxLookAhead - 1); + iCache[cachePos].iChar = iBase.Current(); + iCache[cachePos].iPos = iBase.CurrentPositionIfAtCharacter(); + ++iCacheSize; + iBase.Next(); + } + return iCacheSize == aOffset? iBase.Current() : iCache[(iCacheStart + aOffset) & (KMaxLookAhead - 1)].iChar; + } + +/** +If the current position in the original string is representable +as a pointer into it and we know what it is, return it. +@internalComponent +*/ +const TText16* TCanonicalDecompositionIteratorCached::CurrentPositionIfAtCharacter() const + { + if(iCacheSize == 0) + { + return iBase.CurrentPositionIfAtCharacter(); + } + return iCache[iCacheStart & (KMaxLookAhead - 1)].iPos; + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/compareimp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/compareimp.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,241 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Folding and decomposition implementation +// +// + +#ifndef __COMPAREIMP_H__ +#define __COMPAREIMP_H__ + +#include +#include + +//Forward declarations +class TUTF32Iterator; + +////////////////////////////////////////////////////////////////////////////////////////////// +// Global functions +////////////////////////////////////////////////////////////////////////////////////////////// + +TChar UTF16ToChar(const TText16* a); +TBool IsBaseCharacter(TChar); + +TBool MatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm); + +TBool FindMatchSectionFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm); + +TBool MatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd, + const TText16* aSearchTermStart, const TText16* aSearchTermEnd); + +TInt LocateMatchStringFolded(const TText16* aCandidateStringStart, const TText16* aCandidateStringEnd, + const TText16* aSearchTermStart, const TText16* aSearchTermEnd); + +TInt FindFolded(TUTF32Iterator& aCandidateString, TUTF32Iterator& aSearchTerm); + +TInt CompareFolded(const TUTF32Iterator& aLeft, const TUTF32Iterator& aRight); + +TInt CombineAsMuchAsPossible(const TDesC16& aDes, TChar& aCombined); + +TBool DecomposeChar(TChar aCh, TPtrC16& aResult); + +inline void SkipCombiningCharacters(TUTF32Iterator& aUTF32It); + +/** +Converts UTF16 into UTF32, ignoring non-characters and +unpaired surrogates and combining paired surrogates. +@internalComponent +*/ +class TUTF32Iterator + { +public: + enum TStartsWithValidCharacter { EStartsWithValidCharacter }; + inline TUTF32Iterator(); + inline explicit TUTF32Iterator(const TText16* aSingleton); + inline TUTF32Iterator(const TText16* aStart, const TText16* aEnd); + inline TUTF32Iterator(const TText16* aStart, const TText16* aEnd, TStartsWithValidCharacter); + + inline TUTF32Iterator CurrentAsIterator() const; + inline TBool AtEnd() const; + void Next(); + inline TChar Current() const; + TBool LocateFoldedBaseCharacter(TChar aChar); + inline const TText16* CurrentPosition() const; + inline TInt Length() const; + inline TInt operator[](TInt) const; + inline void SetStart(const TText16*); +private: + const TText16* iStart; + const TText16* iEnd; + TChar iCurrent; + }; + +////////////////////////////////////////////////////////////////////////////////////////////// +// FOLDING +////////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +class TFoldedDecompIterator + { +public: + inline TFoldedDecompIterator(); + explicit TFoldedDecompIterator(const TUTF32Iterator&); + inline void Set(const TUTF32Iterator&); + TBool AtEnd() const; + TBool AtEndOrWildcard() const; + TBool EnterFoldedSequence(); + TBool StrictEnterFoldedSequence(); + inline TBool IsInFoldedSequence() const; + TBool CurrentIsBaseFoldedFromCombiner() const; + TChar Current() const; + TBool Match(TChar aCode); + TBool Match(TFoldedDecompIterator& aThat); + void Next(); + inline TUTF32Iterator BaseIterator() const; +private: + TUTF32Iterator iOriginal; + TUTF32Iterator iFolded; + }; + +/** +Sorts sequences of combining characters with non-zero combining classes into +order of their combining classes. +@internalComponent +*/ +class TFoldedSortedDecompIterator + { +public: + inline TFoldedSortedDecompIterator(); + TInt Set(TFoldedDecompIterator &aBase); + void Set(); + TBool AtEnd() const; + TChar Current() const; + void Next(); + +private: + TFoldedDecompIterator iStart; // Starting code. + TInt iLength; // Length in decomposed codes. + TFoldedDecompIterator iCurrent; // Current code. + TInt iCurrentCount; // Number of decomposed codes iCurrent is past iStart + TInt iCurrentClass; // Current class being searched for. + TInt iRemaining; // Number of Next()s left + }; + +/** +Iterator that outputs canonically decomposed folded strings. +This is much slower than using the matching functions, so should only +be used where an ordering is required. +@internalComponent +*/ +class TFoldedCanonicalIterator + { +public: + TFoldedCanonicalIterator(const TUTF32Iterator&); + TBool AtEnd() const; + TChar Current() const; + void Next(const TUnicodeDataSet* aCharDataSet); +private: + TFoldedDecompIterator iBase; + TFoldedSortedDecompIterator iSorted; + }; + + +////////////////////////////////////////////////////////////////////////////////////////////// +// COLLATION +////////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +class TDecompositionIterator + { +public: + inline TDecompositionIterator(); + void Set(const TUTF32Iterator&); + explicit TDecompositionIterator(const TUTF32Iterator&); + TBool AtEnd() const; + TChar Current() const; + void Next(); + const TText16* CurrentPosition() const; +private: + TUTF32Iterator iBase; + TUTF32Iterator iDecomposition; + }; + +/** +@internalComponent +*/ +class TCanonicalDecompositionIterator + { +public: + inline TCanonicalDecompositionIterator(); + void Set(const TUTF32Iterator&); + TBool AtEnd() const; + TChar Current() const; + void Next(); + const TText16* CurrentPositionIfAtCharacter() const; + TBool IsInOpenSequence() const; +private: + TDecompositionIterator iBase; + // iBase.CurrentPosition() before the last move + const TText16* iLastPosition; + // If iCurrent is active, iCurrentCombiningClass + // is nonzero, and represents the combining class + // of the character it points to. + TInt iCurrentCombiningClass; + // contains true if more characters added to the end may change + // the characters currently being output + TBool iInOpenSequence; + // Iterator that looks for characters to be sorted. + TDecompositionIterator iCurrent; + }; + +/** +Iterator that gives the canonically decomposed form of +its input, and allows a limited amount of look-ahead (i.e. +peeking further into the decomposition without moving +the iterator) +@internalComponent +*/ +class TCanonicalDecompositionIteratorCached + { +public: + void Set(const TUTF32Iterator&); + TBool AtEnd() const; + // Advance aOffset characters. + void Next(TInt aOffset); + // Get the character at the position of the iterator plus aOffset steps. + // Returns FFFF if we are looking too far ahead. + TChar Get(TInt aOffset); + // If the current position in the original string is representable + // as a pointer into it and we know what it is, return it. + const TText16* CurrentPositionIfAtCharacter() const; +private: + // KMaxLookAhead must be a power of 2 + enum { KMaxLookAhead = 8 }; + TCanonicalDecompositionIterator iBase; + struct TCache + { + TChar iChar; + const TText16* iPos; + }; + TCache iCache[KMaxLookAhead + 1]; + TInt iCacheStart; + TInt iCacheSize; + }; + +#include "compareimp.inl" + +#endif //__COMPAREIMP_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/compareimp.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/compareimp.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,252 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @internalComponent +*/ +inline TBool IsSurrogate(TText a) + { + return 0xD800 == (a & 0xF800); + } + +/** +@internalComponent +*/ +inline TBool IsHighSurrogate(TText a) + { + return 0xD800 == (a & 0xFC00); + } + +/** +@internalComponent +*/ +inline TBool IsLowSurrogate(TText a) + { + return 0xDC00 == (a & 0xFC00); + } + +/** +@internalComponent +*/ +inline TChar PairSurrogates(TText aHigh, TText aLow) + { + return ((aHigh - 0xd7f7) << 10) + aLow; + } + +inline void SkipCombiningCharacters(TUTF32Iterator& aUTF32It) + { + while(!aUTF32It.AtEnd() && !::IsBaseCharacter(aUTF32It.Current())) + { + aUTF32It.Next(); + } + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TUTF32Iterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +inline TUTF32Iterator::TUTF32Iterator() : + iStart(0), + iEnd(0) + { + } + +/** +@internalComponent +*/ +inline TUTF32Iterator::TUTF32Iterator(const TText16* aSingleton) : + iStart(aSingleton), + iEnd(aSingleton + 1), + iCurrent(*aSingleton) + { + ASSERT((iCurrent & 0xFFFE) != 0xFFFE); + ASSERT(!::IsSurrogate(*aSingleton)); + } + +/** +@internalComponent +*/ +inline TUTF32Iterator::TUTF32Iterator(const TText16* aStart, const TText16* aEnd) : + iEnd(aEnd) + { + SetStart(aStart); + } + +/** +Sets the iteration to begin at aStart. +@param aStart New starting point of iteration. +@internalComponent +*/ +inline void TUTF32Iterator::SetStart(const TText16* aStart) + { + iStart = aStart; + if(iStart != iEnd) + { + if(::IsSurrogate(iEnd[-1])) + { + --iEnd; + if(iStart == iEnd) + { + return; + } + } + iCurrent = ::UTF16ToChar(iStart); + if(iCurrent == 0xFFFF) + { + Next(); + } + } + } + +/** +@internalComponent +*/ +inline TUTF32Iterator::TUTF32Iterator(const TText16* aStart, const TText16* aEnd, TStartsWithValidCharacter) : + iStart(aStart), + iEnd(aEnd) + { + ASSERT(iStart < iEnd); + if(::IsSurrogate(iEnd[-1])) + { + --iEnd; + } + iCurrent = ::UTF16ToChar(iStart); + ASSERT(iCurrent != 0xFFFF); + } + +/** +@internalComponent +*/ +inline TUTF32Iterator TUTF32Iterator::CurrentAsIterator() const + { + TUTF32Iterator retval(*this); + ASSERT(iStart != iEnd); + retval.iEnd = iStart + 1; + return retval; + } + +/** +@internalComponent +*/ +inline TBool TUTF32Iterator::AtEnd() const + { + return iEnd == iStart; + } + +/** +@internalComponent +*/ +inline TChar TUTF32Iterator::Current() const + { + ASSERT(iStart != iEnd); + ASSERT(iCurrent != 0xFFFF); + return iCurrent; + } + +/** +@internalComponent +*/ +inline const TText16* TUTF32Iterator::CurrentPosition() const + { + return iStart; + } + +/** +@internalComponent +*/ +inline TInt TUTF32Iterator::Length() const + { + return iEnd - iStart; + } + +/** +@internalComponent +*/ +inline TInt TUTF32Iterator::operator[](TInt a) const + { + return iStart[a]; + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TFoldedDecompIterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +inline TFoldedDecompIterator::TFoldedDecompIterator() + { + } + +/** +@internalComponent +*/ +inline TUTF32Iterator TFoldedDecompIterator::BaseIterator() const + { + return iOriginal; + } + +/** +@internalComponent +*/ +inline void TFoldedDecompIterator::Set(const TUTF32Iterator& a) + { + iOriginal = a; + } + +/** +@internalComponent +*/ +inline TBool TFoldedDecompIterator::IsInFoldedSequence() const + { + return !iFolded.AtEnd(); + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TFoldedSortedDecompIterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +inline TFoldedSortedDecompIterator::TFoldedSortedDecompIterator() + { + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TDecompositionIterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +inline TDecompositionIterator::TDecompositionIterator() + { + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// TCanonicalDecompositionIterator +//////////////////////////////////////////////////////////////////////////////////////////// + +/** +@internalComponent +*/ +inline TCanonicalDecompositionIterator::TCanonicalDecompositionIterator() + { + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/folddecomp.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/folddecomp.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1462 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Fold and decomposition tables. +// These tables are linked in the following way: +// KUnicodeToIndexHash is a hash table using double hashing for +// conflict resolution. The functions DecompositionHashStart and +// DecompositionHashStep give the start and step values for accessing +// the table. The first probe is at DecompositionHashStart and each +// subsequent probe is offset by DecompositionHashStep. Probes +// continue until either 0 is found (indicating that the Unicode value +// sought has no decompostion (i.e. decomposes to itself) or a value +// is found that has the sought Unicode value in its lower 20 bits. +// In this latter case, the upper 12 bits contain an index into +// one of the following tables, according to the following rules: +// If the Index is less than the length of KNonSingletonFolds / 2, +// it is an index into KNonSingletonFolds or +// KNonSingletonDecompositions (depending on whether you want to +// fold or not -- both tables are indexed the same). If the Index is +// greater than the length of KNonSingletonFolds / 2, then it is an +// index into KSingletonFolds or KSingletonDecompositions (depending +// on whether you want to fold or not). Now, KSingletonDecompositions +// is shorter than KSingletonFolds, so if you have an Index greater than +// the length of KSingletonDecompositions plus half the length of +// KNonSingletonFolds, you have a character that has a fold but no +// decomposition. +// In summary: +// Let Knsf be the length of KNonSingletonFolds / 2, +// let Ksd be the length of KSingletonDecompositions and +// let Ksf be the length of KSingletonFolds. +// Now if you want to fold a character and you have found +// its index 'i' from the KUnicodeToIndexHash, then; +// if (i < Knsf) then look up +// KNonSingletonFolds[i * 2] and KNonSingletonFolds[i * 2 + 1] +// else look up KSingletonFolds[i - Knsf] +// Or if you want to decompose the same character, then; +// if (i < Knsf) then look up KNonSingletonDecompositions[i * 2] +// and tKNonSingletonDecompositions[i * 2 + 1] +// else if (Knsf <= i < Knsf + Ksd) look up KSingletonDecompositions[i - Knsf] +// else there is no decomposition for this character. +// Your index into KSingletonDecompositions or KSingletonFolds +// yields a single value which is the decomposition or fold. +// The KNonSingletonFolds and KNonSingletonDecomposition +// tables are made up of pairs of values. Each pair is either a pair +// of Unicode values that constitute the fold or decomposition, or +// the first value is KLongD and the second has its top 4 bits as the +// length of the decomposition (or folded decomposition) minus 3, +// and its bottom 12 bits as the index into KLongDecompositions +// of where you can find this decomposition. +// KLongDecompositions simply contains UTF-16 (Unicode) for +// all the decomposed and folded sequences longer than 4 bytes long. +// +// + +// Hash table mapping unicode values to indices into the other tables +const unsigned long KUnicodeToIndexHash[4096] = + { + 0x3f702000, 0x3f802001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33f01026, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x51f00041, 0x52000042, 0x52100043, 0x52200044, 0x52300045, 0x52400046, 0x52500047, + 0x52600048, 0x52700049, 0x5280004a, 0x5290004b, 0x3700304c, 0x52a0004c, 0x3710304e, 0x52b0004d, + 0x37203050, 0x52c0004e, 0x37303052, 0x52d0004f, 0x37403054, 0x52e00050, 0x37503056, 0x52f00051, + 0x37603058, 0x53000052, 0x3770305a, 0x53100053, 0x3780305c, 0x53200054, 0x3790305e, 0x53300055, + 0x37a03060, 0x53400056, 0x37b03062, 0x53500057, 0x53600058, 0x37c03065, 0x53700059, 0x37d03067, + 0x5380005a, 0x37e03069, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x37f03070, 0x38003071, 0x00000000, 0x38103073, 0x38203074, 0x00000000, 0x38303076, 0x38403077, + 0x00000000, 0x38503079, 0x3860307a, 0x00000000, 0x3870307c, 0x3880307d, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x36f03094, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3890309e, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x38b030ac, 0x00000000, 0x38c030ae, 0x00000000, + 0x38d030b0, 0x00000000, 0x38e030b2, 0x00000000, 0x38f030b4, 0x539000b5, 0x390030b6, 0x00000000, + 0x391030b8, 0x00000000, 0x392030ba, 0x00000000, 0x393030bc, 0x00000000, 0x394030be, 0x00000000, + 0x003000c0, 0x004000c1, 0x005000c2, 0x00a000c3, 0x013000c4, 0x016000c5, 0x53a000c6, 0x028000c7, + 0x030000c8, 0x031000c9, 0x032000ca, 0x03d000cb, 0x058000cc, 0x059000cd, 0x05a000ce, 0x05f000cf, + 0x39a030d0, 0x07a000d1, 0x081000d2, 0x082000d3, 0x083000d4, 0x088000d5, 0x092000d6, 0x39f030d7, + 0x53b000d0, 0x0bf000d9, 0x0c0000da, 0x0c1000db, 0x0c7000dc, 0x0e8000dd, 0x53c000d8, 0x53d000de, + 0x0f6000e0, 0x0f7000e1, 0x0f8000e2, 0x0fd000e3, 0x106000e4, 0x109000e5, 0x00000000, 0x11a000e7, + 0x122000e8, 0x123000e9, 0x124000ea, 0x12f000eb, 0x14b000ec, 0x14c000ed, 0x14d000ee, 0x151000ef, + 0x00000000, 0x16d000f1, 0x174000f2, 0x175000f3, 0x176000f4, 0x17b000f5, 0x185000f6, 0x3a4030f7, + 0x3a5030f8, 0x1b3000f9, 0x1b4000fa, 0x1b5000fb, 0x1bb000fc, 0x1dd000fd, 0x3a8030fe, 0x1e2000ff, + 0x00b00100, 0x0fe00101, 0x00c00102, 0x0ff00103, 0x02000104, 0x11200105, 0x02400106, 0x11600107, + 0x02500108, 0x11700109, 0x0260010a, 0x1180010b, 0x0270010c, 0x1190010d, 0x02b0010e, 0x11d0010f, + 0x53e00110, 0x00000000, 0x03800112, 0x12a00113, 0x03b00114, 0x12d00115, 0x03c00116, 0x12e00117, + 0x04600118, 0x13800119, 0x03f0011a, 0x1310011b, 0x04b0011c, 0x13d0011d, 0x04d0011e, 0x13f0011f, + 0x04e00120, 0x14000121, 0x05000122, 0x14200123, 0x05100124, 0x14300125, 0x3f902126, 0x53f00126, + 0x05b00128, 0x14e00129, 0x05c0012a, 0x0170212b, 0x05d0012c, 0x14f0012b, 0x0660012e, 0x1500012d, + 0x05e00130, 0x1580012f, 0x54000131, 0x54100132, 0x06800134, 0x15a00135, 0x06c00136, 0x15f00137, + 0x00000000, 0x06e00139, 0x1610013a, 0x0720013b, 0x1650013c, 0x06f0013d, 0x1620013e, 0x5420013f, + 0x00000000, 0x54300141, 0x00000000, 0x07900143, 0x16c00144, 0x07e00145, 0x17100146, 0x07c00147, + 0x16f00148, 0x00000000, 0x5440014a, 0x00000000, 0x08c0014c, 0x17f0014d, 0x08f0014e, 0x1820014f, + 0x09500150, 0x18800151, 0x54500152, 0x00000000, 0x0a500154, 0x19800155, 0x0ac00156, 0x19f00157, + 0x0a700158, 0x19a00159, 0x0ae0015a, 0x1a10015b, 0x0b00015c, 0x1a30015d, 0x0b70015e, 0x1aa0015f, + 0x0b200160, 0x1a500161, 0x0bc00162, 0x1b000163, 0x0b900164, 0x1ad00165, 0x54600166, 0x62a02167, + 0x0c200168, 0x1b600169, 0x0c40016a, 0x1b80016b, 0x0c60016c, 0x1ba0016d, 0x0cd0016e, 0x1c10016f, + 0x0ce00170, 0x1c200171, 0x0da00172, 0x1ce00173, 0x0e100174, 0x1d500175, 0x0e900176, 0x1de00177, + 0x0ed00178, 0x0f000179, 0x1e60017a, 0x0f20017b, 0x1e80017c, 0x0f30017d, 0x1e90017e, 0x5470017f, + 0x00000000, 0x54800181, 0x54900182, 0x00000000, 0x54a00184, 0x00000000, 0x54b00186, 0x54c00187, + 0x00000000, 0x54d00189, 0x54e0018a, 0x54f0018b, 0x00000000, 0x00000000, 0x5500018e, 0x5510018f, + 0x55200190, 0x55300191, 0x00000000, 0x55400193, 0x55500194, 0x00000000, 0x55600196, 0x55700197, + 0x55800198, 0x00000000, 0x3460219a, 0x3470219b, 0x5590019c, 0x55a0019d, 0x00000000, 0x55b0019f, + 0x099001a0, 0x18c001a1, 0x55c001a2, 0x00000000, 0x55d001a4, 0x4d90f9dc, 0x55e001a6, 0x55f001a7, + 0x00000000, 0x4550f958, 0x560001a9, 0x00000000, 0x561001ac, 0x00000000, 0x348021ae, 0x0d2001af, + 0x1c6001b0, 0x562001ae, 0x563001b1, 0x564001b2, 0x565001b3, 0x566001b5, 0x00000000, 0x567001b7, + 0x568001b8, 0x00000000, 0x00000000, 0x00000000, 0x569001bc, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4da0f9dd, 0x56a001c4, 0x56b001c5, 0x56c001c7, + 0x4560f959, 0x56d001c8, 0x56e001ca, 0x56f001cb, 0x00000000, 0x019001cd, 0x10b001ce, 0x062001cf, + 0x154001d0, 0x096001d1, 0x189001d2, 0x0cf001d3, 0x1c3001d4, 0x0ca001d5, 0x1be001d6, 0x0c9001d7, + 0x1bd001d8, 0x0cb001d9, 0x1bf001da, 0x0c8001db, 0x1bc001dc, 0x00000000, 0x014001de, 0x107001df, + 0x012001e0, 0x105001e1, 0x1f2001e2, 0x1f5001e3, 0x570001e4, 0x00000000, 0x04f001e6, 0x141001e7, + 0x06a001e8, 0x15d001e9, 0x0a1001ea, 0x194001eb, 0x0a2001ec, 0x195001ed, 0x1f8001ee, 0x1f9001ef, + 0x15b001f0, 0x571001f1, 0x572001f2, 0x00000000, 0x04a001f4, 0x13c001f5, 0x573001f6, 0x574001f7, + 0x078001f8, 0x16b001f9, 0x018001fa, 0x10a001fb, 0x1f1001fc, 0x1f4001fd, 0x1f3001fe, 0x1f6001ff, + 0x01a00200, 0x10c00201, 0x01b00202, 0x10d00203, 0x04000204, 0x13200205, 0x04100206, 0x13300207, + 0x06300208, 0x15500209, 0x0640020a, 0x1560020b, 0x0970020c, 0x18a0020d, 0x0980020e, 0x18b0020f, + 0x0a800210, 0x19b00211, 0x0a900212, 0x19c00213, 0x0d000214, 0x1c400215, 0x0d100216, 0x1c500217, + 0x0b600218, 0x1a900219, 0x0bb0021a, 0x1af0021b, 0x5750021c, 0x00000000, 0x0540021e, 0x1460021f, + 0x00000000, 0x00000000, 0x57600222, 0x00000000, 0x34f02224, 0x4590f95c, 0x01100226, 0x10400227, + 0x04400228, 0x13600229, 0x0930022a, 0x1860022b, 0x08a0022c, 0x17d0022d, 0x0900022e, 0x1830022f, + 0x09100230, 0x18400231, 0x0eb00232, 0x1e000233, 0x57700224, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x35102241, 0x00000000, 0x00000000, 0x35202244, 0x00000000, 0x00000000, 0x35302247, + 0x00000000, 0x35402249, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00102260, 0x00000000, 0x35602262, 0x45b0f95e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3550226d, 0x0000226e, 0x0020226f, + 0x35702270, 0x35802271, 0x00000000, 0x00000000, 0x35902274, 0x35a02275, 0x00000000, 0x00000000, + 0x35b02278, 0x35c02279, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x35d02280, 0x35e02281, 0x45c0f95f, 0x00000000, 0x36102284, 0x36202285, 0x00000000, 0x00000000, + 0x36302288, 0x36402289, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x367022ac, 0x368022ad, 0x369022ae, 0x36a022af, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x35f022e0, 0x360022e1, 0x365022e2, 0x366022e3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x36b022ea, 0x36c022eb, 0x36d022ec, 0x36e022ed, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x3fb02329, 0x3fc0232a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x3ef00340, 0x3f000341, 0x00000000, 0x3f100343, 0x3a900344, 0x57800345, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f200374, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f30037e, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1ee00385, 0x1fc00386, 0x3f400387, + 0x21100388, 0x21b00389, 0x22f0038a, 0x00000000, 0x23d0038c, 0x00000000, 0x2470038e, 0x2500038f, + 0x2a600390, 0x57900391, 0x57a00392, 0x57b00393, 0x57c00394, 0x57d00395, 0x57e00396, 0x57f00397, + 0x58000398, 0x58100399, 0x5820039a, 0x5830039b, 0x5840039c, 0x5850039d, 0x5860039e, 0x5870039f, + 0x588003a0, 0x589003a1, 0x00000000, 0x58a003a3, 0x58b003a4, 0x58c003a5, 0x58d003a6, 0x58e003a7, + 0x58f003a8, 0x590003a9, 0x232003aa, 0x24a003ab, 0x266003ac, 0x27e003ad, 0x288003ae, 0x29f003af, + 0x2c3003b0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x591003c2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x2a3003ca, 0x2c1003cb, 0x2b3003cc, 0x2bd003cd, 0x2d2003ce, 0x00000000, + 0x592003d0, 0x593003d1, 0x00000000, 0x2e7003d3, 0x2e8003d4, 0x594003d5, 0x595003d6, 0x00000000, + 0x00000000, 0x00000000, 0x596003da, 0x00000000, 0x597003dc, 0x00000000, 0x598003de, 0x00000000, + 0x599003e0, 0x00000000, 0x59a003e2, 0x00000000, 0x59b003e4, 0x00000000, 0x59c003e6, 0x00000000, + 0x59d003e8, 0x00000000, 0x59e003ea, 0x00000000, 0x59f003ec, 0x00000000, 0x5a0003ee, 0x00000000, + 0x5a1003f0, 0x5a2003f1, 0x5a3003f2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x2ed00400, 0x2ef00401, 0x5a400402, 0x2ec00403, 0x5a500404, 0x5a600405, 0x5a700406, 0x2e900407, + 0x5a800408, 0x5a900409, 0x5aa0040a, 0x5ab0040b, 0x2f70040c, 0x2f30040d, 0x2fa0040e, 0x5ac0040f, + 0x5ad00410, 0x5ae00411, 0x45a0f95d, 0x5af00412, 0x5b000413, 0x5b100414, 0x5b200415, 0x5b300416, + 0x5b400417, 0x2f500419, 0x5b500418, 0x5b60041a, 0x5b70041b, 0x5b80041c, 0x5b90041d, 0x5ba0041e, + 0x5bb0041f, 0x5bc00420, 0x5bd00421, 0x5be00422, 0x5bf00423, 0x5c000424, 0x5c100425, 0x5c200426, + 0x5c300427, 0x5c400428, 0x5c500429, 0x5c60042a, 0x5c70042b, 0x5c80042c, 0x5c90042d, 0x5ca0042e, + 0x5cb0042f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x30b00439, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x30300450, 0x30500451, 0x00000000, 0x30200453, 0x00000000, 0x00000000, 0x00000000, 0x31600457, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x30d0045c, 0x3090045d, 0x3100045e, 0x00000000, + 0x5cc00460, 0x00000000, 0x5cd00462, 0x00000000, 0x5ce00464, 0x00000000, 0x5cf00466, 0x00000000, + 0x5d000468, 0x00000000, 0x5d10046a, 0x00000000, 0x5d20046c, 0x00000000, 0x5d30046e, 0x00000000, + 0x5d400470, 0x00000000, 0x5d500472, 0x00000000, 0x5d600474, 0x00000000, 0x31700476, 0x31800477, + 0x5d700478, 0x00000000, 0x5d80047a, 0x00000000, 0x5d90047c, 0x00000000, 0x5da0047e, 0x00000000, + 0x5db00480, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x5dc0048c, 0x00000000, 0x5dd0048e, 0x00000000, + 0x5de00490, 0x00000000, 0x5df00492, 0x00000000, 0x5e000494, 0x00000000, 0x5e100496, 0x00000000, + 0x5e200498, 0x00000000, 0x5e30049a, 0x00000000, 0x5e40049c, 0x00000000, 0x5e50049e, 0x00000000, + 0x5e6004a0, 0x00000000, 0x5e7004a2, 0x00000000, 0x5e8004a4, 0x00000000, 0x5e9004a6, 0x00000000, + 0x5ea004a8, 0x00000000, 0x5eb004aa, 0x00000000, 0x5ec004ac, 0x00000000, 0x5ed004ae, 0x00000000, + 0x5ee004b0, 0x00000000, 0x5ef004b2, 0x00000000, 0x5f0004b4, 0x00000000, 0x5f1004b6, 0x634024b7, + 0x5f2004b8, 0x636024b9, 0x5f3004ba, 0x638024bb, 0x5f4004bc, 0x63a024bd, 0x5f5004be, 0x63c024bf, + 0x63d024c0, 0x2f0004c1, 0x306004c2, 0x5f6004c3, 0x641024c4, 0x642024c5, 0x643024c6, 0x5f7004c7, + 0x645024c8, 0x646024c9, 0x647024ca, 0x5f8004cb, 0x649024cc, 0x64a024cd, 0x64b024ce, 0x64c024cf, + 0x2ea004d0, 0x300004d1, 0x2eb004d2, 0x301004d3, 0x5f9004d4, 0x00000000, 0x2ee004d6, 0x304004d7, + 0x5fa004d8, 0x00000000, 0x319004da, 0x31a004db, 0x2f1004dc, 0x307004dd, 0x2f2004de, 0x308004df, + 0x5fb004e0, 0x00000000, 0x2f4004e2, 0x30a004e3, 0x2f6004e4, 0x30c004e5, 0x2f8004e6, 0x30e004e7, + 0x5fc004e8, 0x00000000, 0x31b004ea, 0x31c004eb, 0x2ff004ec, 0x315004ed, 0x2f9004ee, 0x30f004ef, + 0x2fb004f0, 0x311004f1, 0x2fc004f2, 0x312004f3, 0x2fd004f4, 0x313004f5, 0x00000000, 0x00000000, + 0x2fe004f8, 0x314004f9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x64d0ff21, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x64e0ff22, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x5fd00531, 0x5fe00532, 0x5ff00533, 0x60000534, 0x60100535, 0x60200536, 0x60300537, + 0x60400538, 0x60500539, 0x6060053a, 0x6070053b, 0x6080053c, 0x6090053d, 0x60a0053e, 0x60b0053f, + 0x60c00540, 0x395030c0, 0x60d00541, 0x60e00542, 0x60f00543, 0x61000544, 0x61100545, 0x61200546, + 0x61300547, 0x61400548, 0x61500549, 0x6160054a, 0x6170054b, 0x6180054c, 0x6190054d, 0x396030c2, + 0x61a0054e, 0x61b0054f, 0x61c00550, 0x61d00551, 0x61e00552, 0x61f00553, 0x62000554, 0x62100555, + 0x62200556, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6500ff24, 0x00000000, 0x00000000, + 0x00000000, 0x4c80f9cb, 0x00000000, 0x00000000, 0x397030c5, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x398030c7, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6510ff25, 0x00000000, 0x00000000, 0x00000000, + 0x399030c9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x6520ff26, 0x00000000, 0x00000000, 0x4c90f9cc, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x39b030d1, 0x00000000, 0x6530ff27, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x39c030d3, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x39d030d4, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x3fa0212a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x6540ff28, 0x00000000, 0x39e030d6, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x3a0030d9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3a1030da, + 0x6550ff29, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3a2030dc, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3a3030dd, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6560ff2a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x31e00622, 0x31f00623, 0x32100624, 0x32000625, 0x32200626, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6570ff2b, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6580ff2c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x65d0ff31, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6590ff2d, 0x00000000, 0x00000000, 0x3eb0fb4b, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x65a0ff2e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x38a030f4, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x65b0ff2f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x325006c0, 0x00000000, 0x323006c2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x3a6030f9, 0x65c0ff30, 0x00000000, 0x324006d3, 0x00000000, 0x00000000, 0x00000000, 0x3a7030fa, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x62302160, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62402161, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x62502162, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x3ec0fb4c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62702164, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x62802165, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62902166, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x62b02168, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62c02169, 0x65e0ff32, + 0x00000000, 0x00000000, 0x00000000, 0x62d0216a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x62e0216b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62f0216c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x6300216d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6310216e, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6320216f, 0x00000000, 0x65f0ff33, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff0f902, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6600ff34, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6610ff35, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x6620ff36, 0x00000000, 0x00000000, 0x00000000, 0x633024b6, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x635024b8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x637024ba, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x6630ff37, 0x00000000, 0x00000000, 0x639024bc, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x63b024be, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x63e024c1, 0x00000000, + 0x00000000, 0x6640ff38, 0x00000000, 0x63f024c2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x640024c3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x4040f907, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x644024c7, 0x00000000, 0x00000000, 0x00000000, + 0x6650ff39, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x648024cb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6660ff3a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4090f90c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x50d0fa15, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x3fd0f900, 0x3fe0f901, 0x349021cd, 0x4000f903, 0x4010f904, 0x4020f905, 0x4030f906, 0x34b021ce, + 0x4050f908, 0x4060f909, 0x4070f90a, 0x4080f90b, 0x34a021cf, 0x40a0f90d, 0x40b0f90e, 0x40c0f90f, + 0x40d0f910, 0x40e0f911, 0x40f0f912, 0x4100f913, 0x4110f914, 0x4120f915, 0x4130f916, 0x4140f917, + 0x4150f918, 0x4160f919, 0x4170f91a, 0x4180f91b, 0x4190f91c, 0x41a0f91d, 0x41b0f91e, 0x41c0f91f, + 0x41d0f920, 0x41e0f921, 0x41f0f922, 0x4200f923, 0x4210f924, 0x4220f925, 0x4230f926, 0x4240f927, + 0x4250f928, 0x32600929, 0x4270f92a, 0x4280f92b, 0x4290f92c, 0x42a0f92d, 0x42b0f92e, 0x42c0f92f, + 0x42d0f930, 0x32700931, 0x42f0f932, 0x4300f933, 0x32800934, 0x4320f935, 0x4330f936, 0x4340f937, + 0x4350f938, 0x4360f939, 0x4370f93a, 0x4380f93b, 0x4390f93c, 0x43a0f93d, 0x43b0f93e, 0x43c0f93f, + 0x43d0f940, 0x43e0f941, 0x43f0f942, 0x4400f943, 0x4410f944, 0x4420f945, 0x4430f946, 0x4440f947, + 0x4450f948, 0x4460f949, 0x4470f94a, 0x4480f94b, 0x4490f94c, 0x44a0f94d, 0x44b0f94e, 0x44c0f94f, + 0x44d0f950, 0x44e0f951, 0x44f0f952, 0x4500f953, 0x4510f954, 0x4520f955, 0x4530f956, 0x4540f957, + 0x3aa00958, 0x3ab00959, 0x3ac0095a, 0x3ad0095b, 0x3ae0095c, 0x3af0095d, 0x3b00095e, 0x3b10095f, + 0x45d0f960, 0x45e0f961, 0x45f0f962, 0x4600f963, 0x4610f964, 0x4620f965, 0x4630f966, 0x4640f967, + 0x4650f968, 0x4660f969, 0x4670f96a, 0x4680f96b, 0x4690f96c, 0x46a0f96d, 0x46b0f96e, 0x46c0f96f, + 0x46d0f970, 0x46e0f971, 0x46f0f972, 0x4700f973, 0x4710f974, 0x4720f975, 0x4730f976, 0x4740f977, + 0x4750f978, 0x4760f979, 0x4770f97a, 0x4780f97b, 0x4790f97c, 0x47a0f97d, 0x47b0f97e, 0x47c0f97f, + 0x47d0f980, 0x47e0f981, 0x47f0f982, 0x4800f983, 0x4810f984, 0x4820f985, 0x4830f986, 0x4840f987, + 0x4850f988, 0x4860f989, 0x4870f98a, 0x4880f98b, 0x4890f98c, 0x48a0f98d, 0x48b0f98e, 0x48c0f98f, + 0x48d0f990, 0x48e0f991, 0x48f0f992, 0x4900f993, 0x4910f994, 0x4920f995, 0x4930f996, 0x4940f997, + 0x4950f998, 0x4960f999, 0x4970f99a, 0x4980f99b, 0x4990f99c, 0x49a0f99d, 0x49b0f99e, 0x49c0f99f, + 0x49d0f9a0, 0x49e0f9a1, 0x49f0f9a2, 0x4a00f9a3, 0x4a10f9a4, 0x4a20f9a5, 0x4a30f9a6, 0x4a40f9a7, + 0x4a50f9a8, 0x4a60f9a9, 0x4a70f9aa, 0x4a80f9ab, 0x4a90f9ac, 0x4aa0f9ad, 0x4ab0f9ae, 0x4ac0f9af, + 0x4ad0f9b0, 0x4ae0f9b1, 0x4af0f9b2, 0x4b00f9b3, 0x4b10f9b4, 0x4b20f9b5, 0x4b30f9b6, 0x4b40f9b7, + 0x4b50f9b8, 0x4b60f9b9, 0x4b70f9ba, 0x4b80f9bb, 0x4b90f9bc, 0x4ba0f9bd, 0x4bb0f9be, 0x4bc0f9bf, + 0x4bd0f9c0, 0x4be0f9c1, 0x4bf0f9c2, 0x4c00f9c3, 0x4c10f9c4, 0x4c20f9c5, 0x4c30f9c6, 0x4c40f9c7, + 0x4c50f9c8, 0x4c60f9c9, 0x4c70f9ca, 0x329009cb, 0x32a009cc, 0x4ca0f9cd, 0x4cb0f9ce, 0x4cc0f9cf, + 0x4cd0f9d0, 0x4ce0f9d1, 0x4cf0f9d2, 0x4d00f9d3, 0x4d10f9d4, 0x4d20f9d5, 0x4d30f9d6, 0x4d40f9d7, + 0x4d50f9d8, 0x4d60f9d9, 0x4d70f9da, 0x4d80f9db, 0x3b2009dc, 0x3b3009dd, 0x4db0f9de, 0x3b4009df, + 0x4dd0f9e0, 0x4de0f9e1, 0x4df0f9e2, 0x4e00f9e3, 0x4e10f9e4, 0x4e20f9e5, 0x4e30f9e6, 0x4e40f9e7, + 0x4e50f9e8, 0x4e60f9e9, 0x4e70f9ea, 0x4e80f9eb, 0x4e90f9ec, 0x4ea0f9ed, 0x4eb0f9ee, 0x4ec0f9ef, + 0x4ed0f9f0, 0x4ee0f9f1, 0x4ef0f9f2, 0x4f00f9f3, 0x4f10f9f4, 0x4f20f9f5, 0x4f30f9f6, 0x4f40f9f7, + 0x4f50f9f8, 0x4f60f9f9, 0x4f70f9fa, 0x4f80f9fb, 0x4f90f9fc, 0x4fa0f9fd, 0x4fb0f9fe, 0x4fc0f9ff, + 0x4fd0fa00, 0x4fe0fa01, 0x4ff0fa02, 0x5000fa03, 0x5010fa04, 0x5020fa05, 0x5030fa06, 0x5040fa07, + 0x5050fa08, 0x5060fa09, 0x5070fa0a, 0x5080fa0b, 0x5090fa0c, 0x50a0fa0d, 0x00000000, 0x00000000, + 0x50b0fa10, 0x00000000, 0x50c0fa12, 0x00000000, 0x00000000, 0x34c02204, 0x50e0fa16, 0x50f0fa17, + 0x5100fa18, 0x5110fa19, 0x5120fa1a, 0x5130fa1b, 0x5140fa1c, 0x5150fa1d, 0x5160fa1e, 0x00000000, + 0x5170fa20, 0x00000000, 0x5180fa22, 0x00000000, 0x00000000, 0x4dc0f9df, 0x51a0fa26, 0x00000000, + 0x00000000, 0x00000000, 0x51b0fa2a, 0x51c0fa2b, 0x51d0fa2c, 0x51e0fa2d, 0x34d02209, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x3b500a33, 0x00000000, 0x00000000, 0x3b600a36, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x34e0220c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x3b700a59, 0x3b800a5a, 0x3b900a5b, 0x00000000, 0x00000000, 0x3ba00a5e, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4570f95a, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x5190fa25, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x4580f95b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x35002226, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x31d0fb1d, 0x00000000, 0x3ce0fb1f, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x3cf0fb2a, 0x3d00fb2b, 0x3d10fb2c, 0x3d20fb2d, 0x3d30fb2e, 0x3d40fb2f, + 0x3d50fb30, 0x3d60fb31, 0x3d70fb32, 0x3d80fb33, 0x3d90fb34, 0x3da0fb35, 0x3db0fb36, 0x00000000, + 0x3dc0fb38, 0x3dd0fb39, 0x3de0fb3a, 0x3df0fb3b, 0x3e00fb3c, 0x00000000, 0x3e10fb3e, 0x00000000, + 0x3e20fb40, 0x3e30fb41, 0x00000000, 0x3e40fb43, 0x3e50fb44, 0x00000000, 0x3e60fb46, 0x3e70fb47, + 0x32c00b48, 0x3e90fb49, 0x3ea0fb4a, 0x32b00b4b, 0x32d00b4c, 0x3ed0fb4d, 0x3ee0fb4e, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x64f0ff23, 0x00000000, 0x00000000, 0x3bb00b5c, 0x3bc00b5d, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x32e00b94, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x32f00bca, 0x33100bcb, 0x33000bcc, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x4260f929, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33200c48, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x62602163, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33300cc0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33600cc7, + 0x33700cc8, 0x00000000, 0x33400cca, 0x33500ccb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x42e0f931, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x33800d4a, 0x33a00d4b, 0x33900d4c, 0x4310f934, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x3f501fbe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x3e80fb48, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x33b00dda, 0x00000000, 0x33c00ddc, 0x33d00ddd, 0x33e00dde, 0x3f601fef, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x01f01e00, 0x11101e01, 0x02101e02, 0x11301e03, 0x02201e04, 0x11401e05, 0x02301e06, 0x11501e07, + 0x02901e08, 0x11b01e09, 0x02a01e0a, 0x11c01e0b, 0x02c01e0c, 0x11e01e0d, 0x02f01e0e, 0x12101e0f, + 0x02d01e10, 0x11f01e11, 0x02e01e12, 0x12001e13, 0x03901e14, 0x12b01e15, 0x03a01e16, 0x12c01e17, + 0x04701e18, 0x13901e19, 0x04801e1a, 0x13a01e1b, 0x04501e1c, 0x13701e1d, 0x04901e1e, 0x13b01e1f, + 0x04c01e20, 0x13e01e21, 0x05201e22, 0x14401e23, 0x05501e24, 0x14701e25, 0x05301e26, 0x14501e27, + 0x05601e28, 0x14801e29, 0x05701e2a, 0x14901e2b, 0x06701e2c, 0x15901e2d, 0x06001e2e, 0x15201e2f, + 0x06901e30, 0x15c01e31, 0x06b01e32, 0x15e01e33, 0x06d01e34, 0x16001e35, 0x07001e36, 0x16301e37, + 0x07101e38, 0x16401e39, 0x07401e3a, 0x16701e3b, 0x07301e3c, 0x16601e3d, 0x07501e3e, 0x16801e3f, + 0x07601e40, 0x16901e41, 0x07701e42, 0x16a01e43, 0x07b01e44, 0x16e01e45, 0x07d01e46, 0x17001e47, + 0x08001e48, 0x17301e49, 0x07f01e4a, 0x17201e4b, 0x08901e4c, 0x17c01e4d, 0x08b01e4e, 0x17e01e4f, + 0x08d01e50, 0x18001e51, 0x08e01e52, 0x18101e53, 0x0a301e54, 0x19601e55, 0x0a401e56, 0x19701e57, + 0x0a601e58, 0x19901e59, 0x0aa01e5a, 0x19d01e5b, 0x0ab01e5c, 0x19e01e5d, 0x0ad01e5e, 0x1a001e5f, + 0x0b101e60, 0x1a401e61, 0x0b401e62, 0x1a701e63, 0x0af01e64, 0x1a201e65, 0x0b301e66, 0x1a601e67, + 0x0b501e68, 0x1a801e69, 0x0b801e6a, 0x1ab01e6b, 0x0ba01e6c, 0x1ae01e6d, 0x0be01e6e, 0x1b201e6f, + 0x0bd01e70, 0x1b101e71, 0x0d901e72, 0x1cd01e73, 0x0dc01e74, 0x1d001e75, 0x0db01e76, 0x1cf01e77, + 0x0c301e78, 0x1b701e79, 0x0c501e7a, 0x1b901e7b, 0x0dd01e7c, 0x1d101e7d, 0x0de01e7e, 0x1d201e7f, + 0x0df01e80, 0x1d301e81, 0x0e001e82, 0x1d401e83, 0x0e301e84, 0x1d701e85, 0x0e201e86, 0x1d601e87, + 0x0e401e88, 0x1d901e89, 0x0e501e8a, 0x1da01e8b, 0x0e601e8c, 0x1db01e8d, 0x0ec01e8e, 0x1e101e8f, + 0x0f101e90, 0x1e701e91, 0x0f401e92, 0x1ea01e93, 0x0f501e94, 0x1eb01e95, 0x14a01e96, 0x1ac01e97, + 0x1d801e98, 0x1e401e99, 0x00000000, 0x1f701e9b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x01c01ea0, 0x10e01ea1, 0x01501ea2, 0x10801ea3, 0x00701ea4, 0x0fa01ea5, 0x00601ea6, 0x0f901ea7, + 0x00901ea8, 0x0fc01ea9, 0x00801eaa, 0x0fb01eab, 0x01d01eac, 0x10f01ead, 0x00e01eae, 0x10101eaf, + 0x00d01eb0, 0x10001eb1, 0x01001eb2, 0x10301eb3, 0x00f01eb4, 0x10201eb5, 0x01e01eb6, 0x11001eb7, + 0x04201eb8, 0x13401eb9, 0x03e01eba, 0x13001ebb, 0x03701ebc, 0x12901ebd, 0x03401ebe, 0x12601ebf, + 0x03301ec0, 0x12501ec1, 0x03601ec2, 0x12801ec3, 0x03501ec4, 0x12701ec5, 0x04301ec6, 0x13501ec7, + 0x06101ec8, 0x15301ec9, 0x06501eca, 0x15701ecb, 0x09f01ecc, 0x19201ecd, 0x09401ece, 0x18701ecf, + 0x08501ed0, 0x17801ed1, 0x08401ed2, 0x17701ed3, 0x08701ed4, 0x17a01ed5, 0x08601ed6, 0x17901ed7, + 0x0a001ed8, 0x19301ed9, 0x09b01eda, 0x18e01edb, 0x09a01edc, 0x18d01edd, 0x09d01ede, 0x19001edf, + 0x09c01ee0, 0x18f01ee1, 0x09e01ee2, 0x19101ee3, 0x0d801ee4, 0x1cc01ee5, 0x0cc01ee6, 0x1c001ee7, + 0x0d401ee8, 0x1c801ee9, 0x0d301eea, 0x1c701eeb, 0x0d601eec, 0x1ca01eed, 0x0d501eee, 0x1c901eef, + 0x0d701ef0, 0x1cb01ef1, 0x0e701ef2, 0x1dc01ef3, 0x0ef01ef4, 0x1e501ef5, 0x0ee01ef6, 0x1e301ef7, + 0x0ea01ef8, 0x1df01ef9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x26a01f00, 0x27201f01, 0x26b01f02, 0x27301f03, 0x26d01f04, 0x27501f05, 0x26f01f06, 0x27701f07, + 0x1ff01f08, 0x20701f09, 0x20001f0a, 0x20801f0b, 0x20201f0c, 0x20a01f0d, 0x20401f0e, 0x20c01f0f, + 0x28001f10, 0x28301f11, 0x28101f12, 0x28401f13, 0x28201f14, 0x28501f15, 0x00000000, 0x00000000, + 0x21301f18, 0x21601f19, 0x21401f1a, 0x21701f1b, 0x21501f1c, 0x21801f1d, 0x00000000, 0x00000000, + 0x28b01f20, 0x29301f21, 0x28c01f22, 0x29401f23, 0x28e01f24, 0x29601f25, 0x29001f26, 0x29801f27, + 0x21c01f28, 0x22401f29, 0x21d01f2a, 0x22501f2b, 0x21f01f2c, 0x22701f2d, 0x22101f2e, 0x22901f2f, + 0x2a801f30, 0x2ac01f31, 0x2a901f32, 0x2ad01f33, 0x2aa01f34, 0x2ae01f35, 0x2ab01f36, 0x2af01f37, + 0x23301f38, 0x23701f39, 0x23401f3a, 0x23801f3b, 0x23501f3c, 0x23901f3d, 0x23601f3e, 0x23a01f3f, + 0x2b401f40, 0x2b701f41, 0x2b501f42, 0x2b801f43, 0x2b601f44, 0x2b901f45, 0x3bd00f43, 0x00000000, + 0x23e01f48, 0x24101f49, 0x23f01f4a, 0x24201f4b, 0x24001f4c, 0x24301f4d, 0x3be00f4d, 0x00000000, + 0x2c601f50, 0x2ca01f51, 0x2c701f52, 0x2cb01f53, 0x2c801f54, 0x2cc01f55, 0x2c901f56, 0x2cd01f57, + 0x3bf00f52, 0x24b01f59, 0x3c000f57, 0x24c01f5b, 0x3c100f5c, 0x24d01f5d, 0x00000000, 0x24e01f5f, + 0x2d401f60, 0x2dc01f61, 0x2d501f62, 0x2dd01f63, 0x2d701f64, 0x2df01f65, 0x2d901f66, 0x2e101f67, + 0x25201f68, 0x25a01f69, 0x25301f6a, 0x25b01f6b, 0x25501f6c, 0x25d01f6d, 0x25701f6e, 0x25f01f6f, + 0x26301f70, 0x26501f71, 0x27d01f72, 0x27f01f73, 0x28601f74, 0x28901f75, 0x29e01f76, 0x2a001f77, + 0x2b101f78, 0x2b201f79, 0x2bc01f7a, 0x2be01f7b, 0x2cf01f7c, 0x2d101f7d, 0x3c200f69, 0x3c300f73, + 0x27101f80, 0x27901f81, 0x26c01f82, 0x27401f83, 0x26e01f84, 0x27601f85, 0x27001f86, 0x27801f87, + 0x20601f88, 0x20e01f89, 0x20101f8a, 0x20901f8b, 0x20301f8c, 0x20b01f8d, 0x20501f8e, 0x20d01f8f, + 0x29201f90, 0x29a01f91, 0x28d01f92, 0x29501f93, 0x28f01f94, 0x29701f95, 0x29101f96, 0x29901f97, + 0x22301f98, 0x22b01f99, 0x21e01f9a, 0x22601f9b, 0x22001f9c, 0x22801f9d, 0x22201f9e, 0x22a01f9f, + 0x2db01fa0, 0x2e301fa1, 0x2d601fa2, 0x2de01fa3, 0x2d801fa4, 0x2e001fa5, 0x2da01fa6, 0x2e201fa7, + 0x25901fa8, 0x26101fa9, 0x25401faa, 0x25c01fab, 0x25601fac, 0x25e01fad, 0x25801fae, 0x26001faf, + 0x26901fb0, 0x26801fb1, 0x26401fb2, 0x27c01fb3, 0x26701fb4, 0x3c400f75, 0x27a01fb6, 0x27b01fb7, + 0x1fe01fb8, 0x1fd01fb9, 0x1fa01fba, 0x1fb01fbb, 0x20f01fbc, 0x3c500f76, 0x3c600f78, 0x3c700f81, + 0x3c800f93, 0x1ef01fc1, 0x28701fc2, 0x29d01fc3, 0x28a01fc4, 0x3c900f9d, 0x29b01fc6, 0x29c01fc7, + 0x21001fc8, 0x21201fc9, 0x21901fca, 0x21a01fcb, 0x22c01fcc, 0x34001fcd, 0x34101fce, 0x34201fcf, + 0x2a201fd0, 0x2a101fd1, 0x2a401fd2, 0x2a501fd3, 0x3ca00fa2, 0x3cb00fa7, 0x2b001fd6, 0x2a701fd7, + 0x23101fd8, 0x23001fd9, 0x22d01fda, 0x22e01fdb, 0x3cc00fac, 0x34301fdd, 0x34401fde, 0x34501fdf, + 0x2c001fe0, 0x2bf01fe1, 0x2c201fe2, 0x2c401fe3, 0x2ba01fe4, 0x2bb01fe5, 0x2ce01fe6, 0x2c501fe7, + 0x24901fe8, 0x24801fe9, 0x24501fea, 0x24601feb, 0x24401fec, 0x1ec01fed, 0x1ed01fee, 0x3cd00fb9, + 0x00000000, 0x00000000, 0x2d001ff2, 0x2e601ff3, 0x2d301ff4, 0x00000000, 0x2e401ff6, 0x2e501ff7, + 0x23b01ff8, 0x23c01ff9, 0x24f01ffa, 0x25101ffb, 0x26201ffc, 0x1f001ffd, 0x00000000, 0x00000000 + }; + +// Hash table access functions +const int KDecompositionHashBitmask = 0xfff; + +inline int DecompositionHashStart(long a) + { + return a & 0xfff; + } + +inline int DecompositionHashStep(long a) + { + a *= a >> 12; + return ((a<<1) + 1) & 0xfff; + } + +// Table mapping KNonSingletonDecompositions to the hash table entry that +// indexes it +const unsigned short KCompositionMapping[] = + { + 0x026e, 0x0260, 0x026f, 0x00c0, 0x00c1, 0x00c2, 0x0ea6, 0x0ea4, + 0x0eaa, 0x0ea8, 0x00c3, 0x0100, 0x0102, 0x0eb0, 0x0eae, 0x0eb4, + 0x0eb2, 0x0226, 0x01e0, 0x00c4, 0x01de, 0x0ea2, 0x00c5, 0x012b, + 0x01fa, 0x01cd, 0x0200, 0x0202, 0x0ea0, 0x0eac, 0x0eb6, 0x0e00, + 0x0104, 0x0e02, 0x0e04, 0x0e06, 0x0106, 0x0108, 0x010a, 0x010c, + 0x00c7, 0x0e08, 0x0e0a, 0x010e, 0x0e0c, 0x0e10, 0x0e12, 0x0e0e, + 0x00c8, 0x00c9, 0x00ca, 0x0ec0, 0x0ebe, 0x0ec4, 0x0ec2, 0x0ebc, + 0x0112, 0x0e14, 0x0e16, 0x0114, 0x0116, 0x00cb, 0x0eba, 0x011a, + 0x0204, 0x0206, 0x0eb8, 0x0ec6, 0x0228, 0x0e1c, 0x0118, 0x0e18, + 0x0e1a, 0x0e1e, 0x01f4, 0x011c, 0x0e20, 0x011e, 0x0120, 0x01e6, + 0x0122, 0x0124, 0x0e22, 0x0e26, 0x021e, 0x0e24, 0x0e28, 0x0e2a, + 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, + 0x0e2e, 0x0ec8, 0x01cf, 0x0208, 0x020a, 0x0eca, 0x012e, 0x0e2c, + 0x0134, 0x0e30, 0x01e8, 0x0e32, 0x0136, 0x0e34, 0x0139, 0x013d, + 0x0e36, 0x0e38, 0x013b, 0x0e3c, 0x0e3a, 0x0e3e, 0x0e40, 0x0e42, + 0x01f8, 0x0143, 0x00d1, 0x0e44, 0x0147, 0x0e46, 0x0145, 0x0e4a, + 0x0e48, 0x00d2, 0x00d3, 0x00d4, 0x0ed2, 0x0ed0, 0x0ed6, 0x0ed4, + 0x00d5, 0x0e4c, 0x022c, 0x0e4e, 0x014c, 0x0e50, 0x0e52, 0x014e, + 0x022e, 0x0230, 0x00d6, 0x022a, 0x0ece, 0x0150, 0x01d1, 0x020c, + 0x020e, 0x01a0, 0x0edc, 0x0eda, 0x0ee0, 0x0ede, 0x0ee2, 0x0ecc, + 0x0ed8, 0x01ea, 0x01ec, 0x0e54, 0x0e56, 0x0154, 0x0e58, 0x0158, + 0x0210, 0x0212, 0x0e5a, 0x0e5c, 0x0156, 0x0e5e, 0x015a, 0x0e64, + 0x015c, 0x0e60, 0x0160, 0x0e66, 0x0e62, 0x0e68, 0x0218, 0x015e, + 0x0e6a, 0x0164, 0x0e6c, 0x021a, 0x0162, 0x0e70, 0x0e6e, 0x00d9, + 0x00da, 0x00db, 0x0168, 0x0e78, 0x016a, 0x0e7a, 0x016c, 0x00dc, + 0x01db, 0x01d7, 0x01d5, 0x01d9, 0x0ee6, 0x016e, 0x0170, 0x01d3, + 0x0214, 0x0216, 0x01af, 0x0eea, 0x0ee8, 0x0eee, 0x0eec, 0x0ef0, + 0x0ee4, 0x0e72, 0x0172, 0x0e76, 0x0e74, 0x0e7c, 0x0e7e, 0x0e80, + 0x0e82, 0x0174, 0x0e86, 0x0e84, 0x0e88, 0x0e8a, 0x0e8c, 0x0ef2, + 0x00dd, 0x0176, 0x0ef8, 0x0232, 0x0e8e, 0x0178, 0x0ef6, 0x0ef4, + 0x0179, 0x0e90, 0x017b, 0x017d, 0x0e92, 0x0e94, 0x00e0, 0x00e1, + 0x00e2, 0x0ea7, 0x0ea5, 0x0eab, 0x0ea9, 0x00e3, 0x0101, 0x0103, + 0x0eb1, 0x0eaf, 0x0eb5, 0x0eb3, 0x0227, 0x01e1, 0x00e4, 0x01df, + 0x0ea3, 0x00e5, 0x01fb, 0x01ce, 0x0201, 0x0203, 0x0ea1, 0x0ead, + 0x0eb7, 0x0e01, 0x0105, 0x0e03, 0x0e05, 0x0e07, 0x0107, 0x0109, + 0x010b, 0x010d, 0x00e7, 0x0e09, 0x0e0b, 0x010f, 0x0e0d, 0x0e11, + 0x0e13, 0x0e0f, 0x00e8, 0x00e9, 0x00ea, 0x0ec1, 0x0ebf, 0x0ec5, + 0x0ec3, 0x0ebd, 0x0113, 0x0e15, 0x0e17, 0x0115, 0x0117, 0x00eb, + 0x0ebb, 0x011b, 0x0205, 0x0207, 0x0eb9, 0x0ec7, 0x0229, 0x0e1d, + 0x0119, 0x0e19, 0x0e1b, 0x0e1f, 0x01f5, 0x011d, 0x0e21, 0x011f, + 0x0121, 0x01e7, 0x0123, 0x0125, 0x0e23, 0x0e27, 0x021f, 0x0e25, + 0x0e29, 0x0e2b, 0x0e96, 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012d, + 0x012f, 0x00ef, 0x0e2f, 0x0ec9, 0x01d0, 0x0209, 0x020b, 0x0ecb, + 0x0131, 0x0e2d, 0x0135, 0x01f0, 0x0e31, 0x01e9, 0x0e33, 0x0137, + 0x0e35, 0x013a, 0x013e, 0x0e37, 0x0e39, 0x013c, 0x0e3d, 0x0e3b, + 0x0e3f, 0x0e41, 0x0e43, 0x01f9, 0x0144, 0x00f1, 0x0e45, 0x0148, + 0x0e47, 0x0146, 0x0e4b, 0x0e49, 0x00f2, 0x00f3, 0x00f4, 0x0ed3, + 0x0ed1, 0x0ed7, 0x0ed5, 0x00f5, 0x0e4d, 0x022d, 0x0e4f, 0x014d, + 0x0e51, 0x0e53, 0x014f, 0x022f, 0x0231, 0x00f6, 0x022b, 0x0ecf, + 0x0151, 0x01d2, 0x020d, 0x020f, 0x01a1, 0x0edd, 0x0edb, 0x0ee1, + 0x0edf, 0x0ee3, 0x0ecd, 0x0ed9, 0x01eb, 0x01ed, 0x0e55, 0x0e57, + 0x0155, 0x0e59, 0x0159, 0x0211, 0x0213, 0x0e5b, 0x0e5d, 0x0157, + 0x0e5f, 0x015b, 0x0e65, 0x015d, 0x0e61, 0x0161, 0x0e67, 0x0e63, + 0x0e69, 0x0219, 0x015f, 0x0e6b, 0x0e97, 0x0165, 0x0e6d, 0x021b, + 0x0163, 0x0e71, 0x0e6f, 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x0e79, + 0x016b, 0x0e7b, 0x016d, 0x00fc, 0x01dc, 0x01d8, 0x01d6, 0x01da, + 0x0ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0x01b0, 0x0eeb, + 0x0ee9, 0x0eef, 0x0eed, 0x0ef1, 0x0ee5, 0x0e73, 0x0173, 0x0e77, + 0x0e75, 0x0e7d, 0x0e7f, 0x0e81, 0x0e83, 0x0175, 0x0e87, 0x0e85, + 0x0e98, 0x0e89, 0x0e8b, 0x0e8d, 0x0ef3, 0x00fd, 0x0177, 0x0ef9, + 0x0233, 0x0e8f, 0x00ff, 0x0ef7, 0x0e99, 0x0ef5, 0x017a, 0x0e91, + 0x017c, 0x017e, 0x0e93, 0x0e95, 0x0fed, 0x0fee, 0x0385, 0x0fc1, + 0x0ffd, 0x01fc, 0x01e2, 0x01fe, 0x01fd, 0x01e3, 0x01ff, 0x0e9b, + 0x01ee, 0x01ef, 0x0fba, 0x0fbb, 0x0386, 0x0fb9, 0x0fb8, 0x0f08, + 0x0f0a, 0x0f8a, 0x0f0c, 0x0f8c, 0x0f0e, 0x0f8e, 0x0f88, 0x0f09, + 0x0f0b, 0x0f8b, 0x0f0d, 0x0f8d, 0x0f0f, 0x0f8f, 0x0f89, 0x0fbc, + 0x0fc8, 0x0388, 0x0fc9, 0x0f18, 0x0f1a, 0x0f1c, 0x0f19, 0x0f1b, + 0x0f1d, 0x0fca, 0x0fcb, 0x0389, 0x0f28, 0x0f2a, 0x0f9a, 0x0f2c, + 0x0f9c, 0x0f2e, 0x0f9e, 0x0f98, 0x0f29, 0x0f2b, 0x0f9b, 0x0f2d, + 0x0f9d, 0x0f2f, 0x0f9f, 0x0f99, 0x0fcc, 0x0fda, 0x0fdb, 0x038a, + 0x0fd9, 0x0fd8, 0x03aa, 0x0f38, 0x0f3a, 0x0f3c, 0x0f3e, 0x0f39, + 0x0f3b, 0x0f3d, 0x0f3f, 0x0ff8, 0x0ff9, 0x038c, 0x0f48, 0x0f4a, + 0x0f4c, 0x0f49, 0x0f4b, 0x0f4d, 0x0fec, 0x0fea, 0x0feb, 0x038e, + 0x0fe9, 0x0fe8, 0x03ab, 0x0f59, 0x0f5b, 0x0f5d, 0x0f5f, 0x0ffa, + 0x038f, 0x0ffb, 0x0f68, 0x0f6a, 0x0faa, 0x0f6c, 0x0fac, 0x0f6e, + 0x0fae, 0x0fa8, 0x0f69, 0x0f6b, 0x0fab, 0x0f6d, 0x0fad, 0x0f6f, + 0x0faf, 0x0fa9, 0x0ffc, 0x0f70, 0x0fb2, 0x0f71, 0x03ac, 0x0fb4, + 0x0fb1, 0x0fb0, 0x0f00, 0x0f02, 0x0f82, 0x0f04, 0x0f84, 0x0f06, + 0x0f86, 0x0f80, 0x0f01, 0x0f03, 0x0f83, 0x0f05, 0x0f85, 0x0f07, + 0x0f87, 0x0f81, 0x0fb6, 0x0fb7, 0x0fb3, 0x0f72, 0x03ad, 0x0f73, + 0x0f10, 0x0f12, 0x0f14, 0x0f11, 0x0f13, 0x0f15, 0x0f74, 0x0fc2, + 0x03ae, 0x0f75, 0x0fc4, 0x0f20, 0x0f22, 0x0f92, 0x0f24, 0x0f94, + 0x0f26, 0x0f96, 0x0f90, 0x0f21, 0x0f23, 0x0f93, 0x0f25, 0x0f95, + 0x0f27, 0x0f97, 0x0f91, 0x0fc6, 0x0fc7, 0x0fc3, 0x0f76, 0x03af, + 0x0f77, 0x0fd1, 0x0fd0, 0x03ca, 0x0fd2, 0x0fd3, 0x0390, 0x0fd7, + 0x0f30, 0x0f32, 0x0f34, 0x0f36, 0x0f31, 0x0f33, 0x0f35, 0x0f37, + 0x0fd6, 0x0f78, 0x0f79, 0x03cc, 0x0f40, 0x0f42, 0x0f44, 0x0f41, + 0x0f43, 0x0f45, 0x0fe4, 0x0fe5, 0x0f7a, 0x03cd, 0x0f7b, 0x0fe1, + 0x0fe0, 0x03cb, 0x0fe2, 0x03b0, 0x0fe3, 0x0fe7, 0x0f50, 0x0f52, + 0x0f54, 0x0f56, 0x0f51, 0x0f53, 0x0f55, 0x0f57, 0x0fe6, 0x0f7c, + 0x0ff2, 0x0f7d, 0x03ce, 0x0ff4, 0x0f60, 0x0f62, 0x0fa2, 0x0f64, + 0x0fa4, 0x0f66, 0x0fa6, 0x0fa0, 0x0f61, 0x0f63, 0x0fa3, 0x0f65, + 0x0fa5, 0x0f67, 0x0fa7, 0x0fa1, 0x0ff6, 0x0ff7, 0x0ff3, 0x03d3, + 0x03d4, 0x0407, 0x04d0, 0x04d2, 0x0403, 0x0400, 0x04d6, 0x0401, + 0x04c1, 0x04dc, 0x04de, 0x040d, 0x04e2, 0x0419, 0x04e4, 0x040c, + 0x04e6, 0x04ee, 0x040e, 0x04f0, 0x04f2, 0x04f4, 0x04f8, 0x04ec, + 0x04d1, 0x04d3, 0x0453, 0x0450, 0x04d7, 0x0451, 0x04c2, 0x04dd, + 0x04df, 0x045d, 0x04e3, 0x0439, 0x04e5, 0x045c, 0x04e7, 0x04ef, + 0x045e, 0x04f1, 0x04f3, 0x04f5, 0x04f9, 0x04ed, 0x0457, 0x0476, + 0x0477, 0x04da, 0x04db, 0x04ea, 0x04eb, 0x0b1d, 0x0622, 0x0623, + 0x0625, 0x0624, 0x0626, 0x06c2, 0x06d3, 0x06c0, 0x0929, 0x0931, + 0x0934, 0x09cb, 0x09cc, 0x0b4b, 0x0b48, 0x0b4c, 0x0b94, 0x0bca, + 0x0bcc, 0x0bcb, 0x0c48, 0x0cc0, 0x0cca, 0x0ccb, 0x0cc7, 0x0cc8, + 0x0d4a, 0x0d4c, 0x0d4b, 0x0dda, 0x0ddc, 0x0ddd, 0x0dde, 0x0026, + 0x0fcd, 0x0fce, 0x0fcf, 0x0fdd, 0x0fde, 0x0fdf, 0x019a, 0x019b, + 0x01ae, 0x0902, 0x090c, 0x0907, 0x0a15, 0x0a2e, 0x0a3d, 0x0224, + 0x0abf, 0x0241, 0x0244, 0x0247, 0x0249, 0x026d, 0x0262, 0x0270, + 0x0271, 0x0274, 0x0275, 0x0278, 0x0279, 0x0280, 0x0281, 0x02e0, + 0x02e1, 0x0284, 0x0285, 0x0288, 0x0289, 0x02e2, 0x02e3, 0x02ac, + 0x02ad, 0x02ae, 0x02af, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x0094, + 0x004c, 0x004e, 0x0050, 0x0052, 0x0054, 0x0056, 0x0058, 0x005a, + 0x005c, 0x005e, 0x0060, 0x0062, 0x0065, 0x0067, 0x0069, 0x0070, + 0x0071, 0x0073, 0x0074, 0x0076, 0x0077, 0x0079, 0x007a, 0x007c, + 0x007d, 0x009e, 0x06ad, 0x00ac, 0x00ae, 0x00b0, 0x00b2, 0x00b4, + 0x00b6, 0x00b8, 0x00ba, 0x00bc, 0x00be, 0x0541, 0x054f, 0x0564, + 0x0572, 0x0580, 0x00d0, 0x05b8, 0x05c6, 0x05cd, 0x05db, 0x00d7, + 0x05f0, 0x05f7, 0x0605, 0x060c, 0x00f7, 0x00f8, 0x06d0, 0x06d7, + 0x00fe + }; + +// Table containing all the decomposition and folding strings longer +// than 2 UTF16 characters +const unsigned short KLongDecompositions[] = + { + 0x0397, 0x0313, 0x0300, 0x0345, 0x03B1, 0x0313, 0x0300, 0x0345, + 0x0397, 0x0314, 0x0300, 0x0345, 0x03C9, 0x0313, 0x0300, 0x0345, + 0x0391, 0x0314, 0x0342, 0x0345, 0x03B7, 0x0313, 0x0342, 0x0345, + 0x0397, 0x0314, 0x0301, 0x0345, 0x03B7, 0x0314, 0x0342, 0x0345, + 0x03A9, 0x0313, 0x0342, 0x0345, 0x03B1, 0x0313, 0x0301, 0x0345, + 0x03B1, 0x0314, 0x0300, 0x0345, 0x03B1, 0x0314, 0x0301, 0x0345, + 0x0391, 0x0313, 0x0342, 0x0345, 0x03A9, 0x0314, 0x0342, 0x0345, + 0x0397, 0x0313, 0x0301, 0x0345, 0x03C9, 0x0314, 0x0342, 0x0345, + 0x03C9, 0x0313, 0x0342, 0x0345, 0x0397, 0x0314, 0x0342, 0x0345, + 0x0397, 0x0313, 0x0342, 0x0345, 0x03B7, 0x0314, 0x0301, 0x0345, + 0x0391, 0x0314, 0x0301, 0x0345, 0x03A9, 0x0314, 0x0301, 0x0345, + 0x03B7, 0x0313, 0x0301, 0x0345, 0x03B7, 0x0314, 0x0300, 0x0345, + 0x0391, 0x0313, 0x0301, 0x0345, 0x0391, 0x0314, 0x0300, 0x0345, + 0x03B1, 0x0314, 0x0342, 0x0345, 0x03A9, 0x0313, 0x0301, 0x0345, + 0x03A9, 0x0314, 0x0300, 0x0345, 0x03B7, 0x0313, 0x0300, 0x0345, + 0x03C9, 0x0314, 0x0301, 0x0345, 0x0391, 0x0313, 0x0300, 0x0345, + 0x03B1, 0x0313, 0x0342, 0x0345, 0x03A9, 0x0313, 0x0300, 0x0345, + 0x03C9, 0x0313, 0x0301, 0x0345, 0x03C9, 0x0314, 0x0300, 0x0345, + 0x03C5, 0x0313, 0x0342, 0x039F, 0x0314, 0x0301, 0x0075, 0x031B, + 0x0309, 0x0041, 0x0306, 0x0309, 0x0061, 0x0302, 0x0309, 0x0043, + 0x0327, 0x0301, 0x03B1, 0x0313, 0x0345, 0x0045, 0x0302, 0x0300, + 0x006F, 0x0304, 0x0300, 0x0045, 0x0302, 0x0301, 0x006F, 0x0304, + 0x0301, 0x0399, 0x0314, 0x0300, 0x03B5, 0x0314, 0x0300, 0x0045, + 0x0302, 0x0303, 0x0399, 0x0314, 0x0301, 0x03B5, 0x0314, 0x0301, + 0x004F, 0x0308, 0x0304, 0x0DD9, 0x0DCF, 0x0DCA, 0x0045, 0x0302, + 0x0309, 0x03A9, 0x0313, 0x0345, 0x039F, 0x0313, 0x0300, 0x03B7, + 0x0301, 0x0345, 0x03B1, 0x0342, 0x0345, 0x039F, 0x0313, 0x0301, + 0x0049, 0x0308, 0x0301, 0x004C, 0x0323, 0x0304, 0x006F, 0x0303, + 0x0301, 0x0399, 0x0313, 0x0300, 0x05E9, 0x05BC, 0x05C1, 0x03B5, + 0x0313, 0x0300, 0x05E9, 0x05BC, 0x05C2, 0x0399, 0x0313, 0x0301, + 0x03B5, 0x0313, 0x0301, 0x006F, 0x0303, 0x0304, 0x004F, 0x0307, + 0x0304, 0x0055, 0x0304, 0x0308, 0x0061, 0x0323, 0x0302, 0x006F, + 0x0303, 0x0308, 0x0061, 0x0323, 0x0306, 0x03B7, 0x0300, 0x0345, + 0x03B9, 0x0308, 0x0342, 0x03C9, 0x0301, 0x0345, 0x0073, 0x0301, + 0x0307, 0x0075, 0x031B, 0x0323, 0x0055, 0x0303, 0x0301, 0x006F, + 0x0302, 0x0300, 0x006F, 0x0302, 0x0301, 0x0045, 0x0323, 0x0302, + 0x006F, 0x0302, 0x0303, 0x0391, 0x0314, 0x0345, 0x03B9, 0x0314, + 0x0342, 0x006F, 0x031B, 0x0300, 0x006F, 0x031B, 0x0301, 0x006F, + 0x0302, 0x0309, 0x006F, 0x031B, 0x0303, 0x03C5, 0x0308, 0x0300, + 0x03A5, 0x0314, 0x0342, 0x03C5, 0x0308, 0x0301, 0x006F, 0x031B, + 0x0309, 0x0075, 0x0308, 0x0300, 0x03C9, 0x0300, 0x0345, 0x0075, + 0x0308, 0x0301, 0x0073, 0x0323, 0x0307, 0x0075, 0x0308, 0x0304, + 0x03C5, 0x0314, 0x0300, 0x03C5, 0x0314, 0x0301, 0x0391, 0x0313, + 0x0345, 0x004F, 0x0328, 0x0304, 0x03B9, 0x0313, 0x0342, 0x0055, + 0x031B, 0x0300, 0x0061, 0x0308, 0x0304, 0x0041, 0x0302, 0x0300, + 0x0055, 0x031B, 0x0301, 0x0041, 0x0302, 0x0301, 0x0395, 0x0314, + 0x0300, 0x0395, 0x0314, 0x0301, 0x0055, 0x031B, 0x0303, 0x0041, + 0x0302, 0x0303, 0x0072, 0x0323, 0x0304, 0x0075, 0x0308, 0x030C, + 0x0CC6, 0x0CC2, 0x0CD5, 0x0073, 0x030C, 0x0307, 0x0041, 0x0302, + 0x0309, 0x0055, 0x031B, 0x0309, 0x0065, 0x0304, 0x0300, 0x0065, + 0x0304, 0x0301, 0x03B7, 0x0314, 0x0345, 0x0061, 0x030A, 0x0301, + 0x03C5, 0x0314, 0x0342, 0x004F, 0x0304, 0x0300, 0x03C5, 0x0313, + 0x0300, 0x004F, 0x0304, 0x0301, 0x03C5, 0x0313, 0x0301, 0x006F, + 0x0323, 0x0302, 0x0065, 0x0327, 0x0306, 0x0061, 0x0307, 0x0304, + 0x0395, 0x0313, 0x0300, 0x0395, 0x0313, 0x0301, 0x03B7, 0x0313, + 0x0345, 0x006F, 0x031B, 0x0323, 0x004F, 0x0303, 0x0301, 0x0061, + 0x0306, 0x0300, 0x0061, 0x0306, 0x0301, 0x004F, 0x0303, 0x0304, + 0x0061, 0x0306, 0x0303, 0x03C9, 0x0314, 0x0345, 0x004F, 0x0303, + 0x0308, 0x0041, 0x0323, 0x0302, 0x03B1, 0x0301, 0x0345, 0x0399, + 0x0314, 0x0342, 0x0061, 0x0306, 0x0309, 0x03B1, 0x0314, 0x0345, + 0x0041, 0x0323, 0x0306, 0x03B7, 0x0342, 0x0345, 0x0063, 0x0327, + 0x0301, 0x004F, 0x031B, 0x0323, 0x0053, 0x0301, 0x0307, 0x0065, + 0x0302, 0x0300, 0x006F, 0x0328, 0x0304, 0x0065, 0x0302, 0x0301, + 0x0075, 0x031B, 0x0300, 0x0065, 0x0302, 0x0303, 0x0055, 0x031B, + 0x0323, 0x006F, 0x0308, 0x0304, 0x004F, 0x0302, 0x0300, 0x004F, + 0x0302, 0x0301, 0x03BF, 0x0314, 0x0300, 0x03BF, 0x0314, 0x0301, + 0x004F, 0x0302, 0x0303, 0x03B9, 0x0308, 0x0300, 0x0041, 0x0306, + 0x0300, 0x0061, 0x0302, 0x0300, 0x03B9, 0x0308, 0x0301, 0x0065, + 0x0302, 0x0309, 0x03C9, 0x0313, 0x0345, 0x004F, 0x031B, 0x0300, + 0x004F, 0x031B, 0x0301, 0x03B1, 0x0300, 0x0345, 0x004F, 0x0302, + 0x0309, 0x004F, 0x031B, 0x0303, 0x0399, 0x0313, 0x0342, 0x0075, + 0x031B, 0x0301, 0x0069, 0x0308, 0x0301, 0x006C, 0x0323, 0x0304, + 0x004F, 0x031B, 0x0309, 0x0041, 0x0306, 0x0301, 0x03B9, 0x0314, + 0x0300, 0x0061, 0x0302, 0x0301, 0x03B9, 0x0314, 0x0301, 0x0055, + 0x0308, 0x0300, 0x03C9, 0x0342, 0x0345, 0x0053, 0x0323, 0x0307, + 0x0055, 0x0308, 0x0301, 0x0055, 0x0308, 0x0304, 0x0075, 0x031B, + 0x0303, 0x0041, 0x0306, 0x0303, 0x006F, 0x0307, 0x0304, 0x03A5, + 0x0314, 0x0300, 0x03A5, 0x0314, 0x0301, 0x03BF, 0x0313, 0x0300, + 0x0075, 0x0304, 0x0308, 0x03BF, 0x0313, 0x0301, 0x0397, 0x0314, + 0x0345, 0x0041, 0x0308, 0x0304, 0x0061, 0x0302, 0x0303, 0x0052, + 0x0323, 0x0304, 0x0053, 0x030C, 0x0307, 0x0055, 0x0308, 0x030C, + 0x03A9, 0x0314, 0x0345, 0x03B9, 0x0313, 0x0300, 0x03C5, 0x0308, + 0x0342, 0x039F, 0x0314, 0x0300, 0x03B9, 0x0313, 0x0301, 0x0075, + 0x0303, 0x0301, 0x0045, 0x0304, 0x0300, 0x0045, 0x0304, 0x0301, + 0x0065, 0x0323, 0x0302, 0x0041, 0x030A, 0x0301, 0x0045, 0x0327, + 0x0306, 0x004F, 0x0323, 0x0302, 0x0397, 0x0313, 0x0345, 0x0041, + 0x0307, 0x0304 + }; + +// Table containing decompositions longer than one UTF16 character. +// The top of the table contains all compositions, sorted lexicographically. +// Any decompositions of length 2 are in the table as a pair of values, +// decompositions longer than that are represented by a KLongD followed by +// a value whose top four bits indicate the length of the decomposition minus +// three and whose bottom 12 bits indicate an index into the KLongDecompositions +// array where the decomposition starts. +const long KLongD = 0; +const unsigned short KNonSingletonDecompositions[] = + { + 0x003C, 0x0338, 0x003D, 0x0338, 0x003E, 0x0338, 0x0041, 0x0300, + 0x0041, 0x0301, 0x0041, 0x0302, KLongD, 0x0165, KLongD, 0x016B, + KLongD, 0x0177, KLongD, 0x0186, 0x0041, 0x0303, 0x0041, 0x0304, + 0x0041, 0x0306, KLongD, 0x0216, KLongD, 0x0243, KLongD, 0x0261, + KLongD, 0x0099, 0x0041, 0x0307, KLongD, 0x02AF, 0x0041, 0x0308, + KLongD, 0x0279, 0x0041, 0x0309, 0x0041, 0x030A, 0x0041, 0x030A, + KLongD, 0x02A3, 0x0041, 0x030C, 0x0041, 0x030F, 0x0041, 0x0311, + 0x0041, 0x0323, KLongD, 0x01D1, KLongD, 0x01E0, 0x0041, 0x0325, + 0x0041, 0x0328, 0x0042, 0x0307, 0x0042, 0x0323, 0x0042, 0x0331, + 0x0043, 0x0301, 0x0043, 0x0302, 0x0043, 0x0307, 0x0043, 0x030C, + 0x0043, 0x0327, KLongD, 0x009F, 0x0044, 0x0307, 0x0044, 0x030C, + 0x0044, 0x0323, 0x0044, 0x0327, 0x0044, 0x032D, 0x0044, 0x0331, + 0x0045, 0x0300, 0x0045, 0x0301, 0x0045, 0x0302, KLongD, 0x00A5, + KLongD, 0x00AB, KLongD, 0x00B7, KLongD, 0x00C6, 0x0045, 0x0303, + 0x0045, 0x0304, KLongD, 0x029A, KLongD, 0x029D, 0x0045, 0x0306, + 0x0045, 0x0307, 0x0045, 0x0308, 0x0045, 0x0309, 0x0045, 0x030C, + 0x0045, 0x030F, 0x0045, 0x0311, 0x0045, 0x0323, KLongD, 0x011D, + 0x0045, 0x0327, KLongD, 0x02A6, 0x0045, 0x0328, 0x0045, 0x032D, + 0x0045, 0x0330, 0x0046, 0x0307, 0x0047, 0x0301, 0x0047, 0x0302, + 0x0047, 0x0304, 0x0047, 0x0306, 0x0047, 0x0307, 0x0047, 0x030C, + 0x0047, 0x0327, 0x0048, 0x0302, 0x0048, 0x0307, 0x0048, 0x0308, + 0x0048, 0x030C, 0x0048, 0x0323, 0x0048, 0x0327, 0x0048, 0x032E, + 0x0049, 0x0300, 0x0049, 0x0301, 0x0049, 0x0302, 0x0049, 0x0303, + 0x0049, 0x0304, 0x0049, 0x0306, 0x0049, 0x0307, 0x0049, 0x0308, + KLongD, 0x00D8, 0x0049, 0x0309, 0x0049, 0x030C, 0x0049, 0x030F, + 0x0049, 0x0311, 0x0049, 0x0323, 0x0049, 0x0328, 0x0049, 0x0330, + 0x004A, 0x0302, 0x004B, 0x0301, 0x004B, 0x030C, 0x004B, 0x0323, + 0x004B, 0x0327, 0x004B, 0x0331, 0x004C, 0x0301, 0x004C, 0x030C, + 0x004C, 0x0323, KLongD, 0x00DB, 0x004C, 0x0327, 0x004C, 0x032D, + 0x004C, 0x0331, 0x004D, 0x0301, 0x004D, 0x0307, 0x004D, 0x0323, + 0x004E, 0x0300, 0x004E, 0x0301, 0x004E, 0x0303, 0x004E, 0x0307, + 0x004E, 0x030C, 0x004E, 0x0323, 0x004E, 0x0327, 0x004E, 0x032D, + 0x004E, 0x0331, 0x004F, 0x0300, 0x004F, 0x0301, 0x004F, 0x0302, + KLongD, 0x0204, KLongD, 0x0207, KLongD, 0x0210, KLongD, 0x022E, + 0x004F, 0x0303, KLongD, 0x01BC, KLongD, 0x01C5, KLongD, 0x01CE, + 0x004F, 0x0304, KLongD, 0x019B, KLongD, 0x01A1, 0x004F, 0x0306, + 0x004F, 0x0307, KLongD, 0x00F6, 0x004F, 0x0308, KLongD, 0x00C0, + 0x004F, 0x0309, 0x004F, 0x030B, 0x004F, 0x030C, 0x004F, 0x030F, + 0x004F, 0x0311, 0x004F, 0x031B, KLongD, 0x0225, KLongD, 0x0228, + KLongD, 0x0231, KLongD, 0x0240, KLongD, 0x01E9, 0x004F, 0x0323, + KLongD, 0x02A9, 0x004F, 0x0328, KLongD, 0x0159, 0x0050, 0x0301, + 0x0050, 0x0307, 0x0052, 0x0301, 0x0052, 0x0307, 0x0052, 0x030C, + 0x0052, 0x030F, 0x0052, 0x0311, 0x0052, 0x0323, KLongD, 0x027F, + 0x0052, 0x0327, 0x0052, 0x0331, 0x0053, 0x0301, KLongD, 0x01EC, + 0x0053, 0x0302, 0x0053, 0x0307, 0x0053, 0x030C, KLongD, 0x0282, + 0x0053, 0x0323, KLongD, 0x0255, 0x0053, 0x0326, 0x0053, 0x0327, + 0x0054, 0x0307, 0x0054, 0x030C, 0x0054, 0x0323, 0x0054, 0x0326, + 0x0054, 0x0327, 0x0054, 0x032D, 0x0054, 0x0331, 0x0055, 0x0300, + 0x0055, 0x0301, 0x0055, 0x0302, 0x0055, 0x0303, KLongD, 0x0114, + 0x0055, 0x0304, KLongD, 0x00F9, 0x0055, 0x0306, 0x0055, 0x0308, + KLongD, 0x024F, KLongD, 0x0258, KLongD, 0x025B, KLongD, 0x0285, + 0x0055, 0x0309, 0x0055, 0x030A, 0x0055, 0x030B, 0x0055, 0x030C, + 0x0055, 0x030F, 0x0055, 0x0311, 0x0055, 0x031B, KLongD, 0x015F, + KLongD, 0x0168, KLongD, 0x0174, KLongD, 0x0189, KLongD, 0x01FE, + 0x0055, 0x0323, 0x0055, 0x0324, 0x0055, 0x0328, 0x0055, 0x032D, + 0x0055, 0x0330, 0x0056, 0x0303, 0x0056, 0x0323, 0x0057, 0x0300, + 0x0057, 0x0301, 0x0057, 0x0302, 0x0057, 0x0307, 0x0057, 0x0308, + 0x0057, 0x0323, 0x0058, 0x0307, 0x0058, 0x0308, 0x0059, 0x0300, + 0x0059, 0x0301, 0x0059, 0x0302, 0x0059, 0x0303, 0x0059, 0x0304, + 0x0059, 0x0307, 0x0059, 0x0308, 0x0059, 0x0309, 0x0059, 0x0323, + 0x005A, 0x0301, 0x005A, 0x0302, 0x005A, 0x0307, 0x005A, 0x030C, + 0x005A, 0x0323, 0x005A, 0x0331, 0x0061, 0x0300, 0x0061, 0x0301, + 0x0061, 0x0302, KLongD, 0x0219, KLongD, 0x0249, KLongD, 0x027C, + KLongD, 0x009C, 0x0061, 0x0303, 0x0061, 0x0304, 0x0061, 0x0306, + KLongD, 0x01BF, KLongD, 0x01C2, KLongD, 0x01C8, KLongD, 0x01DA, + 0x0061, 0x0307, KLongD, 0x01AD, 0x0061, 0x0308, KLongD, 0x0162, + 0x0061, 0x0309, 0x0061, 0x030A, KLongD, 0x0195, 0x0061, 0x030C, + 0x0061, 0x030F, 0x0061, 0x0311, 0x0061, 0x0323, KLongD, 0x00FC, + KLongD, 0x0102, 0x0061, 0x0325, 0x0061, 0x0328, 0x0062, 0x0307, + 0x0062, 0x0323, 0x0062, 0x0331, 0x0063, 0x0301, 0x0063, 0x0302, + 0x0063, 0x0307, 0x0063, 0x030C, 0x0063, 0x0327, KLongD, 0x01E6, + 0x0064, 0x0307, 0x0064, 0x030C, 0x0064, 0x0323, 0x0064, 0x0327, + 0x0064, 0x032D, 0x0064, 0x0331, 0x0065, 0x0300, 0x0065, 0x0301, + 0x0065, 0x0302, KLongD, 0x01EF, KLongD, 0x01F5, KLongD, 0x01FB, + KLongD, 0x021F, 0x0065, 0x0303, 0x0065, 0x0304, KLongD, 0x018C, + KLongD, 0x018F, 0x0065, 0x0306, 0x0065, 0x0307, 0x0065, 0x0308, + 0x0065, 0x0309, 0x0065, 0x030C, 0x0065, 0x030F, 0x0065, 0x0311, + 0x0065, 0x0323, KLongD, 0x02A0, 0x0065, 0x0327, KLongD, 0x01AA, + 0x0065, 0x0328, 0x0065, 0x032D, 0x0065, 0x0330, 0x0066, 0x0307, + 0x0067, 0x0301, 0x0067, 0x0302, 0x0067, 0x0304, 0x0067, 0x0306, + 0x0067, 0x0307, 0x0067, 0x030C, 0x0067, 0x0327, 0x0068, 0x0302, + 0x0068, 0x0307, 0x0068, 0x0308, 0x0068, 0x030C, 0x0068, 0x0323, + 0x0068, 0x0327, 0x0068, 0x032E, 0x0068, 0x0331, 0x0069, 0x0300, + 0x0069, 0x0301, 0x0069, 0x0302, 0x0069, 0x0303, 0x0069, 0x0304, + 0x0069, 0x0306, 0x0069, 0x0308, KLongD, 0x023A, 0x0069, 0x0309, + 0x0069, 0x030C, 0x0069, 0x030F, 0x0069, 0x0311, 0x0069, 0x0323, + 0x0069, 0x0328, 0x0069, 0x0330, 0x006A, 0x0302, 0x006A, 0x030C, + 0x006B, 0x0301, 0x006B, 0x030C, 0x006B, 0x0323, 0x006B, 0x0327, + 0x006B, 0x0331, 0x006C, 0x0301, 0x006C, 0x030C, 0x006C, 0x0323, + KLongD, 0x023D, 0x006C, 0x0327, 0x006C, 0x032D, 0x006C, 0x0331, + 0x006D, 0x0301, 0x006D, 0x0307, 0x006D, 0x0323, 0x006E, 0x0300, + 0x006E, 0x0301, 0x006E, 0x0303, 0x006E, 0x0307, 0x006E, 0x030C, + 0x006E, 0x0323, 0x006E, 0x0327, 0x006E, 0x032D, 0x006E, 0x0331, + 0x006F, 0x0300, 0x006F, 0x0301, 0x006F, 0x0302, KLongD, 0x0117, + KLongD, 0x011A, KLongD, 0x0120, KLongD, 0x012F, 0x006F, 0x0303, + KLongD, 0x00DE, KLongD, 0x00F3, KLongD, 0x00FF, 0x006F, 0x0304, + KLongD, 0x00A8, KLongD, 0x00AE, 0x006F, 0x0306, 0x006F, 0x0307, + KLongD, 0x0264, 0x006F, 0x0308, KLongD, 0x0201, 0x006F, 0x0309, + 0x006F, 0x030B, 0x006F, 0x030C, 0x006F, 0x030F, 0x006F, 0x0311, + 0x006F, 0x031B, KLongD, 0x0129, KLongD, 0x012C, KLongD, 0x0132, + KLongD, 0x013E, KLongD, 0x01B9, 0x006F, 0x0323, KLongD, 0x01A7, + 0x006F, 0x0328, KLongD, 0x01F2, 0x0070, 0x0301, 0x0070, 0x0307, + 0x0072, 0x0301, 0x0072, 0x0307, 0x0072, 0x030C, 0x0072, 0x030F, + 0x0072, 0x0311, 0x0072, 0x0323, KLongD, 0x017A, 0x0072, 0x0327, + 0x0072, 0x0331, 0x0073, 0x0301, KLongD, 0x010E, 0x0073, 0x0302, + 0x0073, 0x0307, 0x0073, 0x030C, KLongD, 0x0183, 0x0073, 0x0323, + KLongD, 0x014A, 0x0073, 0x0326, 0x0073, 0x0327, 0x0074, 0x0307, + 0x0074, 0x0308, 0x0074, 0x030C, 0x0074, 0x0323, 0x0074, 0x0326, + 0x0074, 0x0327, 0x0074, 0x032D, 0x0074, 0x0331, 0x0075, 0x0300, + 0x0075, 0x0301, 0x0075, 0x0302, 0x0075, 0x0303, KLongD, 0x0297, + 0x0075, 0x0304, KLongD, 0x0270, 0x0075, 0x0306, 0x0075, 0x0308, + KLongD, 0x0141, KLongD, 0x0147, KLongD, 0x014D, KLongD, 0x017D, + 0x0075, 0x0309, 0x0075, 0x030A, 0x0075, 0x030B, 0x0075, 0x030C, + 0x0075, 0x030F, 0x0075, 0x0311, 0x0075, 0x031B, KLongD, 0x01F8, + KLongD, 0x0237, KLongD, 0x025E, KLongD, 0x0096, KLongD, 0x0111, + 0x0075, 0x0323, 0x0075, 0x0324, 0x0075, 0x0328, 0x0075, 0x032D, + 0x0075, 0x0330, 0x0076, 0x0303, 0x0076, 0x0323, 0x0077, 0x0300, + 0x0077, 0x0301, 0x0077, 0x0302, 0x0077, 0x0307, 0x0077, 0x0308, + 0x0077, 0x030A, 0x0077, 0x0323, 0x0078, 0x0307, 0x0078, 0x0308, + 0x0079, 0x0300, 0x0079, 0x0301, 0x0079, 0x0302, 0x0079, 0x0303, + 0x0079, 0x0304, 0x0079, 0x0307, 0x0079, 0x0308, 0x0079, 0x0309, + 0x0079, 0x030A, 0x0079, 0x0323, 0x007A, 0x0301, 0x007A, 0x0302, + 0x007A, 0x0307, 0x007A, 0x030C, 0x007A, 0x0323, 0x007A, 0x0331, + 0x00A8, 0x0300, 0x00A8, 0x0301, 0x00A8, 0x0301, 0x00A8, 0x0342, + 0x00B4, 0xFFFF, 0x00C6, 0x0301, 0x00C6, 0x0304, 0x00D8, 0x0301, + 0x00E6, 0x0301, 0x00E6, 0x0304, 0x00F8, 0x0301, 0x017F, 0x0307, + 0x01B7, 0x030C, 0x0292, 0x030C, 0x0391, 0x0300, 0x0391, 0x0301, + 0x0391, 0x0301, 0x0391, 0x0304, 0x0391, 0x0306, 0x0391, 0x0313, + KLongD, 0x007C, KLongD, 0x107C, KLongD, 0x0060, KLongD, 0x1060, + KLongD, 0x0030, KLongD, 0x1030, KLongD, 0x0156, 0x0391, 0x0314, + KLongD, 0x0064, KLongD, 0x1064, KLongD, 0x0050, KLongD, 0x1050, + KLongD, 0x0010, KLongD, 0x1010, KLongD, 0x0123, 0x0391, 0x0345, + 0x0395, 0x0300, 0x0395, 0x0301, 0x0395, 0x0301, 0x0395, 0x0313, + KLongD, 0x01B0, KLongD, 0x01B3, 0x0395, 0x0314, KLongD, 0x016E, + KLongD, 0x0171, 0x0397, 0x0300, 0x0397, 0x0301, 0x0397, 0x0301, + 0x0397, 0x0313, KLongD, 0x0000, KLongD, 0x1000, KLongD, 0x0038, + KLongD, 0x1038, KLongD, 0x0048, KLongD, 0x1048, KLongD, 0x02AC, + 0x0397, 0x0314, KLongD, 0x0008, KLongD, 0x1008, KLongD, 0x0018, + KLongD, 0x1018, KLongD, 0x0044, KLongD, 0x1044, KLongD, 0x0276, + 0x0397, 0x0345, 0x0399, 0x0300, 0x0399, 0x0301, 0x0399, 0x0301, + 0x0399, 0x0304, 0x0399, 0x0306, 0x0399, 0x0308, 0x0399, 0x0313, + KLongD, 0x00E1, KLongD, 0x00ED, KLongD, 0x0234, 0x0399, 0x0314, + KLongD, 0x00B1, KLongD, 0x00BA, KLongD, 0x01D7, 0x039F, 0x0300, + 0x039F, 0x0301, 0x039F, 0x0301, 0x039F, 0x0313, KLongD, 0x00CC, + KLongD, 0x00D5, 0x039F, 0x0314, KLongD, 0x0291, KLongD, 0x0093, + 0x03A1, 0x0314, 0x03A5, 0x0300, 0x03A5, 0x0301, 0x03A5, 0x0301, + 0x03A5, 0x0304, 0x03A5, 0x0306, 0x03A5, 0x0308, 0x03A5, 0x0314, + KLongD, 0x0267, KLongD, 0x026A, KLongD, 0x0138, 0x03A9, 0x0300, + 0x03A9, 0x0301, 0x03A9, 0x0301, 0x03A9, 0x0313, KLongD, 0x0084, + KLongD, 0x1084, KLongD, 0x006C, KLongD, 0x106C, KLongD, 0x0020, + KLongD, 0x1020, KLongD, 0x00C9, 0x03A9, 0x0314, KLongD, 0x0070, + KLongD, 0x1070, KLongD, 0x0054, KLongD, 0x1054, KLongD, 0x0034, + KLongD, 0x1034, KLongD, 0x0288, 0x03A9, 0x0345, 0x03B1, 0x0300, + KLongD, 0x022B, 0x03B1, 0x0301, 0x03B1, 0x0301, KLongD, 0x01D4, + 0x03B1, 0x0304, 0x03B1, 0x0306, 0x03B1, 0x0313, KLongD, 0x0004, + KLongD, 0x1004, KLongD, 0x0024, KLongD, 0x1024, KLongD, 0x0080, + KLongD, 0x1080, KLongD, 0x00A2, 0x03B1, 0x0314, KLongD, 0x0028, + KLongD, 0x1028, KLongD, 0x002C, KLongD, 0x102C, KLongD, 0x0068, + KLongD, 0x1068, KLongD, 0x01DD, 0x03B1, 0x0342, KLongD, 0x00D2, + 0x03B1, 0x0345, 0x03B5, 0x0300, 0x03B5, 0x0301, 0x03B5, 0x0301, + 0x03B5, 0x0313, KLongD, 0x00E7, KLongD, 0x00F0, 0x03B5, 0x0314, + KLongD, 0x00B4, KLongD, 0x00BD, 0x03B7, 0x0300, KLongD, 0x0105, + 0x03B7, 0x0301, 0x03B7, 0x0301, KLongD, 0x00CF, 0x03B7, 0x0313, + KLongD, 0x0074, KLongD, 0x1074, KLongD, 0x0058, KLongD, 0x1058, + KLongD, 0x0014, KLongD, 0x1014, KLongD, 0x01B6, 0x03B7, 0x0314, + KLongD, 0x005C, KLongD, 0x105C, KLongD, 0x004C, KLongD, 0x104C, + KLongD, 0x001C, KLongD, 0x101C, KLongD, 0x0192, 0x03B7, 0x0342, + KLongD, 0x01E3, 0x03B7, 0x0345, 0x03B9, 0x0300, 0x03B9, 0x0301, + 0x03B9, 0x0301, 0x03B9, 0x0304, 0x03B9, 0x0306, 0x03B9, 0x0308, + KLongD, 0x0213, KLongD, 0x021C, KLongD, 0x021C, KLongD, 0x0108, + 0x03B9, 0x0313, KLongD, 0x028B, KLongD, 0x0294, KLongD, 0x015C, + 0x03B9, 0x0314, KLongD, 0x0246, KLongD, 0x024C, KLongD, 0x0126, + 0x03B9, 0x0342, 0x03BF, 0x0300, 0x03BF, 0x0301, 0x03BF, 0x0301, + 0x03BF, 0x0313, KLongD, 0x026D, KLongD, 0x0273, 0x03BF, 0x0314, + KLongD, 0x020A, KLongD, 0x020D, 0x03C1, 0x0313, 0x03C1, 0x0314, + 0x03C5, 0x0300, 0x03C5, 0x0301, 0x03C5, 0x0301, 0x03C5, 0x0304, + 0x03C5, 0x0306, 0x03C5, 0x0308, KLongD, 0x0135, KLongD, 0x013B, + KLongD, 0x013B, KLongD, 0x028E, 0x03C5, 0x0313, KLongD, 0x019E, + KLongD, 0x01A4, KLongD, 0x0090, 0x03C5, 0x0314, KLongD, 0x0150, + KLongD, 0x0153, KLongD, 0x0198, 0x03C5, 0x0342, 0x03C9, 0x0300, + KLongD, 0x0144, 0x03C9, 0x0301, 0x03C9, 0x0301, KLongD, 0x010B, + 0x03C9, 0x0313, KLongD, 0x000C, KLongD, 0x100C, KLongD, 0x0088, + KLongD, 0x1088, KLongD, 0x0040, KLongD, 0x1040, KLongD, 0x0222, + 0x03C9, 0x0314, KLongD, 0x008C, KLongD, 0x108C, KLongD, 0x0078, + KLongD, 0x1078, KLongD, 0x003C, KLongD, 0x103C, KLongD, 0x01CB, + 0x03C9, 0x0342, KLongD, 0x0252, 0x03C9, 0x0345, 0x03D2, 0x0301, + 0x03D2, 0x0308, 0x0406, 0x0308, 0x0410, 0x0306, 0x0410, 0x0308, + 0x0413, 0x0301, 0x0415, 0x0300, 0x0415, 0x0306, 0x0415, 0x0308, + 0x0416, 0x0306, 0x0416, 0x0308, 0x0417, 0x0308, 0x0418, 0x0300, + 0x0418, 0x0304, 0x0418, 0x0306, 0x0418, 0x0308, 0x041A, 0x0301, + 0x041E, 0x0308, 0x0423, 0x0304, 0x0423, 0x0306, 0x0423, 0x0308, + 0x0423, 0x030B, 0x0427, 0x0308, 0x042B, 0x0308, 0x042D, 0x0308, + 0x0430, 0x0306, 0x0430, 0x0308, 0x0433, 0x0301, 0x0435, 0x0300, + 0x0435, 0x0306, 0x0435, 0x0308, 0x0436, 0x0306, 0x0436, 0x0308, + 0x0437, 0x0308, 0x0438, 0x0300, 0x0438, 0x0304, 0x0438, 0x0306, + 0x0438, 0x0308, 0x043A, 0x0301, 0x043E, 0x0308, 0x0443, 0x0304, + 0x0443, 0x0306, 0x0443, 0x0308, 0x0443, 0x030B, 0x0447, 0x0308, + 0x044B, 0x0308, 0x044D, 0x0308, 0x0456, 0x0308, 0x0474, 0x030F, + 0x0475, 0x030F, 0x04D8, 0x0308, 0x04D9, 0x0308, 0x04E8, 0x0308, + 0x04E9, 0x0308, 0x05D9, 0x05B4, 0x0627, 0x0653, 0x0627, 0x0654, + 0x0627, 0x0655, 0x0648, 0x0654, 0x064A, 0x0654, 0x06C1, 0x0654, + 0x06D2, 0x0654, 0x06D5, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C, + 0x0933, 0x093C, 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x0B47, 0x0B3E, + 0x0B47, 0x0B56, 0x0B47, 0x0B57, 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, + 0x0BC6, 0x0BD7, 0x0BC7, 0x0BBE, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5, + 0x0CC6, 0x0CC2, KLongD, 0x0180, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6, + 0x0D46, 0x0D3E, 0x0D46, 0x0D57, 0x0D47, 0x0D3E, 0x0DD9, 0x0DCA, + 0x0DD9, 0x0DCF, KLongD, 0x00C3, 0x0DD9, 0x0DDF, 0x1025, 0x102E, + 0x1FBF, 0x0300, 0x1FBF, 0x0301, 0x1FBF, 0x0342, 0x1FFE, 0x0300, + 0x1FFE, 0x0301, 0x1FFE, 0x0342, 0x2190, 0x0338, 0x2192, 0x0338, + 0x2194, 0x0338, 0x21D0, 0x0338, 0x21D2, 0x0338, 0x21D4, 0x0338, + 0x2203, 0x0338, 0x2208, 0x0338, 0x220B, 0x0338, 0x2223, 0x0338, + 0x2225, 0x0338, 0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338, + 0x2248, 0x0338, 0x224D, 0x0338, 0x2261, 0x0338, 0x2264, 0x0338, + 0x2265, 0x0338, 0x2272, 0x0338, 0x2273, 0x0338, 0x2276, 0x0338, + 0x2277, 0x0338, 0x227A, 0x0338, 0x227B, 0x0338, 0x227C, 0x0338, + 0x227D, 0x0338, 0x2282, 0x0338, 0x2283, 0x0338, 0x2286, 0x0338, + 0x2287, 0x0338, 0x2291, 0x0338, 0x2292, 0x0338, 0x22A2, 0x0338, + 0x22A8, 0x0338, 0x22A9, 0x0338, 0x22AB, 0x0338, 0x22B2, 0x0338, + 0x22B3, 0x0338, 0x22B4, 0x0338, 0x22B5, 0x0338, 0x3046, 0x3099, + 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, + 0x3053, 0x3099, 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, + 0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, + 0x3064, 0x3099, 0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, + 0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099, + 0x3075, 0x309A, 0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099, + 0x307B, 0x309A, 0x309D, 0x3099, 0x30A6, 0x3099, 0x30AB, 0x3099, + 0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, + 0x30B5, 0x3099, 0x30B7, 0x3099, 0x30B9, 0x3099, 0x30BB, 0x3099, + 0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, + 0x30C6, 0x3099, 0x30C8, 0x3099, 0x30CF, 0x3099, 0x30CF, 0x309A, + 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A, + 0x30D8, 0x3099, 0x30D8, 0x309A, 0x30DB, 0x3099, 0x30DB, 0x309A, + 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099, + 0x30FD, 0x3099, 0x0308, 0x0301, 0x0915, 0x093C, 0x0916, 0x093C, + 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, + 0x092B, 0x093C, 0x092F, 0x093C, 0x09A1, 0x09BC, 0x09A2, 0x09BC, + 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C, + 0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B21, 0x0B3C, + 0x0B22, 0x0B3C, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7, + 0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72, + 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB3, 0x0F80, 0x0F71, 0x0F80, + 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, + 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5, 0x05F2, 0x05B7, 0x05E9, 0x05C1, + 0x05E9, 0x05C2, KLongD, 0x00E4, KLongD, 0x00EA, 0x05D0, 0x05B7, + 0x05D0, 0x05B8, 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, + 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, + 0x05D8, 0x05BC, 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, + 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, + 0x05E3, 0x05BC, 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, + 0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, + 0x05D1, 0x05BF, 0x05DB, 0x05BF, 0x05E4, 0x05BF + }; + +// Table of folded decompositions which either have more than one UTF16, or +// their normal decompositions have more than one UTF16 +const unsigned short KNonSingletonFolds[] = + { + 0x003C, 0x0338, 0x003D, 0x0338, 0x003E, 0x0338, 0x0061, 0x0300, + 0x0061, 0x0301, 0x0061, 0x0302, KLongD, 0x0219, KLongD, 0x0249, + KLongD, 0x027C, KLongD, 0x009C, 0x0061, 0x0303, 0x0061, 0x0304, + 0x0061, 0x0306, KLongD, 0x01BF, KLongD, 0x01C2, KLongD, 0x01C8, + KLongD, 0x01DA, 0x0061, 0x0307, KLongD, 0x01AD, 0x0061, 0x0308, + KLongD, 0x0162, 0x0061, 0x0309, 0x0061, 0x030A, 0x0061, 0x030A, + KLongD, 0x0195, 0x0061, 0x030C, 0x0061, 0x030F, 0x0061, 0x0311, + 0x0061, 0x0323, KLongD, 0x00FC, KLongD, 0x0102, 0x0061, 0x0325, + 0x0061, 0x0328, 0x0062, 0x0307, 0x0062, 0x0323, 0x0062, 0x0331, + 0x0063, 0x0301, 0x0063, 0x0302, 0x0063, 0x0307, 0x0063, 0x030C, + 0x0063, 0x0327, KLongD, 0x01E6, 0x0064, 0x0307, 0x0064, 0x030C, + 0x0064, 0x0323, 0x0064, 0x0327, 0x0064, 0x032D, 0x0064, 0x0331, + 0x0065, 0x0300, 0x0065, 0x0301, 0x0065, 0x0302, KLongD, 0x01EF, + KLongD, 0x01F5, KLongD, 0x01FB, KLongD, 0x021F, 0x0065, 0x0303, + 0x0065, 0x0304, KLongD, 0x018C, KLongD, 0x018F, 0x0065, 0x0306, + 0x0065, 0x0307, 0x0065, 0x0308, 0x0065, 0x0309, 0x0065, 0x030C, + 0x0065, 0x030F, 0x0065, 0x0311, 0x0065, 0x0323, KLongD, 0x02A0, + 0x0065, 0x0327, KLongD, 0x01AA, 0x0065, 0x0328, 0x0065, 0x032D, + 0x0065, 0x0330, 0x0066, 0x0307, 0x0067, 0x0301, 0x0067, 0x0302, + 0x0067, 0x0304, 0x0067, 0x0306, 0x0067, 0x0307, 0x0067, 0x030C, + 0x0067, 0x0327, 0x0068, 0x0302, 0x0068, 0x0307, 0x0068, 0x0308, + 0x0068, 0x030C, 0x0068, 0x0323, 0x0068, 0x0327, 0x0068, 0x032E, + 0x0069, 0x0300, 0x0069, 0x0301, 0x0069, 0x0302, 0x0069, 0x0303, + 0x0069, 0x0304, 0x0069, 0x0306, 0x0069, 0xFFFF, 0x0069, 0x0308, + KLongD, 0x023A, 0x0069, 0x0309, 0x0069, 0x030C, 0x0069, 0x030F, + 0x0069, 0x0311, 0x0069, 0x0323, 0x0069, 0x0328, 0x0069, 0x0330, + 0x006A, 0x0302, 0x006B, 0x0301, 0x006B, 0x030C, 0x006B, 0x0323, + 0x006B, 0x0327, 0x006B, 0x0331, 0x006C, 0x0301, 0x006C, 0x030C, + 0x006C, 0x0323, KLongD, 0x023D, 0x006C, 0x0327, 0x006C, 0x032D, + 0x006C, 0x0331, 0x006D, 0x0301, 0x006D, 0x0307, 0x006D, 0x0323, + 0x006E, 0x0300, 0x006E, 0x0301, 0x006E, 0x0303, 0x006E, 0x0307, + 0x006E, 0x030C, 0x006E, 0x0323, 0x006E, 0x0327, 0x006E, 0x032D, + 0x006E, 0x0331, 0x006F, 0x0300, 0x006F, 0x0301, 0x006F, 0x0302, + KLongD, 0x0117, KLongD, 0x011A, KLongD, 0x0120, KLongD, 0x012F, + 0x006F, 0x0303, KLongD, 0x00DE, KLongD, 0x00F3, KLongD, 0x00FF, + 0x006F, 0x0304, KLongD, 0x00A8, KLongD, 0x00AE, 0x006F, 0x0306, + 0x006F, 0x0307, KLongD, 0x0264, 0x006F, 0x0308, KLongD, 0x0201, + 0x006F, 0x0309, 0x006F, 0x030B, 0x006F, 0x030C, 0x006F, 0x030F, + 0x006F, 0x0311, 0x006F, 0x031B, KLongD, 0x0129, KLongD, 0x012C, + KLongD, 0x0132, KLongD, 0x013E, KLongD, 0x01B9, 0x006F, 0x0323, + KLongD, 0x01A7, 0x006F, 0x0328, KLongD, 0x01F2, 0x0070, 0x0301, + 0x0070, 0x0307, 0x0072, 0x0301, 0x0072, 0x0307, 0x0072, 0x030C, + 0x0072, 0x030F, 0x0072, 0x0311, 0x0072, 0x0323, KLongD, 0x017A, + 0x0072, 0x0327, 0x0072, 0x0331, 0x0073, 0x0301, KLongD, 0x010E, + 0x0073, 0x0302, 0x0073, 0x0307, 0x0073, 0x030C, KLongD, 0x0183, + 0x0073, 0x0323, KLongD, 0x014A, 0x0073, 0x0326, 0x0073, 0x0327, + 0x0074, 0x0307, 0x0074, 0x030C, 0x0074, 0x0323, 0x0074, 0x0326, + 0x0074, 0x0327, 0x0074, 0x032D, 0x0074, 0x0331, 0x0075, 0x0300, + 0x0075, 0x0301, 0x0075, 0x0302, 0x0075, 0x0303, KLongD, 0x0297, + 0x0075, 0x0304, KLongD, 0x0270, 0x0075, 0x0306, 0x0075, 0x0308, + KLongD, 0x0141, KLongD, 0x0147, KLongD, 0x014D, KLongD, 0x017D, + 0x0075, 0x0309, 0x0075, 0x030A, 0x0075, 0x030B, 0x0075, 0x030C, + 0x0075, 0x030F, 0x0075, 0x0311, 0x0075, 0x031B, KLongD, 0x01F8, + KLongD, 0x0237, KLongD, 0x025E, KLongD, 0x0096, KLongD, 0x0111, + 0x0075, 0x0323, 0x0075, 0x0324, 0x0075, 0x0328, 0x0075, 0x032D, + 0x0075, 0x0330, 0x0076, 0x0303, 0x0076, 0x0323, 0x0077, 0x0300, + 0x0077, 0x0301, 0x0077, 0x0302, 0x0077, 0x0307, 0x0077, 0x0308, + 0x0077, 0x0323, 0x0078, 0x0307, 0x0078, 0x0308, 0x0079, 0x0300, + 0x0079, 0x0301, 0x0079, 0x0302, 0x0079, 0x0303, 0x0079, 0x0304, + 0x0079, 0x0307, 0x0079, 0x0308, 0x0079, 0x0309, 0x0079, 0x0323, + 0x007A, 0x0301, 0x007A, 0x0302, 0x007A, 0x0307, 0x007A, 0x030C, + 0x007A, 0x0323, 0x007A, 0x0331, 0x0061, 0x0300, 0x0061, 0x0301, + 0x0061, 0x0302, KLongD, 0x0219, KLongD, 0x0249, KLongD, 0x027C, + KLongD, 0x009C, 0x0061, 0x0303, 0x0061, 0x0304, 0x0061, 0x0306, + KLongD, 0x01BF, KLongD, 0x01C2, KLongD, 0x01C8, KLongD, 0x01DA, + 0x0061, 0x0307, KLongD, 0x01AD, 0x0061, 0x0308, KLongD, 0x0162, + 0x0061, 0x0309, 0x0061, 0x030A, KLongD, 0x0195, 0x0061, 0x030C, + 0x0061, 0x030F, 0x0061, 0x0311, 0x0061, 0x0323, KLongD, 0x00FC, + KLongD, 0x0102, 0x0061, 0x0325, 0x0061, 0x0328, 0x0062, 0x0307, + 0x0062, 0x0323, 0x0062, 0x0331, 0x0063, 0x0301, 0x0063, 0x0302, + 0x0063, 0x0307, 0x0063, 0x030C, 0x0063, 0x0327, KLongD, 0x01E6, + 0x0064, 0x0307, 0x0064, 0x030C, 0x0064, 0x0323, 0x0064, 0x0327, + 0x0064, 0x032D, 0x0064, 0x0331, 0x0065, 0x0300, 0x0065, 0x0301, + 0x0065, 0x0302, KLongD, 0x01EF, KLongD, 0x01F5, KLongD, 0x01FB, + KLongD, 0x021F, 0x0065, 0x0303, 0x0065, 0x0304, KLongD, 0x018C, + KLongD, 0x018F, 0x0065, 0x0306, 0x0065, 0x0307, 0x0065, 0x0308, + 0x0065, 0x0309, 0x0065, 0x030C, 0x0065, 0x030F, 0x0065, 0x0311, + 0x0065, 0x0323, KLongD, 0x02A0, 0x0065, 0x0327, KLongD, 0x01AA, + 0x0065, 0x0328, 0x0065, 0x032D, 0x0065, 0x0330, 0x0066, 0x0307, + 0x0067, 0x0301, 0x0067, 0x0302, 0x0067, 0x0304, 0x0067, 0x0306, + 0x0067, 0x0307, 0x0067, 0x030C, 0x0067, 0x0327, 0x0068, 0x0302, + 0x0068, 0x0307, 0x0068, 0x0308, 0x0068, 0x030C, 0x0068, 0x0323, + 0x0068, 0x0327, 0x0068, 0x032E, 0x0068, 0x0331, 0x0069, 0x0300, + 0x0069, 0x0301, 0x0069, 0x0302, 0x0069, 0x0303, 0x0069, 0x0304, + 0x0069, 0x0306, 0x0069, 0x0308, KLongD, 0x023A, 0x0069, 0x0309, + 0x0069, 0x030C, 0x0069, 0x030F, 0x0069, 0x0311, 0x0069, 0x0323, + 0x0069, 0x0328, 0x0069, 0x0330, 0x006A, 0x0302, 0x006A, 0x030C, + 0x006B, 0x0301, 0x006B, 0x030C, 0x006B, 0x0323, 0x006B, 0x0327, + 0x006B, 0x0331, 0x006C, 0x0301, 0x006C, 0x030C, 0x006C, 0x0323, + KLongD, 0x023D, 0x006C, 0x0327, 0x006C, 0x032D, 0x006C, 0x0331, + 0x006D, 0x0301, 0x006D, 0x0307, 0x006D, 0x0323, 0x006E, 0x0300, + 0x006E, 0x0301, 0x006E, 0x0303, 0x006E, 0x0307, 0x006E, 0x030C, + 0x006E, 0x0323, 0x006E, 0x0327, 0x006E, 0x032D, 0x006E, 0x0331, + 0x006F, 0x0300, 0x006F, 0x0301, 0x006F, 0x0302, KLongD, 0x0117, + KLongD, 0x011A, KLongD, 0x0120, KLongD, 0x012F, 0x006F, 0x0303, + KLongD, 0x00DE, KLongD, 0x00F3, KLongD, 0x00FF, 0x006F, 0x0304, + KLongD, 0x00A8, KLongD, 0x00AE, 0x006F, 0x0306, 0x006F, 0x0307, + KLongD, 0x0264, 0x006F, 0x0308, KLongD, 0x0201, 0x006F, 0x0309, + 0x006F, 0x030B, 0x006F, 0x030C, 0x006F, 0x030F, 0x006F, 0x0311, + 0x006F, 0x031B, KLongD, 0x0129, KLongD, 0x012C, KLongD, 0x0132, + KLongD, 0x013E, KLongD, 0x01B9, 0x006F, 0x0323, KLongD, 0x01A7, + 0x006F, 0x0328, KLongD, 0x01F2, 0x0070, 0x0301, 0x0070, 0x0307, + 0x0072, 0x0301, 0x0072, 0x0307, 0x0072, 0x030C, 0x0072, 0x030F, + 0x0072, 0x0311, 0x0072, 0x0323, KLongD, 0x017A, 0x0072, 0x0327, + 0x0072, 0x0331, 0x0073, 0x0301, KLongD, 0x010E, 0x0073, 0x0302, + 0x0073, 0x0307, 0x0073, 0x030C, KLongD, 0x0183, 0x0073, 0x0323, + KLongD, 0x014A, 0x0073, 0x0326, 0x0073, 0x0327, 0x0074, 0x0307, + 0x0074, 0x0308, 0x0074, 0x030C, 0x0074, 0x0323, 0x0074, 0x0326, + 0x0074, 0x0327, 0x0074, 0x032D, 0x0074, 0x0331, 0x0075, 0x0300, + 0x0075, 0x0301, 0x0075, 0x0302, 0x0075, 0x0303, KLongD, 0x0297, + 0x0075, 0x0304, KLongD, 0x0270, 0x0075, 0x0306, 0x0075, 0x0308, + KLongD, 0x0141, KLongD, 0x0147, KLongD, 0x014D, KLongD, 0x017D, + 0x0075, 0x0309, 0x0075, 0x030A, 0x0075, 0x030B, 0x0075, 0x030C, + 0x0075, 0x030F, 0x0075, 0x0311, 0x0075, 0x031B, KLongD, 0x01F8, + KLongD, 0x0237, KLongD, 0x025E, KLongD, 0x0096, KLongD, 0x0111, + 0x0075, 0x0323, 0x0075, 0x0324, 0x0075, 0x0328, 0x0075, 0x032D, + 0x0075, 0x0330, 0x0076, 0x0303, 0x0076, 0x0323, 0x0077, 0x0300, + 0x0077, 0x0301, 0x0077, 0x0302, 0x0077, 0x0307, 0x0077, 0x0308, + 0x0077, 0x030A, 0x0077, 0x0323, 0x0078, 0x0307, 0x0078, 0x0308, + 0x0079, 0x0300, 0x0079, 0x0301, 0x0079, 0x0302, 0x0079, 0x0303, + 0x0079, 0x0304, 0x0079, 0x0307, 0x0079, 0x0308, 0x0079, 0x0309, + 0x0079, 0x030A, 0x0079, 0x0323, 0x007A, 0x0301, 0x007A, 0x0302, + 0x007A, 0x0307, 0x007A, 0x030C, 0x007A, 0x0323, 0x007A, 0x0331, + 0x00A8, 0x0300, 0x00A8, 0x0301, 0x00A8, 0x0301, 0x00A8, 0x0342, + 0x00B4, 0xFFFF, 0x00E6, 0x0301, 0x00E6, 0x0304, 0x00F8, 0x0301, + 0x00E6, 0x0301, 0x00E6, 0x0304, 0x00F8, 0x0301, 0x0073, 0x0307, + 0x0292, 0x030C, 0x0292, 0x030C, 0x03B1, 0x0300, 0x03B1, 0x0301, + 0x03B1, 0x0301, 0x03B1, 0x0304, 0x03B1, 0x0306, 0x03B1, 0x0313, + KLongD, 0x0004, KLongD, 0x1004, KLongD, 0x0024, KLongD, 0x1024, + KLongD, 0x0080, KLongD, 0x1080, KLongD, 0x00A2, 0x03B1, 0x0314, + KLongD, 0x0028, KLongD, 0x1028, KLongD, 0x002C, KLongD, 0x102C, + KLongD, 0x0068, KLongD, 0x1068, KLongD, 0x01DD, 0x03B1, 0x0345, + 0x03B5, 0x0300, 0x03B5, 0x0301, 0x03B5, 0x0301, 0x03B5, 0x0313, + KLongD, 0x00E7, KLongD, 0x00F0, 0x03B5, 0x0314, KLongD, 0x00B4, + KLongD, 0x00BD, 0x03B7, 0x0300, 0x03B7, 0x0301, 0x03B7, 0x0301, + 0x03B7, 0x0313, KLongD, 0x0074, KLongD, 0x1074, KLongD, 0x0058, + KLongD, 0x1058, KLongD, 0x0014, KLongD, 0x1014, KLongD, 0x01B6, + 0x03B7, 0x0314, KLongD, 0x005C, KLongD, 0x105C, KLongD, 0x004C, + KLongD, 0x104C, KLongD, 0x001C, KLongD, 0x101C, KLongD, 0x0192, + 0x03B7, 0x0345, 0x03B9, 0x0300, 0x03B9, 0x0301, 0x03B9, 0x0301, + 0x03B9, 0x0304, 0x03B9, 0x0306, 0x03B9, 0x0308, 0x03B9, 0x0313, + KLongD, 0x028B, KLongD, 0x0294, KLongD, 0x015C, 0x03B9, 0x0314, + KLongD, 0x0246, KLongD, 0x024C, KLongD, 0x0126, 0x03BF, 0x0300, + 0x03BF, 0x0301, 0x03BF, 0x0301, 0x03BF, 0x0313, KLongD, 0x026D, + KLongD, 0x0273, 0x03BF, 0x0314, KLongD, 0x020A, KLongD, 0x020D, + 0x03C1, 0x0314, 0x03C5, 0x0300, 0x03C5, 0x0301, 0x03C5, 0x0301, + 0x03C5, 0x0304, 0x03C5, 0x0306, 0x03C5, 0x0308, 0x03C5, 0x0314, + KLongD, 0x0150, KLongD, 0x0153, KLongD, 0x0198, 0x03C9, 0x0300, + 0x03C9, 0x0301, 0x03C9, 0x0301, 0x03C9, 0x0313, KLongD, 0x000C, + KLongD, 0x100C, KLongD, 0x0088, KLongD, 0x1088, KLongD, 0x0040, + KLongD, 0x1040, KLongD, 0x0222, 0x03C9, 0x0314, KLongD, 0x008C, + KLongD, 0x108C, KLongD, 0x0078, KLongD, 0x1078, KLongD, 0x003C, + KLongD, 0x103C, KLongD, 0x01CB, 0x03C9, 0x0345, 0x03B1, 0x0300, + KLongD, 0x022B, 0x03B1, 0x0301, 0x03B1, 0x0301, KLongD, 0x01D4, + 0x03B1, 0x0304, 0x03B1, 0x0306, 0x03B1, 0x0313, KLongD, 0x0004, + KLongD, 0x1004, KLongD, 0x0024, KLongD, 0x1024, KLongD, 0x0080, + KLongD, 0x1080, KLongD, 0x00A2, 0x03B1, 0x0314, KLongD, 0x0028, + KLongD, 0x1028, KLongD, 0x002C, KLongD, 0x102C, KLongD, 0x0068, + KLongD, 0x1068, KLongD, 0x01DD, 0x03B1, 0x0342, KLongD, 0x00D2, + 0x03B1, 0x0345, 0x03B5, 0x0300, 0x03B5, 0x0301, 0x03B5, 0x0301, + 0x03B5, 0x0313, KLongD, 0x00E7, KLongD, 0x00F0, 0x03B5, 0x0314, + KLongD, 0x00B4, KLongD, 0x00BD, 0x03B7, 0x0300, KLongD, 0x0105, + 0x03B7, 0x0301, 0x03B7, 0x0301, KLongD, 0x00CF, 0x03B7, 0x0313, + KLongD, 0x0074, KLongD, 0x1074, KLongD, 0x0058, KLongD, 0x1058, + KLongD, 0x0014, KLongD, 0x1014, KLongD, 0x01B6, 0x03B7, 0x0314, + KLongD, 0x005C, KLongD, 0x105C, KLongD, 0x004C, KLongD, 0x104C, + KLongD, 0x001C, KLongD, 0x101C, KLongD, 0x0192, 0x03B7, 0x0342, + KLongD, 0x01E3, 0x03B7, 0x0345, 0x03B9, 0x0300, 0x03B9, 0x0301, + 0x03B9, 0x0301, 0x03B9, 0x0304, 0x03B9, 0x0306, 0x03B9, 0x0308, + KLongD, 0x0213, KLongD, 0x021C, KLongD, 0x021C, KLongD, 0x0108, + 0x03B9, 0x0313, KLongD, 0x028B, KLongD, 0x0294, KLongD, 0x015C, + 0x03B9, 0x0314, KLongD, 0x0246, KLongD, 0x024C, KLongD, 0x0126, + 0x03B9, 0x0342, 0x03BF, 0x0300, 0x03BF, 0x0301, 0x03BF, 0x0301, + 0x03BF, 0x0313, KLongD, 0x026D, KLongD, 0x0273, 0x03BF, 0x0314, + KLongD, 0x020A, KLongD, 0x020D, 0x03C1, 0x0313, 0x03C1, 0x0314, + 0x03C5, 0x0300, 0x03C5, 0x0301, 0x03C5, 0x0301, 0x03C5, 0x0304, + 0x03C5, 0x0306, 0x03C5, 0x0308, KLongD, 0x0135, KLongD, 0x013B, + KLongD, 0x013B, KLongD, 0x028E, 0x03C5, 0x0313, KLongD, 0x019E, + KLongD, 0x01A4, KLongD, 0x0090, 0x03C5, 0x0314, KLongD, 0x0150, + KLongD, 0x0153, KLongD, 0x0198, 0x03C5, 0x0342, 0x03C9, 0x0300, + KLongD, 0x0144, 0x03C9, 0x0301, 0x03C9, 0x0301, KLongD, 0x010B, + 0x03C9, 0x0313, KLongD, 0x000C, KLongD, 0x100C, KLongD, 0x0088, + KLongD, 0x1088, KLongD, 0x0040, KLongD, 0x1040, KLongD, 0x0222, + 0x03C9, 0x0314, KLongD, 0x008C, KLongD, 0x108C, KLongD, 0x0078, + KLongD, 0x1078, KLongD, 0x003C, KLongD, 0x103C, KLongD, 0x01CB, + 0x03C9, 0x0342, KLongD, 0x0252, 0x03C9, 0x0345, 0x03D2, 0x0301, + 0x03D2, 0x0308, 0x0456, 0x0308, 0x0430, 0x0306, 0x0430, 0x0308, + 0x0433, 0x0301, 0x0435, 0x0300, 0x0435, 0x0306, 0x0435, 0x0308, + 0x0436, 0x0306, 0x0436, 0x0308, 0x0437, 0x0308, 0x0438, 0x0300, + 0x0438, 0x0304, 0x0438, 0x0306, 0x0438, 0x0308, 0x043A, 0x0301, + 0x043E, 0x0308, 0x0443, 0x0304, 0x0443, 0x0306, 0x0443, 0x0308, + 0x0443, 0x030B, 0x0447, 0x0308, 0x044B, 0x0308, 0x044D, 0x0308, + 0x0430, 0x0306, 0x0430, 0x0308, 0x0433, 0x0301, 0x0435, 0x0300, + 0x0435, 0x0306, 0x0435, 0x0308, 0x0436, 0x0306, 0x0436, 0x0308, + 0x0437, 0x0308, 0x0438, 0x0300, 0x0438, 0x0304, 0x0438, 0x0306, + 0x0438, 0x0308, 0x043A, 0x0301, 0x043E, 0x0308, 0x0443, 0x0304, + 0x0443, 0x0306, 0x0443, 0x0308, 0x0443, 0x030B, 0x0447, 0x0308, + 0x044B, 0x0308, 0x044D, 0x0308, 0x0456, 0x0308, 0x0475, 0x030F, + 0x0475, 0x030F, 0x04D9, 0x0308, 0x04D9, 0x0308, 0x04E9, 0x0308, + 0x04E9, 0x0308, 0x05D9, 0x05B4, 0x0627, 0x0653, 0x0627, 0x0654, + 0x0627, 0x0655, 0x0648, 0x0654, 0x064A, 0x0654, 0x06C1, 0x0654, + 0x06D2, 0x0654, 0x06D5, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C, + 0x0933, 0x093C, 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x0B47, 0x0B3E, + 0x0B47, 0x0B56, 0x0B47, 0x0B57, 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, + 0x0BC6, 0x0BD7, 0x0BC7, 0x0BBE, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5, + 0x0CC6, 0x0CC2, KLongD, 0x0180, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6, + 0x0D46, 0x0D3E, 0x0D46, 0x0D57, 0x0D47, 0x0D3E, 0x0DD9, 0x0DCA, + 0x0DD9, 0x0DCF, KLongD, 0x00C3, 0x0DD9, 0x0DDF, 0x1025, 0x102E, + 0x1FBF, 0x0300, 0x1FBF, 0x0301, 0x1FBF, 0x0342, 0x1FFE, 0x0300, + 0x1FFE, 0x0301, 0x1FFE, 0x0342, 0x2190, 0x0338, 0x2192, 0x0338, + 0x2194, 0x0338, 0x21D0, 0x0338, 0x21D2, 0x0338, 0x21D4, 0x0338, + 0x2203, 0x0338, 0x2208, 0x0338, 0x220B, 0x0338, 0x2223, 0x0338, + 0x2225, 0x0338, 0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338, + 0x2248, 0x0338, 0x224D, 0x0338, 0x2261, 0x0338, 0x2264, 0x0338, + 0x2265, 0x0338, 0x2272, 0x0338, 0x2273, 0x0338, 0x2276, 0x0338, + 0x2277, 0x0338, 0x227A, 0x0338, 0x227B, 0x0338, 0x227C, 0x0338, + 0x227D, 0x0338, 0x2282, 0x0338, 0x2283, 0x0338, 0x2286, 0x0338, + 0x2287, 0x0338, 0x2291, 0x0338, 0x2292, 0x0338, 0x22A2, 0x0338, + 0x22A8, 0x0338, 0x22A9, 0x0338, 0x22AB, 0x0338, 0x22B2, 0x0338, + 0x22B3, 0x0338, 0x22B4, 0x0338, 0x22B5, 0x0338, 0x3046, 0x3099, + 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, + 0x3053, 0x3099, 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, + 0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, + 0x3064, 0x3099, 0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, + 0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099, + 0x3075, 0x309A, 0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099, + 0x307B, 0x309A, 0x309D, 0x3099, 0x30A6, 0x3099, 0x30AB, 0x3099, + 0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, + 0x30B5, 0x3099, 0x30B7, 0x3099, 0x30B9, 0x3099, 0x30BB, 0x3099, + 0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, + 0x30C6, 0x3099, 0x30C8, 0x3099, 0x30CF, 0x3099, 0x30CF, 0x309A, + 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A, + 0x30D8, 0x3099, 0x30D8, 0x309A, 0x30DB, 0x3099, 0x30DB, 0x309A, + 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099, + 0x30FD, 0x3099, 0x0308, 0x0301, 0x0915, 0x093C, 0x0916, 0x093C, + 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, + 0x092B, 0x093C, 0x092F, 0x093C, 0x09A1, 0x09BC, 0x09A2, 0x09BC, + 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C, + 0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B21, 0x0B3C, + 0x0B22, 0x0B3C, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7, + 0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72, + 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB3, 0x0F80, 0x0F71, 0x0F80, + 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, + 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5, 0x05F2, 0x05B7, 0x05E9, 0x05C1, + 0x05E9, 0x05C2, KLongD, 0x00E4, KLongD, 0x00EA, 0x05D0, 0x05B7, + 0x05D0, 0x05B8, 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, + 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, + 0x05D8, 0x05BC, 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, + 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, + 0x05E3, 0x05BC, 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, + 0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, + 0x05D1, 0x05BF, 0x05DB, 0x05BF, 0x05E4, 0x05BF + }; + +// Table of singleton decompositions and characters with singleton folds +const unsigned short KSingletonDecompositions[] = + { + 0x0300, 0x0301, 0x0313, 0x02B9, 0x003B, 0x00B7, 0x03B9, 0x0060, + 0x2002, 0x2003, 0x03A9, 0x004B, 0x3008, 0x3009, 0x8C48, 0x66F4, + 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951, + 0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, + 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A, + 0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, + 0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, + 0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, + 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F, + 0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6, + 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7, + 0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x96FB, + 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, + 0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, + 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578, + 0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, + 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9, + 0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973, + 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE, + 0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, + 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE, + 0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, + 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9, + 0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, + 0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1, + 0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, + 0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3, + 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D, + 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144, + 0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E, + 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC, + 0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, + 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92, + 0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, + 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D, + 0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, + 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD, + 0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4 + }; + +// Table of singleton folds +const unsigned short KSingletonFolds[] = + { + 0x0300, 0x0301, 0x0313, 0x02B9, 0x003B, 0x00B7, 0x03B9, 0x0060, + 0x2002, 0x2003, 0x03C9, 0x006B, 0x3008, 0x3009, 0x8C48, 0x66F4, + 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951, + 0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, + 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A, + 0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, + 0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, + 0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, + 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F, + 0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6, + 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7, + 0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x96FB, + 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, + 0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, + 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578, + 0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, + 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9, + 0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973, + 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE, + 0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, + 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE, + 0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, + 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9, + 0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, + 0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1, + 0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, + 0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3, + 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D, + 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144, + 0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E, + 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC, + 0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, + 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92, + 0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, + 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D, + 0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, + 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD, + 0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4, + 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, + 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, + 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x03BC, 0x00E6, 0x00F0, 0x00F8, 0x00FE, 0x0111, + 0x0127, 0x0069, 0x0133, 0x0140, 0x0142, 0x014B, 0x0153, 0x0167, + 0x0073, 0x0253, 0x0183, 0x0185, 0x0254, 0x0188, 0x0256, 0x0257, + 0x018C, 0x01DD, 0x0259, 0x025B, 0x0192, 0x0260, 0x0263, 0x0269, + 0x0268, 0x0199, 0x026F, 0x0272, 0x0275, 0x01A3, 0x01A5, 0x0280, + 0x01A8, 0x0283, 0x01AD, 0x0288, 0x028A, 0x028B, 0x01B4, 0x01B6, + 0x0292, 0x01B9, 0x01BD, 0x01C6, 0x01C6, 0x01C9, 0x01C9, 0x01CC, + 0x01CC, 0x01E5, 0x01F3, 0x01F3, 0x0195, 0x01BF, 0x021D, 0x0223, + 0x0225, 0x03B9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, + 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, + 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03C3, 0x03B2, 0x03B8, 0x03C6, 0x03C0, 0x03DB, + 0x03DD, 0x03DF, 0x03E1, 0x03E3, 0x03E5, 0x03E7, 0x03E9, 0x03EB, + 0x03ED, 0x03EF, 0x03BA, 0x03C1, 0x03C3, 0x0452, 0x0454, 0x0455, + 0x0456, 0x0458, 0x0459, 0x045A, 0x045B, 0x045F, 0x0430, 0x0431, + 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x043A, + 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, + 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, + 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x0461, 0x0463, 0x0465, + 0x0467, 0x0469, 0x046B, 0x046D, 0x046F, 0x0471, 0x0473, 0x0475, + 0x0479, 0x047B, 0x047D, 0x047F, 0x0481, 0x048D, 0x048F, 0x0491, + 0x0493, 0x0495, 0x0497, 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1, + 0x04A3, 0x04A5, 0x04A7, 0x04A9, 0x04AB, 0x04AD, 0x04AF, 0x04B1, + 0x04B3, 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, 0x04C4, + 0x04C8, 0x04CC, 0x04D5, 0x04D9, 0x04E1, 0x04E9, 0x0561, 0x0562, + 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056A, + 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, 0x0570, 0x0571, 0x0572, + 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057A, + 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, 0x0580, 0x0581, 0x0582, + 0x0583, 0x0584, 0x0585, 0x0586, 0x2170, 0x2171, 0x2172, 0x2173, + 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, + 0x217C, 0x217D, 0x217E, 0x217F, 0x24D0, 0x24D1, 0x24D2, 0x24D3, + 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, + 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, + 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0xFF41, 0xFF42, + 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, + 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, + 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A + }; + +// Total size: 31438 bytes diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/foldtable.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/foldtable.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,127 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\unicode\foldtable.inl +// Use the bits from 12 up from your character to index CaseFoldTable0. +// Use the result of this plus bits 8-11 to index CaseFoldTable1. +// Use the result of this plus bits 4-7 to index CaseFoldTable2. +// Use the result of this plus bits 0-3 to index CaseFoldTable3. +// Add the result of this to your character to fold it. +// +// + +static const short CaseFoldTable3[] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, + 0, 0, 0, 0, -128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 775, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 32, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -200, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -268, 0, 210, 1, 0, 1, + 0, 206, 1, 0, 205, 205, 1, 0, + 0, 79, 202, 203, 1, 0, 205, 207, + 0, 211, 209, 1, 0, 0, 0, 211, + 213, 0, 214, 0, 0, 1, 0, 1, + 0, 218, 1, 0, 218, 0, 0, 1, + 0, 218, 0, 217, 217, 1, 0, 1, + 0, 219, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 2, 1, 0, 2, 1, + 0, 2, 1, 0, 0, 0, 0, 2, + 1, 0, 0, 0, -97, -56, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 32, + 32, 0, 32, 32, 32, 32, 32, 32, + 32, 0, 0, 0, 0, 0, 0, -30, + -25, 0, 0, 0, -15, -22, 0, 0, + 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, + 0, -54, -48, -47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 80, 0, 80, 80, 80, 0, 80, + 80, 80, 80, 0, 0, 0, 80, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 0, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 1, 0, 1, 0, 1, 0, 0, + 0, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7173, 0, 0, 0, 0, 0, 0, -7517, + 0, 0, 0, -8383, 0, 0, 0, 0, + 0, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 0, 0, 0, 0, 0, 0, 26, + 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26 + }; + +static const unsigned short CaseFoldTable2[] = + { + 0, 0, 0, 0, 15, 20, 0, 0, + 0, 0, 36, 47, 57, 73, 0, 0, + 89, 99, 114, 128, 136, 99, 139, 155, + 171, 187, 202, 215, 0, 134, 230, 0, + 93, 244, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 15, 271, 0, 136, + 287, 297, 313, 327, 343, 353, 0, 0, + 0, 297, 369, 383, 297, 297, 297, 398, + 410, 418, 0, 0, 0, 433, 434, 443, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 450, 0, 0, 0, 0, 465, 0, 0, + 0, 481, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 497, 503, 0, + 0, 0, 15, 20, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }; + +static const unsigned char CaseFoldTable1[] = + { + 0, 15, 31, 43, 59, 74, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 85, 80, 99, + 80, 80, 106, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 120 + }; + +static const unsigned char CaseFoldTable0[] = + { + 0, 6, 22, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 28 + }; diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/unicode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/unicode.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,369 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\unicode\unicode.cpp +// The implementation of the base-level Unicode character classification functions. These are members of +// a class called TUnicode that contains a Unicode value. +// +// + +#include +#include "compareimp.h" + +static const TUnicodeData TheDefaultUnicodeData = + { TChar::ECnCategory, TChar::EOtherNeutral, 0, 0, 0, TUnicodeData::ENonNumeric }; + +// Fill in a TChar::TCharInfo structure with category information about the character. +void TUnicode::GetInfo(TChar::TCharInfo& aInfo,const TUnicodeDataSet *aOverridingDataSet) const + { + const TUnicodeData& data = GetData(aOverridingDataSet); + aInfo.iCategory = (TChar::TCategory)data.iCategory; + aInfo.iBdCategory = (TChar::TBdCategory)data.iBdCategory; + aInfo.iCombiningClass = data.iCombiningClass; + aInfo.iLowerCase = iCode; + aInfo.iUpperCase = iCode; + aInfo.iTitleCase = iCode; + if (data.iFlags & TUnicodeData::EHasLowerCase) + aInfo.iLowerCase = GetLowerCase(data); + if (data.iFlags & TUnicodeData::EHasUpperCase) + aInfo.iUpperCase = GetUpperCase(data); + if (data.iFlags & TUnicodeData::EHasTitleCase) + aInfo.iTitleCase = GetTitleCase(data); + aInfo.iMirrored = data.iFlags & TUnicodeData::EMirrored; + if (data.iFlags & TUnicodeData::ENumericFlags) + aInfo.iNumericValue = GetNumericValue(data); + else + aInfo.iNumericValue = -1; + } + +/* +Get the data describing a character. If "aOverridingDataSet" is non-null, look in that +data set before searching the standard data set. +*/ +const TUnicodeData& TUnicode::GetData(const TUnicodeDataSet *aOverridingDataSet) const + { + const TUnicodeData *result = NULL; + if (aOverridingDataSet) + result = GetDataFromDataSet(*aOverridingDataSet); + if (result == NULL) + { + if (0xFFFF < iCode) + // for now we have no data for values above U+FFFF + return TheDefaultUnicodeData; + int index = TheStandardUnicodeDataSet.iIndex1[iCode >> 4]; + if (index & 0x8000) // high bit set means all values in block have the same value, and it's in the index + index &= ~0x8000; + else + index = TheStandardUnicodeDataSet.iIndex2[index + (iCode & 0x000F)]; + return TheStandardUnicodeDataSet.iData[index]; + } + + return *result; + } + +/* +Given a character data set, get the data referring to this character. +Return NULL if no data is available in this data set. +*/ +const TUnicodeData *TUnicode::GetDataFromDataSet(const TUnicodeDataSet& aDataSet) const + { + // Perform a binary chop to find the range containing this character. + TInt n = aDataSet.iRanges; + const TUnicodeDataRange *base = aDataSet.iRange; + const TUnicodeDataRange *last = base + n - 1; + const TUnicodeDataRange *r = base; + + while (n > 1) + { + TInt pivot = n / 2; + r += pivot; + if (iCode < r->iRangeStart) // it's before this range + n = pivot; + else if (r < last && iCode >= r[1].iRangeStart) // it's after this range + { + base = r + 1; + n -= pivot + 1; + } + else // it's in this range + break; + r = base; + } + + if (r->iIndex >= 0) + return &aDataSet.iData[r->iIndex]; // index >= 0: data available + else + return NULL; // index < 0: no data available + } + +EXPORT_C TChar::TCategory TUnicode::GetCategory(const TUnicodeDataSet *aOverridingDataSet) const + { + return (TChar::TCategory)GetData(aOverridingDataSet).iCategory; + } + +TChar::TBdCategory TUnicode::GetBdCategory(const TUnicodeDataSet *aOverridingDataSet) const + { + return (TChar::TBdCategory)GetData(aOverridingDataSet).iBdCategory; + } + +TInt TUnicode::GetCombiningClass(const TUnicodeDataSet *aOverridingDataSet) const + { + return GetData(aOverridingDataSet).iCombiningClass; + } + +EXPORT_C TUint TUnicode::GetLowerCase(const TUnicodeDataSet *aOverridingDataSet) const + { + return GetLowerCase(GetData(aOverridingDataSet)); + } + +EXPORT_C TUint TUnicode::GetUpperCase(const TUnicodeDataSet *aOverridingDataSet) const + { + return GetUpperCase(GetData(aOverridingDataSet)); + } + +TUint TUnicode::GetLowerCase(const TUnicodeData& aData) const + { + if (aData.iFlags & TUnicodeData::EHasLowerCase) + return iCode + aData.iCaseOffset; + else + return iCode; + } + +TUint TUnicode::GetUpperCase(const TUnicodeData& aData) const + { + if (aData.iFlags & TUnicodeData::EHasUpperCase) + return iCode - aData.iCaseOffset; + else + return iCode; + } + +TUint TUnicode::GetTitleCase(const TUnicodeDataSet *aOverridingDataSet) const + { + return GetTitleCase(GetData(aOverridingDataSet)); + } + +TUint TUnicode::GetTitleCase(const TUnicodeData& aData) const + { + // Handle the very few characters with distinct title case variants. + if (aData.iFlags & TUnicodeData::EHasTitleCase) + { + // If the character has no upper case variant add one to get the title case form. + if (!(aData.iFlags & TUnicodeData::EHasUpperCase)) + return iCode + 1; + // If the character has no lower case variant subtract one to get the title case form. + if (!(aData.iFlags & TUnicodeData::EHasLowerCase)) + return iCode - 1; + // Both upper and lower case forms exist so the character itself must be title case. + return iCode; + } + + // All other characters have title case forms that are the same as their upper case forms. + return GetUpperCase(aData); + } + +TBool TUnicode::IsMirrored(const TUnicodeDataSet *aOverridingDataSet) const + { + return GetData(aOverridingDataSet).iFlags & TUnicodeData::EMirrored; + } + +TInt TUnicode::GetNumericValue(const TUnicodeDataSet *aOverridingDataSet) const + { + return GetNumericValue(GetData(aOverridingDataSet)); + } + +/* +Return the integer numeric value of this character. +Return -1 if the character is not numeric, or -2 if it has a fractional value. +*/ +TInt TUnicode::GetNumericValue(const TUnicodeData& aData) const + { + switch (aData.iFlags & TUnicodeData::ENumericFlags) + { + case TUnicodeData::ENonNumeric: return -1; + case TUnicodeData::ESmallNumeric: return (iCode + aData.iDigitOffset) & 0xFF; + case TUnicodeData::EFiveHundred: return 500; + case TUnicodeData::EOneThousand: return 1000; + case TUnicodeData::EFiveThousand: return 5000; + case TUnicodeData::ETenThousand: return 10000; + case TUnicodeData::EHundredThousand: return 100000; + case TUnicodeData::EFraction: return -2; + default: return -1; // we should never come here + } + } + +struct TWidthInfo + { + TUint iStart; + TUint iEnd; + TChar::TCjkWidth iWidth; + }; + +static const TWidthInfo TheWidthInfoTable[] = + { + { 0x0020, 0x007F, TChar::ENarrow }, + { 0x00A2, 0x00A4, TChar::ENarrow }, + { 0x00A5, 0x00A7, TChar::ENarrow }, + { 0x00AF, 0x00B0, TChar::ENarrow }, + { 0x00B1, 0x1100, TChar::ENeutralWidth }, + { 0x1100, 0x1160, TChar::EWide }, + { 0x1160, 0x2E80, TChar::ENeutralWidth }, + { 0x2E80, 0xD7A4, TChar::EWide }, + { 0xF900, 0xFA2E, TChar::EWide }, + { 0xFE30, 0xFE6C, TChar::EWide }, + { 0xFF01, 0xFF5F, TChar::EFullWidth }, + { 0xFF61, 0xFFDD, TChar::EHalfWidth }, + { 0xFFE0, 0xFFE7, TChar::EFullWidth }, + { 0xFFE8, 0xFFEF, TChar::EHalfWidth } + }; + +const TInt TheWidthInfos = sizeof(TheWidthInfoTable) / sizeof(TheWidthInfoTable[0]); + +/* +Get the notional width used by East Asian encoding systems. No check is made that the character is assigned. +No separate 'ambiguous width' is returned; ambiguous characters are treated as neutral except for those +in the CJK range, which are treated as wide. This is a big simplification, but the cost of an exhaustive table +is too great to justify at the moment. +*/ +TChar::TCjkWidth TUnicode::GetCjkWidth() const + { + const TWidthInfo* w = TheWidthInfoTable; + for (int i = 0; i < TheWidthInfos; i++, w++) + if (iCode >= w->iStart && iCode < w->iEnd) + return w->iWidth; + return TChar::ENeutralWidth; + } + +/* +Convert a Unicode character into a form most likely to be equal to another character, while +still preserving the essential meaning of the character. Possible folding operations include +converting to lower case (TChar::EFoldCase), stripping accents (TChar::EFoldAccents) and others. +The flag value has a default, TChar::EFoldStandard, which performs the folding operations done +by calling Fold functions with no flags argument, and there is also TChar::EFoldAll, +which performs all possible folding operations. + +Note that the difference between folding and collation is that folding is + * character-based + * biased towards yielding equality where possible +while collation is + * string-based + * designed to yield a non-equal ordering + +Typically, folding will be used when searching for a match, while collation will be used when +sorting a list. +*/ +EXPORT_C TUint TUnicode::Fold(TInt aFlags,const TUnicodeDataSet *aOverridingDataSet) const + { + TUint result = iCode; + + /* + Fold CJK width variants. This only applies to characters 0xFF00 and above so we can use + a built-in table. + */ + if (result >= 0xFF00 && (aFlags & TChar::EFoldWidth)) + result = CjkWidthFoldTable[result & 0xFF]; + + /* + If the character is <= 0x00FF and the flags include folding case and stripping accents, + and there is no overriding character data, we can use the built-in fold table. + */ + const TUnicodeData* data = NULL; + if (aOverridingDataSet) + data = GetDataFromDataSet(*aOverridingDataSet); + if (data == NULL && result < 256 && + (aFlags & (TChar::EFoldCase | TChar::EFoldAccents)) == (TChar::EFoldCase | TChar::EFoldAccents)) + return FoldTable[result]; + + /* + Other characters have to be dealt with laboriously. + The first operations are those that, if successful, tell us that nothing more + need be done. If a value is folded to a space or a digit or converted to Katakana + it cannot have anything else done to it. + */ + if (aFlags & TChar::EFoldKana) + { + if ((result >= 0x3041 && result <= 0x3094) || result == 0x309D || result == 0x309E) + return result += 0x0060; + } + if (data == NULL) + data = &GetData(NULL); + if (aFlags & TChar::EFoldSpaces) + { + if (data->iCategory == TChar::EZsCategory) + return 0x0020; + } + if (aFlags & TChar::EFoldDigits) + { + TInt n = GetNumericValue(*data); + if (n >= 0 && n <= 9) + return 0x0030 + n; + } + + /* + The final operations are the relatively rare and expensive ones (after the special + case dealt with above) of accent removal and case conversion. + */ + if ((aFlags & TChar::EFoldAccents) && (result < 0x2000)) + { + /* + Throw away characters other than the first if all are accents. For the moment these + are defined as characters in the range 0x0300..0x0361. This definition may need + to be modified; or I may decide to store a flag in the decomposition table indicating + whether or not the decomposition consists of base + accent(s). + */ + TPtrC16 decomposition; + if (::DecomposeChar(iCode, decomposition)) + { + TBool all_accents = TRUE; + for (TInt i = 1; all_accents && i < decomposition.Length(); ++i) + { + if (decomposition[i] < 0x0300 || decomposition[i] > 0x0361) + all_accents = FALSE; + } + if (all_accents) + result = decomposition[0]; + } + } + + if (aFlags & TChar::EFoldCase) + { + if (aOverridingDataSet == NULL && result < 256) + result = FoldTable[result]; + else + result = TUnicode(result).GetLowerCase(aOverridingDataSet); + } + + return result; + } + +/* +Compare two Unicode strings naively by Unicode value. This is NOT the same as a comparison +of null-terminated strings; the strings can contain null characters (Unicode 0x0000) and they +compare greater than no character. This means that the string { 0x0001 0x0000 } always comes +after the string { 0x0001 }. + +This function exists to make it easier to search tables of Unicode strings (like the composition +buffer) using the binary chop method. It is also used by READTYPE when sorting the compose table. + +The return values are: 0 for equality, < 0 if aString1 < aString2, > 0 if aString1 > aString2. +*/ +TInt TUnicode::Compare(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2) + { + for (TInt i = 0; i < aLength1 || i < aLength2; i++, aString1++, aString2++) + { + TInt x = i < aLength1 ? *aString1 : -1; + TInt y = i < aLength2 ? *aString2 : -1; + if (x != y) + return x - y; + } + return 0; + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/unicode/unitable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/unicode/unitable.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1357 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Unicode character information tables. +// Written by the READTYPE program. +// Please read the 'Unicode Character Data and Line Break data Update History.doc' file for detailed history of updates to this file. +// This file was generated by the READTYPE tool using unicodedata-3.0.0_IndicCharsFrom_5.0.txt on 09/04/2007 +// The contents of this file were generated automatically. Please do not edit this manually. +// This description has been added/edited manually. +// +// + +#include + +const TUint16 TheTrieIndex1[4096] = + { + 0x0000,0x000e,0x001e,0x002e,0x003d,0x0042,0x0052,0x0057,0x0066,0x8000,0x0076,0x0086,0x8011,0x0096,0x8014,0x00a6, + 0x00b6,0x00b6,0x00b6,0x00c6,0x00d0,0x00b6,0x00b6,0x00da,0x00ea,0x00fa,0x010a,0x011a,0x012a,0x0138,0x00b6,0x0148, + 0x00b6,0x00b6,0x0158,0x0164,0x803e,0x0174,0x0184,0x0194,0x01a4,0x01b2,0x01b5,0x01c5,0x01d3,0x01d3,0x01e3,0x803e, + 0x804d,0x01f3,0x0202,0x020e,0x021b,0x803e,0x022b,0x0237,0x0246,0x0256,0x0264,0x0274,0x0282,0x0292,0x00b6,0x02a2, + 0x8066,0x8011,0x8011,0x8014,0x8014,0x8065,0x00b6,0x00b6,0x02b2,0x00b6,0x00b6,0x00b6,0x02c2,0x00b6,0x00b6,0x02d2, + 0x803e,0x803e,0x803e,0x02e1,0x8069,0x02ea,0x02fa,0x806b,0x0303,0x0312,0x0320,0x0330,0x0340,0x807f,0x0350,0x0360, + 0x0365,0x0372,0x0382,0x0387,0x0397,0x03a7,0x03b7,0x03c7,0x8081,0x8081,0x8081,0x8081,0x8081,0x03d3,0x03e2,0x03f2, + 0x0402,0x0412,0x0385,0x0422,0x0431,0x803e,0x803e,0x803e,0x8081,0x8081,0x0441,0x0450,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x045f,0x8036,0x8036,0x0465,0x0474,0x0484,0x0492,0x04a2,0x04b2,0x04be,0x04c5,0x04d4,0x04e3,0x04f2,0x0501,0x0511, + 0x0520,0x04be,0x04c5,0x052f,0x053e,0x054c,0x055b,0x056b,0x057a,0x0586,0x04c5,0x0595,0x05a4,0x05b4,0x0501,0x05c3, + 0x04b2,0x04be,0x04c5,0x05d3,0x05e1,0x05ef,0x05fe,0x060e,0x061c,0x062b,0x063b,0x0649,0x0659,0x0667,0x0671,0x0681, + 0x0690,0x069c,0x04c5,0x06a8,0x06b7,0x06c5,0x05fe,0x803e,0x06d3,0x069c,0x04c5,0x06dc,0x06ec,0x06fa,0x0501,0x0709, + 0x06d3,0x069c,0x04c5,0x0649,0x0719,0x0667,0x05fe,0x803e,0x0727,0x0730,0x8036,0x073e,0x074e,0x075d,0x803e,0x076d, + 0x077c,0x8036,0x8036,0x078b,0x079b,0x07ab,0x803e,0x803e,0x07ba,0x07c8,0x07d8,0x07e7,0x07f7,0x0807,0x803e,0x803e, + 0x0817,0x0824,0x0834,0x0840,0x0580,0x8036,0x0850,0x085f,0x086f,0x087f,0x8092,0x0888,0x0896,0x803e,0x803e,0x803e, + 0x8036,0x8036,0x08a6,0x08b5,0x08c5,0x08d5,0x803e,0x803e,0x803e,0x803e,0x8061,0x8061,0x08e5,0x8036,0x8036,0x08f5, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x0905,0x8036,0x8036,0x8036,0x8036,0x090c,0x8036,0x8036,0x8036,0x8036,0x0914, + 0x0581,0x8036,0x8036,0x8036,0x0924,0x0924,0x8036,0x8036,0x0924,0x8036,0x0934,0x0942,0x0942,0x0581,0x0934,0x8036, + 0x0934,0x0942,0x8036,0x8036,0x0581,0x0850,0x0951,0x095f,0x803e,0x803e,0x8036,0x8036,0x8036,0x8036,0x8036,0x096f, + 0x077c,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x097f,0x098e,0x099e,0x09a3,0x8036,0x8036,0x8036,0x8036,0x09b3,0x09c2, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x8036,0x8036,0x8036,0x09d2,0x09e0,0x09ee,0x09fe,0x803e, + 0x0a0e,0x0a1e,0x8036,0x8036,0x0a2e,0x8036,0x8036,0x0a36,0x8036,0x8036,0x0a46,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x0a56,0x00b6,0x00b6,0x00b6,0x00b6,0x00b6,0x015e, + 0x0a66,0x0a76,0x0a66,0x0a66,0x0a76,0x0a86,0x0a66,0x0a96,0x0aa6,0x0aa6,0x0aa6,0x0ab6,0x0ac5,0x0ad5,0x0ae5,0x0af5, + 0x0b05,0x0b15,0x0b25,0x0b35,0x0b44,0x803e,0x0b52,0x0b62,0x0b72,0x803e,0x8007,0x803e,0x803e,0x0b82,0x0b91,0x803e, + 0x0ba1,0x0bb1,0x0bbf,0x0bcf,0x803e,0x0bdc,0x0bec,0x0bfc,0x0c0c,0x0c1c,0x0c2c,0x8016,0x0c3b,0x0c4b,0x8016,0x0c57, + 0x0c67,0x0c76,0x0c81,0x0c8d,0x0c98,0x0ca6,0x0cb5,0x800f,0x0cc3,0x0cd2,0x0ce0,0x0ce7,0x0cf7,0x0d03,0x0d09,0x0d19, + 0x0d29,0x8016,0x0d33,0x0d3e,0x8067,0x8067,0x8067,0x0d44,0x8016,0x0d51,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x8016,0x8016,0x0c54,0x803e,0x0c50,0x803e,0x80f2,0x0d61,0x0d69,0x0d71,0x8067,0x0d7d,0x80f5,0x80f6,0x0d8d,0x803e, + 0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x0c55,0x8016,0x0c33,0x0c39,0x8016,0x8016,0x0c53, + 0x8016,0x0d9d,0x8016,0x8016,0x8016,0x8016,0x0da6,0x0db6,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x0dc5,0x8016,0x0dd1,0x8016,0x0dda,0x0de9,0x0df0,0x0dfa,0x0e0a,0x0e16,0x8016,0x0e1d,0x803e,0x803e,0x803e,0x803e, + 0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x8016,0x0e22,0x8016,0x8016,0x8016,0x8016,0x8016,0x0c57, + 0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x8016,0x0c55,0x803e,0x0e2d, + 0x0e3d,0x0e4b,0x0e5b,0x0e6b,0x077c,0x8036,0x8036,0x8036,0x8036,0x0e7b,0x077c,0x8036,0x8036,0x8036,0x8036,0x0e8b, + 0x0778,0x8036,0x0e9b,0x077c,0x8036,0x8036,0x8036,0x8036,0x0934,0x0eab,0x8036,0x0a36,0x803e,0x803e,0x803e,0x803e, + 0x8067,0x0eb1,0x0ec1,0x8067,0x0ecd,0x803e,0x8067,0x0edd,0x0eed,0x8067,0x8067,0x0efc,0x0f0c,0x8067,0x8067,0x0f1c, + 0x8067,0x8067,0x8067,0x8067,0x8067,0x8067,0x8067,0x0f11,0x8067,0x8067,0x8067,0x8067,0x8067,0x0f1d,0x8067,0x0f1c, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0f2d,0x803e,0x803e,0x803e,0x803e, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0f2d,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0e9b,0x8016,0x0f3d,0x0dd5,0x0f4c,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x0f5c,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104,0x8104, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105,0x8105, + 0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036,0x8036, + 0x8036,0x8036,0x0f6c,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e,0x803e, + 0x0f7c,0x0f89,0x0f98,0x0fa2,0x0fb2,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x0fc2,0x803e,0x0fcf,0x8081,0x8081, + 0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081, + 0x8081,0x8081,0x8081,0x0fd2,0x803e,0x8081,0x8081,0x8081,0x8081,0x0fd0,0x8081,0x8081,0x0fe2,0x803e,0x803e,0x0386, + 0x803e,0x803e,0x0ff2,0x1002,0x100e,0x101e,0x102e,0x103e,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x8081,0x1044, + 0x1054,0x1064,0x003d,0x1074,0x0052,0x1084,0x1093,0x10a3,0x8036,0x10a5,0x8036,0x0934,0x10b5,0x10bd,0x10cd,0x10dc + }; +const TUint16 TheTrieIndex2[4332] = + { + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0002,0x0001,0x0003,0x0002,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0002,0x0002,0x0001,0x0004,0x0005, + 0x0005,0x0006,0x0007,0x0006,0x0005,0x0005,0x0008,0x0009,0x0005,0x000a,0x000b,0x000c,0x000b,0x000d,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000e,0x000b,0x0005,0x000f,0x0010,0x000f,0x0005,0x0011,0x0011, + 0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0008,0x0005,0x0009,0x0012,0x0013,0x0012,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014, + 0x0014,0x0014,0x0008,0x0010,0x0009,0x0010,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0015,0x0005,0x0007,0x0007,0x0007,0x0007,0x0016,0x0016,0x0012,0x0016, + 0x0017,0x0018,0x0010,0x0019,0x0016,0x0012,0x001a,0x000a,0x001b,0x001b,0x0012,0x001c,0x0016,0x0005,0x0012,0x001d,0x0017,0x001e,0x001f,0x001f,0x001f,0x0005,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0010,0x0011,0x0011, + 0x0011,0x0011,0x0011,0x0011,0x0011,0x0017,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0010,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0020,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022, + 0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0023,0x0024,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0017,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0017,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022, + 0x0021,0x0022,0x0025,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0026,0x0017,0x0027,0x0021,0x0022,0x0021,0x0022,0x0028,0x0021,0x0022,0x0029,0x0029,0x0021,0x0022,0x0017,0x002a,0x002b,0x002c,0x0021,0x0022,0x0029,0x002d,0x002e, + 0x002f,0x0030,0x0021,0x0022,0x0017,0x0017,0x002f,0x0031,0x0017,0x0032,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0033,0x0021,0x0022,0x0033,0x0017,0x0017,0x0021,0x0022,0x0033,0x0021,0x0022,0x0034,0x0034,0x0021,0x0022,0x0021, + 0x0022,0x0035,0x0021,0x0022,0x0017,0x0036,0x0021,0x0022,0x0017,0x0037,0x0036,0x0036,0x0036,0x0036,0x0038,0x0039,0x003a,0x0038,0x0039,0x003a,0x0038,0x0039,0x003a,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021, + 0x0022,0x0021,0x0022,0x0021,0x0022,0x003b,0x0021,0x0022,0x0017,0x0038,0x0039,0x003a,0x0021,0x0022,0x003c,0x003d,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022, + 0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0017,0x0017,0x0017,0x003f,0x0040,0x0017,0x0041,0x0041,0x0017,0x0042,0x0017,0x0043, + 0x0017,0x0017,0x0017,0x0017,0x0041,0x0017,0x0017,0x0044,0x0017,0x0017,0x0017,0x0017,0x0045,0x0046,0x0017,0x0017,0x0017,0x0017,0x0017,0x0046,0x0017,0x0017,0x0047,0x0017,0x0017,0x0048,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017, + 0x0017,0x0017,0x0017,0x0017,0x0049,0x0017,0x0017,0x0049,0x0017,0x0017,0x0017,0x0017,0x0049,0x0017,0x004a,0x004a,0x0017,0x0017,0x0017,0x0017,0x004b,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017,0x0017, + 0x0017,0x0017,0x0017,0x003e,0x003e,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x004c,0x0012,0x0012,0x004c,0x004c,0x004c,0x004c,0x004c,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012, + 0x0012,0x0012,0x0012,0x004c,0x004c,0x004c,0x004c,0x004c,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x0012,0x004c,0x003e,0x004d,0x004d,0x004d,0x004d,0x004d,0x004e,0x004f,0x004f,0x004f,0x004f,0x004e,0x0050,0x004f, + 0x004f,0x004f,0x004f,0x0051,0x0051,0x004f,0x004f,0x004f,0x004f,0x0051,0x0051,0x004f,0x004f,0x004f,0x004f,0x004f,0x004f,0x004f,0x0052,0x0052,0x0052,0x0052,0x0052,0x004f,0x004f,0x004f,0x004f,0x004d,0x004d,0x004d,0x004d,0x004d, + 0x0053,0x004d,0x004f,0x004f,0x004f,0x004d,0x004d,0x004d,0x004f,0x004f,0x003e,0x0054,0x0054,0x0055,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0012,0x0012,0x003e,0x003e,0x003e, + 0x003e,0x004c,0x003e,0x003e,0x003e,0x0005,0x003e,0x003e,0x003e,0x003e,0x0012,0x0012,0x0056,0x0005,0x0057,0x0057,0x0057,0x003e,0x0058,0x003e,0x0059,0x0059,0x0017,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011, + 0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x003e,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x005a,0x005b,0x005b,0x005b,0x0017,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014, + 0x0014,0x0014,0x0014,0x0014,0x005c,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x005d,0x005e,0x005e,0x003e,0x005f,0x0060,0x0061,0x0061,0x0061,0x0062,0x0063,0x0017,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022, + 0x0021,0x0022,0x0064,0x0065,0x003b,0x0017,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0021,0x0022,0x0067,0x004d,0x004d,0x004d,0x004d,0x003e,0x0068,0x0068,0x003e,0x003e,0x0021,0x0022, + 0x0021,0x0022,0x0061,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x003e,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x003e,0x003e,0x0021,0x0022,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x0069,0x003e,0x003e,0x004c,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x003e,0x006b,0x006b,0x006b,0x006b,0x006b, + 0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x006b,0x0017,0x003e,0x006a,0x0019,0x003e,0x003e,0x003e,0x003e,0x003e,0x004f,0x004d,0x004d,0x004d,0x004d,0x004f,0x004d,0x004d,0x004d,0x006c,0x004f,0x004d,0x004d, + 0x004d,0x004d,0x003e,0x004f,0x004f,0x004f,0x004f,0x004f,0x004d,0x004d,0x004f,0x004d,0x004d,0x006c,0x006d,0x004d,0x006e,0x006f,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x003e,0x0078,0x0079,0x007a,0x007b,0x007c, + 0x007b,0x007d,0x007e,0x007b,0x004d,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x007f,0x007f,0x007f,0x007b,0x007b,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x000b,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0080,0x003e,0x003e, + 0x003e,0x0080,0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x003e,0x003e,0x003e,0x003e,0x003e,0x0082,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081, + 0x0081,0x0081,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x004d,0x004d,0x004f,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b,0x008b, + 0x008b,0x0006,0x008c,0x008c,0x0080,0x003e,0x003e,0x008d,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0080,0x0081,0x004d,0x004d,0x004d,0x004d,0x004d,0x004d,0x004d, + 0x0068,0x0068,0x004d,0x004d,0x004d,0x004f,0x004d,0x0082,0x0082,0x004d,0x004d,0x0016,0x004f,0x004d,0x004d,0x004f,0x003e,0x003e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x008e,0x0081,0x0081,0x0081,0x008f, + 0x008f,0x003e,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x003e,0x0090,0x0081,0x0091,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081, + 0x0081,0x0081,0x004d,0x004f,0x004d,0x004d,0x004f,0x004d,0x004d,0x004f,0x004f,0x004f,0x004d,0x004f,0x004f,0x004d,0x004f,0x004d,0x004d,0x004f,0x004d,0x004f,0x004d,0x004f,0x004d,0x004f,0x004d,0x004d,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x0092,0x0092,0x0093,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0094,0x0036,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0093,0x0093,0x0093, + 0x0093,0x0095,0x003e,0x003e,0x0036,0x004d,0x004f,0x004d,0x004d,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0092,0x0092,0x006a,0x006a,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096, + 0x0096,0x0096,0x006a,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0092,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e, + 0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e, + 0x0094,0x0036,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x003e,0x003e,0x0093,0x0093,0x003e,0x003e,0x0093,0x0093,0x0095,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036, + 0x003e,0x0036,0x0036,0x0092,0x0092,0x003e,0x003e,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0036,0x0036,0x0007,0x0007,0x0098,0x0098,0x0098,0x0098,0x0099,0x009a,0x0067,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x0092,0x0092,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x003e,0x0094,0x003e,0x0093,0x0093,0x0092, + 0x0092,0x003e,0x003e,0x003e,0x003e,0x0092,0x0092,0x003e,0x003e,0x0092,0x0092,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0092,0x0092,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0092,0x0092,0x0093,0x003e,0x0036, + 0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e, + 0x003e,0x0094,0x0036,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x0092,0x0092,0x0093,0x003e,0x0093,0x0093,0x0095,0x003e,0x003e,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x0007,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0094, + 0x0036,0x0093,0x0092,0x0092,0x0092,0x003e,0x003e,0x003e,0x0093,0x0093,0x003e,0x003e,0x0093,0x0093,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0092,0x0093,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036, + 0x003e,0x003e,0x003e,0x003e,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0096,0x0067,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0092,0x0036, + 0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x003e,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036, + 0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x0092,0x0093,0x0093,0x003e,0x003e,0x003e,0x0093, + 0x0093,0x0093,0x003e,0x0093,0x0093,0x0093,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097,0x0097, + 0x0097,0x009b,0x009c,0x009d,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0007,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036, + 0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0092,0x0092,0x0093,0x0093,0x0093,0x0093,0x003e,0x0092,0x0092,0x0092, + 0x003e,0x0092,0x0092,0x0092,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x009e,0x009f,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036, + 0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0094,0x0036,0x0093,0x00a0,0x0093,0x0093,0x0093,0x0093,0x0093,0x003e,0x00a0,0x0093,0x0093,0x003e,0x0093,0x0093,0x0092,0x0095,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093, + 0x0093,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x003e,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0093,0x0092,0x0092,0x0092,0x003e,0x003e,0x0093, + 0x0093,0x0093,0x003e,0x0093,0x0093,0x0093,0x0095,0x003e,0x003e,0x0093,0x0093,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036, + 0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0095,0x003e,0x003e,0x003e,0x003e,0x0093,0x0093,0x0092, + 0x0092,0x0092,0x003e,0x0092,0x003e,0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x003e,0x003e,0x0093,0x0093,0x006a,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036, + 0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0092,0x0036,0x0036,0x0092,0x0092,0x0092,0x0092,0x00a1,0x00a1,0x0095,0x003e,0x003e,0x003e,0x003e,0x0007,0x0036,0x0036,0x0036,0x0036,0x0036, + 0x0036,0x004c,0x0092,0x00a2,0x00a2,0x00a2,0x00a2,0x0092,0x0092,0x0092,0x006a,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x00a3,0x006a,0x006a,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x003e, + 0x003e,0x0036,0x0036,0x003e,0x0036,0x003e,0x003e,0x0036,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x0036, + 0x003e,0x003e,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0092,0x0036,0x0036,0x0092,0x0092,0x0092,0x0092,0x00a4,0x00a4,0x003e,0x0092,0x0092,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x004c,0x003e,0x00a5, + 0x00a5,0x00a5,0x00a5,0x0092,0x0092,0x003e,0x003e,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x00a6,0x003e,0x003e,0x0036,0x0036,0x003e,0x003e,0x0036,0x0067,0x0067,0x0067,0x006a,0x006a,0x006a,0x006a,0x006a, + 0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x0067,0x0067,0x0067,0x0067,0x0067,0x004f,0x004f,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x00a7,0x0099,0x0099, + 0x0099,0x0099,0x0099,0x0099,0x0067,0x004f,0x0067,0x004f,0x0067,0x0050,0x00a8,0x00a9,0x00a8,0x00a9,0x0093,0x0093,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x00aa,0x00ab,0x0092,0x00ac,0x0092,0x0092,0x0092,0x0092,0x0092,0x00ab,0x00ab,0x00ab,0x00ab,0x0092,0x0093,0x00ab,0x0092,0x004d,0x004d,0x0095,0x006a,0x004d,0x004d,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x0092, + 0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x003e,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x004f,0x0067,0x0067,0x0067, + 0x0067,0x0067,0x0067,0x003e,0x003e,0x0067,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x003e,0x0093,0x0092,0x0092,0x0092,0x0093,0x0092,0x003e,0x003e,0x003e,0x0092,0x0094,0x0093,0x0095,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x00ad,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0093,0x0093,0x0092,0x0092,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x0061,0x0061,0x0061,0x0061,0x0061,0x0061,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e, + 0x006a,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036, + 0x0036,0x0036,0x0036,0x003e,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x00ae,0x00ae,0x00ae,0x00ae,0x00ae,0x00ae, + 0x00ae,0x00af,0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036, + 0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x006a,0x006a,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0004,0x0036, + 0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x00a8,0x00a9,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x006a,0x006a, + 0x006a,0x00ba,0x00ba,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0093,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092, + 0x0093,0x0093,0x0093,0x0093,0x0093,0x0093,0x0092,0x0093,0x0093,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0092,0x0095,0x0092,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x006a,0x0007,0x006a,0x003e,0x003e,0x003e,0x00bb,0x00bb, + 0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x00bb,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0019,0x0005,0x0005,0x0005,0x0005,0x0090,0x0090,0x0090,0x0090,0x003e,0x00bc,0x00bc, + 0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x00bc,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x004c,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x006d,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0021,0x0022,0x0021,0x0022,0x0021,0x0022,0x0017,0x0017,0x0017,0x0017, + 0x0017,0x00bd,0x003e,0x003e,0x003e,0x003e,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00bf,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x003e,0x003e,0x00bf,0x00bf, + 0x00bf,0x00bf,0x00bf,0x00bf,0x003e,0x003e,0x0017,0x00be,0x0017,0x00be,0x0017,0x00be,0x0017,0x00be,0x003e,0x00bf,0x003e,0x00bf,0x003e,0x00bf,0x003e,0x00bf,0x00c0,0x00c0,0x00c1,0x00c1,0x00c1,0x00c1,0x00c2,0x00c2,0x00c3,0x00c3, + 0x00c4,0x00c4,0x00c5,0x00c5,0x003e,0x003e,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00be,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00c6,0x00be,0x00be,0x0017,0x00c7,0x0017,0x003e,0x0017,0x0017,0x00bf,0x00bf, + 0x00c8,0x00c8,0x00c9,0x0012,0x00ca,0x0012,0x0012,0x0017,0x00c7,0x0017,0x003e,0x0017,0x0017,0x00cb,0x00cb,0x00cb,0x00cb,0x00c9,0x0012,0x0012,0x0012,0x00be,0x00be,0x0017,0x0017,0x003e,0x003e,0x0017,0x0017,0x00bf,0x00bf,0x00cc, + 0x00cc,0x003e,0x0012,0x0012,0x0012,0x00be,0x00be,0x0017,0x0017,0x0017,0x00cd,0x0017,0x0017,0x00bf,0x00bf,0x00ce,0x00ce,0x00cf,0x0012,0x0012,0x0012,0x003e,0x003e,0x0017,0x00c7,0x0017,0x003e,0x0017,0x0017,0x00d0,0x00d0,0x00d1, + 0x00d1,0x00c9,0x0012,0x0012,0x003e,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x00d2,0x0090,0x0090,0x00d3,0x00d4,0x0019,0x0019,0x0019,0x0019,0x0019,0x0019,0x0005,0x0005,0x00d5,0x00d6,0x00a8, + 0x00d5,0x00d5,0x00d6,0x00a8,0x00d5,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x0004,0x0006,0x0006,0x0006,0x0006,0x0006,0x0005,0x0005,0x0005,0x0005,0x0018,0x001e, + 0x0005,0x0005,0x0005,0x0005,0x0013,0x0005,0x0005,0x0005,0x0010,0x0008,0x0009,0x003e,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0090,0x0090,0x0090,0x0090, + 0x0090,0x0090,0x00de,0x003e,0x003e,0x003e,0x00de,0x00de,0x00de,0x00de,0x00de,0x00de,0x000a,0x000a,0x0010,0x0008,0x0009,0x0017,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x00df,0x000a,0x000a,0x0010,0x0008, + 0x0009,0x003e,0x004d,0x004d,0x0052,0x0052,0x004d,0x004d,0x004d,0x004d,0x0052,0x0052,0x0052,0x004d,0x004d,0x0068,0x0068,0x0068,0x004d,0x0068,0x0068,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x0016,0x0016,0x0061,0x0016,0x0016,0x0016,0x0016,0x0061,0x0016,0x0016,0x0017,0x0061,0x0061,0x0061,0x0017,0x0017,0x0061,0x0061,0x0061,0x0017,0x0016,0x0061,0x0016,0x0016,0x0016,0x0061,0x0061,0x0061,0x0061,0x0061,0x0016, + 0x0016,0x0016,0x0016,0x0061,0x0016,0x00e0,0x0016,0x0061,0x0016,0x00e1,0x00e2,0x0061,0x0061,0x001a,0x0017,0x0061,0x0061,0x0016,0x0061,0x0017,0x0036,0x0036,0x0036,0x0036,0x0017,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x001f, + 0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x001f,0x00e3,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00e9,0x00e9,0x00e9, + 0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,0x00f0,0x00f1,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0010,0x0010,0x0010,0x0010, + 0x0010,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0010,0x0016,0x0016,0x0016,0x0016,0x0010,0x0016,0x0016,0x0010,0x0016,0x0016,0x0010,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0016,0x0016,0x0016,0x0016,0x0016, + 0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0010,0x0016,0x0016,0x0010,0x0016,0x0010,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0010,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x000f,0x000a,0x000a,0x0010,0x000f,0x000f,0x0010,0x0010,0x0010, + 0x000f,0x000f,0x000f,0x000f,0x0010,0x000f,0x0010,0x000f,0x0010,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f, + 0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x0010,0x000f,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f, + 0x000f,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010, + 0x0010,0x0010,0x000f,0x000f,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010,0x0010, + 0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x0010,0x0010,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x000f,0x0010,0x0010,0x000f,0x000f,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x000f,0x000f,0x000f,0x000f,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0008,0x0009,0x0016,0x0016, + 0x0016,0x0016,0x0016,0x0016,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0067,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x00f2,0x00f2,0x00f2,0x00f2,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f3,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x00f4,0x0067,0x0067,0x0067, + 0x0067,0x0067,0x0067,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f5,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f6,0x00f7,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016, + 0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0010,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016, + 0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x003e,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f8,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00f9,0x00fa,0x00fa,0x00fa,0x00fa,0x00fa,0x00fa,0x0016,0x003e,0x003e,0x003e,0x0016,0x0016, + 0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e,0x0004,0x0005,0x0005, + 0x0005,0x0016,0x004c,0x0036,0x00fb,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0016,0x0016,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0008,0x0009,0x0019,0x00a8,0x00a9,0x00a9,0x0016,0x00fc,0x00fc,0x00fc,0x00fc, + 0x00fc,0x00fc,0x00fc,0x00fc,0x00fc,0x00fd,0x006d,0x004e,0x006c,0x00fe,0x00fe,0x0019,0x004c,0x004c,0x004c,0x004c,0x004c,0x0016,0x0016,0x00ff,0x0100,0x0101,0x003e,0x003e,0x003e,0x0016,0x0016,0x0036,0x0036,0x0036,0x0036,0x0036, + 0x003e,0x003e,0x003e,0x003e,0x0102,0x0102,0x0012,0x0012,0x004c,0x004c,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0013,0x004c,0x004c,0x004c,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036, + 0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0067,0x0067,0x0099,0x0099,0x0099,0x0099,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e, + 0x003e,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0099,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0067,0x0067,0x0067, + 0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e,0x0067,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0103,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x003e,0x003e,0x0067,0x0067,0x0067,0x0067, + 0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x0067,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0016,0x0016,0x003e, + 0x003e,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x0016,0x003e,0x0016,0x0016,0x0016,0x003e,0x0016,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0017,0x0017,0x0017,0x0017, + 0x0017,0x0017,0x0017,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0017,0x0017,0x0017,0x0017,0x0017,0x003e,0x003e,0x003e,0x003e,0x003e,0x007f,0x0106,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f, + 0x007f,0x000a,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x003e,0x007f,0x007f,0x007f,0x007f,0x007f,0x003e,0x007f,0x003e,0x007f,0x007f,0x003e,0x007f,0x007f,0x003e,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f, + 0x007f,0x007f,0x0081,0x0081,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081, + 0x00a8,0x00a9,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x004d,0x004d,0x004d,0x004d,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x0005,0x0019,0x0019,0x0013,0x0013,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x003e,0x003e,0x003e,0x003e,0x0005,0x0005,0x0005,0x0005,0x0013,0x0013,0x0013,0x000b,0x0005, + 0x000b,0x003e,0x0005,0x000b,0x0005,0x0005,0x0019,0x00a8,0x00a9,0x00a8,0x00a9,0x00a8,0x00a9,0x0006,0x0005,0x0005,0x000a,0x000c,0x0010,0x0010,0x0010,0x003e,0x0005,0x0007,0x0006,0x0005,0x003e,0x003e,0x003e,0x003e,0x0081,0x0081, + 0x0081,0x003e,0x0081,0x003e,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x0081,0x003e,0x003e,0x0090,0x003e,0x0005,0x0005,0x0006,0x0007,0x0006,0x0005,0x0005,0x00a8,0x00a9,0x0005,0x000a, + 0x000b,0x000c,0x000b,0x000d,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x0107,0x000b,0x0005,0x0010,0x0010,0x0010,0x0005,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x0011,0x00a8, + 0x0005,0x00a9,0x0012,0x0013,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x0014,0x00a8,0x0010,0x00a9,0x0010,0x003e,0x0005,0x00a8,0x00a9,0x0005,0x0013,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036, + 0x0036,0x0036,0x0036,0x004c,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x004c,0x004c,0x003e,0x003e,0x0036,0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036, + 0x0036,0x0036,0x0036,0x0036,0x0036,0x003e,0x003e,0x0036,0x0036,0x0036,0x003e,0x003e,0x003e,0x0007,0x0007,0x0010,0x0012,0x0016,0x0007,0x0007,0x003e,0x0016,0x0010,0x0010,0x0010,0x0010,0x0016,0x0016,0x003e,0x003e,0x003e,0x003e, + 0x003e,0x003e,0x003e,0x003e,0x003e,0x0090,0x0090,0x0090,0x0016,0x0016,0x003e,0x003e + }; +static const TUnicodeData TheUnicodeData[] = + { // 264 entries + { 128, 14, 0, 0, 0, 0 }, + { 128, 16, 0, 0, 0, 0 }, + { 128, 15, 0, 0, 0, 0 }, + { 128, 17, 0, 0, 0, 0 }, + { 112, 17, 0, 0, 0, 0 }, + { 86, 18, 0, 0, 0, 0 }, + { 86, 10, 0, 0, 0, 0 }, + { 97, 10, 0, 0, 0, 0 }, + { 82, 18, 0, 0, 0, 8 }, + { 83, 18, 0, 0, 0, 8 }, + { 96, 10, 0, 0, 0, 0 }, + { 86, 12, 0, 0, 0, 0 }, + { 81, 10, 0, 0, 0, 0 }, + { 86, 9, 0, 0, 0, 0 }, + { 64, 8, 0, -48, 0, 16 }, + { 96, 18, 0, 0, 0, 8 }, + { 96, 18, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 32, 1 }, + { 98, 18, 0, 0, 0, 0 }, + { 80, 18, 0, 0, 0, 0 }, + { 1, 0, 0, 0, 32, 2 }, + { 112, 12, 0, 0, 0, 0 }, + { 99, 18, 0, 0, 0, 0 }, + { 1, 0, 0, 0, 0, 0 }, + { 84, 18, 0, 0, 0, 8 }, + { 81, 18, 0, 0, 0, 0 }, + { 99, 10, 0, 0, 0, 0 }, + { 66, 8, 0, 80, 0, 16 }, + { 1, 0, 0, 0, -743, 2 }, + { 66, 8, 0, 72, 0, 16 }, + { 85, 18, 0, 0, 0, 8 }, + { 66, 18, 0, 0, 0, 112 }, + { 1, 0, 0, 0, -121, 2 }, + { 0, 0, 0, 0, 1, 1 }, + { 1, 0, 0, 0, 1, 2 }, + { 0, 0, 0, 0, -199, 1 }, + { 1, 0, 0, 0, 232, 2 }, + { 0, 0, 0, 0, -121, 1 }, + { 1, 0, 0, 0, 300, 2 }, + { 0, 0, 0, 0, 210, 1 }, + { 0, 0, 0, 0, 206, 1 }, + { 0, 0, 0, 0, 205, 1 }, + { 0, 0, 0, 0, 79, 1 }, + { 0, 0, 0, 0, 202, 1 }, + { 0, 0, 0, 0, 203, 1 }, + { 0, 0, 0, 0, 207, 1 }, + { 1, 0, 0, 0, -97, 2 }, + { 0, 0, 0, 0, 211, 1 }, + { 0, 0, 0, 0, 209, 1 }, + { 0, 0, 0, 0, 213, 1 }, + { 0, 0, 0, 0, 214, 1 }, + { 0, 0, 0, 0, 218, 1 }, + { 0, 0, 0, 0, 217, 1 }, + { 0, 0, 0, 0, 219, 1 }, + { 16, 0, 0, 0, 0, 0 }, + { 1, 0, 0, 0, -56, 2 }, + { 0, 0, 0, 0, 2, 5 }, + { 2, 0, 0, 0, 1, 7 }, + { 1, 0, 0, 0, 2, 6 }, + { 1, 0, 0, 0, 79, 2 }, + { 0, 0, 0, 0, -97, 1 }, + { 0, 0, 0, 0, -56, 1 }, + { 242, 0, 0, 0, 0, 0 }, + { 1, 0, 0, 0, 210, 2 }, + { 1, 0, 0, 0, 206, 2 }, + { 1, 0, 0, 0, 205, 2 }, + { 1, 0, 0, 0, 202, 2 }, + { 1, 0, 0, 0, 203, 2 }, + { 1, 0, 0, 0, 207, 2 }, + { 1, 0, 0, 0, 209, 2 }, + { 1, 0, 0, 0, 211, 2 }, + { 1, 0, 0, 0, 213, 2 }, + { 1, 0, 0, 0, 214, 2 }, + { 1, 0, 0, 0, 218, 2 }, + { 1, 0, 0, 0, 217, 2 }, + { 1, 0, 0, 0, 219, 2 }, + { 32, 0, 0, 0, 0, 0 }, + { 48, 13, 230, 0, 0, 0 }, + { 48, 13, 232, 0, 0, 0 }, + { 48, 13, 220, 0, 0, 0 }, + { 48, 13, 216, 0, 0, 0 }, + { 48, 13, 202, 0, 0, 0 }, + { 48, 13, 1, 0, 0, 0 }, + { 48, 13, 240, 0, -84, 2 }, + { 48, 13, 234, 0, 0, 0 }, + { 48, 13, 233, 0, 0, 0 }, + { 0, 0, 0, 0, 38, 1 }, + { 0, 0, 0, 0, 37, 1 }, + { 0, 0, 0, 0, 64, 1 }, + { 0, 0, 0, 0, 63, 1 }, + { 1, 0, 0, 0, 38, 2 }, + { 1, 0, 0, 0, 37, 2 }, + { 1, 0, 0, 0, 31, 2 }, + { 1, 0, 0, 0, 64, 2 }, + { 1, 0, 0, 0, 63, 2 }, + { 1, 0, 0, 0, 62, 2 }, + { 1, 0, 0, 0, 57, 2 }, + { 0, 0, 0, 0, 0, 0 }, + { 1, 0, 0, 0, 47, 2 }, + { 1, 0, 0, 0, 54, 2 }, + { 1, 0, 0, 0, 86, 2 }, + { 1, 0, 0, 0, 80, 2 }, + { 0, 0, 0, 0, 80, 1 }, + { 99, 0, 0, 0, 0, 0 }, + { 50, 13, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 48, 1 }, + { 86, 0, 0, 0, 0, 0 }, + { 1, 0, 0, 0, 48, 2 }, + { 48, 13, 222, 0, 0, 0 }, + { 48, 13, 228, 0, 0, 0 }, + { 48, 13, 10, 0, 0, 0 }, + { 48, 13, 11, 0, 0, 0 }, + { 48, 13, 12, 0, 0, 0 }, + { 48, 13, 13, 0, 0, 0 }, + { 48, 13, 14, 0, 0, 0 }, + { 48, 13, 15, 0, 0, 0 }, + { 48, 13, 16, 0, 0, 0 }, + { 48, 13, 17, 0, 0, 0 }, + { 48, 13, 18, 0, 0, 0 }, + { 48, 13, 19, 0, 0, 0 }, + { 48, 13, 20, 0, 0, 0 }, + { 48, 13, 21, 0, 0, 0 }, + { 48, 13, 22, 0, 0, 0 }, + { 86, 3, 0, 0, 0, 0 }, + { 48, 13, 23, 0, 0, 0 }, + { 48, 13, 24, 0, 0, 0 }, + { 48, 13, 25, 0, 0, 0 }, + { 16, 3, 0, 0, 0, 0 }, + { 86, 4, 0, 0, 0, 0 }, + { 16, 4, 0, 0, 0, 0 }, + { 32, 4, 0, 0, 0, 0 }, + { 48, 13, 27, 0, 0, 0 }, + { 48, 13, 28, 0, 0, 0 }, + { 48, 13, 29, 0, 0, 0 }, + { 48, 13, 30, 0, 0, 0 }, + { 48, 13, 31, 0, 0, 0 }, + { 48, 13, 32, 0, 0, 0 }, + { 48, 13, 33, 0, 0, 0 }, + { 48, 13, 34, 0, 0, 0 }, + { 64, 11, 0, -96, 0, 16 }, + { 86, 11, 0, 0, 0, 0 }, + { 48, 13, 35, 0, 0, 0 }, + { 64, 8, 0, 16, 0, 16 }, + { 99, 4, 0, 0, 0, 0 }, + { 129, 14, 0, 0, 0, 0 }, + { 48, 13, 36, 0, 0, 0 }, + { 48, 13, 0, 0, 0, 0 }, + { 49, 0, 0, 0, 0, 0 }, + { 48, 13, 7, 0, 0, 0 }, + { 48, 13, 9, 0, 0, 0 }, + { 64, 0, 0, -102, 0, 16 }, + { 64, 0, 0, 26, 0, 16 }, + { 66, 0, 0, 13, 0, 16 }, + { 66, 0, 0, 0, 0, 0 }, + { 66, 0, 0, 23, 0, 16 }, + { 66, 0, 0, 26, 0, 16 }, + { 66, 0, 0, 115, 0, 16 }, + { 66, 0, 0, 0, 0, 48 }, + { 48, 13, 84, 0, 0, 0 }, + { 48, 13, 91, 0, 0, 0 }, + { 48, 0, 0, 0, 0, 0 }, + { 48, 13, 103, 0, 0, 0 }, + { 48, 13, 107, 0, 0, 0 }, + { 64, 0, 0, -80, 0, 16 }, + { 48, 13, 118, 0, 0, 0 }, + { 48, 13, 122, 0, 0, 0 }, + { 64, 0, 0, 48, 0, 16 }, + { 64, 0, 0, -32, 0, 16 }, + { 82, 18, 0, 0, 0, 0 }, + { 83, 18, 0, 0, 0, 0 }, + { 48, 13, 129, 0, 0, 0 }, + { 48, 13, 130, 0, 0, 0 }, + { 48, 13, 132, 0, 0, 0 }, + { 64, 0, 0, -64, 0, 16 }, + { 64, 0, 0, -104, 0, 16 }, + { 66, 0, 0, -104, 0, 16 }, + { 66, 0, 0, -95, 0, 16 }, + { 66, 0, 0, -86, 0, 16 }, + { 66, 0, 0, -77, 0, 16 }, + { 66, 0, 0, -68, 0, 16 }, + { 66, 0, 0, -59, 0, 16 }, + { 66, 0, 0, -50, 0, 16 }, + { 66, 0, 0, -41, 0, 16 }, + { 66, 0, 0, -32, 0, 16 }, + { 66, 0, 0, -23, 0, 16 }, + { 66, 0, 0, 0, 0, 80 }, + { 66, 0, 0, 35, 0, 16 }, + { 64, 0, 0, 32, 0, 16 }, + { 64, 0, 0, -16, 0, 16 }, + { 1, 0, 0, 0, 59, 2 }, + { 1, 0, 0, 0, -8, 2 }, + { 0, 0, 0, 0, -8, 1 }, + { 1, 0, 0, 0, -74, 2 }, + { 1, 0, 0, 0, -86, 2 }, + { 1, 0, 0, 0, -100, 2 }, + { 1, 0, 0, 0, -128, 2 }, + { 1, 0, 0, 0, -112, 2 }, + { 1, 0, 0, 0, -126, 2 }, + { 2, 0, 0, 0, -8, 1 }, + { 1, 0, 0, 0, -9, 2 }, + { 0, 0, 0, 0, -74, 1 }, + { 2, 0, 0, 0, -9, 1 }, + { 1, 0, 0, 0, 7205, 2 }, + { 0, 0, 0, 0, -86, 1 }, + { 0, 0, 0, 0, -100, 1 }, + { 1, 0, 0, 0, -7, 2 }, + { 0, 0, 0, 0, -112, 1 }, + { 0, 0, 0, 0, -7, 1 }, + { 0, 0, 0, 0, -128, 1 }, + { 0, 0, 0, 0, -126, 1 }, + { 112, 14, 0, 0, 0, 0 }, + { 129, 0, 0, 0, 0, 0 }, + { 129, 3, 0, 0, 0, 0 }, + { 84, 18, 0, 0, 0, 0 }, + { 85, 18, 0, 0, 0, 0 }, + { 113, 17, 0, 0, 0, 0 }, + { 114, 15, 0, 0, 0, 0 }, + { 129, 1, 0, 0, 0, 0 }, + { 129, 5, 0, 0, 0, 0 }, + { 129, 7, 0, 0, 0, 0 }, + { 129, 2, 0, 0, 0, 0 }, + { 129, 6, 0, 0, 0, 0 }, + { 66, 8, 0, -112, 0, 16 }, + { 66, 8, 0, -128, 0, 16 }, + { 0, 0, 0, 0, -7517, 1 }, + { 0, 0, 0, 0, -8383, 1 }, + { 0, 0, 0, 0, -8262, 1 }, + { 66, 18, 0, -94, 0, 16 }, + { 65, 0, 0, -95, 16, 17 }, + { 65, 0, 0, -58, 16, 17 }, + { 65, 0, 0, -9, 16, 17 }, + { 65, 0, 0, 0, 16, 33 }, + { 65, 0, 0, 0, 16, 49 }, + { 65, 0, 0, -111, 16, 18 }, + { 65, 0, 0, -74, 16, 18 }, + { 65, 0, 0, -25, 16, 18 }, + { 65, 0, 0, 0, 16, 34 }, + { 65, 0, 0, 0, 16, 50 }, + { 65, 0, 0, 0, 0, 48 }, + { 65, 0, 0, 0, 0, 64 }, + { 65, 0, 0, 0, 0, 80 }, + { 65, 0, 0, 0, 0, 0 }, + { 66, 8, 0, -95, 0, 16 }, + { 66, 8, 0, -115, 0, 16 }, + { 66, 8, 0, 121, 0, 16 }, + { 99, 0, 0, 0, 26, 1 }, + { 99, 0, 0, 0, 26, 2 }, + { 66, 8, 0, 22, 0, 16 }, + { 66, 18, 0, -117, 0, 16 }, + { 66, 18, 0, -127, 0, 16 }, + { 66, 18, 0, 119, 0, 16 }, + { 65, 0, 0, -7, 0, 16 }, + { 65, 0, 0, -32, 0, 16 }, + { 48, 13, 218, 0, 0, 0 }, + { 48, 13, 224, 0, 0, 0 }, + { 65, 0, 0, -46, 0, 16 }, + { 65, 0, 0, -37, 0, 16 }, + { 65, 0, 0, -28, 0, 16 }, + { 48, 13, 8, 0, 0, 0 }, + { 66, 0, 0, -127, 0, 16 }, + { 240, 0, 0, 0, 0, 0 }, + { 241, 0, 0, 0, 0, 0 }, + { 48, 13, 26, 0, 0, 0 }, + { 64, 8, 0, -16, 0, 16 } + }; + +const TStandardUnicodeDataSet TheStandardUnicodeDataSet = + { + TheTrieIndex1, + TheTrieIndex2, + TheUnicodeData + }; + +const TUint16 TheUnicodeCompositionBuffer[] = + { // 4921 entries + 0x00c0,0x0002,0x0041,0x0300,0x00c1,0x0002,0x0041,0x0301, + 0x00c2,0x0002,0x0041,0x0302,0x00c3,0x0002,0x0041,0x0303, + 0x00c4,0x0002,0x0041,0x0308,0x00c5,0x0002,0x0041,0x030a, + 0x00c7,0x0002,0x0043,0x0327,0x00c8,0x0002,0x0045,0x0300, + 0x00c9,0x0002,0x0045,0x0301,0x00ca,0x0002,0x0045,0x0302, + 0x00cb,0x0002,0x0045,0x0308,0x00cc,0x0002,0x0049,0x0300, + 0x00cd,0x0002,0x0049,0x0301,0x00ce,0x0002,0x0049,0x0302, + 0x00cf,0x0002,0x0049,0x0308,0x00d1,0x0002,0x004e,0x0303, + 0x00d2,0x0002,0x004f,0x0300,0x00d3,0x0002,0x004f,0x0301, + 0x00d4,0x0002,0x004f,0x0302,0x00d5,0x0002,0x004f,0x0303, + 0x00d6,0x0002,0x004f,0x0308,0x00d9,0x0002,0x0055,0x0300, + 0x00da,0x0002,0x0055,0x0301,0x00db,0x0002,0x0055,0x0302, + 0x00dc,0x0002,0x0055,0x0308,0x00dd,0x0002,0x0059,0x0301, + 0x00e0,0x0002,0x0061,0x0300,0x00e1,0x0002,0x0061,0x0301, + 0x00e2,0x0002,0x0061,0x0302,0x00e3,0x0002,0x0061,0x0303, + 0x00e4,0x0002,0x0061,0x0308,0x00e5,0x0002,0x0061,0x030a, + 0x00e7,0x0002,0x0063,0x0327,0x00e8,0x0002,0x0065,0x0300, + 0x00e9,0x0002,0x0065,0x0301,0x00ea,0x0002,0x0065,0x0302, + 0x00eb,0x0002,0x0065,0x0308,0x00ec,0x0002,0x0069,0x0300, + 0x00ed,0x0002,0x0069,0x0301,0x00ee,0x0002,0x0069,0x0302, + 0x00ef,0x0002,0x0069,0x0308,0x00f1,0x0002,0x006e,0x0303, + 0x00f2,0x0002,0x006f,0x0300,0x00f3,0x0002,0x006f,0x0301, + 0x00f4,0x0002,0x006f,0x0302,0x00f5,0x0002,0x006f,0x0303, + 0x00f6,0x0002,0x006f,0x0308,0x00f9,0x0002,0x0075,0x0300, + 0x00fa,0x0002,0x0075,0x0301,0x00fb,0x0002,0x0075,0x0302, + 0x00fc,0x0002,0x0075,0x0308,0x00fd,0x0002,0x0079,0x0301, + 0x00ff,0x0002,0x0079,0x0308,0x0100,0x0002,0x0041,0x0304, + 0x0101,0x0002,0x0061,0x0304,0x0102,0x0002,0x0041,0x0306, + 0x0103,0x0002,0x0061,0x0306,0x0104,0x0002,0x0041,0x0328, + 0x0105,0x0002,0x0061,0x0328,0x0106,0x0002,0x0043,0x0301, + 0x0107,0x0002,0x0063,0x0301,0x0108,0x0002,0x0043,0x0302, + 0x0109,0x0002,0x0063,0x0302,0x010a,0x0002,0x0043,0x0307, + 0x010b,0x0002,0x0063,0x0307,0x010c,0x0002,0x0043,0x030c, + 0x010d,0x0002,0x0063,0x030c,0x010e,0x0002,0x0044,0x030c, + 0x010f,0x0002,0x0064,0x030c,0x0112,0x0002,0x0045,0x0304, + 0x0113,0x0002,0x0065,0x0304,0x0114,0x0002,0x0045,0x0306, + 0x0115,0x0002,0x0065,0x0306,0x0116,0x0002,0x0045,0x0307, + 0x0117,0x0002,0x0065,0x0307,0x0118,0x0002,0x0045,0x0328, + 0x0119,0x0002,0x0065,0x0328,0x011a,0x0002,0x0045,0x030c, + 0x011b,0x0002,0x0065,0x030c,0x011c,0x0002,0x0047,0x0302, + 0x011d,0x0002,0x0067,0x0302,0x011e,0x0002,0x0047,0x0306, + 0x011f,0x0002,0x0067,0x0306,0x0120,0x0002,0x0047,0x0307, + 0x0121,0x0002,0x0067,0x0307,0x0122,0x0002,0x0047,0x0327, + 0x0123,0x0002,0x0067,0x0327,0x0124,0x0002,0x0048,0x0302, + 0x0125,0x0002,0x0068,0x0302,0x0128,0x0002,0x0049,0x0303, + 0x0129,0x0002,0x0069,0x0303,0x012a,0x0002,0x0049,0x0304, + 0x012b,0x0002,0x0069,0x0304,0x012c,0x0002,0x0049,0x0306, + 0x012d,0x0002,0x0069,0x0306,0x012e,0x0002,0x0049,0x0328, + 0x012f,0x0002,0x0069,0x0328,0x0130,0x0002,0x0049,0x0307, + 0x0134,0x0002,0x004a,0x0302,0x0135,0x0002,0x006a,0x0302, + 0x0136,0x0002,0x004b,0x0327,0x0137,0x0002,0x006b,0x0327, + 0x0139,0x0002,0x004c,0x0301,0x013a,0x0002,0x006c,0x0301, + 0x013b,0x0002,0x004c,0x0327,0x013c,0x0002,0x006c,0x0327, + 0x013d,0x0002,0x004c,0x030c,0x013e,0x0002,0x006c,0x030c, + 0x0143,0x0002,0x004e,0x0301,0x0144,0x0002,0x006e,0x0301, + 0x0145,0x0002,0x004e,0x0327,0x0146,0x0002,0x006e,0x0327, + 0x0147,0x0002,0x004e,0x030c,0x0148,0x0002,0x006e,0x030c, + 0x014c,0x0002,0x004f,0x0304,0x014d,0x0002,0x006f,0x0304, + 0x014e,0x0002,0x004f,0x0306,0x014f,0x0002,0x006f,0x0306, + 0x0150,0x0002,0x004f,0x030b,0x0151,0x0002,0x006f,0x030b, + 0x0154,0x0002,0x0052,0x0301,0x0155,0x0002,0x0072,0x0301, + 0x0156,0x0002,0x0052,0x0327,0x0157,0x0002,0x0072,0x0327, + 0x0158,0x0002,0x0052,0x030c,0x0159,0x0002,0x0072,0x030c, + 0x015a,0x0002,0x0053,0x0301,0x015b,0x0002,0x0073,0x0301, + 0x015c,0x0002,0x0053,0x0302,0x015d,0x0002,0x0073,0x0302, + 0x015e,0x0002,0x0053,0x0327,0x015f,0x0002,0x0073,0x0327, + 0x0160,0x0002,0x0053,0x030c,0x0161,0x0002,0x0073,0x030c, + 0x0162,0x0002,0x0054,0x0327,0x0163,0x0002,0x0074,0x0327, + 0x0164,0x0002,0x0054,0x030c,0x0165,0x0002,0x0074,0x030c, + 0x0168,0x0002,0x0055,0x0303,0x0169,0x0002,0x0075,0x0303, + 0x016a,0x0002,0x0055,0x0304,0x016b,0x0002,0x0075,0x0304, + 0x016c,0x0002,0x0055,0x0306,0x016d,0x0002,0x0075,0x0306, + 0x016e,0x0002,0x0055,0x030a,0x016f,0x0002,0x0075,0x030a, + 0x0170,0x0002,0x0055,0x030b,0x0171,0x0002,0x0075,0x030b, + 0x0172,0x0002,0x0055,0x0328,0x0173,0x0002,0x0075,0x0328, + 0x0174,0x0002,0x0057,0x0302,0x0175,0x0002,0x0077,0x0302, + 0x0176,0x0002,0x0059,0x0302,0x0177,0x0002,0x0079,0x0302, + 0x0178,0x0002,0x0059,0x0308,0x0179,0x0002,0x005a,0x0301, + 0x017a,0x0002,0x007a,0x0301,0x017b,0x0002,0x005a,0x0307, + 0x017c,0x0002,0x007a,0x0307,0x017d,0x0002,0x005a,0x030c, + 0x017e,0x0002,0x007a,0x030c,0x01a0,0x0002,0x004f,0x031b, + 0x01a1,0x0002,0x006f,0x031b,0x01af,0x0002,0x0055,0x031b, + 0x01b0,0x0002,0x0075,0x031b,0x01cd,0x0002,0x0041,0x030c, + 0x01ce,0x0002,0x0061,0x030c,0x01cf,0x0002,0x0049,0x030c, + 0x01d0,0x0002,0x0069,0x030c,0x01d1,0x0002,0x004f,0x030c, + 0x01d2,0x0002,0x006f,0x030c,0x01d3,0x0002,0x0055,0x030c, + 0x01d4,0x0002,0x0075,0x030c,0x01d5,0x0002,0x00dc,0x0304, + 0x01d6,0x0002,0x00fc,0x0304,0x01d7,0x0002,0x00dc,0x0301, + 0x01d8,0x0002,0x00fc,0x0301,0x01d9,0x0002,0x00dc,0x030c, + 0x01da,0x0002,0x00fc,0x030c,0x01db,0x0002,0x00dc,0x0300, + 0x01dc,0x0002,0x00fc,0x0300,0x01de,0x0002,0x00c4,0x0304, + 0x01df,0x0002,0x00e4,0x0304,0x01e0,0x0002,0x0226,0x0304, + 0x01e1,0x0002,0x0227,0x0304,0x01e2,0x0002,0x00c6,0x0304, + 0x01e3,0x0002,0x00e6,0x0304,0x01e6,0x0002,0x0047,0x030c, + 0x01e7,0x0002,0x0067,0x030c,0x01e8,0x0002,0x004b,0x030c, + 0x01e9,0x0002,0x006b,0x030c,0x01ea,0x0002,0x004f,0x0328, + 0x01eb,0x0002,0x006f,0x0328,0x01ec,0x0002,0x01ea,0x0304, + 0x01ed,0x0002,0x01eb,0x0304,0x01ee,0x0002,0x01b7,0x030c, + 0x01ef,0x0002,0x0292,0x030c,0x01f0,0x0002,0x006a,0x030c, + 0x01f4,0x0002,0x0047,0x0301,0x01f5,0x0002,0x0067,0x0301, + 0x01f8,0x0002,0x004e,0x0300,0x01f9,0x0002,0x006e,0x0300, + 0x01fa,0x0002,0x00c5,0x0301,0x01fb,0x0002,0x00e5,0x0301, + 0x01fc,0x0002,0x00c6,0x0301,0x01fd,0x0002,0x00e6,0x0301, + 0x01fe,0x0002,0x00d8,0x0301,0x01ff,0x0002,0x00f8,0x0301, + 0x0200,0x0002,0x0041,0x030f,0x0201,0x0002,0x0061,0x030f, + 0x0202,0x0002,0x0041,0x0311,0x0203,0x0002,0x0061,0x0311, + 0x0204,0x0002,0x0045,0x030f,0x0205,0x0002,0x0065,0x030f, + 0x0206,0x0002,0x0045,0x0311,0x0207,0x0002,0x0065,0x0311, + 0x0208,0x0002,0x0049,0x030f,0x0209,0x0002,0x0069,0x030f, + 0x020a,0x0002,0x0049,0x0311,0x020b,0x0002,0x0069,0x0311, + 0x020c,0x0002,0x004f,0x030f,0x020d,0x0002,0x006f,0x030f, + 0x020e,0x0002,0x004f,0x0311,0x020f,0x0002,0x006f,0x0311, + 0x0210,0x0002,0x0052,0x030f,0x0211,0x0002,0x0072,0x030f, + 0x0212,0x0002,0x0052,0x0311,0x0213,0x0002,0x0072,0x0311, + 0x0214,0x0002,0x0055,0x030f,0x0215,0x0002,0x0075,0x030f, + 0x0216,0x0002,0x0055,0x0311,0x0217,0x0002,0x0075,0x0311, + 0x0218,0x0002,0x0053,0x0326,0x0219,0x0002,0x0073,0x0326, + 0x021a,0x0002,0x0054,0x0326,0x021b,0x0002,0x0074,0x0326, + 0x021e,0x0002,0x0048,0x030c,0x021f,0x0002,0x0068,0x030c, + 0x0226,0x0002,0x0041,0x0307,0x0227,0x0002,0x0061,0x0307, + 0x0228,0x0002,0x0045,0x0327,0x0229,0x0002,0x0065,0x0327, + 0x022a,0x0002,0x00d6,0x0304,0x022b,0x0002,0x00f6,0x0304, + 0x022c,0x0002,0x00d5,0x0304,0x022d,0x0002,0x00f5,0x0304, + 0x022e,0x0002,0x004f,0x0307,0x022f,0x0002,0x006f,0x0307, + 0x0230,0x0002,0x022e,0x0304,0x0231,0x0002,0x022f,0x0304, + 0x0232,0x0002,0x0059,0x0304,0x0233,0x0002,0x0079,0x0304, + 0x0340,0x0001,0x0300,0x0341,0x0001,0x0301,0x0343,0x0001, + 0x0313,0x0344,0x0002,0x0308,0x0301,0x0374,0x0001,0x02b9, + 0x037e,0x0001,0x003b,0x0385,0x0002,0x00a8,0x0301,0x0386, + 0x0002,0x0391,0x0301,0x0387,0x0001,0x00b7,0x0388,0x0002, + 0x0395,0x0301,0x0389,0x0002,0x0397,0x0301,0x038a,0x0002, + 0x0399,0x0301,0x038c,0x0002,0x039f,0x0301,0x038e,0x0002, + 0x03a5,0x0301,0x038f,0x0002,0x03a9,0x0301,0x0390,0x0002, + 0x03ca,0x0301,0x03aa,0x0002,0x0399,0x0308,0x03ab,0x0002, + 0x03a5,0x0308,0x03ac,0x0002,0x03b1,0x0301,0x03ad,0x0002, + 0x03b5,0x0301,0x03ae,0x0002,0x03b7,0x0301,0x03af,0x0002, + 0x03b9,0x0301,0x03b0,0x0002,0x03cb,0x0301,0x03ca,0x0002, + 0x03b9,0x0308,0x03cb,0x0002,0x03c5,0x0308,0x03cc,0x0002, + 0x03bf,0x0301,0x03cd,0x0002,0x03c5,0x0301,0x03ce,0x0002, + 0x03c9,0x0301,0x03d3,0x0002,0x03d2,0x0301,0x03d4,0x0002, + 0x03d2,0x0308,0x0400,0x0002,0x0415,0x0300,0x0401,0x0002, + 0x0415,0x0308,0x0403,0x0002,0x0413,0x0301,0x0407,0x0002, + 0x0406,0x0308,0x040c,0x0002,0x041a,0x0301,0x040d,0x0002, + 0x0418,0x0300,0x040e,0x0002,0x0423,0x0306,0x0419,0x0002, + 0x0418,0x0306,0x0439,0x0002,0x0438,0x0306,0x0450,0x0002, + 0x0435,0x0300,0x0451,0x0002,0x0435,0x0308,0x0453,0x0002, + 0x0433,0x0301,0x0457,0x0002,0x0456,0x0308,0x045c,0x0002, + 0x043a,0x0301,0x045d,0x0002,0x0438,0x0300,0x045e,0x0002, + 0x0443,0x0306,0x0476,0x0002,0x0474,0x030f,0x0477,0x0002, + 0x0475,0x030f,0x04c1,0x0002,0x0416,0x0306,0x04c2,0x0002, + 0x0436,0x0306,0x04d0,0x0002,0x0410,0x0306,0x04d1,0x0002, + 0x0430,0x0306,0x04d2,0x0002,0x0410,0x0308,0x04d3,0x0002, + 0x0430,0x0308,0x04d6,0x0002,0x0415,0x0306,0x04d7,0x0002, + 0x0435,0x0306,0x04da,0x0002,0x04d8,0x0308,0x04db,0x0002, + 0x04d9,0x0308,0x04dc,0x0002,0x0416,0x0308,0x04dd,0x0002, + 0x0436,0x0308,0x04de,0x0002,0x0417,0x0308,0x04df,0x0002, + 0x0437,0x0308,0x04e2,0x0002,0x0418,0x0304,0x04e3,0x0002, + 0x0438,0x0304,0x04e4,0x0002,0x0418,0x0308,0x04e5,0x0002, + 0x0438,0x0308,0x04e6,0x0002,0x041e,0x0308,0x04e7,0x0002, + 0x043e,0x0308,0x04ea,0x0002,0x04e8,0x0308,0x04eb,0x0002, + 0x04e9,0x0308,0x04ec,0x0002,0x042d,0x0308,0x04ed,0x0002, + 0x044d,0x0308,0x04ee,0x0002,0x0423,0x0304,0x04ef,0x0002, + 0x0443,0x0304,0x04f0,0x0002,0x0423,0x0308,0x04f1,0x0002, + 0x0443,0x0308,0x04f2,0x0002,0x0423,0x030b,0x04f3,0x0002, + 0x0443,0x030b,0x04f4,0x0002,0x0427,0x0308,0x04f5,0x0002, + 0x0447,0x0308,0x04f8,0x0002,0x042b,0x0308,0x04f9,0x0002, + 0x044b,0x0308,0x0622,0x0002,0x0627,0x0653,0x0623,0x0002, + 0x0627,0x0654,0x0624,0x0002,0x0648,0x0654,0x0625,0x0002, + 0x0627,0x0655,0x0626,0x0002,0x064a,0x0654,0x06c0,0x0002, + 0x06d5,0x0654,0x06c2,0x0002,0x06c1,0x0654,0x06d3,0x0002, + 0x06d2,0x0654,0x0929,0x0002,0x0928,0x093c,0x0931,0x0002, + 0x0930,0x093c,0x0934,0x0002,0x0933,0x093c,0x0958,0x0002, + 0x0915,0x093c,0x0959,0x0002,0x0916,0x093c,0x095a,0x0002, + 0x0917,0x093c,0x095b,0x0002,0x091c,0x093c,0x095c,0x0002, + 0x0921,0x093c,0x095d,0x0002,0x0922,0x093c,0x095e,0x0002, + 0x092b,0x093c,0x095f,0x0002,0x092f,0x093c,0x09cb,0x0002, + 0x09c7,0x09be,0x09cc,0x0002,0x09c7,0x09d7,0x09dc,0x0002, + 0x09a1,0x09bc,0x09dd,0x0002,0x09a2,0x09bc,0x09df,0x0002, + 0x09af,0x09bc,0x0a33,0x0002,0x0a32,0x0a3c,0x0a36,0x0002, + 0x0a38,0x0a3c,0x0a59,0x0002,0x0a16,0x0a3c,0x0a5a,0x0002, + 0x0a17,0x0a3c,0x0a5b,0x0002,0x0a1c,0x0a3c,0x0a5e,0x0002, + 0x0a2b,0x0a3c,0x0b48,0x0002,0x0b47,0x0b56,0x0b4b,0x0002, + 0x0b47,0x0b3e,0x0b4c,0x0002,0x0b47,0x0b57,0x0b5c,0x0002, + 0x0b21,0x0b3c,0x0b5d,0x0002,0x0b22,0x0b3c,0x0b94,0x0002, + 0x0b92,0x0bd7,0x0bca,0x0002,0x0bc6,0x0bbe,0x0bcb,0x0002, + 0x0bc7,0x0bbe,0x0bcc,0x0002,0x0bc6,0x0bd7,0x0c48,0x0002, + 0x0c46,0x0c56,0x0cc0,0x0002,0x0cbf,0x0cd5,0x0cc7,0x0002, + 0x0cc6,0x0cd5,0x0cc8,0x0002,0x0cc6,0x0cd6,0x0cca,0x0002, + 0x0cc6,0x0cc2,0x0ccb,0x0002,0x0cca,0x0cd5,0x0d4a,0x0002, + 0x0d46,0x0d3e,0x0d4b,0x0002,0x0d47,0x0d3e,0x0d4c,0x0002, + 0x0d46,0x0d57,0x0dda,0x0002,0x0dd9,0x0dca,0x0ddc,0x0002, + 0x0dd9,0x0dcf,0x0ddd,0x0002,0x0ddc,0x0dca,0x0dde,0x0002, + 0x0dd9,0x0ddf,0x0f43,0x0002,0x0f42,0x0fb7,0x0f4d,0x0002, + 0x0f4c,0x0fb7,0x0f52,0x0002,0x0f51,0x0fb7,0x0f57,0x0002, + 0x0f56,0x0fb7,0x0f5c,0x0002,0x0f5b,0x0fb7,0x0f69,0x0002, + 0x0f40,0x0fb5,0x0f73,0x0002,0x0f71,0x0f72,0x0f75,0x0002, + 0x0f71,0x0f74,0x0f76,0x0002,0x0fb2,0x0f80,0x0f78,0x0002, + 0x0fb3,0x0f80,0x0f81,0x0002,0x0f71,0x0f80,0x0f93,0x0002, + 0x0f92,0x0fb7,0x0f9d,0x0002,0x0f9c,0x0fb7,0x0fa2,0x0002, + 0x0fa1,0x0fb7,0x0fa7,0x0002,0x0fa6,0x0fb7,0x0fac,0x0002, + 0x0fab,0x0fb7,0x0fb9,0x0002,0x0f90,0x0fb5,0x1026,0x0002, + 0x1025,0x102e,0x1e00,0x0002,0x0041,0x0325,0x1e01,0x0002, + 0x0061,0x0325,0x1e02,0x0002,0x0042,0x0307,0x1e03,0x0002, + 0x0062,0x0307,0x1e04,0x0002,0x0042,0x0323,0x1e05,0x0002, + 0x0062,0x0323,0x1e06,0x0002,0x0042,0x0331,0x1e07,0x0002, + 0x0062,0x0331,0x1e08,0x0002,0x00c7,0x0301,0x1e09,0x0002, + 0x00e7,0x0301,0x1e0a,0x0002,0x0044,0x0307,0x1e0b,0x0002, + 0x0064,0x0307,0x1e0c,0x0002,0x0044,0x0323,0x1e0d,0x0002, + 0x0064,0x0323,0x1e0e,0x0002,0x0044,0x0331,0x1e0f,0x0002, + 0x0064,0x0331,0x1e10,0x0002,0x0044,0x0327,0x1e11,0x0002, + 0x0064,0x0327,0x1e12,0x0002,0x0044,0x032d,0x1e13,0x0002, + 0x0064,0x032d,0x1e14,0x0002,0x0112,0x0300,0x1e15,0x0002, + 0x0113,0x0300,0x1e16,0x0002,0x0112,0x0301,0x1e17,0x0002, + 0x0113,0x0301,0x1e18,0x0002,0x0045,0x032d,0x1e19,0x0002, + 0x0065,0x032d,0x1e1a,0x0002,0x0045,0x0330,0x1e1b,0x0002, + 0x0065,0x0330,0x1e1c,0x0002,0x0228,0x0306,0x1e1d,0x0002, + 0x0229,0x0306,0x1e1e,0x0002,0x0046,0x0307,0x1e1f,0x0002, + 0x0066,0x0307,0x1e20,0x0002,0x0047,0x0304,0x1e21,0x0002, + 0x0067,0x0304,0x1e22,0x0002,0x0048,0x0307,0x1e23,0x0002, + 0x0068,0x0307,0x1e24,0x0002,0x0048,0x0323,0x1e25,0x0002, + 0x0068,0x0323,0x1e26,0x0002,0x0048,0x0308,0x1e27,0x0002, + 0x0068,0x0308,0x1e28,0x0002,0x0048,0x0327,0x1e29,0x0002, + 0x0068,0x0327,0x1e2a,0x0002,0x0048,0x032e,0x1e2b,0x0002, + 0x0068,0x032e,0x1e2c,0x0002,0x0049,0x0330,0x1e2d,0x0002, + 0x0069,0x0330,0x1e2e,0x0002,0x00cf,0x0301,0x1e2f,0x0002, + 0x00ef,0x0301,0x1e30,0x0002,0x004b,0x0301,0x1e31,0x0002, + 0x006b,0x0301,0x1e32,0x0002,0x004b,0x0323,0x1e33,0x0002, + 0x006b,0x0323,0x1e34,0x0002,0x004b,0x0331,0x1e35,0x0002, + 0x006b,0x0331,0x1e36,0x0002,0x004c,0x0323,0x1e37,0x0002, + 0x006c,0x0323,0x1e38,0x0002,0x1e36,0x0304,0x1e39,0x0002, + 0x1e37,0x0304,0x1e3a,0x0002,0x004c,0x0331,0x1e3b,0x0002, + 0x006c,0x0331,0x1e3c,0x0002,0x004c,0x032d,0x1e3d,0x0002, + 0x006c,0x032d,0x1e3e,0x0002,0x004d,0x0301,0x1e3f,0x0002, + 0x006d,0x0301,0x1e40,0x0002,0x004d,0x0307,0x1e41,0x0002, + 0x006d,0x0307,0x1e42,0x0002,0x004d,0x0323,0x1e43,0x0002, + 0x006d,0x0323,0x1e44,0x0002,0x004e,0x0307,0x1e45,0x0002, + 0x006e,0x0307,0x1e46,0x0002,0x004e,0x0323,0x1e47,0x0002, + 0x006e,0x0323,0x1e48,0x0002,0x004e,0x0331,0x1e49,0x0002, + 0x006e,0x0331,0x1e4a,0x0002,0x004e,0x032d,0x1e4b,0x0002, + 0x006e,0x032d,0x1e4c,0x0002,0x00d5,0x0301,0x1e4d,0x0002, + 0x00f5,0x0301,0x1e4e,0x0002,0x00d5,0x0308,0x1e4f,0x0002, + 0x00f5,0x0308,0x1e50,0x0002,0x014c,0x0300,0x1e51,0x0002, + 0x014d,0x0300,0x1e52,0x0002,0x014c,0x0301,0x1e53,0x0002, + 0x014d,0x0301,0x1e54,0x0002,0x0050,0x0301,0x1e55,0x0002, + 0x0070,0x0301,0x1e56,0x0002,0x0050,0x0307,0x1e57,0x0002, + 0x0070,0x0307,0x1e58,0x0002,0x0052,0x0307,0x1e59,0x0002, + 0x0072,0x0307,0x1e5a,0x0002,0x0052,0x0323,0x1e5b,0x0002, + 0x0072,0x0323,0x1e5c,0x0002,0x1e5a,0x0304,0x1e5d,0x0002, + 0x1e5b,0x0304,0x1e5e,0x0002,0x0052,0x0331,0x1e5f,0x0002, + 0x0072,0x0331,0x1e60,0x0002,0x0053,0x0307,0x1e61,0x0002, + 0x0073,0x0307,0x1e62,0x0002,0x0053,0x0323,0x1e63,0x0002, + 0x0073,0x0323,0x1e64,0x0002,0x015a,0x0307,0x1e65,0x0002, + 0x015b,0x0307,0x1e66,0x0002,0x0160,0x0307,0x1e67,0x0002, + 0x0161,0x0307,0x1e68,0x0002,0x1e62,0x0307,0x1e69,0x0002, + 0x1e63,0x0307,0x1e6a,0x0002,0x0054,0x0307,0x1e6b,0x0002, + 0x0074,0x0307,0x1e6c,0x0002,0x0054,0x0323,0x1e6d,0x0002, + 0x0074,0x0323,0x1e6e,0x0002,0x0054,0x0331,0x1e6f,0x0002, + 0x0074,0x0331,0x1e70,0x0002,0x0054,0x032d,0x1e71,0x0002, + 0x0074,0x032d,0x1e72,0x0002,0x0055,0x0324,0x1e73,0x0002, + 0x0075,0x0324,0x1e74,0x0002,0x0055,0x0330,0x1e75,0x0002, + 0x0075,0x0330,0x1e76,0x0002,0x0055,0x032d,0x1e77,0x0002, + 0x0075,0x032d,0x1e78,0x0002,0x0168,0x0301,0x1e79,0x0002, + 0x0169,0x0301,0x1e7a,0x0002,0x016a,0x0308,0x1e7b,0x0002, + 0x016b,0x0308,0x1e7c,0x0002,0x0056,0x0303,0x1e7d,0x0002, + 0x0076,0x0303,0x1e7e,0x0002,0x0056,0x0323,0x1e7f,0x0002, + 0x0076,0x0323,0x1e80,0x0002,0x0057,0x0300,0x1e81,0x0002, + 0x0077,0x0300,0x1e82,0x0002,0x0057,0x0301,0x1e83,0x0002, + 0x0077,0x0301,0x1e84,0x0002,0x0057,0x0308,0x1e85,0x0002, + 0x0077,0x0308,0x1e86,0x0002,0x0057,0x0307,0x1e87,0x0002, + 0x0077,0x0307,0x1e88,0x0002,0x0057,0x0323,0x1e89,0x0002, + 0x0077,0x0323,0x1e8a,0x0002,0x0058,0x0307,0x1e8b,0x0002, + 0x0078,0x0307,0x1e8c,0x0002,0x0058,0x0308,0x1e8d,0x0002, + 0x0078,0x0308,0x1e8e,0x0002,0x0059,0x0307,0x1e8f,0x0002, + 0x0079,0x0307,0x1e90,0x0002,0x005a,0x0302,0x1e91,0x0002, + 0x007a,0x0302,0x1e92,0x0002,0x005a,0x0323,0x1e93,0x0002, + 0x007a,0x0323,0x1e94,0x0002,0x005a,0x0331,0x1e95,0x0002, + 0x007a,0x0331,0x1e96,0x0002,0x0068,0x0331,0x1e97,0x0002, + 0x0074,0x0308,0x1e98,0x0002,0x0077,0x030a,0x1e99,0x0002, + 0x0079,0x030a,0x1e9b,0x0002,0x017f,0x0307,0x1ea0,0x0002, + 0x0041,0x0323,0x1ea1,0x0002,0x0061,0x0323,0x1ea2,0x0002, + 0x0041,0x0309,0x1ea3,0x0002,0x0061,0x0309,0x1ea4,0x0002, + 0x00c2,0x0301,0x1ea5,0x0002,0x00e2,0x0301,0x1ea6,0x0002, + 0x00c2,0x0300,0x1ea7,0x0002,0x00e2,0x0300,0x1ea8,0x0002, + 0x00c2,0x0309,0x1ea9,0x0002,0x00e2,0x0309,0x1eaa,0x0002, + 0x00c2,0x0303,0x1eab,0x0002,0x00e2,0x0303,0x1eac,0x0002, + 0x1ea0,0x0302,0x1ead,0x0002,0x1ea1,0x0302,0x1eae,0x0002, + 0x0102,0x0301,0x1eaf,0x0002,0x0103,0x0301,0x1eb0,0x0002, + 0x0102,0x0300,0x1eb1,0x0002,0x0103,0x0300,0x1eb2,0x0002, + 0x0102,0x0309,0x1eb3,0x0002,0x0103,0x0309,0x1eb4,0x0002, + 0x0102,0x0303,0x1eb5,0x0002,0x0103,0x0303,0x1eb6,0x0002, + 0x1ea0,0x0306,0x1eb7,0x0002,0x1ea1,0x0306,0x1eb8,0x0002, + 0x0045,0x0323,0x1eb9,0x0002,0x0065,0x0323,0x1eba,0x0002, + 0x0045,0x0309,0x1ebb,0x0002,0x0065,0x0309,0x1ebc,0x0002, + 0x0045,0x0303,0x1ebd,0x0002,0x0065,0x0303,0x1ebe,0x0002, + 0x00ca,0x0301,0x1ebf,0x0002,0x00ea,0x0301,0x1ec0,0x0002, + 0x00ca,0x0300,0x1ec1,0x0002,0x00ea,0x0300,0x1ec2,0x0002, + 0x00ca,0x0309,0x1ec3,0x0002,0x00ea,0x0309,0x1ec4,0x0002, + 0x00ca,0x0303,0x1ec5,0x0002,0x00ea,0x0303,0x1ec6,0x0002, + 0x1eb8,0x0302,0x1ec7,0x0002,0x1eb9,0x0302,0x1ec8,0x0002, + 0x0049,0x0309,0x1ec9,0x0002,0x0069,0x0309,0x1eca,0x0002, + 0x0049,0x0323,0x1ecb,0x0002,0x0069,0x0323,0x1ecc,0x0002, + 0x004f,0x0323,0x1ecd,0x0002,0x006f,0x0323,0x1ece,0x0002, + 0x004f,0x0309,0x1ecf,0x0002,0x006f,0x0309,0x1ed0,0x0002, + 0x00d4,0x0301,0x1ed1,0x0002,0x00f4,0x0301,0x1ed2,0x0002, + 0x00d4,0x0300,0x1ed3,0x0002,0x00f4,0x0300,0x1ed4,0x0002, + 0x00d4,0x0309,0x1ed5,0x0002,0x00f4,0x0309,0x1ed6,0x0002, + 0x00d4,0x0303,0x1ed7,0x0002,0x00f4,0x0303,0x1ed8,0x0002, + 0x1ecc,0x0302,0x1ed9,0x0002,0x1ecd,0x0302,0x1eda,0x0002, + 0x01a0,0x0301,0x1edb,0x0002,0x01a1,0x0301,0x1edc,0x0002, + 0x01a0,0x0300,0x1edd,0x0002,0x01a1,0x0300,0x1ede,0x0002, + 0x01a0,0x0309,0x1edf,0x0002,0x01a1,0x0309,0x1ee0,0x0002, + 0x01a0,0x0303,0x1ee1,0x0002,0x01a1,0x0303,0x1ee2,0x0002, + 0x01a0,0x0323,0x1ee3,0x0002,0x01a1,0x0323,0x1ee4,0x0002, + 0x0055,0x0323,0x1ee5,0x0002,0x0075,0x0323,0x1ee6,0x0002, + 0x0055,0x0309,0x1ee7,0x0002,0x0075,0x0309,0x1ee8,0x0002, + 0x01af,0x0301,0x1ee9,0x0002,0x01b0,0x0301,0x1eea,0x0002, + 0x01af,0x0300,0x1eeb,0x0002,0x01b0,0x0300,0x1eec,0x0002, + 0x01af,0x0309,0x1eed,0x0002,0x01b0,0x0309,0x1eee,0x0002, + 0x01af,0x0303,0x1eef,0x0002,0x01b0,0x0303,0x1ef0,0x0002, + 0x01af,0x0323,0x1ef1,0x0002,0x01b0,0x0323,0x1ef2,0x0002, + 0x0059,0x0300,0x1ef3,0x0002,0x0079,0x0300,0x1ef4,0x0002, + 0x0059,0x0323,0x1ef5,0x0002,0x0079,0x0323,0x1ef6,0x0002, + 0x0059,0x0309,0x1ef7,0x0002,0x0079,0x0309,0x1ef8,0x0002, + 0x0059,0x0303,0x1ef9,0x0002,0x0079,0x0303,0x1f00,0x0002, + 0x03b1,0x0313,0x1f01,0x0002,0x03b1,0x0314,0x1f02,0x0002, + 0x1f00,0x0300,0x1f03,0x0002,0x1f01,0x0300,0x1f04,0x0002, + 0x1f00,0x0301,0x1f05,0x0002,0x1f01,0x0301,0x1f06,0x0002, + 0x1f00,0x0342,0x1f07,0x0002,0x1f01,0x0342,0x1f08,0x0002, + 0x0391,0x0313,0x1f09,0x0002,0x0391,0x0314,0x1f0a,0x0002, + 0x1f08,0x0300,0x1f0b,0x0002,0x1f09,0x0300,0x1f0c,0x0002, + 0x1f08,0x0301,0x1f0d,0x0002,0x1f09,0x0301,0x1f0e,0x0002, + 0x1f08,0x0342,0x1f0f,0x0002,0x1f09,0x0342,0x1f10,0x0002, + 0x03b5,0x0313,0x1f11,0x0002,0x03b5,0x0314,0x1f12,0x0002, + 0x1f10,0x0300,0x1f13,0x0002,0x1f11,0x0300,0x1f14,0x0002, + 0x1f10,0x0301,0x1f15,0x0002,0x1f11,0x0301,0x1f18,0x0002, + 0x0395,0x0313,0x1f19,0x0002,0x0395,0x0314,0x1f1a,0x0002, + 0x1f18,0x0300,0x1f1b,0x0002,0x1f19,0x0300,0x1f1c,0x0002, + 0x1f18,0x0301,0x1f1d,0x0002,0x1f19,0x0301,0x1f20,0x0002, + 0x03b7,0x0313,0x1f21,0x0002,0x03b7,0x0314,0x1f22,0x0002, + 0x1f20,0x0300,0x1f23,0x0002,0x1f21,0x0300,0x1f24,0x0002, + 0x1f20,0x0301,0x1f25,0x0002,0x1f21,0x0301,0x1f26,0x0002, + 0x1f20,0x0342,0x1f27,0x0002,0x1f21,0x0342,0x1f28,0x0002, + 0x0397,0x0313,0x1f29,0x0002,0x0397,0x0314,0x1f2a,0x0002, + 0x1f28,0x0300,0x1f2b,0x0002,0x1f29,0x0300,0x1f2c,0x0002, + 0x1f28,0x0301,0x1f2d,0x0002,0x1f29,0x0301,0x1f2e,0x0002, + 0x1f28,0x0342,0x1f2f,0x0002,0x1f29,0x0342,0x1f30,0x0002, + 0x03b9,0x0313,0x1f31,0x0002,0x03b9,0x0314,0x1f32,0x0002, + 0x1f30,0x0300,0x1f33,0x0002,0x1f31,0x0300,0x1f34,0x0002, + 0x1f30,0x0301,0x1f35,0x0002,0x1f31,0x0301,0x1f36,0x0002, + 0x1f30,0x0342,0x1f37,0x0002,0x1f31,0x0342,0x1f38,0x0002, + 0x0399,0x0313,0x1f39,0x0002,0x0399,0x0314,0x1f3a,0x0002, + 0x1f38,0x0300,0x1f3b,0x0002,0x1f39,0x0300,0x1f3c,0x0002, + 0x1f38,0x0301,0x1f3d,0x0002,0x1f39,0x0301,0x1f3e,0x0002, + 0x1f38,0x0342,0x1f3f,0x0002,0x1f39,0x0342,0x1f40,0x0002, + 0x03bf,0x0313,0x1f41,0x0002,0x03bf,0x0314,0x1f42,0x0002, + 0x1f40,0x0300,0x1f43,0x0002,0x1f41,0x0300,0x1f44,0x0002, + 0x1f40,0x0301,0x1f45,0x0002,0x1f41,0x0301,0x1f48,0x0002, + 0x039f,0x0313,0x1f49,0x0002,0x039f,0x0314,0x1f4a,0x0002, + 0x1f48,0x0300,0x1f4b,0x0002,0x1f49,0x0300,0x1f4c,0x0002, + 0x1f48,0x0301,0x1f4d,0x0002,0x1f49,0x0301,0x1f50,0x0002, + 0x03c5,0x0313,0x1f51,0x0002,0x03c5,0x0314,0x1f52,0x0002, + 0x1f50,0x0300,0x1f53,0x0002,0x1f51,0x0300,0x1f54,0x0002, + 0x1f50,0x0301,0x1f55,0x0002,0x1f51,0x0301,0x1f56,0x0002, + 0x1f50,0x0342,0x1f57,0x0002,0x1f51,0x0342,0x1f59,0x0002, + 0x03a5,0x0314,0x1f5b,0x0002,0x1f59,0x0300,0x1f5d,0x0002, + 0x1f59,0x0301,0x1f5f,0x0002,0x1f59,0x0342,0x1f60,0x0002, + 0x03c9,0x0313,0x1f61,0x0002,0x03c9,0x0314,0x1f62,0x0002, + 0x1f60,0x0300,0x1f63,0x0002,0x1f61,0x0300,0x1f64,0x0002, + 0x1f60,0x0301,0x1f65,0x0002,0x1f61,0x0301,0x1f66,0x0002, + 0x1f60,0x0342,0x1f67,0x0002,0x1f61,0x0342,0x1f68,0x0002, + 0x03a9,0x0313,0x1f69,0x0002,0x03a9,0x0314,0x1f6a,0x0002, + 0x1f68,0x0300,0x1f6b,0x0002,0x1f69,0x0300,0x1f6c,0x0002, + 0x1f68,0x0301,0x1f6d,0x0002,0x1f69,0x0301,0x1f6e,0x0002, + 0x1f68,0x0342,0x1f6f,0x0002,0x1f69,0x0342,0x1f70,0x0002, + 0x03b1,0x0300,0x1f71,0x0001,0x03ac,0x1f72,0x0002,0x03b5, + 0x0300,0x1f73,0x0001,0x03ad,0x1f74,0x0002,0x03b7,0x0300, + 0x1f75,0x0001,0x03ae,0x1f76,0x0002,0x03b9,0x0300,0x1f77, + 0x0001,0x03af,0x1f78,0x0002,0x03bf,0x0300,0x1f79,0x0001, + 0x03cc,0x1f7a,0x0002,0x03c5,0x0300,0x1f7b,0x0001,0x03cd, + 0x1f7c,0x0002,0x03c9,0x0300,0x1f7d,0x0001,0x03ce,0x1f80, + 0x0002,0x1f00,0x0345,0x1f81,0x0002,0x1f01,0x0345,0x1f82, + 0x0002,0x1f02,0x0345,0x1f83,0x0002,0x1f03,0x0345,0x1f84, + 0x0002,0x1f04,0x0345,0x1f85,0x0002,0x1f05,0x0345,0x1f86, + 0x0002,0x1f06,0x0345,0x1f87,0x0002,0x1f07,0x0345,0x1f88, + 0x0002,0x1f08,0x0345,0x1f89,0x0002,0x1f09,0x0345,0x1f8a, + 0x0002,0x1f0a,0x0345,0x1f8b,0x0002,0x1f0b,0x0345,0x1f8c, + 0x0002,0x1f0c,0x0345,0x1f8d,0x0002,0x1f0d,0x0345,0x1f8e, + 0x0002,0x1f0e,0x0345,0x1f8f,0x0002,0x1f0f,0x0345,0x1f90, + 0x0002,0x1f20,0x0345,0x1f91,0x0002,0x1f21,0x0345,0x1f92, + 0x0002,0x1f22,0x0345,0x1f93,0x0002,0x1f23,0x0345,0x1f94, + 0x0002,0x1f24,0x0345,0x1f95,0x0002,0x1f25,0x0345,0x1f96, + 0x0002,0x1f26,0x0345,0x1f97,0x0002,0x1f27,0x0345,0x1f98, + 0x0002,0x1f28,0x0345,0x1f99,0x0002,0x1f29,0x0345,0x1f9a, + 0x0002,0x1f2a,0x0345,0x1f9b,0x0002,0x1f2b,0x0345,0x1f9c, + 0x0002,0x1f2c,0x0345,0x1f9d,0x0002,0x1f2d,0x0345,0x1f9e, + 0x0002,0x1f2e,0x0345,0x1f9f,0x0002,0x1f2f,0x0345,0x1fa0, + 0x0002,0x1f60,0x0345,0x1fa1,0x0002,0x1f61,0x0345,0x1fa2, + 0x0002,0x1f62,0x0345,0x1fa3,0x0002,0x1f63,0x0345,0x1fa4, + 0x0002,0x1f64,0x0345,0x1fa5,0x0002,0x1f65,0x0345,0x1fa6, + 0x0002,0x1f66,0x0345,0x1fa7,0x0002,0x1f67,0x0345,0x1fa8, + 0x0002,0x1f68,0x0345,0x1fa9,0x0002,0x1f69,0x0345,0x1faa, + 0x0002,0x1f6a,0x0345,0x1fab,0x0002,0x1f6b,0x0345,0x1fac, + 0x0002,0x1f6c,0x0345,0x1fad,0x0002,0x1f6d,0x0345,0x1fae, + 0x0002,0x1f6e,0x0345,0x1faf,0x0002,0x1f6f,0x0345,0x1fb0, + 0x0002,0x03b1,0x0306,0x1fb1,0x0002,0x03b1,0x0304,0x1fb2, + 0x0002,0x1f70,0x0345,0x1fb3,0x0002,0x03b1,0x0345,0x1fb4, + 0x0002,0x03ac,0x0345,0x1fb6,0x0002,0x03b1,0x0342,0x1fb7, + 0x0002,0x1fb6,0x0345,0x1fb8,0x0002,0x0391,0x0306,0x1fb9, + 0x0002,0x0391,0x0304,0x1fba,0x0002,0x0391,0x0300,0x1fbb, + 0x0001,0x0386,0x1fbc,0x0002,0x0391,0x0345,0x1fbe,0x0001, + 0x03b9,0x1fc1,0x0002,0x00a8,0x0342,0x1fc2,0x0002,0x1f74, + 0x0345,0x1fc3,0x0002,0x03b7,0x0345,0x1fc4,0x0002,0x03ae, + 0x0345,0x1fc6,0x0002,0x03b7,0x0342,0x1fc7,0x0002,0x1fc6, + 0x0345,0x1fc8,0x0002,0x0395,0x0300,0x1fc9,0x0001,0x0388, + 0x1fca,0x0002,0x0397,0x0300,0x1fcb,0x0001,0x0389,0x1fcc, + 0x0002,0x0397,0x0345,0x1fcd,0x0002,0x1fbf,0x0300,0x1fce, + 0x0002,0x1fbf,0x0301,0x1fcf,0x0002,0x1fbf,0x0342,0x1fd0, + 0x0002,0x03b9,0x0306,0x1fd1,0x0002,0x03b9,0x0304,0x1fd2, + 0x0002,0x03ca,0x0300,0x1fd3,0x0001,0x0390,0x1fd6,0x0002, + 0x03b9,0x0342,0x1fd7,0x0002,0x03ca,0x0342,0x1fd8,0x0002, + 0x0399,0x0306,0x1fd9,0x0002,0x0399,0x0304,0x1fda,0x0002, + 0x0399,0x0300,0x1fdb,0x0001,0x038a,0x1fdd,0x0002,0x1ffe, + 0x0300,0x1fde,0x0002,0x1ffe,0x0301,0x1fdf,0x0002,0x1ffe, + 0x0342,0x1fe0,0x0002,0x03c5,0x0306,0x1fe1,0x0002,0x03c5, + 0x0304,0x1fe2,0x0002,0x03cb,0x0300,0x1fe3,0x0001,0x03b0, + 0x1fe4,0x0002,0x03c1,0x0313,0x1fe5,0x0002,0x03c1,0x0314, + 0x1fe6,0x0002,0x03c5,0x0342,0x1fe7,0x0002,0x03cb,0x0342, + 0x1fe8,0x0002,0x03a5,0x0306,0x1fe9,0x0002,0x03a5,0x0304, + 0x1fea,0x0002,0x03a5,0x0300,0x1feb,0x0001,0x038e,0x1fec, + 0x0002,0x03a1,0x0314,0x1fed,0x0002,0x00a8,0x0300,0x1fee, + 0x0001,0x0385,0x1fef,0x0001,0x0060,0x1ff2,0x0002,0x1f7c, + 0x0345,0x1ff3,0x0002,0x03c9,0x0345,0x1ff4,0x0002,0x03ce, + 0x0345,0x1ff6,0x0002,0x03c9,0x0342,0x1ff7,0x0002,0x1ff6, + 0x0345,0x1ff8,0x0002,0x039f,0x0300,0x1ff9,0x0001,0x038c, + 0x1ffa,0x0002,0x03a9,0x0300,0x1ffb,0x0001,0x038f,0x1ffc, + 0x0002,0x03a9,0x0345,0x1ffd,0x0001,0x00b4,0x2000,0x0001, + 0x2002,0x2001,0x0001,0x2003,0x2126,0x0001,0x03a9,0x212a, + 0x0001,0x004b,0x212b,0x0001,0x00c5,0x219a,0x0002,0x2190, + 0x0338,0x219b,0x0002,0x2192,0x0338,0x21ae,0x0002,0x2194, + 0x0338,0x21cd,0x0002,0x21d0,0x0338,0x21ce,0x0002,0x21d4, + 0x0338,0x21cf,0x0002,0x21d2,0x0338,0x2204,0x0002,0x2203, + 0x0338,0x2209,0x0002,0x2208,0x0338,0x220c,0x0002,0x220b, + 0x0338,0x2224,0x0002,0x2223,0x0338,0x2226,0x0002,0x2225, + 0x0338,0x2241,0x0002,0x223c,0x0338,0x2244,0x0002,0x2243, + 0x0338,0x2247,0x0002,0x2245,0x0338,0x2249,0x0002,0x2248, + 0x0338,0x2260,0x0002,0x003d,0x0338,0x2262,0x0002,0x2261, + 0x0338,0x226d,0x0002,0x224d,0x0338,0x226e,0x0002,0x003c, + 0x0338,0x226f,0x0002,0x003e,0x0338,0x2270,0x0002,0x2264, + 0x0338,0x2271,0x0002,0x2265,0x0338,0x2274,0x0002,0x2272, + 0x0338,0x2275,0x0002,0x2273,0x0338,0x2278,0x0002,0x2276, + 0x0338,0x2279,0x0002,0x2277,0x0338,0x2280,0x0002,0x227a, + 0x0338,0x2281,0x0002,0x227b,0x0338,0x2284,0x0002,0x2282, + 0x0338,0x2285,0x0002,0x2283,0x0338,0x2288,0x0002,0x2286, + 0x0338,0x2289,0x0002,0x2287,0x0338,0x22ac,0x0002,0x22a2, + 0x0338,0x22ad,0x0002,0x22a8,0x0338,0x22ae,0x0002,0x22a9, + 0x0338,0x22af,0x0002,0x22ab,0x0338,0x22e0,0x0002,0x227c, + 0x0338,0x22e1,0x0002,0x227d,0x0338,0x22e2,0x0002,0x2291, + 0x0338,0x22e3,0x0002,0x2292,0x0338,0x22ea,0x0002,0x22b2, + 0x0338,0x22eb,0x0002,0x22b3,0x0338,0x22ec,0x0002,0x22b4, + 0x0338,0x22ed,0x0002,0x22b5,0x0338,0x2329,0x0001,0x3008, + 0x232a,0x0001,0x3009,0x304c,0x0002,0x304b,0x3099,0x304e, + 0x0002,0x304d,0x3099,0x3050,0x0002,0x304f,0x3099,0x3052, + 0x0002,0x3051,0x3099,0x3054,0x0002,0x3053,0x3099,0x3056, + 0x0002,0x3055,0x3099,0x3058,0x0002,0x3057,0x3099,0x305a, + 0x0002,0x3059,0x3099,0x305c,0x0002,0x305b,0x3099,0x305e, + 0x0002,0x305d,0x3099,0x3060,0x0002,0x305f,0x3099,0x3062, + 0x0002,0x3061,0x3099,0x3065,0x0002,0x3064,0x3099,0x3067, + 0x0002,0x3066,0x3099,0x3069,0x0002,0x3068,0x3099,0x3070, + 0x0002,0x306f,0x3099,0x3071,0x0002,0x306f,0x309a,0x3073, + 0x0002,0x3072,0x3099,0x3074,0x0002,0x3072,0x309a,0x3076, + 0x0002,0x3075,0x3099,0x3077,0x0002,0x3075,0x309a,0x3079, + 0x0002,0x3078,0x3099,0x307a,0x0002,0x3078,0x309a,0x307c, + 0x0002,0x307b,0x3099,0x307d,0x0002,0x307b,0x309a,0x3094, + 0x0002,0x3046,0x3099,0x309e,0x0002,0x309d,0x3099,0x30ac, + 0x0002,0x30ab,0x3099,0x30ae,0x0002,0x30ad,0x3099,0x30b0, + 0x0002,0x30af,0x3099,0x30b2,0x0002,0x30b1,0x3099,0x30b4, + 0x0002,0x30b3,0x3099,0x30b6,0x0002,0x30b5,0x3099,0x30b8, + 0x0002,0x30b7,0x3099,0x30ba,0x0002,0x30b9,0x3099,0x30bc, + 0x0002,0x30bb,0x3099,0x30be,0x0002,0x30bd,0x3099,0x30c0, + 0x0002,0x30bf,0x3099,0x30c2,0x0002,0x30c1,0x3099,0x30c5, + 0x0002,0x30c4,0x3099,0x30c7,0x0002,0x30c6,0x3099,0x30c9, + 0x0002,0x30c8,0x3099,0x30d0,0x0002,0x30cf,0x3099,0x30d1, + 0x0002,0x30cf,0x309a,0x30d3,0x0002,0x30d2,0x3099,0x30d4, + 0x0002,0x30d2,0x309a,0x30d6,0x0002,0x30d5,0x3099,0x30d7, + 0x0002,0x30d5,0x309a,0x30d9,0x0002,0x30d8,0x3099,0x30da, + 0x0002,0x30d8,0x309a,0x30dc,0x0002,0x30db,0x3099,0x30dd, + 0x0002,0x30db,0x309a,0x30f4,0x0002,0x30a6,0x3099,0x30f7, + 0x0002,0x30ef,0x3099,0x30f8,0x0002,0x30f0,0x3099,0x30f9, + 0x0002,0x30f1,0x3099,0x30fa,0x0002,0x30f2,0x3099,0x30fe, + 0x0002,0x30fd,0x3099,0xf900,0x0001,0x8c48,0xf901,0x0001, + 0x66f4,0xf902,0x0001,0x8eca,0xf903,0x0001,0x8cc8,0xf904, + 0x0001,0x6ed1,0xf905,0x0001,0x4e32,0xf906,0x0001,0x53e5, + 0xf907,0x0001,0x9f9c,0xf908,0x0001,0x9f9c,0xf909,0x0001, + 0x5951,0xf90a,0x0001,0x91d1,0xf90b,0x0001,0x5587,0xf90c, + 0x0001,0x5948,0xf90d,0x0001,0x61f6,0xf90e,0x0001,0x7669, + 0xf90f,0x0001,0x7f85,0xf910,0x0001,0x863f,0xf911,0x0001, + 0x87ba,0xf912,0x0001,0x88f8,0xf913,0x0001,0x908f,0xf914, + 0x0001,0x6a02,0xf915,0x0001,0x6d1b,0xf916,0x0001,0x70d9, + 0xf917,0x0001,0x73de,0xf918,0x0001,0x843d,0xf919,0x0001, + 0x916a,0xf91a,0x0001,0x99f1,0xf91b,0x0001,0x4e82,0xf91c, + 0x0001,0x5375,0xf91d,0x0001,0x6b04,0xf91e,0x0001,0x721b, + 0xf91f,0x0001,0x862d,0xf920,0x0001,0x9e1e,0xf921,0x0001, + 0x5d50,0xf922,0x0001,0x6feb,0xf923,0x0001,0x85cd,0xf924, + 0x0001,0x8964,0xf925,0x0001,0x62c9,0xf926,0x0001,0x81d8, + 0xf927,0x0001,0x881f,0xf928,0x0001,0x5eca,0xf929,0x0001, + 0x6717,0xf92a,0x0001,0x6d6a,0xf92b,0x0001,0x72fc,0xf92c, + 0x0001,0x90ce,0xf92d,0x0001,0x4f86,0xf92e,0x0001,0x51b7, + 0xf92f,0x0001,0x52de,0xf930,0x0001,0x64c4,0xf931,0x0001, + 0x6ad3,0xf932,0x0001,0x7210,0xf933,0x0001,0x76e7,0xf934, + 0x0001,0x8001,0xf935,0x0001,0x8606,0xf936,0x0001,0x865c, + 0xf937,0x0001,0x8def,0xf938,0x0001,0x9732,0xf939,0x0001, + 0x9b6f,0xf93a,0x0001,0x9dfa,0xf93b,0x0001,0x788c,0xf93c, + 0x0001,0x797f,0xf93d,0x0001,0x7da0,0xf93e,0x0001,0x83c9, + 0xf93f,0x0001,0x9304,0xf940,0x0001,0x9e7f,0xf941,0x0001, + 0x8ad6,0xf942,0x0001,0x58df,0xf943,0x0001,0x5f04,0xf944, + 0x0001,0x7c60,0xf945,0x0001,0x807e,0xf946,0x0001,0x7262, + 0xf947,0x0001,0x78ca,0xf948,0x0001,0x8cc2,0xf949,0x0001, + 0x96f7,0xf94a,0x0001,0x58d8,0xf94b,0x0001,0x5c62,0xf94c, + 0x0001,0x6a13,0xf94d,0x0001,0x6dda,0xf94e,0x0001,0x6f0f, + 0xf94f,0x0001,0x7d2f,0xf950,0x0001,0x7e37,0xf951,0x0001, + 0x96fb,0xf952,0x0001,0x52d2,0xf953,0x0001,0x808b,0xf954, + 0x0001,0x51dc,0xf955,0x0001,0x51cc,0xf956,0x0001,0x7a1c, + 0xf957,0x0001,0x7dbe,0xf958,0x0001,0x83f1,0xf959,0x0001, + 0x9675,0xf95a,0x0001,0x8b80,0xf95b,0x0001,0x62cf,0xf95c, + 0x0001,0x6a02,0xf95d,0x0001,0x8afe,0xf95e,0x0001,0x4e39, + 0xf95f,0x0001,0x5be7,0xf960,0x0001,0x6012,0xf961,0x0001, + 0x7387,0xf962,0x0001,0x7570,0xf963,0x0001,0x5317,0xf964, + 0x0001,0x78fb,0xf965,0x0001,0x4fbf,0xf966,0x0001,0x5fa9, + 0xf967,0x0001,0x4e0d,0xf968,0x0001,0x6ccc,0xf969,0x0001, + 0x6578,0xf96a,0x0001,0x7d22,0xf96b,0x0001,0x53c3,0xf96c, + 0x0001,0x585e,0xf96d,0x0001,0x7701,0xf96e,0x0001,0x8449, + 0xf96f,0x0001,0x8aaa,0xf970,0x0001,0x6bba,0xf971,0x0001, + 0x8fb0,0xf972,0x0001,0x6c88,0xf973,0x0001,0x62fe,0xf974, + 0x0001,0x82e5,0xf975,0x0001,0x63a0,0xf976,0x0001,0x7565, + 0xf977,0x0001,0x4eae,0xf978,0x0001,0x5169,0xf979,0x0001, + 0x51c9,0xf97a,0x0001,0x6881,0xf97b,0x0001,0x7ce7,0xf97c, + 0x0001,0x826f,0xf97d,0x0001,0x8ad2,0xf97e,0x0001,0x91cf, + 0xf97f,0x0001,0x52f5,0xf980,0x0001,0x5442,0xf981,0x0001, + 0x5973,0xf982,0x0001,0x5eec,0xf983,0x0001,0x65c5,0xf984, + 0x0001,0x6ffe,0xf985,0x0001,0x792a,0xf986,0x0001,0x95ad, + 0xf987,0x0001,0x9a6a,0xf988,0x0001,0x9e97,0xf989,0x0001, + 0x9ece,0xf98a,0x0001,0x529b,0xf98b,0x0001,0x66c6,0xf98c, + 0x0001,0x6b77,0xf98d,0x0001,0x8f62,0xf98e,0x0001,0x5e74, + 0xf98f,0x0001,0x6190,0xf990,0x0001,0x6200,0xf991,0x0001, + 0x649a,0xf992,0x0001,0x6f23,0xf993,0x0001,0x7149,0xf994, + 0x0001,0x7489,0xf995,0x0001,0x79ca,0xf996,0x0001,0x7df4, + 0xf997,0x0001,0x806f,0xf998,0x0001,0x8f26,0xf999,0x0001, + 0x84ee,0xf99a,0x0001,0x9023,0xf99b,0x0001,0x934a,0xf99c, + 0x0001,0x5217,0xf99d,0x0001,0x52a3,0xf99e,0x0001,0x54bd, + 0xf99f,0x0001,0x70c8,0xf9a0,0x0001,0x88c2,0xf9a1,0x0001, + 0x8aaa,0xf9a2,0x0001,0x5ec9,0xf9a3,0x0001,0x5ff5,0xf9a4, + 0x0001,0x637b,0xf9a5,0x0001,0x6bae,0xf9a6,0x0001,0x7c3e, + 0xf9a7,0x0001,0x7375,0xf9a8,0x0001,0x4ee4,0xf9a9,0x0001, + 0x56f9,0xf9aa,0x0001,0x5be7,0xf9ab,0x0001,0x5dba,0xf9ac, + 0x0001,0x601c,0xf9ad,0x0001,0x73b2,0xf9ae,0x0001,0x7469, + 0xf9af,0x0001,0x7f9a,0xf9b0,0x0001,0x8046,0xf9b1,0x0001, + 0x9234,0xf9b2,0x0001,0x96f6,0xf9b3,0x0001,0x9748,0xf9b4, + 0x0001,0x9818,0xf9b5,0x0001,0x4f8b,0xf9b6,0x0001,0x79ae, + 0xf9b7,0x0001,0x91b4,0xf9b8,0x0001,0x96b8,0xf9b9,0x0001, + 0x60e1,0xf9ba,0x0001,0x4e86,0xf9bb,0x0001,0x50da,0xf9bc, + 0x0001,0x5bee,0xf9bd,0x0001,0x5c3f,0xf9be,0x0001,0x6599, + 0xf9bf,0x0001,0x6a02,0xf9c0,0x0001,0x71ce,0xf9c1,0x0001, + 0x7642,0xf9c2,0x0001,0x84fc,0xf9c3,0x0001,0x907c,0xf9c4, + 0x0001,0x9f8d,0xf9c5,0x0001,0x6688,0xf9c6,0x0001,0x962e, + 0xf9c7,0x0001,0x5289,0xf9c8,0x0001,0x677b,0xf9c9,0x0001, + 0x67f3,0xf9ca,0x0001,0x6d41,0xf9cb,0x0001,0x6e9c,0xf9cc, + 0x0001,0x7409,0xf9cd,0x0001,0x7559,0xf9ce,0x0001,0x786b, + 0xf9cf,0x0001,0x7d10,0xf9d0,0x0001,0x985e,0xf9d1,0x0001, + 0x516d,0xf9d2,0x0001,0x622e,0xf9d3,0x0001,0x9678,0xf9d4, + 0x0001,0x502b,0xf9d5,0x0001,0x5d19,0xf9d6,0x0001,0x6dea, + 0xf9d7,0x0001,0x8f2a,0xf9d8,0x0001,0x5f8b,0xf9d9,0x0001, + 0x6144,0xf9da,0x0001,0x6817,0xf9db,0x0001,0x7387,0xf9dc, + 0x0001,0x9686,0xf9dd,0x0001,0x5229,0xf9de,0x0001,0x540f, + 0xf9df,0x0001,0x5c65,0xf9e0,0x0001,0x6613,0xf9e1,0x0001, + 0x674e,0xf9e2,0x0001,0x68a8,0xf9e3,0x0001,0x6ce5,0xf9e4, + 0x0001,0x7406,0xf9e5,0x0001,0x75e2,0xf9e6,0x0001,0x7f79, + 0xf9e7,0x0001,0x88cf,0xf9e8,0x0001,0x88e1,0xf9e9,0x0001, + 0x91cc,0xf9ea,0x0001,0x96e2,0xf9eb,0x0001,0x533f,0xf9ec, + 0x0001,0x6eba,0xf9ed,0x0001,0x541d,0xf9ee,0x0001,0x71d0, + 0xf9ef,0x0001,0x7498,0xf9f0,0x0001,0x85fa,0xf9f1,0x0001, + 0x96a3,0xf9f2,0x0001,0x9c57,0xf9f3,0x0001,0x9e9f,0xf9f4, + 0x0001,0x6797,0xf9f5,0x0001,0x6dcb,0xf9f6,0x0001,0x81e8, + 0xf9f7,0x0001,0x7acb,0xf9f8,0x0001,0x7b20,0xf9f9,0x0001, + 0x7c92,0xf9fa,0x0001,0x72c0,0xf9fb,0x0001,0x7099,0xf9fc, + 0x0001,0x8b58,0xf9fd,0x0001,0x4ec0,0xf9fe,0x0001,0x8336, + 0xf9ff,0x0001,0x523a,0xfa00,0x0001,0x5207,0xfa01,0x0001, + 0x5ea6,0xfa02,0x0001,0x62d3,0xfa03,0x0001,0x7cd6,0xfa04, + 0x0001,0x5b85,0xfa05,0x0001,0x6d1e,0xfa06,0x0001,0x66b4, + 0xfa07,0x0001,0x8f3b,0xfa08,0x0001,0x884c,0xfa09,0x0001, + 0x964d,0xfa0a,0x0001,0x898b,0xfa0b,0x0001,0x5ed3,0xfa0c, + 0x0001,0x5140,0xfa0d,0x0001,0x55c0,0xfa10,0x0001,0x585a, + 0xfa12,0x0001,0x6674,0xfa15,0x0001,0x51de,0xfa16,0x0001, + 0x732a,0xfa17,0x0001,0x76ca,0xfa18,0x0001,0x793c,0xfa19, + 0x0001,0x795e,0xfa1a,0x0001,0x7965,0xfa1b,0x0001,0x798f, + 0xfa1c,0x0001,0x9756,0xfa1d,0x0001,0x7cbe,0xfa1e,0x0001, + 0x7fbd,0xfa20,0x0001,0x8612,0xfa22,0x0001,0x8af8,0xfa25, + 0x0001,0x9038,0xfa26,0x0001,0x90fd,0xfa2a,0x0001,0x98ef, + 0xfa2b,0x0001,0x98fc,0xfa2c,0x0001,0x9928,0xfa2d,0x0001, + 0x9db4,0xfb1d,0x0002,0x05d9,0x05b4,0xfb1f,0x0002,0x05f2, + 0x05b7,0xfb2a,0x0002,0x05e9,0x05c1,0xfb2b,0x0002,0x05e9, + 0x05c2,0xfb2c,0x0002,0xfb49,0x05c1,0xfb2d,0x0002,0xfb49, + 0x05c2,0xfb2e,0x0002,0x05d0,0x05b7,0xfb2f,0x0002,0x05d0, + 0x05b8,0xfb30,0x0002,0x05d0,0x05bc,0xfb31,0x0002,0x05d1, + 0x05bc,0xfb32,0x0002,0x05d2,0x05bc,0xfb33,0x0002,0x05d3, + 0x05bc,0xfb34,0x0002,0x05d4,0x05bc,0xfb35,0x0002,0x05d5, + 0x05bc,0xfb36,0x0002,0x05d6,0x05bc,0xfb38,0x0002,0x05d8, + 0x05bc,0xfb39,0x0002,0x05d9,0x05bc,0xfb3a,0x0002,0x05da, + 0x05bc,0xfb3b,0x0002,0x05db,0x05bc,0xfb3c,0x0002,0x05dc, + 0x05bc,0xfb3e,0x0002,0x05de,0x05bc,0xfb40,0x0002,0x05e0, + 0x05bc,0xfb41,0x0002,0x05e1,0x05bc,0xfb43,0x0002,0x05e3, + 0x05bc,0xfb44,0x0002,0x05e4,0x05bc,0xfb46,0x0002,0x05e6, + 0x05bc,0xfb47,0x0002,0x05e7,0x05bc,0xfb48,0x0002,0x05e8, + 0x05bc,0xfb49,0x0002,0x05e9,0x05bc,0xfb4a,0x0002,0x05ea, + 0x05bc,0xfb4b,0x0002,0x05d5,0x05b9,0xfb4c,0x0002,0x05d1, + 0x05bf,0xfb4d,0x0002,0x05db,0x05bf,0xfb4e,0x0002,0x05e4, + 0x05bf + }; + +const TUint16 TUnicode::FoldTable[256] = + { + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, + 0x0040,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x005b,0x005c,0x005d,0x005e,0x005f, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f, + 0x0020,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af, + 0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf, + 0x0061,0x0061,0x0061,0x0061,0x0061,0x0061,0x00e6,0x0063,0x0065,0x0065,0x0065,0x0065,0x0069,0x0069,0x0069,0x0069, + 0x00f0,0x006e,0x006f,0x006f,0x006f,0x006f,0x006f,0x00d7,0x00f8,0x0075,0x0075,0x0075,0x0075,0x0079,0x00fe,0x00df, + 0x0061,0x0061,0x0061,0x0061,0x0061,0x0061,0x00e6,0x0063,0x0065,0x0065,0x0065,0x0065,0x0069,0x0069,0x0069,0x0069, + 0x00f0,0x006e,0x006f,0x006f,0x006f,0x006f,0x006f,0x00f7,0x00f8,0x0075,0x0075,0x0075,0x0075,0x0079,0x00fe,0x0079 + }; +const TUint16 TUnicode::CjkWidthFoldTable[256] = + { + 0xff00,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0xff5f, + 0xff60,0x3002,0x300c,0x300d,0x3001,0x30fb,0x30f2,0x30a1,0x30a3,0x30a5,0x30a7,0x30a9,0x30e3,0x30e5,0x30e7,0x30c3, + 0x30fc,0x30a2,0x30a4,0x30a6,0x30a8,0x30aa,0x30ab,0x30ad,0x30af,0x30b1,0x30b3,0x30b5,0x30b7,0x30b9,0x30bb,0x30bd, + 0x30bf,0x30c1,0x30c4,0x30c6,0x30c8,0x30ca,0x30cb,0x30cc,0x30cd,0x30ce,0x30cf,0x30d2,0x30d5,0x30d8,0x30db,0x30de, + 0x30df,0x30e0,0x30e1,0x30e2,0x30e4,0x30e6,0x30e8,0x30e9,0x30ea,0x30eb,0x30ec,0x30ed,0x30ef,0x30f3,0x3099,0x309a, + 0x3164,0x3131,0x3132,0x3133,0x3134,0x3135,0x3136,0x3137,0x3138,0x3139,0x313a,0x313b,0x313c,0x313d,0x313e,0x313f, + 0x3140,0x3141,0x3142,0x3143,0x3144,0x3145,0x3146,0x3147,0x3148,0x3149,0x314a,0x314b,0x314c,0x314d,0x314e,0xffbf, + 0xffc0,0xffc1,0x314f,0x3150,0x3151,0x3152,0x3153,0x3154,0xffc8,0xffc9,0x3155,0x3156,0x3157,0x3158,0x3159,0x315a, + 0xffd0,0xffd1,0x315b,0x315c,0x315d,0x315e,0x315f,0x3160,0xffd8,0xffd9,0x3161,0x3162,0x3163,0xffdd,0xffde,0xffdf, + 0x00a2,0x00a3,0x00ac,0x00af,0x00a6,0x00a5,0x20a9,0xffe7,0x2502,0x2190,0x2191,0x2192,0x2193,0x25a0,0x25cb,0xffef, + 0xfff0,0xfff1,0xfff2,0xfff3,0xfff4,0xfff5,0xfff6,0xfff7,0xfff8,0xfff9,0xfffa,0xfffb,0xfffc,0xfffd,0xfffe,0xffff + }; + +// The tables and structures contain 35090 bytes of data. diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_data.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_data.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,76 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_data.h +// Defines accessor functions for thread local data, either using Exec calls or the thread ID +// register if available +// +// + +#ifndef __US_DATA_H__ +#define __US_DATA_H__ + +#include "us_std.h" + +#ifdef __USERSIDE_THREAD_DATA__ + +TLocalThreadData* LocalThreadData(); + +#ifndef __TOOLS2__ +inline RAllocator* GetHeap() + { + return LocalThreadData()->iHeap; + } +#endif // __TOOLS2__ + +inline CActiveScheduler* GetActiveScheduler() + { + return LocalThreadData()->iScheduler; + } + +inline void SetActiveScheduler(CActiveScheduler* aS) + { + LocalThreadData()->iScheduler = aS; + } + +inline TTrapHandler* GetTrapHandler() + { + return LocalThreadData()->iTrapHandler; + } + +#else + +inline RAllocator* GetHeap() + { + return Exec::Heap(); + } + +inline CActiveScheduler* GetActiveScheduler() + { + return Exec::ActiveScheduler(); + } + +inline void SetActiveScheduler(CActiveScheduler* aS) + { + Exec::SetActiveScheduler(aS); + } + +inline TTrapHandler* GetTrapHandler() + { + return Exec::TrapHandler(); + } + +#endif + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_decode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_decode.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,399 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_decode.cpp +// +// + +#include +#include +#include +#include + +const TInt KHuffTerminate=0x0001; +const TUint32 KBranch1=sizeof(TUint32)<<16; +_LIT(KCat,"Huffman"); + +TUint32* HuffmanSubTree(TUint32* aPtr,const TUint32* aValue,TUint32** aLevel) +// +// write the subtree below aPtr and return the head +// + { + TUint32* l=*aLevel++; + if (l>aValue) + { + TUint32* sub0=HuffmanSubTree(aPtr,aValue,aLevel); // 0-tree first + aPtr=HuffmanSubTree(sub0,aValue-(aPtr-sub0)-1,aLevel); // 1-tree + TInt branch0=(TUint8*)sub0-(TUint8*)(aPtr-1); + *--aPtr=KBranch1|branch0; + } + else if (l==aValue) + { + TUint term0=*aValue--; // 0-term + aPtr=HuffmanSubTree(aPtr,aValue,aLevel); // 1-tree + *--aPtr=KBranch1|(term0>>16); + } + else // l>16<<16)|(term0>>16); + } + return aPtr; + } + +/** Create a canonical Huffman decoding tree + + This generates the huffman decoding tree used by TBitInput::HuffmanL() to read huffman + encoded data. The input is table of code lengths, as generated by Huffman::HuffmanL() + and must represent a valid huffman code. + + @param aHuffman The table of code lengths as generated by Huffman::HuffmanL() + @param aNumCodes The number of codes in the table + @param aDecodeTree The space for the decoding tree. This must be the same + size as the code-length table, and can safely be the same memory + @param aSymbolBase the base value for the output 'symbols' from the decoding tree, by default + this is zero. + + @panic "USER ???" If the provided code is not a valid Huffman coding + + @see IsValid() + @see HuffmanL() +*/ +EXPORT_C void Huffman::Decoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aDecodeTree[],TInt aSymbolBase) + { + __ASSERT_ALWAYS(IsValid(aHuffman,aNumCodes),User::Panic(KCat,EHuffmanInvalidCoding)); +// + TFixedArray counts; + counts.Reset(); + TInt codes=0; + TInt ii; + for (ii=0;ii=0) + { + ++counts[len]; + ++codes; + } + } +// + TFixedArray level; + TUint32* lit=aDecodeTree+codes; + for (ii=0;ii>16; + aDecodeTree[0]=term|(term<<16); // 0- and 1-terminate at root + } + else if (codes>1) + HuffmanSubTree(aDecodeTree+codes-1,aDecodeTree+codes-1,&level[0]); + } + +// The decoding tree for the externalised code +const TUint32 HuffmanDecoding[]= + { + 0x0004006c, + 0x00040064, + 0x0004005c, + 0x00040050, + 0x00040044, + 0x0004003c, + 0x00040034, + 0x00040021, + 0x00040023, + 0x00040025, + 0x00040027, + 0x00040029, + 0x00040014, + 0x0004000c, + 0x00040035, + 0x00390037, + 0x00330031, + 0x0004002b, + 0x002f002d, + 0x001f001d, + 0x001b0019, + 0x00040013, + 0x00170015, + 0x0004000d, + 0x0011000f, + 0x000b0009, + 0x00070003, + 0x00050001 + }; + +/** Restore a canonical huffman encoding from a bit stream + + The encoding must have been stored using Huffman::ExternalizeL(). The resulting + code-length table can be used to create an encoding table using Huffman::Encoding() + or a decoding tree using Huffman::Decoding(). + + @param aInput The input stream with the encoding + @param aHuffman The internalized code-length table is placed here + @param aNumCodes The number of huffman codes in the table + + @leave TBitInput::HuffmanL() + + @see ExternalizeL() +*/ +EXPORT_C void Huffman::InternalizeL(TBitInput& aInput,TUint32 aHuffman[],TInt aNumCodes) +// See ExternalizeL for a description of the format + { + // initialise move-to-front list + TFixedArray list; + for (TInt i=0;i= TUint(end-p)) + User::Leave(KErrCorrupt); + while (rl>0) + { + *p++=last; + --rl; + } + --c; // c is now 1..27 + list[0]=TUint8(last); + last=list[c]; + Mem::Copy(&list[1],&list[0],c); + *p++=last; + } + } + + while (p>16); + v^=aVal; + v&=0xff00ffff; + aVal=(aVal>>8)|(aVal<<24); + return aVal^(v>>8); + } + +/** Construct a bit stream input object + + Following construction the bit stream is ready for reading bits, but will + immediately call UnderflowL() as the input buffer is empty. +*/ +EXPORT_C TBitInput::TBitInput() + :iCount(0),iRemain(0) + {} + +/** Construct a bit stream input object over a buffer + + Following construction the bit stream is ready for reading bits from + the specified buffer. + + @param aPtr The address of the buffer containing the bit stream + @param aLength The length of the bitstream in bits + @param aOffset The bit offset from the start of the buffer to the bit stream (defaults to zero) +*/ +EXPORT_C TBitInput::TBitInput(const TUint8* aPtr, TInt aLength, TInt aOffset) + { + Set(aPtr,aLength,aOffset); + } + +/** Set the memory buffer to use for input + + Bits will be read from this buffer until it is empty, at which point + UnderflowL() will be called. + + @param aPtr The address of the buffer containing the bit stream + @param aLength The length of the bitstream in bits + @param aOffset The bit offset from the start of the buffer to the bit stream (defaults to zero) +*/ +EXPORT_C void TBitInput::Set(const TUint8* aPtr, TInt aLength, TInt aOffset) + { + TUint p=(TUint)aPtr; + p+=aOffset>>3; // nearest byte to the specified bit offset + aOffset&=7; // bit offset within the byte + const TUint32* ptr=(const TUint32*)(p&~3); // word containing this byte + aOffset+=(p&3)<<3; // bit offset within the word + if (aLength==0) + iCount=0; + else + { + // read the first few bits of the stream + iBits=reverse(*ptr++)<>31; + } + +/** Read a multi-bit value from the input + + Return the next few bits as an unsigned integer. The last bit read is + the least significant bit of the returned value, and the value is + zero extended to return a 32-bit result. + + A read of zero bits will always reaturn zero. + + This will call UnderflowL() if there are not enough bits available. + + @param aSize The number of bits to read + + @return The bits read from the stream + + @leave "UnderflowL()" It the bit stream is exhausted more UnderflowL is called + to get more data +*/ +EXPORT_C TUint TBitInput::ReadL(TInt aSize) + { + if (!aSize) + return 0; + TUint val=0; + TUint bits=iBits; + iCount-=aSize; + while (iCount<0) + { + // need more bits +#ifdef __CPU_X86 + // X86 does not allow shift-by-32 + if (iCount+aSize!=0) + val|=bits>>(32-(iCount+aSize))<<(-iCount); // scrub low order bits +#else + val|=bits>>(32-(iCount+aSize))<<(-iCount); // scrub low order bits +#endif + aSize=-iCount; // bits still required + if (iRemain>0) + { + bits=reverse(*iPtr++); + iCount+=32; + iRemain-=32; + if (iRemain<0) + iCount+=iRemain; + } + else + { + UnderflowL(); + bits=iBits; + iCount-=aSize; + } + } +#ifdef __CPU_X86 + // X86 does not allow shift-by-32 + iBits=aSize==32?0:bits<>(32-aSize)); + } + +/** Read and decode a Huffman Code + + Interpret the next bits in the input as a Huffman code in the specified + decoding. The decoding tree should be the output from Huffman::Decoding(). + + @param aTree The huffman decoding tree + + @return The symbol that was decoded + + @leave "UnderflowL()" It the bit stream is exhausted more UnderflowL is called + to get more data +*/ +EXPORT_C TUint TBitInput::HuffmanL(const TUint32* aTree) + { + TUint huff=0; + do + { + aTree=PtrAdd(aTree,huff>>16); + huff=*aTree; + if (ReadL()==0) + huff<<=16; + } while ((huff&0x10000u)==0); + return huff>>17; + } + +#endif + +/** Handle an empty input buffer + + This virtual function is called when the input buffer is empty and + more bits are required. It should reset the input buffer with more + data using Set(). + + A derived class can replace this to read the data from a file + (for example) before reseting the input buffer. + + @leave KErrUnderflow The default implementation leaves +*/ +void TBitInput::UnderflowL() + { + User::Leave(KErrUnderflow); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_des.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_des.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,871 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_des.cpp +// +// + +#include "us_std.h" + +// Terrible hack. Surely we should use VA_START instead of the below? +#if defined(__EABI__) || (defined(__X86__) && defined(__GCC32__)) +#define EABI_STYLE_VA_LISTS +#endif + +const TInt KNoPrecision=-1; +const TInt KDefaultPrecision=6; +const TInt KMaxRealWidth=0x20; + +// TFormatedText8 and TFormatedText16 + +class TFormatedText8 + { +public: + TBuf8<0x40> iBuffer; + const TUint8* iText; + TInt iTextLength; + TInt iWidth; + TAlign iJustify; + TChar iFill; + }; + +class TFormatedText16 + { +public: + TBuf16<0x40> iBuffer; + const TUint16* iText; + TInt iTextLength; + TInt iWidth; + TAlign iJustify; + TChar iFill; + }; + +// TPanicker8 and TPanicker16 + +class TPanicker8 + { +public: + static inline void Panic_BadFormatDescriptor() {Panic(ETDes8BadFormatDescriptor);} + static inline void Panic_BadFormatParams() {Panic(ETDes8BadFormatParams);} + }; + +class TPanicker16 + { +public: + static inline void Panic_BadFormatDescriptor() {Panic(ETDes16BadFormatDescriptor);} + static inline void Panic_BadFormatParams() {Panic(ETDes16BadFormatParams);} + }; + +// TFormatDirective + +class TFormatDirective // basically a sort of array of parameters where the size of each parameter is stored (no more than 4 parameters are possible per format-directive) - it also knows whether the format directive it represents has an explicit index, and if so, what that index is + { +public: + inline TFormatDirective() :iSizesOfParametersInBytes(0), iFormatDirectiveIndex(EImplicitFormatDirectiveIndex) {} + void AppendParameter(TInt aSizeOfParameterInBytes,TInt aParameterAlignment); + inline void FormatDirectiveHasExplicitIndex(TInt aFormatDirectiveIndex) {iFormatDirectiveIndex=aFormatDirectiveIndex;} +private: + friend class TParameterManager; +private: + enum {EImplicitFormatDirectiveIndex=-1}; + enum + { + EShiftToNumberOfParameters=28, + ENumberOfBitsPerParameter=5, + EMaskForSingleParameter=(1<>EShiftToNumberOfParameters;} + TInt SizeOfParameter(TInt aIndex) const; + TUint8* CalculateDataPointer(const TUint8* aDataPtr,TInt aIndex) const; +private: + TUint iSizesOfParametersInBytes; // a compactly stored array + TInt iFormatDirectiveIndex; + }; + +void TFormatDirective::AppendParameter(TInt aSizeOfParameterInBytes, TInt aParameterAlignment) + { + const TInt numberOfParameters=NumberOfParameters(); + __ASSERT_DEBUG(numberOfParameters>(aIndex*ENumberOfBitsPerParameter))&EMaskForParameterSize; + } + +TUint8* TFormatDirective::CalculateDataPointer(const TUint8* aDataPtr,TInt aIndex) const + { + TInt numParams = NumberOfParameters(); + __ASSERT_DEBUG(aIndex<=numParams, Panic(EParameterIndexOutOfRange1)); + TInt paramInfo = iSizesOfParametersInBytes; + while(numParams--) + { + TInt alignMask = (4<<(paramInfo&EMaskForAlignmentShift))-1; + aDataPtr = (TUint8*)(((TInt)aDataPtr+alignMask)&~alignMask); + if(!aIndex--) + break; + aDataPtr += paramInfo&EMaskForParameterSize; + paramInfo >>= ENumberOfBitsPerParameter; + } + return const_cast(aDataPtr); + } + +// TParameterManager + +class TParameterManager + { +public: + TParameterManager(); + void AddFormatDirective(const TFormatDirective& aFormatDirective); + TInt PrepareToExtractNextParameter(VA_LIST aList); // returns either KErrNone or KErrNotReady + void PrepareToExtractParameters(VA_LIST aList); + TInt ExtractParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aFormatDirectiveIndex, TInt aParameterIndexWithinFormatDirective, const TFormatDirective* aNextFormatDirective); +private: + enum + { + EMaximumNumberOfFormatDirectives=40, + ENumberOfBytesInBitArray=(EMaximumNumberOfFormatDirectives+7)/8 + }; +private: + inline TBool FormatDirectiveIsSet(TInt aIndex) const {return iFormatDirectivesSet[aIndex/8]&(1<<(aIndex%8));} + inline void MarkFormatDirectiveAsSet(TInt aIndex) {iFormatDirectivesSet[aIndex/8]|=(1<<(aIndex%8)); __ASSERT_DEBUG(FormatDirectiveIsSet(aIndex), Panic(EFormatDirectiveAlreadySet1));} +private: + TInt iNumberOfFormatDirectives; + TFixedArray iFormatDirectivesSet; + TFixedArray iFormatDirectives; + TFixedArray iFormatDirectiveDataPointers; + }; + +TParameterManager::TParameterManager() + :iNumberOfFormatDirectives(0) + { + TInt i; + for (i=0; i=0)? aFormatDirective.iFormatDirectiveIndex: iNumberOfFormatDirectives; + __ASSERT_ALWAYS(!FormatDirectiveIsSet(index), Panic(EFormatDirectiveAlreadySet2)); + MarkFormatDirectiveAsSet(index); + iFormatDirectives[index]=aFormatDirective; + ++iNumberOfFormatDirectives; + } + +TInt TParameterManager::PrepareToExtractNextParameter(VA_LIST aList) + { + if (iNumberOfFormatDirectives==0) + { +#ifdef EABI_STYLE_VA_LISTS + // NB under the EABI we are passing va_list (a struct) by value. + // We could extract the pointer using aList.__ap under RVCT, but I don't believe the EABI + // extends to the name of the field. So I think the 'nasty' cast is likely to be more + // portable. + const TUint8 ** aL = (const TUint8**)&aList; + iFormatDirectiveDataPointers[iNumberOfFormatDirectives] = aL[0]; +#else + // The horrible cast is there because you can't assume aList is of 'array' type + iFormatDirectiveDataPointers[iNumberOfFormatDirectives] = (const TUint8*)(*(TInt*)aList); +#endif + } + else + { + const TInt previousFormatDirective=iNumberOfFormatDirectives-1; + const TUint8* dataPointer=iFormatDirectiveDataPointers[previousFormatDirective]; + if ((dataPointer==NULL) || !FormatDirectiveIsSet(previousFormatDirective)) + { + return KErrNotReady; + } + const TFormatDirective& formatDirective=iFormatDirectives[previousFormatDirective]; + dataPointer = formatDirective.CalculateDataPointer(dataPointer,formatDirective.NumberOfParameters()); + iFormatDirectiveDataPointers[iNumberOfFormatDirectives]=dataPointer; + } + return KErrNone; + } + +void TParameterManager::PrepareToExtractParameters(VA_LIST aList) + { +#ifdef EABI_STYLE_VA_LISTS + // NB under the EABI we are passing va_list (a struct) by value. + // We could extract the pointer using aList.__ap under RVCT, but I don't believe the EABI + // extends to the name of the field. So I think the 'nasty' cast is likely to be more + // portable. + const TUint8 ** aL = (const TUint8**)&aList; + const TUint8* dataPointer = aL[0]; +#else + // The horrible cast is there because you can't assume aList is of 'array' type + const TUint8* dataPointer = (const TUint8*)(*(TInt*)aList); +#endif + if (iNumberOfFormatDirectives>0) + { + for (TInt i=0; ; ++i) + { + __ASSERT_ALWAYS(FormatDirectiveIsSet(i), Panic(EFormatDirectiveNotYetSet)); + __ASSERT_DEBUG((iFormatDirectiveDataPointers[i]==NULL) || (iFormatDirectiveDataPointers[i]==dataPointer), Panic(EBadFormatDirectiveDataPointer)); + iFormatDirectiveDataPointers[i]=dataPointer; + if (i+1>=iNumberOfFormatDirectives) + { + break; + } + const TFormatDirective& formatDirective=iFormatDirectives[i]; + dataPointer = formatDirective.CalculateDataPointer(dataPointer,formatDirective.NumberOfParameters()); + } + } + } + +TInt TParameterManager::ExtractParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aFormatDirectiveIndex, TInt aParameterIndexWithinFormatDirective, const TFormatDirective* aNextFormatDirective) + { + __ASSERT_DEBUG(aFormatDirectiveIndex=iNumberOfFormatDirectives) can only be the case on a first pass of the format descriptor, so assert that we're on the first pass + if (aFormatDirectiveIndex>iNumberOfFormatDirectives) + { + return KErrNotReady; + } + formatDirective=aNextFormatDirective; + } + __ASSERT_DEBUG(aSizeOfParameterInBytes==formatDirective->SizeOfParameter(aParameterIndexWithinFormatDirective), Panic(EInconsistentSizeOfParameter)); + const TUint8* dataPointer=iFormatDirectiveDataPointers[aFormatDirectiveIndex]; + if (dataPointer==NULL) + { + __ASSERT_DEBUG(aNextFormatDirective!=NULL, Panic(ENotOnFirstPassOfFormatDescriptor2)); // the above condition (dataPointer==NULL) can only be the case on a first pass of the format descriptor, so assert that we're on the first pass + return KErrNotReady; + } + __ASSERT_DEBUG(aParameterIndexWithinFormatDirectiveNumberOfParameters(), Panic(EParameterIndexOutOfRange2)); + dataPointer = formatDirective->CalculateDataPointer(dataPointer,aParameterIndexWithinFormatDirective); + Mem::Copy(aTarget, dataPointer, aSizeOfParameterInBytes); + return KErrNone; + } + +// TParameterHandler + +class TParameterHandler + { +public: + enum TAction + { + EParameterNotExtracted, + EParameterExtracted + }; +public: + inline TParameterHandler(TInt aImplicitFormatDirectiveIndex, TParameterManager& aParameterManager, TFormatDirective& aFormatDirective) :iFormatDirectiveIndex(aImplicitFormatDirectiveIndex), iParameterIndex(0), iFormatDirective(&aFormatDirective), iParameterManager(aParameterManager) {} // for the first pass + inline TParameterHandler(TInt aImplicitFormatDirectiveIndex, TParameterManager& aParameterManager) :iFormatDirectiveIndex(aImplicitFormatDirectiveIndex), iParameterIndex(0), iFormatDirective(NULL), iParameterManager(aParameterManager) {} // for the second pass + TAction HandleParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aParameterAlignment=4); + void FormatDirectiveHasExplicitIndex(TInt aFormatDirectiveIndex); +private: + TInt iFormatDirectiveIndex; + TInt iParameterIndex; + TFormatDirective* iFormatDirective; + TParameterManager& iParameterManager; + }; + +TParameterHandler::TAction TParameterHandler::HandleParameter(TAny* aTarget, TInt aSizeOfParameterInBytes, TInt aParameterAlignment) +// Increments iParameterIndex each time it is called. +// This is conceptually a sort of virtual function (i.e. it's behaviour depends on the way the object was constructed), although it is not implemented like that. + { + __ASSERT_DEBUG(aTarget!=NULL, Panic(ENullTargetPointer)); + __ASSERT_DEBUG(aSizeOfParameterInBytes>=0, Panic(ENegativeSizeOfParameter)); + const TUint machineWordAlignmentConstant=sizeof(TUint)-1; + aSizeOfParameterInBytes+=machineWordAlignmentConstant; + aSizeOfParameterInBytes&=~machineWordAlignmentConstant; + + if (iFormatDirective!=NULL) + { + iFormatDirective->AppendParameter(aSizeOfParameterInBytes,aParameterAlignment); + } + const TInt error=iParameterManager.ExtractParameter(aTarget, aSizeOfParameterInBytes, iFormatDirectiveIndex, iParameterIndex, iFormatDirective); +#if defined(_DEBUG) + if (iFormatDirective==NULL) // if we're on the second pass... + { + __ASSERT_DEBUG(error==KErrNone, Panic(EErrorOnSecondPassOfFormatDescriptor)); + } + else + { + __ASSERT_DEBUG(error==KErrNone || error==KErrNotReady, Panic(EUnexpectedError1)); + } +#endif + ++iParameterIndex; + return (error==KErrNone)? EParameterExtracted: EParameterNotExtracted; + } + +void TParameterHandler::FormatDirectiveHasExplicitIndex(TInt aFormatDirectiveIndex) + { + if (iFormatDirective!=NULL) + { + iFormatDirective->FormatDirectiveHasExplicitIndex(aFormatDirectiveIndex); + } + iFormatDirectiveIndex=aFormatDirectiveIndex; + } + +template +void HandleFormatDirective(TParameterHandler& aParameterHandler, XFormatedText& aFormatedText, XLex& aFmt) +// +// Handle a single format directive, i.e. sequence starting with a '%', (although the initial '%' will have been consumed by this point). +// + { + +// Determine alignment of various types on the stack. The FOFF approach +// does not work for GCC 3.4.4 on X86 so we use hardcoded constants instead. +#if defined(__GCC32__) && defined(__X86__) + const TInt KAlignTReal = 4; + const TInt KAlignTRealX = 4; + const TInt KAlignTInt64 = 4; +#else + struct TReal_align {char c; TReal a;}; + const TInt KAlignTReal = _FOFF(TReal_align,a); + #ifndef __VC32__ // MSVC generates an internal compiler error with the following code + struct TRealX_align {char c; TRealX a;}; + const TInt KAlignTRealX = _FOFF(TRealX_align,a); + + struct TInt64_align {char c; TInt64 a;}; + const TInt KAlignTInt64 = _FOFF(TInt64_align,a); + #else + const TInt KAlignTRealX = 4; // Hard code value for MSVC + const TInt KAlignTInt64 = 4; // Hard code value for MSVC + #endif +#endif + + aFormatedText.iJustify=ERight; // Default is justify right + aFormatedText.iFill=KNoChar; // Default fill character is space + // After a % may come +,-,= or space + if (aFmt.Eos()) + XPanicker::Panic_BadFormatDescriptor(); + TChar c=aFmt.Get(); + + if (c=='$') + { + TInt formatDirectiveIndex; + if (aFmt.Val(formatDirectiveIndex)!=0) + XPanicker::Panic_BadFormatDescriptor(); + aParameterHandler.FormatDirectiveHasExplicitIndex(formatDirectiveIndex-1); + if (aFmt.Get()!='$') + XPanicker::Panic_BadFormatDescriptor(); + c=aFmt.Get(); + } + + switch (c) + { + case ' ': + aFormatedText.iFill=' '; + break; + case '-': + aFormatedText.iJustify=ELeft; + goto getFill; + case '=': + aFormatedText.iJustify=ECenter; + goto getFill; + case '+': +getFill: + if (aFmt.Eos()) + XPanicker::Panic_BadFormatDescriptor(); + if (!aFmt.Peek().IsDigit()) + { + aFormatedText.iFill=aFmt.Get(); // assigning aFormatedText.iFill to something other than KNoChar is necessary as the aParameterHandler.HandleParameter call a couple of lines below will not necessarily set its first parameter (i.e. aFormatedText.iFill) - aFormatedText.iFill is tested against KNoChar ten or so lines below + if (aFormatedText.iFill=='*') // If* take it from the arguments + aParameterHandler.HandleParameter(&aFormatedText.iFill, sizeof(TUint)); + } + break; + default: + aFmt.UnGet(); + } + + aFormatedText.iWidth=KDefaultJustifyWidth; // Default width is whatever the conversion takes + if (aFmt.Peek().IsDigit()) + { + // If it starts with 0 and the fill character has not been + // specified then the fill character will be a 0 + // For compatibility with standard C libraries + if (aFmt.Peek()=='0' && aFormatedText.iFill==KNoChar) + { + aFormatedText.iFill='0'; + aFmt.Inc(); + } + if (aFmt.Peek()!='*') + if (aFmt.Val(aFormatedText.iWidth)) // Convert field width value + XPanicker::Panic_BadFormatDescriptor(); + } + if (aFmt.Peek()=='*' && aFormatedText.iWidth==KDefaultJustifyWidth) // If a * then get width from arguments + { + aParameterHandler.HandleParameter(&aFormatedText.iWidth, sizeof(TInt)); + aFmt.Inc(); + } + // Get precision setting if given + TInt precision=KNoPrecision; + if (aFmt.Peek()=='.') + { + aFmt.Inc(); + if (aFmt.Peek()=='*') + { + aParameterHandler.HandleParameter(&precision, sizeof(TInt)); + aFmt.Inc(); + } + else if (aFmt.Val(precision)) + XPanicker::Panic_BadFormatDescriptor(); + } + if (aFormatedText.iFill==KNoChar) // If still default fill character make it space + aFormatedText.iFill=' '; + if (aFmt.Eos()) + XPanicker::Panic_BadFormatDescriptor(); + TChar selector; + TBool lng=EFalse; + TCharUC f=aFmt.Peek(); + if (f=='L') // If l set selector for longs + { + aFmt.Inc(); + lng=ETrue; + } + selector=aFmt.Get(); // Get the selector in upper case + aFormatedText.iText=aFormatedText.iBuffer.Ptr(); + aFormatedText.iTextLength=1; + TRadix radix=EDecimal; + TUint uVal=0; + TReal rVal=0; + TRealX rValX=0; + TInt realFormatType=KRealFormatFixed; + switch (selector) + { + case 'S': // String conversion + { + const XDesC* pB; + if (aParameterHandler.HandleParameter(&pB, sizeof(const TAny*))==TParameterHandler::EParameterExtracted) + { + __ASSERT_DEBUG(pB!=0,XPanicker::Panic_BadFormatParams()); + aFormatedText.iTextLength=pB->Length(); + if (precision!=KNoPrecision && precisionPtr(); + } + } + break; + case 's': + if (aParameterHandler.HandleParameter(&aFormatedText.iText, sizeof(const TAny*))==TParameterHandler::EParameterExtracted) + { + __ASSERT_DEBUG(aFormatedText.iText!=0,XPanicker::Panic_BadFormatParams()); + if (precision!=KNoPrecision) + aFormatedText.iTextLength=precision; + else + aFormatedText.iTextLength=User::StringLength(aFormatedText.iText); + } + break; + case 'O': + case 'o': + radix=EOctal; + goto lConv; + case 'X': + case 'x': + radix=EHex; + goto lConv; + case 'B': // Binary conversion + case 'b': + radix=EBinary; + case 'U': + case 'u': +lConv: + if (lng) + { + TInt64 uVal64 = 0; + if (aParameterHandler.HandleParameter(&uVal64, sizeof(TInt64), KAlignTInt64)==TParameterHandler::EParameterExtracted) + { + if (selector=='X') + aFormatedText.iBuffer.NumUC(uVal64,radix); + else + aFormatedText.iBuffer.Num(uVal64,radix); + } + } + else + { + if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))==TParameterHandler::EParameterExtracted) + { + if (selector=='X') + aFormatedText.iBuffer.NumUC(uVal,radix); + else + aFormatedText.iBuffer.Num(uVal,radix); + } + } + aFormatedText.iTextLength=aFormatedText.iBuffer.Length(); + break; + case 'D': // Decimal conversion + case 'd': + case 'I': + case 'i': + if (lng) + { + TInt64 iVal64=0; + if (aParameterHandler.HandleParameter(&iVal64, sizeof(TInt64),KAlignTInt64)==TParameterHandler::EParameterExtracted) + { + aFormatedText.iBuffer.Num(iVal64); + } + } + else + { + TInt iVal=0; + if (aParameterHandler.HandleParameter(&iVal, sizeof(TInt))==TParameterHandler::EParameterExtracted) + { + aFormatedText.iBuffer.Num(iVal); + } + } + aFormatedText.iTextLength=aFormatedText.iBuffer.Length(); + break; + case 'P': // Padded conversion + case 'p': + aFormatedText.iTextLength=0; + break; + case 'C': + case 'c': // Ascii character conversion + if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))==TParameterHandler::EParameterExtracted) + { + aFormatedText.iBuffer.Append(uVal); + } + break; + case 'W': // SLONG binary lsb first conversion + case 'M': // SLONG binary msb first conversion + if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))!=TParameterHandler::EParameterExtracted) + { + break; + } + aFormatedText.iTextLength=4/XItemSize; + goto doBinary; + case 'w': // SWORD binary lsb first conversion + case 'm': // SWORD binary msb first conversion + if (aParameterHandler.HandleParameter(&uVal, sizeof(TUint))!=TParameterHandler::EParameterExtracted) + { + break; + } + aFormatedText.iTextLength=2/XItemSize; + //goto doBinary; +doBinary: + { + TUint8* pC; + TInt increment; + if (selector=='m' || selector=='M') + { + pC=((TUint8*)(aFormatedText.iText+aFormatedText.iTextLength))-1; + increment=(-1); + } + else + { + pC=(TUint8*)aFormatedText.iText; + increment=1; + } + for (TInt k=aFormatedText.iTextLength*sizeof(*aFormatedText.iText);k>0;--k) + { + *pC=(TUint8)uVal; + pC+=increment; + uVal>>=8; + } + } + break; + case 'F': // TRealX conversion + if (aParameterHandler.HandleParameter(&rValX, sizeof(TRealX), KAlignTRealX)!=TParameterHandler::EParameterExtracted) + { + break; + } + rVal=rValX; + goto doReal; + case 'f': // TReal conversion + if (aParameterHandler.HandleParameter(&rVal, sizeof(TReal), KAlignTReal)!=TParameterHandler::EParameterExtracted) + { + break; + } + goto doReal; + case 'E': + if (aParameterHandler.HandleParameter(&rValX, sizeof(TRealX), KAlignTRealX)!=TParameterHandler::EParameterExtracted) + { + break; + } + rVal=rValX; + realFormatType=KRealFormatExponent|KAllowThreeDigitExp; // AnnW - changed from EExponent + goto doReal; + case 'e': + if (aParameterHandler.HandleParameter(&rVal, sizeof(TReal), KAlignTReal)!=TParameterHandler::EParameterExtracted) + { + break; + } + realFormatType=KRealFormatExponent|KAllowThreeDigitExp; // AnnW - changed from EExponent + //goto doReal; +doReal: + { + if (precision==KNoPrecision) + precision=KDefaultPrecision; + TRealFormat realFormat(KMaxRealWidth, precision); + realFormat.iType=realFormatType; + aFormatedText.iTextLength=aFormatedText.iBuffer.Num(rVal, realFormat); + if (aFormatedText.iTextLength<0) + { + if (aFormatedText.iTextLength==KErrGeneral) + XPanicker::Panic_BadFormatDescriptor(); + else + aFormatedText.iTextLength=aFormatedText.iBuffer.Length(); + } + if (aFormatedText.iWidth!=KDefaultJustifyWidth && aFormatedText.iTextLength>aFormatedText.iWidth) + aFormatedText.iWidth=aFormatedText.iTextLength; + } + break; + case 'G': + if (aParameterHandler.HandleParameter(&rValX, sizeof(TRealX), KAlignTRealX)!=TParameterHandler::EParameterExtracted) + { + break; + } + rVal=rValX; + goto doGReal; + case 'g': + if (aParameterHandler.HandleParameter(&rVal, sizeof(TReal), KAlignTReal)!=TParameterHandler::EParameterExtracted) + { + break; + } + //goto doGReal; +doGReal: + { + if (precision==KNoPrecision) + precision=KDefaultPrecision; + + // aFormatedText.iBuffer must be >= KMaxRealWidth + TRealFormat realFormat(KMaxRealWidth, precision); // Changed from 'width' to KMaxRealWidth + realFormat.iType=KRealFormatGeneral|KAllowThreeDigitExp; // AnnW - changed from EGeneral + aFormatedText.iTextLength=aFormatedText.iBuffer.Num(rVal, realFormat); + if (aFormatedText.iTextLength<0) + { + // Doesn't fit in given width + realFormat.iWidth=KDefaultRealWidth; + aFormatedText.iTextLength=aFormatedText.iBuffer.Num(rVal, realFormat); + } + if (aFormatedText.iTextLength<0) + { + if (aFormatedText.iTextLength==KErrGeneral) + XPanicker::Panic_BadFormatDescriptor(); + else + aFormatedText.iTextLength=aFormatedText.iBuffer.Length(); + } + if (aFormatedText.iWidth!=KDefaultJustifyWidth && aFormatedText.iTextLength>aFormatedText.iWidth) + aFormatedText.iWidth=aFormatedText.iTextLength; + } + break; + default: // Not recognized - output % something + XPanicker::Panic_BadFormatDescriptor(); + } + // Justify result of conversion + if (aFormatedText.iWidth==KDefaultJustifyWidth) + aFormatedText.iWidth=aFormatedText.iTextLength; + if (aFormatedText.iTextLength>aFormatedText.iWidth) + aFormatedText.iTextLength=aFormatedText.iWidth; + } + +template +void DoAppendFormatList(XDes& aThis,const XDesC& aFormat,VA_LIST aList,XDesOverflow* aOverflowHandler) +// +// Convert the argument list, using the format descriptor. +// + { + + const TInt overflowLength=aOverflowHandler? aThis.MaxLength(): KMaxTInt; + const TInt originalLength=aThis.Length(); + TBool needSecondPass=EFalse; + TParameterManager parameterManager; + XLex format(aFormat); + TInt implicitFormatDirectiveIndex=0; + FOREVER + { + if (format.Eos()) + { + break; + } + const TChar character=format.Get(); + if (character!='%') + { + if (!needSecondPass) + { + if (aThis.Length()>=overflowLength) + { + aOverflowHandler->Overflow(aThis); + return; + } + aThis.Append(character); + } + } + else if (format.Peek()=='%') + { + if (!needSecondPass) + { + if (aThis.Length()>=overflowLength) + { + aOverflowHandler->Overflow(aThis); + return; + } + aThis.Append(character); + } + format.Inc(); + } + else + { + TFormatDirective formatDirective; + TParameterHandler parameterHandler(implicitFormatDirectiveIndex, parameterManager, formatDirective); + XFormatedText formatedText; + const TInt error=parameterManager.PrepareToExtractNextParameter(aList); + if (error!=KErrNone) + { + __ASSERT_DEBUG(error==KErrNotReady, Panic(EUnexpectedError2)); + needSecondPass=ETrue; + } + HandleFormatDirective(parameterHandler, formatedText, format); + parameterManager.AddFormatDirective(formatDirective); + if (!needSecondPass) + { + if ((aThis.Length()+formatedText.iWidth)>overflowLength) + { + aOverflowHandler->Overflow(aThis); + return; + } + aThis.AppendJustify(formatedText.iText, formatedText.iTextLength, formatedText.iWidth, formatedText.iJustify, formatedText.iFill); + } + ++implicitFormatDirectiveIndex; + } + } + if (needSecondPass) + { + aThis.SetLength(originalLength); + parameterManager.PrepareToExtractParameters(aList); + format=aFormat; + implicitFormatDirectiveIndex=0; + FOREVER + { + if (format.Eos()) + { + break; + } + const TChar character=format.Get(); + if (character!='%') + { + if (aThis.Length()>=overflowLength) + { + aOverflowHandler->Overflow(aThis); + return; + } + aThis.Append(character); + } + else if (format.Peek()=='%') + { + if (aThis.Length()>=overflowLength) + { + aOverflowHandler->Overflow(aThis); + return; + } + aThis.Append(character); + format.Inc(); + } + else + { + TParameterHandler parameterHandler(implicitFormatDirectiveIndex, parameterManager); + XFormatedText formatedText; + HandleFormatDirective(parameterHandler, formatedText, format); + if ((aThis.Length()+formatedText.iWidth)>overflowLength) + { + aOverflowHandler->Overflow(aThis); + return; + } + aThis.AppendJustify(formatedText.iText, formatedText.iTextLength, formatedText.iWidth, formatedText.iJustify, formatedText.iFill); + ++implicitFormatDirectiveIndex; + } + } + } + } + + + + +/** +Formats and appends text onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The behaviour of this function is the same as +AppendFormat(TRefByValue aFmt,TDes8Overflow *aOverflowHandler,...). +In practice, it is better and easier to use AppendFormat(), passing a variable number of +arguments as required by the format string. + +@param aFormat The descriptor containing the format string. +@param aList A pointer to an argument list. +@param aOverflowHandler If supplied, a pointer to the overflow handler. + +@see TDes8::AppendFormat +@see VA_LIST +*/ +EXPORT_C void TDes8::AppendFormatList(const TDesC8 &aFormat,VA_LIST aList,TDes8Overflow *aOverflowHandler) + { + + DoAppendFormatList(*this,aFormat,aList,aOverflowHandler); + } + + + +/** +Formats and appends text onto the end of this descriptor's data. + +The length of this descriptor is incremented to reflect the new content. + +The behaviour of this function is the same as +AppendFormat(TRefByValue aFmt,TDes16Overflow *aOverflowHandler,...). +In practice, it is better and easier to use AppendFormat(), passing a variable number of +arguments as required by the format string. + +@param aFormat The descriptor containing the format string. +@param aList A pointer to an argument list. +@param aOverflowHandler If supplied, a pointer to the overflow handler. + +@see TDes16::AppendFormat +@see VA_LIST +*/ +EXPORT_C void TDes16::AppendFormatList(const TDesC16 &aFormat,VA_LIST aList,TDes16Overflow *aOverflowHandler) + { + + DoAppendFormatList(*this,aFormat,aList,aOverflowHandler); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_encode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_encode.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,477 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_encode.cpp +// +// + +#include +#include +#include + +_LIT(KCat,"Huffman"); +// local definitions used for Huffman code generation +typedef TUint16 THuff; /** @internal */ +const THuff KLeaf=0x8000; /** @internal */ +struct TNode +/** @internal */ + { + TUint iCount; + THuff iLeft; + THuff iRight; + }; + +/** recursive function to calculate the code lengths from the node tree + + @internalComponent +*/ +void HuffmanLengthsL(TUint32* aLengths,const TNode* aNodes,TInt aNode,TInt aLen) + { + if (++aLen>Huffman::KMaxCodeLength) + User::Leave(KErrOverflow); + + const TNode& node=aNodes[aNode]; + TUint x=node.iLeft; + if (x&KLeaf) + aLengths[x&~KLeaf]=aLen; + else + HuffmanLengthsL(aLengths,aNodes,x,aLen); + x=node.iRight; + if (x&KLeaf) + aLengths[x&~KLeaf]=aLen; + else + HuffmanLengthsL(aLengths,aNodes,x,aLen); + } + +/** Insert the {aCount,aValue} pair into the already sorted array of nodes + + @internalComponent +*/ +void InsertInOrder(TNode* aNodes, TInt aSize, TUint aCount, TInt aVal) + { + // Uses Insertion sort following a binary search... + TInt l=0, r=aSize; + while (l < r) + { + TInt m = (l+r) >> 1; + if (aNodes[m].iCount0. No code has a length + } + else if (lCount==1) + { + // special case for a single value (always encode as "0") + aHuffman[nodes[0].iRight&~KLeaf]=1; + } + else + { + // Huffman algorithm: pair off least frequent nodes and reorder + // + do + { + --lCount; + TUint c=nodes[lCount].iCount + nodes[lCount-1].iCount; + nodes[lCount].iLeft=nodes[lCount-1].iRight; + // re-order the leaves now to reflect new combined frequency 'c' + InsertInOrder(nodes,lCount-1,c,lCount); + } while (lCount>1); + // generate code lengths in aHuffman[] + HuffmanLengthsL(aHuffman,nodes,1,0); + } + CleanupStack::PopAndDestroy(nodes); + + __ASSERT_DEBUG(IsValid(aHuffman,aNumCodes),User::Panic(KCat,EHuffmanInvalidCoding)); + } + +/** Validate a Huffman encoding + + This verifies that a Huffman coding described by the code lengths is valid. + In particular, it ensures that no code exceeds the maximum length and + that it is possible to generate a canonical coding for the specified lengths. + + @param aHuffman The table of code lengths as generated by Huffman::HuffmanL() + @param aNumCodes The number of codes in the table + + @return True if the code is valid, otherwise false +*/ +EXPORT_C TBool Huffman::IsValid(const TUint32 aHuffman[],TInt aNumCodes) + { + // The code is valid if one of the following holds: + // (a) the code exactly fills the 'code space' + // (b) there is only a single symbol with code length 1 + // (c) there are no encoded symbols + // + TUint remain=1<aHuffman;) + { + TInt len=*--p; + if (len>0) + { + totlen+=len; + if (len>KMaxCodeLength) + return EFalse; + TUint c=1<<(KMaxCodeLength-len); + if (c>remain) + return EFalse; + remain-=c; + } + } + + return remain==0 || totlen<=1; + } + +/** Create a canonical Huffman encoding table + + This generates the huffman codes used by TBitOutput::HuffmanL() to write huffman + encoded data. The input is table of code lengths, as generated by Huffman::HuffmanL() + and must represent a valid huffman code. + + @param aHuffman The table of code lengths as generated by Huffman::HuffmanL() + @param aNumCodes The number of codes in the table + @param aEncodeTable The table for the output huffman codes. This must be + the same size as the code-length table, and can safely be the same table + + @panic "USER ???" If the provided code is not a valid Huffman coding + + @see IsValid() + @see HuffmanL() +*/ +EXPORT_C void Huffman::Encoding(const TUint32 aHuffman[],TInt aNumCodes,TUint32 aEncodeTable[]) + { + __ASSERT_ALWAYS(IsValid(aHuffman,aNumCodes),User::Panic(KCat,EHuffmanInvalidCoding)); + + TFixedArray lenCount; + lenCount.Reset(); + + TInt ii; + for (ii=0;ii=0) + ++lenCount[len]; + } + + TFixedArray nextCode; + TUint code=0; + for (ii=0;ii0) + { + EncodeRunLengthL(aOutput,(aLength-1)>>1); + aOutput.HuffmanL(HuffmanEncoding[1-(aLength&1)]); + } + } + +/** Store a canonical huffman encoding in compact form + + As the encoding is canonical, only the code lengths of each code needs to be saved. + + Due to the nature of code length tables, these can usually be stored very compactly + by encoding the encoding itself, hence the use of the bit output stream. + + @param aOutput The output stream for the encoding + @param aHuffman The table of code lengths as generated by Huffman::HuffmanL() + @param aNumCodes The number of huffman codes in the table + + @leave TBitOutput::HuffmanL() +*/ +EXPORT_C void Huffman::ExternalizeL(TBitOutput& aOutput,const TUint32 aHuffman[],TInt aNumCodes) + { + // We assume that the code length table is generated by the huffman generator, + // in which case the maxmimum code length is 27 bits. + // + // We apply three transformations to the data: + // 1. the data goes through a move-to-front coder + // 2. apply a rle-0 coder which replace runs of '0' with streams of '0a' and '0b' + // 3. encode the result using a predefined (average) huffman coding + // + // This can be done in a single pass over the data, avoiding the need for additional + // memory. + // + // initialise the list for the MTF coder + TFixedArray list; + TInt i; + for (i=0;i0) + list[j+1]=list[j]; + list[1]=TUint8(last); + last=c; + } + } + // encod any remaining run-length + EncodeRunLengthL(aOutput,rl); + } + + +/** Construct a bit stream output object + + Following construction the bit stream is ready for writing bits, but will first call + OverflowL() as the output buffer is 'full'. A derived class can detect this state as + Ptr() will return null. +*/ +EXPORT_C TBitOutput::TBitOutput() + :iCode(0),iBits(-8),iPtr(0),iEnd(0) + {} + +/** Construct a bit stream output object over a buffer + + Data will be written to the buffer until it is full, at which point OverflowL() will + be called. This should handle the data and then can Set() again to reset the buffer + for further output. + + @param aBuf The buffer for output + @param aSize The size of the buffer in bytes +*/ +EXPORT_C TBitOutput::TBitOutput(TUint8* aBuf,TInt aSize) + :iCode(0),iBits(-8),iPtr(aBuf),iEnd(aBuf+aSize) + {} + +/** Write a huffman code + + This expects a huffman code value as generated by Huffman::Encoding() + + @param aHuffCode The huffman code write to the stream + + @leave OverflowL() If the output buffer is full, OverflowL() is called +*/ +EXPORT_C void TBitOutput::HuffmanL(TUint aHuffCode) + { + DoWriteL(aHuffCode<<(32-Huffman::KMaxCodeLength),aHuffCode>>Huffman::KMaxCodeLength); + } + +/** Write an arbitrary integer value + + Write an unsigned integer using the number of bits specified. Only + the low order bits of the value are written to the output, most + significant bit first. + + @param aValue The value to write to the stream + @param aLength The number of bits to output + + @leave OverflowL() If the output buffer is full, OverflowL() is called +*/ +EXPORT_C void TBitOutput::WriteL(TUint aValue,TInt aLength) + { + if (aLength) + DoWriteL(aValue<<=32-aLength,aLength); + } + +/** Pad the bitstream to the next byte boundary + + Terminate the bitstream by padding the last byte with the requested value. + Following this operation the bitstream can continue to be used, the data will + start at the next byte. + + @param aPadding The bit value to pad the final byte with + + @leave OverflowL() If the output buffer is full, OverflowL() is called +*/ +EXPORT_C void TBitOutput::PadL(TUint aPadding) + { + if (iBits>-8) + WriteL(aPadding?0xffffffffu:0,-iBits); + } + +/** Write the higher order bits to the stream + + @internalComponent +*/ +void TBitOutput::DoWriteL(TUint aBits,TInt aSize) + { + if (aSize>25) + { + // cannot process >25 bits in a single pass + // so do the top 8 bits first + ASSERT(aSize<=32); + DoWriteL(aBits&0xff000000u,8); + aBits<<=8; + aSize-=8; + } + + TInt bits=iBits; + TUint code=iCode|(aBits>>(bits+8)); + bits+=aSize; + if (bits>=0) + { + TUint8* p=iPtr; + do + { + if (p==iEnd) + { + // run out of buffer space so invoke the overflow handler + iPtr=p; + OverflowL(); + p=iPtr; + ASSERT(p!=iEnd); + } + *p++=TUint8(code>>24); + code<<=8; + bits-=8; + } while (bits>=0); + iPtr=p; + } + iCode=code; + iBits=bits; + } + +/** Handle a full output buffer + + This virtual function is called when the output buffer is full. It should deal + with the data in the buffer before reseting the buffer using Set(), allowing + further data to be written. + + A derived class can replace this to write the data to a file (for example) + before marking the buffer as empty. + + @leave KErrOverflow The default implementation leaves +*/ +void TBitOutput::OverflowL() + { + User::Leave(KErrOverflow); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_exec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_exec.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,6664 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_exec.cpp +// +// + +#include "us_std.h" +#include "us_data.h" +#include +#include +#include +#include "compareimp.h" + +#ifdef __VC32__ + #pragma setlocale("english") +#endif + +#ifdef __TOOLS2__ +#include + +extern TInt gAllocCount; +extern TInt gAllocFailRate; +extern RAllocator::TAllocFail gAllocFailType; + +#endif + +_LIT(KLitSpace, " "); +_LIT(KLitOpeningBracket, "("); +_LIT(KLitMinusSign, "-"); +_LIT(KLitZeroPad, "0"); + +// Private use area ranges of printable/non-printable characters. +// This is a sorted list of numbers indicating the ranges in which characters +// are printable and non-printable. The elements 0, 2, 4... are the first +// characters of printable ranges and The elements 1, 3, 5... are the first +// characters of non-printable ranges +// We will assume that anything in the End User Sub-area is printable. +static const TInt PUAPrintableRanges[] = + { + 0xE000, 0xF6D9, // End user area + unassigned corporate use area + 0xF6DB, 0xF6DC, // Replacement for character not in font + 0xF6DE, 0xF700, // various EIKON and Agenda symbols + 0x10000, KMaxTInt // everything else printable + }; + +static TBool IsPUAPrintable(TInt aChar) + { + if (0x110000 <= aChar) + return 0; // non-characters not printable + TInt i = 0; + while (PUAPrintableRanges[i] <= aChar) + ++i; + return i & 1; + } + + + +#ifndef __TOOLS2__ +EXPORT_C TBool User::JustInTime() +/** +Tests whether just-in-time debugging is on or off. + +The function is used by the Kernel, on the Emulator, to decide whether to do +just-in-time debugging for panics. The function applies to the current process. + +Unless overridden by calling User::SetJustInTime(EFalse), just-in-time debugging +is on by default. + +@return True, if just-in-time debugging is on. False otherwise. +@see RProcess::JustInTime +*/ + { + + return RProcess().JustInTime(); + } + + + + +EXPORT_C void User::SetJustInTime(const TBool aBoolean) +/** +Sets just-in-time debugging for this process on or off. + +While the function can be called by code running on both the Emulator and ARM, +it only has an effect on the Emulator. Turning just-in-time debugging off +prevents the debug Emulator closing down when a panic occurs. + +By default, just-in-time debugging is on. + +Note that the emulator handles panics in the nomal manner, i.e. by killing +the thread. + +@param aBoolean ETrue, if just-in-time debugging is to be set on. EFalse, + if just-in-time debugging is to be set off. + EFalse causes _asm 3 calls to be disabled. +@see RProcess::SetJustInTime +*/ + { + + RProcess().SetJustInTime(aBoolean); + } +#endif // __TOOLS2__ + +extern const LCharSet* GetLocaleDefaultCharSet(); +extern const LCharSet* GetLocalePreferredCharSet(); + +// Convert to folded. +EXPORT_C TUint User::Fold(TUint aChar) +/** +@deprecated + +Folds the specified character. + +Folding converts the character to a form which can be used in tolerant +comparisons without control over the operations performed. Tolerant comparisons +are those which ignore character differences like case and accents. + +The result of folding a character depends on the locale and on whether this +is a UNICODE build or not. + +Note that for a non-UNICODE build, if the binary value of the character aChar +is greater than or equal to 0x100, then the character returned is the same as +the character passed to the function. + +@param aChar The character to be folded. + +@return The folded character. + +@see TChar::Fold() +*/ + { + // ASCII chars excluding 'i's can be handled by naive folding + if (aChar < 0x80 && aChar != 'I') + return (aChar >= 'A' && aChar <= 'Z') ? (aChar | 0x0020) : aChar; + else + return TUnicode(aChar).Fold(TChar::EFoldStandard,GetLocaleCharSet()->iCharDataSet); + } + + + + +// Convert to a folded version, specifying the folding methods. +EXPORT_C TUint User::Fold(TUint aChar,TInt aFlags) +/** +Folds the character according to a specified folding method. + +@param aChar The character to be folded. +@param aFlags A set of flags defining the folding method. They are: + + TChar::EFoldCase, convert characters to their lower case form, + if any; + + TChar::EFoldAccents, strip accents; + + TChar::EFoldDigits, convert digits representing values 0..9 to + characters '0'..'9'; + + TChar::EFoldSpaces, convert all spaces (ordinary, fixed-width, + ideographic, etc.) to ' '; + + TChar::EFoldKana, convert hiragana to katakana; + + TChar::EFoldWidth, fold full width and half width variants to + their standard forms; + + TChar::EFoldAll, use all of the above folding methods. + +@return The folded character. +@see TChar::Fold() +*/ + { + return TUnicode(aChar).Fold(aFlags,GetLocaleCharSet()->iCharDataSet); + } + + + + +// Convert to collated. +EXPORT_C TUint User::Collate(TUint aChar) +/** +Converts the character to its collated form. + +Collating is the process of removing differences between characters that are +deemed unimportant for the purposes of ordering characters. The result of +the conversion depends on the locale and on whether this is a UNICODE build +or not. + +Note that for a non UNICODE build, if the binary value of the character aChar +is greater than or equal to 0x100, then the character returned is the same as +the character passed to the function. + +@param aChar The character to be folded. + +@return The converted character. +*/ + { + return TUnicode(aChar).Fold(TChar::EFoldStandard,GetLocaleCharSet()->iCharDataSet); + } + + + + +// Convert to lower case. +EXPORT_C TUint User::LowerCase(TUint aChar) +/** +Converts the specified character to lower case. + +The result of the conversion depends on the locale and on whether this is +a UNICODE build or not. + +Note that for a non-UNICODE build, if the binary value of the character +aChar is greater than or equal to 0x100, then the character returned is +the same as the character passed to the function. + +@param aChar The character to be converted to lower case. + +@return The lower case character. +*/ + { + // ASCII chars excluding 'i's can be handled by naive folding + if (aChar < 0x80 && aChar != 'I') + return (aChar >= 'A' && aChar <= 'Z') ? (aChar | 0x0020) : aChar; + else + return TUnicode(aChar).GetLowerCase(GetLocaleCharSet()->iCharDataSet); + } + + + + +// Convert to upper case. +EXPORT_C TUint User::UpperCase(TUint aChar) +/** +Converts a specified character to upper case. + +The result of the conversion depends on the locale and on whether this is +a UNICODE build or not. + +Note that for a non UNICODE build, if the binary value of the character aChar +is greater than or equal to 0x100, then the character returned is the same as +the character passed to the function. + +@param aChar The character to be converted to upper case. + +@return The upper case character. +*/ + { + // ASCII chars excluding 'i's can be handled by naive folding + if (aChar < 0x80 && aChar != 'i') + return (aChar >= 'a' && aChar <= 'z') ? (aChar & ~0x0020) : aChar; + else + return TUnicode(aChar).GetUpperCase(GetLocaleCharSet()->iCharDataSet); + } + + + + +// Return the title case version of a character, which is the case of composite characters like Dz. +EXPORT_C TUint User::TitleCase(TUint aChar) +/** +Converts a specified character to its title case version. + +@param aChar The character to be converted. + +@return The converted character. +*/ + { + return TUnicode(aChar).GetTitleCase(GetLocaleCharSet()->iCharDataSet); + } + + + + +EXPORT_C TUint TChar::GetUpperCase() const +/** +Gets the character value after conversion to uppercase or the character's +own value, if no uppercase form exists. + +The character object itself is not changed. + +@return The character value after conversion to uppercase. +*/ + { + return User::UpperCase(iChar); + } + + + + +EXPORT_C TUint TChar::GetLowerCase() const +/** +Gets the character value after conversion to lowercase or the character's +own value, if no lowercase form exists. + +The character object itself is not changed. + +@return The character value after conversion to lowercase. +*/ + { + return User::LowerCase(iChar); + } + + + + +EXPORT_C TUint TChar::GetTitleCase() const +/** +Gets the character value after conversion to titlecase or the character's +own value, if no titlecase form exists. + +The titlecase form of a character is identical to its uppercase form unless +a specific titlecase form exists. + +@return The value of the character value after conversion to titlecase form. +*/ + { + return User::TitleCase(iChar); + } + + + + +EXPORT_C TBool TChar::IsLower() const +/** +Tests whether the character is lowercase. + +@return True, if the character is lowercase; false, otherwise. +*/ + { + return GetCategory() == TChar::ELlCategory; + } + + + + +EXPORT_C TBool TChar::IsUpper() const +/** +Tests whether the character is uppercase. + +@return True, if the character is uppercase; false, otherwise. +*/ + { + return GetCategory() == TChar::ELuCategory; + } + + + +// Return TRUE if the character is title case, which is the case of composite characters like Dz. +EXPORT_C TBool TChar::IsTitle() const +/** +Tests whether this character is in titlecase. + +@return True, if this character is in titlecase; false, otherwise. +*/ + { + return GetCategory() == TChar::ELtCategory; + } + + + + +EXPORT_C TBool TChar::IsAlpha() const +/** +Tests whether the character is alphabetic. + +For Unicode, the function returns TRUE for all letters, including those from +syllabaries and ideographic scripts. The function returns FALSE for letter-like +characters that are in fact diacritics. Specifically, the function returns +TRUE for categories: ELuCategory, ELtCategory, ELlCategory, and ELoCategory; +it returns FALSE for all other categories including ELmCategory. + +@return True, if the character is alphabetic; false, otherwise. + +@see TChar::IsAlphaDigit() +@see TChar::TCategory +*/ + { + return GetCategory() <= TChar::EMaxLetterOrLetterModifierCategory; + } + + + + +EXPORT_C TBool TChar::IsDigit() const +/** +Tests whether the character is a standard decimal digit. + +For Unicode, this function returns TRUE only +for the digits '0'...'9' (U+0030...U+0039), +not for other digits in scripts like Arabic, Tamil, etc. + +@return True, if the character is a standard decimal digit; false, otherwise. + +@see TChar::GetCategory() +@see TChar::GetNumericValue +*/ + { + return iChar >= '0' && iChar <= '9'; // standard decimal digits only + } + + + + +EXPORT_C TBool TChar::IsAlphaDigit() const +/** +Tests whether the character is alphabetic or a decimal digit. + +It is identical to (IsAlpha()||IsDigit()). + +@return True, if the character is alphabetic or a decimal digit; false, otherwise. + +@see TChar::IsAlpha() +@see TChar::IsDigit() +*/ + { + TInt cat = (TInt)GetCategory(); + return cat <= TChar::EMaxLetterOrLetterModifierCategory || + (iChar < 256 && cat == TChar::ENdCategory); // accept any letter, but accept only standard digits + } + + + + +EXPORT_C TBool TChar::IsHexDigit() const +/** +Tests whether the character is a hexadecimal digit (0-9, a-f, A-F). + +@return True, if the character is a hexadecimal digit; false, otherwise. +*/ + { + /* + The following code will actually run faster than the non-Unicode version, which needs + to call the Exec function. + */ + return iChar <= 'f' && iChar >= '0' && + (iChar <= '9' || iChar >= 'a' || (iChar >= 'A' && iChar <= 'F')); // only standard hex digits will do + } + + + + +EXPORT_C TBool TChar::IsSpace() const +/** +Tests whether the character is a white space character. + +White space includes spaces, tabs and separators. + +For Unicode, the function returns TRUE for all characters in the categories: +EZsCategory, EZlCategory and EZpCategory, and also for the characters 0x0009 +(horizontal tab), 0x000A (linefeed), 0x000B (vertical tab), 0x000C (form feed), +and 0x000D (carriage return). + +@return True, if the character is white space; false, otherwise. + +@see TChar::TCategory +*/ + { + /* + The Unicode characters 0009 .. 000D (tab, linefeed, vertical tab, formfeed, carriage return) + have the category Cc (control); however, we want to avoid breaking traditional programs + by getting IsSpace() to return TRUE for them. + */ + return (iChar <= 0x000D && iChar >= 0x0009) || + (GetCategory() & 0xF0) == TChar::ESeparatorGroup; + } + + + + +EXPORT_C TBool TChar::IsPunctuation() const +/** +Tests whether the character is a punctuation character. + +For Unicode, punctuation characters are any character in the categories: +EPcCategory, EPdCategory, EPsCategory, EPeCategory, EPiCategory, +EPfCategory, EPoCategory. + +@return True, if the character is punctuation; false, otherwise. + +@see TChar::TCategory +*/ + { + return (GetCategory() & 0xF0) == TChar::EPunctuationGroup; + } + + + + +EXPORT_C TBool TChar::IsGraph() const +/** +Tests whether the character is a graphic character. + +For Unicode, graphic characters include printable characters but not the space +character. Specifically, graphic characters are any character except those +in categories: EZsCategory,EZlCategory,EZpCategory, ECcCategory,ECfCategory, +ECsCategory, ECoCategory, and ,ECnCategory. + +Note that for ISO Latin-1, all alphanumeric and punctuation characters are +graphic. + +@return True, if the character is a graphic character; false, otherwise. + +@see TChar::TCategory +*/ + { + TUint type = TUnicode(iChar).GetCategory(0); + return type <= TChar::EMaxGraphicCategory || + (type == TChar::ECoCategory && IsPUAPrintable(iChar)); + } + + + + +EXPORT_C TBool TChar::IsPrint() const +/** +Tests whether the character is a printable character. + +For Unicode, printable characters are any character except those in categories: +ECcCategory, ECfCategory, ECsCategory, ECoCategory and ECnCategory. + +Note that for ISO Latin-1, all alphanumeric and punctuation characters, plus +space, are printable. + +@return True, if the character is printable; false, otherwise. + +@see TChar::TCategory +*/ + { + TUint type = TUnicode(iChar).GetCategory(0); + return type <= TChar::EMaxPrintableCategory || + (type == TChar::ECoCategory && IsPUAPrintable(iChar)); + } + + + + +EXPORT_C TBool TChar::IsControl() const +/** +Tests whether the character is a control character. + +For Unicode, the function returns TRUE for all characters in the categories: +ECcCategory, ECfCategory, ECsCategory, ECoCategory and ECnCategoryCc. + +@return True, if the character is a control character; false, otherwise. + +@see TChar::TCategory +*/ + { + return GetCategory() == TChar::ECcCategory; + } + + + + +EXPORT_C TBool TChar::IsAssigned() const +/** +Tests whether this character has an assigned meaning in the Unicode encoding. + +All characters outside the range 0x0000 - 0xFFFF are unassigned and there +are also many unassigned characters within the Unicode range. + +Locales can change the assigned/unassigned status of characters. This means +that the precise behaviour of this function is locale-dependent. + +@return True, if this character has an assigned meaning; false, otherwise. +*/ + { + return GetCategory() <= TChar::EMaxAssignedCategory; + } + + + + +EXPORT_C void TChar::GetInfo(TCharInfo& aInfo) const +/** +Gets this character;s standard category information. + +This includes everything except its CJK width and decomposition, if any. + +@param aInfo On return, contains the character's standard category information. +*/ + { + TUnicode(iChar).GetInfo(aInfo,GetLocaleCharSet()->iCharDataSet); + } + + + + +EXPORT_C TChar::TCategory TChar::GetCategory() const +/** +Gets this character's Unicode category. + +@return This character's Unicode category. +*/ + { + //for unicode non private user area just use the default charset + if (iChar>=0xE000 && iChar<=0xF8FF) + return TUnicode(iChar).GetCategory(GetLocaleCharSet()->iCharDataSet); + else + return TUnicode(iChar).GetCategory(GetLocaleDefaultCharSet()->iCharDataSet); + } + + + + +EXPORT_C TChar::TBdCategory TChar::GetBdCategory() const +/** +Gets the bi-directional category of a character. + +For more information on the bi-directional algorithm, see Unicode Technical +Report No. 9 available at: http://www.unicode.org/unicode/reports/tr9/. + +@return The character's bi-directional category. +*/ + { + return TUnicode(iChar).GetBdCategory(GetLocaleCharSet()->iCharDataSet); + } + + + + +EXPORT_C TInt TChar::GetCombiningClass() const +/** +Gets this character's combining class. + +Note that diacritics and other combining characters have non-zero combining +classes. + +@return The combining class. +*/ + { + //for unicode non private user area just use the default charset + if (iChar>=0xE000 && iChar<=0xF8FF) + return TUnicode(iChar).GetCombiningClass(GetLocaleCharSet()->iCharDataSet); + else + return TUnicode(iChar).GetCombiningClass(GetLocaleDefaultCharSet()->iCharDataSet); + } + + + + +EXPORT_C TBool TChar::IsMirrored() const +/** +Tests whether this character has the mirrored property. + +Mirrored characters, like ( ) [ ] < >, change direction according to the +directionality of the surrounding characters. For example, an opening +parenthesis 'faces right' in Hebrew or Arabic, and to say that 2 < 3 you would +have to say that 3 > 2, where the '>' is, in this example, a less-than sign to +be read right-to-left. + +@return True, if this character has the mirrored property; false, otherwise. +*/ + { + return TUnicode(iChar).IsMirrored(GetLocaleCharSet()->iCharDataSet); + } + + + + +EXPORT_C TInt TChar::GetNumericValue() const +/** +Gets the integer numeric value of this character. + +Numeric values need not be in the range 0..9; the Unicode character set +includes various other numeric characters such as the Roman and Tamil numerals +for 500, 1000, etc. + +@return The numeric value: -1 if the character has no integer numeric + value,-2 if the character has a fractional numeric value. +*/ + { + return TUnicode(iChar).GetNumericValue(GetLocaleCharSet()->iCharDataSet); + } + + + + +EXPORT_C TChar::TCjkWidth TChar::GetCjkWidth() const +/** +Gets the Chinese, Japanese, Korean (CJK) notional width. + +Some display systems used in East Asia display characters on a grid of +fixed-width character cells like the standard MSDOS display mode. + +Some characters, e.g. the Japanese katakana syllabary, take up a single +character cell and some characters, e.g., kanji, Chinese characters used in +Japanese, take up two. These are called half-width and full-width characters. +This property is fixed and cannot be overridden for particular locales. + +For more information on returned widths, see Unicode Technical Report 11 on +East Asian Width available at: http://www.unicode.org/unicode/reports/tr11/ + +@return The notional width of an east Asian character. +*/ + { + return TUnicode(iChar).GetCjkWidth(); + } + + + + +/** +Composes a string of Unicode characters to produce a single character result. + +For example, 0061 ('a') and 030A (combining ring above) compose to give 00E5 +('a' with ring above). + +A canonical decomposition is a relationship between a string of characters - +usually a base character and one or more diacritics - and a composed character. +The Unicode standard requires that compliant software treats composed +characters identically with their canonical decompositions. The mappings used +by these functions are fixed and cannot be overridden for particular locales. + +@param aResult If successful, the composed character value. If unsuccessful, + this value contains 0xFFFF. +@param aSource String of source Unicode characters. + +@return True, if the compose operation is successful in combining the entire + sequence of characters in the descriptor into a single compound + character; false, otherwise. +*/ + +EXPORT_C TBool TChar::Compose(TUint& aResult,const TDesC16& aSource) + { + aResult = 0xFFFF; + if(aSource.Length() > 0) + { + TChar combined; + if(::CombineAsMuchAsPossible(aSource, combined) == aSource.Length()) + { + aResult = (TUint)combined; + return ETrue; + } + } + return EFalse; + } + + + + +/** +Maps this character to its maximal canonical decomposition. + +For example, 01E1 ('a' with dot above and macron) decomposes into 0061 ('a') +0307 (dot) and 0304 (macron). + +Note that this function is used during collation, as performed by +the Mem::CompareC() function, to convert the compared strings to their maximal +canonical decompositions. + +@param aResult If successful, the descriptor represents the canonical decomposition + of this character. If unsuccessful, the descriptor is empty. + +@return True if decomposition is successful; false, otherwise. + +@see Mem::CompareC() +@see TChar::Compose() +*/ +EXPORT_C TBool TChar::Decompose(TPtrC16& aResult) const + { + return ::DecomposeChar(iChar, aResult); + } + + + +#ifndef __TOOLS2__ +EXPORT_C TInt TFindChunk::Next(TFullName &aResult) +/** +Finds the full name of the next chunk which matches the match pattern. + +@param aResult A reference to a TBuf descriptor with a defined maximum length. + If a matching chunk is found, its full name is set into + this descriptor. + If no matching chunk is found, the descriptor length is set + to zero. + +@return KErrNone, if a matching chunk is found; + KErrNotFound otherwise. +*/ + { + return NextObject(aResult,EChunk); + } + + + + + +EXPORT_C TUint8 * RChunk::Base() const +/** +Gets a pointer to the base of the chunk's reserved region. + +@return A pointer to the base of the chunk's reserved region. +*/ + { + + return(Exec::ChunkBase(iHandle)); + } + + + + +EXPORT_C TInt RChunk::Size() const +/** +Gets the current size of this chunk's committed region. + +@return The size of the chunk's committed region. +*/ + { + + return(Exec::ChunkSize(iHandle)); + } + + + + +EXPORT_C TInt RChunk::Bottom() const +/** +Gets the offset of the bottom of the double ended chunk's committed region +from the base of the chunk's reserved region. + +Note that the lowest valid address in a double ended chunk is the sum of the +base of the chunk's reserved region plus the value of Bottom(). + +@return The offset of the bottom of the chunk's committed region from the + base of the chunk's reserved region. +*/ + { + + return(Exec::ChunkBottom(iHandle)); + } + + + + +EXPORT_C TInt RChunk::Top() const +/** +Gets the offset of the top of the double ended chunk's committed region +from the base of the chunk's reserved region. + +Note that the highest valid address in a double ended chunk is the the sum +of the base of the chunk's reserved region plus the value of Top() - 1. + +@return The offset of the top of the chunk's committed region from the base + of the chunk's reserved region. +*/ + { + + return(Exec::ChunkTop(iHandle)); + } + + + + +EXPORT_C TInt RChunk::MaxSize() const +/** +Gets the maximum size of this chunk. + +This maximum size of this chunk is set when the chunk is created. + +@return The maximum size of this chunk. +*/ + { + + return(Exec::ChunkMaxSize(iHandle)); + } + + + +/** +Finds the full name of the next LDD factory object which matches the match pattern. + +@param aResult A reference to a TBuf descriptor with a defined maximum length. + If a matching LDD factory object is found, its full name is set into + this descriptor. + If no matching LDD factory object is found, the descriptor length is set + to zero. + +@return KErrNone, if a matching LDD factory object is found; + KErrNotFound otherwise. +*/ +EXPORT_C TInt TFindLogicalDevice::Next(TFullName &aResult) + { + return NextObject(aResult,ELogicalDevice); + } + +/** +Finds the full name of the next PDD factory object which matches the match pattern. + +@param aResult A reference to a TBuf descriptor with a defined maximum length. + If a matching PDD factory object is found, its full name is set into + this descriptor. + If no matching PDD factory object is found, the descriptor length is set + to zero. + +@return KErrNone, if a matching PDD factory object is found; + KErrNotFound otherwise. +*/ +EXPORT_C TInt TFindPhysicalDevice::Next(TFullName &aResult) + { + return NextObject(aResult,EPhysicalDevice); + } + +/** +Gets the device capabilities. + +@param aDes A descriptor into which capability's information is to be written. +*/ +EXPORT_C void RDevice::GetCaps(TDes8 &aDes) const + { + + Exec::LogicalDeviceGetCaps(iHandle,aDes); + } + +/** +Checks if a device supports a particular version. + +@param aVer The requested device version. + +@return ETrue if supported, EFalse if not. +*/ +EXPORT_C TBool RDevice::QueryVersionSupported(const TVersion &aVer) const + { + + return(Exec::LogicalDeviceQueryVersionSupported(iHandle,aVer)); + } + +/** +Checks if a specified unit number, additional info and a specific PDD is supported. + +@param aUnit The requested unit number. +@param aPhysicalDevice The requested PDD name. +@param anInfo The additional information. + +@return ETrue if supported, EFalse if not. +*/ +EXPORT_C TBool RDevice::IsAvailable(TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo) const + { + TInt r; + if(aPhysicalDevice) + { + TBuf8 physicalDevice; + physicalDevice.Copy(*aPhysicalDevice); + r = Exec::LogicalDeviceIsAvailable(iHandle,aUnit,(TDesC8*)&physicalDevice,anInfo); + } + else + r = Exec::LogicalDeviceIsAvailable(iHandle,aUnit,(TDesC8*)NULL,anInfo); + + return r; + } + + +/** +Queues an asynchronous request for the device driver, taking no parameters. + +The request is handled on the kernel-side by the logical channel's +DLogicalChannelBase::Request(). + +Outstanding requests can be cancelled by calling DoCancel(). + +@param aReqNo A number identifying the request to the logical channel. +@param aStatus The request status object for this request. +*/ +EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus) + { + + TAny *a[2]; + a[0]=NULL; + a[1]=NULL; + aStatus=KRequestPending; + Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]); + } + + + + +/** +Queues an asynchronous request for the device driver, taking one parameter. + +The request is handled on the kernel-side by the logical channel's +DLogicalChannelBase::Request(). + +Outstanding requests can be cancelled by calling DoCancel(). + +@param aReqNo A number identifying the request to the logical channel. +@param aStatus The request status object for this request. +@param a1 A 32-bit value passed to the kernel-side. Its meaning depends + on the device driver requirements. +*/ +EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus,TAny *a1) + { + + TAny *a[2]; + a[0]=a1; + a[1]=NULL; + aStatus=KRequestPending; + Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]); + } + + + + +/** +Queues an asynchronous request for the device driver, taking two parameters. + +The request is handled on the kernel-side by the logical channel's +DLogicalChannelBase::Request(). + +Outstanding requests can be cancelled by calling DoCancel(). + +@param aReqNo A number identifying the request to the logical channel. +@param aStatus The request status object for this request. +@param a1 A 32-bit value passed to the kernel-side. Its meaning depends + on the device driver requirements. +@param a2 A 32-bit value passed to the kernel-side. Its meaning depends + on the device driver requirements. +*/ +EXPORT_C void RBusLogicalChannel::DoRequest(TInt aReqNo,TRequestStatus &aStatus,TAny *a1,TAny *a2) + { + + TAny *a[2]; + a[0]=a1; + a[1]=a2; + aStatus=KRequestPending; + Exec::ChannelRequest(iHandle,~aReqNo,&aStatus,&a[0]); + } + + + + +/** +Cancels one or more outstanding asynchronous requests. + +All outstanding requests complete with KErrCancel. + +@param aRequestMask A set of bits identifying the requests to be cancelled. + Each bit can be used to identify a separate outstanding + request. It is up to the driver to define how the bits map + to those outstanding requests. +*/ +EXPORT_C void RBusLogicalChannel::DoCancel(TUint aRequestMask) + { + + Exec::ChannelRequest(iHandle,KMaxTInt,(TAny*)aRequestMask,0); + } + + + + +/** +Makes a synchronous request to the device driver, taking no parameters. + +This function does not return until the request has completed, successfully +or otherwise. + +@param aFunction A number identifying the request. + +@return KErrNone, if successful; otherwise one of the other system-wide + error codes. + The value returned depends on the implementation of the device driver. +*/ +EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction) + { + + return Exec::ChannelRequest(iHandle,aFunction,NULL,NULL); + } + + + + +/** +Makes a synchronous request to the device driver, taking one parameter. + +This function does not return until the request has completed, successfully +or otherwise. + +@param aFunction A number identifying the request. +@param a1 A 32-bit value passed to the kernel-side. Its meaning depends + on the device driver requirements. + +@return KErrNone, if successful; otherwise one of the other system-wide + error codes. + The value returned depends on the implementation of the device driver. +*/ +EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction,TAny *a1) + { + + return Exec::ChannelRequest(iHandle,aFunction,a1,NULL); + } + + + + +/** +Makes a synchronous request to the device driver, taking two parameters. + +This function does not return until the request has completed, successfully +or otherwise. + +@param aFunction A number identifying the request. +@param a1 A 32-bit value passed to the kernel-side. Its meaning depends + on the device driver requirements. +@param a2 A 32-bit value passed to the kernel-side. Its meaning depends + on the device driver requirements. + +@return KErrNone, if successful; otherwise one of the other system-wide + error codes. + The value returned depends on the implementation of the device driver. +*/ +EXPORT_C TInt RBusLogicalChannel::DoControl(TInt aFunction,TAny *a1,TAny *a2) + { + + return Exec::ChannelRequest(iHandle,aFunction,a1,a2); + } + + + + +EXPORT_C void User::WaitForAnyRequest() +/** +Waits for any asynchronous request to complete. + +The current thread waits on its request semaphore. + +The function completes, and control returns to the caller when the current +thread's request semaphore is signalled by any of the service providers which +handle these asynchronous requests. + +The request status of all outstanding asynchronous requests must be examined +to determine which request is complete. + +@see TRequestStatus +*/ + { + + Exec::WaitForAnyRequest(); + } +#endif // __TOOLS2__ + + + +EXPORT_C void User::WaitForRequest(TRequestStatus &aStatus) +/** +Waits for a specific asynchronous request to complete. + +The current thread waits on its request semaphore. + +The function completes and control returns to the caller when the current +thread's request semaphore is signalled by the service provider handling the +request associated with aStatus. Before signalling, the service provider sets +an appropriate value in aStatus, other than KRequestPending. + +Note that if other asynchronous requests complete before the one associated +with aStatus, the request semaphore is adjusted so that knowledge of their +completion is not lost. In this a case, a subsequent call to +User::WaitForAnyRequest() or User::WaitForRequest() will complete and return +immediately. + +@param aStatus A reference to the request status object associated with the + specific asynchronous request. + +@see KRequestPending +*/ + { +#ifndef __TOOLS2__ + TInt i=(-1); + do + { + i++; + Exec::WaitForAnyRequest(); + } while (aStatus==KRequestPending); + if (i) + Exec::RequestSignal(i); +#else + // There's been no need to implement an active scheduler yet for TOOLS2 +#endif // __TOOLS2__ + } + + + +#ifndef __TOOLS2__ +EXPORT_C void User::WaitForRequest(TRequestStatus &aStatus1,TRequestStatus &aStatus2) +/** +Waits for either of two specific asynchronous requests to complete. + +The current thread waits on its request semaphore. + +The function completes and control returns to the caller when the current +thread's request semaphore is signalled by either the service provider handling +the request associated with aStatus1 or the service provider handling the +request associated with aStatus2. Before signalling, the completing service +provider sets an appropriate value in the status object, other +than KRequestPending. + +Note that if other asynchronous requests complete before the ones associated +with aStatus1 and aStatus2, the request semaphore is adjusted so that knowledge +of their completion is not lost. In this a case, a subsequent call to +User::WaitForAnyRequest() or User::WaitForRequest() will complete and return +immediately. + +@param aStatus1 A reference to the request status object associated with the + first specific asynchronous request. +@param aStatus2 A reference to the request status object associated with the + second specific asynchronous request. + +@see KRequestPending +*/ + { + + TInt i=(-1); + do + { + i++; + Exec::WaitForAnyRequest(); + } while (aStatus1==KRequestPending && aStatus2==KRequestPending); + if (i) + Exec::RequestSignal(i); + } + + + + +EXPORT_C void User::WaitForNRequest(TRequestStatus * aStatusArray[], TInt aNum) +/** + Waits for any one of specific asynchronous requests to complete. + +The current thread waits on its request semaphore. + +The function completes and control returns to the caller when the current +thread's request semaphore is signalled by either the service provider handling +the request associated with aStatus1 or the service provider handling the +request associated with aStatus2. Before signalling, the completing service +provider sets an appropriate value in the status object, other +than KRequestPending. + +Note that if other asynchronous requests complete before the ones associated +with aStatusArray the request semaphore is adjusted so that knowledge +of their completion is not lost. In this a case, a subsequent call to +User::WaitForAnyRequest() or User::WaitForRequest() will complete and return +immediately. +@param aStatArray[] A reference to the request status object associated with the + first specific asynchronous request. +@param TInt aNum +*/ + { + TRequestStatus* aptr; + TBool m = ETrue; + TInt i = (-1); + do + { + i++; + Exec::WaitForAnyRequest(); + for(TInt j = 0; jInt()!= KRequestPending) + { + m = EFalse; + break; + } + } + } + }while(m); + if(i) + Exec::RequestSignal(i); + } + + + + +EXPORT_C TInt TFindLibrary::Next(TFullName &aResult) +/** +Finds the next DLL whose full name matches the match pattern. + +If a DLL with a matching name is found, the function copies the full name of +the DLL into the descriptor aResult. + +@param aResult A buffer for the fullname of the DLL. This is a template + specialisation of TBuf defining a modifiable buffer descriptor + taking a maximum length of KMaxFullName. + If no matching DLL is found, the descriptor length is + set to zero. + +@return KErrNone, if a matching DLL is found; + KErrNotFound, otherwise. +*/ + { + return NextObject(aResult,ELibrary); + } + + + + +EXPORT_C TLibraryFunction RLibrary::Lookup(TInt anOrdinal) const +/** +Gets a pointer to the function at the specified ordinal within this DLL. + +@param anOrdinal The ordinal of the required function in this DLL. + This value must be positive. + +@return A pointer to the function at position anOrdinal in this DLL. + The value is NULL if there is no function at that ordinal. + +@panic USER 116 if anOrdinal is negative +*/ + { + __ASSERT_ALWAYS(anOrdinal>=0,Panic(EBadLookupOrdinal)); + return (Exec::LibraryLookup(iHandle,anOrdinal)); + } + + + +EXPORT_C TFileName RLibrary::FileName() const +/** +Gets the name of the DLL's file. + +@return The DLL's filname. +*/ + { + + TFileName n; + TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFileName, KMaxFileName); + Exec::LibraryFileName(iHandle,n8); + n.Copy(n8); + return(n); + } + + + + +EXPORT_C TUidType RLibrary::Type() const +/** +Gets this DLL's UID type. + +The UID type is a property of a Symbian OS file; for a DLL, its value is set +during the building of that DLL. + +@return The UID type of this DLL. Note that the first TUid component of + the TUidType has the value KDynamicLibraryUid. +*/ + { + + TUidType u; + Exec::LibraryType(iHandle,u); + return(u); + } + + + + +EXPORT_C TInt RLibrary::GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize) +/** +Gets the current size of the code and the const data for this DLL. + +This function can be called on a RAM loaded DLL or a ROM based DLL. + +@param aCodeSize The current size of the code for a RAM loaded DLL. + This is zero for a ROM based DLL. + +@param aConstDataSize The current size of the const data for a RAM loaded DLL. + This is zero for a ROM based DLL. + +@return KErrNone if successful, otherwise one of the system-wide error codes. +*/ + { + TModuleMemoryInfo info; + TInt r=Exec::LibraryGetMemoryInfo(iHandle,info); + if (r==KErrNone) + { + aCodeSize=info.iCodeSize; + aConstDataSize=info.iConstDataSize; + } + return r; + } + + + + +/** +Sets the home time to a specified time value. + +@param aTime A reference to a time representation object containing the time + value. + +@return KErrNone if successful or one of the system-wide error codes. + +@deprecated Set the time using User::SetUTCTime if the UTC time is known; + otherwise, use the timezone server to set the time. + +@capability WriteDeviceData +*/ +EXPORT_C TInt User::SetHomeTime(const TTime &aTime) + { + return(Exec::SetUTCTimeAndOffset(aTime.Int64(),0,ETimeSetTime|ETimeSetLocalTime,0)); + } + +/** +Sets the secure home time to a specified time value. + +@param aTime A reference to a time representation object containing the + secure time value. + +@return KErrNone if successful or one of the system-wide error codes. + +@capability TCB +@capability WriteDeviceData +*/ +EXPORT_C TInt User::SetHomeTimeSecure(const TTime &aTime) + { + return(Exec::SetUTCTimeAndOffset(aTime.Int64(),0,ETimeSetTime|ETimeSetLocalTime|ETimeSetSecure,0)); + } + + + +/** +Sets the UTC time to a specified time value. + +@param aUTCTime A reference to a time representation object containing the time + value. + +@return KErrNone if successful or one of the system-wide error codes. + +@capability WriteDeviceData +*/ +EXPORT_C TInt User::SetUTCTime(const TTime &aUTCTime) + { + return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),0,ETimeSetTime,0)); + } + +/** +Sets the secure UTC time to a specified time value. + +@param aUTCTime A reference to a time representation object containing the secure time + value. + +@return KErrNone if successful or one of the system-wide error codes. + +@capability TCB +@capability WriteDeviceData +*/ +EXPORT_C TInt User::SetUTCTimeSecure(const TTime &aUTCTime) + { + return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),0,ETimeSetTime|ETimeSetSecure,0)); + } + +/** +Gets the UTC offset - the difference between UTC and the current local time +due to any time zones and daylight savings time that may be in effect. A positive +offset indicates a time ahead of UTC, a negative offset indicates a time behind UTC. + +@return The UTC offset, in seconds. +*/ +EXPORT_C TTimeIntervalSeconds User::UTCOffset() + { + return(TTimeIntervalSeconds(Exec::UTCOffset())); + } + + +/** +Sets the UTC offset to the given number of seconds. This should include both time +zone differences and the effect of any applicable daylight savings time. +A positive offset indicates a time ahead of UTC, a negative offset indicates a time +behind UTC. + +@param aOffset The UTC offset, in seconds. + +@capability WriteDeviceData +*/ +EXPORT_C void User::SetUTCOffset(TTimeIntervalSeconds aOffset) + { + Exec::SetUTCTimeAndOffset(0,aOffset.Int(),ETimeSetOffset,0); + } + + +/** +Sets the UTC time and UTC offset to the specified values, atomically. This is equivalent +to calling both SetUTCTime and SetUTCOffset, but without the possibility of an incorrect +time being observed between the two calls. If the operation is not successful, an error +code will be returned and both the time and offset will be left unchanged. + +@param aUTCTime A reference to a time representation object containing the time + value. +@param aOffset The UTC offset, in seconds. + +@return KErrNone if successful or one of the system-wide error codes. + +@capability WriteDeviceData +*/ +EXPORT_C TInt User::SetUTCTimeAndOffset(const TTime &aUTCTime, TTimeIntervalSeconds aOffset) + { + return(Exec::SetUTCTimeAndOffset(aUTCTime.Int64(),aOffset.Int(),ETimeSetTime|ETimeSetOffset,0)); + } +#endif // __TOOLS2__ + +/** +Gets the current tick count. + +The period between ticks is usually 1/64 second, but may be hardware dependent. + +@return The machine dependent tick count. +*/ +EXPORT_C TUint User::TickCount() + { + + return(Exec::TickCount()); + } + + + +#ifndef __TOOLS2__ + +EXPORT_C TTimeIntervalSeconds User::InactivityTime() +/** +Gets the time since the last user activity. + +@return The time interval. +*/ + { + + return TTimeIntervalSeconds(Exec::UserInactivityTime()); + } + + + + +/** +Resets all user inactivity timers. +*/ +EXPORT_C void User::ResetInactivityTime() + { + Exec::ResetInactivityTime(); + } +#endif // __TOOLS2__ + + + +/** +Gets the nanokernel tick count. + +This is the current value of the machine's millisecond tick counter. + +On the emulator the resolution defaults to 5 milliseconds; however +you can change it to N milliseconds when you launch the emulator +from the command line by specifying -Dtimerresolution=N as a parameter +to epoc.exe, for example: +@code +epoc.exe -Dtimerresolution=3 +@endcode + +On most hardware the resolution is about 1 millisecond. + +You can get the nanokernel tick period in microseconds by calling +into the Hardware Abstraction Layer: + +@code +TInt nanokernel_tick_period; +HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period); +@endcode + +@return The nanokernel tick count. +*/ +EXPORT_C TUint32 User::NTickCount() + { + + return Exec::NTickCount(); + } + + + +#ifndef __TOOLS2__ + +/** +Gets the fast counter. + +This is the current value of the machine's high resolution timer. If a high +resolution timer is not available, it uses the millisecond timer instead. + +The freqency of this counter can be determined by reading the HAL attribute +EFastCounterFrequency. + +@return The fast counter value. +*/ +EXPORT_C TUint32 User::FastCounter() + { + + return Exec::FastCounter(); + } + + + + +EXPORT_C TTimerLockSpec User::LockPeriod() +/** +Returns which of the periods the clock is currently in. + +@return The fraction of a second at which the timer completes. +*/ + { + + return(Exec::LockPeriod()); + } + + + + +EXPORT_C TName RHandleBase::Name() const +/** +Gets the name of the handle. + +@return The name of the handle. +*/ + { + + TName n; + TPtr8 n8(((TUint8*)n.Ptr()) + KMaxName, KMaxName); + Exec::HandleName(iHandle,n8); + n.Copy(n8); + return(n); + } + + + + +EXPORT_C TFullName RHandleBase::FullName() const +/** +Gets the full name of the handle. + +Note: This method is stack consuming (it takes 512 bytes on stack to execute). +For an alternative way to obtain the full name of the object, see RHandleBase::FullName(TDes& aName) const. + +@see RHandleBase::FullName(TDes& aName) const +@return The full name of the handle. +*/ + { + + TFullName n; + TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFullName, KMaxFullName); + Exec::HandleFullName(iHandle,n8); + n.Copy(n8); + return(n); + } + + + + +EXPORT_C void RHandleBase::FullName(TDes& aName) const +/** +Gets the full name of the handle. + +@param aName On return, contains the full name of the handle. + +@panic KERN-EXEC 35, If full name of the handler is longer that the maximum length of aName descriptor. + To avoid this, the maximum length of aName should be at least KMaxFullName. +@see KMaxFullName +*/ + { + + // Kernel will copy string in n8, whose data lives in the upper half of aName desciptor data + TPtr8 n8(((TUint8*)aName.Ptr()) + aName.MaxLength(), aName.MaxLength()); + Exec::HandleFullName(iHandle,n8); + aName.Copy(n8); // Expands 8bit descriptor into 16bit unicode descriptor. + } + + + + +EXPORT_C void RHandleBase::HandleInfo(THandleInfo* anInfo) +/** +Gets information about the handle. + +@param anInfo A pointer to a THandleInfo object supplied by the caller; + on return, contains the handle information. +*/ + { + + Exec::HandleInfo(iHandle,anInfo); + } + +EXPORT_C TInt RHandleBase::BTraceId() const +/** +Returns a unique object identifier for use with BTrace +*/ + { + return Exec::GetBTraceId(iHandle); + } + + + +EXPORT_C TUint RHandleBase::Attributes() const +// +// Get handle attributes +// + { + + return Exec::HandleAttributes(iHandle); + } +#endif // __TOOLS2__ + + + +EXPORT_C TInt User::AllocLen(const TAny *aCell) +/** +Gets the length of the specified allocated heap cell. + +The cell is assumed to be in the current thread's heap. + +@param aCell A pointer to the allocated cell whose length + is to be fetched. + +@return The length of the allocated cell. +*/ + { +#ifndef __TOOLS2__ + return(GetHeap()->AllocLen(aCell)); +#else + TUint8* p = ((TUint8*)aCell) - sizeof(TInt); + return *((TInt*)p); +#endif // __TOOLS2__ + } + + + + +EXPORT_C TAny* User::Alloc(TInt aSize) +/** +Allocates a cell of specified size from the current thread's heap. + +If there is insufficient memory available on the heap from which to allocate a cell +of the required size, the function returns NULL. + +The resulting size of the allocated cell may be rounded up to a value greater +than aSize, but is guaranteed to be not less than aSize. + +@param aSize The size of the cell to be allocated from the current thread's + heap. + +@return A pointer to the allocated cell. NULL, if there is insufficient memory + available. + +@panic USER 47, if the maximum unsigned value of aSize is greater + than or equal to KMaxTInt/2. For example, + calling Alloc(-1) raises this panic. +*/ + { +#ifndef __TOOLS2__ + return(GetHeap()->Alloc(aSize)); +#else +#ifdef _DEBUG + // Simulate heap failure + gAllocCount++; + switch (gAllocFailType) + { + case RAllocator::EFailNext: + if (gAllocCount == gAllocFailRate) + return NULL; + break; + case RAllocator::EDeterministic: + if (gAllocCount % gAllocFailRate == 0) + return NULL; + break; + default: + break; + } +#endif // _DEBUG + TUint8* p = (TUint8*)malloc(aSize + sizeof(TInt)); + if ( p == NULL ) { + return NULL; + } + *((TInt*)p) = aSize; + return p + sizeof(TInt); +#endif // __TOOLS2__ + } + + + + +EXPORT_C TAny* User::AllocL(TInt aSize) +/** +Allocates a cell of specified size from the current thread's heap, and leaves +if there is insufficient memory in the heap. + +The resulting size of the allocated cell may be rounded up to a value greater +than aSize, but is guaranteed to be not less than aSize. + +@param aSize The size of the cell to be allocated from the current thread's + heap. + +@return A pointer to the allocated cell. + +@panic USER 47, if the maximum unsigned value of aSize is greater + than or equal to KMaxTInt/2. For example, + calling Alloc(-1) raises this panic. +*/ + { +#ifndef __TOOLS2__ + return(GetHeap()->AllocL(aSize)); +#else + TAny* p = User::Alloc(aSize); + if (!p) + User::LeaveNoMemory(); + return p; +#endif // __TOOLS2__ + } + + + + +EXPORT_C TAny *User::AllocLC(TInt aSize) +/** +Allocates a cell of specified size from the current thread's default heap, and, +if successful, places a pointer to the cell onto the cleanup stack. + +The function leaves if there is insufficient memory in the heap. + +The resulting size of the allocated cell may be rounded up to a value greater +than aSize, but is guaranteed to be not less than aSize. + +@param aSize The size of the cell to be allocated from the current thread's + default heap. + +@return A pointer to the allocated cell. + +@panic USER 47, if the maximum unsigned value of aSize is greater + than or equal to KMaxTInt/2. For example, + calling Alloc(-1) raises this panic. +*/ + { +#ifndef __TOOLS2__ + return(GetHeap()->AllocLC(aSize)); +#else + TAny* p = User::AllocL(aSize); + CleanupStack::PushL(p); + return p; +#endif // __TOOLS2__ + } + + + + +EXPORT_C TAny* User::AllocZ(TInt aSize) +/** +Allocates a cell of specified size from the current thread's default heap, +and clears it to binary zeroes. + +If there is insufficient memory available on the heap from which to allocate a cell +of the required size, the function returns NULL. + +The resulting size of the allocated cell may be rounded up to a value greater +than aSize, but is guaranteed to be not less than aSize. + +@param aSize The size of the cell to be allocated from the current thread's + default heap. + +@return A pointer to the allocated cell. NULL, if there is insufficient memory + available. + +@panic USER 47, if the maximum unsigned value of aSize is greater + than or equal to KMaxTInt/2. For example, + calling Alloc(-1) raises this panic. +*/ + { +#ifndef __TOOLS2__ + return GetHeap()->AllocZ(aSize); +#else + TAny* p = User::Alloc(aSize); + if (p) + memset(p, '\0', aSize); + return p; +#endif // __TOOLS2__ + } + + + + +EXPORT_C TAny* User::AllocZL(TInt aSize) +/** +Allocates a cell of specified size from the current thread's default heap, +clears it to binary zeroes, and leaves if there is insufficient memory in +the heap. + +The resulting size of the allocated cell may be rounded up to a value greater +than aSize, but is guaranteed to be not less than aSize. + +@param aSize The size of the cell to be allocated from the current thread's + heap. + +@return A pointer to the allocated cell. + +@panic USER 47, if the maximum unsigned value of aSize is greater + than or equal to KMaxTInt/2. For example, + calling Alloc(-1) raises this panic. +*/ + { +#ifndef __TOOLS2__ + return GetHeap()->AllocZL(aSize); +#else + TAny* p = User::AllocZ(aSize); + if (!p) + User::LeaveNoMemory(); + return p; +#endif // __TOOLS2__ + } + + + +EXPORT_C TInt User::Available(TInt &aBiggestBlock) +/** +Gets the total free space currently available on the current thread's +default heap, and the space available in the largest free block. + +The space available represents the total space which can be allocated. + +Note that compressing the heap may reduce the total free space available and the space +available in the largest free block. + +@param aBiggestBlock On return, contains the space available in the largest + free block on the current thread's default heap. + +@return The total free space currently available on the current thread's heap. +*/ + { +#ifndef __TOOLS2__ + return(GetHeap()->Available(aBiggestBlock)); +#else + aBiggestBlock = 0x100000; + return 0x40000000; +#endif // __TOOLS2__ + } + + + +#ifndef __TOOLS2__ +EXPORT_C void User::Check() +/** +Checks the validity of the current thread's default heap. + +The function walks through the list of allocated cells and the list of free +cells checking that the heap is consistent and complete. + +@panic USER 47 if any corruption is found, specifically a bad allocated + heap cell size. +@panic USER 48 if any corruption is found, specifically a bad allocated + heap cell address. +@panic USER 49 if any corruption is found, specifically a bad free heap + cell address. +*/ + { + + GetHeap()->Check(); + } +#endif // __TOOLS2__ + + + +EXPORT_C void User::Free(TAny *aCell) +/** +Frees the specified cell and returns it to the current thread's default heap. + +@param aCell A pointer to a valid cell to be freed. If NULL this function + call will be ignored. + +@panic USER 42, if aCell is not NULL and does not point to a valid cell. +*/ + { +#ifndef __TOOLS2__ + if (aCell) + GetHeap()->Free(aCell); +#else + if (aCell) + { + TUint8* p = ((TUint8*)aCell) - sizeof(TInt); + free(p); + } +#endif // __TOOLS2__ + } + + + + +EXPORT_C void User::FreeZ(TAny * &aCell) +/** +Frees the specified cell, returns it to the current thread's default heap, and resets +the pointer to NULL. + +@param aCell A reference to a pointer to a valid cell to be freed. If NULL + this function call will be ignored. + +@panic USER 42, if aCell is not NULL and does not point to a valid cell. +*/ + { +#ifndef __TOOLS2__ + if (aCell) + GetHeap()->FreeZ(aCell); +#else + User::Free(aCell); + aCell = NULL; +#endif // __TOOLS2__ + } + + + + +EXPORT_C TAny* User::ReAlloc(TAny* aCell, TInt aSize, TInt aMode) +/** +Increases or decreases the size of an existing cell in the current +thread's heap. + +If the cell is being decreased in size, then it is guaranteed not to move, +and the function returns the pointer originally passed in aCell. Note that the +length of the cell will be the same if the difference between the old size +and the new size is smaller than the minimum cell size. + +If the cell is being increased in size, i.e. aSize is bigger than its +current size, then the function tries to grow the cell in place. +If successful, then the function returns the pointer originally +passed in aCell. If unsuccessful, then: +-# if the cell cannot be moved, i.e. aMode has the ENeverMove bit set, then + the function returns NULL. +-# if the cell can be moved, i.e. aMode does not have the ENeverMove bit set, + then the function tries to allocate a new replacement cell, and, if + successful, returns a pointer to the new cell; if unsuccessful, it + returns NULL. + +Note that in debug mode, the function returns NULL if the cell cannot be grown +in place, regardless of whether the ENeverMove bit is set. + +If the reallocated cell is at a different location from the original cell, then +the content of the original cell is copied to the reallocated cell. + +If the supplied pointer, aCell is NULL, then the function attempts to allocate +a new cell, but only if the cell can be moved, i.e. aMode does not have +the ENeverMove bit set. + +Note the following general points: +- If reallocation fails, the content of the original cell is preserved. +- The resulting size of the re-allocated cell may be rounded up to a value + greater than aSize, but is guaranteed to be not less than aSize. + +@param aCell A pointer to the cell to be reallocated. This may be NULL. + +@param aSize The new size of the cell. This may be bigger or smaller than the + size of the original cell. The value can also be zero, but this is + interpreted as a request for a cell of minimum size; the net + effect is the same as if the caller had explicitly requested + a cell of minimum size. + Note that the minimum size of a heap cell is device dependent. + +@param aMode Flags controlling the reallocation. The only bit which has any + effect on this function is that defined by the enumeration + ENeverMove of the enum RAllocator::TReAllocMode. + If this is set, then any successful reallocation guarantees not + to have changed the start address of the cell. + By default, this parameter is zero. + +@return A pointer to the reallocated cell. This may be the same as the original + pointer supplied through aCell. NULL if there is insufficient memory to + reallocate the cell, or to grow it in place. + +@panic USER 42, if aCell is not NULL, and does not point to a valid cell. +@panic USER 47, if the maximum unsigned value of aSize is greater + than or equal to KMaxTInt/2. For example, + calling ReAlloc(someptr,-1) raises this panic. + +@see RAllocator::TReAllocMode +*/ + { +#ifndef __TOOLS2__ + return GetHeap()->ReAlloc(aCell, aSize, aMode); +#else + if (!aCell) + return User::Alloc(aSize); + else + { +#ifdef _DEBUG + // Simulate heap failure + gAllocCount++; + switch (gAllocFailType) + { + case RAllocator::EFailNext: + if (gAllocCount == gAllocFailRate) + return NULL; + break; + case RAllocator::EDeterministic: + if (gAllocCount % gAllocFailRate == 0) + return NULL; + break; + default: + break; + } +#endif // _DEBUG + TUint8* o = ((TUint8*)aCell) - sizeof(TInt); + TUint8* n = (TUint8*)realloc(o, aSize + sizeof(TInt)); + if (n) + { + *((TInt*)n) = aSize; + return n + sizeof(TInt); + } + } + return NULL; +#endif // __TOOLS2__ + } + + + + +EXPORT_C TAny* User::ReAllocL(TAny* aCell, TInt aSize, TInt aMode) +/** +Increases or decreases the size of an existing cell, and leaves +if there is insufficient memory in the current thread's default heap. + +If the cell is being decreased in size, then it is guaranteed not to move, +and the function returns the pointer originally passed in aCell. Note that the +length of the cell will be the same if the difference between the old size +and the new size is smaller than the minimum cell size. + +If the cell is being increased in size, i.e. aSize is bigger than its +current size, then the function tries to grow the cell in place. +If successful, then the function returns the pointer originally +passed in aCell. If unsuccessful, then: +-# if the cell cannot be moved, i.e. aMode has the ENeverMove bit set, then + the function leaves. +-# if the cell can be moved, i.e. aMode does not have the ENeverMove bit set, + then the function tries to allocate a new replacement cell, and, if + successful, returns a pointer to the new cell; if unsuccessful, it + leaves. + +Note that in debug mode, the function leaves if the cell cannot be grown +in place, regardless of whether the ENeverMove bit is set. + +If the reallocated cell is at a different location from the original cell, then +the content of the original cell is copied to the reallocated cell. + +If the supplied pointer, aCell is NULL, then the function attempts to allocate +a new cell, but only if the cell can be moved, i.e. aMode does not have +the ENeverMove bit set. + +Note the following general points: +- If reallocation fails, the content of the original cell is preserved. +- The resulting size of the re-allocated cell may be rounded up to a value + greater than aSize, but is guaranteed to be not less than aSize. + +@param aCell A pointer to the cell to be reallocated. This may be NULL. + +@param aSize The new size of the cell. This may be bigger or smaller than the + size of the original cell. The value can also be zero, but this is + interpreted as a request for a cell of minimum size; the net + effect is the same as if the caller had explicitly requested + a cell of minimum size. + Note that the minimum size of a heap cell is device dependent. + +@param aMode Flags controlling the reallocation. The only bit which has any + effect on this function is that defined by the enumeration + ENeverMove of the enum RAllocator::TReAllocMode. + If this is set, then any successful reallocation guarantees not + to have changed the start address of the cell. + By default, this parameter is zero. + +@return A pointer to the reallocated cell. This may be the same as the original + pointer supplied through aCell. + +@panic USER 42, if aCell is not NULL, and does not point to a valid cell. +@panic USER 47, if the maximum unsigned value of aSize is greater + than or equal to KMaxTInt/2. For example, + calling ReAlloc(someptr,-1) raises this panic. + +@see RAllocator::TReAllocMode +*/ + { +#ifndef __TOOLS2__ + return GetHeap()->ReAllocL(aCell, aSize, aMode); +#else + TAny* p = ReAlloc(aCell, aSize, aMode); + if (!p) + User::LeaveNoMemory(); + return p; +#endif // __TOOLS2__ + } + + + +#ifndef __TOOLS2__ +EXPORT_C RAllocator& User::Allocator() +/** +Gets the current thread's default current heap. + +@return The current heap. +*/ + { + + return *GetHeap(); + } + + + + +EXPORT_C TInt User::AllocSize(TInt &aTotalAllocSize) +/** +Gets the total number of cells allocated on the current thread's default heap, +and the total space allocated to them. + +@param aTotalAllocSize On return, contains the total space allocated to + the cells. + +@return The number of cells currently allocated on the current thread's heap. +*/ + { + + return(GetHeap()->AllocSize(aTotalAllocSize)); + } + + + + +EXPORT_C TInt User::CountAllocCells() +/** +Gets the total number of cells allocated on the current thread's default heap. + + +@return The number of cells allocated on the current thread's default user heap. +*/ + { + return(GetHeap()->Count()); + } + + + + +EXPORT_C TInt User::CountAllocCells(TInt &aFreeCount) +/** +Gets the the total number of cells allocated, and the number of free cells, +on the current thread's default heap. + +@param aFreeCount On return, contains the number of free cells + on the current thread's default heap. + +@return The number of cells allocated on the current thread's default heap. +*/ + { + + return(GetHeap()->Count(aFreeCount)); + } + + + + +EXPORT_C RAllocator* User::SwitchAllocator(RAllocator* aA) +/** +Changes the current thread's heap. + +@param aA A pointer to the new heap handle. + +@return A pointer to the old heap handle. +*/ + { + +#ifdef __USERSIDE_THREAD_DATA__ + // Just cache the pointer user-side. We still need to let the kernel know what's going on so + // the heap can be cleaned up correctly later. + LocalThreadData()->iHeap=aA; +#endif + return Exec::HeapSwitch(aA); + } +#endif // __TOOLS2__ + +// The suffix table +const TText16* const __DefaultDateSuffixTable[KMaxSuffixes] = + { + _S16("st"),_S16("nd"),_S16("rd"),_S16("th"),_S16("th"), + _S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"), + _S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"), + _S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"), + _S16("st"),_S16("nd"),_S16("rd"),_S16("th"),_S16("th"), + _S16("th"),_S16("th"),_S16("th"),_S16("th"),_S16("th"), + _S16("st") + }; + +// The day names +const TText16* const __DefaultDayTable[KMaxDays] = + { + _S16("Monday"), + _S16("Tuesday"), + _S16("Wednesday"), + _S16("Thursday"), + _S16("Friday"), + _S16("Saturday"), + _S16("Sunday") + }; + +// The abbreviated day names +const TText16* const __DefaultDayAbbTable[KMaxDays] = + { + _S16("Mon"), + _S16("Tue"), + _S16("Wed"), + _S16("Thu"), + _S16("Fri"), + _S16("Sat"), + _S16("Sun") + }; + +// The month names +const TText16* const __DefaultMonthTable[KMaxMonths] = + { + _S16("January"), + _S16("February"), + _S16("March"), + _S16("April"), + _S16("May"), + _S16("June"), + _S16("July"), + _S16("August"), + _S16("September"), + _S16("October"), + _S16("November"), + _S16("December") + }; + +// The abbreviated month names +const TText16* const __DefaultMonthAbbTable[KMaxMonths] = + { + _S16("Jan"), + _S16("Feb"), + _S16("Mar"), + _S16("Apr"), + _S16("May"), + _S16("Jun"), + _S16("Jul"), + _S16("Aug"), + _S16("Sep"), + _S16("Oct"), + _S16("Nov"), + _S16("Dec") + }; + +// The am/pm strings +const TText16* const __DefaultAmPmTable[KMaxAmPms] = + { + _S16("am"), + _S16("pm") + }; + +const TText16* const __DefaultLMsgTable[ELocaleMessages_LastMsg] = + { +// Fileserver + _S16("Retry"), // Button 1 + _S16("Stop"), // Button 2 + _S16("Put the disk back"), // Put the card back - line1 + _S16("or data will be lost"), // Put the card back - line2 + _S16("Batteries too low"), // Low power - line1 + _S16("Cannot complete write to disk"), // Low power - line2 + _S16("Disk error - cannot complete write"), // Disk error - line1 + _S16("Retry or data will be lost"), // Disk error - line2 +// SoundDriver + _S16("Chimes"), // Chimes + _S16("Rings"), // Rings + _S16("Signal"), // Signal +// MediaDriver diskname (max 16 chars) + _S16("Internal"), // Internal + _S16("External(01)"), // External(01) + _S16("External(02)"), // External(02) + _S16("External(03)"), // External(03) + _S16("External(04)"), // External(04) + _S16("External(05)"), // External(05) + _S16("External(06)"), // External(06) + _S16("External(07)"), // External(07) + _S16("External(08)"), // External(08) +// MediaDriver socketname (max 16 chars) + _S16("Socket(01)"), // Socket(01) + _S16("Socket(02)"), // Socket(02) + _S16("Socket(03)"), // Socket(03) + _S16("Socket(04)") // Socket(04) + }; + +#ifdef __TOOLS2__ +TPckgBuf gLocale; +// gLocale.iLocale set, does not guarantee gLocale's other members are loaded. +TBool gLocaleSet = EFalse; +// gLocale set, all members of gLoacle loaded except iLocale, which is not guaranteed loaded or not. +TBool gLocaleExSet = EFalse; +#endif + +LOCAL_C void LocaleLanguageGet(SLocaleLanguage& locale) + { +#ifndef __TOOLS2__ + TPckg localeLanguageBuf(locale); + TInt r = RProperty::Get(KUidSystemCategory, KLocaleLanguageKey, localeLanguageBuf); + __ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter)); +#else + TInt r = KErrNone; + if (gLocaleExSet) + { + SLocaleLanguage* languageSettings = gLocale().GetLanguageSettings(); + memcpy(&locale, (void*)languageSettings, sizeof(SLocaleLanguage)); + } + else + r = KErrNotFound; +#endif // __TOOLS2__ + + if(r == KErrNotFound) + { + locale.iLanguage = ELangEnglish; + locale.iDateSuffixTable = (const TText16*)__DefaultDateSuffixTable; + locale.iDayTable = (const TText16*)__DefaultDayTable; + locale.iDayAbbTable = (const TText16*)__DefaultDayAbbTable; + locale.iMonthTable = (const TText16*)__DefaultMonthTable; + locale.iMonthAbbTable = (const TText16*)__DefaultMonthAbbTable; + locale.iAmPmTable = (const TText16*)__DefaultAmPmTable; + locale.iMsgTable = (const TText16* const*)__DefaultLMsgTable; + } + } + +LOCAL_C void LocaleSettingsGet(SLocaleLocaleSettings& locale) + { +#ifndef __TOOLS2__ + TPckg localeSettingsBuf(locale); + TInt r = RProperty::Get(KUidSystemCategory, KLocaleDataExtraKey, localeSettingsBuf); + __ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter)); +#else + TInt r = KErrNone; + if (gLocaleExSet) + { + SLocaleLocaleSettings* extraSettings = gLocale().GetLocaleExtraSettings(); + memcpy(&locale, extraSettings, sizeof(SLocaleLocaleSettings)); + } + else + r = KErrNotFound; +#endif // __TOOLS2__ + + if(r == KErrNotFound) + { + Mem::Copy(&locale.iCurrencySymbol[0], _S16("\x00a3"), sizeof(TText16) << 2); + locale.iLocaleExtraSettingsDllPtr = NULL; + } + } + +LOCAL_C void LocaleTimeDateFormatGet(SLocaleTimeDateFormat& locale) + { +#ifndef __TOOLS2__ + TPckg localeTimeDateFormatBuf(locale); + TInt r = RProperty::Get(KUidSystemCategory, KLocaleTimeDateFormatKey, localeTimeDateFormatBuf); + __ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter)); +#else + TInt r = KErrNone; + if (gLocaleExSet) + { + SLocaleTimeDateFormat* timeDateFormat = gLocale().GetLocaleTimeDateFormat(); + memcpy(&locale, timeDateFormat, sizeof(SLocaleTimeDateFormat)); + } + else + r = KErrNotFound; +#endif // __TOOLS2__ + if(r == KErrNotFound) + { + Mem::Copy(&locale.iShortDateFormatSpec[0], _S16("%F%*D/%*M/%Y"), sizeof(TText16) * 13); + Mem::Copy(&locale.iLongDateFormatSpec[0], _S16("%F%*D%X %N %Y"), sizeof(TText16) * 14); + Mem::Copy(&locale.iTimeFormatSpec[0], _S16("%F%*I:%T:%S %*A"), sizeof(TText16) * 16); + locale.iLocaleTimeDateFormatDllPtr = NULL; + } + } + +EXPORT_C void TDayName::Set(TDay aDay) +/** +Re-retrieves the current locale's text for the specified day of the week. + +@param aDay Identifies the day of the week. + +@panic USER 184, if the specified day is outside the permitted range. +*/ + { + + __ASSERT_ALWAYS(aDay>=EMonday && aDay<=ESunday,Panic(EBadLocaleParameter)); + SLocaleLanguage localeLanguage; + LocaleLanguageGet(localeLanguage); + Copy((reinterpret_cast(localeLanguage.iDayTable))[aDay]); + } + + + + +EXPORT_C void TDayNameAbb::Set(TDay aDay) +/** +Re-retrieves the current locale's abbreviated text for the specified day of +the week. + +@param aDay Identifies the day of the week. + +@panic USER 184, if the specified day is outside the permitted range. +*/ + { + + __ASSERT_ALWAYS(aDay>=EMonday && aDay<=ESunday,Panic(EBadLocaleParameter)); + SLocaleLanguage localeLanguage; + LocaleLanguageGet(localeLanguage); + Copy((reinterpret_cast(localeLanguage.iDayAbbTable))[aDay]); + } + + + + +EXPORT_C void TMonthName::Set(TMonth aMonth) +/** +Re-retrieves the current locale's text for the specified month. + +@param aMonth Identifies the month. + +@panic USER 184, if the specified month is outside the permitted range. +*/ + { + + __ASSERT_ALWAYS(aMonth>=EJanuary && aMonth<=EDecember,Panic(EBadLocaleParameter)); + SLocaleLanguage localeLanguage; + LocaleLanguageGet(localeLanguage); + Copy((reinterpret_cast(localeLanguage.iMonthTable))[aMonth]); + } + + + + +EXPORT_C void TMonthNameAbb::Set(TMonth aMonth) +/** +Re-retrieves the current locale's abbreviated text for the specified month. + +@param aMonth Identifies the month. + +@panic USER 184, if the specified month is outside the permitted range. +*/ + { + + __ASSERT_ALWAYS(aMonth>=EJanuary && aMonth<=EDecember,Panic(EBadLocaleParameter)); + SLocaleLanguage localeLanguage; + LocaleLanguageGet(localeLanguage); + Copy((reinterpret_cast(localeLanguage.iMonthAbbTable))[aMonth]); + } + + + + +EXPORT_C void TDateSuffix::Set(TInt aSuffix) +/** +Re-retrieves the current locale's date suffix text for the specified day of +the month. + +@param aSuffix A value identifying the day of the month. The value can + range from 0 to 30 so that the first day of the month is + identified by 0, the second day by 1 etc. + +@panic USER 69, if aDateSuffix is outside the range 0 to 30. +*/ + { + + __ASSERT_ALWAYS(aSuffix>=0 && aSuffix(localeLanguage.iDateSuffixTable))[aSuffix]); + } + + + + +EXPORT_C void TAmPmName::Set(TAmPm aSelector) +/** +Re-retrieves the current locale's text for identifying time before or after +noon as identified by the specified selector. + +@param aSelector The am/pm selector. + +@panic USER 69, if aDateSuffix is outside the range 0 to 30. +*/ + { + + __ASSERT_ALWAYS(aSelector==EAm || aSelector==EPm,Panic(ETLoclSuffixOutOfRange)); + SLocaleLanguage localeLanguage; + LocaleLanguageGet(localeLanguage); + Copy((reinterpret_cast(localeLanguage.iAmPmTable))[aSelector]); + } + + + + +EXPORT_C void TCurrencySymbol::Set() +/** +Re-retrieves the current locale's currency symbol(s). +*/ + { + SLocaleLocaleSettings locale; + LocaleSettingsGet(locale); + Copy(&locale.iCurrencySymbol[0]); + } + + + + +EXPORT_C void TShortDateFormatSpec::Set() +/** +Sets the contents of the short date format specification from the system-wide +settings. +*/ + { + SLocaleTimeDateFormat locale; + LocaleTimeDateFormatGet(locale); + Copy(&locale.iShortDateFormatSpec[0]); + } + + + + +EXPORT_C void TLongDateFormatSpec::Set() +/** +Sets the contents of the long date format specification from the system-wide +settings. +*/ + { + SLocaleTimeDateFormat locale; + LocaleTimeDateFormatGet(locale); + Copy(&locale.iLongDateFormatSpec[0]); + } + + + + +EXPORT_C void TTimeFormatSpec::Set() +/** +Sets the contents of the time string format specification from the system-wide +settings. +*/ + { + SLocaleTimeDateFormat locale; + LocaleTimeDateFormatGet(locale); + Copy(&locale.iTimeFormatSpec[0]); + } + + + +EXPORT_C TInt User::SetCurrencySymbol(const TDesC& aSymbol) +/** +Sets the system wide currency symbol. + +On successful return from this function, a call to the Set() member function +of a TCurrencySymbol object fetches the new currency symbol. + +@capability WriteDeviceData + +@param aSymbol A reference to the descriptor containing the currency symbol + to be set. + +@return KErrNone if successful, otherwise one of the other system wide error codes. + +@panic USER 119, if the length of aSymbol is greater than KMaxCurrencySymbol. + +@see TCurrencySymbol +@see TCurrencySymbol::Set() +@see KMaxCurrencySymbol +*/ + { + + TExtendedLocale locale; + return locale.SetCurrencySymbol(aSymbol); + } + + + +EXPORT_C TLanguage User::Language() +/** +Gets the language of the current locale. + +@return One of the TLanguage enumerators identifying the language of the + current locale. +*/ + { + + SLocaleLanguage localeLanguage; + LocaleLanguageGet(localeLanguage); + return localeLanguage.iLanguage; + } + + + + +EXPORT_C TLocale::TLocale() +/** +Default constructor. + +It constructs the object with the system's locale settings. + +A single copy of the locale information is maintained by the system. This +copy may be refreshed under application control with TLocale::Refresh(), and +the settings may be saved to the system with TLocale::Set(). However, the +settings are never updated by the system apart from under application control. +This enables applications to guarantee that consistent locale information +is used. + +@see TLocale::Refresh() +@see TLocale::Set() +*/ + { + + Refresh(); + } + + +const TUint8 __DefaultDateSeparator[KMaxDateSeparators] = { 0, '/', '/', 0 }; +const TUint8 __DefaultTimeSeparator[KMaxTimeSeparators] = { 0, ':', ':', 0 }; + +void TLocale::SetDefaults() + { + iCountryCode = 44; + iUniversalTimeOffset = 0; + iDateFormat = EDateEuropean; + iTimeFormat = ETime12; + iCurrencySymbolPosition = ELocaleBefore; + iCurrencySpaceBetween = EFalse; + iCurrencyDecimalPlaces = 2; + iNegativeCurrencyFormat = TNegativeCurrencyFormat(EFalse); + iCurrencyTriadsAllowed = ETrue; + iThousandsSeparator = ','; + iDecimalSeparator = '.'; + TInt i=0; + for(; i localeDataBuf(*this); + TInt r = RProperty::Get(KUidSystemCategory, KLocaleDataKey, localeDataBuf); + __ASSERT_DEBUG(r == KErrNone || r == KErrNotFound, Panic(EBadLocaleParameter)); + if(r == KErrNone) + { + iUniversalTimeOffset = Exec::UTCOffset(); + iDaylightSaving = 0; + } + else if(r == KErrNotFound) + { + SetDefaults(); + } +#else + + if (gLocaleSet) + { + TLocale* loc = gLocale().GetLocale(); + memcpy(this, (void*)loc, sizeof(TLocale)); + } + else + { + SetDefaults(); + } + +#endif // __TOOLS2__ + } + + +EXPORT_C TInt TLocale::Set() const +/** +Transfers the locale settings from this object to the system. Note that +the timezone offset and daylight savings flags are ignored as setting these +through TLocale is no longer supported. + +After this function has been called, other applications may use the new +settings for newly-constructed TLocale objects, +or if they use TLocale::Refresh(), to refresh their settings from +the system copy. + +@capability WriteDeviceData + +@return KErrNone if successful, otherwise one of the other system wide error codes. + +@see TLocale::Refresh() +*/ + { +#ifndef __TOOLS2__ + TPckg localeDataBuf(*this); + TInt r = RProperty::Set(KUidSystemCategory, KLocaleDataKey, localeDataBuf); + if(r == KErrNone) + { + Exec::NotifyChanges(EChangesLocale); + } + return r; +#else + TLocale* loc = gLocale().GetLocale(); + memcpy((void*)loc, this, sizeof(TLocale)); + gLocaleSet = ETrue; + return KErrNone; +#endif + } + + +#ifdef __TOOLS2__ +RLoader gLocaleLoader; +#endif + +TInt TExtendedLocale::DoLoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList) + { +#ifndef __TOOLS2__ + RLoader loader; + TInt r = loader.LoadLocale(aLocaleDllName, aExportList); + return r; +#else + gLocaleLoader.Free(); + TInt r = gLocaleLoader.LoadLocale(aLocaleDllName, aExportList); + return r; +#endif + } + +void TExtendedLocale::DoUpdateLanguageSettings(TLibraryFunction* aExportList) + { + iLanguageSettings.iLanguage = (TLanguage)aExportList[FnLanguage](); + iLanguageSettings.iDateSuffixTable = (const TText*)aExportList[FnDateSuffixTable](); + iLanguageSettings.iDayTable = (const TText*)aExportList[FnDayTable](); + iLanguageSettings.iDayAbbTable = (const TText*)aExportList[FnDayAbbTable](); + iLanguageSettings.iMonthTable = (const TText*)aExportList[FnMonthTable](); + iLanguageSettings.iMonthAbbTable = (const TText*)aExportList[FnMonthAbbTable](); + iLanguageSettings.iAmPmTable = (const TText*)aExportList[FnAmPmTable](); + iLanguageSettings.iMsgTable = (const TText16* const*)aExportList[FnMsgTable](); + } + +void TExtendedLocale::DoUpdateLocaleSettings(TLibraryFunction* aExportList) + { + Mem::Copy(&iLocaleExtraSettings.iCurrencySymbol[0], (const TAny*)aExportList[FnCurrencySymbol](), sizeof(TText) * (KMaxCurrencySymbol+1)); + iLocaleExtraSettings.iLocaleExtraSettingsDllPtr = (TAny*)aExportList[FnDateSuffixTable](); + } + +void TExtendedLocale::DoUpdateTimeDateFormat(TLibraryFunction* aExportList) + { + Mem::Copy(&iLocaleTimeDateFormat.iShortDateFormatSpec[0], (const TAny*)aExportList[FnShortDateFormatSpec](), sizeof(TText) * (KMaxShortDateFormatSpec+1)); + Mem::Copy(&iLocaleTimeDateFormat.iLongDateFormatSpec[0], (const TAny*)aExportList[FnLongDateFormatSpec](), sizeof(TText) * (KMaxLongDateFormatSpec+1)) ; + Mem::Copy(&iLocaleTimeDateFormat.iTimeFormatSpec[0], (const TAny*)aExportList[FnTimeFormatSpec](), sizeof(TText) * (KMaxTimeFormatSpec+1)); + iLocaleTimeDateFormat.iLocaleTimeDateFormatDllPtr = (TAny*)aExportList[FnDateSuffixTable](); + } + +/** +Default constructor. + +It constructs an empty object + +This is an empty copy of TExtendedLocale. To get the system locale you can +use TExtendedLocale::LoadSystemSettings. The current settings may be saved to the system +with TLocale::SaveSystemSettings(). + +@see TExtendedLocale::LoadSystemSettings +@see TExtendedLocale::SaveSystemSettings +*/ +EXPORT_C TExtendedLocale::TExtendedLocale() + : iLocale(0) + { + Mem::FillZ(&iLanguageSettings, sizeof(TExtendedLocale) - sizeof(TLocale)); + } + +/** +Load system wide locale settings + +It initialises this TExtendedLocale with the system wide locale settings. +The settings stored in the TExtendedLocale are overwritten with the system +wide locale. + +@see TExtendedLocale::SaveSystemSettings +*/ +EXPORT_C void TExtendedLocale::LoadSystemSettings() + { + LocaleLanguageGet(iLanguageSettings); + LocaleSettingsGet(iLocaleExtraSettings); + LocaleTimeDateFormatGet(iLocaleTimeDateFormat); + iDefaultCharSet = GetLocaleCharSet(); + iPreferredCharSet = GetLocalePreferredCharSet(); + iLocale.Refresh(); + } + +#ifndef __TOOLS2__ +/** +Make the current locale information system wide + +It overwrites the system wide locale information with the locale information +stored in this TExtendedLocale. +This will generate a notification for system locale changes. +In case of an error, the locale might be in an unconsistent state. + +@capability WriteDeviceData + +@return KErrNone if successful, otherwise one of the other system wide error codes. +*/ +EXPORT_C TInt TExtendedLocale::SaveSystemSettings() + { + + TPckg localeLanguageBuf(iLanguageSettings); + TInt r = RProperty::Set(KUidSystemCategory, KLocaleLanguageKey, localeLanguageBuf); + if(r != KErrNone) + return r; + + TPckg localeSettingsBuf(iLocaleExtraSettings); + r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, localeSettingsBuf); + if(r != KErrNone) + return r; + + TPckg localeTimeDateFormatBuf(iLocaleTimeDateFormat); + r = RProperty::Set(KUidSystemCategory, KLocaleTimeDateFormatKey, localeTimeDateFormatBuf); + if(r != KErrNone) + return r; + + r = Exec::SetGlobalUserData(ELocaleDefaultCharSet, (TInt)iDefaultCharSet); + if(r != KErrNone) + return r; + + r = Exec::SetGlobalUserData(ELocalePreferredCharSet, (TInt)iPreferredCharSet); + + if(r == KErrNone) + { + iLocale.Set(); + } + + return r; + } +#endif // __TOOLS2__ + + +/** +Loads a locale Dll and get the locale information + +It loads a locale DLL and it initialises the contents of this TExtendedLocale +with the locale information stored in the DLL. The locale information is only +stored in this TExtendedLocale. If you want to set the system wide settings with +the locale information in the DLL, you can call TExtendedLocale::SaveSystemSettings +after calling this function. + +@param aLocaleDllName The name of the locale DLL to be loaded +@return KErrNone if successful, system wide error if not + +@see TExtendedLocale::SaveSystemSettings +*/ +EXPORT_C TInt TExtendedLocale::LoadLocale(const TDesC& aLocaleDllName) + { + TLibraryFunction data[KNumLocaleExports]; + TInt r = DoLoadLocale(aLocaleDllName, &data[0]); + if(r == KErrNone) + { + iLocale.iExtraNegativeCurrencyFormatFlags=0x80000000; + iLocale.iLanguageDowngrade[0] = ELangNone; + iLocale.iLanguageDowngrade[1] = ELangNone; + iLocale.iLanguageDowngrade[2] = ELangNone; + iLocale.iDigitType = EDigitTypeWestern; + + typedef void (*TLibFn)(TLocale*); + ((TLibFn)data[FnLocaleData])(&iLocale); + + //Locale daylightsavings unchanged - we have travelled through space, not time + if (iLocale.iExtraNegativeCurrencyFormatFlags&0x80000000) + iLocale.iExtraNegativeCurrencyFormatFlags=0; + + DoUpdateLanguageSettings(&data[0]); + DoUpdateLocaleSettings(&data[0]); + DoUpdateTimeDateFormat(&data[0]); + + iPreferredCharSet = (const LCharSet*)data[FnCharSet](); + iDefaultCharSet = iPreferredCharSet; + gLocaleSet = ETrue; + gLocaleExSet = ETrue; + } + return r; + } + +/** +Loads a DLL and get some locale information + +It loads the specified locale DLL and depending on the aAspectGroup it overwrites +locale information in this TExtendedLocale with the locale information stored in the +DLL. aAspectGroup is a bitmap of TLocaleAspect values specifying what to be overwritten. +The locale information is only stored in this TExtendedLocale. If you want to set the +system wide settings with the locale information in the DLL, you can call +TExtendedLocale::SaveSystemSettings after calling this function. + +@param aAspectGroup A bitmap of TLocaleAspect values specifying what to be overwritten in + this TExtendedLocale. (eg.: ELocaleLanguageSettings | ELocaleTimeDateSettings) +@param aLocaleDllName The name of the locale DLL to be loaded + +@return KErrNone if the method is successful, a system wide error code if not + +@see TLocaleAspect +@see TExtendedLocale::SaveSystemSettings +*/ +EXPORT_C TInt TExtendedLocale::LoadLocaleAspect(TUint aAspectGroup, const TDesC& aLocaleDllName) + { + TLibraryFunction data[KNumLocaleExports]; + TInt r = DoLoadLocale(aLocaleDllName, &data[0]); + if(r == KErrNone) + { + if(aAspectGroup & ELocaleLanguageSettings) + { + DoUpdateLanguageSettings(&data[0]); + } + if(aAspectGroup & ELocaleCollateSetting) + { + iPreferredCharSet = (const LCharSet*)data[FnCharSet](); + iDefaultCharSet = iPreferredCharSet; + } + if(aAspectGroup & ELocaleLocaleSettings) + { + DoUpdateLocaleSettings(&data[0]); + } + if(aAspectGroup & ELocaleTimeDateSettings) + { + DoUpdateTimeDateFormat(&data[0]); + } + } + return r; + } + +/** +Sets the currency symbol + +It sets the currency symbol. The maximum lenght for the currency symbol is +KMaxCurrencySymbol. Trying to pass a descriptor longer than that, will result +in a panic. + +@param aSymbol The new currency symbol + +@panic USER 119, if the length of aSymbol is greater than KMaxCurrencySymbol. + +@capability WriteDeviceData + +@return KErrNone if successful, otherwise one of the other system wide error codes. +*/ +EXPORT_C TInt TExtendedLocale::SetCurrencySymbol(const TDesC &aSymbol) + { + __ASSERT_ALWAYS(aSymbol.Length()<=KMaxCurrencySymbol,::Panic(ECurrencySymbolOverflow)); + + LocaleSettingsGet(iLocaleExtraSettings); + Mem::Copy(&iLocaleExtraSettings.iCurrencySymbol[0], aSymbol.Ptr(), aSymbol.Length() << 1); + iLocaleExtraSettings.iCurrencySymbol[aSymbol.Length()] = 0; +#ifndef __TOOLS2__ + TInt r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, TPckg(iLocaleExtraSettings)); + return r; +#else + return KErrNone; +#endif + } + + +#ifndef __TOOLS2__ +/** +Returns the name of the DLL containing the given bits of locale information + +Given the bits of locale information specified in aLocaleDataSet, it returns the name +of the locale DLL storing the information. TExtendedLocale can contain information from +different DLLs. + +@param aLocaleDataSet The TLocaleAspect specifying a group of locale properties +@param aDllName The descriptor that will contain the name of DLL containing the specifying + bits of locale information (valid if the method is successful) + +@return KErrNone if successful, system wide error otherwise +*/ +EXPORT_C TInt TExtendedLocale::GetLocaleDllName(TLocaleAspect aLocaleDataSet, TDes& aDllName) + { + TBuf8 buf; + TAny* ptr = 0; + switch(aLocaleDataSet) + { + case ELocaleLanguageSettings: + ptr = (TAny*)iLanguageSettings.iDateSuffixTable; + break; + case ELocaleCollateSetting: + ptr = (TAny*)iPreferredCharSet; + break; + case ELocaleLocaleSettings: + ptr = (TAny*)iLocaleExtraSettings.iLocaleExtraSettingsDllPtr; + break; + case ELocaleTimeDateSettings: + ptr = (TAny*)iLocaleTimeDateFormat.iLocaleTimeDateFormatDllPtr; + break; + } + TInt r = Exec::GetModuleNameFromAddress(ptr, buf); + if (r == KErrNone) + { + aDllName.Copy(buf); + } + return r; + } +#endif // __TOOLS2__ + +/** +Get the Currency Symbol from SLocaleLocaleSettings object + +@return TPtrC Pointer holding the Currency Symbol +*/ +EXPORT_C TPtrC TExtendedLocale::GetCurrencySymbol() + { + TPtrC outCurrencySymbolPtr(iLocaleExtraSettings.iCurrencySymbol); + return outCurrencySymbolPtr; + } + +/** +Get the Long Date Format from SLocaleTimeDateFormat object + +@return TPtrC Pointer holding the Long Date Format +*/ +EXPORT_C TPtrC TExtendedLocale::GetLongDateFormatSpec() + { + TPtrC outLongDateFormatPtr(iLocaleTimeDateFormat.iLongDateFormatSpec); + return outLongDateFormatPtr; + } + +/** +Get the Short Date Format from SLocaleTimeDateFormat object + +@return TPtrC Pointer holding the Short Date Format +*/ +EXPORT_C TPtrC TExtendedLocale::GetShortDateFormatSpec() + { + TPtrC outShortDateFormatPtr(iLocaleTimeDateFormat.iShortDateFormatSpec); + return outShortDateFormatPtr; + } + +/** +Get the Time Format from SLocaleTimeDateFormat object + +@return TPtrC Pointer holding the Time Format +*/ +EXPORT_C TPtrC TExtendedLocale::GetTimeFormatSpec() + { + TPtrC outTimeFormatPtr(iLocaleTimeDateFormat.iTimeFormatSpec); + return outTimeFormatPtr; + } + +#ifndef __TOOLS2__ +EXPORT_C TInt UserSvr::LocalePropertiesSetDefaults() + { + _LIT_SECURITY_POLICY_C1(KLocaleWritePolicy,ECapabilityWriteDeviceData); + _LIT_SECURITY_POLICY_PASS(KLocaleReadPolicy); + + TInt r = RProperty::Define(KUidSystemCategory, KLocaleLanguageKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg)); + if(r != KErrNone && r != KErrAlreadyExists) + return r; + + SLocaleLanguage localeLanguage; + localeLanguage.iLanguage = ELangEnglish; + localeLanguage.iDateSuffixTable = (const TText16*)__DefaultDateSuffixTable; + localeLanguage.iDayTable = (const TText16*)__DefaultDayTable; + localeLanguage.iDayAbbTable = (const TText16*)__DefaultDayAbbTable; + localeLanguage.iMonthTable = (const TText16*)__DefaultMonthTable; + localeLanguage.iMonthAbbTable = (const TText16*)__DefaultMonthAbbTable; + localeLanguage.iAmPmTable = (const TText16*)__DefaultAmPmTable; + localeLanguage.iMsgTable = (const TText16* const*)__DefaultLMsgTable; + r = RProperty::Set(KUidSystemCategory, KLocaleLanguageKey, TPckg(localeLanguage)); + if(r != KErrNone) + return r; + + r = RProperty::Define(KUidSystemCategory, KLocaleDataKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg)); + if(r != KErrNone && r != KErrAlreadyExists) + return r; + + TLocale locale(0); + locale.SetDefaults(); + + r = RProperty::Set(KUidSystemCategory, KLocaleDataKey, TPckg(locale)); + if(r != KErrNone) + return r; + + r = RProperty::Define(KUidSystemCategory, KLocaleDataExtraKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg)); + if(r != KErrNone && r != KErrAlreadyExists) + return r; + + SLocaleLocaleSettings localeSettings; + Mem::Copy(&localeSettings.iCurrencySymbol[0], _S16("\x00a3"), sizeof(TText16) * 2); + + r = RProperty::Set(KUidSystemCategory, KLocaleDataExtraKey, TPckg(localeSettings)); + if(r != KErrNone) + return r; + + r = RProperty::Define(KUidSystemCategory, KLocaleTimeDateFormatKey, RProperty::EByteArray, KLocaleReadPolicy, KLocaleWritePolicy, sizeof(TPckg)); + if(r != KErrNone && r != KErrAlreadyExists) + return r; + + SLocaleTimeDateFormat localeTimeDateFormat; + Mem::Copy(&localeTimeDateFormat.iShortDateFormatSpec[0], _S16("%F%*D/%*M/%Y"), sizeof(TText16) * 13); + Mem::Copy(&localeTimeDateFormat.iLongDateFormatSpec[0], _S16("%F%*D%X %N %Y"), sizeof(TText16) * 14); + Mem::Copy(&localeTimeDateFormat.iTimeFormatSpec[0], _S16("%F%*I:%T:%S %*A"), sizeof(TText16) * 16); + + r = RProperty::Set(KUidSystemCategory, KLocaleTimeDateFormatKey, TPckg(localeTimeDateFormat)); + if(r != KErrNone) + return r; + + TInt charSet = (TInt)GetLocaleDefaultCharSet(); + r = Exec::SetGlobalUserData(ELocaleDefaultCharSet, charSet); + if(r != KErrNone) + return r; + + r = Exec::SetGlobalUserData(ELocalePreferredCharSet, charSet); + + return r; + } +#endif // __TOOLS2__ + +// TOverflowHandler class created to handle the descriptor overflow in TLoacle::FormatCurrency +NONSHARABLE_CLASS(TOverflowHandler) : public TDesOverflow + { + void Overflow(TDes& aDes); + }; + +void TOverflowHandler::Overflow(TDes&) + { + Panic(ETDes16Overflow); + } + + + + +EXPORT_C void TLocale::FormatCurrency(TDes& aText, TInt aAmount) +/** +Renders a currency value as text, based on the locale's currency and numeric +format settings. + +These settings include the currency symbol, the symbol's position and the +way negative values are formatted. + +@param aText On return, contains the currency value as text, formatted + according to the locale's currency format settings. +@param aAmount The currency value to be formatted. + +@panic USER 11, if aText is not long enough to hold the formatted value. +*/ + { + TOverflowHandler overflowHandler; + FormatCurrency(aText,overflowHandler,aAmount); + } + + + + +EXPORT_C void TLocale::FormatCurrency(TDes& aText, TInt64 aAmount) +/** +Renders a currency value as text, based on the locale's currency and numeric +format settings. + +These settings include the currency symbol, the symbol's position and the +way negative values are formatted. + +@param aText On return, contains the currency value as text, formatted + according to the locale's currency format settings. +@param aAmount The currency value to be formatted. + +@panic USER 11, if aText is not long enough to hold the formatted value. +*/ + { + TOverflowHandler overflowHandler; + FormatCurrency(aText,overflowHandler, aAmount); + } + + + + +EXPORT_C void TLocale::FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt aAmount) +/** +Renders a currency value as text, based on the locale's currency and numeric +format settings. + +These settings include the currency symbol, the symbol's position and the +way negative values are formatted. If aText is not long enough to hold the +formatted currency value, the overflow handler's Overflow() function is called. + +@param aText On return, contains the currency value as text, + formatted according to the locale's currency format + settings. +@param aOverflowHandler An object derived from TDesOverflow which handles + descriptor overflows. +@param aAmount The currency value to be formatted. +*/ + { + TInt64 aLongerInt(aAmount); + FormatCurrency(aText, aOverflowHandler, aLongerInt); + } + + + + +EXPORT_C void TLocale::FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt64 aAmount) +/** +Renders a currency value as text, based on the locale's currency and numeric +format settings. + +These settings include the currency symbol, the symbol's position and the +way negative values are formatted. If aText is not long enough to hold the +formatted currency value, the overflow handler's Overflow() function is called. + +@param aText On return, contains the currency value as text, + formatted according to the locale's currency format + settings. +@param aOverflowHandler An object derived from TDesOverflow which handles + descriptor overflows. +@param aAmount The currency value to be formatted. +*/ + { + // aAmount is in cents (or equivalent) rather than dollars (or equivalent) + const TBool amountIsNegative=(aAmount<0); + if (amountIsNegative) + { + aAmount=-aAmount; + } + aText.Num(aAmount, EDecimal); + const TInt currencyDecimalPlaces=CurrencyDecimalPlaces(); + TInt positionOfDecimalSeparator=aText.Length(); + if (currencyDecimalPlaces>0) + { + while (positionOfDecimalSeparator <= currencyDecimalPlaces) + { + if (aText.Length() == aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + aText.Insert(0,KLitZeroPad); + ++positionOfDecimalSeparator; + } + positionOfDecimalSeparator=aText.Length(); + positionOfDecimalSeparator-=currencyDecimalPlaces; + TBuf<1> decimalSeparator; + decimalSeparator.Append(DecimalSeparator()); + if (aText.Length() == aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + aText.Insert(positionOfDecimalSeparator, decimalSeparator); + } + if (CurrencyTriadsAllowed()) + { + TBuf<1> thousandsSeparator; + thousandsSeparator.Append(ThousandsSeparator()); + TInt numberOfThousandsSeparator = positionOfDecimalSeparator/3; + if ((aText.Length()+numberOfThousandsSeparator) > aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + for (TInt i=positionOfDecimalSeparator-3; i>0; i-=3) + { + aText.Insert(i, thousandsSeparator); + } + } + TInt positionToInsertCurrencySymbol = 0; + switch (CurrencySymbolPosition()) + { + case ELocaleBefore: + { + if ((amountIsNegative) && (NegativeCurrencySymbolOpposite())) + { + positionToInsertCurrencySymbol=aText.Length(); + } + else + positionToInsertCurrencySymbol=0; + } + break; + case ELocaleAfter: + { + if ((amountIsNegative) && (NegativeCurrencySymbolOpposite())) + { + positionToInsertCurrencySymbol=0; + } + else + positionToInsertCurrencySymbol=aText.Length(); + } + break; + default: + Panic(ETRegionOutOfRange); + break; + } + if (CurrencySpaceBetween()) + { + if (aText.Length() == aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + if ((amountIsNegative) && (NegativeLoseSpace())) + { + // don't add the space + } + else + { + aText.Insert(positionToInsertCurrencySymbol, KLitSpace); + if (positionToInsertCurrencySymbol>0) + { + ++positionToInsertCurrencySymbol; + } + } + } + TCurrencySymbol theCurrencySymbol; + if ((aText.Length()+theCurrencySymbol.Length()) > aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + aText.Insert(positionToInsertCurrencySymbol,theCurrencySymbol); + if (amountIsNegative) + { + TInt positionToInsertInterveningMinusSign = 0; + if ((CurrencySpaceBetween()) && !(NegativeLoseSpace())) + { + if (positionToInsertCurrencySymbol>0) + { + positionToInsertInterveningMinusSign = positionToInsertCurrencySymbol-1; + } + else + { + positionToInsertInterveningMinusSign = theCurrencySymbol.Length()+1; + } + } + else + { + if (positionToInsertCurrencySymbol>0) + { + positionToInsertInterveningMinusSign = positionToInsertCurrencySymbol; + } + else + { + positionToInsertInterveningMinusSign = theCurrencySymbol.Length(); + } + } + switch (NegativeCurrencyFormat()) + { + case EInBrackets: + { + if ((aText.Length()+2) > aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + aText.Insert(0, KLitOpeningBracket); + aText.Append(')'); + } + break; + case ELeadingMinusSign: + { + if (aText.Length() == aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + aText.Insert(0, KLitMinusSign); + } + break; + case ETrailingMinusSign: + { + if (aText.Length() == aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + aText.Append(KLitMinusSign); + } + break; + case EInterveningMinusSign: + { + if (aText.Length() == aText.MaxLength()) + { + aOverflowHandler.Overflow(aText); + return; + } + aText.Insert(positionToInsertInterveningMinusSign, KLitMinusSign); + } + break; + default: + Panic(ETRegionOutOfRange); + break; + } + } + } + + +EXPORT_C void TLocaleMessageText::Set(TLocaleMessage aMsgNo) +// +// Get some text from Locale +// + { + if(TUint(aMsgNo) < ELocaleMessages_LastMsg) + { + SLocaleLanguage localeLanguage; + LocaleLanguageGet(localeLanguage); + Copy((reinterpret_cast(localeLanguage.iMsgTable))[aMsgNo]); + } + else + SetLength(0); + } + + + +#ifndef __TOOLS2__ +EXPORT_C TInt TFindServer::Next(TFullName &aResult) +/** +Gets the full name of the next server which matches the match pattern. + +@param aResult A reference to a descriptor with a defined maximum length. + If a matching server is found, its full name is set into + this descriptor. If no matching server is found, + the descriptor length is set to zero. + +@return KErrNone if a matching server is found, KErrNotFound otherwise. +*/ + { + return NextObject(aResult,EServer); + } + + + + +EXPORT_C void RServer2::Receive(RMessage2& aMessage, TRequestStatus &aStatus) +// +// Receive a message from the server asynchronously. +// + { + + aStatus=KRequestPending; + Exec::ServerReceive(iHandle, aStatus, &aMessage); + } + +EXPORT_C void RServer2::Cancel() +// +// Cancel a pending message receive. +// + { + + Exec::ServerCancel(iHandle); + } + + + + +EXPORT_C TInt TFindMutex::Next(TFullName &aResult) +/** +Finds the next global mutex whose full name matches the match pattern. + +If a global mutex with a matching name is found, the function copies its full +name into the specified descriptor. It also saves the find-handle associated +with the global mutex into the TFindHandleBase part of this object. + +@param aResult A reference to a descriptor with a defined maximum length. + If a matching global mutex is found, its full name is set + into this descriptor. + If no matching global mutex is found, the descriptor length + is set to zero. + +@return KErrNone if a matching global mutex is found; + KErrNotFound otherwise. +*/ + { + return NextObject(aResult,EMutex); + } + + + + +/** +Acquire the mutex, waiting for it to become free if necessary. + +This function checks if the mutex is currently held. If not the mutex is marked +as held by the current thread and the call returns immediately. If the mutex is +held by another thread the current thread will suspend until the mutex becomes +free. If the mutex is already held by the current thread a count is maintained +of how many times the thread has acquired the mutex. +*/ +EXPORT_C void RMutex::Wait() + { + + Exec::MutexWait(iHandle); + } + + + + +/** +Release the mutex. + +This function decrements the count of how many times the current thread has +acquired this mutex. If the count is now zero the mutex is marked as free and, +if any other threads are waiting for the mutex to become free, the highest +priority among those is made ready to run. However the mutex is not marked as +held by any thread - the thread which has just been awakened must actually run +in order to acquire the mutex. + +@pre The mutex must previously have been acquired by the current thread calling +Wait(). + +@panic KERN-EXEC 1 If the mutex has not previously been acquired by the current +thread calling Wait(). +*/ +EXPORT_C void RMutex::Signal() + { + + Exec::MutexSignal(iHandle); + } + + + +/** +Test if this mutex is held by the current thread. +@return True if the current thread has waited on the mutex, false otherwise. +*/ +EXPORT_C TBool RMutex::IsHeld() + { + return Exec::MutexIsHeld(iHandle); + } + + +/** Wait on a condition variable + +This call releases the specified mutex then atomically blocks the current +thread on this condition variable. The atomicity here is with respect to the +condition variable and mutex concerned. Specifically if the condition variable +is signalled at any time after the mutex is released then this thread will be +awakened. Once the thread has awakened it will reacquire the specified mutex +before this call returns (except in the case where the condition variable has +been deleted). + +The usage pattern for this is as follows: + +@code + mutex.Wait(); + while(!CONDITION) + condvar.Wait(mutex); + STATEMENTS; + mutex.Signal(); +@endcode + +where CONDITION is an arbitrary condition involving any number of user-side +variables whose integrity is protected by the mutex. + +It is necessary to loop while testing the condition because there is **no** guarantee +that the condition has been satisfied when the condition variable is signalled. +Different threads may be waiting on different conditions or the condition may +have already been absorbed by another thread. All that can be said is that the +thread will awaken whenever something happens which **might** affect the condition. + +It needs to be stressed that if: + +@code +condvar.Wait(mutex); +@endcode + +completes, it does not necessarily mean that the condition is yet satisfied, hence the necessity for the loop. + +@param aMutex The mutex to be released and reacquired. +@return KErrNone if the condition variable has been signalled. + KErrInUse if another thread is already waiting on this condition + variable in conjunction with a different mutex. + KErrGeneral if the condition variable is deleted. + +@pre The specified mutex is held by the current thread. +@post The specified mutex is held by the current thread unless the return + value is KErrGeneral in which case the condition variable no longer + exists. + +@panic KERN-EXEC 0 if either the condition variable or mutex handles are not + valid. +@panic KERN-EXEC 54 if the current thread does not hold the specified mutex. + +@see RCondVar::Signal() +@see RCondVar::Broadcast() +*/ +EXPORT_C TInt RCondVar::Wait(RMutex& aMutex) + { + return Exec::CondVarWait(iHandle, aMutex.Handle(), 0); + } + + + +/** Wait on a condition variable with timeout + +This is the same as RCondVar::Wait(RMutex) except that there is a time limit on +how long the current thread will block while waiting for the condition variable. + +@param aMutex The mutex to be released and reacquired. +@param aTimeout The maximum time to wait in microseconds. + 0 means no maximum. +@return KErrNone if the condition variable has been signalled. + KErrInUse if another thread is already waiting on this condition + variable in conjunction with a different mutex. + KErrGeneral if the condition variable is deleted. + KErrTimedOut if the timeout expired before the condition variable was + signalled. + +@pre The specified mutex is held by the current thread. +@post The specified mutex is held by the current thread unless the return + value is KErrGeneral in which case the condition variable no longer + exists. + +@panic KERN-EXEC 0 if either the condition variable or mutex handles are not + valid. +@panic KERN-EXEC 54 if the current thread does not hold the specified mutex. + +@see RCondVar::Wait(RMutex) +*/ +EXPORT_C TInt RCondVar::TimedWait(RMutex& aMutex, TInt aTimeout) + { + return Exec::CondVarWait(iHandle, aMutex.Handle(), aTimeout); + } + + +/** Signal a condition variable + +This unblocks a single thread which is currently blocked on the condition +variable. The highest priority waiting thread which is not explicitly suspended +will be the one unblocked. If there are no threads currently waiting this call +does nothing. + +It is not required that any mutex is held when calling this function but it is +recommended that the mutex associated with the condition variable is held since +otherwise a race condition can result from the condition variable being signalled +just after the waiting thread testing the condition and before it calls Wait(). + +*/ +EXPORT_C void RCondVar::Signal() + { + Exec::CondVarSignal(iHandle); + } + + + +/** Broadcast to a condition variable + +This unblocks all threads which are currently blocked on the condition +variable. If there are no threads currently waiting this call does nothing. + +It is not required that any mutex is held when calling this function but it is +recommended that the mutex associated with the condition variable is held since +otherwise a race condition can result from the condition variable being signalled +just after the waiting thread testing the condition and before it calls Wait(). + +*/ +EXPORT_C void RCondVar::Broadcast() + { + Exec::CondVarBroadcast(iHandle); + } + + + + +EXPORT_C TInt TFindProcess::Next(TFullName &aResult) +/** +Gets the full name of the next process which matches the match pattern. + +@param aResult A reference to a TBuf descriptor with a defined maximum length. + If a matching process is found, its full name is set into + this descriptor. If no matching process is found, the descriptor + length is set to zero. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + return NextObject(aResult,EProcess); + } + + + + +EXPORT_C TUidType RProcess::Type() const +/** +Gets the Uid type associated with the process. + +@return A reference to a TUidType object containing the process type. +*/ + { + + TUidType u; + Exec::ProcessType(iHandle,u); + return(u); + } + + + + +EXPORT_C TProcessId RProcess::Id() const +/** +Gets the Id of this process. + +@return The Id of this process. +*/ + { + + return TProcessId( (TUint)Exec::ProcessId(iHandle) ); + } + + + + +EXPORT_C void RProcess::Resume() +/** +Makes the first thread in the process eligible for execution. + +@panic KERN-EXEC 32 if the process is not yet fully loaded. + +@see RThread::Resume() +*/ + { + + Exec::ProcessResume(iHandle); + } + + + +EXPORT_C TFileName RProcess::FileName() const +/** +Gets a copy of the full path name of the loaded executable on which this +process is based. + +This is the file name which is passed to the Create() member function of this +RProcess. + +@return A TBuf descriptor with a defined maximum length containing the full + path name of the file. + +@see RProcess::Create() +*/ + { + + TFileName n; + TPtr8 n8(((TUint8*)n.Ptr()) + KMaxFileName, KMaxFileName); + Exec::ProcessFileName(iHandle,n8); + n.Copy(n8); + return(n); + } +#endif // __TOOLS2__ + + + +EXPORT_C void User::CommandLine(TDes &aCommand) +/** +Gets a copy of the data which is passed as an argument to the thread function +of the current process's main thread when it is first scheduled to run. + +@param aCommand A modifiable descriptor supplied by the caller into which the + argument data is put. The descriptor must be big enough to + contain the expected data, otherwise the function raises + a panic. + +@see User::CommandLineLength() +*/ + { + TPtr8 aCommand8((TUint8*)aCommand.Ptr(),aCommand.MaxLength()<<1); + Exec::ProcessCommandLine(KCurrentProcessHandle,aCommand8); + aCommand.SetLength(aCommand8.Length()>>1); + } + + + + +EXPORT_C TInt User::CommandLineLength() +/** +Gets the length of the data which is passed as an argument to the thread +function of the current process's main thread when it is first scheduled +to run. + +@return The length of the argument data. +*/ + { + return Exec::ProcessCommandLineLength(KCurrentProcessHandle); + } + + + +#ifndef __TOOLS2__ +EXPORT_C TExitType RProcess::ExitType() const +/** +Tests whether the process has ended and, if it has ended, return how it ended. + +This information allows the caller to distinguish between normal termination +and a panic. + +@return An enumeration whose enumerators describe how the process has ended. +*/ + { + + return(Exec::ProcessExitType(iHandle)); + } + + + + +EXPORT_C TInt RProcess::ExitReason() const +/** +Gets the specific reason associated with the end of this process. + +The reason number together with the category name is a way of distinguishing +between different causes of process termination. + +If the process has panicked, this value is the panic number. If the process +has ended as a result of a call to Kill(), then the value is the one supplied +by Kill(). + +If the process has not ended, then the returned value is zero. + +@return The reason associated with the end of the process. + +@see RProcess::Kill() +*/ + { + + return(Exec::ProcessExitReason(iHandle)); + } + + + + +EXPORT_C TExitCategoryName RProcess::ExitCategory() const +/** +Gets the name of the category associated with the end of the process. + +The category name together with the reason number is a way of distinguishing +between different causes of process termination. + +If the process has panicked, the category name is the panic category name; +for example, E32USER-CBase or KERN-EXEC. If the process has ended as a result +of a call to Kill(), then the category name is Kill. + +If the process has not ended, then the category name is empty, i.e. the length +of the category name is zero. + +@return A descriptor with a defined maximum length containing the + name of the category associated with the end of the process. + +@see RProcess::Kill() +*/ + { + + TExitCategoryName n; + TPtr8 n8(((TUint8*)n.Ptr()) + KMaxExitCategoryName, KMaxExitCategoryName); + Exec::ProcessExitCategory(iHandle,n8); + n.Copy(n8); + return(n); + } + + + + +EXPORT_C TProcessPriority RProcess::Priority() const +/** +Gets the priority of this process. + +@return One of the TProcessPriority enumerator values. +*/ + { + + return(Exec::ProcessPriority(iHandle)); + } + + + + +EXPORT_C void RProcess::SetPriority(TProcessPriority aPriority) const +/** +Sets the priority of this process to one of the values defined by theTProcessPriority +enumeration. The priority can be set to one of the four values: + +EPriorityLow + +EPriorityBackground + +EPriorityForeground + +EPriorityHigh + +The absolute priority of all threads owned by the process (and all threads +owned by those threads etc.) are re-calculated. + +Notes: + +The priority values EPriorityWindowServer, EPriorityFileServer, EPriorityRealTimeServer +and EPrioritySupervisor are internal to Symbian OS and any attempt to explicitly +set any of these priority values causes a KERN-EXEC 14 panic to be raised. + +Any attempt to set the priority of a process which is protected and is different +from the process owning the thread which invokes this function, causes a KERN-EXEC +1 panic to be raised. + +A process can set its own priority whether it is protected or not. + +@param aPriority The priority value. +*/ + { + + Exec::ProcessSetPriority(iHandle,aPriority); + } + + + + +/** +Tests whether "Just In Time" debugging is enabled or not for this process. + +@return True, when "Just In Time" debugging is enabled. False otherwise. +@see RProcess::SetJustInTime +*/ + +EXPORT_C TBool RProcess::JustInTime() const + { + + return (Exec::ProcessFlags(iHandle) & KProcessFlagJustInTime) != 0; + } + + +/** +Enables or disables "Just In Time" debugging for this process. +This will only have an effect when running on the emulator. + +"Just In Time" debugging catches a thread just before it executes a panic +or exception routine. Capturing a thread early, before it is terminated, +allows the developer to more closely inspect what went wrong, before the +kernel removes the thread. In some cases, the developer can modify context, +program counter, and variables to recover the thread. This is only possible +on the emulator. + +By default, "Just In Time" debugging is enabled. + +@param aBoolean ETrue, to enable just-in-time debugging. + EFalse, to disable just-in-time debugging. +*/ +EXPORT_C void RProcess::SetJustInTime(TBool aState) const + { + + TUint32 set = aState ? KProcessFlagJustInTime : 0; + Exec::ProcessSetFlags(iHandle, KProcessFlagJustInTime, set); + } + + + + +EXPORT_C TInt RProcess::SecureApi(TInt /*aState*/) + { + return ESecureApiOn; + } + +EXPORT_C TInt RProcess::DataCaging(TInt /*aState*/) + { + return EDataCagingOn; + } + + + +EXPORT_C TInt RProcess::GetMemoryInfo(TModuleMemoryInfo& aInfo) const +/** +Gets the size and base address of the code and various data +sections of the process. + +The run addresses are also returned. + +@param aInfo On successful return, contains the base address and size of the + sections. + +@return KErrNone, if successful; otherwise one of the other system wide error + codes. +*/ + { + + return Exec::ProcessGetMemoryInfo(iHandle,aInfo); + } + + +EXPORT_C TAny* RProcess::ExeExportData(void) +/** +Retrieves pointer to named symbol export data from the current process, i.e. the +process calling this function. + +@return Pointer to export data when it is present, NULL if export data not found +@internalTechnology +@released +*/ + { + + return Exec::ProcessExeExportData(); + } + + + +EXPORT_C TInt TFindSemaphore::Next(TFullName &aResult) +/** +Finds the next global semaphore whose full name matches the match pattern. + +If a global semaphore with a matching name is found, the function copies its +full name into the descriptor aResult. It also saves the find-handle associated +with the global semaphore into the TFindHandleBase part of this TFindSemaphore +object. + +@param aResult A reference to a TBuf descriptor with a defined maximum length. + If a matching global semaphore is found, its full name is set + into this descriptor. + If no matching global semaphore is found, the descriptor length + is set to zero. + +@return KErrNone if a matching global semaphore is found; + KErrNotFound otherwise. +*/ + { + return NextObject(aResult,ESemaphore); + } + + + + +EXPORT_C void RSemaphore::Wait() +/** +Waits for a signal on the semaphore. + +The function decrements the semaphore count by one and returns immediately +if it is zero or positive. + +If the semaphore count is negative after being decremented, the calling thread is +added to a queue of threads maintained by this semaphore. + +The thread waits until the semaphore is signalled. More than one thread can +be waiting on a particular semaphore at a time. When there are multiple threads +waiting on a semaphore, they are released in priority order. + +If the semaphore is deleted, all threads waiting on that semaphore are released. +*/ + { + + Exec::SemaphoreWait(iHandle, 0); + } + + + + +EXPORT_C TInt RSemaphore::Wait(TInt aTimeout) +/** +Waits for a signal on the semaphore, or a timeout. + +@param aTimeout The timeout value in micoseconds + +@return KErrNone if the wait has completed normally; + KErrGeneral if the semaphore is being reset, i.e the semaphore + is about to be deleted. + KErrArgument if aTimeout is negative; + otherwise one of the other system wide error codes indicating that + the timeout has expired. +*/ + { + + return Exec::SemaphoreWait(iHandle, aTimeout); + } + + + + +EXPORT_C void RSemaphore::Signal() +/** +Signals the semaphore once. + +The function increments the semaphore count by one. If the count was negative +before being incremented, the highest priority thread waiting on the semaphore's queue +of threads is removed from that queue and, provided that it is not suspended +for any other reason, is marked as ready to run. +*/ + { + + Exec::SemaphoreSignal1(iHandle); + } + + + + +EXPORT_C void RSemaphore::Signal(TInt aCount) +/** +Signals the semaphore one or more times. + +The function increments the semaphore count. If the count was negative +before being incremented, the highest priority thread waiting on the semaphore's queue +of threads is removed from that queue and, provided that it is not suspended +for any other reason, is marked as ready to run. + +@param aCount The number of times the semaphore is to be signalled. +*/ + { + + __ASSERT_ALWAYS(aCount>=0,Panic(ESemSignalCountNegative)); + Exec::SemaphoreSignalN(iHandle,aCount); + } + + + + +EXPORT_C RCriticalSection::RCriticalSection() + : iBlocked(1) +/** +Default constructor. +*/ + {} + + + + +EXPORT_C void RCriticalSection::Close() +/** +Closes the handle to the critical section. + +As a critical section object is implemented using a semaphore, this has the +effect of closing the handle to the semaphore. +*/ + { + + RSemaphore::Close(); + } + + + + +EXPORT_C void RCriticalSection::Wait() +/** +Waits for the critical section to become free. + +If no other thread is in the critical section, control returns immediately +and the current thread can continue into the section. + +If another thread is already in the critical section, the current thread is +marked as waiting (on a semaphore); the current thread is added to a queue +of threads maintained by this critical section. +*/ + { + + if (User::LockedDec(iBlocked)!=1) + RSemaphore::Wait(); + } + + + + +EXPORT_C void RCriticalSection::Signal() +/** +Signals an exit from the critical section. + +A thread calls this function when it exits from the critical section. +The first eligible thread waiting on the critical section's queue of threads +is removed from that queue and, provided that it is not suspended for any other +reason, is marked as ready to run. That thread will, therefore, be the next to +proceed into the critical section. +*/ + { + + __ASSERT_ALWAYS(iBlocked<1,Panic(ECriticalSectionStraySignal)); + if (User::LockedInc(iBlocked)<0) + RSemaphore::Signal(); + } + + + + +EXPORT_C TInt TFindThread::Next(TFullName &aResult) +/** +Gets the full name of the next global thread which matches the match pattern. + +@param aResult A reference to a TBuf descriptor with a defined maximum length. + If a matching global thread is found, its full name is set into + this descriptor. If no matching global thread is found, + the descriptor length is set to zero. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + return NextObject(aResult,EThread); + } + + + + +EXPORT_C TThreadId RThread::Id() const +/** +Gets the Id of this thread. + +@return The Id of this thread. +*/ + { + + return TThreadId( (TUint)Exec::ThreadId(iHandle) ); + } +#endif + + + +EXPORT_C void RThread::HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const +/** +Gets the number of handles open in this thread, and the number of handles open +in the process which owns this thread. + +@param aProcessHandleCount On return, contains the number of handles open in + the process which owns this thread. +@param aThreadHandleCount On return, contains the number of handles open in + this thread. +*/ + { +#ifndef __TOOLS2__ + Exec::HandleCount(iHandle,aProcessHandleCount,aThreadHandleCount); +#else + aProcessHandleCount = aThreadHandleCount = 0; +#endif // __TOOLS2__ + } + + + +#ifndef __TOOLS2__ +EXPORT_C TExceptionHandler User::ExceptionHandler() +/** +Gets a pointer to the exception handler for the current thread. + +@return A pointer to the exception handler. +*/ + { + return(Exec::ExceptionHandler(KCurrentThreadHandle)); + } + + + + +EXPORT_C TInt User::SetExceptionHandler(TExceptionHandler aHandler,TUint32 aMask) +/** +Sets a new exception handler for the current thread. Note that the handler is not +guaranteed to receive floating point exceptions (KExceptionFpe) when a hardware +floating point implementation is in use - see User::SetFloatingPointMode for +hardware floating point modes and whether they cause user-trappable exceptions. + +@param aHandler The new exception handler. +@param aMask One or more flags defining the exception categories which + the handler can handle. + +@return KErrNone if successful, otherwise another of the system-wide error codes. + +@see KExceptionAbort +@see KExceptionKill +@see KExceptionUserInterrupt +@see KExceptionFpe +@see KExceptionFault +@see KExceptionInteger +@see KExceptionDebug +*/ + { + return(Exec::SetExceptionHandler(KCurrentThreadHandle, aHandler, aMask)); + } + + + + +EXPORT_C void User::ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask) +/** +Changes the set of exceptions which the current thread's exception +handler can deal with. + +aClearMask is the set of flags defining the set of exceptions which the +exception handler no longer deals with, while aSetMask is the set of flags +defining the new set of exceptions to be set. + +Flag clearing is done before flag setting. + +@param aClearMask One or more flags defining the exceptions which the current + exception handler no longer deals with. +@param aSetMask One or more flags defining the new set of exceptions which + the current exception handler is to deal with. +*/ + { + Exec::ModifyExceptionMask(KCurrentThreadHandle, aClearMask, aSetMask); + } + + + + +_LIT(KLitUserExec, "USER-EXEC"); +EXPORT_C TInt User::RaiseException(TExcType aType) +/** +Raises an exception of a specified type on the current thread. + +If the thread has an exception handler to handle this type of exception, +then it is called. + +If the thread has no exception handler to handle this type of exception, then +the function raises a USER-EXEC 3 panic. + +Note that exception handlers are executed in the context of the thread on which +the exception is raised; control returns to the point of the exception. + +@param aType The type of exception. + +@return KErrNone if successful, otherwise another of the system-wide + error codes. +*/ + { + if (Exec::IsExceptionHandled(KCurrentThreadHandle,aType,ETrue)) + { + Exec::ThreadSetFlags(KCurrentThreadHandle, 0, KThreadFlagLastChance); + TUint32 type = aType; + User::HandleException(&type); + } + else + User::Panic(KLitUserExec, ECausedException); + return KErrNone; + } + + + + +EXPORT_C TBool User::IsExceptionHandled(TExcType aType) +/** +Tests whether the specified exception type can be handled by the +current thread. + +@param aType The type of exception. + +@return True, if the thread has an exception handler which can handle + an exception of type aType. + False, if the thread has no exception handler or the thread has + an exception handler which cannot handle the exception defined + by aType. +*/ + { + return (Exec::IsExceptionHandled(KCurrentThreadHandle,aType,EFalse)); + } + + + + +EXPORT_C void RThread::Context(TDes8 &aDes) const +/** +Gets the register contents of this thread. + +@param aDes On return, contains the register contents, starting with R0. +*/ + { + + Exec::ThreadContext(iHandle,aDes); + } + + + + +EXPORT_C void RThread::Resume() const +/** +Makes the thread eligible for execution. + +After a thread is created, it is put into a suspended state; the thread is +not eligible to run until Resume() is called. + +This function must also be called to resume execution of this thread after +it has been explicitly suspended by a call to Suspend(). + +Note that when a thread is created, it is given the priority EPriorityNormal +by default. The fact that a thread is initially put into a suspended state +means that the thread priority can be changed by calling the thread's +SetPriority() member function before the thread is started by a call to Resume(). +*/ + { + + Exec::ThreadResume(iHandle); + } + + + + +EXPORT_C void RThread::Suspend() const +/** +Suspends execution of this thread. + +The thread is not scheduled to run until a subsequent call to Resume() is made. +*/ + { + + Exec::ThreadSuspend(iHandle); + } + + + + +EXPORT_C TThreadPriority RThread::Priority() const +/** +Gets the priority of this thread. + +@return The priority. +*/ + { + + return(Exec::ThreadPriority(iHandle)); + } + + + + +EXPORT_C void RThread::SetProcessPriority(TProcessPriority aPriority) const +/** +Sets the priority of the process which owns this thread to one of the values +defined by the TProcessPriority enumeration. + +The priority can be set to one of the four values: + +EPriorityLow + +EPriorityBackground + +EPriorityForeground + +EPriorityHigh + +The absolute priority of all threads owned by the process (and all threads +owned by those threads etc.) are re-calculated. + +Note: + +The use of the priority values EPriorityWindowServer, EPriorityFileServer, +EPriorityRealTimeServer and EPrioritySupervisor is restricted to Symbian OS, +and any attempt to explicitly set any of these priority values raises a KERN-EXEC +14 panic. + +@param aPriority The priority value. + +@deprecated Not allowed on threads in a different process. + Replace with RProcess::SetPriority or RMessagePtr2::SetProcessPriority +*/ + { + + Exec::ThreadSetProcessPriority(iHandle,aPriority); + } + + + + +EXPORT_C TProcessPriority RThread::ProcessPriority() const +/** +Gets the priority of the process which owns this thread. + +@return The process priority. +*/ + { + + return(Exec::ThreadProcessPriority(iHandle)); + } + + + + +EXPORT_C void RThread::SetPriority(TThreadPriority aPriority) const +/** +Sets the priority of the thread to one of the values defined by +the TThreadPriority enumeration. + +The resulting absolute priority of the thread depends on the value of aPriority +and the priority of the owning process. + +Use of the priority value EPriorityNull is restricted to Symbian OS, and any +attempt to explicitly set this value causes a KERN-EXEC 14 panic to be raised. + +@param aPriority The priority value. + +@capability ProtServ if aPriority is EPriorityAbsoluteRealTime1 or higher + +@panic KERN-EXEC 14, if aPriority is invalid or set to EPriorityNull +@panic KERN-EXEC 46, if aPriority is EPriorityAbsoluteRealTime1 or higher + and calling process does not have ProtServ capability +*/ + { + + Exec::ThreadSetPriority(iHandle,aPriority); + } + + + + +EXPORT_C User::TCritical User::Critical(RThread aThread) +/** +Gets the critical state associated with the specified thread. + +@param aThread The thread whose critical state is to be retrieved. + +@return The critical state. + +@see User::SetCritical() +*/ + { + TUint32 flags = Exec::ThreadFlags(aThread.Handle()); + if (flags & KThreadFlagSystemPermanent) + return ESystemPermanent; + if (flags & KThreadFlagSystemCritical) + return ESystemCritical; + if (flags & KThreadFlagProcessPermanent) + return EProcessPermanent; + if (flags & KThreadFlagProcessCritical) + return EProcessCritical; + return ENotCritical; + } + + + + +EXPORT_C User::TCritical User::Critical() +/** +Gets the critical state associated with the current thread. + +@return The critical state. + +@see User::SetCritical() +*/ + { + RThread me; + return User::Critical(me); + } + + + + +/** +Sets up or changes the effect that termination of the current +thread has, either on its owning process, or on the whole system. + +The precise effect of thread termination is defined by +the following specific values of the TCritical enum: +- ENotCritical +- EProcessCritical +- EProcessPermanent +- ESystemCritical +- ESystemPermanent + +Notes: +-# The enum value EAllThreadsCritical cannot be set using this function. It is +associated with a process, not a thread, and, if appropriate, should be set +using User::SetProcessCritical(). +-# The states associated with ENotCritical, EProcessCritical, +EProcessPermanent, ESystemCritical and ESystemPermanent +are all mutually exclusive, i.e. the thread can only be in one of these states +at any one time + +@param aCritical The state to be set. + +@return KErrNone, if successful; + KErrArgument, if EAllThreadsCritical is passed - this is a + state associated with a process, and + you use User::SetProcessCritical() to set it. + +@capability ProtServ if aCritical==ESystemCritical or ESystemPermanent + +@see User::Critical() +@see User::ProcessCritical() +@see User::SetProcessCritical() +*/ +EXPORT_C TInt User::SetCritical(TCritical aCritical) + { + const TUint32 clear = KThreadFlagSystemPermanent | KThreadFlagSystemCritical | + KThreadFlagProcessPermanent | KThreadFlagProcessCritical; + TUint32 set; + switch (aCritical) + { + case ENotCritical: set = 0; break; + case EProcessCritical: set = KThreadFlagProcessCritical; break; + case EProcessPermanent: set = KThreadFlagProcessPermanent; break; + case ESystemCritical: set = KThreadFlagSystemCritical; break; + case ESystemPermanent: set = KThreadFlagSystemPermanent; break; + default: return KErrArgument; + } + Exec::ThreadSetFlags(KCurrentThreadHandle, clear, set); + return KErrNone; + } + + + + +EXPORT_C TInt User::SetRealtimeState(TRealtimeState aState) + { + const TUint32 clear = KThreadFlagRealtime | KThreadFlagRealtimeTest; + TUint32 set; + switch (aState) + { + case ERealtimeStateOff: set = 0; break; + case ERealtimeStateOn: set = KThreadFlagRealtime; break; + case ERealtimeStateWarn: set = KThreadFlagRealtime|KThreadFlagRealtimeTest; break; + default: return KErrArgument; + } + Exec::ThreadSetFlags(KCurrentThreadHandle, clear, set); + return KErrNone; + } + + + + +EXPORT_C User::TCritical User::ProcessCritical(RProcess aProcess) +/** +Gets the critical state associated with the specified process. + +@param aProcess The process whose critical state is to be retrieved. + +@return The critical state. + +@see User::SetProcessCritical() +*/ + { + TUint32 flags = Exec::ProcessFlags(aProcess.Handle()); + if (flags & KProcessFlagSystemPermanent) + return ESystemPermanent; + if (flags & KProcessFlagSystemCritical) + return ESystemCritical; + if (flags & (KThreadFlagProcessPermanent | KThreadFlagProcessCritical)) + return EAllThreadsCritical; + return ENotCritical; + } + + + + +EXPORT_C User::TCritical User::ProcessCritical() +/** +Gets the critical state associated with the current process. + +@return The critical state. + +@see User::SetProcessCritical() +*/ + { + RProcess me; + return User::ProcessCritical(me); + } + + + + +EXPORT_C TInt User::SetProcessCritical(TCritical aCritical) +/** +Sets up or changes the effect that termination of subsequently created threads +will have, either on the owning process, or on the whole system. + +It is important to note that we are not referring to threads that have already +been created, but threads that will be created subsequent to a call to this function. + +The precise effect of thread termination is defined by the following specific +values of the TCritical enum: +- ENotCritical +- EAllThreadsCritical +- ESystemCritical +- ESystemPermanent + +Notes: +-# The enum values EProcessCritical and EProcessPermanent cannot be set using +this function. They are states associated with +a thread, not a process, and, if appropriate, should be set +using User::SetCritical(). +-# The states associated with ENotCritical, EAllThreadsCritical, +ESystemCritical and ESystemPermanent are all mutually exclusive, i.e. the +process can only be in one of these states at any one time. + +@param aCritical The state to be set. + +@return KErrNone, if successful; + KErrArgument, if either EProcessCritical or EProcessPermanent + is passed - these are states associated with a thread, and + you use User::SetCritical() to set them. + +@capability ProtServ if aCritical==ESystemCritical or ESystemPermanent + +@see User::ProcessCritical() +@see User::SetCritical() +@see User::Critical() +*/ + { + const TUint32 clear = KProcessFlagSystemPermanent | KProcessFlagSystemCritical | + KThreadFlagProcessPermanent | KThreadFlagProcessCritical; + TUint32 set; + switch (aCritical) + { + case ENotCritical: set = 0; break; + case EAllThreadsCritical: set = KThreadFlagProcessCritical; break; + case ESystemCritical: set = KProcessFlagSystemCritical; break; + case ESystemPermanent: set = KProcessFlagSystemPermanent|KProcessFlagSystemCritical; break; + default: return KErrArgument; + } + Exec::ProcessSetFlags(KCurrentProcessHandle, clear, set); + return KErrNone; + } + + + + +EXPORT_C TBool User::PriorityControl() +/** +Tests whether the current process allows other processes to switch its priority +between 'foreground' and 'background'. + +@return True, if the current process allows other processes to switch its priority; + false, otherwise. +*/ + { + return Exec::ProcessFlags(KCurrentProcessHandle) & KProcessFlagPriorityControl; + } + + + + +EXPORT_C void User::SetPriorityControl(TBool aEnable) +/** +Allows the current process to choose to have its priority switched by another +process between 'foreground' and 'background'. + +By default a process does not allow this. + +@param aEnable If ETrue, allows other processes to switch the current process's + priority. + If EFalse, prevents other processes from switching the current + process's priority. +*/ + { + TUint32 set = aEnable ? KProcessFlagPriorityControl : 0; + Exec::ProcessSetFlags(KCurrentProcessHandle, KProcessFlagPriorityControl, set); + } + + + +EXPORT_C TInt RThread::RequestCount() const +/** +Gets this thread's request semaphore count. + +The request semaphore is created when a thread is created, and is used to +support asynchronous requests. + +A negative value implies that this thread is waiting for at least +one asynchronous request to complete. + +@return This thread's request semaphore count. +*/ + { + + return(Exec::ThreadRequestCount(iHandle)); + } + + + + +EXPORT_C TExitType RThread::ExitType() const +/** +Tests whether the thread has ended and, if it has ended, return how it ended. + +This information allows the caller to distinguish between normal termination +and a panic. + +@return An enumeration whose enumerators describe how the thread has ended. +*/ + { + + return(Exec::ThreadExitType(iHandle)); + } + + + + +EXPORT_C TInt RThread::ExitReason() const +/** +Gets the specific reason associated with the end of this thread. + +The reason number together with the category name is a way of distinguishing +between different causes of thread termination. + +If the thread has panicked, this value is the panic number. If the thread +has ended as a result of a call to Kill(), then the value is the one supplied +by Kill(). + +If the thread is still alive, then the returned value is zero. + +@return The reason associated with the end of the thread. +*/ + { + + return(Exec::ThreadExitReason(iHandle)); + } + + + + +EXPORT_C TExitCategoryName RThread::ExitCategory() const +/** +Gets the name of the category associated with the end of the thread. + +The category name together with the reason number is a way of distinguishing +between different causes of thread termination. + +If the thread has panicked, the category name is the panic category name; +for example, E32USER-CBase or KERN-EXEC. If the thread has ended as a result +of call to Kill(), then the category name is Kill. + +If the thread has not ended, then the category name is empty, i.e. the length +of the category name is zero. + +@return A TBuf descriptor with a defined maximum length containing the name + of the category associated with the end of the thread. + +@see TBuf +*/ + { + TExitCategoryName n; + TPtr8 n8(((TUint8*)n.Ptr()) + KMaxExitCategoryName, KMaxExitCategoryName); + Exec::ThreadExitCategory(iHandle,n8); + n.Copy(n8); + return(n); + } + + + + +EXPORT_C TInt RThread::StackInfo(TThreadStackInfo& aInfo) const +/** +Gets information about a thread's user mode stack. + +@param aInfo The TThreadStackInfo object to write the stack infomation to. + +@return KErrNone, if sucessful; + KErrGeneral, if the thread doesn't have a user mode stack, + or it has terminated. + +@see TThreadStackInfo +*/ + { + return(Exec::ThreadStackInfo(iHandle,aInfo)); + } + + + + +EXPORT_C TInt RThread::GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime) const +/** +Gets the CPU usage for this thread. + +This function is not supported on version 8.0b or 8.1b, and returns +KErrNotSupported. From 9.1 onwards it may be supported if the kernel has been +compiled with the MONITOR_THREAD_CPU_TIME macro defined. + +@param aCpuTime A reference to a time interval object supplied by the caller. + +@return KErrNone - if thread CPU time is available. + + KErrNotSupported - if this feature is not supported on this + version or build of the OS. +*/ + { + return Exec::ThreadGetCpuTime(iHandle, (TInt64&)aCpuTime.Int64()); + } +#endif // __TOOLS2__ + + + +EXPORT_C void User::After(TTimeIntervalMicroSeconds32 aInterval) +/** +Suspends the current thread until a specified time interval has expired. + +The resolution of the timer depends on the hardware, but is normally +1 Symbian OS tick (approximately 1/64 second). + +@param aInterval The time interval for which the current thread is to be + suspended, in microseconds. + +@panic USER 86, if the time interval is negative. +*/ + { + + __ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(EExecAfterTimeNegative)); + TRequestStatus s=KRequestPending; + Exec::After(aInterval.Int(),s); + User::WaitForRequest(s); + } + + + + +EXPORT_C void User::AfterHighRes(TTimeIntervalMicroSeconds32 aInterval) +/** +Suspends the current thread until a specified time interval has expired to +a resolution of 1ms . + +@param aInterval The time interval for which the current thread is to be + suspended, in microseconds. + +@panic USER 86, if the time interval is negative. +*/ + { + + __ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(EExecAfterTimeNegative)); + TRequestStatus s=KRequestPending; + Exec::AfterHighRes(aInterval.Int(),s); + User::WaitForRequest(s); + } + + + +#ifndef __TOOLS2__ +EXPORT_C TInt User::At(const TTime &aTime) +/** +Suspends the current thread until the specified absolute time, in the current time zone. + +If the machine is off at that time, the machine will be turned on again. + +@param aTime The absolute time, in the current time zone, until which the current thread is to + be suspended. + +@return On completion, contains the status of the request to suspend the + current thread: + + KErrNone - suspension of the current thread completed normally at + the requested time. + + KErrAbort - suspension of the current thread was aborted + because the system time changed. + + KErrUnderflow - the requested completion time is in the past. + + KErrOverFlow - the requested completion time is too far in the future. +*/ + { + + TRequestStatus s=KRequestPending; + TInt64 time=aTime.Int64(); + time -= ((TInt64)User::UTCOffset().Int()) * 1000000; + Exec::At(time,s); + User::WaitForRequest(s); + return(s.Int()); + } + + + + +EXPORT_C void RTimer::Cancel() +/** +Cancels any outstanding request for a timer event. + +Any outstanding timer event completes with KErrCancel. +*/ + { + + Exec::TimerCancel(iHandle); + } + + + + +EXPORT_C void RTimer::After(TRequestStatus &aStatus,TTimeIntervalMicroSeconds32 aInterval) +// +// Request a relative timer. +// +/** +Requests an event after the specified interval. + +The counter for this type of request stops during power-down. +A 5 second timer will complete late if, for example, the machine is turned off +2 seconds after the request is made. + +@param aStatus On completion, contains the status of the request. + This is KErrNone if the timer completed normally at the + requested time, otherwise another of the + system-wide error codes. + +@param aInterval The time interval, in microseconds, after which an event + is to occur. + +@panic USER 87, if aInterval is negative. +@panic KERN-EXEC 15, if this function is called while a request for a timer + event is still outstanding. +*/ + { + + __ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(ERTimerAfterTimeNegative)); + aStatus=KRequestPending; + Exec::TimerAfter(iHandle,aStatus,aInterval.Int()); + } + + + + +EXPORT_C void RTimer::AfterTicks(TRequestStatus& aStatus, TInt aTicks) +// +// Request a relative timer in system ticks. +// +/** +Requests an event after the specified interval. + +The counter for this type of request stops during power-down. +A 5 tick timer will complete late if, for example, the machine is turned off +2 ticks after the request is made. + +@param aStatus On completion, contains the status of the request. + This is KErrNone if the timer completed normally at the + requested time, otherwise another of the + system-wide error codes. + +@param aTicks The time interval, in system ticks, after which an event + is to occur. + +@panic USER 87, if aTicks is negative. +@panic KERN-EXEC 15, if this function is called while a request for a timer + event is still outstanding. +*/ + { + __ASSERT_ALWAYS(aTicks >= 0, ::Panic(ERTimerAfterTimeNegative)); + aStatus = KRequestPending; + Exec::TimerAfter(iHandle, aStatus, -aTicks); + } + + + + +EXPORT_C void RTimer::HighRes(TRequestStatus &aStatus,TTimeIntervalMicroSeconds32 aInterval) +// +// Request a relative timer to a resolution of 1ms. +// +/** +Requests an event after the specified interval to a resolution of 1ms. +The "HighRes timer" counter stops during power-down (the same as "after timer"). + +@param aStatus On completion, contains the status of the request. + This is KErrNone if the timer completed normally at the + requested time, otherwise another of the + system-wide error codes. + +@param aInterval The time interval, in microseconds, after which an event + is to occur. + +@panic USER 87, if aInterval is negative. +@panic KERN-EXEC 15, if this function is called while a request for a timer + event is still outstanding. +*/ + { + + __ASSERT_ALWAYS(aInterval.Int()>=0,::Panic(ERTimerAfterTimeNegative)); + aStatus=KRequestPending; + Exec::TimerHighRes(iHandle,aStatus,aInterval.Int()); + } + + + + +EXPORT_C void RTimer::At(TRequestStatus &aStatus,const TTime &aTime) +// +// Request an absolute timer. +// +/** +Requests an event at a given system time (in the current time zone). + +If the machine is off at that time, it is automatically turned on. + +@param aStatus On completion, contains the status of the request: + KErrNone, the timer completed normally at the requested time; + KErrCancel, the timer was cancelled; + KErrAbort, the timer was aborted because the system time changed; + KErrUnderflow, the requested completion time is in the past; + KErrOverFlow, the requested completion time is too far in the future; +@param aTime The time at which the timer will expire. + +@panic KERN-EXEC 15, if this function is called while a request for a timer + event is still outstanding. +*/ + { + + aStatus=KRequestPending; + TInt64 time=aTime.Int64(); + time -= ((TInt64)User::UTCOffset().Int()) * 1000000; + Exec::TimerAt(iHandle,aStatus,time); + } + + + + +EXPORT_C void RTimer::AtUTC(TRequestStatus &aStatus,const TTime &aUTCTime) +// +// Request an absolute timer in UTC time. +// +/** +Requests an event at a given UTC time. + +If the machine is off at that time, it is automatically turned on. + +@param aStatus On completion, contains the status of the request: + KErrNone, the timer completed normally at the requested time; + KErrCancel, the timer was cancelled; + KErrAbort, the timer was aborted because the system time changed; + KErrUnderflow, the requested completion time is in the past; + KErrOverFlow, the requested completion time is too far in the future; +@param aTime The time at which the timer will expire. + +@panic KERN-EXEC 15, if this function is called while a request for a timer + event is still outstanding. +*/ + { + + aStatus=KRequestPending; + Exec::TimerAt(iHandle,aStatus,aUTCTime.Int64()); + } + + + + +EXPORT_C void RTimer::Lock(TRequestStatus &aStatus,TTimerLockSpec aLock) +// +// Request an absolute timer. +// +/** +Requests an event on a specified second fraction. + +@param aStatus On completion, contains the status of the request: + KErrGeneral, the first time this is called; + KErrNone, the timer completed normally at the requested time; + KErrCancel, the timer was cancelled; + KErrAbort, the timer was aborted because the system time changed; + KErrUnderflow, the requested completion time is in the past; + KErrOverFlow, the requested completion time is too far in the future. +@param aLock The fraction of a second at which the timer completes. + +@panic KERN-EXEC 15, if this function is called while a request for a timer + event is still outstanding. +*/ + { + aStatus=KRequestPending; + Exec::TimerLock(iHandle,aStatus,aLock); + } + + +/** +Requests an event to be triggered when aSeconds is exactly, (ie not greater or +less than), the time elapsed (to the nearest second) since the last user activity. +If the event trigger time has been "missed", instead of triggering late, +the timer waits for the next user activity, to try and satisfy the condition. + +That is to say, if there was user activity within the last aSeconds, +the event will be triggered after aSeconds of continuous inactivity following that activity. +Otherwise, if there has been no such activity within this time, an event is +triggered after aSeconds of continuous inactivity following the next user activity +in the future. + +It follows from this, that you can request an event directly after the next +user activity by supplying a time interval of zero. + + +@param aStatus On completion, contains the status of the request: + KErrNone, the timer completed normally; + KErrCancel, the timer was cancelled; + KErrArgument, if aSeconds is less then zero; + KErrOverflow, if aSecond reaches its limit (which is platform specific but greater then one and a half day). +@param aSeconds The time interval in seconds. + +@panic KERN-EXEC 15, if this function is called while a request for a timer + event is still outstanding. +*/ +EXPORT_C void RTimer::Inactivity(TRequestStatus &aStatus, TTimeIntervalSeconds aSeconds) + { + aStatus=KRequestPending; + Exec::TimerInactivity(iHandle, aStatus, aSeconds.Int()); + } + + + + +EXPORT_C TInt RChangeNotifier::Logon(TRequestStatus& aStatus) const +/** +Issues a request for notification when changes occur in the environment. + +A switch in locale, or crossing over past midnight, are examples of changes +that are reported. + +When a change in the environment occurs, the request completes and the +TRquestStatus object will contain one or more of the bit values defined +by the TChanges enum. + +Alternatively, if an outstanding request is cancelled by a call to +this handle's LogonCancel() member function, then the request completes +with a KErrCancel. + +Note that if this is the first notification request after creation of +the change notifier, then this request completes immediately. + +@param aStatus A reference to the request status object. + +@return KErrInUse, if there is an outstanding request; KErrNone otherwise. + +@see TChanges +@see RChangeNotifier::Logon() +*/ + { + + aStatus=KRequestPending; + return(Exec::ChangeNotifierLogon(iHandle,aStatus)); + } + + + + +EXPORT_C TInt RChangeNotifier::LogonCancel() const +/** +Cancels an outstanding change notification request. + +@return KErrGeneral, if there is no outstanding request; KErrNone otherwise. + +@see RChangeNotifier::Logon() +*/ + { + + return(Exec::ChangeNotifierLogoff(iHandle)); + } + + + + +EXPORT_C void UserSvr::CaptureEventHook() +// +// Capture the event hook +// + { + + Exec::CaptureEventHook(); + } + +EXPORT_C void UserSvr::ReleaseEventHook() +// +// Release the event hook +// + { + + Exec::ReleaseEventHook(); + } + +EXPORT_C void UserSvr::RequestEvent(TRawEventBuf &anEvent,TRequestStatus &aStatus) +// +// Request the next event. +// + { + + aStatus=KRequestPending; + Exec::RequestEvent(anEvent,aStatus); + } + +EXPORT_C void UserSvr::RequestEventCancel() +// +// Cancel the event request. +// + { + + Exec::RequestEventCancel(); + } + +/** +Add an event to the queue. + +@param anEvent The raw hardware event to be added to the event queue. +@return KErrNone, if successful; KErrPermissionDenied, if the caller has +insufficient capability; otherwise, one of the other system-wide error codes. + +@capability SwEvent +@capability PowerMgmt for ESwitchOff, ERestartSystem, ECaseOpen and ECaseClose +*/ +EXPORT_C TInt UserSvr::AddEvent(const TRawEvent& anEvent) + { + + return(Exec::AddEvent(anEvent)); + } + +EXPORT_C void UserSvr::ScreenInfo(TDes8 &anInfo) +// +// Get the screen info. +// + { + + Exec::HalFunction(EHalGroupDisplay,EDisplayHalScreenInfo,(TAny*)&anInfo,NULL); + } + +#ifdef __USERSIDE_THREAD_DATA__ + +EXPORT_C TAny* UserSvr::DllTls(TInt aHandle) +// +// Return the value of the Thread Local Storage variable. +// + { + return LocalThreadData()->DllTls(aHandle, KDllUid_Default); + } + +EXPORT_C TAny* UserSvr::DllTls(TInt aHandle, TInt aDllUid) +// +// Return the value of the Thread Local Storage variable. +// + { + return LocalThreadData()->DllTls(aHandle, aDllUid); + } + +#else + +EXPORT_C TAny* UserSvr::DllTls(TInt aHandle) +// +// Return the value of the Thread Local Storage variable. +// + { + + return Exec::DllTls(aHandle, KDllUid_Default); + } + +EXPORT_C TAny* UserSvr::DllTls(TInt aHandle, TInt aDllUid) +// +// Return the value of the Thread Local Storage variable. +// + { + + return Exec::DllTls(aHandle, aDllUid); + } + +#endif + +EXPORT_C void UserSvr::DllFileName(TInt aHandle, TDes& aFileName) +// +// Return the filename of this dll +// + { + TBuf8 n8; + Exec::DllFileName(aHandle, n8); + aFileName.Copy(n8); + } + +EXPORT_C TBool UserSvr::TestBootSequence() +// +// Is the machine being booted by the test department? +// + { + + return Exec::HalFunction(EHalGroupPower,EPowerHalTestBootSequence,NULL,NULL); + } + +/** +Register whether the W/S takes care of turning the screen on +*/ +EXPORT_C void UserSvr::WsRegisterSwitchOnScreenHandling(TBool aState) + { + + Exec::HalFunction(EHalGroupDisplay,EDisplayHalWsRegisterSwitchOnScreenHandling,(TAny*)aState,NULL); + } + +EXPORT_C void UserSvr::WsSwitchOnScreen() +// +// W/S switch on the screen +// + { + + Exec::HalFunction(EHalGroupDisplay,EDisplayHalWsSwitchOnScreen,NULL,NULL); + } + + +EXPORT_C TUint32 UserSvr::DebugMask() +/** +Return the kernel debug mask at index 0 +*/ + { + return Exec::DebugMask(); + } + + +EXPORT_C TUint32 UserSvr::DebugMask(TUint aIndex) +/** +Return the kernel debug mask at the given index position + +@param aIndex An index of which 32 bit mask word is to be accessed +*/ + { + return Exec::DebugMaskIndex(aIndex); + } +#endif // __TOOLS2__ + + +EXPORT_C TTrapHandler *User::TrapHandler() +/** +Gets a pointer to the current thread's trap handler. + +Note that TTrapHandler is an abstract base class; a trap handler must be +implemented as a derived class. + +@return A pointer to the current thread's trap handler, if any. NULL, if no + pre-existing trap handler is set. +*/ + { + + return GetTrapHandler(); + } + + + + +EXPORT_C TTrapHandler *User::SetTrapHandler(TTrapHandler *aHandler) +/** +Sets the current thread's trap handler and returns a pointer to any pre-existing +trap handler. + +Pass a NULL pointer to this function to clear the trap handler. + +The trap handler works with the TRAP mechanism to handle the effects of a +leave. + +Note that TTrapHandler is an abstract base class; a trap handler must be +implemented as a derived class. + +@param aHandler A pointer to the trap handler which is to be installed as + the current thread's trap handler. + +@return A pointer to the current thread's pre-existing trap handler, if any. + NULL, if no pre-existing trap handler is set. + +@see TRAP +@see TRAPD +*/ + { + + TTrapHandler* prev; +#if defined(__USERSIDE_THREAD_DATA__) && defined(__LEAVE_EQUALS_THROW__) + prev = LocalThreadData()->iTrapHandler; +#else + prev = Exec::SetTrapHandler(aHandler); +#endif +#ifdef __USERSIDE_THREAD_DATA__ + LocalThreadData()->iTrapHandler = aHandler; +#endif + return prev; + } + +#ifndef __LEAVE_EQUALS_THROW__ +EXPORT_C TTrapHandler* User::MarkCleanupStack() +/** +If there's a TTrapHandler installed marks the cleanup stack and returns +the TTrapHandler for subsequent use in UnMarkCleanupStack. + +Only intended for use in the defintion of TRAP and TRAPD and only when +User::Leave is defined in terms of THROW. + +@return A pointer to the current thread's pre-existing trap handler, if any. + NULL, if no pre-existing trap handler is set. + +@see TRAP +@see TRAPD +*/ + { + return (TTrapHandler*)0; + } + + +EXPORT_C void User::UnMarkCleanupStack(TTrapHandler* /*aHandler*/) +/** +If passed a non-null TTrapHandler unmarks the cleanup stack. + +Only intended for use in the defintion of TRAP and TRAPD and only when +User::Leave is defined in terms of THROW. + +@see TRAP +@see TRAPD +*/ + {} + +#else + +EXPORT_C TTrapHandler* User::MarkCleanupStack() +/** +If there's a TTrapHandler installed marks the cleanup stack and returns +the TTrapHandler for subsequent use in UnMarkCleanupStack. + +Only intended for use in the defintion of TRAP and TRAPD and only when +User::Leave is defined in terms of THROW. + +@return A pointer to the current thread's pre-existing trap handler, if any. + NULL, if no pre-existing trap handler is set. + +@see TRAP +@see TRAPD +*/ + { + + TTrapHandler* pH = GetTrapHandler(); + if (pH) + pH->Trap(); + return pH; + } + +EXPORT_C void User::UnMarkCleanupStack(TTrapHandler* aHandler) +/** +If passed a non-null TTrapHandler unmarks the cleanup stack. + +Only intended for use in the defintion of TRAP and TRAPD and only when +User::Leave is defined in terms of THROW. + +@see TRAP +@see TRAPD +*/ + { + + if (aHandler) + aHandler->UnTrap(); + } + +#endif + +#ifndef __TOOLS2__ +EXPORT_C TInt User::Beep(TInt aFrequency,TTimeIntervalMicroSeconds32 aDuration) +/** +Makes a beep tone with a specified frequency and duration. + +This function should not be used. It exists to maintain compatibility with +older versions of Symban OS. +*/ + { + + return Exec::HalFunction(EHalGroupSound,ESoundHalBeep,(TAny*)aFrequency,(TAny*)aDuration.Int()); + } + + + + +// Unused, exists only for BC reasons +EXPORT_C TInt UserSvr::HalGet(TInt, TAny*) + { + return KErrNotSupported; + } + +// Unused, exists only for BC reasons +EXPORT_C TInt UserSvr::HalSet(TInt, TAny*) + { + return KErrNotSupported; + } + +EXPORT_C TInt UserSvr::HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2) + { + + return Exec::HalFunction(aGroup, aFunction, a1, a2); + } + +EXPORT_C TInt UserSvr::HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2, TInt aDeviceNumber) + { + + return Exec::HalFunction(aGroup | (aDeviceNumber<<16), aFunction, a1, a2); + } + +/** +@capability WriteDeviceData +*/ +EXPORT_C TInt UserSvr::SetMemoryThresholds(TInt aLowThreshold, TInt aGoodThreshold) + { + return Exec::SetMemoryThresholds(aLowThreshold,aGoodThreshold); + } + +/** +@deprecated +@internalAll +@return EFalse +*/ +EXPORT_C TBool UserSvr::IpcV1Available() + { + return EFalse; + } + + + +EXPORT_C void User::SetDebugMask(TUint32 aVal) +/** +Sets the debug mask. + +@param aVal A set of bit values as defined in nk_trace.h +*/ + { + Exec::SetDebugMask(aVal); + } + +EXPORT_C void User::SetDebugMask(TUint32 aVal, TUint aIndex) +/** +Sets the debug mask at the given index + +@param aVal A set of bit values as defined in nk_trace.h +@param aIndex An index of which 32 bit mask word is to be accessed +*/ + { + Exec::SetDebugMaskIndex(aVal, aIndex); + } + + +/** +Gets machine information. + +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead. +*/ +EXPORT_C TInt UserHal::MachineInfo(TDes8& anInfo) + { + TInt bufLength=anInfo.MaxLength(); + __ASSERT_ALWAYS(bufLength==sizeof(TMachineInfoV2) || bufLength==sizeof(TMachineInfoV1),Panic(ETDes8BadDescriptorType)); + + // assemble a TMachineInfoV1 buffer + TMachineInfoV2* info=&((TMachineInfoV2Buf&)anInfo)(); + // Variant stuff + TVariantInfoV01Buf infoBuf; + TInt r = Exec::HalFunction(EHalGroupVariant, EVariantHalVariantInfo, (TAny*)&infoBuf, NULL); + if (KErrNone != r) return r; // must always be implemented! + TVariantInfoV01& variantInfo = infoBuf(); + + info->iRomVersion=variantInfo.iRomVersion; + info->iMachineUniqueId=variantInfo.iMachineUniqueId; + info->iLedCapabilities=variantInfo.iLedCapabilities; + info->iProcessorClockInKHz=variantInfo.iProcessorClockInKHz; + info->iSpeedFactor=variantInfo.iSpeedFactor; + + // Video driver stuff + TVideoInfoV01Buf vidinfoBuf; + r = Exec::HalFunction(EHalGroupDisplay, EDisplayHalCurrentModeInfo, (TAny*)&vidinfoBuf, NULL); + if (KErrNone == r) + { + TVideoInfoV01& vidinfo = vidinfoBuf(); + info->iDisplaySizeInPixels=vidinfo.iSizeInPixels; + info->iPhysicalScreenSize=vidinfo.iSizeInTwips; + } + else // no display driver + { + info->iDisplaySizeInPixels.iWidth=0; + info->iDisplaySizeInPixels.iHeight=0; + info->iPhysicalScreenSize.iWidth=0; + info->iPhysicalScreenSize.iHeight=0; + } + TInt colors = 0; + r = Exec::HalFunction(EHalGroupDisplay, EDisplayHalColors, &colors, NULL); + info->iMaximumDisplayColors=(KErrNone == r)?colors:0; + TInt val; + info->iBacklightPresent= (KErrNone == Exec::HalFunction(EHalGroupDisplay, EDisplayHalBacklightOn, &val, NULL)); + + // Pointing device stuff + TDigitiserInfoV01Buf xyinfoBuf; + r = Exec::HalFunction(EHalGroupDigitiser, EDigitiserHalXYInfo, (TAny*)&xyinfoBuf, NULL); + if (KErrNone == r) + { + info->iXYInputType=EXYInputPointer; // XY is Digitiser + TDigitiserInfoV01& xyinfo = xyinfoBuf(); + info->iXYInputSizeInPixels=xyinfo.iDigitiserSize; + info->iOffsetToDisplayInPixels=xyinfo.iOffsetToDisplay; + } + else + { + TMouseInfoV01Buf mouseinfoBuf; + r = Exec::HalFunction(EHalGroupMouse, EMouseHalMouseInfo, (TAny*)&mouseinfoBuf, NULL); + if (KErrNone == r) + { + info->iXYInputType=EXYInputMouse; // XY is Mouse + TMouseInfoV01& mouseinfo = mouseinfoBuf(); + info->iXYInputSizeInPixels=mouseinfo.iMouseAreaSize; + info->iOffsetToDisplayInPixels=mouseinfo.iOffsetToDisplay; + } + else + { + info->iXYInputType=EXYInputNone; // no XY + info->iXYInputSizeInPixels.iWidth=0; + info->iXYInputSizeInPixels.iHeight=0; + info->iOffsetToDisplayInPixels.iX=0; + info->iOffsetToDisplayInPixels.iY=0; + } + } + + // Keyboard stuff + TKeyboardInfoV01Buf kbdinfoBuf; + info->iKeyboardPresent= (KErrNone == Exec::HalFunction(EHalGroupKeyboard, EKeyboardHalKeyboardInfo, (TAny*)&kbdinfoBuf, NULL)); + + // Unused, obsolete parameters + info->iKeyboardId=0; + info->iDisplayId=0; + if(bufLength==sizeof(TMachineInfoV2)) + { + // assemble a TMachineInfoV2 buffer + info->iLanguageIndex=0; + info->iKeyboardIndex=0; + } + + anInfo.SetLength(bufLength); + + return KErrNone; + } + +/** +Gets memory information. + +@see HAL::Get() + +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead with attributes EMemoryRAM, EMemoryRAMFree or EMemoryROM. +*/ +EXPORT_C TInt UserHal::MemoryInfo(TDes8& anInfo) + { + return Exec::HalFunction(EHalGroupKernel,EKernelHalMemoryInfo,(TAny*)&anInfo,NULL); + } + +/** +Gets ROM configuration information. + +@publishedPartner +@deprecated No replacement. +*/ +EXPORT_C TInt UserHal::RomInfo(TDes8& anInfo) + { + return Exec::HalFunction(EHalGroupKernel,EKernelHalRomInfo,(TAny*)&anInfo,NULL); + } + + + + +/** +Gets drive information. + +@param anInfo A package buffer (TPckgBuf) containing a TDriveInfoV1 structure. + On return, this structure will contain the drive information. + +@return KErrNone + +@see TDriveInfoV1Buf +@see TDriveInfoV1 +@see TPckgBuf +*/ +EXPORT_C TInt UserHal::DriveInfo(TDes8& anInfo) + { + TDriveInfoV1Buf8 anInfo8; + TInt r = Exec::HalFunction(EHalGroupMedia,EMediaHalDriveInfo,(TAny*)&anInfo8,NULL); + TDriveInfoV18& driveInfo8 = anInfo8(); + TDriveInfoV1* driveInfo = NULL; + switch(((SBuf8*)&anInfo)->length>>KShiftDesType8) //type + { + case EPtr: + driveInfo = &((TPckg&)anInfo)(); + break; + case EBuf: + driveInfo = &((TDriveInfoV1Buf&)anInfo)(); + break; + default: + __ASSERT_ALWAYS(EFalse,Panic(ETDes8BadDescriptorType)); + } + + // A compile time assert to make sure that this function is examined if TDriveInfoV1 + // structure changes + extern int TDriveInfoV1_structure_assert[( + _FOFF(TDriveInfoV1,iRegisteredDriveBitmask)+4 == sizeof(TDriveInfoV1) + && + sizeof(TDriveInfoV1) == 816 + )?1:-1]; + (void)TDriveInfoV1_structure_assert; + + // Set length to size of old EKA1 TDriveInfoV1 (Will Panic if not big enough) + TInt len = (TUint)_FOFF(TDriveInfoV1,iRegisteredDriveBitmask); + anInfo.SetLength(len); + + // Fill in info for old EKA1 TDriveInfoV1 + driveInfo->iTotalSupportedDrives = driveInfo8.iTotalSupportedDrives; + driveInfo->iTotalSockets = driveInfo8.iTotalSockets; + driveInfo->iRuggedFileSystem = driveInfo8.iRuggedFileSystem; + TInt index; + for(index=0;indexiDriveName[index].Copy(driveInfo8.iDriveName[index]); + for(index=0;indexiSocketName[index].Copy(driveInfo8.iSocketName[index]); + + // If anInfo is big enough then set new EKA2 members of TDriveInfoV1 + if((TUint)anInfo.MaxLength()>=(TUint)sizeof(TDriveInfoV1)) + { + anInfo.SetLength(sizeof(TDriveInfoV1)); + driveInfo->iRegisteredDriveBitmask = driveInfo8.iRegisteredDriveBitmask; + } + return r; + } + + + + +/** +Gets the startup reason. + +@see HAL::Get() + +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead with attributes ESystemStartupReason. +*/ +EXPORT_C TInt UserHal::StartupReason(TMachineStartupType& aReason) + { + return Exec::HalFunction(EHalGroupKernel,EKernelHalStartupReason,(TAny*)&aReason,NULL); + } + + + + +/** +Gets the reason why the kernel last faulted. + +@param aReason An integer that, on return, contains the reason code describing + why the kernel faulted. This is the fault number passed + in a call to Kern::Fault(). + +@return KErrNone + +@see Kern::Fault() +*/ +EXPORT_C TInt UserHal::FaultReason(TInt &aReason) + { + + return Exec::HalFunction(EHalGroupKernel,EKernelHalFaultReason,(TAny *)&aReason,NULL); + } + + + + +/** +Gets the exception Id that describes the type of fault when +the kernel last faulted. + +The Id is the value contained in TArmExcInfo::iExcCode. + +@param anId An integer that, on return, contains the exception Id. + +@return KErrNone + +@see TArmExcInfo::iExcCode +@see TArmExcInfo +*/ +EXPORT_C TInt UserHal::ExceptionId(TInt &anId) + { + + return Exec::HalFunction(EHalGroupKernel,EKernelHalExceptionId, (TAny *)&anId, NULL); + } + + + +/** +Gets the available exception information that describes the last kernel fault. + +@param aInfo A TExcInfo structure that, on return, contains the available + exception information. + +@return KErrNone + +@see TExcInfo +*/ +EXPORT_C TInt UserHal::ExceptionInfo(TExcInfo &aInfo) + { + + return Exec::HalFunction(EHalGroupKernel,EKernelHalExceptionInfo, (TAny *)&aInfo, NULL); + } + + + + +/** +Gets the page size for this device. + +@param anId An integer that, on return, contains the page size, in bytes, + for this device. + +@return KErrNone +*/ +EXPORT_C TInt UserHal::PageSizeInBytes(TInt& aSize) + { + + return Exec::HalFunction(EHalGroupKernel,EKernelHalPageSizeInBytes,(TAny*)&aSize,NULL); + } + + + + +/** +Switches the device off. + +@return KErrNone, if successful; KErrPermissionDenied, if the calling process + has insufficient capability. + +@capability PowerMgmt +*/ +EXPORT_C TInt UserHal::SwitchOff() + { + if(!RProcess().HasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by UserHal::SwitchOff"))) + return KErrPermissionDenied; + TInt r = Power::EnableWakeupEvents(EPwStandby); + if(r!=KErrNone) + return r; + TRequestStatus s; + Power::RequestWakeupEventNotification(s); + Power::PowerDown(); + User::WaitForRequest(s); + return s.Int(); +// return Exec::HalFunction(EHalGroupPower,EPowerHalSwitchOff,NULL,NULL); + } + + + + +/** +Sets the calibration data for the digitiser (i.e. XY) input device. + +@param aCalibration The calibration data. + +@return KErrNone, if successful; KErrPermissionDenied, if the calling process + has insufficient capability. + +@see TDigitizerCalibration + +@capability WriteDeviceData +*/ +EXPORT_C TInt UserHal::SetXYInputCalibration(const TDigitizerCalibration& aCalibration) + { + return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalSetXYInputCalibration,(TAny*)&aCalibration,NULL); + } + + + + +/** +Gets the points on the display that the user should point to in order +to calibrate the digitiser (i.e. XY) input device. + +@param aCalibration A TDigitizerCalibration object that, on return, contains + the appropriate information. + +@return KerrNone, if successful; otherwise one of the other system wide + error codes. +*/ +EXPORT_C TInt UserHal::CalibrationPoints(TDigitizerCalibration& aCalibration) + { + + return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalCalibrationPoints,(TAny*)&aCalibration,NULL); + } + + + + +/** +Gets the platform tick period. + +@param aTime The tick period in microseconds. + +@return KErrNone, if successful; otherwise one of the other system wide + error codes. +*/ +EXPORT_C TInt UserHal::TickPeriod(TTimeIntervalMicroSeconds32 &aTime) + { + + return Exec::HalFunction(EHalGroupKernel,EKernelHalTickPeriod,(TAny*)&aTime,NULL); + } + + + +/** +Saves the current digitiser (i.e. XY) input device calibration data. + +@return KErrNone, if successful; otherwise one of the other system wide + error codes, e.g. KErrNotSupported. +*/ +EXPORT_C TInt UserHal::SaveXYInputCalibration() + { + + return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalSaveXYInputCalibration,NULL,NULL); + } + + + + +/** +Restores the digitiser (i.e. XY) input device calibration data. + +@param aType A TDigitizerCalibration object that, on return, contains + the calibration data. + +@return KErrNone, if successful; KErrPermissionDenied, if the calling process + has insufficient capability; otherwise one of the other system wide + error codes, e.g. KErrNotSupported. + +@capability WriteDeviceData +*/ +EXPORT_C TInt UserHal::RestoreXYInputCalibration(TDigitizerCalibrationType aType) + { + return Exec::HalFunction(EHalGroupDigitiser,EDigitiserHalRestoreXYInputCalibration,(TAny*)aType,NULL); + } + + + + +/** +Gets the machine configuration. + +@param aConfig On return contains the machine configuration data. +@param aSize On return, contains the size of the data. + +@return KErrNone, if sucessful, otherwise one of the other system-wide + error codes. + +@capability ReadDeviceData +*/ +EXPORT_C TInt User::MachineConfiguration(TDes8& aConfig,TInt& aSize) + { + return(Exec::MachineConfiguration(aConfig,aSize)); + } +#endif // __TOOLS2__ + + + +EXPORT_C TInt RDebug::Print(TRefByValue aFmt,...) +// +// Print to the comms port +// + { + + TestOverflowTruncate overflow; + VA_LIST list; + VA_START(list,aFmt); + TBuf<0x100> buf; + buf.AppendFormatList(aFmt,list,&overflow); +#ifdef _UNICODE + TPtr8 p(buf.Collapse()); + Exec::DebugPrint((TAny*)&p, 0); +#else + Exec::DebugPrint((TAny*)&buf, 0); +#endif + return 0; + } + +class TestOverflowTruncate8 : public TDes8Overflow + { +public: + virtual void Overflow(TDes8& /*aDes*/) {} + }; + +EXPORT_C void RDebug::Printf(const char* aFmt, ...) +// +// Print to the comms port +// + { + + TestOverflowTruncate8 overflow; + VA_LIST list; + VA_START(list,aFmt); + TPtrC8 fmt((const TText8*)aFmt); + TBuf8<0x100> buf; + buf.AppendFormatList(fmt,list,&overflow); + Exec::DebugPrint((TAny*)&buf, 0); + } + +EXPORT_C void RDebug::RawPrint(const TDesC8& aDes) + { + Exec::DebugPrint((TAny*)&aDes, 1); + } + +EXPORT_C void RDebug::RawPrint(const TDesC16& aDes) +// +// Print to the comms port +// + { + TBuf8<0x100> aDes8; + if(aDes.Length()>0x100) + { + TPtrC ptr(aDes.Ptr(), 0x100); + aDes8.Copy(ptr); + } + else + aDes8.Copy(aDes); + Exec::DebugPrint((TAny*)&aDes8, 1); + } + +EXPORT_C TUint32 Math::Random() +/** +Gets 32 random bits from the kernel's random pool. + +@return The 32 random bits. +*/ + { + + return Exec::MathRandom(); + } + + +#ifndef __TOOLS2__ +EXPORT_C void User::IMB_Range(TAny* aStart, TAny* aEnd) +/** +Does the necessary preparations to guarantee correct execution of code in the +specified virtual address range. + +The function assumes that this code has been loaded or modified by user code. +Calling this function against uncommitted memory region is considered as S/W +bug and may generate exception on some memory models. + +The specified addresses are associated with a user writable code chunk as +created by RChunk::CreateLocalCode(). + +The function cleans the data cache to ensure that written data has been +committed to main memory and then flushes the instruction cache and branch +target buffer (BTB) to ensure that the code is loaded from main memory when +it is executed. +The Kernel uses the size of the range specified to decide whether to clean/flush +line-by-line or to simply clean/flush the entire cache. + +@param aStart The start virtual address of the region. +@param aEnd The end virtual address of the region. This location is not within + the region. + +@see RChunk::CreateLocalCode() +@see UserHeap::ChunkHeap() +*/ + { + + Exec::IMB_Range(aStart,(TUint32)aEnd-(TUint32)aStart); + } + + + + +/** +Sets the specified handle into the specified environment data slot +for this process. + +The APPARC framework (class CApaApplication etc.) uses some of the slots internally, +so programs that use this framework should ensure that they only use slots available +for public use. + +@param aSlot An index that identifies the environment data slot. + This is a value relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15. +@param aHandle The handle to be passed to this process. + +@return KErrNone, always. + +@panic KERN-EXEC 46 if this function is called by a thread running + in a process that is not the creator of this process, or + the handle is not local. +@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to + the value of KArgIndex. +@panic KERN-EXEC 52 if the specified slot is already in use. + +@see CApaApplication +@see CApaCommandLine::EnvironmentSlotForPublicUse() +*/ +EXPORT_C TInt RProcess::SetParameter(TInt aSlot, RHandleBase aHandle) + { + return Exec::ProcessSetHandleParameter(iHandle, aSlot, aHandle.Handle()); + } + + + + +/** +Sets the specified 16-bit descriptor data into the specified environment +data slot for this process. + +The APPARC framework (class CApaApplication etc.) uses some of the slots internally, +so programs that use this framework should ensure that they only use slots available +for public use. + +@param aSlot An index that identifies the environment data slot. + This is a value relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15. +@param aDes The 16-bit descriptor containing data be passed to this process. + +@return KErrNone, if successful, otherwise one of the other system + wide error codes. + +@panic KERN-EXEC 46 if this function is called by a thread running + in a process that is not the creator of this process. +@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to + the value of KArgIndex. +@panic KERN-EXEC 52 if the specified slot is already in use. +@panic KERN-EXEC 53 if the length of data passed is negative. + +@see CApaApplication +@see CApaCommandLine::EnvironmentSlotForPublicUse() +*/ +EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const TDesC16& aDes) + { + return Exec::ProcessSetDataParameter(iHandle, aSlot, (const TUint8*)aDes.Ptr(), 2*aDes.Length()); + } + + + + +/** +Sets the specified 8-bit descriptor data into the specified environment +data slot for this process. + +The APPARC framework (class CApaApplication etc.) uses some of the slots internally, +so programs that use this framework should ensure that they only use slots available +for public use. + +@param aSlot An index that identifies the environment data slot. + This is a value relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15. +@param aDes The 8-bit descriptor containing data be passed to this process. + +@return KErrNone, if successful, otherwise one of the other system + wide error codes. + +@panic KERN-EXEC 46 if this function is called by a thread running + in a process that is not the creator of this process. +@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to + the value of KArgIndex. +@panic KERN-EXEC 52 if the specified slot is already in use. +@panic KERN-EXEC 53 if the length of data passed is negative. + +@see CApaApplication +@see CApaCommandLine::EnvironmentSlotForPublicUse() +*/ +EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const TDesC8& aDes) + { + return Exec::ProcessSetDataParameter(iHandle, aSlot, aDes.Ptr(), aDes.Length()); + } + + + + +/** +Sets the specfied sub-session into the specified environment +data slot for this process. + +The APPARC framework (class CApaApplication etc.) uses some of the slots internally, +so programs that use this framework should ensure that they only use slots available +for public use. + +@param aSlot An index that identifies the environment data slot. + This is a value relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15. +@param aSession The sub-session. + +@return KErrNone, if successful, otherwise one of the other system + wide error codes. + +@panic KERN-EXEC 46 if this function is called by a thread running + in a process that is not the creator of this process. +@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to + the value of KArgIndex. +@panic KERN-EXEC 52 if the specified slot is already in use. +@panic KERN-EXEC 53 if the length of data passed is negative. + +@see CApaApplication +@see CApaCommandLine::EnvironmentSlotForPublicUse() +*/ +EXPORT_C TInt RProcess::SetParameter(TInt aSlot, const RSubSessionBase& aSession) + { + TInt handle = aSession.SubSessionHandle(); + return Exec::ProcessSetDataParameter(iHandle, aSlot, (const TUint8*)&handle, sizeof(handle)); + } + + + + +/** +Sets the specfied integer value into the specified environment +data slot for this process. + +The APPARC framework (class CApaApplication etc.) uses some of the slots internally, +so programs that use this framework should ensure that they only use slots available +for public use. + +@param aSlot An index that identifies the environment data slot. + This is a value relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15. +@param aData The integer value. + +@return KErrNone, if successful, otherwise one of the other system + wide error codes. + +@panic KERN-EXEC 46 if this function is called by a thread running + in a process that is not the creator of this process. +@panic KERN-EXEC 51 if aSlot is negative or is greater than or equal to + the value of KArgIndex. +@panic KERN-EXEC 52 if the specified slot is already in use. +@panic KERN-EXEC 53 if the length of data passed is negative. + +@see CApaApplication +@see CApaCommandLine::EnvironmentSlotForPublicUse() +*/ +EXPORT_C TInt RProcess::SetParameter(TInt aSlot, TInt aData) + { + return Exec::ProcessSetDataParameter(iHandle, aSlot, (TUint8*)&aData, sizeof(aData)); + } + + + + +EXPORT_C TInt User::GetTIntParameter(TInt aSlot, TInt& aData) +/** +Gets the specified environment data item belonging to the +current process; this is assumed to be a 32 bit value. + +Environment data may be stored in the process and is passed to a child process +on creation of that child process. + +On successful return from this function, the data item is deleted from +the process. + +@param aSlot An index that identifies the data item. + This is an index whose value is relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15, i.e. there are 16 slots. + +@param aData On sucessful return, contains the environment data item. + +@return KErrNone, if successful; + KErrNotFound, if there is no data; + KErrArgument, if the data is not binary data, or the data item in the + process is longer than 32 bits. + +@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16. +*/ + { + TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)&aData, sizeof(TInt)); + if (ret < 0) + return ret; + return KErrNone; + } + + + + +EXPORT_C TInt User::ParameterLength(TInt aSlot) +/** +Gets the length of the specified item of environment data belonging to the +current process. + +Environment data may be stored in the process and is passed to a child process +on creation of that child process. + +@param aSlot An index that identifies the data item whose length is to be + retrieved. This is an index whose value is relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15, i.e. there are 16 slots. + +@return KErrNotFound, if there is no data; + KErrArgument, if the data is not binary data; + The length of the data item. + +@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16. +*/ + { + TInt ret = Exec::ProcessDataParameterLength(aSlot); + return ret; + } + + + + +EXPORT_C TInt User::GetDesParameter(TInt aSlot, TDes8& aDes) +/** +Gets the specified environment data item belonging to the +current process; this is assumed to be an 8-bit descriptor. + +Environment data may be stored in the process and is passed to a child process +on creation of that child process. + +On successful return from this function, the data item is deleted from +the process. + +@param aSlot An index that identifies the data item. + This is an index whose value is relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15, i.e. there are 16 slots. + +@param aDes On sucessful return, contains the environment data item; the + length of the descriptor is set to the length of the data item. + +@return KErrNone, if successful; + KErrNotFound, if there is no data; + KErrArgument, if the data is not binary data, or the data item in the + process is longer than the maximum length of aDes. + +@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16. +*/ + { + TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)aDes.Ptr(), aDes.MaxLength()); + if (ret < 0) + return ret; + aDes.SetLength(ret); + return KErrNone; + } + + + + +EXPORT_C TInt User::GetDesParameter(TInt aSlot, TDes16& aDes) +/** +Gets the specified environment data item belonging to the +current process; this is assumed to be an 16-bit descriptor. + +Environment data may be stored in the process and is passed to a child process +on creation of that child process. + +On successful return from this function, the data item is deleted from +the process. + +@param aSlot An index that identifies the data item. + This is an index whose value is relative to zero; + i.e. 0 is the first item/slot. + This can range from 0 to 15, i.e. there are 16 slots. + +@param aDes On sucessful return, contains the environment data item; the + length of the descriptor is set to the length of the data item. + +@return KErrNone, if successful; + KErrNotFound, if there is no data; + KErrArgument, if the data is not binary data, or the data item in the + process is longer than the maximum length of aDes. + +@panic KERN-EXEC 51, if aSlot is negative or is greater than or equal to 16. +*/ + { + TInt ret = Exec::ProcessGetDataParameter(aSlot, (TUint8*)aDes.Ptr(), 2*aDes.MaxLength()); + if (ret < 0) + return ret; + aDes.SetLength(ret/2); + return KErrNone; + } + +/** +Gets the linear address of the exception descriptor for the code module in which +a specified code address resides. + +@param aCodeAddress The code address in question. +@return The address of the exception descriptor, or zero if there is none. + +*/ +EXPORT_C TLinAddr UserSvr::ExceptionDescriptor(TLinAddr aCodeAddress) + { + return Exec::ExceptionDescriptor(aCodeAddress); + } + +EXPORT_C TInt User::SetFloatingPointMode(TFloatingPointMode aMode, TFloatingPointRoundingMode aRoundingMode) +/** +Sets the hardware floating point mode for the current thread. This does not affect +software floating point calculations. The rounding mode can also be set. New threads created +by this thread will inherit the mode, thus to set the mode for a whole process, call this +method before you create any new threads. + +@param aMode The floating point calculation mode to use. +@param aRoundingMode The floating point rounding mode to use, defaults to nearest. + +@return KErrNone if successful, KErrNotSupported if the hardware does not support the + chosen mode, or there is no floating point hardware present. + +@see TFloatingPointMode +@see TFloatingPointRoundingMode +*/ + { + return(Exec::SetFloatingPointMode(aMode, aRoundingMode)); + } + + +EXPORT_C TUint32 E32Loader::PagingPolicy() +/** + Accessor function returns the code paging policy, as defined at ROM build time. + + @return Paging policy only. This function applies + EKernelConfigPagingPolicyMask to the config flags + before returning the value. + */ + { + return Exec::KernelConfigFlags() & EKernelConfigPagingPolicyMask; + } + + +/** Queue a notifier to detect system idle + +@internalTechnology +@prototype +*/ +EXPORT_C void User::NotifyOnIdle(TRequestStatus& aStatus) + { + aStatus = KRequestPending; + Exec::NotifyOnIdle(&aStatus); + } + + +/** Cancel a miscellaneous notification requested by this thread + +Cancels a currently outstanding notification for system idle or object +deletion. + +@internalTechnology +@prototype +*/ +EXPORT_C void User::CancelMiscNotifier(TRequestStatus& aStatus) + { + Exec::CancelMiscNotifier(&aStatus); + } + + +/** Queue a notifier to detect destruction of this object + +To cancel the notifier, use User::CancelMiscNotifier(). + +@internalTechnology +@prototype +*/ +EXPORT_C void RHandleBase::NotifyDestruction(TRequestStatus& aStatus) + { + aStatus = KRequestPending; + Exec::NotifyObjectDestruction(iHandle, &aStatus); + } + +#else // __TOOLS2__ + +#ifdef _DEBUG +// The following are for simulating heap failure +TInt gAllocCount = 0; +TInt gAllocFailRate = 0; +RAllocator::TAllocFail gAllocFailType = RAllocator::ENone; +#endif + +EXPORT_C void User::__DbgMarkStart(TBool aKernel) + { + } + +EXPORT_C TUint32 User::__DbgMarkEnd(TBool aKernel, TInt aCount) + { + return 0; + } + +EXPORT_C void User::__DbgSetAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TInt aRate) + { +#ifdef _DEBUG + gAllocFailType = aFail; + + switch (gAllocFailType) + { + case RAllocator::EFailNext: + gAllocFailRate = gAllocCount + aRate; + break; + case RAllocator::EDeterministic: + gAllocCount = 0; + gAllocFailRate = aRate; + break; + default: + break; + } +#endif + } + +EXPORT_C void User::__DbgMarkCheck(int, int, int, unsigned char const*, int) + { + } + +EXPORT_C void RHandleBase::Close() + { + } + +#endif // __TOOLS2__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_func.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_func.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2072 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_func.cpp +// +// + +#ifdef __TOOLS2__ +#include +#include +#endif + +#include "us_std.h" +//#define __DEBUG_IMAGE__ 1 +#if defined(__DEBUG_IMAGE__) && defined (__EPOC32__) +#include "e32svr.h" +#define __IF_DEBUG(t) {RDebug debug;debug.t;} +#else +#define __IF_DEBUG(t) +#endif +#ifdef _UNICODE +#include +#include "compareimp.h" +#endif + +#include "us_data.h" + +typedef union + { + TAny *tany; + TText8 *ttext8; + TText16 *ttext16; + TDesC8 *tdesc8; + TDesC16 *tdesc16; + TInt8 *tint8; + TInt16 *tint16; + TInt32 *tint32; + TInt64 *tint64; + TInt *tint; + TUint8 *tuint8; + TUint16 *tuint16; + TUint32 *tuint32; + TUint *tuint; + } UPTR; + +const TUint crcTab[256] = + { + 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a, + 0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294, + 0x72f7,0x62d6,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,0x2462, + 0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,0xa56a,0xb54b,0x8528,0x9509, + 0xe5ee,0xf5cf,0xc5ac,0xd58d,0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695, + 0x46b4,0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,0x48c4,0x58e5, + 0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948, + 0x9969,0xa90a,0xb92b,0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12, + 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,0x6ca6,0x7c87,0x4ce4, + 0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b, + 0x8d68,0x9d49,0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,0xff9f, + 0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,0x9188,0x81a9,0xb1ca,0xa1eb, + 0xd10c,0xc12d,0xf14e,0xe16f,0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046, + 0x6067,0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,0x02b1,0x1290, + 0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e, + 0xe54f,0xd52c,0xc50d,0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405, + 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,0x26d3,0x36f2,0x0691, + 0x16b0,0x6657,0x7676,0x4615,0x5634,0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9, + 0xb98a,0xa9ab,0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,0xcb7d, + 0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,0x4a75,0x5a54,0x6a37,0x7a16, + 0x0af1,0x1ad0,0x2ab3,0x3a92,0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8, + 0x8dc9,0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,0xef1f,0xff3e, + 0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,0x6e17,0x7e36,0x4e55,0x5e74,0x2e93, + 0x3eb2,0x0ed1,0x1ef0 + }; + +const TInt KQDepth=150; // Maximum queue depth + +LOCAL_C TUint checkSum(const TAny *aPtr) +// +// Checksum every other byte +// + { + + const TUint8* pB=(const TUint8*)aPtr; + const TUint8* pE=pB+(KMaxCheckedUid*sizeof(TUid)); + TUint8 buf[(KMaxCheckedUid*sizeof(TUid))>>1]; + TUint8* pT=(&buf[0]); + while (pB>1); + return(crc); + } + +LOCAL_C TInt partit(TInt n,TInt m,const TKey &aKey,const TSwap &aSwap) +// +// Partition n elements of array stating from element m, +// return element no. of partition point. +// + { + + TInt i=m-1; + TInt j=i+n; + TInt pivlin=j; + aSwap.Swap((j+m)>>1,j); + while (ii;j--) + { + if (aKey.Compare(j,pivlin)<=0) + break; + } + if (i gLocale; +extern TBool gLocalSet; +#endif + +static const TCollationMethod TheCollationMethod[] = + { + { + KUidBasicCollationMethod, // this is the standard unlocalised method + NULL, // null means use the standard table + NULL, // there's no override table + 0 // the flags are standard + } + }; + +static const TCollationDataSet TheCollationDataSet = + { + TheCollationMethod, + 1 + }; + +// The one and only locale character set object. +const LCharSet TheCharSet = + { + NULL, + &TheCollationDataSet + }; + +const LCharSet* GetLocaleDefaultCharSet() + { + return &TheCharSet; + } + +const LCharSet* GetLocaleCharSet() + { +#ifndef __TOOLS2__ + const LCharSet* charSet = (const LCharSet*)Exec::GetGlobalUserData(ELocaleDefaultCharSet); +#else + const LCharSet* charSet = gLocale().GetDefaultCharSet(); +#endif // __TOOLS2__ + if(charSet) + return charSet; + return &TheCharSet; + } + +const LCharSet* GetLocalePreferredCharSet() + { +#ifndef __TOOLS2__ + const LCharSet* charSet = (const LCharSet*)Exec::GetGlobalUserData(ELocalePreferredCharSet); +#else + const LCharSet* charSet = gLocale().GetPreferredCharSet(); +#endif // __TOOLS2__ + if(charSet) + return charSet; + return &TheCharSet; + } + +EXPORT_C TCollationMethod TExtendedLocale::GetPreferredCollationMethod(TInt aIndex) +/** +Get the preferred collation method for the preferred charset. + +Note that some charsets may contain more than one collation +method (e.g "dictionary" v "phonebook" ordering) so an optional +index parameter can be used to select between them. + +@param aIndex Optional parameter specifying the index of the collation + method in the locale to get. This is the responsibility of + the caller to make sure that the index is less than the total + number of collation methods in the preferred charset in this locale. + +@return TCollationMethod representing the requested collation method. + +@panic USER 185 In both debug and release builds, if either the current charset + is not set up or aIndex is greater than or equal to the total number of + collation methods in the preferred charset in this locale. + +@see TCollationMethod +*/ + { + __ASSERT_ALWAYS(iPreferredCharSet && (TUint(aIndex)<=TUint(iPreferredCharSet->iCollationDataSet->iMethods)), Panic(EBadLocaleParameter)); + return iPreferredCharSet->iCollationDataSet->iMethod[aIndex]; + } + +extern const TUint8 __FoldCollTab8[256]; + +EXPORT_C TInt Mem::CompareF(const TUint8 *aLeft,TInt aLeftL,const TUint8 *aRight,TInt aRightL) +/** +Compares a block of data at one specified location with a block of data at +another specified location, using the standard folding method appropriate +to the current locale. + +@param aLeft A pointer to the first (or left) block of 8 bit data to be + compared. +@param aLeftL The length of the first (or left) block of data to be compared, + i.e. the number of bytes. +@param aRight A pointer to the second (or right) block of 8 bit data to be + compared. +@param aRightL The length of the second (or right) block of data to be + compared, i.e. the number of bytes. + +@return Positive, if the first (or left) block of data is greater than the + second (or right) block of data. + Negative, if the first (or left) block of data is less than the second + (or right) block of data. + Zero, if both the first (or left) and second (or right) blocks of data + have the same length and the same content. + +@see Mem::Compare +*/ + { + + __ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative)); + __ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative)); + const TUint8 *pE=aLeft+Min(aLeftL,aRightL); + const TUint8* table=__FoldCollTab8; + while (aLeft=0,Panic(EMemLeftNegative)); + __ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative)); + const TUint16 *pE=aLeft+Min(aLeftL,aRightL); + while (aLeft= 0,Panic(EMemLeftNegative)); + __ASSERT_DEBUG(aRightL >= 0,Panic(EMemRightNegative)); + + const TText16* aLeftEnd = aLeft + aLeftL; + const TText16* aRightEnd = aRight + aRightL; + + const TUint8* table=__FoldCollTab8; + + while (aLeft != aLeftEnd) + { + if (aRight == aRightEnd) + return 1; + + TUint l = *aLeft; + TUint r = *aRight; + + // check if character is Ascii, if so treat as Ascii + if (l < 128 && r < 128) + { + l = table[l]; + r = table[r]; + + if (r != l) + return l-r; + + aLeft++; + aRight++; + } + // covers Unicode characters... + else + { + TUTF32Iterator leftIt(aLeft, aLeftEnd); + TUTF32Iterator rightIt(aRight, aRightEnd); + return ::CompareFolded(leftIt, rightIt); + } + } + + return aRight == aRightEnd? 0:-1; + } + + + + + +EXPORT_C TInt Mem::CompareC(const TUint16 *aLeft,TInt aLeftL,const TUint16 *aRight,TInt aRightL) +/** +Compares a block of data at one specified location with a block of data at +another specified location using the standard collation method appropriate +to the current locale. + +@param aLeft A pointer to the first (or left) block of 16 bit data to be + compared. +@param aLeftL The length of the first (or left) block of data to be compared + i.e. the number of double-bytes). +@param aRight A pointer to the second (or right) block of 16 bit data to be + compared. +@param aRightL The length of the second (or right) block of data to be compared + i.e. the number of double-bytes. + +@return Positive, if the first (or left) block of data is greater than the + second (or right) block of data. + Negative, if the first (or left) block of data is less than the second + (or right) block of data. + Zero, if both the first (or left) and second (or right) blocks of data + have the same length and the same content. + +@see Mem::Compare +*/ + { + __ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative)); + __ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative)); +#ifdef _UNICODE + TCollate c(GetLocaleCharSet()); + return c.Compare(aLeft,aLeftL,aRight,aRightL); +#else + const TUint16 *pE=aLeft+Min(aLeftL,aRightL); + while (aLeft=0,Panic(EMemLeftNegative)); + __ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative)); + if (aCollationMethod == NULL) + { + TCollate c(GetLocaleCharSet()); + return c.Compare(aLeft,aLeftL,aRight,aRightL,aMaxLevel); + } + else + { + TCollate c(*aCollationMethod); + return c.Compare(aLeft,aLeftL,aRight,aRightL,aMaxLevel); + } + } +#endif + + + + +#ifdef _UNICODE +EXPORT_C TInt Mem::CollationMethods() +/** +Gets the number of collation methods in this locale. + +This function is only defined for 16 bit (Unicode) build variants. This means +that the function is not defined for 8 bit build variants, even when an +explicit 16 bit descriptor is used. + +@return The number of collation methods. +*/ + { + return GetLocaleCharSet()->iCollationDataSet->iMethods; + } +#endif + + + + +#ifdef _UNICODE +EXPORT_C TUint Mem::CollationMethodId(TInt aIndex) +/** +Gets the Uid associated with the specified collation method. + +This function is only defined for 16 bit (Unicode) build variants. This means +that the function is not defined for 8 bit build variants, even when an +explicit 16 bit descriptor is used. + +@param aIndex An index into the set of collation methods in thie locale. This + value is relative to zero; i.e. a zero value refers to the first + collation method. This value must not be negative, and must be + less than the total number of collation methods in this locale. + +@return The Uid of the collation method. + +@panic USER 132 In debug builds only, if aIndex is negative or is greater than + or equal to the total number of collation methods in this locale. +*/ + { + const TCollationDataSet* s = GetLocaleCharSet()->iCollationDataSet; + __ASSERT_DEBUG(aIndex >= 0 && aIndex < s->iMethods,Panic(EBadCollationRulesIndex)); + return s->iMethod[aIndex].iId; + } +#endif + + + + +#ifdef _UNICODE +EXPORT_C const TCollationMethod* Mem::CollationMethodByIndex(TInt aIndex) +/** +Gets the collation method identified by the specified index. + +This function is only defined for 16 bit (Unicode) build variants. This means +that the function is not defined for 8 bit build variants, even when an +explicit 16 bit descriptor is used. + +@param aIndex An index into the set of collation methods in this locale. This + value is relative to zero; i.e. a zero value refers to the first + collation method. This value must not be negative, and must be + less than the total number of collation methods in this locale. + +@return A pointer to the collation method. + +@panic USER 132 In debug builds only, if aIndex is negative or is greater than + or equal to the total number of collation methods in this locale. +*/ + { + const TCollationDataSet* s = GetLocaleCharSet()->iCollationDataSet; + __ASSERT_DEBUG(aIndex >= 0 && aIndex < s->iMethods,Panic(EBadCollationRulesIndex)); + return &s->iMethod[aIndex]; + } +#endif + + + + +#ifdef _UNICODE +EXPORT_C const TCollationMethod* Mem::CollationMethodById(TUint aId) +/** +Gets the collation method identified by the specified Uid. + +This function is only defined for 16 bit (Unicode) build variants. This means +that the function is not defined for 8 bit build variants, even when an +explicit 16 bit descriptor is used. + +@param aId The Uid of a collation method in the set of collation methods in + this locale. + +@return A pointer to the collation method. +*/ + { + const TCollationDataSet* set = GetLocaleCharSet()->iCollationDataSet; + const TCollationMethod* method = set->iMethod; + const TCollationMethod* m = method; + int methods = set->iMethods; + for (int i = 0; i < methods; i++, m++) + if (m->iId == aId) + { + method = m; + break; + } + return method; + } +#endif + +#ifdef _UNICODE +EXPORT_C const TCollationMethod* Mem::GetDefaultMatchingTable() +/** +Gets the collation method specific for matching purpose. + +This function is only defined for 16 bit (Unicode) build variants. This means +that the function is not defined for 8 bit build variants, even when an +explicit 16 bit descriptor is used. + +@return A pointer to the collation method +*/ + { + const TCollationDataSet* set=GetLocaleCharSet()->iCollationDataSet; + const TCollationMethod* method=set->iMethod; + const TCollationMethod* m= method; + int methods = set->iMethods; + for (; methods-->0; m++) + if (m->iFlags & TCollationMethod::EMatchingTable) + { + method=m; + break; + } + return method; + } +#endif + + +#if !defined(__MEM_MACHINE_CODED__) +EXPORT_C void Mem::Swap(TAny *aPtr1,TAny *aPtr2,TInt aLength) +/** +Swaps a number of bytes of data between two specified locations. + +The source and target areas can overlap. + +@param aPtr1 A pointer to the first location taking part in the swap. +@param aPtr2 A pointer to second location taking part in the swap. +@param aLength The number of bytes to be swapped between the two locations. + This value must not be negative. + +@panic USER 94 In debug builds only, if aLength is negative. +*/ + { + + __ASSERT_DEBUG(aLength>=0,Panic(EMemSwapLengthNegative)); + if (aPtr1==aPtr2) + return; + TUint8 *pT=(TUint8 *)aPtr1; + TUint8 *pE=pT+aLength; + TUint8 *pS=(TUint8 *)aPtr2; + while (pT>8)^*pB++)&0xff]; + aCrc=(TUint16)crc; + } + + + + +EXPORT_C TInt User::StringLength(const TUint8 *aString) +/** +Gets the length of a C style, null terminated, string of single-byte valued +characters. + +The length does not include the null terminator. + +@param aString A pointer to the single byte valued, null terminated, string. + +@return The length of the string. +*/ + { + + const TUint8 *pS=aString; + while (*pS) + pS++; + return(pS-aString); + } + + + + +EXPORT_C TInt User::StringLength(const TUint16 *aString) +/** +Gets the length of a C style, null terminated, string of double-byte valued +characters. + +The length does not include the null terminator. + +@param aString A pointer to the double-byte valued, null terminated, string. + +@return The length of the string. +*/ + { + + const TUint16 *pS=aString; + while (*pS) + pS++; + return(pS-aString); + } + +#ifdef __TOOLS2__ + +TPanicHandler gPanicHandler = NULL; + +EXPORT_C void User::Panic(const TDesC &aCategory,TInt aReason) + { + if (gPanicHandler != NULL) + { + TRAPD(r, (*gPanicHandler)(aCategory, aReason)); + return; + } + TBuf8<17> cat; + cat.Copy(aCategory.Left(16)); + fprintf(stderr, "PANIC - %s: %d\n", cat.PtrZ(), aReason); + exit(2); + } + +#else +EXPORT_C void User::Panic(const TDesC &aCategory,TInt aReason) +/** +Panics the current thread, specifying a category name and panic number. + +Keep the length of the category name small; it is limited to 16 characters. + +@param aCategory A reference to the descriptor containing the text that defines + the category for this panic. +@param aReason The panic number. +*/ + { + + __IF_DEBUG(Print(_L("User::Panic %S %d\n"),&aCategory,aReason)); + TPtrC cat16(aCategory.Ptr(),Min(KMaxExitCategoryName,aCategory.Length())); + TBuf8 cat; + cat.Copy(cat16); + ExitCurrentThread(EExitPanic,aReason,&cat); + } + + + + +void CallStaticEntryPoints(TBool aInit) + { + TLinAddr ep[KMaxLibraryEntryPoints]; + TInt numEps=KMaxLibraryEntryPoints; + TInt r=E32Loader::StaticCallList(numEps, ep); + if (r!=KErrNone) + return; + if (aInit) + { + for (TInt i=0; i=0; --i) // last EP is always process entry point + { + TLibraryEntry f=(TLibraryEntry)ep[i]; + (*f)(KModuleEntryReasonProcessDetach); + } + } + } + + + + +EXPORT_C void User::InitProcess() +/** +@internalAll +*/ + { + CallStaticEntryPoints(ETrue); + } + + + + +EXPORT_C void User::Exit(TInt aReason) +/** +Terminates the current thread, specifying a reason. +All child threads are terminated and all resources are cleaned up. + +If the current thread is the main thread in a process, the process is also +terminated. + +@param aReason The reason code. +*/ + { + // Notify kernel that thread is exiting + TBool lastThread = Exec::UserThreadExiting(aReason); + if (lastThread) + { + // Call global destructors if we're the last thread in the process + TGlobalDestructorFunc func = (TGlobalDestructorFunc)UserSvr::DllTls(KGlobalDestructorTlsKey, KDllUid_Special); + if (func) + { + func(); + CallStaticEntryPoints(EFalse); + } + } + + FOREVER + { + TInt h=Exec::LastThreadHandle(); + if (h==0) + break; + if (Exec::HandleClose(h)>0) + RHandleBase::DoExtendedClose(); + } + +#ifdef __USERSIDE_THREAD_DATA__ + LocalThreadData()->Close(); +#endif + + ExitCurrentThread(EExitKill,aReason,NULL); + } +#endif // __TOOLS2__ + + + +EXPORT_C TInt User::QuickSort(TInt aCount,const TKey &aKey,const TSwap &aSwap) +// +// Routine sorts a set of records into the order defined by the key aKey. +// There are aCount records to sort, each record is numbered, the first is +// record 0, the last record aCount-1. +// Each time the quicksort algorithm needs to compare two records it calls +// aKey.Compare(TInt n,TInt m). +// where n and m (both type TUint) are the record no.s of the two records to compare. +// The compare routine should return +// >0 if record(n) > record(m) +// 0 if record(n) == record(m) +// <0 if record(n) < record(m) +// Each time the quicksort algorithm needs to exchange two records it calls +// aSwap.Swap(n,m) +// where n and m (both type TUint) are the record numbers of the two records to +// exchange. +// The swap routine should exchange the positions of records n and m so that +// the value of record m becomes the former value of record n and visa versa. +// +/** +Quick sorts array elements. + +It is used by the standard Symbian OS arrays having +CArrayFixBase, CArrayVarBase or CArrayPakBase in their class hierarchy in +the implementation of their sort functions. The function can be used by other +arrays. + +The function returns KErrNone if the operation is successful otherwise it +returns KErrGeneral. + +@param aCount The number of elements in the array. +@param aKey A reference to a suitably initialised TKey derived object. +@param aSwap A reference to a suitably initialised TSwap derived object. + +@return KErrNone if the operation is successful; KErrGeneral otherwise. + +@panic USER 96, if aCount is negative. +*/ + { + TInt *parts_sp; // Stack pointer for partitions todo + TInt m; // First element of partition + TInt n; // No. of elements in partition + TInt d1,d2; // Temporary variables + TInt division_point; // Seperation point of partitions + TInt parts_todo[KQDepth]; // Stack pairs are + + __ASSERT_ALWAYS(aCount>=0,::Panic(ESortCountNegative)); + if (aCount<=1) + return(KErrNone); // Discard trivial sorts + parts_sp=(&parts_todo[0]); // Reset partitions to do stack + m=0; // Initial limits, first element + n=aCount; // No_elm elements to do + do { + while (n>1 && parts_sp<(&parts_todo[KQDepth-2])) + { + division_point=partit(n,m,aKey,aSwap); + d1=division_point-m; + d2=m+n-division_point-1; + if (d1=&parts_todo[KQDepth-2]) + return(KErrGeneral); // Stack overflow + m=(*(--parts_sp)); + n=(*(--parts_sp)); // Unstack next partit to do + } while (parts_sp>=(&parts_todo[0])); // Stop on stack underflow + return(KErrNone); + } + + + + +EXPORT_C TInt User::BinarySearch(TInt aCount,const TKey &aKey,TInt &aPos) +// +// Perform a binary search on any array. aKey.Compare() will be +// called to lexically compare a record in the array with the +// value being searched for. The second index to aKey.Compare() will +// always be KIndexPtr, meaning the value being compared. The result +// returned will be 0 if a match is found and >0 if no match is found. +// The index of the matching record or the index of the record logically +// following the value being searched for will be returned in aPos. +// +/** +Performs a binary search for an array element containing a specified key. + +It can be used on any kind of array where elements can be identified by key. +It is used by the standard Symbian OS arrays having CArrayFix, CArrayVar or +CArrayPak in their class hierarchy in the implementation of the various +functions for inserting, deleting and finding elements by key. The function +can be used by other arrays. + +The function returns a zero value if the search is successful and a non-zero +value otherwise. + +If the search is successful, the function puts the position (i.e. the index) +of the element into aPos. If the search is unsuccessful, then the function +puts into aPos the position of the first element in the array whose key is +greater than the search key. + +If the array is empty, i.e. aCount is zero, then the search is unsuccessful +and aPos is not defined. + +@param aCount The number of elements in the array. +@param aKey A reference to a suitably initialised TKey derived object. + In particular, the object will have been initialised with + a pointer to a sample element containing the search key. +@param aPos If the element is found, the reference is set to the position of + that element within the array. The position is relative to zero, + (i.e. the first element in the array is at position 0). + If the element is not found and the array is not empty, then + the reference is set to the position of the first element in + the array with a key which is greater than the search key. + If the element is not found and the array is empty, then the + reference is undefined. + +@return Zero, if the element with the specified key is found. Non-zero, if +the element with the specified key is not found. + +@panic USER 97, if aCount is negative. +*/ + { + + __ASSERT_ALWAYS(aCount>=0,::Panic(EBinarySearchCountNegative)); + TInt mid=0; + TInt r=(-1); + if (aCount) + { + TInt low=0; + TInt high=aCount-1; + while (low<=high) + { + mid=(low+high)>>1; + if ((r=aKey.Compare(mid,KIndexPtr))==0) + break; + if (r<0) + low=mid+1; + else + high=mid-1; + } + } + if (r<0) + mid++; + aPos=mid; + return(r); + } + + + + +EXPORT_C TVersion User::Version() +/** +Retrieves the E32 component version number, which is the kernel architecture version number. +For example for EKA2 the major part of the version number will be 2. + +@return The E32 component version number. +*/ + { + + return(TVersion(KE32MajorVersionNumber,KE32MinorVersionNumber,KE32BuildVersionNumber)); + } + + + + +EXPORT_C void User::Invariant() +/** +Panics the current thread with a USER 0 panic. + +Typically, this is called when a test for a class invariant fails, i.e. when +a test which checks that the internal data of an object is +self-consistent, fails. + +Such tests are almost always done in debug builds, commonly using +the __ASSERT_DEBUG macro. +*/ + { + + ::Panic(EInvariantFalse); + } + + + + +EXPORT_C TBool User::QueryVersionSupported(const TVersion &aCurrent,const TVersion &aRequested) +/** +Compares two version objects and returns true if the test version is less +than the current version. + +Version information is encapsulated by a TVersion type object and consists +of a major version number, a minor version number and a build number. + +The function returns true if one of the following conditions is true: + +1. the test major version is strictly less than the current major version + +2. the test major version is equal to the current major version and the test + minor version is less than or equal to the current minor version + +If neither condition is true, the function returns false. + +@param aCurrent A reference to the current version against which aRequested + is compared. +@param aRequested A reference to the test version to be compared + against aCurrent. + +@return True, if one or both conditions are true. False otherwise. +*/ + { + + if (aRequested.iMajor=0,Panic(EKeyOffsetNegative)); + } + + + + +EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpText aType,TInt aLength) + : iKeyOffset(anOffset),iKeyLength(aLength),iCmpType(aType) +/** +Constructs the characteristics of a text key. + +This constructor should be called by the corresponding derived class +constructor that takes the same arguments. Typically, the derived class +constructor calls this constructor in its constructor initialization list. + +Note that the constructor sets the offset value into the protected data member +iKeyOffset. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of comparison to be made + between two text keys. +@param aLength The length of the text key. + +@panic USER 98, if anOffset is negative. + +@see TKeyCmpText +*/ + { + + __ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative)); + } + + + + +EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpNumeric aType) + : iKeyOffset(anOffset),iCmpType(aType) +/** +Constructs the characteristics of a numeric key. + +This constructor should be called by the corresponding derived class +constructor that takes the same arguments. Typically, the derived class +constructor calls this constructor in its constructor initialization list. + +No length value is passed as this is implied by the type of key. + +Note that the constructor sets the offset value into the protected data member +iKeyOffset. + +@param anOffset The offset of the key from the start of an array element. +@param aType An enumeration which defines the type of the numeric key. + +@panic USER 98, if anOffset is negative. + +@see TKeyCmpNumeric +*/ + { + + __ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative)); + } + + + + +EXPORT_C TInt TKey::Compare(TInt aLeft,TInt aRight) const +/** +Compares the keys of two array elements. + +This function is called by User::BinarySearch() and User::QuickSort(). + +The position of the elements are identified by the specified index values. +The default implementation uses the At() virtual function to convert the index +values into pointers to the elements themselves. + +The default implementation also uses: + +1. the TDesC comparison functions to compare descriptor type keys + +2. the Mem functions to compare text type keys + +3. numeric comparison for numeric type keys. + +@param aLeft The index of an array element participating in the comparison, + designated the left element. +@param aRight The index of an array element participating in the comparison, + designated the right element. + +@return Zero, if the two keys are equal; + negative, if the left key is less than the right key; + positive, if the left key is greater than the right key. + +@see User::BinarySearch() +@see User::QuickSort() +@see TDesC +@see Mem +*/ + { + + UPTR left; + left.tany=At(aLeft); + UPTR right; + right.tany=At(aRight); + TInt r=(-1); + switch (iCmpType) + { +#if !defined(_UNICODE) + case ECmpNormal: +#endif + case ECmpNormal8: + r=Mem::Compare(left.ttext8,iKeyLength,right.ttext8,iKeyLength); + break; +#if defined(_UNICODE) + case ECmpNormal: +#endif + case ECmpNormal16: + r=Mem::Compare(left.ttext16,iKeyLength,right.ttext16,iKeyLength); + break; +#if !defined(_UNICODE) + case ECmpFolded: +#endif + case ECmpFolded8: + r=Mem::CompareF(left.ttext8,iKeyLength,right.ttext8,iKeyLength); + break; +#if defined(_UNICODE) + case ECmpFolded: +#endif + case ECmpFolded16: + r=Mem::CompareF(left.ttext16,iKeyLength,right.ttext16,iKeyLength); + break; +#if !defined(_UNICODE) + case ECmpCollated: +#endif + case ECmpCollated8: + r=Mem::CompareC(left.ttext8,iKeyLength,right.ttext8,iKeyLength); + break; +#if defined(_UNICODE) + case ECmpCollated: +#endif + case ECmpCollated16: + r=Mem::CompareC(left.ttext16,iKeyLength,right.ttext16,iKeyLength); + break; +#if !defined(_UNICODE) + case ECmpCollated16+ECmpNormal+1: +#endif + case ECmpCollated16+ECmpNormal8+1: + r=left.tdesc8->Compare(*right.tdesc8); + break; +#if defined(_UNICODE) + case ECmpCollated16+ECmpNormal+1: +#endif + case ECmpCollated16+ECmpNormal16+1: + r=left.tdesc16->Compare(*right.tdesc16); + break; +#if !defined(_UNICODE) + case ECmpCollated16+ECmpFolded+1: +#endif + case ECmpCollated16+ECmpFolded8+1: + r=left.tdesc8->CompareF(*right.tdesc8); + break; +#if defined(_UNICODE) + case ECmpCollated16+ECmpFolded+1: +#endif + case ECmpCollated16+ECmpFolded16+1: + r=left.tdesc16->CompareF(*right.tdesc16); + break; +#if !defined(_UNICODE) + case ECmpCollated16+ECmpCollated+1: +#endif + case ECmpCollated16+ECmpCollated8+1: + r=left.tdesc8->CompareC(*right.tdesc8); + break; +#if defined(_UNICODE) + case ECmpCollated16+ECmpCollated+1: +#endif + case ECmpCollated16+ECmpCollated16+1: + r=left.tdesc16->CompareC(*right.tdesc16); + break; + case ECmpTInt: + if (*left.tint==*right.tint) + r=0; + else if (*left.tint>*right.tint) + r=1; + break; + case ECmpTUint: + if (*left.tuint==*right.tuint) + r=0; + else if (*left.tuint>*right.tuint) + r=1; + break; + case ECmpTInt8: + if (*left.tint8==*right.tint8) + r=0; + else if (*left.tint8>*right.tint8) + r=1; + break; + case ECmpTUint8: + if (*left.tuint8==*right.tuint8) + r=0; + else if (*left.tuint8>*right.tuint8) + r=1; + break; + case ECmpTInt16: + if (*left.tint16==*right.tint16) + r=0; + else if (*left.tint16>*right.tint16) + r=1; + break; + case ECmpTUint16: + if (*left.tuint16==*right.tuint16) + r=0; + else if (*left.tuint16>*right.tuint16) + r=1; + break; + case ECmpTInt32: + if (*left.tint32==*right.tint32) + r=0; + else if (*left.tint32>*right.tint32) + r=1; + break; + case ECmpTUint32: + if (*left.tuint32==*right.tuint32) + r=0; + else if (*left.tuint32>*right.tuint32) + r=1; + break; + case ECmpTInt64: + if (*left.tint64==*right.tint64) + r=0; + else if (*left.tint64>*right.tint64) + r=1; + break; + } + return(r); + } + + + + +EXPORT_C TAny* TKey::At(TInt /*anIndex*/) const +/** +Gets a pointer to the key of a specified array element. + +The default implementation raises a USER 35 panic. + +The function is called by TKey::Compare() to compare the keys of two elements. + +The implementation provided by a derived class must convert the index to a +pointer to the key within the corresponding element. The implementation depends +on the design of the array but, as general rule, use the index value to get +a pointer to the corresponding element and then add the TKey protected data +member iKeyOffset to this pointer to get a pointer to the key itself. + +By convention, the index value is relative to zero; i.e. a zero value refers +to the first element in the array. By this convention, the index can take +any value between zero and the number of elements within the array minus one. + +The function must also handle the special index value KIndexPtr. When this +value is passed, the function should return a pointer to the key within the +sample element. A pointer to the sample element is held in the protected data +member iPtr and can be set up using SetPtr(). + +The implementation of this function also assumes that the derived class has +a pointer to the array itself or has a function for finding it. + +@param anIndex The index of the array element or the special index value KIndexPtr. + +@return An untyped pointer to the key within the specified array element or + an untyped pointer to the key within the sample element, if KIndexPtr + is passed as an argument. + +@panic USER 35, if no replacement function has been provided by a derived class. + +@see TKey::Compare +@see TKey::SetPtr +@see KIndexPtr +*/ + { + + Panic(ETFuncTKeyVirtualAt); + return(NULL); + } + + + + +EXPORT_C TSwap::TSwap() +/** +Default constructor. + +The constructor has an empty implementation. +*/ + {} + + + + +EXPORT_C void TSwap::Swap(TInt /*aLeft*/,TInt /*aRight*/) const +/** +Swaps two elements of an array. + +This function is called by User::QuickSort(). + +The default implementation raises a USER 36 panic. + +In general, the class must provide a way of translating the indexes representing +the two elements into pointers to the elements themselves. The Mem::Swap() +utility function can then be used to swap the two elements. This implies that +the derived class must contain a pointer to the array itself and have access +to other information about the array, such as the length of elements. + +By convention, the index value is relative to zero; i.e. a zero value refers +to the first element in the array. + +@param aLeft The index of an array element participating in the swap +@param aRight The index of an array element participating in the swap + +@panic USER 36, if no replacement function has been provided by a derived class. + +@see User::QuickSort +@see Mem::Swap +*/ + { + + Panic(ETFuncTSwapVirtualSwap); + } + + + + +EXPORT_C TVersion::TVersion() +/** +Default constructor. + +It sets the major, minor and build numbers to zero. +*/ + : iMajor(0),iMinor(0),iBuild(0) + {} + + + + +EXPORT_C TVersion::TVersion(TInt aMajor,TInt aMinor,TInt aBuild) +/** +Constructs the object with the specified major version number, the minor +version number and the build number. + +Note that the constructor does not check that the values passed are within +the specified ranges. As the parameters are TInt types, care must be taken to +ensure that values passed do not exceed the specified maxima, otherwise they +will be interpreted as negative values. + +@param aMajor The major version number. This must be a number in the + range 0 to 127. +@param aMinor The minor version number. This must be a number in the + range 0 to 99. +@param aBuild The build number. This must be a number in the range 0 to 32,767. + +*/ + : iMajor((TInt8)aMajor),iMinor((TInt8)aMinor),iBuild((TInt16)aBuild) + {} + + + + +EXPORT_C TVersionName TVersion::Name() const +/** +Gets a descriptor buffer containing the formatted character representation +of the version information. + +The general format of the representation is: xxx.yy(zzzzz) + +where: + +1. xxx is the major version number; depending on the value, this may have + a length of one, two or three characters. + +2. yy is the minor version number; this is always two characters, padded + with a leading zero, if necessary. + +3. zzzzz is the build number; depending on the value, this may have a length + of one to 5 characters. + +Note that if the object is constructed with values that exceed the permitted +range, they will appear negative in their formatted character representation. + +@return A buffer descriptor containing the formatted character representation. +*/ + { + + TVersionName v; + v.AppendNum(iMajor); + v.Append(TChar('.')); + v.AppendNumFixedWidth(iMinor,EDecimal,2); + v.Append(TChar('(')); + v.AppendNum(iBuild); + v.Append(TChar(')')); +// v.Format(_L("%d.%02d(%d)"),iMajor,iMinor,iBuild); + return(v); + } + + + + +/** +Signals the current thread that the asynchronous request associated with the +specified request status object is complete. + +This function is used to complete an asynchronous request originating in the +same thread as the code that is currently executing. If a request originates +in another thread, then executing code must use RThread::RequestComplete() +to signal the completion of that request. + +The request is completed with the completion code passed in aReason. This +value is copied into the request status, pointed to by aStatus, before +signalling the current thread's request semaphore. + +The meaning of the completion code passed in aReason is a matter of convention +to be decided between the service requester and the service provider. + +@param aStatus A reference to a pointer to the request status object. This + is a pointer into the current thread's address space. + On return, the pointer to the request status is set to NULL. + Note that setting the pointer to NULL is a convenience, + not all servers need it, and is done before + the function returns. + +@param aReason The completion code of this request. + +@see RThread::RequestComplete +*/ +EXPORT_C void User::RequestComplete(TRequestStatus * &aStatus,TInt aReason) + { +#ifndef __TOOLS2__ + *aStatus=KRequestPending; + RThread().RequestComplete(aStatus,aReason); +#else + *aStatus = aReason; +#endif // __TOOLS2__ + } + + + +EXPORT_C TLdrInfo::TLdrInfo() +// +// Constructor +// + { + memclr(this, sizeof(TLdrInfo)); + iRequestedVersion = KModuleVersionWild; + } + +EXPORT_C TPtrC8 TCodeSegCreateInfo::RootName() const + { + return iFileName.Mid(iRootNameOffset,iRootNameLength); + } + +EXPORT_C TBool TUid::operator==(const TUid& aUid) const +/** +Compares two UIDs for equality. + +@param aUid The UID to be compared with this UID. + +@return True, if the two UIDs are equal; false otherwise. +*/ + { + + return(iUid==aUid.iUid); + } + + + + +EXPORT_C TBool TUid::operator!=(const TUid& aUid) const +/** +Compares two UIDs for inequality. + +@param aUid The UID to be compared with this UID. + +@return True, if the two UIDs are unequal; false otherwise. +*/ + { + + return(iUid!=aUid.iUid); + } + + + + +EXPORT_C TUidName TUid::Name() const +/** +Generates and returns the standard text form of the UID. + +The resulting text has the form: + +@code +[12345678] +@endcode + +The function always generates 10 characters, where the first and last characters +are open and close square brackets enclosing exactly 8 hexadecimal digits +(padded to the left with zeroes, if necessary). + +@return A modifiable descriptor containing the standard text format of the + UID. +*/ + { + + TUidName n; + n.Append(TChar('[')); + n.AppendNumFixedWidth(iUid,EHex,8); + n.Append(TChar(']')); +// n.Format(_L("[%08x]"),iUid); + return(n); + } + + + + +EXPORT_C TUidType::TUidType() +/** +Default constructor. + +Creates a UID type, and sets all three component UIDs to KNullUid. +*/ + { + + Mem::FillZ(this,sizeof(TUidType)); + } + + + + +EXPORT_C TUidType::TUidType(TUid aUid1) +/** +Constructor that creates a UID type and sets the UID1 component +to the specified value. + +The UID2 and UID3 components are set to KNullUid. + +@param aUid1 Value for UID1. +*/ + { + + + Mem::FillZ(this,sizeof(TUidType)); + iUid[0]=aUid1; + } + + + + +EXPORT_C TUidType::TUidType(TUid aUid1,TUid aUid2) +/** +Constructor that creates a UID type and sets the UID1 and UID2 components +to the specified values. + +The UID3 component is set to KNullUid. + +@param aUid1 Value for UID1. +@param aUid2 Value for UID2. +*/ + { + + iUid[0]=aUid1; + iUid[1]=aUid2; + iUid[2]=KNullUid; + } + + + + +EXPORT_C TUidType::TUidType(TUid aUid1,TUid aUid2,TUid aUid3) +/** +Constructor that creates a UID type and sets all three UID components +to the specified values. + +@param aUid1 Value for UID1. +@param aUid2 Value for UID2. +@param aUid3 Value for UID3. +*/ + { + + + iUid[0]=aUid1; + iUid[1]=aUid2; + iUid[2]=aUid3; + } + + + + +EXPORT_C TBool TUidType::operator==(const TUidType& aUidType) const +/** +Compares this UID type for equality with the specified UID type. + +@param aUidType The UID type to be compared. + +@return True, if each component UID is equal to the corresponding component + UID in the specified UID type; false, otherwise. +*/ + { + + return(iUid[0]==aUidType.iUid[0] && + iUid[1]==aUidType.iUid[1] && + iUid[2]==aUidType.iUid[2]); + } + + + + +EXPORT_C TBool TUidType::operator!=(const TUidType& aUidType) const +/** +Compares this UID type for inequality with the specified UID type. + +@param aUidType The UID type to be compared. + +@return True, if any component UID is not equal to the corresponding component +UID in the specified UID type; false otherwise. +*/ + { + + + return(!(*this==aUidType)); + } + + + + +EXPORT_C const TUid& TUidType::operator[](TInt aIndex) const +/** +Gets the UID component as identified by the specified index. + +@param aIndex Index value indicating which UID component to return. + 0 specifies UID1, + 1 specifies UID2, + 2 specifies UID3. + +@return A reference to the required UID component. + +@panic USER 37 if aIndex is not in the range 0 to 2, inclusive. +*/ + { + + __ASSERT_ALWAYS(aIndex>=0 && aIndex> 8) ^ CrcTab32[(crc ^ *p++) & 0xff]; + aCrc = crc; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_graph.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_graph.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1392 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_graph.cpp +// +// + +#include "us_std.h" + + + + +EXPORT_C TBool TPoint::operator==(const TPoint& aPoint) const +/** +Compares two points for equality. + +For two points to be equal, both their x and y co-ordinate values must be +equal. + +@param aPoint The point to be compared with this point. + +@return True, if the two points are equal; false, otherwise. +*/ + { + + return(iX==aPoint.iX && iY==aPoint.iY); + } + + + + +EXPORT_C TBool TPoint::operator!=(const TPoint& aPoint) const +/** +Compares two points for inequality. + +For two points to be unequal, either their x or their y co-ordinate values +must be different. + +@param aPoint The point to be compared with this point. + +@return True, if the two points are unequal; false, otherwise. +*/ + { + + return(iX!=aPoint.iX || iY!=aPoint.iY); + } + + + + +EXPORT_C TPoint& TPoint::operator-=(const TPoint& aPoint) +/** +TPoint subtraction assignment operator. + +The operator subtracts the specified point from this point, and assigns the +result back to this point. + +@param aPoint The point to be subtracted. + +@return A reference to this point object. +*/ + { + + iX-=aPoint.iX; + iY-=aPoint.iY; + return(*this); + } + + + + +EXPORT_C TPoint& TPoint::operator-=(const TSize& aSize) +/** +TSize subtraction assignment operator. + +The operator subtracts the specified TSize from this point, and assigns the +result back to this point. + +The operation proceeds by: + +1. subtracting the width value of the TSize from the x co-ordinate value + +2. subtracting the height value of the TSize from the y co-ordinate value + +@param aSize The TSize to be subtracted. + +@return A reference to this point object. +*/ + { + + iX-=aSize.iWidth; + iY-=aSize.iHeight; + return(*this); + } + + + + +EXPORT_C TPoint& TPoint::operator+=(const TPoint& aPoint) +/** +TPoint addition assignment operator. + +The operator adds the specified point to this point, and assigns the result +back to this point. + +@param aPoint The point to be added. + +@return A reference to this point object. +*/ + { + + iX+=aPoint.iX; + iY+=aPoint.iY; + return(*this); + } + + + + +EXPORT_C TPoint& TPoint::operator+=(const TSize& aSize) +/** +TSize addition assignment operator. + +The operator adds the specified TSize to this point, and assigns the result +back to this point. + +The operation proceeds by: + +1. adding the width value of the TSize to the x co-ordinate value + +2. adding the height value of the TSize to the y co-ordinate value + +@param aSize The TSize to be added to this point. + +@return A reference to this point object. +*/ + { + + iX+=aSize.iWidth; + iY+=aSize.iHeight; + return(*this); + } + + + + +EXPORT_C TPoint TPoint::operator-(const TPoint& aPoint) const +/** +TPoint subtraction operator. + +The operator subtracts the specified point from this point, and returns the +resulting value. + +@param aPoint The point to be subtracted from this point. + +@return The result of the operation. +*/ + { + + TPoint ret=* this; + ret-= aPoint; + return(ret); + } + + + + +EXPORT_C TPoint TPoint::operator-(const TSize& aSize) const +/** +TSize subtraction operator. + +The operator subtracts the specified TSize from this point, and returns the +resulting value. + +The operation proceeds by: + +1. subtracting the width value of the TSize from the x co-ordinate value + +2. subtracting the height value of the TSize from the y co-ordinate value. + +@param aSize The TSize to be subtracted. + +@return The result of the operation. +*/ + { + + TPoint ret=* this; + ret-= aSize; + return(ret); + } + + + + +EXPORT_C TPoint TPoint::operator+(const TPoint& aPoint) const +/** +The operator adds the specified point to this point, and returns the resulting +value. + +@param aPoint The point to be added to this point. + +@return The result of the operation. +*/ + { + + TPoint ret=* this; + ret+= aPoint; + return(ret); + } + + + + +EXPORT_C TPoint TPoint::operator+(const TSize& aSize) const +/** +TSize addition operator. + +The operator adds the specified TSize to this point, and returns the resulting +value. + +The operation proceeds by: + +1. adding the width value of the TSize to the x co-ordinate value + +2. adding the height value of the TSize to the y co-ordinate value. + +@param aSize The TSize to be added to this TPoint. + +@return The result of the operation. +*/ + { + + TPoint ret=* this; + ret+= aSize; + return(ret); + } + + + + +EXPORT_C TPoint TPoint::operator-() const +/** +Unary minus operator. + +The operator returns the negation of this point. + +@return The result of the operation. +*/ + { + + return TPoint(-iX,-iY); + } + + + + +EXPORT_C void TPoint::SetXY(TInt aX,TInt aY) +/** +Sets the x and y co-ordinates for this point. + +@param aX The value to assign to the x co-ordinate. +@param aY The value to assign to the y co-ordinate. +*/ + { + + iX=aX; + iY=aY; + } + + + + +EXPORT_C TSize TPoint::AsSize() const +/** +Gets the size of the rectangle whose top left hand corner is the origin of +the screen co-ordinates and whose bottom right hand corner is this point. + +@return The co-ordinates of this point converted to a size. +*/ + { + return(TSize(iX,iY)); + } + + + + + +EXPORT_C TBool TPoint3D::operator==(const TPoint3D& aPoint3D) const +/** +Compares two 3D points(TPoint3D) for equality. + +For two TPoint3D to be equal, their x , y and zco-ordinate values must be +equal. + +@param aPoint3D The point to be compared with this point. + +@return True, if the two points are equal; false, otherwise. +*/ + { + return(iX==aPoint3D.iX && iY==aPoint3D.iY && iZ==aPoint3D.iZ); + } + + + + +EXPORT_C TBool TPoint3D::operator!=(const TPoint3D& aPoint3D) const +/** +Compares two 3D points for inequality. + +For two points to be unequal, their x or y or z co-ordinate values +must be different. + +@param aPoint3D The point to be compared with this point. + +@return True, if the two points are unequal; false, otherwise. +*/ + { + return(iX!=aPoint3D.iX || iY!=aPoint3D.iY || iZ!=aPoint3D.iZ); + } + + + + + + +EXPORT_C TPoint3D& TPoint3D::operator-=(const TPoint3D& aPoint3D) +/** +TPoint3D subtraction assignment operator. + +The operator subtracts the specified point from this point, and assigns the +result back to this point. + +@param aPoint The point to be subtracted. + +@return A reference to this point object. +*/ + { + iX-=aPoint3D.iX; + iY-=aPoint3D.iY; + iZ-=aPoint3D.iZ; + return(*this); + } + + + +EXPORT_C TPoint3D& TPoint3D::operator-=(const TPoint& aPoint) + +/** +TPoint subtraction assignment operator. + +The operator subtracts the specified TPoint from this point(TPoint3D), and assigns the +result back to this point. + +The operation proceeds by +subtracting x and y cordinates of the TPoin to this point and no changes to the Z-coordinatete value + +@param aPoint The aPoint to be subtracted. + +@return A reference to this point object. +*/ + { + iX-=aPoint.iX; + iY-=aPoint.iY; + //No Changes to the z co-ordinate + return(*this); + } + + + +EXPORT_C TPoint3D& TPoint3D::operator+=(const TPoint3D& aPoint3D) +/** +TPoint3D addition assignment operator. + +The operator adds the specified point to this point, and assigns the result +back to this point. + +@param aPoint3D The point to be added. + +@return A reference to this point object. +*/ + { + iX+=aPoint3D.iX; + iY+=aPoint3D.iY; + iZ+=aPoint3D.iZ; + return(*this); + } + +EXPORT_C TPoint3D& TPoint3D::operator+=(const TPoint& aPoint) +/** +TPoint addition assignment operator. + +The operator adds the specified TPoint to this point, and assigns the result +back to this point. + +The operation proceeds by: +adding x and y cordinates of the TPoin to this point and no changes to the Z-coordinatete value + +@param aPoint The TPoint to be added to this point. + +@return A reference to this point object. +*/ + { + + iX+=aPoint.iX; + iY+=aPoint.iY; + //No Changes to the z co-ordinate + return(*this); + } +EXPORT_C TPoint3D TPoint3D::operator-(const TPoint3D& aPoint3D) const +/** +TPoint3D subtraction operator. + +The operator subtracts the specified point from this point, and returns the +resulting value. + +@param aPoint3D The point to be subtracted from this point. + +@return the point(TPoint3D) which is the result of the operation. +*/ + { + + TPoint3D ret=* this; + ret-= aPoint3D; + return(ret); + } + + + +EXPORT_C TPoint3D TPoint3D::operator-(const TPoint& aPoint) const +/** +TPoint subtraction operator. + +The operator subtracts the specified TPoint from this point, and returns the +resulting value. + +@param aPoint The TPoint to be subtracted. + +@return the point(TPoint3D) which is the result of the operation. +*/ + { + + TPoint3D ret=* this; + ret-= aPoint; + return(ret); + } + + +EXPORT_C TPoint3D TPoint3D::operator+(const TPoint3D& aPoint3D) const +/** +The operator adds the specified point to this point, and returns the resulting +value. + +@param aPoint3D The point to be added to this point. + +@return the point(TPoint3D) which is the result of the operation. +*/ + { + + TPoint3D ret=* this; + ret+= aPoint3D; + return(ret); + } + +EXPORT_C TPoint3D TPoint3D::operator+(const TPoint& aPoint) const +/** +TPoint addition operator. + +The operator adds the specified TPoint to this point, and returns the resulting +value. + +@param aSize The TSize to be added to this TPoint. + +@return the point(TPoint3D) which is the result of the operation. +*/ + { + + TPoint3D ret=* this; + ret+= aPoint; + return(ret); + } + + +EXPORT_C TPoint3D TPoint3D::operator-() const +/** +Unary minus operator. + +The operator returns the negation of this point. + +@return the point(TPoint3D) which is the result of Unary minus operation. +*/ + { + return TPoint3D(-iX,-iY,-iZ); + } + + + +EXPORT_C void TPoint3D::SetXYZ(TInt aX,TInt aY,TInt aZ) +/** +Sets the x , y and z co-ordinates for this point. + +@param aX The value to assign to the x co-ordinate. +@param aY The value to assign to the y co-ordinate. +@param aZ The value to assign to the z co-ordinate. +*/ + { + iX=aX; + iY=aY; + iZ=aZ; + } + +EXPORT_C void TPoint3D::SetPoint(const TPoint& aPoint) +/* +TPoint3D from TPoint, sets the Z co-ordinate to Zero +@param aPoint The TPoint to add to this point +*/ + { + iX=aPoint.iX; + iY=aPoint.iY; + iZ=0; + } + + +EXPORT_C TPoint TPoint3D::AsPoint() const +/** +Gets Tpoint from Tpoint3D +@return TPoint from X and Y cordinates of Tpoint3D +*/ + { + return(TPoint(iX,iY)); + } + + + + + + +EXPORT_C TBool TSize::operator==(const TSize& aSize) const +/** +Compares this TSize with the specified TSize for equality. + +For two TSizes to be equal, both their width and height values must be equal. + +@param aSize The TSize to be compared with this TSize. + +@return True, if the two TSize are equal; false, otherwise. +*/ + { + return(iWidth==aSize.iWidth && iHeight==aSize.iHeight); + } + + + + +EXPORT_C TBool TSize::operator!=(const TSize& aSize) const +/** +Compares two TSize for inequality. + +For two TSize to be unequal, either their width or height values must be different. + +@param aSize The TSize to be compared with this TSize. + +@return True, if the two TSize are unequal; false, otherwise. +*/ + { + return(iWidth!=aSize.iWidth || iHeight!=aSize.iHeight); + } + + + + +EXPORT_C TSize& TSize::operator-=(const TSize& aSize) +/** +TSize subtraction assignment operator. + +The operator subtracts the specified TSize from this TSize, and assigns the +result back to this TSize. + +@param aSize The TSize to be subtracted. + +@return A reference to this TSize object. +*/ + { + iWidth-=aSize.iWidth;iHeight-=aSize.iHeight;return(*this); + } + + + + +EXPORT_C TSize& TSize::operator-=(const TPoint& aPoint) +/** +TPoint subtraction assignment operator. + +The operator subtracts the specified point from this TSize, and assigns the +result back to this TSize. + +The operation proceeds by: + +1. subtracting the point's x co-ordinate value from the width + +2. subtracting the point's y co-ordinate value from the height. + +@param aPoint The point to be subtracted. + +@return A reference to this size object. +*/ + { + iWidth-=aPoint.iX;iHeight-=aPoint.iY;return(*this); + } + + + + +EXPORT_C TSize& TSize::operator+=(const TSize& aSize) +/** +TSize addition assignment operator. + +The operator adds the specified TSize to this TSize, and assigns the result +back to this TSize. + +@param aSize The TSize to be added. + +@return A reference to this size object. +*/ + { + iWidth+=aSize.iWidth;iHeight+=aSize.iHeight;return(*this); + } + + + + +EXPORT_C TSize& TSize::operator+=(const TPoint& aPoint) +/** +TPoint addition assignment operator. + +The operator adds the specified point to this TSize, and assigns the result +back to this TSize. + +The operation proceeds by: + +1. adding the point's x co-ordinate value to the width + +2. adding the point's y co-ordinate value to the height. + +@param aPoint The point to be added. + +@return A reference to this size object. +*/ + { + iWidth+=aPoint.iX;iHeight+=aPoint.iY;return(*this); + } + + + + +EXPORT_C TSize TSize::operator-(const TSize& aSize) const +/** +TSize subtraction operator. + +This operator subtracts the specified TSize from this TSize, and returns the +resulting value. + +@param aSize The TSize to be subtracted from this Tsize. + +@return The result of the operation. +*/ + { + TSize ret=* this; ret-= aSize ;return(ret); + } + + + + +EXPORT_C TSize TSize::operator-(const TPoint& aPoint) const +/** +TPoint subtraction operator. + +This operator subtracts the specified point from this TSize, and returns the +resulting value. + +The operation proceeds by: + +1. subtracting the x co-ordinate value from the width + +2. subtracting the y co-ordinate value from the height + +@param aPoint The point to be subtracted. + +@return The result of the operation. +*/ + { + TSize ret=* this; ret-= aPoint ;return(ret); + } + + + + +EXPORT_C TSize TSize::operator+(const TSize& aSize) const +/** +TSize addition operator. + +This operator adds the specified TSize to this TSize, and returns the resulting +value. + +@param aSize The TSize to be added to this Tsize. + +@return The result of the operation. +*/ + { + TSize ret=* this; ret+= aSize ;return(ret); + } + + + + +EXPORT_C TSize TSize::operator+(const TPoint& aPoint) const +/** +TPoint addition operator. + +This operator adds the specified point to this TSize, and returns the resulting +value. + +The operation proceeds by: + +1. adding the x co-ordinate value to the width + +2. adding the y co-ordinate value to the height + +@param aPoint The point to be added to this TSize. + +@return The result of the operation. +*/ + { + TSize ret=* this; ret+= aPoint ;return(ret); + } + + + + +EXPORT_C TSize TSize::operator-() const +/** +Unary minus operator. + +The operator returns the negation of this TSize. + +@return The result of the operation. +*/ + { + + return TSize(-iWidth,-iHeight); + } + + + + +EXPORT_C void TSize::SetSize(TInt aWidth,TInt aHeight) +/** +Sets the width and height. + +@param aWidth The width value. +@param aHeight The height value. +*/ + { + iWidth=aWidth;iHeight=aHeight; + } + + + + +EXPORT_C TPoint TSize::AsPoint() const +/** +Gets a TPoint object whose co-ordinates are the width and height of this TSize. + +@return The co-ordinates of this TSize converted to a point. +*/ + { + return(TPoint(iWidth,iHeight)); + } + + + + +EXPORT_C TRect::TRect() : iTl(0,0),iBr(0,0) +/** +Constructs a default rectangle. + +This initialises the co-ordinates of its top +left and bottom right corners to (0,0). +*/ + {} + + + + +EXPORT_C TRect::TRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy) : iTl(aAx,aAy),iBr(aBx,aBy) +/** +Constructs the rectangle, initialising its top left and bottom right hand corners +with four TInt values. + +@param aAx The horizontal co-ordinate of the left hand side of the rectangle. +@param aAy The vertical co-ordinate of the top of the rectangle. +@param aBx The horizontal co-ordinate of the right hand side of the rectangle. +@param aBy The vertical co-ordinate of the bottom of the rectangle. +*/ + {} + + + + +EXPORT_C TRect::TRect(const TPoint& aPointA,const TPoint& aPointB) : iTl(aPointA),iBr(aPointB) +/** +Constructs the rectangle with two TPoints, corresponding to its top left and +bottom right hand corners. + +@param aPointA The co-ordinates of the rectangle's top left hand corner. +@param aPointB The co-ordinates of the rectangle's bottom right hand corner. +*/ + {} + + + + +EXPORT_C TRect::TRect(const TPoint& aPoint,const TSize& aSize) : iTl(aPoint),iBr(aPoint+aSize) +/** +Constructs the rectangle with a TPoint for its top left corner, and a TSize +for its width and height. + +@param aPoint The rectangle's top left hand corner. +@param aSize The rectangle's width and height. +*/ + {} + + + + +EXPORT_C TRect::TRect(const TSize& aSize) : iTl(0,0), iBr(aSize.iWidth, aSize.iHeight) +/** +Constructs the rectangle with a TSize. + +The co-ordinates of its top left hand corner are initialised to (0,0) and +its width and height are initialised to the values contained in the argument. + +@param aSize The width and height of the rectangle. +*/ + {} + + + + +EXPORT_C void TRect::SetRect(TInt aTlX,TInt aTlY,TInt aBrX,TInt aBrY) +/** +Sets the rectangle's position using four TInts. + +@param aTlX The horizontal co-ordinate of the left hand side of the rectangle. +@param aTlY The vertical co-ordinate of the top of the rectangle. +@param aBrX The horizontal co-ordinate of the right hand side of the rectangle. +@param aBrY The vertical co-ordinate of the bottom of the rectangle. +*/ + { + iTl.iX=aTlX;iTl.iY=aTlY;iBr.iX=aBrX;iBr.iY=aBrY; + } + + + + +EXPORT_C void TRect::SetRect(const TPoint& aPointTL,const TPoint& aPointBR) +/** +Sets the rectangle's position using two TPoints. + +@param aPointTL The co-ordinates of the rectangle's top left hand corner. +@param aPointBR The co-ordinates of the rectangle's bottom right hand corner. +*/ + { + iTl=aPointTL;iBr=aPointBR; + } + + + + +EXPORT_C void TRect::SetRect(const TPoint& aTL,const TSize& aSize) +/** +Sets the rectangle's position using a TPoint and a TSize. + +@param aTL The co-ordinates of the rectangle's top left hand corner. +@param aSize The rectangle's width and height. +*/ + { + iTl=aTL;iBr=aTL+aSize; + } + + + + +EXPORT_C void TRect::Shrink(TInt aDx,TInt aDy) +/** +Shrinks a rectangle using specified horizontal and vertical offsets. + +The offset values are added to the co-ordinates of its top left hand corner, +and the same values are subtracted from the co-ordinates of its bottom right +hand corner. The co-ordinates of the centre of the rectangle remain unchanged. +If either value is negative, the rectangle expands in the corresponding direction. + +@param aDx The number of pixels by which to move the left and right hand sides + of the rectangle. A positive value reduces the width, a negative + value increases it. +@param aDy The number of pixels by which to move the top and bottom of the + rectangle. A positive value reduces the height, a negative value + increases it. +*/ + { + Adjust(aDx,aDy); + } + + + + +EXPORT_C void TRect::Shrink(const TSize& aSize) +/** +Shrinks a rectangle using a specified TSize offset. + +The rectangle shrinks by twice the value of the height and width specified +in the TSize. The co-ordinates of the centre of the rectangle remain unchanged. +If either value is negative, the rectangle expands in the +corresponding direction. + +@param aSize The number of pixels by which to move the left and right hand + sides of the rectangle (by aSize.iWidth) and the top and bottom + (by aSize.iHeight). +*/ + { + Adjust(aSize.iWidth,aSize.iHeight); + } + + + + +EXPORT_C void TRect::Resize(const TSize& aSize) +/** +Resizes a rectangle by adding a TSize offset. + +The offset is added to the co-ordinates of its bottom right hand corner. If +either value in the TSize is negative, the rectangle shrinks in the +corresponding direction. The co-ordinates of the rectangle's top left hand +corner are unaffected. + +@param aSize The number of pixels by which to move the rectangle; the right + hand side by aSize.iWidth and the bottom by aSize.iHeight. +*/ + { + iBr+=aSize; + } + + + + +EXPORT_C void TRect::Resize(TInt aDx, TInt aDy) +/** +Resizes a rectangle by adding a horizontal and vertical offset. + +The offset is added to the co-ordinates of its bottom right hand corner. If +either value is negative, the rectangle shrinks in the corresponding direction. +The co-ordinates of the rectangle's top left hand corner are unaffected. + +@param aDx The number of pixels by which to move the right hand side of the + rectangle. +@param aDy The number of pixels by which to move the bottom of the rectangle. +*/ + { + iBr.iX+=aDx;iBr.iY+=aDy; + } + + + + +EXPORT_C TBool TRect::operator==(const TRect &aRect) const +/** +Compares two rectangles for equality. + +For two rectangles to be equal, the co-ordinates of both their top left and +bottom right hand corners must be equal. + +@param aRect The rectangle to compare with this rectangle. + +@return True, if the rectangles have the same co-ordinates; false, otherwise. +*/ + { + + return(iTl==aRect.iTl && iBr==aRect.iBr); + } + + + + +EXPORT_C TBool TRect::operator!=(const TRect &aRect) const +/** +Compares two rectangles for inequality. + +Two rectangles are unequal if any of their co-ordinates differ. + +@param aRect The rectangle to compare with this rectangle. +@return True, if the rectangles do not have the same co-ordinates; false, if + all co-ordinates are equal. +*/ + { + + return(iTl!=aRect.iTl || iBr!=aRect.iBr); + } + + + + +EXPORT_C void TRect::Move(const TPoint &aOffset) +/** +Moves the rectangle by adding a TPoint offset. + +The offset is added to the co-ordinates of both its top left and bottom right +hand corners. The size of the rectangle is unchanged. + +@param aOffset The number of pixels to move the rectangle; horizontally by + aOffset.iX and vertically by aOffset.iY. +*/ + { + + iTl+=aOffset; + iBr+=aOffset; + } + + + + +EXPORT_C void TRect::Move(TInt aDx,TInt aDy) +/** +Moves the rectangle by adding an x, y offset. + +The offset is added to the co-ordinates of both its top left and bottom right +hand corners. The size of the rectangle is unchanged. + +@param aDx The number of pixels to move the rectangle horizontally. If negative, + the rectangle moves leftwards. +@param aDy The number of pixels to move the rectangle vertically. If negative, + the rectangle moves upwards. +*/ + { + + iTl.iX+=aDx; + iTl.iY+=aDy; + iBr.iX+=aDx; + iBr.iY+=aDy; + } + + + + +// private function, hence not exported +void TRect::Adjust(TInt aDx,TInt aDy) +// +// Adjust by a delta. +// + { + + iTl.iX+=aDx; + iTl.iY+=aDy; + iBr.iX-=aDx; + iBr.iY-=aDy; + } + + + + +EXPORT_C void TRect::Grow(TInt aDx,TInt aDy) +// +// Grow by a delta. +// +/** +Grows the rectangle using the specified horizontal and vertical offsets. + +The offset values are subtracted from the co-ordinates of its top left hand +corner, and the same values are added to the co-ordinates of its bottom right +hand corner. The co-ordinates of the centre of the rectangle remain unchanged. +If either value is negative, the rectangle shrinks in the corresponding direction. + +@param aDx The number of pixels by which to move the left and right hand sides + of the rectangle. A positive value increases the width, a negative + value reduces it. +@param aDy The number of pixels by which to move the top and bottom of the + rectangle. A positive value increases the height, a negative + value reduces it. +*/ + { + + iTl.iX-=aDx; + iTl.iY-=aDy; + iBr.iX+=aDx; + iBr.iY+=aDy; + } + + + + +EXPORT_C void TRect::Grow(const TSize &aSize) +// +// Grow by a size. +// +/** +Grows a rectangle using the specified TSize offset. + +The rectangle grows by twice the value of the height and width specified in +the TSize. The co-ordinates of the centre of the rectangle remain unchanged. +If either value is negative, the rectangle shrinks in the +corresponding direction. + +@param aSize The number of pixels by which to move the left and right hand + sides of the rectangle (by aSize.iWidth) and the top and bottom + (by aSize.iHeight). +*/ + { + + iTl-=aSize; + iBr+=aSize; + } + + + + +EXPORT_C void TRect::BoundingRect(const TRect &aRect) +// +// Union of this and aRect, a union is defined as the minimum rectangle that encloses +// both source rectangles +// +/** +Gets the minimal rectangle which bounds both this rectangle and the specified +rectangle, and assigns it to this rectangle. + +@param aRect The rectangle to use with this rectangle to get the minimal bounding + rectangle. +*/ + { + + if (iTl.iX>aRect.iTl.iX) + iTl.iX=aRect.iTl.iX; + if (iTl.iY>aRect.iTl.iY) + iTl.iY=aRect.iTl.iY; + if (iBr.iX=iBr.iX || iTl.iY>=iBr.iY); + } + + + + +EXPORT_C void TRect::Intersection(const TRect &aRect) +// +// Intersect this with aRect. +// +/** +Gets the area of intersection between this rectangle and the specified +rectangle, and assigns it to this rectangle. + +It is usual to call TRect::Intersects() first to verify whether the two rectangles +intersect. If the two rectangles do not intersect, then, on return, this rectangle +is set to be empty. + +@param aRect The rectangle to be used with this rectangle to get the area + of intersection. + +@see TRect::Intersects +*/ + { + + if (iTl.iXaRect.iBr.iX) + iBr.iX=aRect.iBr.iX; + if (iBr.iY>aRect.iBr.iY) + iBr.iY=aRect.iBr.iY; + } + + + + +EXPORT_C TBool TRect::Intersects(const TRect &aRect) const +// +// If aRect Intersects with this return True. +// +/** +Tests whether this rectangle overlaps with the specified rectangle. + +Two rectangles overlap if any point is located within both rectangles. There +is no intersection if two adjacent sides touch without overlapping, or if +either rectangle is empty. + +@param aRect The rectangle to compare with this rectangle for an intersection. + +@return True, if the two rectangles overlap; false, if there is no overlap. +*/ + { + + return(!(IsEmpty() || aRect.IsEmpty() || iBr.iX<=aRect.iTl.iX || iBr.iY<=aRect.iTl.iY || iTl.iX>=aRect.iBr.iX || iTl.iY>=aRect.iBr.iY)); + } + + + + +EXPORT_C void TRect::Normalize() +// +// Make the conditions top left bottom right true. +// +/** +Ensures that the rectangle's width and height have positive values. + +For example, if the rectangle's co-ordinates are such that the top is below +the bottom, or the right hand side is to the left of the left hand side, normalisation +swaps the co-ordinates of the top and bottom or of the left and right. +*/ + { + + if (iTl.iX>iBr.iX) + { + TInt temp=iTl.iX; + iTl.iX=iBr.iX; + iBr.iX=temp; + } + if (iTl.iY>iBr.iY) + { + TInt temp=iTl.iY; + iTl.iY=iBr.iY; + iBr.iY=temp; + } + } + + + + +EXPORT_C TBool TRect::Contains(const TPoint &aPoint) const +/** +Tests whether a point is located within the rectangle. + +Note that a point located on the top or left hand side of the rectangle is +within the rectangle. A point located on the right hand side or bottom is +considered to be outside the rectangle. + +@param aPoint The point to be tested. + +@return True, if the point is within the rectangle; false, otherwise. +*/ + { + if (aPoint.iX=iBr.iX || aPoint.iY=iBr.iY) + return(EFalse); + return(ETrue); + } + + + + +EXPORT_C TSize TRect::Size() const +/** +Gets the size of the rectangle. + +@return The size of the rectangle. +*/ + { + return((iBr-iTl).AsSize()); + } + + + + +EXPORT_C TInt TRect::Width() const +/** +Gets the width of the rectangle. + +@return The width of the rectangle. +*/ + { + return(iBr.iX-iTl.iX); + } + + + + +EXPORT_C TInt TRect::Height() const +/** +Gets the height of the rectangle. + +@return The height of the rectangle. +*/ + { + return(iBr.iY-iTl.iY); + } + + + + +EXPORT_C TBool TRect::IsNormalized() const +/** +Tests whether the rectangle is normalised. + +A rectangle is normalised when its width and height are both zero or greater. + +@return True, if normalised; false, if not. +*/ + { + return((iBr.iX>=iTl.iX) && (iBr.iY>=iTl.iY)); + } + + + + +EXPORT_C TPoint TRect::Center() const +/** +Gets the point at the centre of the rectangle. + +@return The point at the centre of the rectangle. +*/ + { + return(TPoint((iTl.iX+iBr.iX)/2,(iTl.iY+iBr.iY)/2)); + } + + + + +EXPORT_C void TRect::SetSize(const TSize &aSize) +/** +Sets the size of the rectangle. + +Only the co-ordinates of the bottom right hand corner of the rectangle are +affected. + +@param aSize The new width is aSize.iWidth. The new height is aSize.iHeight. +*/ + { + iBr=iTl+aSize; + } + + + + +EXPORT_C void TRect::SetWidth(TInt aWidth) +/** +Sets the width of the rectangle. + +Only the position of the rectangle's right hand side is affected. + +@param aWidth The new width of the rectangle. +*/ + { + iBr.iX=iTl.iX+aWidth; + } + + + + +EXPORT_C void TRect::SetHeight(TInt aHeight) +/** +Sets the height of the rectangle. + +Only the position of the bottom of the rectangle is affected. + +@param aHeight The new height of the rectangle. +*/ + { + iBr.iY=iTl.iY+aHeight; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_htab.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_htab.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,669 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/euser/us_htab.cpp +// +// + +#include "us_std.h" +#include + +const TUint KDefaultIndexBits = 4; +const TUint KMaxIndexBits = 28; + +extern TUint32 DefaultIntegerHash(const TAny*); +extern TUint32 DefaultStringHash(const TUint8*, TInt); +extern TUint32 DefaultWStringHash(const TUint16*, TInt); + +#define _DEBUG_HASH_TABLE +#ifndef _DEBUG +#undef _DEBUG_HASH_TABLE +#endif + +#define __PANIC(x) Panic(x) + +EXPORT_C RHashTableBase::RHashTableBase(TGeneralHashFunction32 aHash, TGeneralIdentityRelation aId, TInt aElementSize, TInt aKeyOffset) + : iHashFunc(aHash), + iIdFunc(aId), + iIndexBits(TUint8(KDefaultIndexBits)), + iGeneration(EGen0), + iPad0(0), + iElements(0), + iCount(0), + iPad1(0), + iPad2(0) + { + __ASSERT_ALWAYS(aHash!=NULL, __PANIC(EHashTableNoHashFunc)); + __ASSERT_ALWAYS(aId!=NULL, __PANIC(EHashTableNoIdentityRelation)); + __ASSERT_ALWAYS(aElementSize>0, __PANIC(EHashTableBadElementSize)); + __ASSERT_ALWAYS(aKeyOffset==0 || TUint(aKeyOffset-4)<(TUint)Min(252,aElementSize-4), __PANIC(EHashTableBadKeyOffset)); + iElementSize = aElementSize; + iKeyOffset = (TUint8)aKeyOffset; // 0 means ptr at offset 4 + iEmptyCount = 0; + SetThresholds(); + } + +void RHashTableBase::SetThresholds() + { + TUint32 max = 1u << iIndexBits; + if (iIndexBits == KMaxIndexBits) + iUpperThreshold = KMaxTUint; + else + iUpperThreshold = (max>>1) + (max>>2); // 3/4 of max + if (iIndexBits == KDefaultIndexBits) + iLowerThreshold = 0; + else + iLowerThreshold = max >> 2; // 1/4 of max + + // clean table if <1/8 of entries empty + iCleanThreshold = max>>3; + } + +EXPORT_C void RHashTableBase::Close() + { + User::Free(iElements); + new (this) RHashTableBase(iHashFunc, iIdFunc, iElementSize, iKeyOffset); + } + +EXPORT_C TInt RHashTableBase::Count() const + { + return (TInt)iCount; + } + +EXPORT_C TAny* RHashTableBase::Find(const TAny* aKey, TInt aOffset) const + { + if (!iElements) + return NULL; + TUint32 hash = (*iHashFunc)(aKey); + TUint32 ix = hash >> (32 - iIndexBits); // top bits of hash used as initial index + hash = (hash &~ EStateMask) | iGeneration; + TUint32 mask = (1u << iIndexBits) - 1; // iIndexBits 1's + TUint32 step = (hash >> 1) & mask; // iIndexBits-1 LSBs of hash followed by 1 + FOREVER + { + const SElement* e = ElementC(ix); + if (e->iHash==hash && (*iIdFunc)(aKey, GetKey(e))) + { + if (aOffset >= 0) + return ((TUint8*)e) + aOffset; + return *(TAny**)((TUint8*)e - aOffset); + } + if (e->IsEmpty()) + break; + ix = (ix + step) & mask; + } + return NULL; + } + +EXPORT_C TAny* RHashTableBase::FindL(const TAny* aKey, TInt aOffset) const + { + TAny* p = Find(aKey, aOffset); + if (!p) + User::Leave(KErrNotFound); + return p; + } + +TInt RHashTableBase::Insert(const TAny* aKey, TAny*& aElement) + { + TInt r = KErrNone; + TUint32 max = 1u << iIndexBits; + if (!iElements) + { + iElements = User::AllocZ(max * iElementSize); + if (!iElements) + return KErrNoMemory; + iEmptyCount = max; + } + else if (iCount > iUpperThreshold) + { + r = ExpandTable(iIndexBits+1); + if (iEmptyCount>1) + r = KErrNone; // doesn't matter if expand fails unless there is only one empty slot left + max = 1u << iIndexBits; + } + else if (iEmptyCount < iCleanThreshold) + ReformTable(iIndexBits); + + TUint32 hash = (*iHashFunc)(aKey); + TUint32 ix = hash >> (32 - iIndexBits); + TUint32 mask = max - 1; + hash = (hash &~ EStateMask) | iGeneration; + TUint32 step = (hash >> 1) & mask; // iIndexBits-1 LSBs of hash followed by 1 + SElement* e = 0; + SElement* d = 0; + FOREVER + { + e = Element(ix); + if (e->IsEmpty()) + break; + if (e->IsDeleted()) + { + if (!d) + d = e; + } + else if (e->iHash==hash && (*iIdFunc)(aKey, GetKey(e))) + { + aElement = e; + return KErrNone; // duplicate so always succeed + } + ix = (ix + step) & mask; + } + if (d) + e = d; // if we can reuse a deleted slot, always succeed + else + { + if (r!=KErrNone) + return r; // new slot needed - if we failed to expand, fail the request here + --iEmptyCount; + } + e->iHash = hash; + aElement = e; + ++iCount; + return KErrNone; + } + +EXPORT_C TInt RHashTableBase::PtrInsert(const TAny* aKey, const TAny* aValue) + { + const TAny** e; + TInt r = Insert(aKey, (TAny*&)e); + if (r==KErrNone) + { + e[1] = aKey; + if (iElementSize>=12) + e[2] = aValue; + } + return r; + } + +EXPORT_C void RHashTableBase::PtrInsertL(const TAny* aKey, const TAny* aValue) + { + const TAny** e; + User::LeaveIfError(Insert(aKey, (TAny*&)e)); + e[1] = aKey; + if (iElementSize>=12) + e[2] = aValue; + } + +EXPORT_C TInt RHashTableBase::ValueInsert(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize) + { + TUint8* e; + TInt r = Insert(aKey, (TAny*&)e); + if (r==KErrNone) + { + memcpy(e+iKeyOffset, aKey, aKeySize); + if (aValue) + memcpy(e+aValueOffset, aValue, aValueSize); + } + return r; + } + +EXPORT_C void RHashTableBase::ValueInsertL(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize) + { + TUint8* e; + User::LeaveIfError(Insert(aKey, (TAny*&)e)); + memcpy(e+iKeyOffset, aKey, aKeySize); + if (aValue) + memcpy(e+aValueOffset, aValue, aValueSize); + } + +EXPORT_C TInt RHashTableBase::Remove(const TAny* aKey) + { + SElement* e = (SElement*)Find(aKey); + if (!e) + return KErrNotFound; + e->SetDeleted(); + if (--iCount == 0) + { + Close(); + return KErrNone; + } + if (iCount < iLowerThreshold) + ShrinkTable(); + return KErrNone; + } + +void RHashTableBase::ReformTable(TUint aNewIndexBits) + { + if (!iElements) + return; + TUint32 max = 1u << iIndexBits; + TUint32 newmax = 1u << aNewIndexBits; + TUint32 newmask = newmax - 1; + TUint32 ix = 0; + TUint32 newsh = 32 - aNewIndexBits; + iGeneration ^= 1; // change generation so we know which entries have been updated + for (; ix < max; ++ix) + { + SElement* e = Element(ix); + if (e->IsEmpty()) + continue; // skip empty entries + if (e->IsDeleted()) + { + e->SetEmpty(); // mark deleted entries as empty + continue; + } + if ((e->iHash & EStateMask) == iGeneration) // entry has been processed so leave it alone + continue; + TUint32 pos = e->iHash >> newsh; + if (pos == ix) + { + e->iHash ^= 1; // entry is in first position for its hash so leave it there + continue; + } + TUint32 step = (e->iHash >> 1) & newmask; + FOREVER + { + SElement* d = Element(pos); + if (d->IsEmptyOrDeleted()) + { + memcpy(d, e, iElementSize); + d->iHash &= ~EStateMask; + d->iHash |= iGeneration; // mark it as processed + e->SetEmpty(); // remove old entry + break; + } + if ((d->iHash & EStateMask) != iGeneration) + { + if (pos == ix) + { + e->iHash ^= 1; // entry is already in correct position so leave it there + break; + } + if ((d->iHash >> newsh) == pos) + { + // candidate for replacement is in correct position so leave it and look elsewhere + d->iHash ^= 1; + } + else + { + Mem::Swap(d, e, iElementSize); // switch entries + d->iHash ^= 1; // mark entry as processed + --ix; // process current position again + break; + } + } + pos = (pos + step) & newmask; + } + } + iIndexBits = (TUint8)aNewIndexBits; + iEmptyCount = newmax - iCount; + SetThresholds(); +#ifdef _DEBUG_HASH_TABLE + VerifyReform(); +#endif + } + +#ifdef _DEBUG_HASH_TABLE +void RHashTableBase::VerifyReform() + { + TUint32 dcount; + ConsistencyCheck(&dcount); + __ASSERT_ALWAYS(dcount==0, __PANIC(EHashTableDeletedEntryAfterReform)); + } +#endif + +EXPORT_C void RHashTableBase::ConsistencyCheck(TUint32* aDeleted, TUint32* aComparisons, TUint32 aChainLimit, TUint32* aChainInfo) + { +#ifdef _DEBUG_HASH_TABLE + TUint32 count = 0; + TUint32 dcount = 0; + TUint32 ecount = 0; + TUint32 max = 1u << iIndexBits; + TUint32 mask = max - 1; + TUint32 sh = 32 - iIndexBits; + TUint32 ix = 0; + TUint32 cmp = 0; + if (aChainInfo) + memclr(aChainInfo, aChainLimit*sizeof(TUint32)); + if (iElements) + { + for (ix = 0; ix < max; ++ix) + { + SElement* e = Element(ix); + if (e->IsEmpty()) + { + ++ecount; + continue; + } + if (e->IsDeleted()) + { + ++dcount; + continue; + } + ++count; + __ASSERT_ALWAYS((e->iHash & EStateMask) == iGeneration, __PANIC(EHashTableBadGeneration)); + TUint32 hash = (*iHashFunc)(GetKey(e)); + hash = (hash &~ EStateMask) | iGeneration; + __ASSERT_ALWAYS(e->iHash == hash, __PANIC(EHashTableBadHash)); + + TUint32 pos = hash >> sh; + TUint32 step = (hash >> 1) & mask; + SElement* f = 0; + TUint32 cl = 0; + FOREVER + { + f = Element(pos); + if (f->IsEmpty()) + { + f = 0; + break; + } + ++cl; + if (!f->IsDeleted() && f->iHash==hash) + { + ++cmp; + if (e==f || (*iIdFunc)(GetKey(e), GetKey(f))) + break; + } + pos = (pos + step) & mask; + } + __ASSERT_ALWAYS(e==f, __PANIC(EHashTableEntryLost)); + if (aChainInfo && cl grow_threshold) + { + grow_threshold <<= 1; + ++new_ixb; + } + // Expand the table if it isn't large enough to fit aCount elements in it + // or if the table hasn't yet been created, create it with ExpandTable + if (new_ixb > TInt(iIndexBits) || !iElements) + { + return ExpandTable(new_ixb); + } + return KErrNone; + } + +EXPORT_C void RHashTableBase::ReserveL(TInt aCount) + { + User::LeaveIfError(Reserve(aCount)); + } + +EXPORT_C THashTableIterBase::THashTableIterBase(const RHashTableBase& aTable) + : iTbl(aTable), iIndex(-1), iPad1(0), iPad2(0) + { + } + +EXPORT_C void THashTableIterBase::Reset() + { + iIndex = -1; + } + +EXPORT_C const TAny* THashTableIterBase::Next(TInt aOffset) + { + TInt max = 1 << iTbl.iIndexBits; + if (!iTbl.iElements) + return NULL; + __ASSERT_DEBUG(iIndex>=-1 && iIndex<=max, __PANIC(EHashTableIterNextBadIndex)); + if (iIndex < max) + ++iIndex; + for(; iIndex < max; ++iIndex) + { + const RHashTableBase::SElement* e = iTbl.ElementC(iIndex); + if (!e->IsEmptyOrDeleted()) + { + if (aOffset >= 0) + return (TUint8*)e + aOffset; + return *(const TAny**)((TUint8*)e - aOffset); + } + } + return NULL; + } + +EXPORT_C const TAny* THashTableIterBase::Current(TInt aOffset) const + { + TInt max = 1 << iTbl.iIndexBits; + if (!iTbl.iElements || iIndex<0 || iIndex>=max) + return NULL; + const RHashTableBase::SElement* e = iTbl.ElementC(iIndex); + __ASSERT_DEBUG(!e->IsEmptyOrDeleted(), __PANIC(EHashTableIterCurrentBadIndex)); + if (aOffset >= 0) + return (TUint8*)e + aOffset; + return *(const TAny**)((TUint8*)e - aOffset); + } + +EXPORT_C void THashTableIterBase::RemoveCurrent() + { + TInt max = 1 << iTbl.iIndexBits; + if (!iTbl.iElements || iIndex<0 || iIndex>=max) + return; + RHashTableBase& tbl = (RHashTableBase&)iTbl; + RHashTableBase::SElement* e = tbl.Element(iIndex); + __ASSERT_DEBUG(!e->IsEmptyOrDeleted(), __PANIC(EHashTableIterCurrentBadIndex)); + + // mark entry as deleted but don't shrink the array since that will mess up the iteration + e->SetDeleted(); + if (--tbl.iCount == 0) + { + memclr(tbl.iElements, max * tbl.iElementSize); + tbl.iEmptyCount = max; + tbl.iGeneration = RHashTableBase::EGen0; + } + } + +/** +@publishedAll +@released + +Calculate a 32 bit hash from an 8 bit descriptor. + +@param aDes The descriptor to be hashed. +@return The calculated 32 bit hash value. +*/ +EXPORT_C TUint32 DefaultHash::Des8(const TDesC8& aDes) + { + return DefaultStringHash(aDes.Ptr(), aDes.Length()); + } + + +/** +@publishedAll +@released + +Calculate a 32 bit hash from a 16 bit descriptor. + +@param aDes The descriptor to be hashed. +@return The calculated 32 bit hash value. +*/ +EXPORT_C TUint32 DefaultHash::Des16(const TDesC16& aDes) + { + return DefaultWStringHash(aDes.Ptr(), aDes.Size()); + } + + +/** +@publishedAll +@released + +Calculate a 32 bit hash from a TInt pointer. + +@param aPtr The TInt pointer to be hashed. +@return The calculated 32 bit hash value. +*/ +EXPORT_C TUint32 DefaultHash::IntegerPtr(TInt* const& aPtr) + { + return Integer((TInt)aPtr); + } + +/** +@publishedAll +@released + +Calculate a 32 bit hash from a TDesC8 pointer. + +@param aPtr The TDesC8 pointer to be hashed. +@return The calculated 32 bit hash value. +*/ +EXPORT_C TUint32 DefaultHash::Des8Ptr(TDesC8* const& aPtr) + { + return Integer((TInt)aPtr); + } + +/** +@publishedAll +@released + +Calculate a 32 bit hash from a TDesC16 pointer. + +@param aPtr The TDesC16 pointer to be hashed. +@return The calculated 32 bit hash value. +*/ +EXPORT_C TUint32 DefaultHash::Des16Ptr(TDesC16* const& aPtr) + { + return Integer((TInt)aPtr); + } + +/** +@publishedAll +@released + +Compare two integers for equality. + +@param aA The first integer to be compared +@param aB The second integer to be compared +@return ETrue if the arguments are equal, EFalse otherwise. +*/ +EXPORT_C TBool DefaultIdentity::Integer(const TInt& aA, const TInt& aB) + { + return aA == aB; + } + + +/** +@publishedAll +@released + +Compare two 8 bit descriptors for exact binary equality. + +@param aA The first integer to be compared +@param aB The second integer to be compared +@return ETrue if the arguments are identical, EFalse otherwise. +*/ +EXPORT_C TBool DefaultIdentity::Des8(const TDesC8& aA, const TDesC8& aB) + { + return aA == aB; + } + + +/** +@publishedAll +@released + +Compare two 16 bit descriptors for exact binary equality. + +@param aA The first integer to be compared +@param aB The second integer to be compared +@return ETrue if the arguments are identical, EFalse otherwise. +*/ +EXPORT_C TBool DefaultIdentity::Des16(const TDesC16& aA, const TDesC16& aB) + { + return aA == aB; + } + +/** +@publishedAll +@released + +Compare two TInt pointers for equality. + +@param aA The first pointer to be compared +@param aB The second pointer to be compared +@return ETrue if the arguments are equal, EFalse otherwise. +*/ +EXPORT_C TBool DefaultIdentity::IntegerPtr(TInt* const& aA,TInt* const& aB) + { + return aA == aB; + } + +/** +@publishedAll +@released + +Compare two TDesC8 pointers for equality. + +@param aA The first pointer to be compared +@param aB The second pointer to be compared +@return ETrue if the arguments are equal, EFalse otherwise. +*/ +EXPORT_C TBool DefaultIdentity::Des8Ptr(TDesC8* const& aA,TDesC8* const& aB) + { + return aA == aB; + } + +/** +@publishedAll +@released + +Compare two TDesC16 pointers for equality. + +@param aA The first pointer to be compared +@param aB The second pointer to be compared +@return ETrue if the arguments are equal, EFalse otherwise. +*/ +EXPORT_C TBool DefaultIdentity::Des16Ptr(TDesC16* const& aA,TDesC16* const& aB) + { + return aA == aB; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_lex16.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_lex16.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,896 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_lex16.cpp +// +// + +#include "us_std.h" + + + + +EXPORT_C TLex16::TLex16() + : iNext(NULL),iBuf(NULL),iEnd(NULL),iMark(NULL) +/** +Default cosntructor. + +Constructs a TLex16, initialising its members to NULL. +*/ + {} + + + + +EXPORT_C void TLex16::Assign(const TUint16 *aString) +/** +Assigns a string to this object from another string. + +@param aString A pointer to a string to be assigned. +*/ + { + + iMark.iPtr=iNext=iBuf=aString; + iEnd=iBuf+User::StringLength(aString); + } + + + + +EXPORT_C void TLex16::Assign(const TDesC16 &aDes) +/** +Assigns a string to this object from a descriptor. + +@param aDes The descriptor to be assigned. +*/ + { + + iMark.iPtr=iNext=iBuf=aDes.Ptr(); + iEnd=iBuf+aDes.Length(); + } + + + + +EXPORT_C void TLex16::UnGet() +/** +Decrements the next character position, allowing the previously "got" character +to be re-read. + +@panic USER 64, if the previous character is before the start of the string. +*/ + { + + __ASSERT_ALWAYS(iNext>iBuf,Panic(ETLex16UnGetUnderflow)); + iNext--; + } + + + + +EXPORT_C void TLex16::UnGetToMark(const TLexMark16 aMark) +/** +Sets the next character position to the supplied extraction mark position. + +@param aMark Mark to copy to the next character position. + +@panic USER 68, if the extraction mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + iNext=aMark.iPtr; + } + + + + +EXPORT_C void TLex16::Inc(TInt aNumber) +/** +Increments the next character position by aNumber. + +@param aNumber The number of characters to increment the next character + position by. + +@panic USER 65, if the increment puts the next character position before the + start or beyond the end of the string. +*/ + { + + iNext+=aNumber; + __ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex16IncOutOfRange)); + } + + + + +EXPORT_C void TLex16::Inc() +/** +Increments to the next character position. + +@panic USER 65, if the increment puts the next character position before the + start or beyond the end of the string. +*/ + { + + if (!Eos()) + iNext++; + __ASSERT_ALWAYS(iNext<=iEnd,Panic(ETLex16IncOutOfRange)); + } + + + + +EXPORT_C TChar TLex16::Get() +/** +Gets the next character in the string and increments the next +character position. + +@return Next character to be read. 0 if at the end of the string. +*/ + { + + if (Eos()) + return(0); + return(*iNext++); + } + + + + +EXPORT_C TChar TLex16::Peek() const +/** +Shows the next character to be returned by Get(). + +@return Character to be returned by the next call to Get(). 0 if at the end of the + string. + +@see TLex16::Get +*/ + { + + if (Eos()) + return(0); + return(*iNext); + } + + + + +EXPORT_C void TLex16::SkipSpace() +/** +Moves the next character position past any white space (space or separator). + +Stops if at the end of string. +*/ + { + + while (!Eos() && Peek().IsSpace()) + iNext++; + } + + + + +EXPORT_C void TLex16::SkipAndMark(TInt aNumber,TLexMark16& aMark) +/** +Moves the next character position a specified number of characters and copies +it to the specified extraction mark. + +@param aNumber Number of characters to skip. +@param aMark On return, set to the next character position. + +@panic USER 66, if the skip moves the next character position either to before + the start or beyond the end of the string. +*/ + { + + iNext+=aNumber; + __ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex16SkipOutOfRange)); + Mark(aMark); + } + + + + +EXPORT_C void TLex16::SkipSpaceAndMark(TLexMark16& aMark) +/** +Moves the next character position past any white space and copies it to the +specified extraction mark. + +Stops if at the end of the string. + +@param aMark On return, contains a reference to the next character position. +*/ + { + + SkipSpace(); + Mark(aMark); + } + + + + +EXPORT_C void TLex16::SkipCharacters() +/** +Moves the next character position to the next white space (space or separator). + +Stops if at the end of the string. +*/ + { + + while (!Eos() && !Peek().IsSpace()) + iNext++; + } + + + + +EXPORT_C TInt TLex16::TokenLength(const TLexMark16 aMark) const +/** +Gets the length of the token starting at the specified extraction mark. + +@param aMark Extraction mark indicating the start of the token. + +@return Length of the token. + +@panic USER 68, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + return (iNext-aMark.iPtr); + } + + + + +EXPORT_C TPtrC16 TLex16::MarkedToken(const TLexMark16 aMark) const +/** +Extracts the token, starting at the specified mark + +@param aMark Extraction mark indicating the start of the token. + +@return Extracted token. + +@panic USER 68, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + return(TPtrC16(aMark.iPtr,TokenLength(aMark))); + } + + + + +EXPORT_C TPtrC16 TLex16::MarkedToken() const +// +// Extract the internally marked token +// there is the assumption here that iMark is always valid +/** +Extracts the marked token. + +Note that the function assumes that the current extraction mark is valid. + +@return Extracted token. + +@panic USER 68, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + return(TPtrC16(iMark.iPtr,TokenLength())); + } + + + + +EXPORT_C TPtrC16 TLex16::NextToken() +/** +Strips any white space and extracts the next token. + +@return Extracted token. +*/ + { + TLexMark16 mark; + + SkipSpaceAndMark(mark); + SkipCharacters(); + return(TPtrC16(mark.iPtr,iNext-mark.iPtr)); + } + + + + +EXPORT_C TPtrC16 TLex16::Remainder() const +/** +Gets a descriptor containing all the text from the next character position +to the end of the string. + +@return Text from the next character position onwards. + +@panic USER 17, if the value of (next character position - extraction mark) is + negative. +*/ + { + + return(TPtrC16(iNext,iEnd-iNext)); + } + + + + +EXPORT_C TPtrC16 TLex16::RemainderFromMark(const TLexMark16 aMark) const +/** +Gets a descriptor containing all the text from the specified extraction mark +to the end of the string. + +@param aMark Extraction mark indicating where remaining text starts. + +@return Text from the specified extraction mark onwards. + +@panic USER 17, if the value of (next character position - extraction mark) is + negative. +@panic USER 68, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + return(TPtrC16(aMark.iPtr,iEnd-aMark.iPtr)); + } + + + + +EXPORT_C TPtrC16 TLex16::RemainderFromMark() const +// +// Return the remainder from iMark +// There is an assumption here that the internal mark will always be valid +// +/** +Gets a descriptor containing all the text from the extraction mark to the end +of the string. + +The function assumes that the current extraction mark is valid. + +@return Text from the extraction mark onwards. +*/ + { + + return(TPtrC16(iMark.iPtr,iEnd-iMark.iPtr)); + } + + + + +EXPORT_C TInt TLex16::Offset() const +// +// Return the offset from iNext to the lex start. +// +/** +Gets the offset of the next character position from the start of the string. + +@return Offset of next character position. +*/ + { + + return((TUint)(iNext-iBuf)); + } + + + + +EXPORT_C TInt TLex16::MarkedOffset(const TLexMark16 aMark) const +/** +Gets the offset of the specified extraction mark from the start of the string. + +@param aMark Extraction mark. + +@return The offset of the extraction mark. + +@panic USER 68, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + return((TUint)(aMark.iPtr-iBuf)); + } + + + + +EXPORT_C TInt TLex16::BoundedVal(TUint32 &aVal,TRadix aRadix,TUint aLimit) +/** +Parses the string to extract a 32-bit unsigned integer, using the +specified radix, and checks that it is within the specified limit. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint l=aLimit/aRadix; + TUint v=0; + TUint d=0; + TLexMark16 mark(iNext); + while (!Eos()) + { + TChar c=Peek(); + if (!c.IsHexDigit()) + break; + c=Get(); + if (c.IsAlpha()) + { + c.UpperCase(); + c-=('A'-10); + } + else + c-='0'; + if (c>=(TUint)aRadix) + { + iNext--; + break; + } + if (v>l) + { + UnGetToMark(mark); + return(KErrOverflow); + } + TUint o=v; + v*=aRadix; + v+=c; + if (o>v) + { + UnGetToMark(mark); + return(KErrOverflow); + } + d++; + } + if (d==0) + { + UnGetToMark(mark); + return(KErrGeneral); + } + if (v>aLimit) + { + UnGetToMark(mark); + return(KErrOverflow); + } + aVal=v; + return(KErrNone); + } + + + + +EXPORT_C TInt TLex16::BoundedVal(TInt32 &aVal,TInt aLimit) +/** +Parses the string to extract a 32-bit signed integer, and checks that it is +within the specified limit. + +@param aVal On return, contains the extracted integer. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + if (Eos()) + return(KErrGeneral); + TUint lim=aLimit; + TLexMark16 mark(iNext); + TUint s=FALSE; + TChar c=Peek(); + if (c=='-') + { + lim++; + s++; + Inc(); + } + else if (c=='+') + Inc(); + TUint32 v; + TInt r=BoundedVal(v,EDecimal,lim); + if (r==KErrNone) + { + if (v>lim) + r=KErrOverflow; + else if (s) + aVal=(-((TInt32)v)); + else + aVal=v; + } + if (r!=KErrNone) + UnGetToMark(mark); + return(r); + } + + + + +EXPORT_C TInt TLex16::BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit) +/** +Parses the string to extract a 64-bit signed integer, using the +specified radix, and checks that it is within the specified limit. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + TUint64 rad = aRadix; + TUint64 lim = static_cast(aLimit); + + lim /= rad; + + TUint64 v = 0; + TUint digit=0; + TLexMark16 mark(iNext); + while (!Eos()) + { + TChar c=Peek(); + if (!c.IsHexDigit()) + break; + c=Get(); + if (c.IsAlpha()) + { + c.UpperCase(); + c-=('A'-10); + } + else + c-='0'; + if (c >= rad) + { + iNext--; + break; + } + if (v > lim) + { + UnGetToMark(mark); + return(KErrOverflow); + } + TUint64 old = v; + v*=rad; + v+=c; + if (old > v) + { + UnGetToMark(mark); + return(KErrOverflow); + } + digit++; + } + if (digit==0) + { + UnGetToMark(mark); + return(KErrGeneral); + } + if (v > static_cast(aLimit)) + { + UnGetToMark(mark); + return(KErrOverflow); + } + aVal = static_cast(v); + return(KErrNone); + } + + + + +EXPORT_C TInt TLex16::BoundedVal(TInt64& aVal, const TInt64& aLimit) +/** +Parses the string to extract a 64-bit signed integer, and checks that it +is within the specified limit. + +@param aVal On return, contains the extracted integer. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + if (Eos()) + return(KErrGeneral); + TInt64 lim = aLimit; + TLexMark16 mark(iNext); + TBool s=EFalse; + TChar c=Peek(); + if (c=='-') + { + lim++; + s++; + Inc(); + } + else if (c=='+') + Inc(); + TInt64 v; + TInt r=BoundedVal(v,EDecimal,lim); + if (r==KErrNone) + { + if (v>lim) + r=KErrOverflow; + else if (s) + aVal=(-v); + else + aVal=v; + } + if (r!=KErrNone) + UnGetToMark(mark); + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TInt8 &aVal) +/** +Parses the string to extract a signed 8-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TInt32 v; + TInt r=BoundedVal(v,0x7fu); + if (r==KErrNone) + aVal=(TInt8)v; + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TInt16 &aVal) +/** +Parses the string to extract a signed 16-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TInt32 v; + TInt r=BoundedVal(v,0x7fffu); + if (r==KErrNone) + aVal=(TInt16)v; + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TInt32 &aVal) +/** +Parses the string to extract a signed 32-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TInt32 v; + TInt r=BoundedVal(v,0x7fffffffu); + if (r==KErrNone) + aVal=v; + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TInt64& aVal) +/** +Parses the string to extract a signed 64-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TChar c=Peek(); + if (c=='-' || c=='+') + Inc(); + TInt r; + if (c=='-') + { + r=BoundedVal(aVal, EDecimal, UI64LIT(0x8000000000000000)); + if (r==KErrNone) + aVal=-aVal; + } + else + r=BoundedVal(aVal, UI64LIT(0x7fffffffffffffff)); + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TUint8 &aVal,TRadix aRadix) +/** +Parses the string to extract an 8-bit unsigned integer, using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint32 v; + TInt r=BoundedVal(v,aRadix,0xffu); + if (r==KErrNone) + aVal=(TUint8)v; + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TUint16 &aVal,TRadix aRadix) +/** +Parses the string to extract a 16-bit unsigned integer, using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint32 v; + TInt r=BoundedVal(v,aRadix,0xffffu); + if (r==KErrNone) + aVal=(TUint16)v; + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TUint32 &aVal,TRadix aRadix) +/** +Parses the string to extract a 32-bit unsigned integer, using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint32 v; + TInt r=BoundedVal(v,aRadix,0xffffffffu); + if (r==KErrNone) + aVal=v; + return(r); + } + + + + +EXPORT_C TInt TLex16::Val(TInt64& aVal, TRadix aRadix) +/** +Parses the string to extract a 64-bit integer (treated as unsigned), using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + return BoundedVal(aVal,aRadix,TInt64(UI64LIT(0xffffffffffffffff))); + } + + + + +void TLex16::ValidateMark(const TLexMark16 aMark) const +// +// Asserts that the mark is valid for this lex +// + { + __ASSERT_ALWAYS(aMark.iPtr>=iBuf && aMark.iPtr<=iEnd,Panic(ETLex16MarkOutOfRange)); + } + + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_lex8.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_lex8.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,881 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_lex8.cpp +// +// + +#include "us_std.h" + + + + +EXPORT_C TLex8::TLex8() + : iNext(NULL),iBuf(NULL),iEnd(NULL),iMark(NULL) +/** +Default constructor. + +Constructs a TLex8, initialising its members to NULL. +*/ + {} + + + + +EXPORT_C void TLex8::Assign(const TUint8 *aString) +/** +Assigns a string to this object from another string. + +@param aString A pointer to a string to be assigned. +*/ + { + + iMark.iPtr=iNext=iBuf=aString; + iEnd=iBuf+User::StringLength(aString); + } + + + + +EXPORT_C void TLex8::Assign(const TDesC8 &aDes) +/** +Assigns a string to this object from a descriptor. + +@param aDes The descriptor to be assigned. +*/ + { + + iMark.iPtr=iNext=iBuf=aDes.Ptr(); + iEnd=iBuf+aDes.Length(); + } + + + + +EXPORT_C void TLex8::UnGet() +/** +Decrements the next character position, allowing a previously "got" character +to be re-read. + +@panic USER 59, if the previous character is before the start of the string. +*/ + { + + __ASSERT_ALWAYS(iNext>iBuf,Panic(ETLex8UnGetUnderflow)); + iNext--; + } + + + + +EXPORT_C void TLex8::UnGetToMark(const TLexMark8 aMark) +/** +Sets the next character position to the supplied extraction mark position. + +@param aMark Mark to copy to the next character position. + +@panic USER 63, if the extraction mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + iNext=aMark.iPtr; + } + + + + +EXPORT_C void TLex8::Inc(TInt aNumber) +/** +Increments the next character position by aNumber. + +@param aNumber The number of characters to increment the next character position + by. + +@panic USER 60, if the increment puts the next character position before the + start or beyond the end of the string. +*/ + { + + iNext+=aNumber; + __ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex8IncOutOfRange)); + } + + + + +EXPORT_C void TLex8::Inc() +/** +Increments to the next character position. + +@panic USER 60, if the increment puts the next character position beyond the + end of the string. +*/ + { + + if (!Eos()) + iNext++; + __ASSERT_ALWAYS(iNext<=iEnd,Panic(ETLex8IncOutOfRange)); + } + + + + +EXPORT_C TChar TLex8::Get() +/** +Gets the next character in the string, and increments the next +character position. + +@return Next character to be read.0 if at the end of the string. +*/ + { + + if (Eos()) + return(0); + return(*iNext++); + } + + + + +EXPORT_C TChar TLex8::Peek() const +/** +Shows the next character to be returned by Get(). + +@return Character to be returned by the next call to Get(). 0 if at the + end of the string. + +@see TLex8::Get +*/ + { + + if (Eos()) + return(0); + return(*iNext); + } + + + + +EXPORT_C void TLex8::SkipSpace() +/** +Moves the next character position past any white space (space or separator). + +Stops if at the end of string. +*/ + { + + while (!Eos() && Peek().IsSpace()) + iNext++; + } + + + + +EXPORT_C void TLex8::SkipAndMark(TInt aNumber,TLexMark8& aMark) +/** +Moves the next character position a specified number of characters and copies +it to the specified extraction mark. + +@param aNumber Number of characters to skip. +@param aMark On return, set to the next character position. + +@panic USER 61, if the skip moves the next character position either to before + the start or beyond the end of the string. +*/ + { + + iNext+=aNumber; + __ASSERT_ALWAYS(iNext>=iBuf && iNext<=iEnd,Panic(ETLex8SkipOutOfRange)); + Mark(aMark); + } + + + + +EXPORT_C void TLex8::SkipSpaceAndMark(TLexMark8& aMark) +/** +Moves the next character position past any white space and copies it to the +specified extraction mark. + +Stops if at the end of the string. + +@param aMark On return, contains a reference to the next character position. +*/ + { + + SkipSpace(); + Mark(aMark); + } + + + + +EXPORT_C void TLex8::SkipCharacters() +/** +Moves the next character position to the next white space (space or separator). + +Stops if at the end of the string. +*/ + { + + while (!Eos() && !Peek().IsSpace()) + iNext++; + } + + + + +EXPORT_C TInt TLex8::TokenLength(const TLexMark8 aMark) const +/** +Gets the length of the token starting at the specified extraction mark. + +@param aMark Extraction mark indicating the start of the token. + +@return Length of the token. + +@panic USER 63, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + return (iNext-aMark.iPtr); + } + + + + +EXPORT_C TPtrC8 TLex8::MarkedToken(const TLexMark8 aMark) const +/** +Extracts the token, starting at the specified mark + +@param aMark Extraction mark indicating the start of the token. + +@return Extracted token. + +@panic USER 63, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + return(TPtrC8(aMark.iPtr,TokenLength(aMark))); + } + + + + +EXPORT_C TPtrC8 TLex8::MarkedToken() const +// +// Extract the internally marked token +// there is the assumption here that iMark is always valid +/** +Extracts the marked token. + +Note that the function assumes that the current extraction mark is valid. + +@return Extracted token. + +@panic USER 63, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + return(TPtrC8(iMark.iPtr,TokenLength())); + } + + + + +EXPORT_C TPtrC8 TLex8::NextToken() +/** +Strips any white space and extracts the next token. + +@return Extracted token. +*/ + { + TLexMark8 mark; + + SkipSpaceAndMark(mark); + SkipCharacters(); + return(TPtrC8(mark.iPtr,TokenLength(mark))); + } + + + + +EXPORT_C TPtrC8 TLex8::Remainder() const +/** +Gets a descriptor containing all the text from the next character position +to the end of the string. + +@return Text from the next character position onwards. + +@panic USER 29, if the value of (next character position - extraction mark) is + negative. +*/ + { + + return(TPtrC8(iNext,iEnd-iNext)); + } + + + + +EXPORT_C TPtrC8 TLex8::RemainderFromMark(const TLexMark8 aMark) const +/** +Gets a descriptor containing all the text from the specified extraction mark +to the end of the string. + +@param aMark Extraction mark indicating where remaining text starts. + +@return Text from the specified extraction mark onwards. + +@panic USER 29, if the value of (next character position - extraction mark) is + negative. +@panic USER 63, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + return(TPtrC8(aMark.iPtr,iEnd-aMark.iPtr)); + } + + + + +EXPORT_C TPtrC8 TLex8::RemainderFromMark() const +// +// Return the remainder from iMark +// There is an assumption here that the internal mark will always be valid +// +/** +Gets a descriptor containing all the text from the current extraction mark to the end +of the string. + +The function assumes that the current extraction mark is valid. + +@return Text from the extraction mark onwards. +*/ + { + + return(TPtrC8(iMark.iPtr,iEnd-iMark.iPtr)); + } + + + + +EXPORT_C TInt TLex8::Offset() const +// +// Return the offset from iNext to the lex start. +// +/** +Gets the offset of the next character position from the start of the string. + +@return Offset of next character position. +*/ + { + + return((TUint)(iNext-iBuf)); + } + + + + +EXPORT_C TInt TLex8::MarkedOffset(const TLexMark8 aMark) const +/** +Gets the offset of the specified extraction mark from the start of the string. + +@param aMark Extraction mark. + +@return The offset of the extraction mark. + +@panic USER 63, if the specified mark is before the start or beyond the end + of the string. +*/ + { + + ValidateMark(aMark); + return((TUint)(aMark.iPtr-iBuf)); + } + + + + +EXPORT_C TInt TLex8::BoundedVal(TUint32 &aVal,TRadix aRadix,TUint aLimit) +/** +Parses the string to extract a 32-bit unsigned integer, using the +specified radix, and checks that it is within the specified limit. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint l=aLimit/aRadix; + TUint v=0; + TUint d=0; + TLexMark8 mark(iNext); + while (!Eos()) + { + TChar c=Peek(); + if (!c.IsHexDigit()) + break; + c=Get(); + if (c.IsAlpha()) + { + c.UpperCase(); + c-=('A'-10); + } + else + c-='0'; + if (c>=(TUint)aRadix) + { + iNext--; + break; + } + if (v>l) + { + UnGetToMark(mark); + return(KErrOverflow); + } + TUint o=v; + v*=aRadix; + v+=c; + if (o>v) + { + UnGetToMark(mark); + return(KErrOverflow); + } + d++; + } + if (d==0) + { + UnGetToMark(mark); + return(KErrGeneral); + } + if (v>aLimit) + { + UnGetToMark(mark); + return(KErrOverflow); + } + aVal=v; + return(KErrNone); + } + + + + +EXPORT_C TInt TLex8::BoundedVal(TInt32 &aVal,TInt aLimit) +/** +Parses the string to extract a 32-bit signed integer, and checks that it is +within the specified limit. + +@param aVal On return, contains the extracted integer. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + if (Eos()) + return(KErrGeneral); + TUint lim=aLimit; + TLexMark8 mark(iNext); + TUint s=FALSE; + TChar c=Peek(); + if (c=='-') + { + lim++; + s++; + Inc(); + } + else if (c=='+') + Inc(); + TUint32 v; + TInt r=BoundedVal(v,EDecimal,lim); + if (r==KErrNone) + { + if (v>lim) + r=KErrOverflow; + else if (s) + aVal=(-((TInt32)v)); + else + aVal=v; + } + if (r!=KErrNone) + UnGetToMark(mark); + return(r); + } + + + + +EXPORT_C TInt TLex8::BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit) +/** +Parses the string to extract a 64-bit signed integer, using the +specified radix, and checks that it is within the specified limit. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + TUint64 rad = aRadix; + TUint64 lim = static_cast(aLimit); + + lim /= rad; + + TUint64 v = 0; + TUint digit=0; + TLexMark8 mark(iNext); + while (!Eos()) + { + TChar c=Peek(); + if (!c.IsHexDigit()) + break; + c=Get(); + if (c.IsAlpha()) + { + c.UpperCase(); + c-=('A'-10); + } + else + c-='0'; + if (c >= rad) + { + iNext--; + break; + } + if (v > lim) + { + UnGetToMark(mark); + return(KErrOverflow); + } + TUint64 old = v; + v*=rad; + v+=c; + if (old > v) + { + UnGetToMark(mark); + return(KErrOverflow); + } + digit++; + } + if (digit==0) + { + UnGetToMark(mark); + return(KErrGeneral); + } + if (v > static_cast(aLimit)) + { + UnGetToMark(mark); + return(KErrOverflow); + } + aVal = static_cast(v); + return(KErrNone); + } + + + + +EXPORT_C TInt TLex8::BoundedVal(TInt64& aVal, const TInt64& aLimit) +/** +Parses the string to extract a 64-bit signed integer, and checks that it +is within the specified limit. + +@param aVal On return, contains the extracted integer. +@param aLimit The upper limit. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + if (Eos()) + return(KErrGeneral); + TInt64 lim = aLimit; + TLexMark8 mark(iNext); + TBool s=EFalse; + TChar c=Peek(); + if (c=='-') + { + lim++; + s++; + Inc(); + } + else if (c=='+') + Inc(); + TInt64 v; + TInt r=BoundedVal(v,EDecimal,lim); + if (r==KErrNone) + { + if (v>lim) + r=KErrOverflow; + else if (s) + aVal=(-v); + else + aVal=v; + } + if (r!=KErrNone) + UnGetToMark(mark); + return(r); + } + + + + +EXPORT_C TInt TLex8::Val(TInt8 &aVal) +/** +Parses the string to extract a signed 8-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TInt32 v; + TInt r=BoundedVal(v,0x7fu); + if (r==KErrNone) + aVal=(TInt8)v; + return(r); + } + + + + +EXPORT_C TInt TLex8::Val(TInt16 &aVal) +/** +Parses the string to extract a signed 16-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TInt32 v; + TInt r=BoundedVal(v,0x7fffu); + if (r==KErrNone) + aVal=(TInt16)v; + return(r); + } + + + + +EXPORT_C TInt TLex8::Val(TInt32 &aVal) +/** +Parses the string to extract a signed 32-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TInt32 v; + TInt r=BoundedVal(v,0x7fffffffu); + if (r==KErrNone) + aVal=v; + return(r); + } + + + +EXPORT_C TInt TLex8::Val(TInt64& aVal) +/** +Parses the string to extract a signed 64-bit integer. + +@param aVal On return, contains the extracted integer. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TChar c=Peek(); + if (c=='-' || c=='+') + Inc(); + TInt r; + if (c=='-') + { + r=BoundedVal(aVal, EDecimal, UI64LIT(0x8000000000000000)); + if (r==KErrNone) + aVal=-aVal; + } + else + r=BoundedVal(aVal, UI64LIT(0x7fffffffffffffff)); + return(r); + } + + + + +EXPORT_C TInt TLex8::Val(TUint8 &aVal,TRadix aRadix) +/** +Parses the string to extract an 8-bit unsigned integer, using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint32 v; + TInt r=BoundedVal(v,aRadix,0xffu); + if (r==KErrNone) + aVal=(TUint8)v; + return(r); + } + +EXPORT_C TInt TLex8::Val(TUint16 &aVal,TRadix aRadix) +/** +Parses the string to extract a 16-bit unsigned integer, using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint32 v; + TInt r=BoundedVal(v,aRadix,0xffffu); + if (r==KErrNone) + aVal=(TUint16)v; + return(r); + } + +EXPORT_C TInt TLex8::Val(TUint32 &aVal,TRadix aRadix) +/** +Parses the string to extract a 32-bit unsigned integer, using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + TUint32 v; + TInt r=BoundedVal(v,aRadix,0xffffffffu); + if (r==KErrNone) + aVal=v; + return(r); + } + +EXPORT_C TInt TLex8::Val(TInt64& aVal, TRadix aRadix) +/** +Parses the string to extract a 64-bit integer (treated as unsigned), using the +specified radix. + +The specified radix is one of binary, octal, decimal, or hexadecimal. + +@param aVal On return, contains the extracted integer. +@param aRadix The radix to use when converting the number. + +@return KErrNone if successful. + KErrGeneral if the next character position is initially at the end of the string + or no valid characters found initially. + KErrOverflow if there is sign overflow, i.e. converted value greater than limit. + If error codes KErrGeneral or KErrOverflow are returned, the object's + members are left unaltered. +*/ + { + + return BoundedVal(aVal,aRadix,TInt64(UI64LIT(0xffffffffffffffff))); + } + +void TLex8::ValidateMark(const TLexMark8 aMark) const +// +// Asserts that the mark is valid for this lex +// + { + __ASSERT_ALWAYS(aMark.iPtr>=iBuf && aMark.iPtr<=iEnd,Panic(ETLex8MarkOutOfRange)); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_loc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_loc.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,285 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_loc.cpp +// +// + +#include "us_std.h" + +EXPORT_C TDayName::TDayName() +/** +Default constructor. + +It constructs this object and initialises it with the current locale's text for +Monday. +*/ + { + + Set(EMonday); + } + + + + +EXPORT_C TDayName::TDayName(TDay aDay) +/** +Constructs this object and initialises it with the current locale's text for +the specified day of the week. + +@param aDay Identifies the day of the week. +*/ + { + + Set(aDay); + } + + + + +EXPORT_C TDayNameAbb::TDayNameAbb() +/** +Default constructor. + +It constructs this object and initialises it with the current locale's +abbreviated text for Monday. +*/ + { + + Set(EMonday); + } + + + + +EXPORT_C TDayNameAbb::TDayNameAbb(TDay aDay) +/** +Constructs this object and initialises it with the current locale's abbreviated +text for the specified day of the week. + +@param aDay An enumerator identifying the day of the week. +*/ + { + + Set(aDay); + } + + + + +EXPORT_C TMonthName::TMonthName() +/** +Default constructor. + +Constructs the object and initialises it with the current locale's text for +January. +*/ + { + + Set(EJanuary); + } + + + + +EXPORT_C TMonthName::TMonthName(TMonth aMonth) +/** +Constructs this object and initialises it with the current locale's text for +the specified month. + +@param aMonth Identifies the month. +*/ + { + + Set(aMonth); + } + + + + +EXPORT_C TMonthNameAbb::TMonthNameAbb() +/** +Default constructor. + +It constructs this object and initialises it with the current locale's abbreviated +text for January. +*/ + { + + Set(EJanuary); + } + + + + +EXPORT_C TMonthNameAbb::TMonthNameAbb(TMonth aMonth) +/** +Constructs this object and initialises it with the current locale's abbreviated +text for the specified month. + +@param aMonth Identifies the month. +*/ + { + + Set(aMonth); + } + + + + +EXPORT_C TDateSuffix::TDateSuffix() +/** +Default constructor. + +It constructs this object and initialises it with the current locale's date +suffix text for the first day of the month. +*/ + { + + Set(0); + } + + + + +EXPORT_C TDateSuffix::TDateSuffix(TInt aDateSuffix) +/** +Constructs this object and initialises it with the current locale's date suffix +text for the specified day of the month. + +@param aDateSuffix A value identifying the day of the month. The value can + range from 0 to 30 so that the first day of the month is + identified by 0, the second day by 1 etc. + +@panic USER 69, if aDateSuffix is outside the range 0 to 30. +*/ + { + + Set(aDateSuffix); + } + + + + +EXPORT_C TAmPmName::TAmPmName() +/** +Default constructor. + +It constructs this object and initialises it with the current locale's text for +identifying time before noon. +*/ + { + + Set(EAm); + } + + + + +EXPORT_C TAmPmName::TAmPmName(TAmPm aSelector) +/** +Constructs this object and initialises it with the current locale's text for +identifying time before or after noon as identified by the specified selector. + +@param aSelector The am/pm selector. +*/ + { + + Set(aSelector); + } + + + + +EXPORT_C TCurrencySymbol::TCurrencySymbol() +/** +Default constructor. + +It constructs this object and initialises it with the current locale's currency +symbol(s). +*/ + { + + Set(); + } + + + + +EXPORT_C TShortDateFormatSpec::TShortDateFormatSpec() +/** +Default constructor. + +Performs construction by calling Set(). + +@see TShortDateFormatSpec::Set +*/ + { + + Set(); + } + + + + +EXPORT_C TLongDateFormatSpec::TLongDateFormatSpec() +/** +Default constructor. + +Performs construction by calling Set(). + +@see TLongDateFormatSpec::Set +*/ + { + + Set(); + } + + + + +EXPORT_C TTimeFormatSpec::TTimeFormatSpec() +/** +Default constructor. + +Performs construction by calling Set(). + +@see TTimeFormatSpec::Set +*/ + { + + Set(); + } + + + + +EXPORT_C TLocaleMessageText::TLocaleMessageText() +// +// Default Constructor +// + {} + + + + +EXPORT_C TLocaleMessageText::TLocaleMessageText(TLocaleMessage aMsgNo) +// +// Constructor +// + { + + Set(aMsgNo); + } + + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_parse.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_parse.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,620 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_parse.cpp +// +// + +#include "us_std.h" + +class TStringToDateTime + { +public: + TStringToDateTime(const TDesC& aDes,TInt aCenturyOffset); + TInt Parse(TTime& aTime); + enum {ETimePresent=1,EDatePresent}; +private: +// tokens + enum {EDec=-12,ENov,EOct,ESep,EAug,EJul,EJun,EMay,EApr,EMar,EFeb,EJan}; + enum {ETokenAm=-19,ETokenPm}; + enum TDateSeparators{ESlash=-39,EDash,EComma,ESpace,EDateLocale1,EDateLocale2}; + enum TTimeSeparators{EColon=-49,EDot,ETimeLocale1,ETimeLocale2}; + enum TDecimalSeparators{EDecimalLocale=-59}; + enum {EErrorToken=-99,ENullToken=-100}; +// + enum {ENumberOfDateSep=6,ENumberOfTimeSep=4,EMaxTokens=27}; + enum {EFirstDateSep=ESlash,ELastDateSep=EDateLocale2,EFirstTimeSep=EColon,ELastTimeSep=ETimeLocale2}; +private: + TInt NextToken(TInt& aTokenLen); + void StripSpaceTokens(); + TInt CrackTokenFormula(); + TInt GetDate(TInt aFormulaPos,TInt& aTokenCount); + TInt GetTime(TInt aFormulaPos,TInt& aTokenCount); +// + TInt GetSeparatorToken(TChar aChar) const; + TBool IsTimeSeparator(TChar aChar) const; + TBool IsDateSeparator(TChar aChar) const; + TBool IsDecimalSeparator(TChar aChar) const; + TBool IsSeparator(TChar aChar) const; + TBool IsSeparator(TInt aToken) const; + inline TBool IsTimeSeparator(TInt aToken) const; + inline TBool IsDateSeparator(TInt aToken) const; + TBool IsDecimalSeparator(TInt aToken) const; + inline TBool IsAmPm(TInt aToken) const; + inline TBool IsAlphaMonth(TInt aToken) const; +private: + TLex iLex; + TInt iCenturyOffset; + TDateFormat iDateFormat; + TChar iTimeSepChars[ENumberOfTimeSep]; + TChar iDateSepChars[ENumberOfDateSep]; + TChar iDecSepChar; + TDateTime iDateTime; + TInt iCount; + TInt iFormula[EMaxTokens];// 27 max possible with valid des (including spaces):" 10 : 00 : 00 . 000000 pm 6 / 12 / 99 " + TUint8 iTokenLen[EMaxTokens]; + }; + +inline TBool TStringToDateTime::IsTimeSeparator(TInt aToken) const + { + return(aToken >= EFirstTimeSep && aToken <=ELastTimeSep); + } +inline TBool TStringToDateTime::IsDateSeparator(TInt aToken) const + { + return(aToken>=EFirstDateSep && aToken<=ELastDateSep); + } +inline TBool TStringToDateTime::IsAmPm(TInt aToken) const + { + return(aToken==ETokenAm || aToken==ETokenPm); + } +inline TBool TStringToDateTime::IsAlphaMonth(TInt aToken) const + { + return (aToken>=EDec && aToken<=EJan); + } + +inline TBool TStringToDateTime::IsDecimalSeparator(TChar aChar) const + { + return(aChar==iDecSepChar); + } +inline TBool TStringToDateTime::IsDecimalSeparator(TInt aToken) const + { + return(aToken==EDecimalLocale); + } + +TStringToDateTime::TStringToDateTime(const TDesC& aDes,TInt aCenturyOffset) + : iLex(aDes),iCenturyOffset(aCenturyOffset),iDateTime(0,EJanuary,0,0,0,0,0) + { + + __ASSERT_ALWAYS(aCenturyOffset>=0 && aCenturyOffset<100,Panic(ETTimeValueOutOfRange)); + TLocale locale; + iDateFormat=locale.DateFormat(); + + iTimeSepChars[0]=':'; + iTimeSepChars[1]='.'; + iTimeSepChars[2]=locale.TimeSeparator(1); + iTimeSepChars[3]=locale.TimeSeparator(2); + + iDateSepChars[0]='/'; + iDateSepChars[1]='-'; + iDateSepChars[2]=','; + iDateSepChars[3]=' '; + iDateSepChars[4]=locale.DateSeparator(1); + iDateSepChars[5]=locale.DateSeparator(2); + iDecSepChar = locale.DecimalSeparator(); + } + +TBool TStringToDateTime::IsTimeSeparator(TChar aChar) const + { + + for (TInt ii=0;ii=iCenturyOffset) + { + if (year>=00 && year=00 && year00 hrs. Ignore 13am + else if (iFormula[ampmIndex+aOffset]==ETokenPm && iDateTime.Hour()<12) + error=iDateTime.SetHour(iDateTime.Hour()+12); + if (error!=KErrNone) + return(error); + + if (aOffset!=0) + return(ETimePresent|EDatePresent); + return(ETimePresent); + } + +TInt TStringToDateTime::NextToken(TInt& aTokenLen) + { + if (iLex.Eos()) + return ENullToken; + + TChar ch=iLex.Peek(); + + if (ch.IsDigit()) + { + iLex.Mark(); + do iLex.Inc(); while (iLex.Peek().IsDigit()); + + TPtrC des=iLex.MarkedToken(); + + TInt digit; + TLex lex(des); + if (lex.Val(digit)!=KErrNone) + return(EErrorToken); + aTokenLen = des.Length(); + return(digit); + } + else if (IsSeparator(ch)) + { + iLex.Inc(); + iLex.SkipSpace(); + aTokenLen = 1; + return(GetSeparatorToken(ch)); + } + else + { + iLex.Mark(); + do iLex.Inc(); while (iLex.Peek().IsAlpha() || iLex.Peek().IsDigit()); + + TPtrC des=iLex.MarkedToken(); + aTokenLen = des.Length(); + + for (TInt month=EJanuary; month<=EDecember; ++month) + { + // Abbreviated month name + TMonthNameAbb nameAbb((TMonth)month); + if (nameAbb.CompareF(des)==0) + return(-(month+1)); // All values negative + + // Full month name + TMonthName name((TMonth)month); + if (name.CompareF(des)==0) + return(-(month+1)); // All values negative + } + + // Substring of am or pm + TAmPmName am(EAm); + TAmPmName pm(EPm); + + if (am.FindF(des)==0) + return(ETokenAm); + else if (pm.FindF(des)==0) + return(ETokenPm); + + return(EErrorToken); + } + } + + +TInt TStringToDateTime::Parse(TTime& aTime) + { + + iLex.SkipSpace(); + TInt i = 0; + for (;;) + { + if (i==EMaxTokens-1) // space left to append NullToken + return KErrArgument; + TInt len; + TInt token=NextToken(len);// uses iLex + if (token==EErrorToken) + return KErrArgument; + if (token==ENullToken) + break; + iFormula[i]=token; // append token to formula + iTokenLen[i]=(TUint8)Min(len, 255); + ++i; + } + iCount=i; + + StripSpaceTokens();// Uses then resets iCount + TInt ret=CrackTokenFormula(); + if (ret<0) + return(ret); + if (iDateTime.Year()>9999) + return KErrArgument; + aTime=iDateTime; + return(ret); + } + +EXPORT_C TInt TTime::Parse(const TDesC& aDes,TInt aCenturyOffset) +/** +Parses a descriptor containing either or both a date and time, and sets this +TTime to the value of the parsed descriptor. + +The descriptor may contain the date only, the time only, the date followed +by the time, or the time followed by the date. When both the date and time +are specified in the descriptor, they should be separated using one or more +space characters. + +Leading zeros and spaces preceding any time or date components are discarded. + +Dates may be specified either with all three components (day, month and year), +or with just two components; for example month and day. The date suffix ("st" +"nd" "rd" or "th") may not be included in the descriptor. + +The date and its components may take different forms: + +1. The month may be represented by text or by numbers. + +2 European (DD/MM/YYYY), American (MM/DD/YYYY) and Japanese (YYYY/MM/DD) date + formats are supported. An exception to this ordering of date components occurs + when European or American formatting is used and the month is represented + by text. In this case, the month may be positioned in either the first or + second field. When using Japanese date format, the month, whether text or + numbers, must always be the second field. + +3. The year may be two or four digits. When the year is a two digit number, (e.g. + 97 rather than 1997), to resolve any confusion as to which century the year + falls in, the second argument determines the century. For example, if the + current year is 1997, a value for aCenturyOffset of 20 means that any two + digit year will resolve to a year in the range 1920 to 2019. In this case, + two digit years between 00 and 19 inclusive refer to the years between 2000 + and 2019 and two digit years between 20 and 99 inclusive refer to the years + between 1920 and 1999. By default, two digit years are in the current century + (aCenturyOffset = 0). + +4. Any of the following characters may be used as the date separator: /(slash) + - (dash) , (comma), spaces, or either of the date separator characters specified + in TLocale::SetDateSeparator() (at index 1 or 2). Other characters are illegal. + +If a colon or a dot has been specified in TLocale as the date separator character, +neither may be used as date separators in this function. + +If specified, the time must include the hour, but both minutes and seconds, +or seconds alone may be omitted. + +The time and its components may take different forms: + +1. An am/pm time suffix may be appended to the time. If 24 hour clock format + is in use, this text will be ignored. + +2. The am/pm suffix may be abbreviated to "a" or "p". + +3. Any of the following characters may be used as the time separator: :(colon) + .(dot) or either of the time separator characters specified in + TLocale::SetDateSeparator() (at index 1 or 2). Other characters are illegal. + +When a character can be interpreted as either a date or time separator character, +this function will interpret it as a date separator. + +Look out for cases in which wrongly interpreting the contents of a descriptor, +based on the interpretation of separator characters, causes an error. For +example, trying to interpret "5.6.1996" as a time is invalid and will return +an error of -2 because 1,996 seconds is out of range. + +Notes: + +1. The entire content of the descriptor must be valid and syntactically correct, + or an error will be returned and the parse will fail. So, excepting whitespace, + which is discarded, any trailing characters within the descriptor which do + not form part of the date or time are illegal. + +2. If no time is specified in the descriptor, the hours, minutes and seconds + of this TTime are all set to zero, corresponding to midnight at the start + of the day specified in the date. If no date is specified, each of this TTime's + date components are set to zero. + +@param aDes Descriptor containing any combination of date and + time as text. +@param aCenturyOffset Offset between zero (the default) and 99. Allows a flexible + interpretation of the century for two digit year values. + If less than zero, or greater than 99, a panic occurs. + +@return If equal to or greater than zero, the function completed successfully. + EParseDatePresent and/or EParseTimePresent indicate whether either or both + of the date or time are present. + If less than zero, an error code. + KErrGeneral indicates that the time or date value is out of range, + e.g. if the hour is greater than 23 or if the minute is greater + than 59. + KErrNotSupported indicates that a two field date has been entered. + KErrArgument indicates that the descriptor was syntactically incorrect. + If the function fails, this TTime object remains unchanged. +*/ + { + + TStringToDateTime parse(aDes,aCenturyOffset); + return parse.Parse(*this); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_que.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_que.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,852 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_que.cpp +// +// + +#include "us_std.h" + +EXPORT_C void TSglQueLink::Enque(TSglQueLink* aLink) +// +// Enque this after aLink. +// + { + + iNext=aLink->iNext; + aLink->iNext=this; + } + + + + +EXPORT_C void TDblQueLinkBase::Enque(TDblQueLinkBase* aLink) +/** +Inserts this link object after the specified link object. + +The specified link object must already be in the doubly linked list. + +The function cannot be used to insert a list element into the beginning or +end of a doubly linked list; this is handled by the TDblQue::AddFirst() +and TDblQue::AddLast() functions. + +@param aLink A pointer to the link object embedded within the list element + to which this link object is to be connected. It must not be NULL. + +@see TDblQue +*/ + { + + iNext=aLink->iNext; + iPrev=aLink; + aLink->iNext->iPrev=this; + aLink->iNext=this; + } + + + + +EXPORT_C void TDblQueLinkBase::AddBefore(TDblQueLinkBase* aLink) +/** +Inserts this link object before the specified link object. + +The specified link object must already be in the doubly linked list. + +The function cannot be used to insert a list element into the beginning or +end of a doubly linked list; this is handled by the TDblQue::AddFirst() +and TDblQue::AddLast() functions. + +@param aLink A pointer to the link object embedded within the list element + to which this link object is to be connected. It must not be NULL. + +@see TDblQue +*/ + { + + iNext=aLink; + iPrev=aLink->iPrev; + aLink->iPrev->iNext=this; + aLink->iPrev=this; + } + + + + +EXPORT_C void TDblQueLink::Deque() +/** +Removes this link object from the doubly linked list. + +In effect, this removes the list element that acts as host to this link object +from the doubly linked list. + +The link object can be any in the doubly linked list. + +It is safe to use this method on an object which has already been removed from the list. + +@post iNext member is set to NULL +*/ + { + + if (iNext) + { + iPrev->iNext=iNext; + iNext->iPrev=iPrev; + iNext=NULL; + } + } + + + + +EXPORT_C TSglQueBase::TSglQueBase() + : iHead(NULL),iLast((TSglQueLink*)&iHead),iOffset(0) +/** +Default constructor. + +It sets: + +1. iHead to Null. + +2. iLast to point to the head of queue. + +3. iOffset to zero. + +@see iHead +@see iLast +@see iOffset +*/ + {} + + + + +EXPORT_C TSglQueBase::TSglQueBase(TInt aOffset) + : iHead(NULL),iLast((TSglQueLink*)&iHead),iOffset(aOffset) +/** +Constructor with specified offset. + +It sets: + +1. iHead to Null + +2. iLast to point to the head of queue. + +3. iOffset to the specified value. + +@param aOffset The offset of a link object within an element. + +@panic USER 75, if aOffset is not divisible by four + +@see iHead +@see iLast +@see iOffset +*/ + { + + __ASSERT_ALWAYS(iOffset%4==0,Panic(ESQueOffsetNotAligned)); + } + + + + +EXPORT_C TBool TSglQueBase::IsEmpty() const +/** +Tests whether the singly linked list is empty, i.e. has no list elements. + +@return True, if the singly linked list is empty; false, otherwise. +*/ + { + + return(iHead==NULL); + } + + + + +EXPORT_C void TSglQueBase::SetOffset(TInt aOffset) +/** +Sets the offset of the link object from the start of a singly linked +list element. + +@param aOffset The offset of the link object from the start of a singly linked + list element. + +@panic USER 75, if aOffset is not divisible by four. + +@see TSglQue +*/ + { + + __ASSERT_ALWAYS(iOffset%4==0,Panic(ESQueOffsetNotAligned)); + iOffset=aOffset; + } + + + + + +EXPORT_C void TSglQueBase::Reset() +/** +Empties the singly linked list. + +After a call to this function, there are no elements queued from the header; +the elements are orphaned. Special care must be taken when list elements are +CBase derived objects, i.e. are allocated on the heap. +*/ + { + + iHead=NULL; + iLast=(TSglQueLink*)&iHead; + } + + + + + +EXPORT_C void TSglQueBase::DoAddFirst(TAny* aPtr) +/** +Implements the insertion of a list element at the front of the singly linked +list. + +This function is called by TSglQue::AddFirst(). + +@param aPtr An untyped pointer to the element to be inserted. + +@see TSglQue::AddFirst +*/ + { + + TSglQueLink* pL=PtrAdd((TSglQueLink*)aPtr,iOffset); + pL->Enque((TSglQueLink*)&iHead); + if (iLast==(TSglQueLink*)(&iHead)) + iLast=pL; + } + + + + +EXPORT_C void TSglQueBase::DoAddLast(TAny* aPtr) +/** +Implements the insertion of a list element at the back of the singly linked +list. + +This function is called by TSglQue::AddLast(). + +@param aPtr An untyped pointer to the element to be inserted. + +@see TSglQue::AddLast +*/ + { + + TSglQueLink* pL=PtrAdd((TSglQueLink*)aPtr,iOffset); + pL->Enque(iLast); + iLast=pL; + } + + + + +EXPORT_C void TSglQueBase::DoRemove(TAny* aPtr) +/** +Implements the removal of a list element from the singly linked list. + +This function is called by TSglQue::Remove(). + +@param aPtr An untyped pointer to the element to be removed. + +@see TSglQue::Remove +*/ + { + + TSglQueLink* pP=(TSglQueLink*)(&iHead); + TSglQueLink* pL=PtrAdd((TSglQueLink*)aPtr,iOffset); + TSglQueLink* pN=pP->iNext; + while (pN) + { + if (pN==pL) + { + pP->iNext=pN->iNext; + if (iLast==pL) + { + iLast=pP; + if (iLast==NULL) + iLast=(TSglQueLink*)(&iHead); + } + return; + } + pP=pN; + pN=pP->iNext; + } + Panic(ESQueLinkNotQueued); + } + + + + +//#pragma warning( disable : 4705 ) // statement has no effect +EXPORT_C TDblQueBase::TDblQueBase() + : iOffset(0) +/** +Default constructor. + +It sets: + +1. iHead to point to this object in both the forwards and backwards direction. + +2. iOffset to zero. + +@see iHead +@see iOffset +*/ + { + + iHead.iNext=iHead.iPrev=(&iHead); + } + + + + +EXPORT_C TDblQueBase::TDblQueBase(TInt aOffset) + : iOffset(aOffset) +/** +Constructor with specified offset. + +It sets: + +1. iHead to point to this object in both the forwards and backwards direction. + +2. iOffset to the specified value. + +@param aOffset The offset of a link object within an element. + +@panic USER 78, if aOffset is not divisible by four + +@see iHead +@see iOffset +*/ + { + + __ASSERT_ALWAYS(iOffset%4==0,Panic(ETQueOffsetNotAligned)); + iHead.iNext=iHead.iPrev=(&iHead); + } +//#pragma warning( default : 4705 ) + + + + +EXPORT_C TBool TDblQueBase::IsEmpty() const +/** +Tests whether the doubly linked list is empty, i.e. has no list elements. + +@return True, if the doubly linked list is empty; false, otherwise. +*/ + { + + return((const TDblQueLinkBase*)iHead.iNext==(&iHead)); + } + + + + +EXPORT_C void TDblQueBase::SetOffset(TInt aOffset) +/** +Sets the offset of the link object from the start of a doubly linked list element. + +@param aOffset The offset of the link object from the start of a doubly linked + list element. + +@panic USER 78, if aOffset is not divisible by four. + +@see TDblQue +*/ + { + + __ASSERT_ALWAYS(iOffset%4==0,Panic(ETQueOffsetNotAligned)); + iOffset=aOffset; + } + + + + +EXPORT_C void TDblQueBase::Reset() +/** +Empties the doubly linked list. + +After a call to this function, there are no elements queued from the header; +the elements are orphaned. Special care must be taken when list elements are +CBase derived objects, i.e. are allocated on the heap. +*/ + { + + iHead.iNext=iHead.iPrev=(&iHead); + } + + + + +EXPORT_C void TDblQueBase::DoAddFirst(TAny* aPtr) +/** +Implements the insertion of the specified list element at the front of the +doubly linked list. + +This function is called by TDblQue::AddFirst(). + +@param aPtr An untyped pointer to the element to be inserted. + +@see TDblQue::AddFirst +*/ + { + + PtrAdd((TDblQueLinkBase*)aPtr,iOffset)->Enque(&iHead); + } + + + + +EXPORT_C void TDblQueBase::DoAddLast(TAny* aPtr) +/** +Implements the insertion of the specified list element at the back of the +doubly linked list. + +This function is called by TDblQue::AddLast(). + +@param aPtr An untyped pointer to the element to be inserted. + +@see TDblQue::AddLast*/ + { + + PtrAdd((TDblQueLinkBase*)aPtr,iOffset)->Enque(iHead.iPrev); + } + + + + +EXPORT_C void TDblQueBase::DoAddPriority(TAny* aPtr) +/** +Implements the insertion of the specified list element in priority order. + +This function is called by TPriQue::Add(). + +@param aPtr An untyped pointer to the element to be inserted. + +@see TPriQue::Add +*/ + { + + TPriQueLink* pN=(TPriQueLink*)iHead.iNext; + TPriQueLink* pI=PtrAdd((TPriQueLink*)aPtr,iOffset); + TInt p=pI->iPriority; + while (pN!=(TPriQueLink*)&iHead && p<=pN->iPriority) + pN=(TPriQueLink*)pN->iNext; + pI->Enque(pN->iPrev); + } + + + + +EXPORT_C TDeltaQueBase::TDeltaQueBase() + : iFirstDelta(NULL) +/** +Default constructor. + +It sets iFirstDelta to NULL. + +@see TDeltaQueBase::iFirstDelta +*/ + { + } + + + + +EXPORT_C TDeltaQueBase::TDeltaQueBase(TInt aOffset) + : TDblQueBase(aOffset),iFirstDelta(NULL) +/** +Constructor with specified offset. + +It sets: + +1. iFirstDelta to NULL + +2. TDblQueBase::iOffset to the specified value, through a call to the + base class constructor. + +@param aOffset The offset of a link object within an element. + +@see TDeltaQueBase::iFirstDelta +@see TDblQueBase::iOffset +*/ + { + } + + + + +EXPORT_C void TDeltaQueBase::Reset() +/** +Empties the doubly linked list, and resets the first delta pointer. +*/ + { + + TDblQueBase::Reset(); + iFirstDelta=NULL; + } + + + + +EXPORT_C TBool TDeltaQueBase::FirstDelta(TInt& aValue) +/** +Gets the delta value of the first list element. + +@param aValue On return, contsins the delta value of the first element. + Note that this remains unchanged if there is no first element. + +@return True, if there is a first element; false, otherwise. +*/ + { + if (iFirstDelta) + { + aValue=*iFirstDelta; + return(ETrue); + } + return(EFalse); + } + + + + +EXPORT_C TBool TDeltaQueBase::CountDown() +/** +Decrements the delta value of the first element by one, and returns true if +the result is negative or zero. + +@return True, if the resulting delta value is negative or zero; false, if + the value is positive, or there is no first element. +*/ + { + + return(CountDown(1)); + } + + + + +EXPORT_C TBool TDeltaQueBase::CountDown(TInt aValue) +/** +Decrements the delta value of the first element by the specified value, and +returns true if the result is negative or zero. + +@param aValue The amount by which the delta value is to be reduced. + +@return True, if the resulting delta value is negative or zero; false, if the + value is positive, or there is no first element. +*/ + { + + if (iFirstDelta) + { + (*iFirstDelta)-=aValue; + if (*iFirstDelta<=0) + return(ETrue); + } + return(EFalse); + } + + + + +EXPORT_C void TDeltaQueBase::DoAddDelta(TAny* aPtr,TInt aDelta) +/** +Implements the addition of the specified list element into the list. + +This function is called by TDeltaQue::Add(). + +@param aPtr Pointer to the list element to be inserted. +@param aDelta The 'distance' from the nominal zero point. + +@see TDeltaQue::Add +*/ + { + + TDeltaQueLink* pD=(TDeltaQueLink*)iHead.iNext; + TDeltaQueLink* pI=PtrAdd((TDeltaQueLink*)aPtr,iOffset); + while (pD!=(TDeltaQueLink*)&iHead && aDelta>=pD->iDelta) + { + aDelta-=pD->iDelta; + pD=(TDeltaQueLink*)pD->iNext; + } + pI->iDelta=aDelta; + pI->Enque(pD->iPrev); + if (pI->iNext!=&iHead) + pD->iDelta-=aDelta; + iFirstDelta=(&((TDeltaQueLink*)iHead.iNext)->iDelta); + } + + + + +EXPORT_C void TDeltaQueBase::DoRemove(TAny* aPtr) +/** +Implements the removal of the specified list element from the list. + +This function is called by TDeltaQue::Remove(). + +@param aPtr Pointer to the list element to be removed. + +@see TDeltaQue::Remove +*/ + { + + TDeltaQueLink* pI=PtrAdd((TDeltaQueLink*)aPtr,iOffset); + TDeltaQueLink* pN=(TDeltaQueLink*)pI->iNext; + if (pN!=(TDeltaQueLink*)&iHead) + pN->iDelta+=pI->iDelta; + ((TDblQueLink*)pI)->Deque(); + iFirstDelta=(iHead.iNext!=(&iHead) ? &((TDeltaQueLink*)iHead.iNext)->iDelta : NULL); + } + + + + +EXPORT_C TAny* TDeltaQueBase::DoRemoveFirst() +/** +Implements the removal of the first list element from the linked list if its +delta value is zero or negative. + +This function is called by TDeltaQue::RemoveFirst(). + +@return A pointer to the element removed from the linked list. This is NULL, + if the first element has a positive delta value. + +@see TDeltaQue::RemoveFirst +*/ + { + + TDeltaQueLink* pN=(TDeltaQueLink*)iHead.iNext; + if (pN!=(TDeltaQueLink*)&iHead && pN->iDelta<=0) + { + pN=PtrSub(pN,iOffset); + DoRemove(pN); + return(pN); + } + return(NULL); + } + + + + +EXPORT_C TSglQueIterBase::TSglQueIterBase(TSglQueBase& aQue) +// +// Cosntructor. +// + : iOffset(aQue.iOffset),iHead((TSglQueLink*)&aQue.iHead),iNext(aQue.iHead) + {} + + + + +EXPORT_C void TSglQueIterBase::SetToFirst() +/** +Sets the iterator to point to the first element in the singly linked list. + +The function can be called to re-set the pointer at any time during the iterator's +existence. + +The function can be called even if the list has no elements. +*/ + { + + iNext=iHead->iNext; + } + + + + +EXPORT_C void TSglQueIterBase::DoSet(TAny* aLink) +// +// Start the iterator at aLink. +// + { + + iNext=PtrAdd((TSglQueLink*)aLink,iOffset); + } + +EXPORT_C TAny* TSglQueIterBase::DoPostInc() +// +// Return the current pointer and increment. +// + { + + TAny* pN=iNext; + if (pN==NULL) + return NULL; + iNext=iNext->iNext; + return(PtrSub(pN,iOffset)); + } + +EXPORT_C TAny* TSglQueIterBase::DoCurrent() +// +// Return the current pointer. +// + { + + return(iNext==NULL ? NULL : PtrSub((TAny*)iNext,iOffset)); + } + + + + +EXPORT_C TDblQueIterBase::TDblQueIterBase(TDblQueBase& aQue) + : iOffset(aQue.iOffset),iHead(&aQue.iHead),iNext(aQue.iHead.iNext) +/** +Constructs the iterator for the specified doubly linked list. + +@param aQue A reference to a doubly linked list header. +*/ + {} + + + + +EXPORT_C void TDblQueIterBase::SetToFirst() +/** +Sets the iterator to point to the first element in the doubly linked list. + +The function can be called to re-set the pointer at any time during the +iterator's existence. + +The function can be called even if the list has no elements. +*/ + { + + iNext=iHead->iNext; + } + + + + +EXPORT_C void TDblQueIterBase::SetToLast() +/** +Sets the iterator to point to the last element in the doubly linked list. The +function can be called to re-set the pointer at any time during the +iterator's existence. + +The function can be called even if the list has no elements. +*/ + { + + iNext=iHead->iPrev; + } + + + + +EXPORT_C void TDblQueIterBase::DoSet(TAny* aLink) +/** +Sets the iterator to point to a specific element in the list. + +The function is an implementation for TDblQueIter::Set(). + +@param aLink A pointer to the current list element. + +@see TDblQueIter::Set +*/ + { + + iNext=PtrAdd((TDblQueLinkBase*)aLink,iOffset); + } + + + + +EXPORT_C TAny* TDblQueIterBase::DoPostInc() +/** +Gets the current item and then moves to the next item. + +The function is an implementation for TDblQueIter::operator++(). + +@return A pointer to the current list element. + +@see TDblQueIter::operator++ +*/ + { + + if (iNext==iHead) + return(NULL); + __ASSERT_DEBUG((iNext->iNext!=NULL)&&(iNext->iPrev!=NULL),Panic(ETQueLinkHasBeenRemoved)); + TAny* p=PtrSub(iNext,iOffset); + iNext=iNext->iNext; + return(p); + } + + + + +EXPORT_C TAny* TDblQueIterBase::DoPostDec() +/** +Gets the current item and then moves to the previous item. + +The function is an implementation for TDblQueIter::operator--(). + +@return A pointer to the current list element. + +@see TDblQueIter::operator-- +*/ + { + + if (iNext==iHead) + return(NULL); + __ASSERT_DEBUG((iNext->iNext!=NULL)&&(iNext->iPrev!=NULL),Panic(ETQueLinkHasBeenRemoved)); + TAny* p=PtrSub(iNext,iOffset); + iNext=iNext->iPrev; + return(p); + } + + + + +EXPORT_C TAny* TDblQueIterBase::DoCurrent() +/** +Gets the current item in the queue. + +The function is an implementation for TDblQueIter::operator T*(). + +@return A pointer to the current list element. + +@see TDblQueIter::operator T* +*/ + { + + if (iNext==iHead) + return(NULL); + __ASSERT_DEBUG((iNext->iNext!=NULL)&&(iNext->iPrev!=NULL),Panic(ETQueLinkHasBeenRemoved)); + return(PtrSub(iNext,iOffset)); + } + + + + +EXPORT_C void TDblQueBase::__DbgTestEmpty() const +/** +Tests whether the queue is empty. + +The function is implemented as an __ASSERT_DEBUG. + +@panic USER 79, if the assertion fails. +*/ + { + + __ASSERT_DEBUG((((TDblQueLink*)iHead.iNext)!=&iHead)&&(((TDblQueLink*)iHead.iPrev)!=&iHead),Panic(ETQueQueueEmpty)); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_regn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_regn.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,987 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_regn.cpp +// Optimisation note, it may well be worth machine coding the SubRect() function +// this is at the heart of nearly all complex region calculations. +// +// + + +#include "us_std.h" + +NONSHARABLE_CLASS(TRectKey) : public TKey + { +public: + TRectKey(const TRect *aRectList,const TPoint &aOffset); + virtual TInt Compare(TInt aLeft,TInt aRight) const; +private: + const TRect *iRectList; + TBool iDown; + TBool iRight; + }; + +NONSHARABLE_CLASS(TRectSwap) : public TSwap + { +public: + inline TRectSwap(TRect *aRectList); + virtual void Swap(TInt aLeft,TInt aRight) const; +private: + TRect *iRectList; + }; + +inline TRectSwap::TRectSwap(TRect *aRectList) + {iRectList=aRectList;} + +enum {ERegionBufSize=8}; + +EXPORT_C TRegion::TRegion(TInt aAllocedRects) +// +// Constructor. +// + : iCount(0),iError(EFalse),iAllocedRects(aAllocedRects) + {} + + + + +EXPORT_C TBool TRegion::IsEmpty() const +/** +Tests whether the region is empty. + +@return True, if the region is empty and its error flag is unset; + false, otherwise. +*/ + { + + return(iCount==0 && !iError); + } + + + + +#ifndef __REGIONS_MACHINE_CODED__ +EXPORT_C TRect TRegion::BoundingRect() const +/** +Gets the minimal rectangle that bounds the entire region. + +@return The region's minimal bounding rectangle. +*/ + { + + TRect bounds; + const TRect *pRect; + const TRect *pEnd; + if (iCount>0) + { + pRect=RectangleList(); + bounds=(*pRect++); + for (pEnd=pRect+(iCount-1);pRectiTl.iXiTl.iX; + if (pRect->iTl.iYiTl.iY; + if (pRect->iBr.iX>bounds.iBr.iX) + bounds.iBr.iX=pRect->iBr.iX; + if (pRect->iBr.iY>bounds.iBr.iY) + bounds.iBr.iY=pRect->iBr.iY; + } + } + return(bounds); + } +#endif + + + + +EXPORT_C const TRect &TRegion::operator[](TInt aIndex) const +/** +Gets a rectangle from the region. + +@param aIndex The index of a rectangle within the region's array of rectangles. + Indexes are relative to zero. + +@return The specified rectangle. + +@panic USER 81, if aIndex is greater than or equal to the number + of rectangles in the region. +*/ + { + + __ASSERT_ALWAYS((TUint)aIndex<(TUint)iCount,Panic(ETRegionOutOfRange)); + return(*(RectangleList()+aIndex)); + } + + + + +#ifndef __REGIONS_MACHINE_CODED__ +EXPORT_C TBool TRegion::IsContainedBy(const TRect &aRect) const +/** +Tests whether the region is fully enclosed within the specified rectangle. + +@param aRect The specified rectangle. + +@return True, if the region is fully enclosed within the rectangle (their sides + may touch); false, otherwise. +*/ + { + + const TRect *pRect1; + const TRect *pEnd1; + for (pRect1=RectangleList(),pEnd1=pRect1+iCount;pRect1iTl.iXiBr.iX>aRect.iBr.iX || pRect1->iTl.iYiBr.iY>aRect.iBr.iY) + return(EFalse); + } + return(ETrue); + } + + + + +EXPORT_C TBool TRegion::Intersects(const TRect &aRect) const +/** +Tests whether where there is any intersection between this region and the specified rectangle. + +@param aRect The specified rectangle. + +@return True, if there is an intersection; false, otherwise. +*/ + { + + const TRect *pRect1; + const TRect *pEnd1; + for (pRect1=RectangleList(),pEnd1=pRect1+iCount;pRect1Move(aOffset); + pR++; + } + } + + + + +EXPORT_C void TRegion::Offset(TInt aXoffset,TInt aYoffset) +/** +Moves the region by adding X and Y offsets to the co-ordinates of its corners. + +The size of the region is not changed. + +@param aXoffset The number of pixels by which to move the region horizontally. + If negative, the region moves leftwards. +@param aYoffset The number of pixels by which to move the region vertically. + If negative, the region moves upwards. +*/ + { + + Offset(TPoint(aXoffset,aYoffset)); + } + + + + +EXPORT_C TBool TRegion::Contains(const TPoint &aPoint) const +/** +Tests whether a point is located within the region. + +If the point is located on the top or left hand side of any rectangle in the +region, it is considered to be within that rectangle and within the region. + +If the point is located on the right hand side or bottom of a rectangle, it +is considered to be outside that rectangle, and may be outside the region. + +@param aPoint The specified point. + +@return True, if the point is within the region; false, otherwise. +*/ + { + const TRect *pR=RectangleList(); + const TRect *pE=pR+iCount; + while (pRContains(aPoint)) + return(ETrue); + pR++; + } + return(EFalse); + } + + + + +EXPORT_C void TRegion::SubRect(const TRect &aRect,TRegion *aSubtractedRegion) +/** +Removes a rectangle from this region. + +If there is no intersection between the rectangle and this region, then this +region is unaffected. + +@param aRect The rectangular area to be removed from this region. +@param aSubtractedRegion A pointer to a region. If this is supplied, the + removed rectangle is added to it. By default this + pointer is NULL. +*/ + { + if (aRect.IsEmpty()) + return; + TRect *prect=RectangleListW(); + TInt limit=iCount; + for (TInt index=0;indexiBr.iX>aRect.iTl.iX && prect->iBr.iY>aRect.iTl.iY && prect->iTl.iXiTl.iYAddRect(inter); + prect=RectangleListW()+index; // List might have been re-allocated so re-get the pointer + limit--; + } + else + { + index++; + prect++; + } + } + } +#endif + + + + +EXPORT_C void TRegion::Union(const TRegion &aRegion) +/** +Replaces this region with the union of it and the specified region. + +Note that if the error flag of either this region or the specified region is +set, then this region is cleared and its error flag is set. This frees up +allocated memory. + +@param aRegion The region to be joined to this region. +*/ + { + RRegionBuf temp; + temp.Copy(aRegion); + if (temp.iCount>iCount) + { + temp.AppendRegion(*this); + Copy(temp); + } + else + AppendRegion(temp); + temp.Close(); + } + + + + +#ifndef __REGIONS_MACHINE_CODED__ +EXPORT_C void TRegion::Intersection(const TRegion &aRegion1,const TRegion &aRegion2) +/** +Replaces this region with the area of intersection between two specified regions. + +Notes: + +1. If the error flag of either of the two specified regions is set, then this + region is cleared and its error flag is set. This frees up allocated memory. + +2. If this region's error flag is already set, then the function has no effect. + +@param aRegion1 The first region. +@param aRegion2 The second region. +*/ + { + if (aRegion1.iError || aRegion2.iError) + ForceError(); + else + { + iCount=0; + const TRect *pRect1,*pEnd1; + const TRect *pRect2,*pEnd2; + for (pRect1=aRegion1.RectangleList(),pEnd1=pRect1+aRegion1.iCount;pRect1iBr.iX>pRect2->iTl.iX && pRect1->iBr.iY>pRect2->iTl.iY && pRect1->iTl.iXiBr.iX && pRect1->iTl.iYiBr.iY) + { + TRect rect(*pRect2); + rect.Intersection(*pRect1); + AppendRect(rect); + } + } + } + } + } +#endif + + + + +EXPORT_C void TRegion::Intersect(const TRegion &aRegion) +/** +Replaces this region with the area of intersection between it and the specified +region. + +Note that if the error flag of either this region or the specified region is +set, then this region is cleared and its error flag is set. This frees up +allocated memory. + +@param aRegion The region to be intersected with this region. +*/ + { + if (iCount!=0) + { + RRegionBuf temp; + temp.Copy(*this); + Intersection(temp,aRegion); + temp.Close(); + } + } + + + + +EXPORT_C void TRegion::AddRect(const TRect &aRect) +/** +Adds a rectangle to this region. + +Notes: + +1. If this region's error flag is already set, this function has no effect. + +2. If the operation causes the capacity of this region to be exceeded, or if + memory allocation fails, the region is cleared, freeing up any memory which + has been allocated; its error flag is also set. + +@param aRect The rectangle to be added to this region. +*/ + { + + if (!aRect.IsEmpty() && !iError) + { + if (IsContainedBy(aRect)) + { + iCount=0; + AppendRect(aRect); + } + else + { + RRegionBuf temp(aRect); + AppendRegion(temp); + temp.Close(); + } + } + } + + + + +EXPORT_C void TRegion::SubRegion(const TRegion &aRegion,TRegion *aSubtractedRegion) +/** +Removes a region. + +If there is no area of intersection between the two regions, this region is +unaffected. + +@param aRegion The region to be removed from this region. + If aRegion's error flag is set, then this region is + cleared, freeing up any allocated memory, and the + error flag is set. +@param aSubtractedRegion If specified, then on return contains the area removed + from this region. +*/ + { + if (iCount!=0) + { + if (aRegion.iError) + ForceError(); + else + { + const TRect *pR=aRegion.RectangleList(); + const TRect *pE=pR+aRegion.iCount; + while (pRForceError(); + } + } + } + + + + +#ifndef __REGIONS_MACHINE_CODED__ +EXPORT_C void TRegion::ClipRect(const TRect &aRect) +/** +Clips the region to the specified rectangle. + +The resulting region is the area of overlap between the region and the rectangle. +If there is no overlap, all rectangles within this region are deleted and +the resulting region is empty. + +@param aRect The rectangle to which this region is to be clipped. +*/ + { + + for (TInt index=0;indexiTl.iXiTl.iX=aRect.iTl.iX; + if (r2->iTl.iYiTl.iY=aRect.iTl.iY; + if (r2->iBr.iX>aRect.iBr.iX) + r2->iBr.iX=aRect.iBr.iX; + if (r2->iBr.iY>aRect.iBr.iY) + r2->iBr.iY=aRect.iBr.iY; + if (r2->IsEmpty()) + DeleteRect(r2); + else + index++; + } + } +#endif + + + + +EXPORT_C void TRegion::Clear() +/** +Clears this region. + +This frees up any memory which has been allocated and unsets the error flag. +*/ + { + + if (iAllocedRects>=0) + { + User::Free(((RRegion *)this)->iRectangleList); + ((RRegion *)this)->iRectangleList=NULL; + iAllocedRects=0; + } + iCount=0; + iError=EFalse; + } + + + + + +#ifndef __REGIONS_MACHINE_CODED__ +EXPORT_C void TRegion::Tidy() +/** +Merges all rectangles within this region which share an adjacent edge of the +same length. + +The function subsequently frees up any allocated but unused memory. +*/ + { +restart: + if (iCount>1) + { + const TRect *pEnd1=RectangleList()+iCount-1; + const TRect *pEnd2=RectangleList()+iCount; + TRect *pRect1=RectangleListW(); + for (;pRect1iTl.iX==pRect2->iTl.iX && pRect1->iBr.iX==pRect2->iBr.iX) + { + if (pRect1->iBr.iY==pRect2->iTl.iY) + pRect1->iBr.iY=pRect2->iBr.iY; + else if (pRect1->iTl.iY==pRect2->iBr.iY) + pRect1->iTl.iY=pRect2->iTl.iY; + else + continue; + } + else if (pRect1->iTl.iY==pRect2->iTl.iY && pRect1->iBr.iY==pRect2->iBr.iY) + { + if (pRect1->iBr.iX==pRect2->iTl.iX) + pRect1->iBr.iX=pRect2->iBr.iX; + else if (pRect1->iTl.iX==pRect2->iBr.iX) + pRect1->iTl.iX=pRect2->iTl.iX; + else + continue; + } + else + continue; + DeleteRect(pRect2); + goto restart; + } + } + } + if (iAllocedRects>iCount) + { + TRect *newList=(TRect *)User::ReAlloc(((RRegion *)this)->iRectangleList,iCount*sizeof(TRect)); + if (newList!=NULL) + { + iAllocedRects=iCount; + ((RRegion *)this)->iRectangleList=newList; + } + } + } +#endif + + + + +EXPORT_C TInt TRegion::Sort() +/** +Sorts the region's array of rectangles according to their vertical position +on the screen. + +The sort uses the bottom right hand corner co-ordinates of the rectangles. +The co-ordinates of the top and left hand sides are irrelevant +to the sort operation. + +Higher rectangles take precedence over lower ones. For rectangles at the same +vertical position, the leftmost takes priority. + +Note that the sort order may need to be different from the default if, for example, +a region is moved downwards so that lower non-overlapping rectangles need +to be redrawn (and sorted) before higher ones. In this case, use the second +overload of this function. + +@return KErrNone, if the operation is successful; KErrGeneral, otherwise. +*/ + { + + return Sort(TPoint(-1,-1)); + } + + + + +EXPORT_C TInt TRegion::Sort(const TPoint &aOffset) +// +// Sort the region for copying to the same display. +// +/** +Sorts the region's array of rectangles according to a specified sort order. + +The sort uses the bottom right hand co-ordinates of the rectangles. +The co-ordinates of the top and left hand sides are irrelevant +to the sort operation + +The order of the sort is determined by whether the iX and iY members of aOffset +are positive, or zero or less. If aOffset.iY is greater than zero, +lower rectangles take precedence over higher rectangles in the list order. +Otherwise, higher rectangles take precedence. For rectangles of equal height, +aOffset.iX becomes relevant to the sort. +If is greater than zero, rightmost rectangles +take precedence. Otherwise, leftmost rectangles take precedence. + +Note that the sort order may need to be different from the default if, +for example, a region is moved downwards so that lower non-overlapping +rectangles need to be redrawn (and sorted) before higher ones. + +@param aOffset A point whose iX and iY members determine the order of the + sort. + +@return KErrNone, if the operation is successful; KErrGeneral, otherwise. +*/ + { + TRectKey key(RectangleList(),aOffset); + TRectSwap swap(RectangleListW()); + return(User::QuickSort(iCount,key,swap)); + } + + + + +EXPORT_C TRect *TRegion::RectangleListW() +// +// Return a writeable rectangle list. +// + { + if (iAllocedRects>=0) + return(((RRegion *)this)->iRectangleList); + else if (iAllocedRects&ERRegionBuf) + return((TRect *)(this+1)); + return((TRect *)(((RRegion *)this)+1)); + } + +TBool TRegion::SetListSize(TInt aCount) + { + if (iAllocedRects<0) + { + if (aCount>(-(iAllocedRects|ERRegionBuf))) + { + if ((iAllocedRects&ERRegionBuf) || + (((RRegion *)this)->iRectangleList= + (TRect *)User::Alloc(aCount*sizeof(TRect)))==NULL) + { + ForceError(); + return(EFalse); + } + iAllocedRects=aCount; + } + } + else if (iAllocedRectsiRectangleList,aCount*sizeof(TRect)); + if (newList==NULL) + { + ForceError(); + return(EFalse); + } + ((RRegion *)this)->iRectangleList=newList; + iAllocedRects=aCount; + } + return(ETrue); + } + +#ifndef __REGIONS_MACHINE_CODED__ + +EXPORT_C void TRegion::ForceError() +/** +Sets the error flag, and clears the region. + +This frees up memory allocated to the region. +*/ + { + + Clear(); + iError=ETrue; + } + +void TRegion::AppendRect(const TRect &aRect) +// +// Add a rectangle to the list. +// + { + if (!iError) + { + TRect *prects=NULL; + if (iAllocedRects&ERRegionBuf) + { // TRegionFix + if (iCount==-iAllocedRects) + { // Can't expand a TRegionFix + ForceError(); + return; + } + prects=(TRect *)(this+1); + } + else if (iAllocedRects<0) + { // RRegionBuf + prects=(TRect *)(((RRegion *)this)+1); + if (iCount==(-(iAllocedRects|ERRegionBuf))) + { + iAllocedRects=iCount+((RRegion *)this)->iGranularity; + if ((((RRegion *)this)->iRectangleList=(TRect *)User::Alloc(iAllocedRects*sizeof(TRect)))==NULL) + { + ForceError(); + return; + } + Mem::Copy(((RRegion *)this)->iRectangleList, prects, sizeof(TRect)*((RRegion *)this)->iGranularity); + prects=((RRegion *)this)->iRectangleList; + } + } + else + { + RRegion *pr=(RRegion *)this; + prects=pr->iRectangleList; + if (iAllocedRects==iCount) + { + iAllocedRects+=pr->iGranularity; + prects=(TRect *)User::ReAlloc(prects, iAllocedRects*sizeof(TRect)); + if (prects==NULL) + { + ForceError(); + return; + } + pr->iRectangleList=prects; + } + } + *(prects+iCount)=aRect; + iCount++; + } + } + +void TRegion::DeleteRect(TRect *aRect) +// +// Delete a specific rectangle in the list. +// + { + + iCount--; + Mem::Copy(aRect,aRect+1,((TUint8 *)(RectangleList()+iCount))-((TUint8 *)aRect)); + } +#endif + +void TRegion::AppendRegion(TRegion &aRegion) +// +// Append all the rectangles from aRegion to this. +// + { + + if (aRegion.iError) + ForceError(); + else + { + aRegion.SubRegion(*this); + const TRect *pR=aRegion.RectangleList(); + const TRect *pE=pR+aRegion.iCount; + while (pRiBr.iY<=r1->iTl.iY) + return(iDown ? -1 : 1); + if (r1->iBr.iY<=r2->iTl.iY) + return(iDown ? 1 : -1); + if (r2->iBr.iX<=r1->iTl.iX) + return(iRight ? -1 : 1); + __ASSERT_DEBUG(r1->iBr.iX<=r2->iTl.iX,Panic(ETRegionInvalidRegionInSort)); + return(iRight ? 1 : -1); + } + +void TRectSwap::Swap(TInt aLeft,TInt aRight) const +// +// Swap two rectangles. +// + { + + TRect tmp(iRectList[aLeft]); + iRectList[aLeft]=iRectList[aRight]; + iRectList[aRight]=tmp; + } + +TRectKey::TRectKey(const TRect *aRectList,const TPoint &aOffset) +// +// Rectangle key constructor +// + { + + iRectList=aRectList; + if(aOffset.iX>0) + iRight=ETrue; + else + iRight=EFalse; + if(aOffset.iY>0) + iDown=ETrue; + else + iDown=EFalse; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_std.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_std.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,28 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_std.h +// +// + +#include +#include +#include +#include +#include +#include +#include +#include + + +GLREF_C void Panic(TCdtPanic aPanic); diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_test.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,549 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_test.cpp +// +// + +#include "us_std.h" +#include + +#if defined(test) +#undef test +#endif + +#include + +void RTest::CheckConsoleCreated() + { + // Check that the console has been created. + if (iConsole == NULL) + { + TRAPD(r, iConsole = Console::NewL(iTitle, TSize(KConsFullScreen, KConsFullScreen))) + __ASSERT_ALWAYS(r == KErrNone, ::Panic(ERTestCreateConsole)); + } + } + +void RTest::DisplayLevel() + { + // Display the current level string. + TBuf<0x100> aBuf(_L("RTEST: Level ")); + for (TInt ii = 1; ii < iLevel; ii++) + { + if (ii > 1) + { + aBuf.AppendFormat(_L(".%02d"), iStack[ii]); + } + else + { + aBuf.AppendFormat(_L(" %03d"), iStack[ii]); + } + } + if (iLevel > 1) + { + aBuf.AppendFormat(_L(".%02d "), iTest); + } + else + { + aBuf.AppendFormat(_L(" %03d "), iTest); + } + + Printf(aBuf); + } + + + + +/** +Constructor. + +@param aTitle A title describing this use of RTest. + This is also referred to as the console title. +@param aThrowaway Not used. +@param anOtherThrowaway Not used. +*/ +EXPORT_C RTest::RTest(const TDesC &aTitle,TInt /* aThrowaway */,const TText* /* anOtherThrowaway */) + : iTest(0), iLevel(0), iLogging(ETrue), iConsole(NULL), iTitle(aTitle) + // Constructor + // There is a #define test(x) test(x, __LINE__) in e32test.h to pass on line info of failing tests, + // This depends upon the user naming their RTest object test, but if they do this then an extra + // parameter aThrowaway must be added to the constructor + {} + + + +/** +Constructor. + +@param aTitle A title describing this use of RTest. + This is also referred to as the console title. +@param aThrowaway Not used. +*/ +EXPORT_C RTest::RTest(const TDesC &aTitle, TInt /* athrowaway */) + : iTest(0), iLevel(0), iLogging(ETrue), iConsole(NULL), iTitle(aTitle) + // Constructor + // There is a #define test(x) test(x, __LINE__) in e32test.h to pass on line info of failing tests, + // This depends upon the user naming their RTest object test, but if they do this then an extra + // parameter aThrowaway must be added to the constructor + {} + + + + +/** +Constructor. + +@param aTitle A title describing this use of RTest. + This is also referred to as the console title. +*/ +EXPORT_C RTest::RTest(const TDesC &aTitle) + : iTest(0), iLevel(0), iLogging(ETrue), iConsole(NULL), iTitle(aTitle) + // Constructor + {} + + + + +/** +Closes the console and frees any resources acquired. +*/ +EXPORT_C void RTest::Close() + { + // Close the console. + delete iConsole; + iConsole=NULL; + } + + + + +/** +Prints out the console title and version number. + +The format of the text is: + +@code +RTEST TITLE: XXX YYY +Epoc/32 YYY +@endcode + +where XXX is the console title, and YYY is the version number, +formatted as described by TVersion::Name(). + +@see TVersion::Name() +@see RTest::Printf() +*/ +EXPORT_C void RTest::Title() + { + // Print out the program title and version number. + TVersion v(KE32MajorVersionNumber, KE32MinorVersionNumber, KE32BuildVersionNumber); + TBuf<16> vName=v.Name(); + Printf(_L("RTEST TITLE: %S %S\n"), &iTitle, &vName); + vName=User::Version().Name(); + Printf(_L("Epoc/32 %S\n"), &vName); + } + + + + +/** +Marks the start of a set of tests. + +Note that sets of tests can be nested. + +A call to this function must be matched by a call to RTest::End() to mark +the end of this set of tests. + +@param aHeading A heading describing the set of tests; this is + printed at the console. + +@see RTest::End() +*/ +EXPORT_C void RTest::Start(const TDesC &aHeading) + { + // Print out the heading and nest the level. + Push(); + Next(aHeading); + } + + + + +/** +Marks the start of the next test. + +@param aHeading A heading describing the test; this + is printed at the console. This function is also + called by Start(), which passes the text that describes + the set of tests. + +@see RTest::Start() +*/ +EXPORT_C void RTest::Next(const TDesC &aHeading) + { + // Print out the heading and nest the level. + iTest++; + iCheck = 0; + DisplayLevel(); + Printf(_L("Next test - %S\n"), &aHeading); + } + + + + +/** +Checks the result of a condition and, if this is false, prints +a failure message at the console and raises a panic. + +Before checking the condition passed in, the operator increments +a check number. This is a value that is set to zero at the start of a test +and is incremented by this operator (and by all variants of it). It identifies +the check being made within the current test. +This value is printed on a failure message. + +Typically, the operator is called, passing a test condition, for example: + +@code +RTest test(... heading text...,line number... file name) +TInt r; +...some operation to be tested that returns a value in r... +test(r==KErrNone); +@endcode + +The failure message has the format: + +@code +: FAIL : XXX failed check N in FFF at line Number: M +RTEST: Checkpoint-fail +@endcode + +where XXX is the console title, N is the check number, FFF is the filename, +and M is the line number passed in. + +@param aResult The condition being tested. + This is interpreted as a true or false value. +@param aLineNum A line number that is printed in the failure message if + the condition being tested is false. +@param aFileName A file name that is printed in the failure message if + the condition being tested is false. + +@panic USER 84 if the condition being tested is false. + +@see RTest::Next() +@see RTest::Start() +*/ +EXPORT_C void RTest::operator()(TInt aResult, TInt aLineNum, const TText* aFileName) + { + // Test a condition. + iCheck++; + if (!aResult) + { + RDebug::Printf(": FAILING : failed check at line number %d", aLineNum); + DisplayLevel(); + Printf(_L(": FAIL : %S failed check %d in %s at line number %d\n"), + &iTitle, iCheck, aFileName, aLineNum); + Panic(_L("Checkpoint-fail\n")); + if (!iLogging) + Getch(); + } + } + + + + +/** +Checks the result of a condition and, if this is false, prints +a failure message at the console and raises a panic. + +Before checking the condition passed in, the operator increments +a check number. This is a value that is set to zero at the start of a test +and is incremented by this operator (and by all variants of it). It identifies +the check being made within the current test. +This value is printed on the failure message. + +Typically, the operator is called, passing a test condition, for example: + +@code +RTest test(... heading text...,line number) +TInt r; +...some operation to be tested that returns a value in r... +test(r==KErrNone); +@endcode + +The failure message has the format: + +@code +: FAIL : XXX failed check N at line Number: M +RTEST: Checkpoint-fail +@endcode + +where XXX is the console title, N is the check number, and M is +the line number passed in. + +@param aResult The condition being tested. + This is interpreted as a true or false value. +@param aLineNum A line number that is printed in the failure message if + the condition being tested is false. + +@panic USER 84 if the condition being tested is false. + +@see RTest::Next() +@see RTest::Start() +*/ +EXPORT_C void RTest::operator()(TInt aResult,TInt aLineNum) + { + // Test a condition. + iCheck++; + if (!aResult) + { + RDebug::Printf(": FAILING : failed check at line Number: %d", aLineNum); + DisplayLevel(); + Printf(_L(": FAIL : %S failed check %d at line Number: %d\n"), &iTitle, iCheck, aLineNum); + Panic(_L("Checkpoint-fail\n")); + if (!iLogging) + Getch(); + } + } + + + + +/** +Checks the result of a condition and, if this is false, prints +a failure message at the console and raises a panic. + +Before checking the condition passed in, the operator increments +a check number. This is a value that is set to zero at the start of a test +and is incremented by this operator (and by all variants of it). It identifies +the check being made within the current test. +This value is printed on the failure message. + +Typically, the operator is called, passing a test condition, for example: + +@code +RTest test(... heading text...) +TInt r; +...some operation to be tested that returns a value in r... +test(r==KErrNone); +@endcode + +The failure message has the format: + +@code +: FAIL : XXX failed check N +RTEST: Checkpoint-fail +@endcode + +where XXX is the console title, and N is the check number. + +@param aResult The condition being tested. + This is interpreted as a true or false value. + +@panic USER 84 if the condition being tested is false. + +@see RTest::Next() +@see RTest::Start() +*/ +EXPORT_C void RTest::operator()(TInt aResult) + { + // Test a condition. + iCheck++; + if (!aResult) + { + RDebug::Printf(": FAILING : failed check\n"); + DisplayLevel(); + Printf(_L(": FAIL : %S failed check %d\n"), &iTitle, iCheck); + Panic(_L("Checkpoint-fail\n")); + if (!iLogging) + Getch(); + } + } + + + + +/** +Ends the current set of tests. + +If this set of tests is not nested within another set, +then a message reporting success is written to +the console. + +@panic USER 84 if there was no matching call to RTest::Start(), + i.e. more calls to End() have been made than calls to Start(). + +@see RTest::Start() +*/ +EXPORT_C void RTest::End() + { + // End the current level of tests. + if (TInt(iLevel-1) < 0) + { + Panic(_L("End() without matching Start()\n")); + } + + Pop(); + + if (iLevel == 0) + { + Printf(_L("RTEST: SUCCESS : %S test completed O.K.\n"), &iTitle); + if (!iLogging) + Getch(); + } + } + + + + +/** +Prints an error message and an error code, +and raises a USER 84 panic. + +@param anError The error code. +@param aFmt A format list. +@param ... A variable number of parameters. +*/ +EXPORT_C void RTest::Panic(TInt anError,TRefByValue aFmt,...) + { + // Print an error message, an error and then panic. + TestOverflowTruncate overflow; + VA_LIST list; + VA_START(list, aFmt); + TBuf<0x100> aBuf; + aBuf.AppendFormat(_L("RTEST: ")); + aBuf.AppendFormatList(aFmt, list, &overflow); + aBuf.AppendFormat(_L(" Failed with error %d\n"), anError); + Printf(aBuf); + if (!iLogging) + Getch(); + ::Panic(ERTestFailed); + } + + + + +/** +Prints an error message, and raises a USER 84 panic. + +@param aFmt A format list. +@param ... A variable number of parameters. +*/ +EXPORT_C void RTest::Panic(TRefByValue aFmt,...) + { + // Print an error message and then panic. + TestOverflowTruncate overflow; + VA_LIST list; + VA_START(list, aFmt); + TBuf<0x100> aBuf; + aBuf.AppendFormat(_L("RTEST: ")); + aBuf.AppendFormatList(aFmt, list, &overflow); + Printf(aBuf); + if (!iLogging) + Getch(); + ::Panic(ERTestFailed); + } + + + +_LIT(KLitNL, "\n"); +_LIT(KLitCRNL, "\r\n"); +/** +Prints text to the console. + +If the logging flag is set, the string +is also written to the debug output as represented by an RDebug object. + +@param aFmt A format list. +@param ... A variable number of parameters. + +@see RTest::SetLogged() +@see Rtest::Logged() +@see RDebug +*/ +EXPORT_C void RTest::Printf(TRefByValue aFmt,...) + { + // Print to a console screen. + TestOverflowTruncate overflow; + VA_LIST list; + VA_START(list, aFmt); + TBuf<0x100> buf; + buf.AppendFormatList(aFmt, list, &overflow); + CheckConsoleCreated(); + iConsole->Write(buf); + + if (iLogging) + { + TPtrC ptr(buf); + TInt newline; + while ((newline = ptr.Locate('\n')) != KErrNotFound) + { + RDebug::RawPrint(ptr.Left(newline)); + if (newline==0 || ptr[newline-1]!='\r') + RDebug::RawPrint(KLitCRNL); // bare nl, replace with crnl + else + RDebug::RawPrint(KLitNL); // crnl, already printed cr + if (newline+1Getch()); + } + + + +EXPORT_C TInt RTest::CloseHandleAndWaitForDestruction(RHandleBase& aH) + { +#ifndef __TOOLS2__ + TRequestStatus s; + aH.NotifyDestruction(s); + aH.Close(); + TUint32 initial = User::NTickCount(); + TInt r = KErrNone; + if (s == KErrNoMemory) + r = KErrNoMemory; + while (s == KRequestPending) + { + TUint32 now = User::NTickCount(); + if ((now - initial) > 5000) + { + User::CancelMiscNotifier(s); + r = KErrTimedOut; + break; + } + User::AfterHighRes(1000); + } + User::WaitForRequest(s); + return r; +#else + return KErrNone; +#endif // __TOOLS2__ + } + + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_time.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_time.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2526 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_time.cpp +// System date and time functions +// +// + + +#include "us_std.h" + +// Date and time related constants + +static const TInt KMinutesToMicroSeconds = 60000000; +static const TInt KSecondsToMicroSeconds = 1000000; +static const TInt64 KDaysToMicroSeconds = I64LIT(86400000000); +static const TInt64 KHoursToMicroSeconds = I64LIT(3600000000); + +// Days in each month +LOCAL_D const TInt8 mTab[2][12]= + { + {31,28,31,30,31,30,31,31,30,31,30,31}, // 28 days in Feb + {31,29,31,30,31,30,31,31,30,31,30,31} // 29 days in Feb + }; + +// Days in year before 1st of each month +LOCAL_D const TInt cmTab[2][12]= + { + {0,31,59,90,120,151,181,212,243,273,304,334}, + {0,31,60,91,121,152,182,213,244,274,305,335} + }; + +// +// Time::FormatL overflow handler +// +#if defined(_UNICODE) +NONSHARABLE_CLASS(TTimeOverflowLeave) : public TDes16Overflow + { +public: + virtual void Overflow(TDes16 &aDes); + }; +void TTimeOverflowLeave::Overflow(TDes16 &/*aDes*/) + { + User::Leave(KErrOverflow); + } +#else +NONSHARABLE_CLASS(TTimeOverflowLeave) : public TDes8Overflow + { +public: + virtual void Overflow(TDes8 &aDes); + }; +void TTimeOverflowLeave::Overflow(TDes8 &/*aDes*/) + { + User::Leave(KErrOverflow); + } +#endif +// + +EXPORT_C TDateTime::TDateTime(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute,TInt aSecond,TInt aMicroSecond) +// +// always panic on a bad date/time field +// +/** +Constructs the TDateTime object with the seven fields which comprise a date +and time. + +@param aYear The year. No check is made for validity. +@param aMonth The month. Range is EJanuary to EDecember. +@param aDay The day. Range is zero to number of days in month minus one. +@param aHour The hour. Range is 0 to 23. +@param aMinute The minute. Range is 0 to 59. +@param aSecond The second. Range is 0 to 59 +@param aMicroSecond The microsecond. Range is 0 to 999999 + +@panic USER 3, if an attempt is made to set an invalid value for any of + the fields, except for the year. No check is made upon the validity + of the year. +*/ + { + + TInt ret=Set(aYear,aMonth,aDay,aHour,aMinute,aSecond,aMicroSecond); + __ASSERT_ALWAYS(ret==KErrNone,Panic(ETDateTimeBadDateTime)); + } + +EXPORT_C TInt TDateTime::Set(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute,TInt aSecond,TInt aMicroSecond) +// +// set the various time fields checking that each is valid +// bomb out as soon as invalid field is set to forestall causing a panic +// +/** +Sets all date and time components. + +Note: + +1. When setting the day and month, subtract one because the ranges are offset + from zero. + +2. If the function returns an error, only those fields preceding the field which + caused the error will be changed. For example, if the hour is out of range, + the year, month and day will be set, all other components will remain unchanged. + +@param aYear Year. No check is made on its validity, except that if the + date is set to February 29th, the year can only be set to a + leap year, otherwise an error is returned. +@param aMonth Month. The valid range is EJanuary to EDecember. If an + attempt is made to set an invalid month, or if the current + day number in the month is greater than or equal to the + number of days in the new month, an error is returned. +@param aDay The number of the day within the month, offset from zero. + If greater than or equal to the total number of days in + the month,an error is returned. +@param aHour Hour. Range is 0 to 23. +@param aMinute Minute. Range is 0 to 59. +@param aSecond Second. Range is 0 to 59. +@param aMicroSecond Microsecond. Range is 0 to 999999. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + iYear=aYear; + + if (aMonthEDecember) + return KErrGeneral; + iMonth=aMonth; + + if (aDay<0 || aDay>=Time::DaysInMonth(iYear,iMonth)) + return KErrGeneral; + iDay=aDay; + + if (aHour<0 || aHour>=24) + return KErrGeneral; + iHour=aHour; + + if (aMinute<0 || aMinute>=60) + return KErrGeneral; + iMinute=aMinute; + + if (aSecond<0 || aSecond>=60) + return KErrGeneral; + iSecond=aSecond; + + if (aMicroSecond<0 || aMicroSecond>=1000000) + return KErrGeneral; + iMicroSecond=aMicroSecond; + + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetYear(TInt aYear) +// +// doesnt let you reset 29th February to non-leap year, no check on year range +// +/** +Sets the year without a leap year check. + +No check is made on the validity of the year except that if the current date +is February 29th, the year can only be changed to another leap year, otherwise +an error is returned. + +@param aYear The year. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + if (iDay>=Time::DaysInMonth(aYear,iMonth)) + return KErrGeneral; + iYear=aYear; + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetYearLeapCheck(TInt aYear) +// +// lets you reset 29th February to non-leap year(moves date to 28th/Feb), no check on year range +// +/** +Sets the year with a leap year check. + +Unlike SetYear(), if the date is the 29th February, this function allows +the year to be set to a non-leap year. In this case, the date is reset to +the 28th February. + +@param aYear The year. + +@return KErrNone if successful, KErrGeneral if not. + +@see TDateTime::SetYear +*/ + { + + if (iDay>=Time::DaysInMonth(aYear,iMonth)) + iDay=27; + iYear=aYear; + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetMonth(TMonth aMonth) +/** +Sets the month component of the date/time. + +@param aMonth The month to be set. The range is from EJanuary to EDecember. + If an attempt is made to set an invalid month, or if the current + day number in the month is greater than or equal to the number of + days in the new month, an error is returned. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + if (aMonthEDecember || iDay>=Time::DaysInMonth(iYear,aMonth)) + return KErrGeneral; + iMonth=aMonth; + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetDay(TInt aDay) +/** +Sets the day component of the date/time. + +@param aDay The number of the day within the month, offset from zero. If equal + to or greater than the total number of days in the month, an error + is returned. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + if (aDay<0 || aDay>=Time::DaysInMonth(iYear,iMonth)) + return KErrGeneral; + iDay=aDay; + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetHour(TInt aHour) +/** +Sets the hour component of the date/time. + +@param aHour The hour. Range is 0 to 23. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + if (aHour<0 || aHour>=24) // GC - bug fix + return KErrGeneral; + iHour=aHour; + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetMinute(TInt aMinute) +/** +Sets the minute component of the date/time. + +@param aMinute The minute. Range is 0 to 59. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + if (aMinute<0 || aMinute>=60) + return KErrGeneral; + iMinute=aMinute; + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetSecond(TInt aSecond) +/** +Sets the second component of the date/time. + +@param aSecond The second. Range is 0 to 59. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + if (aSecond<0 || aSecond>=60) + return KErrGeneral; + iSecond=aSecond; + return KErrNone; + } + +EXPORT_C TInt TDateTime::SetMicroSecond(TInt aMicroSecond) +/** +Sets the microsecond component of the date/time. + +@param aMicroSecond The microsecond. Range is 0 to 999999. + +@return KErrNone if successful, KErrGeneral if not. +*/ + { + + if (aMicroSecond<0 || aMicroSecond>=1000000) + return KErrGeneral; + iMicroSecond=aMicroSecond; + return KErrNone; + } + +// class TTime + +EXPORT_C TTime::TTime(const TDesC &aString) +/** +Constructs a TTime object with a text string. + +The string consists of up to three components, any or all of which +may be omitted: + +1. year, month and day, followed by a colon + +2. hour, minute and second, followed by a dot + +3. microsecond + +When all three components are present, the string should take the form: + +YYYYMMDD:HHMMSS.MMMMMM + +The conversion from text to time is carried out in the same manner as that +used in TTime::Set(). + +For a list of the range of valid values for date and time components, +see TDateTime::Set(). + +@param aString Date and time string for initializing the TTime object. + +@panic USER 113, if the string is syntactically incorrect, for example, if + neither a colon nor a dot is present, or if any component of + the date or time is assigned an invalid value, or the year + is negative. + +@see TTime::Set +@see TDateTime::Set +*/ + { + + __ASSERT_ALWAYS(Set(aString)==KErrNone,Panic(ETTimeValueOutOfRange)); + } + +EXPORT_C TTime::TTime(const TDateTime &aDateTime) : iTime(Convert(aDateTime).Int64()) +/** +Constructs a TTime object with the seven fields which comprise a date and time. + +@param aDateTime Date and time to which to initialise the TTime object. +*/ + + {} + +EXPORT_C TInt TTime::Set(const TDesC &aString) +// +// Convert string to time. String is in the format: +// +// YYYYMMDD:HHMMSS.MMMMMM +// +// Any part may be ommitted, but either the +// dot or colon or both must be present +// +/** +Assigns a date and time contained in a descriptor to this TTime object. + +The string consists of up to three components, any or all of which may +be omitted: + +1. year, month and day, followed by a colon + +2. hour, minute and second, followed by a dot + +3. microsecond + +When all three components are present, the string should take the form: + +YYYYMMDD:HHMMSS.MMMMMM + +If omitted, the first component is set to January 1st 0 AD nominal Gregorian. +If either the second or third components are omitted, they are set to zero. + +Notes: + +1. The month and day values are offset from zero. + +2. The only situations in which either the colon or dot may be omitted are as + follows: + + 2.1 If the microsecond component is omitted, the preceding dot may also + be omitted. + + 2.2 The colon can be omitted only if a dot is located at string position + zero (indicating that the first two components are missing), or at + string position six (indicating that the first component only is + missing). + +@param aString The date and time to be assigned to this TTime object. + +@return KErrNone if successful, + KErrGeneral if the string is syntactically incorrect, for example, + if neither a colon nor a dot is present, or if any component of the + date or time is given an invalid value, or the year is negative. + For a list of valid values for date and time components, + see TDateTime::Set(). + If an error occurs, the date and time will remain unchanged. +*/ + { + +// +// Get position of the colon and dot separators +// + TInt colon=aString.Locate(':'); + TInt dot=aString.Locate('.'); + + if(colon==KErrNotFound && dot==KErrNotFound) + return(KErrGeneral); +// +// Zero parts that aren't supplied +// + TInt yy=0; + TInt mm=0; + TInt dd=0; + TInt hr=0; + TInt mi=0; + TInt se=0; + TInt ms=0; +// +// Convert YYYYMMDD if present +// + switch(colon) + { + case 0: + break; + case KErrNotFound: + if(dot!=0 && dot!=6) + return(KErrGeneral); + colon=-1; + break; + case 8: + { + TLex y=aString.Left(4); + TLex m=aString.Mid(4,2); + TLex d=aString.Mid(6,2); + y.Val(yy); + m.Val(mm); + d.Val(dd); + } + break; + default: // Colon in wrong position - return error + return(KErrGeneral); + } +// +// Convert HHMMSS if present +// + if(dot==KErrNotFound) + dot=aString.Length(); + + if(dot==colon+7) + { + TLex h=aString.Mid(dot-6,2); + TLex m=aString.Mid(dot-4,2); + TLex s=aString.Mid(dot-2,2); + h.Val(hr); + m.Val(mi); + s.Val(se); + } + else if(dot!=KErrNotFound && dot!=0 && dot!=colon+1) + return(KErrGeneral); + + if(dot!=KErrNotFound) + { + if(aString.Length()>dot+7) + return(KErrGeneral); // microseconds is more than 6 digits + if(dot0) + iTime+=59999999; +//* TInt64 remainder; +//* Int64().DivMod(60000000,remainder); +//* iTime-=remainder; + iTime-=iTime%60000000; + } + +TTime TTime::Convert(const TDateTime &aDateTime) +// +// converts TDateTime into a TTime, doesnt check for overflows +// + { + + TInt days=365*aDateTime.Year()+Time::LeapYearsUpTo(aDateTime.Year()); + TBool isleap=Time::IsLeapYear(aDateTime.Year()); + days+=cmTab[isleap][aDateTime.Month()]; + days+=aDateTime.Day(); + + TUint sum=aDateTime.MicroSecond()+aDateTime.Second()*KSecondsToMicroSeconds+aDateTime.Minute()*KMinutesToMicroSeconds; + return(((TInt64(days*3)<<3)+TInt64(aDateTime.Hour()))*KHoursToMicroSeconds+TInt64(sum)); + } + +EXPORT_C TTime &TTime::operator=(const TDateTime &aDateTime) +/** +Assigns a TDateTime object to this TTime object. + +@param aDateTime The date and time to assign to this TTime object. + +@return This TTime object. +*/ + { + + iTime=Convert(aDateTime).Int64(); + return(*this); + } + +EXPORT_C TDateTime TTime::DateTime() const +// +// converts iTime back into its TDateTime components +// +/** +Converts the TTime object into a TDateTime object. + +This conversion must be done before the seven fields which comprise a date +and time can be accessed. + +@return The components of the time, indicating year, month, day, hour, minute, + second, microsecond. +*/ + { + + TInt64 rem; + TInt64 daysSince0AD64(iTime); + + rem = daysSince0AD64 % KDaysToMicroSeconds; + daysSince0AD64 /= KDaysToMicroSeconds; + + TInt daysSince0AD = static_cast(daysSince0AD64); + + TInt year; + TInt daysLeft; + if (iTime<0) + { // -1 to make daysLeft +ve and assume leap year every 4 years + if (rem!=TInt64(0)) + { + daysSince0AD--; + rem=iTime-TInt64(daysSince0AD)*KDaysToMicroSeconds; + } + year=(4*daysSince0AD)/((4*365)+1); + if ((4*daysSince0AD)%((4*365)+1)) + year--; + daysLeft=daysSince0AD-((year*365)+Time::LeapYearsUpTo(year)); + } + else + { // after 1600 leap years less than every four years + year=(4*daysSince0AD)/((4*365)+1); + daysLeft=daysSince0AD-((year*365)+Time::LeapYearsUpTo(year)); + TInt daysInYear=365+Time::IsLeapYear(year); + while (daysLeft>=daysInYear) + { + year++; + daysLeft-=daysInYear; + daysInYear=365+Time::IsLeapYear(year); + } + } + + TDateTime result(0,EJanuary,0,0,0,0,0); + result.SetYear(year); + + TBool isleap=Time::IsLeapYear(year); + TInt month=11; + const TInt* pCM=&(cmTab[isleap][11])+1; + while(daysLeft<*--pCM) + month--; + daysLeft-=*pCM; + + result.SetMonth((TMonth)month); + result.SetDay(daysLeft); + + TInt hour = static_cast(rem >> 10) / 3515625; // 3515625=KHoursToMicroSeconds/1024 + result.SetHour(hour); + TUint rem32=I64LOW(rem-(TInt64(hour*3515625)<<10)); + TUint min=rem32/KMinutesToMicroSeconds; + result.SetMinute((TInt)min); + rem32-=min*KMinutesToMicroSeconds; + TUint sec=rem32/KSecondsToMicroSeconds; + result.SetSecond((TInt)sec); + rem32-=sec*KSecondsToMicroSeconds; + result.SetMicroSecond(TInt(rem32)); + return(result); + } + +EXPORT_C TTimeIntervalMicroSeconds TTime::MicroSecondsFrom(TTime aTime) const +// +// this - aTime +// +/** +Calculates the number of microseconds difference between the specified TTime +and this TTime. + +@param aTime The time to be compared with this TTime. + +@return Difference in microseconds between the two times. If the time specified + in the argument is later than this TTime, this value is negative. +*/ + { + + TInt64 difference=iTime-aTime.Int64(); + return(difference); + } + +EXPORT_C TInt TTime::SecondsFrom(TTime aTime,TTimeIntervalSeconds &aInterval) const +// +// this - aTime as whole seconds +// this function may fail if difference > no of seconds that can be represented in a TInt +// +/** +Calculates the number of seconds difference between the specified TTime and +this TTime. + +The difference may be positive or negative. + +@param aTime The time to be compared with this TTime. +@param aInterval On return contains the difference in seconds between the two + times. If the time specified in the first argument is later than + this TTime, then this returned value is negative. + +@return Error code. KErrNone if successful. + KErrOverflow, if the calculated interval is too large for + a 32-bit integer. +*/ + { + TInt64 diff; + if (iTime>aTime.Int64()) + { + diff= TInt64(TUint64(iTime-aTime.Int64())/KSecondsToMicroSeconds); + } + else + { + diff= -TInt64(TUint64(aTime.Int64()-iTime)/KSecondsToMicroSeconds); + } + if (diff>KMaxTInt || diff(diff); + return KErrNone; + } + +EXPORT_C TInt TTime::MinutesFrom(TTime aTime,TTimeIntervalMinutes &aInterval) const +// +// iTime - aTime as whole minutes +// function may fail if difference can't be represented as a TInt +// +/** +Calculates the number of minutes difference between the specified TTime and +this TTime. + +The difference may be positive or negative. + +@param aTime The time to be compared with this TTime. +@param aInterval On return contains the difference in minutes between the two + times. If the time specified in the first argument is later + than this TTime, then this returned value is negative. + +@return Error code. KErrNone if successful. + KErrOverflow, if the calculated interval is too large for + a 32-bit integer. +*/ + { + TInt64 diff; + if (iTime>aTime.Int64()) + { + diff= TInt64(TUint64(iTime-aTime.Int64())/KMinutesToMicroSeconds); + } + else + { + diff= -TInt64(TUint64(aTime.Int64()-iTime)/KMinutesToMicroSeconds); + } + if (diff>KMaxTInt || diff(diff); + return KErrNone; + } + +EXPORT_C TInt TTime::HoursFrom(TTime aTime,TTimeIntervalHours &aInterval) const +// +// iTime - aTime as whole hours +// function may fail if difference can't be represented as a TInt +// +/** +Calculates the number of hours difference between the specified TTime and +this TTime. + +The difference may be positive or negative. + +@param aTime The time to be compared with this TTime. +@param aInterval On return contains the difference in hours between the two + times. If the time specified in the first argument is later + than this TTime, then this returned value is negative. + +@return Error code. KErrNone if successful. + KErrOverflow, if the calculated interval is too large for + a 32-bit integer. +*/ + { + TInt64 diff; + if (iTime>aTime.Int64()) + { + diff= TInt64(TUint64(iTime-aTime.Int64())/KHoursToMicroSeconds); + } + else + { + diff= -TInt64(TUint64(aTime.Int64()-iTime)/KHoursToMicroSeconds); + } + if (diff>KMaxTInt || diff(diff); + return KErrNone; + } + + +EXPORT_C TTimeIntervalDays TTime::DaysFrom(TTime aTime) const +// +// iTime - aTime as whole days +// +/** +Calculates the number of days difference between the specified TTime and +this TTime. + +The difference may be positive or negative. + +@param aTime The time to be compared with this TTime. + +@return Difference in days between the two times. If the time specified in + aTime is later than this TTime, the returned value will be negative. +*/ + { + if (iTime>aTime.Int64()) + { + return TInt(TUint64(iTime-aTime.Int64())/KDaysToMicroSeconds); + } + else + { + return -TInt(TUint64(aTime.Int64()-iTime)/KDaysToMicroSeconds); + } + } + +EXPORT_C TTimeIntervalMonths TTime::MonthsFrom(TTime aTime) const +// +// iTime - aTime as whole months - ie aTime must be on a later day in the month and later in that day +// except for last days etc eg 31st October - 30 November is one month to be consistent with other +// functions +// +/** +Calculates the number of months between the specified TTime and this TTime. + +The result may be positive or negative. + +The interval in months between two TTimes is calculated by incrementing it +by one each time the same day number and time in the previous or following +month has been reached. Exceptions to this rule occur when this TTime is on +the last day of the month. In this case, the following rules apply: + +When comparing this TTime with a later time: + +1. if the following month is shorter, one month is deemed to separate the times + when the same time on the last day of the following month is reached. In this + case, the two day numbers are not the same. + +When comparing this TTime with an earlier time: + +1. if the previous month is shorter, one month is deemed to separate the times + when the last microsecond of the previous month is reached (23:59:59.999999 + on the last day of the month). + +2. if the previous month is longer, one month is deemed to separate the times + when the same time on the last day of previous month is reached. In this case, + the two day numbers are not the same. + +@param aTime The time to be compared with this TTime. + +@return Difference in months between the two times. If the time specified in + the argument is later than this TTime, the interval is negative. +*/ + { + + TDateTime dateTimei=DateTime(); + TDateTime dateTimea=aTime.DateTime(); + + TInt monthsDifference=(dateTimei.Year()-dateTimea.Year())*12+(dateTimei.Month()-dateTimea.Month()); + + if (monthsDifference>0) + { + if (dateTimei.Day()<=dateTimea.Day()) + { + if (iTime%KDaysToMicroSeconds=dateTimea.Day()) + { + if (iTime%KDaysToMicroSeconds>aTime.Int64()%KDaysToMicroSeconds || (dateTimei.Day()!=dateTimea.Day() && dateTimea.Day()!=aTime.DaysInMonth()-1)) + monthsDifference++; + } + } + + return(monthsDifference); + } + +EXPORT_C TTimeIntervalYears TTime::YearsFrom(TTime aTime) const +// +// as above,but for twelve months +// +/** +Calculates the number of years between the specified TTime and this TTime. + +The result may be positive or negative. + +Note that the interval in years between two TTimes is calculated by +incrementing it by one each time the same day number and time in the previous +or following year has been reached. The exception to this rule occurs when this +TTime is the last day in February in a leap year. In this case, one year is +deemed to have passed when the same time of day on the last day in the preceding +or following February has been reached. + +@param aTime The time to be compared with this TTime. + +@return Difference in years between the two times. If the time specified in + the argument is later than this TTime, the interval is negative. +*/ + { + + TTimeIntervalMonths mos= TTime::MonthsFrom(aTime); + TTimeIntervalYears ret=mos.Int()/12; + return(ret); + } + +EXPORT_C TTime TTime::operator+(TTimeIntervalYears aYear) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that in a leap year, when adding one year to the 29th February, the result +is the 28th February in the following year. + +Note also that this TTime object is not changed. + +@param aYear A time interval in years. The argument is stored as a 32 bit + signed integer. The maximum value which it can represent is + 2147483647. Any attempt to add more than this amount will + produce incorrect results. + +@return The new time. +*/ + { + + return((*this)+TTimeIntervalMonths(aYear.Int()*12)); + } + +EXPORT_C TTime TTime::operator+(TTimeIntervalMonths aMonth) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that when adding one month to the last day in the month, if the following +month is shorter, the result is the last day in the following month. +For example, when adding one month to 31st August, the result is +the 30th September. + +Note also that this TTime object is not changed. + +@param aMonth A time interval in months. The argument is stored as a 32 bit + signed integer. The maximum value which it can represent is + 2147483647. Any attempt to add more than this amount will + produce incorrect results. + +@return The new time. +*/ + { + + TDateTime dateTime=DateTime(); + TInt month=dateTime.Month()+(dateTime.Year()*12)+aMonth.Int(); + TInt day=dateTime.Day(); + TInt year=month/12; + month%=12; + if (month<0) + { + year--; + month+=12; + } + TInt daysInMonth=(mTab[Time::IsLeapYear(year)][month]-1); + if (day>=daysInMonth) + day=daysInMonth; + dateTime.Set(year,TMonth(month),day,dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond()); + return(dateTime); + } + +EXPORT_C TTime TTime::operator+(TTimeIntervalDays aDay) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aDay A time interval in days. The argument is stored as a 32 bit + signed integer. The maximum value which it can represent is + 2147483647. Any attempt to add more than this amount will + produce incorrect results. + +@return The new time. +*/ + { + + return(iTime+TInt64(aDay.Int())*KDaysToMicroSeconds); + } + +EXPORT_C TTime TTime::operator+(TTimeIntervalHours aHour) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aHour A time interval in hours. The argument is stored as a 32 bit + signed integer. The maximum value which it can represent is + 2147483647. Any attempt to add more than this amount will + produce incorrect results. + +@return The new time. +*/ + { + + return(iTime+TInt64(aHour.Int())*KHoursToMicroSeconds); + } + +EXPORT_C TTime TTime::operator+(TTimeIntervalMinutes aMinute) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aMinute A time interval in minutes. The argument is stored as a 32 bit + signed integer. The maximum value which it can represent is + 2147483647. Any attempt to add more than this amount will + produce incorrect results. + +@return The new time. +*/ + { + + return(iTime+TInt64(aMinute.Int())*KMinutesToMicroSeconds); + } + +EXPORT_C TTime TTime::operator+(TTimeIntervalSeconds aSecond) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aSecond A time interval in seconds. The argument is stored as a 32 bit + signed integer. The maximum value which it can represent is + 2147483647. Any attempt to add more than this amount will + produce incorrect results. + +@return The new time. +*/ + { + + return(iTime+TInt64(aSecond.Int())*KSecondsToMicroSeconds); + } + + +EXPORT_C TTime TTime::operator+(TTimeIntervalMicroSeconds aMicroSecond) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aMicroSecond A time interval in microseconds. + +@return The new time. +*/ + { + + return(iTime+(aMicroSecond.Int64())); + } + +EXPORT_C TTime TTime::operator+(TTimeIntervalMicroSeconds32 aMicroSecond) const +/** +Adds a time interval to this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aMicroSecond A time interval in microseconds. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to add more than this + amount will produce incorrect results. + +@return The new time. +*/ + { + + return(iTime+aMicroSecond.Int()); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalYears aYear) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that in a leap year, when subtracting one year from the 29th February, +the result is 28th February in the preceding year. + +Note also that this TTime object is not changed. + +@param aYear A time interval in years. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to subtract more than this + amount will produce incorrect results. + +@return The new time. +*/ + { + + return((*this)-TTimeIntervalMonths(aYear.Int()*12)); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalMonths aMonth) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that when subtracting one month from the last day in the month, if the +preceding month is shorter, the result is the last day in the preceding month. +For example, when subtracting 1 month from 31st October, the result is +the 30th September. + +Note also that this TTime object is not changed. + +@param aMonth A time interval in months. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to subtract more than this + amount will produce incorrect results. + +@return The new time. +*/ + { + + return((*this)+TTimeIntervalMonths(aMonth.Int()*-1)); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalDays aDay) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aDay A time interval in days. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to subtract more than this + amount will produce incorrect results. + +@return The new time. +*/ + { + + return(iTime-TInt64(aDay.Int())*KDaysToMicroSeconds); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalHours aHour) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aHour A time interval in hours. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to subtract more than this + amount will produce incorrect results. + +@return The new time. +*/ + { + + return(iTime-TInt64(aHour.Int())*KHoursToMicroSeconds); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalMinutes aMinute) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aMinute A time interval in minutes. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to subtract more than this + amount will produce incorrect results. + +@return The new time. +*/ + { + + return(iTime-TInt64(aMinute.Int())*KMinutesToMicroSeconds); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalSeconds aSecond) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aSecond A time interval in seconds. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to subtract more than this + amount will produce incorrect results. + +@return The new time. +*/ + { + + return(iTime-TInt64(aSecond.Int())*KSecondsToMicroSeconds); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalMicroSeconds aMicroSecond) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aMicroSecond A time interval in microseconds. + +@return The new time. +*/ + { + + return(iTime-(aMicroSecond.Int64())); + } + +EXPORT_C TTime TTime::operator-(TTimeIntervalMicroSeconds32 aMicroSecond) const +/** +Substracts a time interval from this TTime, returning the result +as a TTime. + +Note that this TTime object is not changed. + +@param aMicroSecond A time interval in microseconds. The argument is stored as + a 32 bit signed integer. The maximum value which it can + represent is 2147483647. Any attempt to subtract more than + this amount will produce incorrect results. + +@return The new time. +*/ + { + + return(iTime-aMicroSecond.Int()); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalYears aYear) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aYear A time interval in years. + +@return A reference to this TTime. +*/ + { + + TTime tim=(*this)+aYear; + iTime=tim.Int64(); + return(*this); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalMonths aMonth) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aMonth A time interval in months. + +@return A reference to this TTime. +*/ + { + + TTime tim=(*this)+aMonth; + iTime=tim.Int64(); + return(*this); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalDays aDay) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aDay A time interval in days. + +@return A reference to this TTime. +*/ + { + + iTime+=TInt64(aDay.Int())*KDaysToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalHours aHour) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aHour A time interval in hours. + +@return A reference to this TTime. +*/ + { + + iTime+=TInt64(aHour.Int())*KHoursToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalMinutes aMinute) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aMinute A time interval in minutes. + +@return A reference to this TTime. +*/ + { + + iTime+=TInt64(aMinute.Int())*KMinutesToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalSeconds aSecond) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aSecond A time interval in seconds. + +@return A reference to this TTime. +*/ + { + + iTime+=TInt64(aSecond.Int())*KSecondsToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalMicroSeconds aMicroSecond) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aMicroSecond A time interval in microseconds. + +@return A reference to this TTime. +*/ + { + + iTime+=aMicroSecond.Int64(); + return(*this); + } + +EXPORT_C TTime &TTime::operator+=(TTimeIntervalMicroSeconds32 aMicroSecond) +/** +Adds a time interval to this TTime, returning a reference to this TTime. + +@param aMicroSecond A time interval in microseconds, as a 32-bit integer. + +@return A reference to this TTime. +*/ + { + + iTime+=aMicroSecond.Int(); + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalYears aYear) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aYear A time interval in years. + +@return A reference to this TTime. +*/ + { + + TTime tim=(*this)-aYear; + iTime=tim.Int64(); + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalMonths aMonth) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aMonth A time interval in months. + +@return A reference to this TTime. +*/ + { + + TTime tim=(*this)-aMonth; + iTime=tim.Int64(); + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalDays aDay) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aDay A time interval in days. + +@return A reference to this TTime. +*/ + { + + iTime-=TInt64(aDay.Int())*KDaysToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalHours aHour) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aHour A time interval in hours. + +@return A reference to this TTime. +*/ + { + + iTime-=TInt64(aHour.Int())*KHoursToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalMinutes aMinute) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aMinute A time interval in minutes. + +@return A reference to this TTime. +*/ + { + + iTime-=TInt64(aMinute.Int())*KMinutesToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalSeconds aSecond) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aSecond A time interval in seconds. + +@return A reference to this TTime. +*/ + { + + iTime-=TInt64(aSecond.Int())*KSecondsToMicroSeconds; + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalMicroSeconds aMicroSecond) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aMicroSecond A time interval in microseconds. + +@return A reference to this TTime. +*/ + { + + iTime-=aMicroSecond.Int64(); + return(*this); + } + +EXPORT_C TTime &TTime::operator-=(TTimeIntervalMicroSeconds32 aMicroSecond) +/** +Subtracts a time interval from this TTime, returning a reference to this TTime. + +@param aMicroSecond A time interval in microseconds, as a 32-bit integer. + +@return A reference to this TTime. +*/ + { + + iTime-=aMicroSecond.Int(); + return(*this); + } + +EXPORT_C TInt TTime::DaysInMonth() const +/** +Gets the number of days in the current month. + +@return The number of days in the month. +*/ + { + + TDateTime dateTime=DateTime(); + return(Time::DaysInMonth(dateTime.Year(),dateTime.Month())); + } + +EXPORT_C TDay TTime::DayNoInWeek() const +// +// 1st January 0AD was a Monday +// +/** +Gets the day number within the current week. + +This is a value in the range zero to six inclusive, and honours the +setting specified in TLocale::SetStartOfWeek(). + +By default the first day in the week is Monday. + +@return The number of the day within the week. The range is EMonday to ESunday. + +@see TLocale::SetStartOfWeek +*/ + { + + + TInt64 fullDays=iTime/KDaysToMicroSeconds; + TInt day = static_cast(fullDays) % 7; + if (iTime<0) + { + if (fullDays*KDaysToMicroSeconds!=iTime) + day+=6; + else + if (day!=0) + day+=7; + } + return((TDay)day); + } + +EXPORT_C TInt TTime::DayNoInMonth() const +/** +Gets the day number in the month. + +@return The day number in the month. The first day in the month is numbered + zero. +*/ + { + + return(DateTime().Day()); + } + +EXPORT_C TInt TTime::DayNoInYear() const +// +// day number in comparison to 1st January +// +/** +Gets the day number in the year. + +@return The day number in the year. The first day in the year is day one. +*/ + { + + TDateTime dateTime=DateTime(); + TTime jan1st=TDateTime(dateTime.Year(),EJanuary,0,0,0,0,0); + return(DayNoInYear(jan1st)); + } + +EXPORT_C TInt TTime::DayNoInYear(TTime aStartDate) const +// +// day number in comparison to given date, check is made to ensure first day is within a year before aDay +// +/** +Gets the day number in the year when the start of the year is aStartDate. + +If no start date is specified, the default is January 1st. + +@param aStartDate Indicates the date which is to be considered the start of + the year. Default is 1st January. + +@return The day number in the year. The first day in the year is day one. +*/ + { + + TInt y=DateTime().Year(); + TMonth m=aStartDate.DateTime().Month(); + TInt d=aStartDate.DateTime().Day(); + if (d>=Time::DaysInMonth(y,m)) + d=27; + TDateTime yearStart(y,m,d,0,0,0,0); // LEAP YEAR PROBLEMS ??? + aStartDate=yearStart; + if (aStartDate>*this) + { + yearStart.SetYearLeapCheck(y-1); + aStartDate=yearStart; + } + return((DaysFrom(aStartDate).Int())+1) ; + } + +EXPORT_C TInt TTime::WeekNoInYear() const +/** +Gets the number of the current week in the year. + +@return Week number in the year. +*/ + { + + return(WeekNoInYear(EFirstFourDayWeek)); + } + +EXPORT_C TInt TTime::WeekNoInYear(TTime aStartDate) const +/** +Gets the number of the current week in the year when the year starts +on aStartDate. + +@param aStartDate If specified, indicates the date which is to be considered + the start of the year. Default is 1st January. + +@return Week number in the year. +*/ + { + + return(WeekNoInYear(aStartDate,EFirstFourDayWeek)); + } + +EXPORT_C TInt TTime::WeekNoInYear(TFirstWeekRule aRule) const +/** +Finds the number of the current week in the year using the first week rule +specified in aRule. + +@param aRule Determines how the first week in the year is to be calculated. + By default EFirstFourDayWeek. + +@return Week number in the year. +*/ + { + + TInt year=DateTime().Year(); + TTime startDate=TDateTime(year,EJanuary,0,0,0,0,0); + return(WeekNoInYear(startDate,aRule)); + } + +EXPORT_C TInt TTime::WeekNoInYear(TTime aStartDate,TFirstWeekRule aRule) const +// +// number of weeks between aTime and aStartDate according to given rule +// the first week starts either on the week containing the first day (EFirstWeek), +// the first week having at least four days within the new year (EFirstFourDayWeek, +// default) or the first full week in the year (EFirstFullWeek) +// +/** +Finds the number of the current week in the year when the year starts from +aStartDate and when using the start week rule aRule. + +@param aStartDate If specified, indicates the date which is to be considered + the start of the year. Default is 1st January. +@param aRule Determines how the first week in the year is to be + calculated. By default EFirstFourDayWeek. + +@return Week number in the year. +*/ + { + TInt dayNoInWeek=DayNoInWeek(); + TInt dayNoInYear=(DayNoInYear(aStartDate))-1; // puts start into correct year + TDateTime startDateTime(aStartDate.DateTime()); + TDateTime nextYearStartDate(startDateTime); + nextYearStartDate.SetYearLeapCheck(DateTime().Year()); // find start of next year + TTime nextYearStartTime(nextYearStartDate); // makes sure start date for year + if (*this>nextYearStartTime) // is in the very next year + { + nextYearStartDate.SetYearLeapCheck(nextYearStartDate.Year()+1); + nextYearStartTime=nextYearStartDate; + } + nextYearStartTime+=TTimeIntervalMicroSeconds(KDaysToMicroSeconds-1); // avoid problems if the time is not midnight + TLocale local; + TDay startOfFirstWeek=local.StartOfWeek(); + // calculate the day-in-week number (0 to 6) based on the locale start-of-week + dayNoInWeek -= startOfFirstWeek; + if (dayNoInWeek < 0) + dayNoInWeek += 7; + // calculate the days from the start-of-week to the start-of-next-year + TInt daysFrom=nextYearStartTime.DaysFrom(*this).Int()+dayNoInWeek; + // calculate the days from start-of-year to start-of-week (note this may be negative, but never < -6) + TInt days=dayNoInYear-dayNoInWeek; + + // the rule allows a certain number of week-1 days to lie in the previous year + TInt prevyeardays; + switch (aRule) + { + default: + return -1; + case EFirstWeek: + prevyeardays = 6; + break; + case EFirstFourDayWeek: + prevyeardays = 3; + break; + case EFirstFullWeek: + prevyeardays = 0; + break; + } + + // check for a week which belongs to last year + if (days + prevyeardays < 0) + { + // in week 52 or 53 of last year, find the week # of the first day in the week + startDateTime.SetYearLeapCheck(startDateTime.Year()-1); + return (*this-TTimeIntervalDays(dayNoInWeek)).WeekNoInYear(TTime(startDateTime),aRule); + } + + // check for a week which belongs to next year + if (daysFrom <= prevyeardays) + return 1; + + // calculate the week number, accounting for the requested week-1 rule + return (days + 7 + prevyeardays)/7; + } + +EXPORT_C void TTime::FormatL(TDes &aDes,const TDesC &aFormat) const +// +// Fill aString with current Date and Time according to given aFormat string +// +/** +Puts this TTime into a descriptor and formats it according to the format string +specified in the second argument. + +Many of the formatting commands use the +system's locale settings for the date and time, for example the characters +used to separate components of the date and time and the ordering of day, +month and year. The list of formatting commands below is divided into two +sections, the first of which lists the commands which operate without reference +to the locale's date and time settings (see class TLocale) and the second +table lists the commands which do use these settings. + +The following formatting commands do not honour the locale-specific system +settings: + +\%\% : Include a single '%' character in the string + +\%* : Abbreviate following item (the following item should not be preceded +by a '%' character). + +\%C : Interpret the argument as the six digit microsecond component of the +time. In its abbreviated form, ('%*C') this should be followed by an integer +between zero and six, where the integer indicates the number of digits to display. + +\%D : Interpret the argument as the two digit day number in the month. Abbreviation +suppresses leading zero. + +\%E : Interpret the argument as the day name. Abbreviation is language-specific +(e.g. English uses the first three letters). + +\%F : Use this command for locale-independent ordering of date components. +This orders the following day/month/year component(s) (\%D, \%M, \%Y for example) +according to the order in which they are specified in the string. This removes +the need to use \%1 to \%5 (described below). + +\%H : Interpret the argument as the one or two digit hour component of the +time in 24 hour time format. Abbreviation suppresses leading zero. For locale-dependent +hour formatting, use \%J. + +\%I : Interpret the argument as the one or two digit hour component of the +time in 12 hour time format. The leading zero is automatically suppressed +so that abbreviation has no effect. For locale-dependent hour formatting, +use \%J. + +\%M : Interpret the argument as the one or two digit month number. Abbreviation +suppresses leading zero. + +\%N : Interpret the argument as the month name. Abbreviation is language specific, e.g. +English uses the first three letters only. When using locale-dependent formatting, +(that is, \%F has not previously been specified), specifying \%N causes any +subsequent occurrence of a month specifier in the string to insert the month +as text rather than in numeric form. When using locale-independent formatting, +specifying \%N causes the month to be inserted as text at that position, but +any subsequent occurrence of \%M will cause the month to be inserted in numeric +form. + +\%S : Interpret the argument as the one or two digit seconds component of the +time. Abbreviation suppresses leading zero. + +\%T : Interpret the argument as the one or two digit minutes component of the +time. Abbreviation suppresses leading zero. + +\%W : Interpret the argument as the one or two digit week number in year. Abbreviation +suppresses leading zero. + +\%X : Interpret the argument as the date suffix. Cannot be abbreviated. When +using locale-dependent formatting (that is, \%F has not previously been specified), +\%X causes all further occurrences of the day number to be displayed with the +date suffix. When using locale-independent formatting, a date suffix will +be inserted only after the occurrence of the day number which \%X follows in +the format string. Any further occurrence of \%D without a following \%X will +insert the day number without a suffix. + +\%Y : Interpret the argument as the four digit year number. Abbreviation suppresses +the first two digits. + +\%Z : Interpret the argument as the one, two or three digit day number in the +year. Abbreviation suppresses leading zeros. + +The following formatting commands do honour the locale-specific system settings: + +\%. : Interpret the argument as the decimal separator character (as set by +TLocale::SetDecimalSeparator()). The decimal separator is used to separate +seconds and microseconds, if present. + +\%: : Interpret the argument as one of the four time separator characters (as +set by TLocale::SetTimeSeparator()). Must be followed by an integer between +zero and three inclusive to indicate which time separator character is being +referred to. + +\%/ : Interpret the argument as one of the four date separator characters (as +set by TLocale::SetDateSeparator()). Must be followed by an integer between +zero and three inclusive to indicate which date separator character is being +referred to. + +\%1 : Interpret the argument as the first component of a three component date +(i.e. day, month or year) where the order has been set by TLocale::SetDateFormat(). +When the date format is EDateEuropean, this is the day, when EDateAmerican, +the month, and when EDateJapanese, the year. For more information on this +and the following four formatting commands, see the Notes section immediately +below. + +\%2 : Interpret the argument as the second component of a three component date +where the order has been set by TLocale::SetDateFormat(). When the date format +is EDateEuropean, this is the month, when EDateAmerican, the day and when +EDateJapanese, the month. + +\%3 : Interpret the argument as the third component of a three component date +where the order has been set by TLocale::SetDateFormat(). When the date format +is EDateEuropean, or EDateAmerican this is the year and when EDateJapanese, +the day. + +\%4 : Interpret the argument as the first component of a two component date +(day and month) where the order has been set by TLocale::SetDateFormat(). +When the date format is EDateEuropean this is the day, and when EDateAmerican +or EDateJapanese, the month. + +\%5 : Interpret the argument as the second component of a two component date +(day and month) where the order has been set by TLocale::SetDateFormat(). +When the date format is EDateEuropean this is the month, and when EDateAmerican +or EDateJapanese, the day. + +\%A : Interpret the argument as "am" or "pm" text according to the current +language and time of day. Unlike the \%B formatting command (described below), +\%A disregards the locale's 12 or 24 hour clock setting, so that when used +without an inserted + or - sign, am/pm text will always be displayed. Whether +a space is inserted between the am/pm text and the time depends on the locale-specific +settings. However, if abbreviated (\%*A), no space is inserted, regardless +of the locale's settings. The am/pm text appears before or after the time, +according to the position of the \%A, regardless of the locale-specific settings. +For example, the following ordering of formatting commands causes am/pm text +to be printed after the time: \%H \%T \%S \%A. Optionally, a minus or plus sign +may be inserted between the "%" and the "A". This operates as follows: + +\%-A causes am/pm text to be inserted into the descriptor only if the am/pm +symbol position has been set in the locale to ELocaleBefore. Cannot be abbreviated +using asterisk. + +\%+A causes am/pm text to be inserted into the descriptor only if the am/pm +symbol position has been set in the locale to ELocaleAfter. Cannot be abbreviated +using asterisk. For example, the following formatting commands will cause +am/pm text to be displayed after the time if the am/pm position has been set +in the locale to ELocaleAfter or before the time if ELocaleBefore: \%-A \%H +\%T \%S \%+A. + +\%B Interpret the argument as am or pm text according to the current language +and time of day. Unlike the \%A command, when using \%B, am/pm text is displayed +only if the clock setting in the locale is 12-hour. Whether a space is inserted +between the am/pm text and the time depends on the locale-specific settings. +However, if abbreviated (\%*B), no space is inserted, regardless of the locale's +settings. The am/pm text appears before or after the time, according to the +location of the "%B", regardless of the locale-specific settings. For example, +the following formatting commands cause am/pm text to be printed after the +time: \%H \%T \%S \%B. Optionally, a minus or plus sign may be inserted between +the "%" and the "B". This operates as follows: + +\%-B causes am/pm text to be inserted into the descriptor only if using a 12 +hour clock and the am/pm symbol position has been set in the locale to ELocaleBefore. +Cannot be abbreviated using asterisk. + +\%+B causes am/pm text to be inserted into the descriptor only if using a 12 +hour clock and the am/pm symbol position has been set in the locale to ELocaleAfter. +Cannot be abbreviated using asterisk. For example, the following formatting +commands cause am/pm text to be printed after the time if the am/pm position +has been set in the locale to ELocaleAfter or before the time if ELocaleBefore: +\%-B \%H \%T \%S \%+B. + +\%J Interpret the argument as the hour component of the time in either 12 or +24 hour clock format depending on the locale's clock format setting. When +the clock format has been set to 12 hour, leading zeros are automatically +suppressed so that abbreviation has no effect. Abbreviation suppresses leading +zero only when using a 24 hour clock. + +Notes: + +The \%1, \%2, \%3, \%4 and \%5 formatting commands are used in conjunction with +\%D, \%M and \%Y to format the date locale-dependently. When formatting the date +locale-dependently, the order of the day, month and year components within +the string is determined by the order of the \%1 to \%5 formatting commands, +not that of \%D, \%M, \%Y. + +When formatting the date locale-independently (that is, \%F has been specified +in the format string), the \%1 to \%5 formatting commands are not required, +and should be omitted. In this case, the order of the date components is determined +by the order of the \%D, \%M, \%Y format commands within aFormat. + +Up to four date separators and up to four time separators can be used to separate +the components of a date or time. When formatting a numerical date consisting +of the day, month and year or a time containing hours, minutes and seconds, +all four separators should always be specified in the format command string. +Usually, the leading and trailing separators should not be displayed. In this +case, the first and fourth separators should still be specified, but should +be represented by a null character. + +The date format follows the pattern: + +DateSeparator[0] DateComponent1 DateSeparator[1] DateComponent2 DateSeparator[2] +DateComponent3 DateSeparator[3] + +where the ordering of date components is determined by the locale's date format +setting. + +The time format follows the pattern: + +TimeSeparator[0] Hours TimeSeparator[1] Minutes TimeSeparator[2] Seconds TimeSeparator[3] + +If the time includes a microseconds component, the third separator should +occur after the microseconds, and the seconds and microseconds should be separated +by the decimal separator. When formatting a two component time, the following +rules apply: + +if the time consists of hours and minutes, the third time delimiter should +be omitted + +if the time consists of minutes and seconds, the second time delimiter should +be omitted + +@param aDes Descriptor, which, on return contains the formatted date/time string. +@param aFormat Format string which determines the format of the date and time. + +@leave KErrOverflow The date/time string is too long for the descriptor aDes. +@leave KErrGeneral A formatting error has occurred. +*/ + { + TLocale local; + FormatL(aDes,aFormat,local); + } + +EXPORT_C void TTime::FormatL(TDes &aDes,const TDesC &aFormat,const TLocale &aLocale) const +// +// Fill aString with current Date and Time according to given aFormat string +// +/** +Puts this TTime into a descriptor and formats it according to the format string +specified in the second argument. + +Many of the formatting commands use the +system's locale settings for the date and time, for example the characters +used to separate components of the date and time and the ordering of day, +month and year. The list of formatting commands below is divided into two +sections, the first of which lists the commands which operate without reference +to the locale's date and time settings (see class TLocale) and the second +table lists the commands which do use these settings. + +The following formatting commands do not honour the locale-specific system +settings: + +\%\% : Include a single '%' character in the string + +\%* : Abbreviate following item (the following item should not be preceded +by a '%' character). + +\%C : Interpret the argument as the six digit microsecond component of the +time. In its abbreviated form, ('%*C') this should be followed by an integer +between zero and six, where the integer indicates the number of digits to display. + +\%D : Interpret the argument as the two digit day number in the month. Abbreviation +suppresses leading zero. + +\%E : Interpret the argument as the day name. Abbreviation is language-specific +(e.g. English uses the first three letters). + +\%F : Use this command for locale-independent ordering of date components. +This orders the following day/month/year component(s) (\%D, \%M, \%Y for example) +according to the order in which they are specified in the string. This removes +the need to use \%1 to \%5 (described below). + +\%H : Interpret the argument as the one or two digit hour component of the +time in 24 hour time format. Abbreviation suppresses leading zero. For locale-dependent +hour formatting, use \%J. + +\%I : Interpret the argument as the one or two digit hour component of the +time in 12 hour time format. The leading zero is automatically suppressed +so that abbreviation has no effect. For locale-dependent hour formatting, +use \%J. + +\%M : Interpret the argument as the one or two digit month number. Abbreviation +suppresses leading zero. + +\%N : Interpret the argument as the month name. Abbreviation is language specific, e.g. +English uses the first three letters only. When using locale-dependent formatting, +(that is, \%F has not previously been specified), specifying \%N causes any +subsequent occurrence of a month specifier in the string to insert the month +as text rather than in numeric form. When using locale-independent formatting, +specifying \%N causes the month to be inserted as text at that position, but +any subsequent occurrence of \%M will cause the month to be inserted in numeric +form. + +\%S : Interpret the argument as the one or two digit seconds component of the +time. Abbreviation suppresses leading zero. + +\%T : Interpret the argument as the one or two digit minutes component of the +time. Abbreviation suppresses leading zero. + +\%W : Interpret the argument as the one or two digit week number in year. Abbreviation +suppresses leading zero. + +\%X : Interpret the argument as the date suffix. Cannot be abbreviated. When +using locale-dependent formatting (that is, \%F has not previously been specified), +\%X causes all further occurrences of the day number to be displayed with the +date suffix. When using locale-independent formatting, a date suffix will +be inserted only after the occurrence of the day number which \%X follows in +the format string. Any further occurrence of \%D without a following \%X will +insert the day number without a suffix. + +\%Y : Interpret the argument as the four digit year number. Abbreviation suppresses +the first two digits. + +\%Z : Interpret the argument as the one, two or three digit day number in the +year. Abbreviation suppresses leading zeros. + +The following formatting commands do honour the locale-specific system settings: + +\%. : Interpret the argument as the decimal separator character (as set by +TLocale::SetDecimalSeparator()). The decimal separator is used to separate +seconds and microseconds, if present. + +\%: : Interpret the argument as one of the four time separator characters (as +set by TLocale::SetTimeSeparator()). Must be followed by an integer between +zero and three inclusive to indicate which time separator character is being +referred to. + +\%/ : Interpret the argument as one of the four date separator characters (as +set by TLocale::SetDateSeparator()). Must be followed by an integer between +zero and three inclusive to indicate which date separator character is being +referred to. + +\%1 : Interpret the argument as the first component of a three component date +(i.e. day, month or year) where the order has been set by TLocale::SetDateFormat(). +When the date format is EDateEuropean, this is the day, when EDateAmerican, +the month, and when EDateJapanese, the year. For more information on this +and the following four formatting commands, see the Notes section immediately +below. + +\%2 : Interpret the argument as the second component of a three component date +where the order has been set by TLocale::SetDateFormat(). When the date format +is EDateEuropean, this is the month, when EDateAmerican, the day and when +EDateJapanese, the month. + +\%3 : Interpret the argument as the third component of a three component date +where the order has been set by TLocale::SetDateFormat(). When the date format +is EDateEuropean, or EDateAmerican this is the year and when EDateJapanese, +the day. + +\%4 : Interpret the argument as the first component of a two component date +(day and month) where the order has been set by TLocale::SetDateFormat(). +When the date format is EDateEuropean this is the day, and when EDateAmerican +or EDateJapanese, the month. + +\%5 : Interpret the argument as the second component of a two component date +(day and month) where the order has been set by TLocale::SetDateFormat(). +When the date format is EDateEuropean this is the month, and when EDateAmerican +or EDateJapanese, the day. + +\%A : Interpret the argument as "am" or "pm" text according to the current +language and time of day. Unlike the \%B formatting command (described below), +\%A disregards the locale's 12 or 24 hour clock setting, so that when used +without an inserted + or - sign, am/pm text will always be displayed. Whether +a space is inserted between the am/pm text and the time depends on the locale-specific +settings. However, if abbreviated (\%*A), no space is inserted, regardless +of the locale's settings. The am/pm text appears before or after the time, +according to the position of the \%A, regardless of the locale-specific settings. +For example, the following ordering of formatting commands causes am/pm text +to be printed after the time: \%H \%T \%S \%A. Optionally, a minus or plus sign +may be inserted between the "%" and the "A". This operates as follows: + +\%-A causes am/pm text to be inserted into the descriptor only if the am/pm +symbol position has been set in the locale to ELocaleBefore. Cannot be abbreviated +using asterisk. + +\%+A causes am/pm text to be inserted into the descriptor only if the am/pm +symbol position has been set in the locale to ELocaleAfter. Cannot be abbreviated +using asterisk. For example, the following formatting commands will cause +am/pm text to be displayed after the time if the am/pm position has been set +in the locale to ELocaleAfter or before the time if ELocaleBefore: \%-A \%H +\%T \%S \%+A. + +\%B Interpret the argument as am or pm text according to the current language +and time of day. Unlike the \%A command, when using \%B, am/pm text is displayed +only if the clock setting in the locale is 12-hour. Whether a space is inserted +between the am/pm text and the time depends on the locale-specific settings. +However, if abbreviated (\%*B), no space is inserted, regardless of the locale's +settings. The am/pm text appears before or after the time, according to the +location of the "%B", regardless of the locale-specific settings. For example, +the following formatting commands cause am/pm text to be printed after the +time: \%H \%T \%S \%B. Optionally, a minus or plus sign may be inserted between +the "%" and the "B". This operates as follows: + +\%-B causes am/pm text to be inserted into the descriptor only if using a 12 +hour clock and the am/pm symbol position has been set in the locale to ELocaleBefore. +Cannot be abbreviated using asterisk. + +\%+B causes am/pm text to be inserted into the descriptor only if using a 12 +hour clock and the am/pm symbol position has been set in the locale to ELocaleAfter. +Cannot be abbreviated using asterisk. For example, the following formatting +commands cause am/pm text to be printed after the time if the am/pm position +has been set in the locale to ELocaleAfter or before the time if ELocaleBefore: +\%-B \%H \%T \%S \%+B. + +\%J Interpret the argument as the hour component of the time in either 12 or +24 hour clock format depending on the locale's clock format setting. When +the clock format has been set to 12 hour, leading zeros are automatically +suppressed so that abbreviation has no effect. Abbreviation suppresses leading +zero only when using a 24 hour clock. + +Notes: + +The \%1, \%2, \%3, \%4 and \%5 formatting commands are used in conjunction with +\%D, \%M and \%Y to format the date locale-dependently. When formatting the date +locale-dependently, the order of the day, month and year components within +the string is determined by the order of the \%1 to \%5 formatting commands, +not that of \%D, \%M, \%Y. + +When formatting the date locale-independently (that is, \%F has been specified +in the format string), the \%1 to \%5 formatting commands are not required, +and should be omitted. In this case, the order of the date components is determined +by the order of the \%D, \%M, \%Y format commands within aFormat. + +Up to four date separators and up to four time separators can be used to separate +the components of a date or time. When formatting a numerical date consisting +of the day, month and year or a time containing hours, minutes and seconds, +all four separators should always be specified in the format command string. +Usually, the leading and trailing separators should not be displayed. In this +case, the first and fourth separators should still be specified, but should +be represented by a null character. + +The date format follows the pattern: + +DateSeparator[0] DateComponent1 DateSeparator[1] DateComponent2 DateSeparator[2] +DateComponent3 DateSeparator[3] + +where the ordering of date components is determined by the locale's date format +setting. + +The time format follows the pattern: + +TimeSeparator[0] Hours TimeSeparator[1] Minutes TimeSeparator[2] Seconds TimeSeparator[3] + +If the time includes a microseconds component, the third separator should +occur after the microseconds, and the seconds and microseconds should be separated +by the decimal separator. When formatting a two component time, the following +rules apply: + +if the time consists of hours and minutes, the third time delimiter should +be omitted + +if the time consists of minutes and seconds, the second time delimiter should +be omitted + +@param aDes Descriptor, which, on return contains the formatted date/time string. +@param aFormat Format string which determines the format of the date and time. +@param aLocale Specific locale which formatting will be based on. + +@leave KErrOverflow The date/time string is too long for the descriptor aDes. +@leave KErrGeneral A formatting error has occurred. +*/ + { + + TDateTime dateTime=DateTime(); + aDes.Zero(); // ensure string is empty at start + + TLex aFmt(aFormat); + TBool fix=EFalse; // fixed date format + TBool da=EFalse; // day unabreviated + TBool ma=EFalse; // month unabreviated + TBool ya=EFalse; // year unabreviated + TBool suff=EFalse; // default no suffix + TBool mnam=EFalse; // default month as a number + TTimeOverflowLeave overflowLeave; + + while (!aFmt.Eos()) + { + TChar ch=aFmt.Get(); + TBool abb=EFalse; + const TInt NoPosSpecified=-1; + TInt pos=NoPosSpecified; + if (ch=='%') + ch=aFmt.Get(); + else // not formatting,just want to add some characters to string + goto doAppend; + if (ch=='*') // => abbreviate next field + { + abb=ETrue; + ch=aFmt.Get(); + } + else if (ch=='+' || ch=='-') // => leading or following Am/Pm + { + pos= ((ch=='+') ? ELocaleAfter : ELocaleBefore); + ch=aFmt.Get(); + if (ch!='A' && ch!='B') + User::Leave(KErrGeneral); + } + switch (ch) + { + case ':': // local time separator + { + if (aDes.Length()==aDes.MaxLength()) + User::Leave(KErrOverflow); + ch=aFmt.Get();//Which separator? + if (ch<'0' || ch>='0'+KMaxTimeSeparators) + User::Leave(KErrGeneral); + ch-='0'; + TChar separator=aLocale.TimeSeparator(ch); + if (separator!=0) + aDes.Append(separator); + } + break; + case '/': // local date separator + { + if (aDes.Length()==aDes.MaxLength()) + User::Leave(KErrOverflow); + ch=aFmt.Get();//Which separator? + if (ch<'0' || ch>='0'+KMaxDateSeparators) + User::Leave(KErrGeneral); + ch-='0'; + TChar separator=aLocale.DateSeparator(ch); + if (separator!=0) + aDes.Append(separator); + } + break; + case '.': // local decimal separator + { + if (aDes.Length()==aDes.MaxLength()) + User::Leave(KErrOverflow); + aDes.Append(aLocale.DecimalSeparator()); + } + break; + case '1': // 1st element of date,local order + switch (aLocale.DateFormat()) + { + case EDateAmerican: + goto doMonth; + case EDateJapanese: + goto doYear; + default: // European + goto doDay; + } + case '2': // 2nd element of date,local order + switch (aLocale.DateFormat()) + { + case EDateAmerican: + goto doDay; + default: // European and Japanese have month second + goto doMonth; + } + case '3': // 3rd element of date,local order + switch (aLocale.DateFormat()) + { + case EDateJapanese: + goto doDay; + default: // European and American have year last + goto doYear; + } + case '4': // 1st element of date (no year),local order + switch (aLocale.DateFormat()) + { + case EDateEuropean: + goto doDay; + default: + goto doMonth; + } + case '5': // 2nd element of date (no year),local order + switch (aLocale.DateFormat()) + { + case EDateEuropean: + goto doMonth; + default: + goto doDay; + } + case 'A': // am/pm text +doAmPm: + { + if (pos==NoPosSpecified || pos==aLocale.AmPmSymbolPosition()) + { + TBuf format(_S("%S")); + if (!abb && aLocale.AmPmSpaceBetween()) + { + if (aLocale.AmPmSymbolPosition()==ELocaleBefore) + format.Append(' '); + else + { + if (aDes.Length()==aDes.MaxLength()) + User::Leave(KErrOverflow); + aDes.Append(' '); + } + } + TAmPmName amPm((dateTime.Hour()<12) ? EAm : EPm); + aDes.AppendFormat(format,&overflowLeave,&amPm); + } + break; + } + case 'B': // am/pm text if local time format is 12 hour clock + if (aLocale.TimeFormat()==ETime24) + break; + else + goto doAmPm; + case 'C': + { + TBuf<6> digits; + digits.AppendFormat(_L("%06d"),dateTime.MicroSecond()); + TUint numChars=6; // Default length + if (abb) + { + ch=aFmt.Get(); + if (ch>='0' && ch<='6') + { + numChars=ch; + numChars-='0'; + } + } + if (aDes.Length()>(TInt)(aDes.MaxLength()-numChars)) + User::Leave(KErrOverflow); + aDes.Append(digits.Left(numChars)); + } + break; + case 'D': // day in date + if (abb) + da=ETrue; + if (!fix) + break; + else + { +doDay: + aDes.AppendFormat((da||abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Day()+1); + if (suff) +doSuffix: + { + TDateSuffix day(dateTime.Day()); + aDes.AppendFormat(_L("%S"),&overflowLeave,&day); + } + break; + } + case 'E': // Day name + { + TDay day=DayNoInWeek(); + if (abb) + { + TDayNameAbb nameAbb(day); + aDes.AppendFormat(_L("%S"),&overflowLeave,&nameAbb); + } + else + { + TDayName name(day); + aDes.AppendFormat(_L("%S"),&overflowLeave,&name); + } + break; + } + case 'F': // => user wants day,month,year order fixed + fix=ETrue; + break; + case 'H': // hour in 24 hour time format +do24: + aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Hour()); + break; + case 'I': // hour in 12 hour time format +do12: + { + TInt hour=dateTime.Hour(); + if (hour==0) + hour=12; + else if (hour>12) + hour-=12; + aDes.AppendFormat(_L("%d"),&overflowLeave,hour); + break; + } + case 'J': //default time format for hour + if (aLocale.TimeFormat()==ETime12) + goto do12; + else + goto do24; + case 'M': // month as a number (default value) + if (abb) + ma=ETrue; + if (fix) + goto doMonth; + break; + case 'N': // month as a name + mnam=ETrue; + if (abb) + ma=ETrue; + if (!fix) + break; + else + { +doMonth: + if (mnam) + { + TMonth month=dateTime.Month(); + if (ma || abb) + { + TMonthNameAbb nameAbb(month); + aDes.AppendFormat(_L("%S"),&overflowLeave,&nameAbb); + } + else + { + TMonthName name(month); + aDes.AppendFormat(_L("%S"),&overflowLeave,&name); + } + } + else + aDes.AppendFormat((ma||abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Month()+1); + break; + } + case 'S': // seconds + aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Second()); + break; + case 'T': // minutes + aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,dateTime.Minute()); + break; + case 'W': // week no in year + aDes.AppendFormat((abb) ? _L("%d"):_L("%02d"),&overflowLeave,WeekNoInYear()); + break; + case 'X': // => wants day suffix + if (fix) + goto doSuffix; + else + { + suff=ETrue; + break; + } + case 'Y': // year + if (abb) + ya=ETrue; + if (!fix) + break; + else + { +doYear: + if (ya || abb) + aDes.AppendFormat(_L("%02d"),&overflowLeave,((dateTime.Year())%100)); + else + aDes.AppendFormat(_L("%04d"),&overflowLeave,dateTime.Year()); + break; + } + case 'Z': // day no in year + aDes.AppendFormat((abb) ? _L("%d"):_L("%03d"),&overflowLeave,DayNoInYear()); + break; + default: +doAppend: + if (aDes.Length()==aDes.MaxLength()) + User::Leave(KErrOverflow); + aDes.Append(ch); + break; + } + } + } + + + + +EXPORT_C TTime Time::NullTTime() +/** +Gets a TTime with a null value. + +@return TTime object with a null value. +*/ + { + return UI64LIT(0x8000000000000000); + } + +EXPORT_C TTime Time::MaxTTime() +/** +Gets the maximum time value which can be held in a TTime object. + +@return The maximum TTime value. +*/ + { + return I64LIT(0x7fffffffffffffff); + } + +EXPORT_C TTime Time::MinTTime() +/** +Gets the minimum time value which can be held in a TTime object. + +@return The minimum TTime value. +*/ + { + return UI64LIT(0x8000000000000001); + } + +EXPORT_C TInt Time::DaysInMonth(TInt aYear,TMonth aMonth) +/** +Gets the number of days in a month. + +@param aYear The year. Must be specified because of leap years. +@param aMonth Month, from EJanuary to EDecember. + +@return The number of days in the month. +*/ + { + + __ASSERT_DEBUG(aMonth<=EDecember && aMonth>=EJanuary,::Panic(ETTimeValueOutOfRange)); + return(mTab[IsLeapYear(aYear)][aMonth]); + } + +EXPORT_C TBool Time::IsLeapYear(TInt aYear) +// +// up to and including 1600 leap years were every 4 years,since then leap years are every 4 years unless +// the year falls on a century which is not divisible by 4 (ie 1900 wasnt,2000 will be) +// for simplicity define year 0 as a leap year +// +/** +Tests whether a year is a leap year. + +@param aYear The year of interest. + +@return True if leap year, False if not. +*/ + { + + if (aYear>1600) + return(!(aYear%4) && (aYear%100 || !(aYear%400))); + return(!(aYear%4)); + } + +EXPORT_C TInt Time::LeapYearsUpTo(TInt aYear) +// +// from 0AD to present year according to the rule above +// +/** +Gets the number of leap years between 0 AD nominal Gregorian and the specified +year - inclusive. + +@param aYear The final year in the range to search. If negative, the function + will return a negative number of leap years. + +@return The number of leap years between 0 AD nominal Gregorian and aYear. +*/ + { + + if (aYear<=0) + return(aYear/4); + if (aYear<=1600) + return(1+((aYear-1)/4)); + TInt num=401; // 1600/4+1 + aYear-=1601; + TInt century=aYear/100; + num+=(aYear/4-century+century/4); + return(num); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_trp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_trp.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,155 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_trp.cpp +// +// + +#include "us_std.h" +#include "us_data.h" + + + + +EXPORT_C TTrapHandler::TTrapHandler() +/** +Default constructor. +*/ + {} + + +#ifndef __LEAVE_EQUALS_THROW__ + +EXPORT_C void TTrap::UnTrap() +// +// Pop the current trap frame +// + { + + TTrapHandler *pH=Exec::PopTrapFrame()->iHandler; + if (pH!=NULL) + pH->UnTrap(); + } + + +#else //__LEAVE_EQUALS_THROW__ + +EXPORT_C void User::Leave(TInt aReason) +/** +Leaves the currently executing function, unwinds the call stack, and returns +from the most recently entered trap harness. + +@param aReason The value returned from the most recent call to TRAP or TRAPD. + This is known as the reason code and, typically, it gives the + reason for the environment or user error causing this leave + to occur. + +@see TRAP +@see TRAPD +*/ + { +#ifdef __USERSIDE_THREAD_DATA__ +#ifndef __TOOLS2__ + Exec::LeaveStart(); +#endif + TTrapHandler* pH = GetTrapHandler(); +#else + TTrapHandler* pH = Exec::LeaveStart(); +#endif + if (pH) + pH->Leave(aReason); // causes things on the cleanup stack to be cleaned up + throw XLeaveException(aReason); + } + +#endif // !__LEAVE_EQUALS_THROW__ + + +// Private declaration to prevent def file branching +#ifndef __SUPPORT_CPP_EXCEPTIONS__ +class XLeaveException + { +public: + IMPORT_C TInt GetReason() const; + }; +#endif //__SUPPORT_CPP_EXCEPTIONS__ + +#if !defined(__LEAVE_EQUALS_THROW__) || !defined(__WINS__) +EXPORT_C TInt XLeaveException::GetReason() const + { +#ifdef __SUPPORT_CPP_EXCEPTIONS__ +#ifndef __TOOLS2__ + Exec::LeaveEnd(); +#endif + return iR; +#else // !__SUPPORT_CPP_EXCEPTIONS__ + return KErrNone; +#endif //__SUPPORT_CPP_EXCEPTIONS__ + } +#endif // !defined(__LEAVE_EQUALS_THROW__) || !defined(__WINS__) + +EXPORT_C void User::LeaveNoMemory() +/** +Leaves with the specific reason code KErrNoMemory. + +@see KErrNoMemory +*/ + { + + User::Leave(KErrNoMemory); + } + + + + +EXPORT_C TInt User::LeaveIfError(TInt aReason) +/** +Leaves or returns with a specified reason code. + +If the reason code is negative the function leaves, and the reason code is +returned through the trap harness. + +If the reason code is zero or positive, the function simply returns with the +reason value. + +@param aReason The reason code. + +@return If the function returns, the reason code which is either zero or positive. +*/ + { + + if (aReason<0) + User::Leave(aReason); + return(aReason); + } + + + + +EXPORT_C TAny * User::LeaveIfNull(TAny *aPtr) +/** +Leaves with the reason code KErrNoMemory, if the specified pointer is NULL. + +If the pointer is not NULL, the function simply returns with the value of +the pointer. + +@param aPtr The pointer to be tested. + +@return If the function returns, the value of aPtr. +*/ + { + + if (aPtr==NULL) + User::LeaveNoMemory(); + return(aPtr); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32/euser/us_utl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/euser/us_utl.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,77 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\euser\us_utl.cpp +// +// + +#include "us_std.h" + + +GLDEF_C void Panic(TCdtPanic aPanic) +// +// Panic the process with USER as the category. +// + { + + User::Panic(_L("USER"),aPanic); + } + +EXPORT_C void User::PanicUnexpectedLeave() + { + ::Panic(EUnexpectedLeave); + } + +EXPORT_C TFormatInfo::TFormatInfo() +// +// Constructor +// + :iFormatIsCurrent(FALSE),i512ByteSectorsFormatted(0),iMaxBytesPerFormat(0) + {} + +#if defined(_UNICODE) +void TestOverflowTruncate::Overflow(TDes16 &/*aDes*/) + { + + return; + } +#else +void TestOverflowTruncate::Overflow(TDes8 &/*aDes*/) + { + + return; + } +#endif + +EXPORT_C void PanicTFixedArray() + { + Panic(EBadFixedArrayIndex); + } + + +// GCC support for X86 +/*#if defined(__GCC32__) && defined(__X86__) +extern "C" +{ +EXPORT_C int __cxa_pure_virtual() +// +// Gets called for any unreplaced pure virtual methods. +// + { + Panic(EPureVirtualCalled); + return 0; + } + + +} +#endif*/ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/collate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/collate.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,364 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\collate.h +// Definitions needed for Unicode collation. +// Collation is the comparison of two Unicode strings to produce an ordering +// that may be used in a dictionary or other list. +// Collation is implemented using the Standard Unicode Collation algorithm. There +// are four levels of comparison: +// primary: basic character identity +// secondary: accents and diacritics +// tertiary: upper and lower case, and other minor attributes +// quaternary: Unicode character value +// Punctuation is normally ignored but can optionally be taken into account. +// Strings are fully expanded using the standard Unicode canonical expansions before +// they are compared. Thai and Lao vowels are swapped with the following character +// if any. +// EUSER contains the 'basic collation method'. This method assigns the standard Unicode collation key values +// to the characters in the WGL4 repertoire, plus commonly used control characters and fixed-width spaces, plus +// the CJK ideograms (for which the keys can be generated algorithmically). Other characters are collated after +// all the characters for which keys are defined, and ordered by their Unicode values. +// Locales can supply any number of other collation methods. They will usually supply a 'tailoring' of the standard +// method. This is done by using the standard table as the main key table (signalled by placing NULL in +// TCollationMethod::iMainTable) and specifying an override table (TCollationMethod::iOverrideTable). +// Locale-specific collation data resides in ELOCL. +// +// + +#ifndef __COLLATE_H__ +#define __COLLATE_H__ + +#ifdef __KERNEL_MODE__ +#include +#else +#include +#endif + +//This material is used in the Unicode build only. +#ifdef _UNICODE + +/** +Collation key table structure. +@publishedPartner +@released +*/ +struct TCollationKeyTable + { +public: + /** + Masks for the various parts of the elements of the iKey array. + */ + enum + { + ELevel0Mask = 0xFFFF0000, // primary key - basic character identity + ELevel1Mask = 0x0000FF00, // secondary key - accents and diacritics + ELevel2Mask = 0x000000FC, // tertiary key - case, etc. + EIgnoreFlag = 0x2, // if set, this key is normally ignored + EStopFlag = 0x1 // if set, this key is the last in a sequence representing a Unicode value or values + }; + + /** + An array containing all of the keys and strings of keys concatenated + together. Each key has EStopFlag set only if it is the last key in its + string. Eack key contains the keys for levels 0, 1 and 2, and a flag + EIgnoreFlag if the key is usually ignored (for punctuation & spaces + etc.). + */ + const TUint32* iKey; + /** + An array of indices into the iKey array. Each element has its high 16 + bits indicating a Unicode value and its low 16 bits indicating an index + into the iKey array at which its key starts. The elements are sorted by + Unicode value. + */ + const TUint32* iIndex; + /** + The size of the iIndex array. + */ + TInt iIndices; + /** + Concatenated Unicode strings. Each is a strings that is to be converted + to keys differently from how it would be if each letter were converted + independently. An example is "ch" in Spanish, which sorts as though it + were a single letter. Each Unicode string is preceeded by a 16-bit value + indicating the string's length. The end of the string is not delimited. + */ + const TUint16* iString; + /** + An array of elements mapping elements of iString to elements of iIndex. + Each element has its high 16 bits indicating the index of the start of + an element of iString, and its low 16 bits indicating the corresponding + element in iIndex. This array is sorted on the string index. + */ + const TUint32* iStringIndex; + /** + The size of the iStringIndex array. + */ + TInt iStringIndices; + }; + +/** +Defines a collation method. + +Collation means sorting pieces of text. It needs to take into account characters, +accents and case; spaces and punctuation are usually ignored. It differs from +ordinary methods of sorting in that it is locale-dependent - different +languages use different ordering methods. Additionally, multiple collation +methods may exist within the same locale. + +A collation method provides the collation keys and other data needed to customise +collation; the Mem and TDesC16 collation functions (e.g. Mem::CompareC()) +perform the collation. Note that these functions use the standard collation +method for the current locale - you only need to specify an object of class +TCollationMethod to customise this collation scheme. Collation methods can +be retrieved using member functions of the Mem class. Each one has a unique +identifier. + +A collation method specifies a main table of collation keys, and optionally +an overriding table that contains keys for which the values in the main table +are overridden. A collation key table (TCollationKeyTable) is the set of collation +keys: primary (basic character identity), secondary (accents and diacritics) +and tertiary (case). The quaternary key is the Unicode character values themselves. + +The simplest way to customise a collation method is to create a local copy +of the standard collation method and change it. For example, you could use +the standard method, but not ignore punctuation and spaces: + +@code +TCollationMethod m = *Mem::CollationMethodByIndex(0); // get the standard method +m.iFlags |= TCollationMethod::EIgnoreNone; // dont ignore punctuation and spaces +@endcode + +@publishedPartner +@released +*/ +struct TCollationMethod + { + public: + /** + The UID of this collation method. + */ + TUint iId; + + /** + The main collation key table; if NULL, use the standard table. + */ + const TCollationKeyTable* iMainTable; + + /** + If non-NULL, tailoring for collation keys. + */ + const TCollationKeyTable* iOverrideTable; + enum + { + /** + Don't ignore any keys (punctuation, etc. is normally ignored). + */ + EIgnoreNone = 1, + + /** + Reverse the normal order for characters differing only in case + */ + ESwapCase = 2, + + /** + Compare secondary keys which represent accents in reverse + order (from right to left); this is needed for French when comparing + words that differ only in accents. + */ + EAccentsBackwards = 4, + + /** + Reverse the normal order for characters differing only in whether they + are katakana or hiragana. + */ + ESwapKana = 8, + + /** + Fold all characters to lower case before extracting keys; needed for + comparison of filenames, for which case is ignored but other + tertiary (level-2) distinctions are not. + */ + EFoldCase = 16, + + /** Flag to indicate a collation method for matching purpose + This flag is only needed if we wish to specify a particular collation method + to be used for matching purpose. + */ + EMatchingTable = 32, + + /** Ignore the check for adjacent combining characters. A combining + character effectively changes the character it combines with to something + else and so a match doesn't occur. Setting this flag will allow character + matching regardless of any combining characters. + */ + EIgnoreCombining = 64 + }; + + /** + Flags. + + @see TCollationMethod::EIgnoreNone + @see TCollationMethod::ESwapCase + @see TCollationMethod::EAccentsBackwards + @see TCollationMethod::ESwapKana + @see TCollationMethod::EFoldCase + */ + TUint iFlags; + }; + +/** +A collation data set provides any collation methods needed by a locale. +@publishedPartner +@released +*/ +struct TCollationDataSet + { + public: + const TCollationMethod* iMethod; + TInt iMethods; + }; + +// Collation method IDs + +/** +A collation data set provides any collation methods needed by a locale. +@internalTechnology +@released +*/ +const TUint KUidBasicCollationMethod = 0x10004F4E; + +/** +A collation data set provides any collation methods needed by a locale. +@internalTechnology +@released +*/ +const TUint KUidStandardUnicodeCollationMethod = 0x10004E96; + +#ifndef __KERNEL_MODE__ + +//Forward declarations +class TUTF32Iterator; +struct LCharSet; + +/** +Provides low-level collation functions. +@internalComponent +@released +*/ +class TCollate + { +public: + /** + Construct a TCollate object based on the collation method specified + within aCharSet, if any. If there is none, or aCharSet is null, the + standard collation method will be used. aMask and aFlags provide a + method for overriding the flags in the collation method: Each flag set + to 1 in aMask is a flag that will be overridden and set to the + corresponding flag value in aFlags. Ownership of aCharSet is not passed. + */ + TCollate(const LCharSet* aCharSet,TUint aMask = 0,TUint aFlags = 0xFFFFFFFF); + /** + Construct a TCollate object based on an already constructed + TCollationMethod specified in aMethod. Ownership is not passed. + */ + TCollate(const TCollationMethod& aMethod); + + enum TComparisonResult + { + ELeftComparesLessAndIsNotPrefix = -2, + ELeftIsPrefixOfRight = -1, + EStringsIdentical = 0, + ERightIsPrefixOfLeft = 1, + ERightComparesLessAndIsNotPrefix = 2 + }; + + /** + Compare the string beginning at aString1 of length aLength1 against the + string beginning at aString2 of length aLength2. + aMaxLevel determines the tightness of the collation. At level 0, only + character identities are distinguished. At level 1 accents are + distinguished as well. At level 2 case is distinguishes as well. At + level 3 all valid different Unicode characters are considered different. + */ + TComparisonResult Compare(const TUint16* aString1,TInt aLength1, + const TUint16* aString2,TInt aLength2, + TInt aMaxLevel = 3) const; + /** + Find the string beginning at aString2 of length aLength2 in the string + beginning at aString1 of length aLength1. aMaxLevel determines + the tightness of the collation, see Compare for details. + */ + TInt Find(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2, + TInt aMaxLevel,TUint aString2WildChar = 0) const; + + TInt Find(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2, + TInt &aLengthFound,TInt aMaxLevel,TUint aString2WildChar = 0) const; + + /** + Test if the string beginning at aSearchTerm of length aSearchTermLength + matches the string beginning at aCandidate of length aCandidateLength. + aMaxLevel determines the tightness of the collation, see + Compare for details. The search term may have wild card characters as + specified by aWildChar (for matching a single grapheme- i.e. character + and any characters that combine with it, such as accents) and + aWildSequenceChar (for matching any sequence of whole graphemes). The + return value is KErrNotFound iff the search term does not match the + candidate string exactly. To find a match within the candidate string, + the search term must begin and end with a wild sequence character. If + the search term does match the candidate string, 0 will be returned, + unless the first character of the search term is a wild sequence + character in which case the value returned will be the index into + aCandidate at which the first non-wild sequence character matched. + aWildSequenceChar must be a valid (non-surrogate) Unicode character + below FFFE. + */ + TInt Match(const TUint16 *aCandidate, TInt aCandidateLength, + const TUint16 *aSearchTerm,TInt aSearchTermLength, + TInt aMaxLevel, TUint aWildChar = '?', TUint aWildSequenceChar = '*', TUint aEscapeChar = 0) const; + +private: + /** + Compare values output from the iterators. After the comparison, if + ERightIsPrefixOfLeft or EStringsIdentical is returned, then aLeft and + aRight will be pointing at the next key (at MaxLevel) after the match. + If right is shown to be a prefix of left, this means that it has been + checked at all requested levels. If it is reported that the right is a + prefix of the left, then this will mean also that there are no unmatched + combining characters on the left. + */ + TComparisonResult CompareKeySequences(TUTF32Iterator& aLeft, TUTF32Iterator& aRight, + TInt aMaxLevel, TInt aRightStringWildChar, TInt aEscapeChar) const; + /** + Finds search term inside candidate string. Returns KErrNotFound if there + is no match, returns the offset into the candidate string at which the + search term was found (note that this is the offset from the start of + the iteration, not from where the iteration was when the function was + called). If a string was found, the search term iterator is left + pointing at the end of the search term, and the candidate iterator is + left pointing just after the matched keys. aMatchPos returns where in + the candidate string the match was found. + */ + TInt FindKeySequence(TUTF32Iterator& aCandidate, TUTF32Iterator& aSearchTerm, + TInt aMaxLevel, TInt aWildChar, TInt aEscapeChar, TInt& aLengthFound) const; + +private: + TCollationMethod iMethod; + }; + +#endif // __KERNEL_MODE__ + +#endif // _UNICODE + +#endif // __COLLATE_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/cpudefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/cpudefs.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,599 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\cpudefs.h +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef __CPUDEFS_H__ +#define __CPUDEFS_H__ + +#ifdef __ARMCC__ +#define __ARM_ASSEMBLER_ISA__ 4 // "Instruction not supported on targeted CPU :(" +#else +#define __ARM_ASSEMBLER_ISA__ 4 +#endif + +// Should really have been __CPU_CORTEX_A8__ instead of __CPU_CORTEX_A8N__ +#ifdef __CPU_CORTEX_A8N__ +#undef __CPU_CORTEX_A8__ +#define __CPU_CORTEX_A8__ +#endif + +// +// Supported CPUs +// + +#ifdef __MARM__ + +// FIXME: Nasty hack to get ARM SMP going +#if defined(__SMP__) && !defined(__CPU_ARMV7) +#undef __CPU_ARM11MP__ +#define __CPU_ARM11MP__ +#endif + +#if defined(__CPU_ARM710T__) + #define __CPU_ARMV4T + +#elif defined(__CPU_ARM720T__) + #define __CPU_ARMV4T + +#elif defined(__CPU_SA1__) + #define __CPU_ARMV4 + +#elif defined(__CPU_ARM920T__) + #define __CPU_ARMV4T + +#elif defined(__CPU_ARM925T__) + #define __CPU_ARMV4T + +#elif defined(__CPU_XSCALE__) + #define __CPU_ARMV5T + #define __ENHANCED_DSP_INSTRUCTIONS + +#elif defined(__CPU_ARM926J__) + #define __CPU_ARMV5T + #define __ENHANCED_DSP_INSTRUCTIONS + #define __CPU_HAS_JAZELLE + +#elif defined(__CPU_ARM1136__) + #define __CPU_ARMV6 + +#elif defined(__CPU_ARM1176__) + #define __CPU_ARMV6 + +#elif defined(__CPU_ARM11MP__) + #define __CPU_ARMV6 + #define __CPU_ARM_HAS_WFI + #define __CPU_ARM_HAS_WFE_SEV + +#elif defined(__CPU_CORTEX_A8__) + #define __CPU_ARMV7 + +#elif defined(__CPU_CORTEX_A9__) + #define __CPU_ARMV7 + +#elif defined(__CPU_GENERIC_ARM4__) + #define __CPU_ARMV4 + +#else + // #error Unsupported CPU + #define __CPU_UNKNOWN +#endif + +#endif // __MARM__ + + + +// Macros for emitting single bytes of machine code +#ifdef __CW32__ +# define BYTE(x) _asm byte x +#elif __GCC32__ +# define BYTE(x) asm(".byte "#x); +#else +# define BYTE(x) _asm _emit x +#endif + + +// thiscall is different on GCC +#ifdef __GCC32__ +#define THISCALL_PROLOG0() asm("mov ecx,[esp+4]"); +#define THISCALL_PROLOG1() asm("mov ecx,[esp+4] \n mov eax,[esp+8] \n mov [esp+4],eax"); +#define THISCALL_PROLOG2() asm("mov ecx,[esp+4] \n mov eax,[esp+8] \n mov [esp+4],eax \n mov eax,[esp+12] \n mov [esp+8],eax"); +#define THISCALL_PROLOG3() asm("mov ecx,[esp+4] \n mov eax,[esp+8] \n mov [esp+4],eax \n mov eax,[esp+12] \n mov [esp+8],eax \n mov eax,[esp+16] \n mov [esp+12],eax"); +#define THISCALL_PROLOG0_BIGRETVAL() asm("mov ecx,[esp+8]"); +#define THISCALL_PROLOG1_BIGRETVAL() asm("mov ecx,[esp+8] \n mov eax,[esp+12] \n mov [esp+8],eax"); +#define THISCALL_EPILOG0() asm("ret"); +#define THISCALL_EPILOG1() asm("ret"); +#define THISCALL_EPILOG2() asm("ret"); +#define THISCALL_EPILOG3() asm("ret"); +#define THISCALL_EPILOG0_BIGRETVAL() asm("ret 4"); +#define THISCALL_EPILOG1_BIGRETVAL() asm("ret 4"); +#else +#define THISCALL_PROLOG0() +#define THISCALL_PROLOG1() +#define THISCALL_PROLOG2() +#define THISCALL_PROLOG3() +#define THISCALL_PROLOG0_BIGRETVAL() +#define THISCALL_PROLOG1_BIGRETVAL() +#define THISCALL_EPILOG0() __asm ret +#define THISCALL_EPILOG1() __asm ret 4 +#define THISCALL_EPILOG2() __asm ret 8 +#define THISCALL_EPILOG3() __asm ret 12 +#define THISCALL_EPILOG0_BIGRETVAL() __asm ret 4 +#define THISCALL_EPILOG1_BIGRETVAL() __asm ret 8 +#endif + + +// Workaround for MSVC++ 5.0 bug; MSVC incorrectly fixes up conditional jumps +// when the destination is a C++ function. +#if defined(__VC32__) && (_MSC_VER==1100) // untested on MSVC++ > 5.0 +# define _ASM_j(cond,dest) _asm jn##cond short $+11 _asm jmp dest +# define _ASM_jn(cond,dest) _asm j##cond short $+11 _asm jmp dest +#else +# if defined __GCC32__ +# define _ASM_j(cond,dest) asm("j"#cond " %a0": : "i"(dest)); +# define _ASM_jn(cond,dest) asm("jn"#cond " %a0": :"i"(dest)); +# else +# define _ASM_j(cond,dest) _asm j##cond dest +# define _ASM_jn(cond,dest) _asm jn##cond dest +# endif +#endif + + + +//#define __MINIMUM_MACHINE_CODE__ + +#if defined(__WINS__) +#define __NAKED__ __declspec( naked ) +#ifndef __MINIMUM_MACHINE_CODE__ +//#define __MEM_MACHINE_CODED__ +#endif +#define __CPU_X86 +#endif + +#if defined(__X86__) +# ifdef __GCC32__ +# define __NAKED__ // GCC does not support naked functions on X86 +# else +# define __NAKED__ __declspec( naked ) +# endif +# ifndef __MINIMUM_MACHINE_CODE__ +# define __MEM_MACHINE_CODED__ +# endif +# define __CPU_X86 +#endif + + +#if defined(__MARM__) +#ifndef __NAKED__ // should be defined in prefix file + #ifndef __GCCXML__ + #define __NAKED__ __declspec( naked ) + #else + #define __NAKED__ + #endif +#endif +#ifndef __CIA__ +#undef __NAKED__ +#define __NAKED__ ____ONLY_USE_NAKED_IN_CIA____ +#endif + #define __CPU_ARM + +#if defined(__MARM_ARMV5__) && !defined(__CPU_ARMV5T) +#define __CPU_ARMV5T +#endif + +#ifndef __MINIMUM_MACHINE_CODE__ +#if !defined(__BIG_ENDIAN__) + #define __MEM_MACHINE_CODED__ + #define __DES_MACHINE_CODED__ + #define __REGIONS_MACHINE_CODED__ + #define __DES8_MACHINE_CODED__ + #define __DES16_MACHINE_CODED__ + #define __HEAP_MACHINE_CODED__ + #define __REALS_MACHINE_CODED__ + #define __COBJECT_MACHINE_CODED__ + #define __CACTIVESCHEDULER_MACHINE_CODED__ + #define __CSERVER_MACHINE_CODED__ + #define __ARRAY_MACHINE_CODED__ + #define __HUFFMAN_MACHINE_CODED__ +#if defined(__MARM_ARM4__) || defined(__MARM_ARMI__) || defined(__MARM_THUMB__) || defined(__MARM_ARMV4__) || defined(__MARM_ARMV5__) + #define __DES16_MACHINE_CODED_HWORD__ +#endif +#endif +#endif +#endif + +#ifdef __CPU_ARMV4 + #define __CPU_64BIT_MULTIPLY +#endif +#ifdef __CPU_ARMV4T + #define __CPU_THUMB + #define __CPU_ARM_SUPPORTS_BX + #define __CPU_64BIT_MULTIPLY +#endif +#ifdef __CPU_ARMV5T + #define __CPU_THUMB + #define __CPU_ARM_SUPPORTS_BX + #define __CPU_ARM_SUPPORTS_BLX + #define __CPU_64BIT_MULTIPLY + #define __CPU_ARM_LDR_PC_SETS_TBIT + #define __CPU_ARM_HAS_CLZ + #define __CPU_ARM_HAS_PLD +#endif +#ifdef __ENHANCED_DSP_INSTRUCTIONS + #define __CPU_ARM_HAS_MCRR + #define __CPU_ARM_HAS_LDRD_STRD +#endif +#if defined(__CPU_ARMV6) || defined(__CPU_ARMV7) + #define __CPU_THUMB + #define __CPU_ARM_SUPPORTS_BX + #define __CPU_ARM_SUPPORTS_BLX + #define __CPU_64BIT_MULTIPLY + #define __CPU_ARM_LDR_PC_SETS_TBIT + #define __CPU_ARM_HAS_CLZ + #define __CPU_ARM_HAS_MCRR + #define __CPU_ARM_HAS_LDREX_STREX + #define __CPU_ARM_HAS_LDRD_STRD + #define __CPU_ARM_HAS_PLD + #define __CPU_ARM_HAS_CPS + #define __CPU_ARM_HAS_SPLIT_FSR +#if !defined(__CPU_ARM1136__) && !defined(__CPU_ARM11MP__) + #define __CPU_ARM_HAS_CP15_IFAR +#endif + #define __CPU_ARM_SUPPORTS_USER_MODE_BARRIERS +#endif +#if defined(__CPU_ARMV7) || (defined(__CPU_ARM1136__) && defined(__CPU_ARM1136_IS_R1__)) || defined(__CPU_ARM1176__) || defined(__CPU_ARM11MP__) + #define __CPU_ARM_HAS_LDREX_STREX_V6K + #define __CPU_HAS_CP15_THREAD_ID_REG +#endif +#if defined(__MARM_ARM4T__) || defined(__MARM_INTERWORK__) + #define __SUPPORT_THUMB_INTERWORKING +#endif +#if defined(__CPU_ARMV7) +#define __CPU_ARM_HAS_WFI +#define __CPU_ARM_HAS_WFE_SEV +#define __CPU_THUMB2 +#define __CPU_SUPPORT_THUMB2EE +#endif + + +// ARM CPU macros to allow Thumb/Non-thumb builds +#ifdef __CPU_ARM + +#define EXC_TRAP_CTX_SZ 10 // Nonvolatile registers + sp + pc + +#ifdef __SUPPORT_THUMB_INTERWORKING +#define __JUMP(cc,r) asm("bx"#cc " "#r ) +#ifdef __CPU_ARM_LDR_PC_SETS_TBIT +#define __POPRET(rlist) asm("ldmfd sp!, {"rlist"pc} ") +#define __CPOPRET(cc,rlist) asm("ldm"#cc "fd sp!, {"rlist"pc} ") +#else +#define __POPRET(rlist) asm("ldmfd sp!, {"rlist"lr} ");\ + asm("bx lr ") +#define __CPOPRET(cc,rlist) asm("ldm"#cc "fd sp!, {"rlist"lr} ");\ + asm("bx"#cc " lr ") +#endif +#else +#define __JUMP(cc,r) asm("mov"#cc " pc, "#r ) +#define __POPRET(rlist) asm("ldmfd sp!, {"rlist"pc} ") +#define __CPOPRET(cc,rlist) asm("ldm"#cc "fd sp!, {"rlist"pc} ") +#endif + +#ifdef __CPU_ARM_SUPPORTS_BLX +#if __ARM_ASSEMBLER_ISA__ >= 5 +#define BLX(Rm) asm("blx r" #Rm) +#else +#define BLX(Rm) asm(".word %a0" : : "i" ((TInt)( 0xe12fff30 | (Rm) ))) +#endif +#define __JUMPL(Rm) BLX(Rm) +#else +#ifdef __SUPPORT_THUMB_INTERWORKING +#define __JUMPL(Rm) asm("mov lr, pc "); \ + asm("bx r"#Rm ) +#else +#define __JUMPL(Rm) asm("mov lr, pc "); \ + asm("mov pc, r"#Rm ) +#endif +#endif + +#ifdef __MARM_THUMB__ +#ifndef __ARMCC__ +#define __SWITCH_TO_ARM asm("push {r0} ");\ + asm("add r0, pc, #4 ");\ + asm("bx r0 ");\ + asm("nop ");\ + asm(".align 2 ");\ + asm(".code 32 ");\ + asm("ldr r0, [sp], #4 ") +#define __END_ARM asm(".code 16 ") +#else +#define __SWITCH_TO_ARM asm(".code 32 "); +#define __END_ARM +#endif +#else +#define __SWITCH_TO_ARM +#define __END_ARM +#endif + +#define CC_EQ 0 +#define CC_NE 1 +#define CC_CS 2 +#define CC_CC 3 +#define CC_MI 4 +#define CC_PL 5 +#define CC_VS 6 +#define CC_VC 7 +#define CC_HI 8 +#define CC_LS 9 +#define CC_GE 10 +#define CC_LT 11 +#define CC_GT 12 +#define CC_LE 13 +#define CC_AL 14 + +#ifdef __CPU_ARM_HAS_CLZ +#if __ARM_ASSEMBLER_ISA__ >= 5 +#define CLZ(Rd,Rm) asm("clz r" #Rd ", r" #Rm) +#else +#define CLZ(Rd,Rm) asm(".word %a0" : : "i" ((TInt)0xe16f0f10|((Rd)<<12)|(Rm))); +#endif +#define CLZcc(cc,Rd,Rm) asm(".word %a0" : : "i" ((TInt)0x016f0f10|((cc)<<28)|((Rd)<<12)|(Rm))); +#endif +#ifdef __CPU_ARM_HAS_MCRR +#define MCRR(cop,opc,Rd,Rn,CRm) asm(".word %a0" : : "i" ((TInt)0xec400000|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm))); +#define MCRRcc(cc,cop,opc,Rd,Rn,CRm) asm(".word %a0" : : "i" ((TInt)0x0c400000|((cc)<<28)|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm))); +#define MRRC(cop,opc,Rd,Rn,CRm) asm(".word %a0" : : "i" ((TInt)0xec500000|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm))); +#define MRRCcc(cc,cop,opc,Rd,Rn,CRm) asm(".word %a0" : : "i" ((TInt)0x0c500000|((cc)<<28)|((Rn)<<16)|((Rd)<<12)|((cop)<<8)|((opc)<<4)|(CRm))); +#endif +#ifdef __CPU_ARM_HAS_LDREX_STREX +// LDREX Rd, [Rn] - load from [Rn] into Rd exclusive +// STREX Rd, Rm, [Rn] - store Rm into [Rn] with exclusive access; success/fail indicator into Rd +#define LDREXcc(cc,Rd,Rn) asm(".word %a0" : : "i" ((TInt)(0x01900f9f|((cc)<<28)|((Rd)<<12)|((Rn)<<16)))); +#define STREXcc(cc,Rd,Rm,Rn) asm(".word %a0" : : "i" ((TInt)(0x01800f90|((cc)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16)))); +#if __ARM_ASSEMBLER_ISA__ >= 6 +#define LDREX(Rd,Rn) asm("ldrex r" #Rd ", [r" #Rn "] ") +#define STREX(Rd,Rm,Rn) asm("strex r" #Rd ", r" #Rm ", [r" #Rn "] ") +#else +#define LDREX(Rd,Rn) asm(".word %a0" : : "i" ((TInt)(0x01900f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16)))); +#define STREX(Rd,Rm,Rn) asm(".word %a0" : : "i" ((TInt)(0x01800f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16)))); +#endif +#endif +#ifdef __CPU_ARM_HAS_LDREX_STREX_V6K +// Byte, halfword, doubleword STREX/LDREX & unconditional CLREX +#if __ARM_ASSEMBLER_ISA__ >= 6 +#define LDREXB(Rd,Rn) asm("ldrexb r" #Rd ", [r" #Rn "] ") +#define STREXB(Rd,Rm,Rn) asm("strexb r" #Rd ", r" #Rm ", [r" #Rn "] ") +#define LDREXH(Rd,Rn) asm("ldrexh r" #Rd ", [r" #Rn "] ") +#define STREXH(Rd,Rm,Rn) asm("strexh r" #Rd ", r" #Rm ", [r" #Rn "] ") +#define LDREXD(Rd,Rn) asm("ldrexd r" #Rd ", [r" #Rn "] ") +#define STREXD(Rd,Rm,Rn) asm("strexd r" #Rd ", r" #Rm ", [r" #Rn "] ") +#else +#define LDREXB(Rd,Rn) asm(".word %a0" : : "i" ((TInt)(0x01D00f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16)))); +#define STREXB(Rd,Rm,Rn) asm(".word %a0" : : "i" ((TInt)(0x01C00f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16)))); +#define LDREXH(Rd,Rn) asm(".word %a0" : : "i" ((TInt)(0x01f00f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16)))); +#define STREXH(Rd,Rm,Rn) asm(".word %a0" : : "i" ((TInt)(0x01e00f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16)))); +#define LDREXD(Rd,Rn) asm(".word %a0" : : "i" ((TInt)(0x01b00f9f|((CC_AL)<<28)|((Rd)<<12)|((Rn)<<16)))); +#define STREXD(Rd,Rm,Rn) asm(".word %a0" : : "i" ((TInt)(0x01a00f90|((CC_AL)<<28)|((Rd)<<12)|(Rm)|((Rn)<<16)))); +#endif +#if !defined(__CPU_ARM1136__) || defined(__CPU_ARM1136_ERRATUM_406973_FIXED) +#define __CPU_ARM_HAS_WORKING_CLREX +#if __ARM_ASSEMBLER_ISA__ >= 6 +#define CLREX asm("clrex ") +#else +#define CLREX asm(".word %a0" : : "i" ((TInt)(0xf57ff01f))); +#endif +#endif +#endif +#ifdef __CPU_ARM_HAS_LDRD_STRD +#if __ARM_ASSEMBLER_ISA__ >= 5 +#define LDRD(Rd,Rn) asm("ldrd r" #Rd ", [r" #Rn "] ") +#define STRD(Rd,Rn) asm("strd r" #Rd ", [r" #Rn "] ") +#else +#define LDRD(Rd,Rn) asm(".word %a0" : : "i" ((TInt)( 0xe1c000d0 | ((Rn)<<16) | ((Rd)<<12) ))) +#define STRD(Rd,Rn) asm(".word %a0" : : "i" ((TInt)( 0xe1c000f0 | ((Rn)<<16) | ((Rd)<<12) ))) +#endif +#define LDRD_ioff(Rd,Rn,off) asm(".word %a0" : : "i" ((TInt)( 0xe1c000d0 | ((Rn)<<16) | ((Rd)<<12) | (((off)&0xf0)<<4) | ((off)&0x0f) ))) +#define STRD_ioff(Rd,Rn,off) asm(".word %a0" : : "i" ((TInt)( 0xe1c000f0 | ((Rn)<<16) | ((Rd)<<12) | (((off)&0xf0)<<4) | ((off)&0x0f) ))) +#endif +#if defined(__CPU_ARM_HAS_PLD) && !defined(__CPU_ARM926J__) && !defined(__CPU_UNKNOWN) // PLD is a no-op on ARM926 +#if __ARM_ASSEMBLER_ISA__ >= 5 +#define PLD(Rn) asm("pld [r" #Rn "] ") +#else +#define PLD(Rn) asm(".word %a0" : : "i" ((TInt)( 0xf5d0f000 | ((Rn)<<16) ))) +#endif +#define PLD_ioff(Rn, off) asm(".word %a0" : : "i" ((TInt)( 0xf5d0f000 | ((Rn)<<16) | (off) ))) // preload with immediate offset +#define PLD_noff(Rn, off) asm(".word %a0" : : "i" ((TInt)( 0xf550f000 | ((Rn)<<16) | (off) ))) // preload with negative offset +#else +#define PLD(Rn) +#define PLD_ioff(Rn, off) +#define PLD_noff(Rn, off) +#endif +#ifdef __CPU_HAS_CP15_THREAD_ID_REG +#define GET_RWRW_TID(cc,r) asm("mrc"#cc" p15, 0, "#r", c13, c0, 2 "); +#define GET_RWRO_TID(cc,r) asm("mrc"#cc" p15, 0, "#r", c13, c0, 3 "); +#define GET_RWNO_TID(cc,r) asm("mrc"#cc" p15, 0, "#r", c13, c0, 4 "); +#define SET_RWRW_TID(cc,r) asm("mcr"#cc" p15, 0, "#r", c13, c0, 2 "); +#define SET_RWRO_TID(cc,r) asm("mcr"#cc" p15, 0, "#r", c13, c0, 3 "); +#define SET_RWNO_TID(cc,r) asm("mcr"#cc" p15, 0, "#r", c13, c0, 4 "); +#endif + +#ifdef __CPU_SUPPORT_THUMB2EE +#define GET_THUMB2EE_HNDLR_BASE(cc,r) asm("mrc"#cc" p14, 6, "#r", c1, c0, 0 ") +#define SET_THUMB2EE_HNDLR_BASE(cc,r) asm("mcr"#cc" p14, 6, "#r", c1, c0, 0 ") +#endif + +#if defined(__CPU_ARMV7) +#define ARM_DMB_gen(opt) asm(".word %a0" : : "i" ((TInt)(0xf57ff050 | (opt) )) ) +#define ARM_DSB_gen(opt) asm(".word %a0" : : "i" ((TInt)(0xf57ff040 | (opt) )) ) +#define ARM_ISB_gen(opt) asm(".word %a0" : : "i" ((TInt)(0xf57ff060 | (opt) )) ) + +#define ARM_DMBSY ARM_DMB_gen(0xf) // full system DMB +#define ARM_DSBSY ARM_DSB_gen(0xf) // full system DSB +#define ARM_DMBST ARM_DMB_gen(0xe) // full system DMB, orders writes only +#define ARM_DSBST ARM_DSB_gen(0xe) // full system DSB, orders writes only +#define ARM_DMBSH ARM_DMB_gen(0xb) // DMB encompassing inner-shareable domain +#define ARM_DSBSH ARM_DSB_gen(0xb) // DMB encompassing inner-shareable domain +#define ARM_DMBSHST ARM_DMB_gen(0xa) // DMB encompassing inner-shareable domain, orders writes only +#define ARM_DSBSHST ARM_DSB_gen(0xa) // DMB encompassing inner-shareable domain, orders writes only + +#define ARM_ISBSY ARM_ISB_gen(0xf) // full system ISB + +#define ARM_NOP asm(".word 0xe320f000 ") +#define ARM_YIELD asm(".word 0xe320f001 ") + +#define __DATA_MEMORY_BARRIER__(reg) ARM_DMBSH +#define __DATA_MEMORY_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_DMBSH +#define __DATA_SYNC_BARRIER__(reg) ARM_DSBSH +#define __DATA_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_DSBSH +#define __INST_SYNC_BARRIER__(reg) ARM_ISBSY +#define __INST_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_ISBSY + +#elif defined(__CPU_ARM11MP__) + +#define ARM_DMB(reg) asm("mcr p15, 0, "#reg", c7, c10, 5 ") +#define ARM_DSB(reg) asm("mcr p15, 0, "#reg", c7, c10, 4 ") +#define ARM_ISB(reg) asm("mcr p15, 0, "#reg", c7, c5, 4 ") + +#define ARM_NOP asm(".word 0xe320f000 ") +#define ARM_YIELD asm(".word 0xe320f001 ") + +#define __DATA_MEMORY_BARRIER__(reg) ARM_DMB(reg) +#define __DATA_MEMORY_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_DMB(reg) +#define __DATA_SYNC_BARRIER__(reg) ARM_DSB(reg) +#define __DATA_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_DSB(reg) +#define __INST_SYNC_BARRIER__(reg) ARM_ISB(reg) +#define __INST_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_ISB(reg) + +#elif defined(__CPU_ARMV6__) + +#define ARM_DMB(reg) asm("mcr p15, 0, "#reg", c7, c10, 5 ") +#define ARM_DSB(reg) asm("mcr p15, 0, "#reg", c7, c10, 4 ") +#define ARM_ISB(reg) asm("mcr p15, 0, "#reg", c7, c5, 4 ") + +#define __DATA_MEMORY_BARRIER__(reg) ARM_DMB(reg) +#define __DATA_MEMORY_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_DMB(reg) +#define __DATA_SYNC_BARRIER__(reg) ARM_DSB(reg) +#define __DATA_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_DSB(reg) +#define __INST_SYNC_BARRIER__(reg) ARM_ISB(reg) +#define __INST_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0"); ARM_ISB(reg) + +#else + +#define __DATA_MEMORY_BARRIER__(reg) +#define __DATA_MEMORY_BARRIER_Z__(reg) asm("mov "#reg", #0") +#define __DATA_SYNC_BARRIER__(reg) asm("mcr p15, 0, "#reg", c7, c10, 4 ") +#define __DATA_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0"); asm("mcr p15, 0, "#reg", c7, c10, 4 ") +#define __INST_SYNC_BARRIER__(reg) +#define __INST_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0") + +#endif + +#ifdef __SMP__ +#define __SMP_DATA_MEMORY_BARRIER__(reg) __DATA_MEMORY_BARRIER__(reg) +#define __SMP_DATA_MEMORY_BARRIER_Z__(reg) __DATA_MEMORY_BARRIER_Z__(reg) +#define __SMP_DATA_SYNC_BARRIER__(reg) __DATA_SYNC_BARRIER__(reg) +#define __SMP_DATA_SYNC_BARRIER_Z__(reg) __DATA_SYNC_BARRIER_Z__(reg) +#define __SMP_INST_SYNC_BARRIER__(reg) __INST_SYNC_BARRIER__(reg) +#define __SMP_INST_SYNC_BARRIER_Z__(reg) __INST_SYNC_BARRIER_Z__(reg) +#else +#define __SMP_DATA_MEMORY_BARRIER__(reg) +#define __SMP_DATA_MEMORY_BARRIER_Z__(reg) asm("mov "#reg", #0") +#define __SMP_DATA_SYNC_BARRIER__(reg) +#define __SMP_DATA_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0") +#define __SMP_INST_SYNC_BARRIER__(reg) +#define __SMP_INST_SYNC_BARRIER_Z__(reg) asm("mov "#reg", #0") +#endif + +#ifdef __CPU_ARM_HAS_WFI +#define ARM_WFIcc(cc) asm(".word %a0" : : "i" ((TInt)(0x0320f003 | ((cc)<<28) )) ) +#define ARM_WFI ARM_WFIcc(CC_AL) +#endif + +#ifdef __CPU_ARM_HAS_WFE_SEV +#define ARM_WFEcc(cc) asm(".word %a0" : : "i" ((TInt)(0x0320f002 | ((cc)<<28) )) ) +#if __ARM_ASSEMBLER_ISA__ >= 6 +#define ARM_WFE asm("wfe ") +#else +#define ARM_WFE ARM_WFEcc(CC_AL) +#endif +#define ARM_SEVcc(cc) asm(".word %a0" : : "i" ((TInt)(0x0320f004 | ((cc)<<28) )) ) +#if __ARM_ASSEMBLER_ISA__ >= 6 +#define ARM_SEV asm("sev ") +#else +#define ARM_SEV ARM_SEVcc(CC_AL) +#endif +#endif + +#ifndef ARM_NOP +#define ARM_NOP asm("nop ") +#define ARM_YIELD asm("nop ") +#endif + +// Support for throwing exceptions through ARM embedded assembler +// Should only be needed user side +#ifndef __EH_FRAME_ADDRESS +#define __EH_FRAME_ADDRESS(reg,offset) +#define __EH_FRAME_PUSH2(reg1,reg2) +#define __EH_FRAME_SAVE1(reg,offset) +#endif + +// StrongARM msr bug workaround: +// (conditional msr might cause,that the next instruction is executed twice by these processors) +#ifdef __CPU_SA1__ +#define __MSR_CPSR_C(cc,r) \ + asm("msr"#cc" cpsr_c," #r); \ + ARM_NOP; +#else // !__CPU_SA1__ +#define __MSR_CPSR_C(cc,r) asm("msr"#cc" cpsr_c,"#r); +#endif + +// Causes undefined instruction exception on both ARM and THUMB +#define __ASM_CRASH() asm(".word 0xe7ffdeff ") +#if defined(__GNUC__) +#define __crash() asm(".word 0xe7ffdeff " : : : "memory") +#elif defined(__ARMCC__) +// RVCT doesn't let us inline an undefined instruction +// use a CDP to CP15 instead - doesn't work on THUMB but never mind +#define __crash() asm("cdp p15, 0, c0, c0, c0, 0 ") +#endif + +#if !defined(__CPU_ARM_HAS_LDREX_STREX_V6K) +#if defined(__CPU_ARM_HAS_LDREX_STREX) +#define __ATOMIC64_USE_SLOW_EXEC__ +#else +#define __ATOMIC64_USE_FAST_EXEC__ +#define __ATOMIC_USE_FAST_EXEC__ +#endif +#endif + +#endif // __CPU_ARM + +#ifdef __CPU_X86 +#define EXC_TRAP_CTX_SZ 10 // ebx, esp, ebp, esi, edi, ds, es, fs, gs, eip + +// Causes exception +#if defined(__VC32__) || defined(__CW32__) +#define __crash() do { _asm int 0ffh } while(0) +#else +#define __crash() asm("int 0xff " : : : "memory") +#endif + +#endif // __CPU_X86 + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/d32locd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/d32locd.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,604 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\d32locd.h +// +// + +#ifndef __D32LOCD_H__ +#define __D32LOCD_H__ +#include +#include + + +/** +@publishedPartner +@released + +Local media IDs. + +A media ID is passed to LocDrv::RegisterMediaDevice() when registering +a media driver with the local media subsystem. +*/ +enum TMediaDevice { EFixedMedia0, EFixedMedia1, EFixedMedia2, EFixedMedia3, + EFixedMedia4, EFixedMedia5, EFixedMedia6, EFixedMedia7, + ERemovableMedia0, ERemovableMedia1, ERemovableMedia2, ERemovableMedia3, + EInvalidMedia + }; + +#define __IS_REMOVABLE(aDevice) (aDevice>=ERemovableMedia0 && aDevice<=ERemovableMedia3) +#define __IS_FIXED(aDevice) ((TUint)aDevice<=EFixedMedia7) +#define MEDIA_DEVICE_IRAM EFixedMedia0 +#define MEDIA_DEVICE_LFFS EFixedMedia1 +#define MEDIA_DEVICE_NAND EFixedMedia2 +#define MEDIA_DEVICE_MMC ERemovableMedia0 +#define MEDIA_DEVICE_PCCARD ERemovableMedia1 +#define MEDIA_DEVICE_CSA ERemovableMedia2 + +typedef signed int TSocket; + +class TLDriveAssignInfo +/** +No longer used +@internalComponent +@removed +*/ + { +public: + TMediaDevice iDevice; + TInt iPriority; + }; + +class TMediaDeviceAssignInfo +/** +No longer used +@internalComponent +@removed +*/ + { +public: + TInt iFirstMedia; + TInt iLastMedia; + }; + +class TLocalDriveCaps +/** +Drives media capabilities fields + +@publishedPartner +@released +*/ + { +public: + IMPORT_C TLocalDriveCaps(); +public: + /** + Size of drive + + Note : This is the size of the partition, not the entire media. + The entire media size can be obtained from TLocalDriveCapsV4::MediaSizeInBytes() + */ + TInt64 iSize; + /** + Media Type of drive + */ + TMediaType iType; + /** + Indicates state of battery if supported + */ + TBatteryState iBattery; + /** + Attributes of the drive + */ + TUint iDriveAtt; + /** + Attributes of underlying media + */ + TUint iMediaAtt; + /** + Base address of media + */ + TUint8* iBaseAddress; + /** + Identity of the file system used for this media + */ + TUint16 iFileSystemId; + /** + Partition type of media + */ + TUint16 iPartitionType; + }; +typedef TPckgBuf TLocalDriveCapsBuf; +// +class TLocalDriveCapsV2 : public TLocalDriveCaps +/** +Extension to Capabilities fields mainly to support Nor flash + +@publishedPartner +@released +*/ + { +public: + /** + Number of hidden sectors on drive + */ + TUint iHiddenSectors; + /** + Size of erase unit on media + */ + TUint iEraseBlockSize; + }; +typedef TPckgBuf TLocalDriveCapsV2Buf; +// + + + +/** +Format specification for removable media + +@publishedPartner +@released +*/ +class TLDFormatInfo + { +public: + inline TLDFormatInfo(); +public: + + TInt64 iCapacity; ///< Format Capacity + TUint16 iSectorsPerCluster; ///< Specified sectors per cluster + TUint16 iSectorsPerTrack; ///< Specified sectors per track + TUint16 iNumberOfSides; ///< Specified number of sides + + enum TFATBits {EFBDontCare, EFB12 = 12, EFB16 = 16, EFB32 = 32}; + TFATBits iFATBits; ///< Specified bits per fat table entry + + TUint16 iReservedSectors; ///< Reserved sector count, required for SD card compliance + + // Flags field. Allows the number of FAT tables to be specified: set both bits to zero to use the default. + enum TFlags {EOneFatTable = 0x01, ETwoFatTables = 0x02}; + TUint8 iFlags; + + TUint8 iPad; ///< Padding for offset alignment between kernel and user code + + }; +typedef TPckgBuf TSpecialFormatInfoBuf; + + +// +class TLocalDriveCapsV3 : public TLocalDriveCapsV2 +/** +Extension to Capabilities fields mainly to support removable media format specifications + +@publishedPartner +@released +*/ + { +public: + /** + Format specification + */ + TLDFormatInfo iFormatInfo; + /** + Set if iFormatInfo is valid + */ + TBool iExtraInfo; + /** + */ + TInt iMaxBytesPerFormat; + }; +//The following ASSERTs checks for offset of any TInt64 member be a multiple of 8 as per DEF045510 +__ASSERT_COMPILE(_FOFF(TLocalDriveCaps,iSize)%8 == 0); +__ASSERT_COMPILE(_FOFF(TLocalDriveCapsV3,iFormatInfo.iCapacity) % 8 == 0); + + +typedef TPckgBuf TLocalDriveCapsV3Buf; +// +class TLocalDriveCapsV4 : public TLocalDriveCapsV3 +/** +Extension to Capabilities fields mainly to support Nand flash + +@publishedPartner +@released +*/ + { +public: + union + { + /** + Number of blocks (for NAND flash) + - The entire capacity of NAND media can be calculated using: + capacity = iNumOfBlocks * iNumPagesPerBlock * iNumBytesMain + */ + TInt iNumOfBlocks; + /** + Number of sectors (for other types of media) + - The entire capacity of sector based media can be calculated using: + capacity = iNumberOfSectors * iSectorSizeInBytes + */ + TUint32 iNumberOfSectors; + }; + + /** + Number of pages per block + */ + TInt iNumPagesPerBlock; + + union + { + /** + Number of Bytes in the main array (for NAND flash) + - The entire capacity of NAND media can be calculated using: + capacity = iNumOfBlocks * iNumPagesPerBlock * iNumBytesMain + */ + TInt iNumBytesMain; + /** + Number of Bytes in a sector (for other types of media) + - The entire capacity of sector based media can be calculated using: + capacity = iNumberOfSectors * iSectorSizeInBytes + */ + TUint32 iSectorSizeInBytes; + }; + + /** + Number of Bytes in the spare array + */ + TInt iNumBytesSpare; + /** + Effective usable blocks + */ + TInt iEffectiveBlks; + /** + Start page of drive + */ + TInt iStartPage; +public: + inline TInt64 MediaSizeInBytes(); + }; +typedef TPckgBuf TLocalDriveCapsV4Buf; +// +#define KMaxSerialNumLength 64 +typedef TBuf8 TMediaSerialNumber; +class TLocalDriveCapsV5 : public TLocalDriveCapsV4 +/** +Add serial number support for certain media. + +@publishedPartner +@released +*/ + { +public: + /** + Serial number buffer length, 0 if not supported + */ + TUint iSerialNumLength; + /** + Serial number buffer + */ + TUint8 iSerialNum[KMaxSerialNumLength]; + }; +typedef TPckgBuf TLocalDriveCapsV5Buf; + +// +/** +Extension to Capabilities fields mainly to support reporting block size +information of underlying media. + +@publishedPartner +@released +*/ +class TLocalDriveCapsV6 : public TLocalDriveCapsV5 + { +public: + /** + Block size information of underlying media is required to assist in chosing + efficient size of buffers for reading and writing. + This information can also be accessed through the function + - RFs::VolumeIOParam + + These functions retrieve this blocksize information by calling the media + driver's Caps() function. + */ + TUint iBlockSize; + +private: + /** + Reserved space for future use. + */ + TUint32 iSpare[4]; + }; +typedef TPckgBuf TLocalDriveCapsV6Buf; + + +class TLocalDriveCapsV7 : public TLocalDriveCapsV6 +/** +Add control mode, object mode, partition size for M18 NOR Flash. +*/ + { +public: + TUint32 iWriteBufferSize; + TUint32 iPartitionSize; + TUint32 iControlModeSize; + TUint32 iObjectModeSize; + }; + +typedef TPckgBuf TLocalDriveCapsV7Buf; + +// +class TFormatInfo +/** +Format information class + +@publishedPartner +@released +*/ + { +public: + IMPORT_C TFormatInfo(); +public: + TBool iFormatIsCurrent; + TInt i512ByteSectorsFormatted; + TInt iMaxBytesPerFormat; + }; +// +class TErrorInfo +/** +@internalTechnology + */ + { +public: + enum TReasonCode + { + ENoError=0, //No error + EBadSector=1, //Error due to corrupt sector + }; +public: + TReasonCode iReasonCode; + union + { + // holds position error occurred for KErrCorrupt + // It numerically equals number of bytes succesfully read/written during + // last disk operation. + TInt64 iErrorPos; + TInt iOtherInfo; + }; + }; +typedef TPckgBuf TErrorInfoBuf; +// +class TLocalDriveMessageData +/** +@internalTechnology +*/ + { +public: + inline TLocalDriveMessageData() + {} + inline TLocalDriveMessageData(TInt64 aPos, TInt aLength, const TAny* aPtr, TInt aHandle, TInt anOffset, TInt aFlags) + : iPos(aPos), iLength(aLength), iPtr(aPtr), iHandle(aHandle), iOffset(anOffset), iFlags(aFlags) + {} +public: + TInt64 iPos; + TInt iLength; + const TAny* iPtr; + TInt iHandle; + TInt iOffset; + TInt iFlags; + }; + +class TLocalDriveControlIOData +/** +Control IO data class + +@internalTechnology +*/ + { +public: + inline TLocalDriveControlIOData() + {} + inline TLocalDriveControlIOData(TInt aCommand, TAny* aParam1, TAny* aParam2, TInt aHandle) + : iCommand(aCommand), iParam1(aParam1), iParam2(aParam2), iHandle(aHandle) + {} +public: + TInt iCommand; + TAny* iParam1; + TAny* iParam2; + TInt iHandle; + }; + +class TLocalDrivePasswordData +/** +Password store for password protected media + +@internalTechnology +*/ + { +public: + TLocalDrivePasswordData(const TDesC8& aOldPasswd, const TDesC8& aNewPasswd, TBool aStorePasswd) + : iOldPasswd(&aOldPasswd), iNewPasswd(&aNewPasswd), iStorePasswd(aStorePasswd) + {} + TLocalDrivePasswordData() + : iOldPasswd(&KNullDesC8), iNewPasswd(&KNullDesC8), iStorePasswd(EFalse) + {} +public: + const TDesC8 *iOldPasswd; + const TDesC8 *iNewPasswd; + TBool iStorePasswd; + }; +typedef TPckgBuf TLocalDrivePasswordDataPckg; + + +class TPasswordStore +/** +@internalTechnology +*/ + { +public: + virtual TInt Init()=0; + virtual TInt ReadPasswordData(TDes8 &aBuf)=0; + virtual TInt WritePasswordData(TDesC8 &aBuf)=0; + virtual TInt PasswordStoreLengthInBytes()=0; + enum {EMaxPasswordLength=1024}; /**< Size of the password store write buffer, which may contain multiple password mappings */ + }; + +class TMountInfoData +/** +@internalTechnology +*/ + { +public: + TDesC8* iInfo; + TAny* iThread; + }; + + +const TInt KLocalDriveMajorVersion=1; +const TInt KLocalDriveMinorVersion=0; +const TInt KLocalDriveBuildVersion=160; +_LIT(KLitLocalDriveLddName,"LocDrv"); + +const TInt KLocalMessageHandle=-1; + + +enum TMediaPagingStats + { + EMediaPagingStatsRomAndCode, + EMediaPagingStatsRom, + EMediaPagingStatsCode + }; + + +class RLocalDrive : public RBusLogicalChannel +/** +Interface class to local media + +@internalTechnology +*/ + { +public: + enum TControl + { + EControlRead=0, /**< Read request */ + EControlWrite=1, /**< Write request */ + EControlCaps=2, /**< Caps request */ + EControlFormat=3, /**< Format request */ + EControlEnlarge=4, /**< Enlarge drive request */ + EControlReduce=5, /**< Reduce Drive request */ + EControlForceMediaChange=6, /**< Force media change request */ + EControlMediaDevice=7, /**< Return the media device request */ + EControlPasswordLock=8, /**< Password lock media request */ + EControlPasswordUnlock=9, /**< Password unlock media request */ + EControlPasswordClear=10, /**< Password clear request */ + EControlNotifyChange=11, /**< Notify change request */ + EControlNotifyChangeCancel=12, /**< Notify change cancel request */ + EControlReadPasswordStore=13, /**< Read password request */ + EControlWritePasswordStore=14, /**< Write password request */ + EControlPasswordStoreLengthInBytes=15, /**< Password request */ + EControlIsRemovable=16, /**< Query removable request */ + EControlSetMountInfo=17, /**< Set mount info request */ + EControlControlIO=18, /**< Control IO request */ + EControlPasswordErase=19, /**< Password erase media request */ + EControlDeleteNotify=20, /**< Delete notification */ + EControlGetLastErrorInfo=21, /**< Get last error info request */ + }; + + enum TRemountFlags + { + ELocDrvRemountNotifyChange = 0, /**< Notify clients of media change but don't remount */ + ELocDrvRemountForceMediaChange = 1, /**< Notify clients of media change and remount */ + }; + + enum TReadWriteFlags + { + ELocDrvMetaData = 0x80000000, /**< Set if read/write request is for metadata */ + ELocDrvWholeMedia = 0x40000000 /**< Set to access whole media, rather than partition */ + }; + +public: + inline TVersion VersionRequired() const; + inline TInt Connect(TInt aDriveNumber, TBool& aChangedFlag); + inline TInt Enlarge(TInt aLength); + inline TInt Reduce(TInt aPos, TInt aLength); + inline TInt Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt aOffset, TInt aFlags); + inline TInt Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt anOffset); + inline TInt Read(TInt64 aPos, TInt aLength, TDes8& aTrg); + inline TInt Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt aOffset, TInt aFlags); + inline TInt Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt anOffset); + inline TInt Write(TInt64 aPos, const TDesC8& aSrc); + inline TInt Caps(TDes8& anInfo); + inline TInt Format(TInt64 aPos, TInt aLength); + inline TInt ForceMediaChange(TInt aMode=0); + inline void NotifyChange(TRequestStatus* aStatus); + inline void NotifyChangeCancel(); + inline TInt SetMountInfo(const TDesC8* aInfo,TInt aMessageHandle); + inline TMediaDevice MediaDevice(); + inline TInt IsRemovable(TInt& aSocketNum); + inline TInt ControlIO(TInt aCommand, TAny* aParam1, TAny* aParam2); + inline TInt Unlock(const TDesC8& aPassword, TBool aStorePassword); + inline TInt SetPassword(const TDesC8& aOldPassword, const TDesC8& aNewPassword, TBool aStorePassword); + inline TInt Clear(const TDesC8& aPassword); + inline TInt ErasePassword(); + inline TInt ReadPasswordData(TDesC8& aStoreData); + inline TInt WritePasswordData(const TDesC8& aStoreData); + inline TInt PasswordStoreLengthInBytes(); + inline TInt DeleteNotify(TInt64 aPos, TInt aLength); + inline TInt GetLastErrorInfo(TDesC8& aErrorInfo); + }; +// +#ifndef __KERNEL_MODE__ +class TBusLocalDrive : public RLocalDrive +/** +@internalTechnology +*/ + { +public: + IMPORT_C TBusLocalDrive(); + IMPORT_C TInt Connect(TInt aDriveNumber, TBool& aChangedFlag); + IMPORT_C void Disconnect(); + IMPORT_C TInt Enlarge(TInt aLength); + IMPORT_C TInt ReduceSize(TInt aPos, TInt aLength); + IMPORT_C TInt Read(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt aMessageHandle,TInt aOffset,TInt aFlags); + IMPORT_C TInt Read(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt aMessageHandle,TInt anOffset); + IMPORT_C TInt Read(TInt64 aPos,TInt aLength,TDes8& aTrg); + IMPORT_C TInt Write(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt aMessageHandle,TInt aOffset,TInt aFlags); + IMPORT_C TInt Write(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt aMessageHandle,TInt anOffset); + IMPORT_C TInt Write(TInt64 aPos,const TDesC8& aSrc); + IMPORT_C TInt Caps(TDes8& anInfo); + IMPORT_C TInt Format(TFormatInfo& anInfo); + IMPORT_C TInt Format(TInt64 aPos,TInt aLength); + IMPORT_C TInt SetMountInfo(const TDesC8* aMountInfo,TInt aMessageHandle); + IMPORT_C TInt ForceRemount(TUint aFlags=0); + IMPORT_C TInt ControlIO(TInt aCommand, TAny* aParam1, TAny* aParam2); + + IMPORT_C TInt Unlock(const TDesC8& aPassword, TBool aStorePassword); + IMPORT_C TInt SetPassword(const TDesC8& aOldPassword, const TDesC8& aNewPassword, TBool aStorePassword); + IMPORT_C TInt Clear(const TDesC8& aPassword); + IMPORT_C TInt ErasePassword(); + IMPORT_C TInt ReadPasswordData(TDes8 &aBuf); + IMPORT_C TInt WritePasswordData(const TDesC8 &aBuf); + IMPORT_C TInt PasswordStoreLengthInBytes(); + IMPORT_C TInt DeleteNotify(TInt64 aPos, TInt aLength); + IMPORT_C TInt GetLastErrorInfo(TDes8& aErrorInfo); +public: + inline TInt& Status() {return(iStatus);} +private: + TInt CheckMount(); +private: + TInt iStatus; + }; +#endif + +#define _LOCKABLE_MEDIA + +#include +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/d32locd.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/d32locd.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,104 @@ +// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\d32locd.inl +// +// + +// class RLocalDrive +inline TVersion RLocalDrive::VersionRequired() const + { return TVersion(KLocalDriveMajorVersion,KLocalDriveMinorVersion,KLocalDriveBuildVersion); } +/** +@capability TCB +*/ +inline TInt RLocalDrive::Connect(TInt aDriveNumber, TBool& aChangedFlag) + { return DoCreate(KLitLocalDriveLddName,VersionRequired(),aDriveNumber,NULL,(const TDesC8*)&aChangedFlag,EOwnerProcess); } +inline TInt RLocalDrive::Enlarge(TInt aLength) + { return DoControl(EControlEnlarge, (TAny*)aLength); } +inline TInt RLocalDrive::Reduce(TInt aPos, TInt aLength) + { return DoControl(EControlReduce, (TAny*)aPos, (TAny*)aLength); } +inline TInt RLocalDrive::Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt aOffset, TInt aFlags) + { TLocalDriveMessageData d(aPos,aLength,aTrg,aMessageHandle,aOffset,aFlags); return DoControl(EControlRead, &d); } +inline TInt RLocalDrive::Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aMessageHandle, TInt anOffset) + { TLocalDriveMessageData d(aPos,aLength,aTrg,aMessageHandle,anOffset,0); return DoControl(EControlRead, &d); } +inline TInt RLocalDrive::Read(TInt64 aPos, TInt aLength, TDes8& aTrg) + { TLocalDriveMessageData d(aPos,aLength,&aTrg,KLocalMessageHandle,0,ELocDrvMetaData); return DoControl(EControlRead, &d); } +inline TInt RLocalDrive::Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt aOffset, TInt aFlags) + { TLocalDriveMessageData d(aPos,aLength,aSrc,aMessageHandle,aOffset,aFlags); return DoControl(EControlWrite, &d); } +inline TInt RLocalDrive::Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aMessageHandle, TInt anOffset) + { TLocalDriveMessageData d(aPos,aLength,aSrc,aMessageHandle,anOffset,0); return DoControl(EControlWrite, &d); } +inline TInt RLocalDrive::Write(TInt64 aPos, const TDesC8& aSrc) + { TLocalDriveMessageData d(aPos,aSrc.Length(),&aSrc,KLocalMessageHandle,0,ELocDrvMetaData); return DoControl(EControlWrite, &d); } +inline TInt RLocalDrive::Caps(TDes8& anInfo) + { return DoControl(EControlCaps, &anInfo); } +inline TInt RLocalDrive::Format(TInt64 aPos, TInt aLength) + { TLocalDriveMessageData d(aPos,aLength,NULL,KLocalMessageHandle,0,0); return DoControl(EControlFormat, &d); } +inline TInt RLocalDrive::ForceMediaChange(TInt aMode) + { return DoControl(EControlForceMediaChange, (TAny*)aMode); } +inline void RLocalDrive::NotifyChange(TRequestStatus* aStatus) + { *aStatus=KRequestPending; DoControl(EControlNotifyChange, aStatus); } +inline void RLocalDrive::NotifyChangeCancel() + { DoControl(EControlNotifyChangeCancel); } +inline TMediaDevice RLocalDrive::MediaDevice() + { return (TMediaDevice)DoControl(EControlMediaDevice); } +inline TInt RLocalDrive::SetMountInfo(const TDesC8* aInfo,TInt aMessageHandle) + { TLocalDriveMessageData d(0,0,aInfo,aMessageHandle,0,0); return DoControl(EControlSetMountInfo, &d); } +inline TInt RLocalDrive::IsRemovable(TInt& aSocketNum) + { return DoControl(EControlIsRemovable,&aSocketNum); } +inline TInt RLocalDrive::ControlIO(TInt aCommand, TAny* aParam1, TAny* aParam2) + { TLocalDriveControlIOData d(aCommand,aParam1,aParam2,KLocalMessageHandle); return DoControl(EControlControlIO,&d); } + + +// RLocalDrive Password Control (Set/Lock/Unlock) +inline TInt RLocalDrive::Unlock(const TDesC8& aPassword, TBool aStorePassword) + { TLocalDrivePasswordData d((TDesC8&)aPassword, (TDesC8&)aPassword, aStorePassword); return DoControl(EControlPasswordUnlock, &d); } +inline TInt RLocalDrive::SetPassword(const TDesC8& aOldPassword, const TDesC8& aNewPassword, TBool aStorePassword) + { TLocalDrivePasswordData d((TDesC8&)aOldPassword, (TDesC8&)aNewPassword, aStorePassword); return DoControl(EControlPasswordLock, &d); } +inline TInt RLocalDrive::Clear(const TDesC8& aPassword) + { TLocalDrivePasswordData d((TDesC8&)aPassword, (TDesC8&)aPassword, EFalse); return DoControl(EControlPasswordClear, &d); } +inline TInt RLocalDrive::ErasePassword() + { return DoControl(EControlPasswordErase); } + +// RLocalDrive Password Store Control (Read/Write/Length) +inline TInt RLocalDrive::ReadPasswordData(TDesC8& aStoreData) + { return DoControl(EControlReadPasswordStore, (TDesC8*)&aStoreData); } +inline TInt RLocalDrive::WritePasswordData(const TDesC8& aStoreData) + { return DoControl(EControlWritePasswordStore, (TDesC8*)&aStoreData); } +inline TInt RLocalDrive::PasswordStoreLengthInBytes() + { TInt length=0; return DoControl(EControlPasswordStoreLengthInBytes, (TAny*)&length)==KErrNone?length:0; } + +inline TInt RLocalDrive::DeleteNotify(TInt64 aPos, TInt aLength) + { TLocalDriveMessageData d(aPos,aLength,0,KLocalMessageHandle,0,0); return DoControl(EControlDeleteNotify, &d); } + +// Get Last Error Info +inline TInt RLocalDrive::GetLastErrorInfo(TDesC8& aErrorInfo) + { return DoControl(EControlGetLastErrorInfo, (TDesC8*)&aErrorInfo); } + + +inline TLDFormatInfo::TLDFormatInfo() + :iCapacity(0),iSectorsPerCluster(0),iSectorsPerTrack(0),iNumberOfSides(0),iFATBits(EFBDontCare), + iReservedSectors(0), iFlags(0), iPad(0) + { + } + +inline TInt64 TLocalDriveCapsV4::MediaSizeInBytes() + { + // + // Return the actual size of the media (as opposed to the partition size) + // + // Note : We calculate including iNumPagesPerBlock to maintain compatibility with NAND flash + // where iNumberOfSectors == iNumOfBlocks and iSectorSizeInBytes == iNumBytesMain. + // The local media subsystem sets a default value of iNumPagesPerBlock == 1. + // + return(TInt64(iNumberOfSectors) * iSectorSizeInBytes * iNumPagesPerBlock); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32base.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32base.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,3220 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32base.h +// +// + +#ifndef __E32BASE_H__ +#define __E32BASE_H__ +#include + +/** + * Container Base Class + */ +class CBase +/** +@publishedAll +@released + +Base class for all classes to be instantiated on the heap. + +By convention, all classes derived from CBase have a name beginning with the +letter 'C'. + +The class has two important features: + +1. A virtual destructor that allows instances of derived classes to be destroyed + and properly cleaned up through a CBase* pointer. All CBase derived objects + can be pushed, as CBase* pointers, onto the cleanup stack, and destroyed through + a call to CleanupStack::PopAndDestroy(). + +2. Initialisation of the CBase derived object to binary zeroes through a specific + CBase::operator new() - this means that members, whose initial value should + be zero, do not have to be initialised in the constructor. This allows safe + destruction of a partially-constructed object. + +Note that using C++ arrays of CBase-derived types is not recommended, as objects +in the array will not be zero-initialised (as there is no operator new[] member). +You should use an array class such as RPointerArray instead for arrays of +CBase-derived types. + +@see CleanupStack +*/ + { +public: + /** + Default constructor + */ + inline CBase() {} + IMPORT_C virtual ~CBase(); + inline TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW; + inline TAny* operator new(TUint aSize) __NO_THROW; + inline TAny* operator new(TUint aSize, TLeave); + inline TAny* operator new(TUint aSize, TUint aExtraSize) __NO_THROW; + inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize); + IMPORT_C static void Delete(CBase* aPtr); +protected: + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +private: + CBase(const CBase&); + CBase& operator=(const CBase&); +private: + }; + + + + +class CBufBase : public CBase +/** +@publishedAll +@released + +Defines the interface for dynamic buffers. + +The basic functions, InsertL(), Read(), Write(), Delete(), Reset() and Size(), +transfer data between the buffer and other places, and allow that data to +be deleted + +The ExpandL() and Resize() functions allow some operations to be carried out +with greater efficiency + +A Compress() function frees (back to the heap) any space which may have been +allocated, but not used + +Ptr() and BackPtr() allow look-up of contiguous data from any given position, +forward or backward +*/ + { +public: + IMPORT_C ~CBufBase(); + inline TInt Size() const; + IMPORT_C void Reset(); + IMPORT_C void Read(TInt aPos,TDes8& aDes) const; + IMPORT_C void Read(TInt aPos,TDes8& aDes,TInt aLength) const; + IMPORT_C void Read(TInt aPos,TAny* aPtr,TInt aLength) const; + IMPORT_C void Write(TInt aPos,const TDesC8& aDes); + IMPORT_C void Write(TInt aPos,const TDesC8& aDes,TInt aLength); + IMPORT_C void Write(TInt aPos,const TAny* aPtr,TInt aLength); + IMPORT_C void InsertL(TInt aPos,const TDesC8& aDes); + IMPORT_C void InsertL(TInt aPos,const TDesC8& aDes,TInt aLength); + IMPORT_C void InsertL(TInt aPos,const TAny* aPtr,TInt aLength); + IMPORT_C void ExpandL(TInt aPos,TInt aLength); + IMPORT_C void ResizeL(TInt aSize); +// Pure virtual + /** + Compresses the buffer so as to occupy minimal space. + + Normally, you would call this when a buffer has reached its final size, + or when you know it will not expand again for a while, or when an + out-of-memory error has occurred and your program is taking measures to + save space. Compression in these circumstances releases memory for other + programs to use, but has no adverse effect on performance. + + Derived classes provide the implementation. + + @see CBufFlat::Compress + @see CBufSeg::Compress + */ + virtual void Compress()=0; + /** + Deletes data from the buffer. + + Derived classes provide the implementation. + + @param aPos Buffer position where the deletion will begin; must be in the + range zero to (Size() minus the length of the data + to be deleted). + @param aLength The number of bytes to be deleted; must be non-negative. + + @see CBufFlat::Delete + @see CBufSeg::Delete + */ + virtual void Delete(TInt aPos,TInt aLength)=0; + /** + Gets a pointer descriptor to represent the data from the specified position to + the end of the contiguous region containing that byte. + + Derived classes provide the implementation. + + @param aPos Buffer position: must be in range zero to Size(). + + @return Descriptor representing the data starting at aPos, and whose length + indicates the number of contiguous bytes stored in the buffer, + forward from that point. The length will be non-zero unless aPos==Size(). + + @see CBufFlat::Ptr + @see CBufSeg::Ptr + */ + virtual TPtr8 Ptr(TInt aPos)=0; + /** + Gets a pointer descriptor to represent data from just before the specified + data byte backward to the beginning of the contiguous region containing + that byte. + + Derived classes provide the implementation. + + @param aPos Buffer position: must be in range zero to Size(). + + @return Descriptor representing the back contiguous region. + The address in the descriptor is the pointer to the bytes at the + buffer position, unless the buffer position was at the beginning of + a non-first segment in the buffer: in this case, the address is a + pointer just beyond the last data byte in the previous segment. + The length is the number of contiguous bytes from the address + backwards to the beginning of the segment. + + @see CBufFlat::BackPtr + @see CBufSeg::BackPtr + */ + virtual TPtr8 BackPtr(TInt aPos)=0; +private: + virtual void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength)=0; +protected: + IMPORT_C CBufBase(TInt anExpandSize); +protected: + TInt iSize; + TInt iExpandSize; + }; + + + + +class CBufFlat : public CBufBase +/** +@publishedAll +@released + +Provides a flat storage dynamic buffer. + +This class should be used when high-speed pointer lookup is an important +consideration, and you are reasonably confident that the insertion of +data will not fail. + +This class is an implementation of the abstract buffer interface provided +by CBufBase and uses a single heap cell to contain the data. +*/ + { +public: + IMPORT_C ~CBufFlat(); + IMPORT_C static CBufFlat* NewL(TInt anExpandSize); + inline TInt Capacity() const; + IMPORT_C void SetReserveL(TInt aSize); + IMPORT_C void Compress(); + IMPORT_C void Delete(TInt aPos,TInt aLength); + IMPORT_C TPtr8 Ptr(TInt aPos); + IMPORT_C TPtr8 BackPtr(TInt aPos); +protected: + IMPORT_C CBufFlat(TInt anExpandSize); +private: + IMPORT_C void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength); +private: + TInt iMaxSize; + TUint8* iPtr; + }; + + + + +class TBufSegLink; +class CBufSeg : public CBufBase +/** +@publishedAll +@released + +Provides a segmented dynamic buffer. + +This class should be used when the object has a long life-time and an +unpredictable number of insertions, or there is concern about the performance +of insertion and deletion operations into large buffers. + +This class is an implementation of the abstract buffer interface provided +by CBufBase and uses doubly-linked list of heap cells to contain the data; +each cell containing a segment of the buffer. + +Its (private) data members include an anchor for the doubly-linked list, and also a +reference to the buffer position used by the last operation. This reference +acts as a cache; if the next operation uses a similar buffer position, then +calculation of the pointer corresponding to its buffer position is much faster. +*/ + { +public: + IMPORT_C ~CBufSeg(); + IMPORT_C static CBufSeg* NewL(TInt anExpandSize); + IMPORT_C void Compress(); + IMPORT_C void Delete(TInt aPos,TInt aLength); + IMPORT_C TPtr8 Ptr(TInt aPos); + IMPORT_C TPtr8 BackPtr(TInt aPos); +protected: + IMPORT_C CBufSeg(TInt anExpandSize); + void InsertIntoSegment(TBufSegLink* aSeg,TInt anOffset,const TAny* aPtr,TInt aLength); + void DeleteFromSegment(TBufSegLink* aSeg,TInt anOffset,TInt aLength); + void FreeSegment(TBufSegLink* aSeg); + void SetSBO(TInt aPos); + void AllocSegL(TBufSegLink* aSeg,TInt aNumber); +private: + IMPORT_C void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength); +private: + TDblQue iQue; + TBufSegLink* iSeg; + TInt iBase; + TInt iOffset; + }; + + + + +class TKeyArrayFix : public TKey +/** +@publishedAll +@released + +Defines the characteristics of a key used to access the elements of arrays +of fixed length objects. + +An object of this type can represent three categories of key, depending on +the constructor used: + +1. a descriptor key + +2. a text key + +3. a numeric key. + +The Sort(), InsertIsqL(), Find() and FindIsqL() member functions of the CArrayFixFlat +and CArrayFixSeg class hierarchies need a TKeyArrayFix object as an argument +to define the location and type of key within an array element. + +@see CArrayFixFlat +@see CArrayFixSeg +*/ + { +public: + IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpText aType); + IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpText aType,TInt aLength); + IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpNumeric aType); +protected: + IMPORT_C virtual void Set(CBufBase* aBase,TInt aRecordLength); + IMPORT_C TAny* At(TInt anIndex) const; +protected: + TInt iRecordLength; + CBufBase* iBase; + friend class CArrayFixBase; + }; + + + + +typedef CBufBase*(*TBufRep)(TInt anExpandSize); +class CArrayFixBase : public CBase +/** +@publishedAll +@released + +Base class for arrays of fixed length objects. + +It provides implementation and public functions which are common to all arrays +of this type. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + IMPORT_C ~CArrayFixBase(); + inline TInt Count() const; + inline TInt Length() const; + IMPORT_C void Compress(); + IMPORT_C void Reset(); + IMPORT_C TInt Sort(TKeyArrayFix& aKey); + IMPORT_C TAny* At(TInt anIndex) const; + IMPORT_C TAny* End(TInt anIndex) const; + IMPORT_C TAny* Back(TInt anIndex) const; + IMPORT_C void Delete(TInt anIndex); + IMPORT_C void Delete(TInt anIndex,TInt aCount); + IMPORT_C TAny* ExpandL(TInt anIndex); + IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayFix& aKey,TInt& anIndex) const; + IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayFix& aKey,TInt& anIndex) const; + IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr); + IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aCount); + IMPORT_C TInt InsertIsqL(const TAny* aPtr,TKeyArrayFix& aKey); + IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TKeyArrayFix& aKey); + IMPORT_C void ResizeL(TInt aCount,const TAny* aPtr); +protected: + IMPORT_C CArrayFixBase(TBufRep aRep,TInt aRecordLength,TInt aGranularity); + IMPORT_C void InsertRepL(TInt anIndex,const TAny* aPtr,TInt aReplicas); + IMPORT_C void SetKey(TKeyArrayFix& aKey) const; + IMPORT_C void SetReserveFlatL(TInt aCount); + IMPORT_C static TInt CountR(const CBase* aPtr); + IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex); +private: + TInt iCount; + TInt iGranularity; + TInt iLength; + TBufRep iCreateRep; + CBufBase* iBase; + }; + + + + +template +class CArrayFix : public CArrayFixBase +/** +@publishedAll +@released + +A thin templated base class for arrays of fixed length objects. + +The public functions provide standard array behaviour. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + inline CArrayFix(TBufRep aRep,TInt aGranularity); + inline const T& operator[](TInt anIndex) const; + inline T& operator[](TInt anIndex); + inline const T& At(TInt anIndex) const; + inline const T* End(TInt anIndex) const; + inline const T* Back(TInt anIndex) const; + inline T& At(TInt anIndex); + inline T* End(TInt anIndex); + inline T* Back(TInt anIndex); + inline void AppendL(const T& aRef); + inline void AppendL(const T* aPtr,TInt aCount); + inline void AppendL(const T& aRef,TInt aReplicas); + inline T& ExpandL(TInt anIndex); + inline T& ExtendL(); + inline TInt Find(const T& aRef,TKeyArrayFix& aKey,TInt& anIndex) const; + inline TInt FindIsq(const T& aRef,TKeyArrayFix& aKey,TInt& anIndex) const; + inline void InsertL(TInt anIndex,const T& aRef); + inline void InsertL(TInt anIndex,const T* aPtr,TInt aCount); + inline void InsertL(TInt anIndex,const T& aRef,TInt aReplicas); + inline TInt InsertIsqL(const T& aRef,TKeyArrayFix& aKey); + inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TKeyArrayFix& aKey); + inline void ResizeL(TInt aCount); + inline void ResizeL(TInt aCount,const T& aRef); + inline const TArray Array() const; + }; + + + + +TEMPLATE_SPECIALIZATION class CArrayFix : public CArrayFixBase +/** +@publishedAll +@released + +A template specialisation base class for arrays of fixed length +untyped objects. + +The public functions provide standard array behaviour. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + inline CArrayFix(TBufRep aRep,TInt aRecordLength,TInt aGranularity); + inline const TAny* At(TInt anIndex) const; + inline const TAny* End(TInt anIndex) const; + inline const TAny* Back(TInt anIndex) const; + inline TAny* At(TInt anIndex); + inline TAny* End(TInt anIndex); + inline TAny* Back(TInt anIndex); + inline void AppendL(const TAny* aPtr); + inline void AppendL(const TAny* aPtr,TInt aCount); + inline TAny* ExtendL(); + }; + + + + + +template +class CArrayFixFlat : public CArrayFix +/** +@publishedAll +@released + +Array of fixed length objects contained within a flat dynamic buffer. + +The elements of the array are instances of the template class T. + +The flat dynamic buffer is an instance of a CBufFlat. + +The elements can be T or R type objects and must have an accessible default +constructor. + +Note that, where possible, use the RArray class as this is more +efficient. + +@see CBufFlat +@see RArray +*/ + { +public: + inline explicit CArrayFixFlat(TInt aGranularity); + inline void SetReserveL(TInt aCount); + }; + + + + +TEMPLATE_SPECIALIZATION class CArrayFixFlat : public CArrayFix +/** +@publishedAll +@released + +An array of fixed length untyped objects using a flat dynamic buffer. + +The array elements are contained within a CBufFlat. + +The class is useful for constructing an array of fixed length buffers, where +the length is decided at run time. + +This class is also useful as a data member of a base class in a thin template +class/base class pair where the type of the array element is not known until +the owning thin template class is instantiated. + +@see CBufFlat +*/ + { +public: + inline CArrayFixFlat(TInt aRecordLength,TInt aGranularity); + inline void SetReserveL(TInt aCount); + }; + + + + +TEMPLATE_SPECIALIZATION class CArrayFixFlat : public CArrayFix +/** +@publishedAll +@released + +Template specialisation base class for arrays of TInt types implemented in a +flat dynamic buffer. + +@see TInt +*/ + { +public: + IMPORT_C explicit CArrayFixFlat(TInt aGranularity); + IMPORT_C ~CArrayFixFlat(); + inline void SetReserveL(TInt aCount); + }; + + + + +TEMPLATE_SPECIALIZATION class CArrayFixFlat : public CArrayFix +/** +@publishedAll +@released + +Template specialisation base class for arrays of TUid types implemented in a +flat dynamic buffer. + +@see TUid +*/ + { +public: + IMPORT_C explicit CArrayFixFlat(TInt aGranularity); + IMPORT_C ~CArrayFixFlat(); + inline void SetReserveL(TInt aCount); + }; + + + + +template +class CArrayFixSeg : public CArrayFix +/** +@publishedAll +@released + +Array of fixed length objects contained within a segmented buffer. + +The elements of the array are instances of the template class T. + +The segmented buffer is an instance of a CBufSeg. + +The elements can be T or R type objects and must have an accessible default +constructor. + +@see CBufSeg +*/ + { +public: + inline explicit CArrayFixSeg(TInt aGranularity); + }; + + + + +TEMPLATE_SPECIALIZATION class CArrayFixSeg : public CArrayFix +/** +@publishedAll +@released + +An array of fixed length untyped objects using a segmented dynamic buffer. + +The array elements are contained within a CBufSeg. + +The class is useful for constructing an array of fixed length buffers, where +the length is decided at run time. + +This class is also useful as a data member of a base class in a thin template +class/base class pair where the type of the array element is not known until +the owning thin template class is instantiated. + +@see CBufSeg +*/ + { +public: + inline CArrayFixSeg(TInt aRecordLength,TInt aGranularity); + }; + + + + +template +class CArrayPtr : public CArrayFix +/** +@publishedAll +@released + +A thin templated base class for arrays of pointers to objects. + +The public functions contribute to standard array behaviour. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + inline CArrayPtr(TBufRep aRep,TInt aGranularity); + void ResetAndDestroy(); + }; + + + + + +template +class CArrayPtrFlat : public CArrayPtr +/** +@publishedAll +@released + +Array of pointers to objects implemented using a flat dynamic buffer. + +The elements of the array are pointers to instances of the template class T +and are contained within a CBufFlat. + +This type of array has the full behaviour of flat arrays but, in addition, +the CArrayPtr::ResetAndDestroy() function offers a way of destroying +all of the objects whose pointers form the elements of the array, before +resetting the array. + +Note that where possible, use the RPointerArray class as this is +more efficient. + +@see CBufFlat +@see CArrayPtr::ResetAndDestroy +@see RPointerArray +*/ + { +public: + inline explicit CArrayPtrFlat(TInt aGranularity); + inline void SetReserveL(TInt aCount); + }; + + + + +template +class CArrayPtrSeg : public CArrayPtr +/** +@publishedAll +@released + +Array of pointers to objects implemented using a segmented dynamic buffer. + +The elements of the array are pointers to instances of the template class T +and are contained within a CBufSeg. + +This type of array has the full behaviour of segmented arrays but, in addition, +the CArrayPtr::ResetAndDestroy() function offers a way of destroying +all of the objects whose pointers form the elements of the array before +resetting the array. + +@see CBufSeg +@see CArrayPtr::ResetAndDestroy +*/ + { +public: + inline explicit CArrayPtrSeg(TInt aGranularity); + }; + + + + +class TKeyArrayVar : public TKey +/** +@publishedAll +@released + +Defines the characteristics of a key used to access the elements of arrays +of variable length objects. + +An object of this type can represent three categories of key, depending on +the constructor used: + +1. a descriptor key + +2. a text key + +3. a numeric key. + +The Sort(), InsertIsqL(), Find() and FindIsqL() member functions of the CArrayVarFlat +and CArrayVarSeg class hierarchies need a TKeyArrayVar object as an argument +to define the location and type of key within an array element. + +A TKeyArrayVar object is also required for sorting a packed array. The implementation +of the SortL() member function of the CArrayPakFlat class constructs a temporary +CArrayVarFlat object which requires the TKeyArrayVar object. + +@see CArrayVarFlat +@see CArrayVarSeg +@see CArrayPakFlat +*/ + { +public: + IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpText aType); + IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpText aType,TInt aLength); + IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpNumeric aType); +protected: + IMPORT_C virtual void Set(CBufBase* aBase); + IMPORT_C TAny* At(TInt anIndex) const; +protected: + CBufBase* iBase; + friend class CArrayVarBase; + }; + + + + + +class CArrayVarBase : public CBase +/** +@publishedAll +@released + +An implementation base class for variable length arrays. + +It provides implementation and public functions which are common to all +variable length type arrays. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + IMPORT_C ~CArrayVarBase(); + inline TInt Count() const; + IMPORT_C TInt Length(TInt anIndex) const; + IMPORT_C void Compress(); + IMPORT_C void Reset(); + IMPORT_C TInt Sort(TKeyArrayVar& aKey); + IMPORT_C TAny* At(TInt anIndex) const; + IMPORT_C void Delete(TInt anIndex); + IMPORT_C void Delete(TInt anIndex,TInt aCount); + IMPORT_C TAny* ExpandL(TInt anIndex,TInt aLength); + IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayVar& aKey,TInt& anIndex) const; + IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayVar& aKey,TInt& anIndex) const; + IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aLength); + IMPORT_C TInt InsertIsqL(const TAny* aPtr,TInt aLength,TKeyArrayVar& aKey); + IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TInt aLength,TKeyArrayVar& aKey); +protected: + IMPORT_C CArrayVarBase(TBufRep aRep,TInt aGranularity); + IMPORT_C void SetKey(TKeyArrayVar& aKey) const; + IMPORT_C static TInt CountR(const CBase* aPtr); + IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex); +private: + TInt iCount; + TInt iGranularity; + TBufRep iCreateRep; + CBufBase* iBase; + }; + + + + +template +class CArrayVar : public CArrayVarBase +/** +@publishedAll +@released + +A thin templated base class for variable length arrays. + +The public functions provide standard array behaviour. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + inline CArrayVar(TBufRep aRep,TInt aGranularity); + inline const T& operator[](TInt anIndex) const; + inline T& operator[](TInt anIndex); + inline const T& At(TInt anIndex) const; + inline T& At(TInt anIndex); + inline void AppendL(const T& aRef,TInt aLength); + inline T& ExpandL(TInt anIndex,TInt aLength); + inline T& ExtendL(TInt aLength); + inline TInt Find(const T& aRef,TKeyArrayVar& aKey,TInt& anIndex) const; + inline TInt FindIsq(const T& aRef,TKeyArrayVar& aKey,TInt& anIndex) const; + inline void InsertL(TInt anIndex,const T& aRef,TInt aLength); + inline TInt InsertIsqL(const T& aRef,TInt aLength,TKeyArrayVar& aKey); + inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TInt aLength,TKeyArrayVar& aKey); + inline const TArray Array() const; + }; + + + + +TEMPLATE_SPECIALIZATION class CArrayVar : public CArrayVarBase +/** +@publishedAll +@released + +A template specialisation base class for variable length arrays. + +The array buffer organisation is defined at construction. + +The class is useful for constructing an array of variable length buffers, +where the length is decided at run time. + +This class is also useful as a data member of a base class in a thin template +class/base class pair, where the type of the array element is not known until +the owning thin template class is instantiated. +*/ + { +public: + inline CArrayVar(TBufRep aRep,TInt aGranularity); + inline const TAny* At(TInt anIndex) const; + inline TAny* At(TInt anIndex); + inline void AppendL(const TAny* aPtr,TInt aLength); + inline TAny* ExtendL(TInt aLength); + }; + + + + +template +class CArrayVarFlat : public CArrayVar +/** +@publishedAll +@released + +Array of variable length objects implemented using a flat dynamic buffer. + +The elements of the array are instances of the template class T and are +contained within their own heap cells. Pointers to the elements are maintained +within the flat dynamic buffer, a CBufFlat. + +The elements can be T or R type objects and must have an accessible default +constructor. + +@see CBufFlat +*/ + { +public: + inline explicit CArrayVarFlat(TInt aGranularity); + }; + + + + +template +class CArrayVarSeg : public CArrayVar +/** +@publishedAll +@released + +Array of variable length objects implemented using a segmented dynamic buffer. + +The elements of the array are instances of the template class T and are +contained within their own heap cells. Pointers to the elements are maintained +within a segmented dynamic buffer, a CBufSeg. + +The elements can be T or R type objects and must have an accessible default +constructor. + +@see CBufSeg +*/ + { +public: + inline explicit CArrayVarSeg(TInt aGranularity); + }; + + + + +class TKeyArrayPak : public TKeyArrayVar +/** +@publishedAll +@released + +Defines the characteristics of a key used to access the elements of packed +arrays. + +An object of this type can represent three categories of key, depending on +the constructor used: + +1. a descriptor key + +2. a text key + +3. a numeric key. + +The InsertIsqL(), Find() and FindIsqL() member functions of the CArrayPakFlat +class hierarchy need a TKeyArrayPak object as an argument to define the location +and type of key within an array element. + +Note that a TKeyArrayVar object is required for sorting a packed array. The +implementation of the SortL() member function of the CArrayPakFlat class constructs +a temporary CArrayVarFlat object which requires the TKeyArrayVar object. + +@see CArrayVarSeg +@see CArrayPakFlat +@see TKeyArrayVar +*/ + { +public: + IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpText aType); + IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpText aType,TInt aLength); + IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpNumeric aType); +protected: + IMPORT_C virtual void Set(CBufBase* aBase); + IMPORT_C TAny* At(TInt anIndex) const; +private: + TInt iCacheIndex; + TInt iCacheOffset; + friend class CArrayPakBase; + }; + + + + +class CArrayPakBase : public CBase +/** +@publishedAll +@released + +An implementation base class for all variable length, packed arrays. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + IMPORT_C ~CArrayPakBase(); + inline TInt Count() const; + IMPORT_C TInt Length(TInt anIndex) const; + IMPORT_C void Compress(); + IMPORT_C void Reset(); + IMPORT_C void SortL(TKeyArrayVar& aKey); + IMPORT_C TAny* At(TInt anIndex) const; + IMPORT_C void Delete(TInt anIndex); + IMPORT_C void Delete(TInt anIndex,TInt aCount); + IMPORT_C TAny* ExpandL(TInt anIndex,TInt aLength); + IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayPak& aKey,TInt& anIndex) const; + IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayPak& aKey,TInt& anIndex) const; + IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aLength); + IMPORT_C TInt InsertIsqL(const TAny* aPtr,TInt aLength,TKeyArrayPak& aKey); + IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TInt aLength,TKeyArrayPak& aKey); +protected: + IMPORT_C CArrayPakBase(TBufRep aRep,TInt aGranularity); + IMPORT_C void SetKey(TKeyArrayPak& aKey) const; + IMPORT_C TInt GetOffset(TInt anIndex) const; + IMPORT_C void BuildVarArrayL(CArrayVarFlat*& aVarFlat); + IMPORT_C static TInt CountR(const CBase* aPtr); + IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex); +private: + TInt iCount; + TInt iGranularity; + TBufRep iCreateRep; + CBufBase* iBase; + TInt iCacheIndex; + TInt iCacheOffset; + }; + + + + +template +class CArrayPak : public CArrayPakBase +/** +@publishedAll +@released + +A thin templated base class for variable length, packed, arrays. + +The public functions provide standard array behaviour. + +The class is always derived from and is never instantiated explicitly. +*/ + { +public: + inline CArrayPak(TBufRep aRep,TInt aGranularity); + inline const T& operator[](TInt anIndex) const; + inline T& operator[](TInt anIndex); + inline const T& At(TInt anIndex) const; + inline T& At(TInt anIndex); + inline void AppendL(const T& aRef,TInt aLength); + inline T& ExpandL(TInt anIndex,TInt aLength); + inline T& ExtendL(TInt aLength); + inline TInt Find(const T& aRef,TKeyArrayPak& aKey,TInt& anIndex) const; + inline TInt FindIsq(const T& aRef,TKeyArrayPak& aKey,TInt& anIndex) const; + inline void InsertL(TInt anIndex,const T& aRef,TInt aLength); + inline TInt InsertIsqL(const T& aRef,TInt aLength,TKeyArrayPak& aKey); + inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TInt aLength,TKeyArrayPak& aKey); + inline const TArray Array() const; + }; + + + + +TEMPLATE_SPECIALIZATION class CArrayPak : public CArrayPakBase +/** +@publishedAll +@released + +A template specialisation base class for variable length, packed, arrays. + +The array buffer organisation is defined at construction. + +The class is useful for constructing an array of variable length buffers, +where the length is decided at run time. + +This class is also useful as a data member of a base class in a thin template +class/base class pair where the type of the array element is not known until +the owning thin template class is instantiated. +*/ + { +public: + inline CArrayPak(TBufRep aRep,TInt aGranularity); + inline const TAny* At(TInt anIndex) const; + inline TAny* At(TInt anIndex); + inline void AppendL(const TAny* aPtr,TInt aLength); + inline TAny* ExtendL(TInt aLength); + }; + + + + +template +class CArrayPakFlat : public CArrayPak +/** +@publishedAll +@released + +Array of variable length objects packed into a flat buffer. + +The elements of the array are instances of the template class T and are +contained within a flat dynamic buffer, a CBufFlat. + +The elements can be T or R type objects and must have an accessible default +constructor. + +@see CBufFlat +*/ + { +public: + inline explicit CArrayPakFlat(TInt aGranularity); + }; + + + + +class CObjectCon; +class CObject : public CBase +/** +@publishedAll +@released + +Implements reference counting to track concurrent references to itself. + +An object of this type arranges automatic destruction of itself when the final +reference is removed. + +A reference counting object is any object which has CObject as its base class. +Constructing a CObject derived type or calling its Open() member function +adds a reference to that object by adding one to the reference count; calling +its Close() member function removes a reference by subtracting one from the +reference count; when the last user of the object calls Close(), the reference +count becomes zero and the object is automatically destroyed. +*/ + { +public: + IMPORT_C CObject(); + IMPORT_C ~CObject(); + IMPORT_C virtual TInt Open(); + IMPORT_C virtual void Close(); + IMPORT_C virtual TName Name() const; + IMPORT_C virtual TFullName FullName() const; + IMPORT_C TInt SetName(const TDesC* aName); + IMPORT_C void SetNameL(const TDesC* aName); + inline CObject* Owner() const; + inline void SetOwner(CObject* anOwner); + inline TInt AccessCount() const; +protected: + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +protected: + inline TInt UniqueID() const; + inline void Inc(); + inline void Dec(); +private: + TInt iAccessCount; + CObject* iOwner; + CObjectCon* iContainer; + HBufC* iName; + TAny* iSpare1; + TAny* iSpare2; + friend class CObjectCon; + friend class CObjectIx; + __DECLARE_TEST; + }; + +//Forward declaration of SObjectIxRec +struct SObjectIxRec; + +class CObjectIx : public CBase +/** +@publishedAll +@released + +Generates handle numbers for reference counting objects. + +This is referred to as an object index. + +Adding a reference counting object to an object index is the way in which +a unique handle number can be generated for that object. A handle number is +the way in which an object, which is owned or managed by another thread or +process can be identified. + +@see CObject +*/ + { +public: + enum { + /** + When ORd into the handle number, indicates that the reference + counting object cannot be closed. + */ + ENoClose=KHandleNoClose, + + + /** + When ORed into the handle number, indicates that the handle + is a local handle. + */ + ELocalHandle=KHandleFlagLocal + }; +public: + IMPORT_C static CObjectIx* NewL(); + IMPORT_C ~CObjectIx(); + IMPORT_C TInt AddL(CObject* anObj); + IMPORT_C void Remove(TInt aHandle); + IMPORT_C CObject* At(TInt aHandle,TInt aUniqueID); + IMPORT_C CObject* At(TInt aHandle); + IMPORT_C CObject* AtL(TInt aHandle,TInt aUniqueID); + IMPORT_C CObject* AtL(TInt aHandle); + IMPORT_C TInt At(const CObject* anObject) const; + IMPORT_C TInt Count(CObject* anObject) const; + IMPORT_C CObject* operator[](TInt anIndex); + inline TInt Count() const; + inline TInt ActiveCount() const; +protected: + IMPORT_C CObjectIx(); +private: + void UpdateState(); +private: + TInt iNumEntries; // Number of actual entries in the index + TInt iHighWaterMark; // points to at least 1 above the highest active index + TInt iAllocated; // Max entries before realloc needed + TInt iNextInstance; + SObjectIxRec *iObjects; + TInt iFree; // The index of the first free slot or -1. + TInt iUpdateDisabled; // If >0, disables HWM update, reorder of the free list and memory shrinking. + TAny* iSpare1; + TAny* iSpare2; + }; +// +inline TBool IsLocalHandle(TInt aHandle) + {return(aHandle&CObjectIx::ELocalHandle);} +inline void SetLocalHandle(TInt &aHandle) + {aHandle|=CObjectIx::ELocalHandle;} +inline void UnSetLocalHandle(TInt &aHandle) + {aHandle&=(~CObjectIx::ELocalHandle);} + + + + +class CObjectCon : public CBase +/** +@publishedAll +@released + +An object container. + +An object container acts as a home for a set of related reference counting +objects. + +A reference counting object, a CObject type, must be added to an object +container. Only one instance of a given reference counting object can be +held by an object container, i.e. each object within an object container +must be distinct. + +Object containers are constructed by an object container index, a CObjectConIx +type. + +Note that this class is not intended for user derivation. + +@see CObject +@see CObjectConIx +*/ + { +public: + IMPORT_C static CObjectCon* NewL(); + IMPORT_C ~CObjectCon(); + IMPORT_C void Remove(CObject* anObj); + IMPORT_C void AddL(CObject* anObj); + IMPORT_C CObject* operator[](TInt anIndex); + IMPORT_C CObject* At(TInt aFindHandle) const; + IMPORT_C CObject* AtL(TInt aFindHandle) const; + IMPORT_C TInt CheckUniqueFullName(const CObject* anOwner,const TDesC& aName) const; + IMPORT_C TInt CheckUniqueFullName(const CObject* anObject) const; + IMPORT_C TInt FindByName(TInt& aFindHandle,const TDesC& aMatch,TName& aName) const; + IMPORT_C TInt FindByFullName(TInt& aFindHandle,const TDesC& aMatch,TFullName& aFullName) const; + inline TInt UniqueID() const; + inline TInt Count() const; +protected: + IMPORT_C CObjectCon(TInt aUniqueID); + TBool NamesMatch(const CObject* anObject, const CObject* aCurrentObject) const; + TBool NamesMatch(const CObject* anObject, const TName& anObjectName, const CObject* aCurrentObject) const; +public: + /** + The object container's unique Id value. + */ + TInt iUniqueID; +private: + TInt iCount; + TInt iAllocated; + CObject** iObjects; + TAny* iSpare1; + TAny* iSpare2; + friend class CObjectConIx; + }; + + + + +class CObjectConIx : public CBase +/** +@publishedAll +@released + +A container for object containers + +This is referred to as a container index. + +The class provides the mechanism through which object containers, CObjectCon +types, are created. + +@see CObjectCon +@see CObject +*/ + { +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +protected: + /** + @internalComponent + */ + enum {ENotOwnerID}; +#endif + +public: + IMPORT_C static CObjectConIx* NewL(); + IMPORT_C ~CObjectConIx(); + IMPORT_C CObjectCon* Lookup(TInt aFindHandle) const; + IMPORT_C CObjectCon* CreateL(); + IMPORT_C void Remove(CObjectCon* aCon); +protected: + IMPORT_C CObjectConIx(); + IMPORT_C void CreateContainerL(CObjectCon*& anObject); +private: + CObjectCon* LookupByUniqueId(TInt aUniqueId) const; +private: + TInt iCount; + TInt iAllocated; + TUint16 iNextUniqueID; + TUint16 iUniqueIDHasWrapped; + CObjectCon** iContainers; + TAny* iSpare1; + TAny* iSpare2; + }; + +// Forward Declaration of TCleanupStackItem +class TCleanupStackItem; + + + + +/** +@publishedAll +@released + +Defines a function which takes a single argument of type TAny* and returns +void. + +An argument of this type is required by the constructors of a TCleanupItem +object. +*/ +typedef void (*TCleanupOperation)(TAny*); + + + + +class TCleanupItem +/** +@publishedAll +@released + +Encapsulates a cleanup operation and an object on which the operation +is to be performed. + +The class allows cleanup to be more sophisticated than simply deleting objects, +for example, releasing access to some shared resource. +*/ + { +public: + inline TCleanupItem(TCleanupOperation anOperation); + inline TCleanupItem(TCleanupOperation anOperation,TAny* aPtr); +private: + TCleanupOperation iOperation; + TAny* iPtr; + friend class TCleanupStackItem; + }; + + + + +class CCleanup : public CBase +/** +@publishedAll +@released + +Implements the cleanup stack. + +An object of this type is created and used by the cleanup stack +interface, CTrapCleanup. +*/ + { +public: + IMPORT_C static CCleanup* New(); + IMPORT_C static CCleanup* NewL(); + IMPORT_C ~CCleanup(); + IMPORT_C void NextLevel(); + IMPORT_C void PreviousLevel(); + IMPORT_C void PushL(TAny* aPtr); + IMPORT_C void PushL(CBase* anObject); + IMPORT_C void PushL(TCleanupItem anItem); + IMPORT_C void Pop(); + IMPORT_C void Pop(TInt aCount); + IMPORT_C void PopAll(); + IMPORT_C void PopAndDestroy(); + IMPORT_C void PopAndDestroy(TInt aCount); + IMPORT_C void PopAndDestroyAll(); + IMPORT_C void Check(TAny* aExpectedItem); +protected: + IMPORT_C void DoPop(TInt aCount,TBool aDestroy); + IMPORT_C void DoPopAll(TBool aDestroy); +protected: + IMPORT_C CCleanup(); +protected: + /** + Pointer to the bottom of the cleanup stack. + */ + TCleanupStackItem* iBase; + + + /** + Pointer to the top of the cleanup stack. + */ + TCleanupStackItem* iTop; + + + /** + Pointer to the next availaible slot in the cleanup stack. + */ + TCleanupStackItem* iNext; + }; + + + + +NONSHARABLE_CLASS(TCleanupTrapHandler) : public TTrapHandler +/** +@publishedAll +@released + +Implementation for a handler to work with the TRAP mechanism. + +This class does not normally need to be used or accessed directly by applications +and third party code. +*/ + { +public: + TCleanupTrapHandler(); + virtual void Trap(); + virtual void UnTrap(); + + virtual void Leave(TInt aValue); + inline CCleanup& Cleanup(); +private: + CCleanup* iCleanup; + friend class CTrapCleanup; + }; + + + + +template +class TAutoClose +/** +@publishedAll +@released + +Automatically calls Close() on an object when that object goes out of scope. + +The behaviour takes advantage of the fact that the compiler automatically +destroys objects that go out of scope. +*/ + { +public: + inline ~TAutoClose(); + inline void PushL(); + inline void Pop(); +private: + static void Close(TAny *aObj); +public: + /** + An instance of the template class. + */ + T iObj; + }; + + + + +class CTrapCleanup : public CBase +/** +@publishedAll +@released + +Cleanup stack interface. + +The creation and destruction of a cleanup stack is done automatically by GUI +applications and servers. +*/ + { +public: + IMPORT_C static CTrapCleanup* New(); + IMPORT_C ~CTrapCleanup(); +protected: + IMPORT_C CTrapCleanup(); +private: + TCleanupTrapHandler iHandler; + TTrapHandler* iOldHandler; + }; + + + + +class CCirBufBase : public CBase +/** +@publishedAll +@released + +Base class for circular buffers. + +The class is part of the implementation of circular buffers and is never +instantiated. + +The class provides member functions that form part of the interface. +*/ + { +public: + IMPORT_C ~CCirBufBase(); + inline TInt Count() const; + inline TInt Length() const; + IMPORT_C void SetLengthL(TInt aLength); + IMPORT_C void Reset(); +protected: + IMPORT_C CCirBufBase(TInt aSize); + IMPORT_C TInt DoAdd(const TUint8* aPtr); + IMPORT_C TInt DoAdd(const TUint8* aPtr,TInt aCount); + IMPORT_C TInt DoRemove(TUint8* aPtr); + IMPORT_C TInt DoRemove(TUint8* aPtr,TInt aCount); +protected: + TInt iCount; + TInt iSize; + TInt iLength; + TUint8* iPtr; + TUint8* iPtrE; + TUint8* iHead; + TUint8* iTail; + }; + + + + +template +class CCirBuf : public CCirBufBase +/** +@publishedAll +@released + +A circular buffer containing objects of a type defined by the +template parameter. +*/ + { +public: + inline CCirBuf(); +#if defined(__VC32__) + inline ~CCirBuf() {} +#endif + inline TInt Add(const T* aPtr); + inline TInt Add(const T* aPtr,TInt aCount); + inline TInt Remove(T* aPtr); + inline TInt Remove(T* aPtr,TInt aCount); + }; + + + + +class CCirBuffer : public CCirBuf +/** +@publishedAll +@released + +Circular buffer of unsigned 8-bit integers. + +The integer values range from 0 to 255. +*/ + { +public: + IMPORT_C CCirBuffer(); + IMPORT_C ~CCirBuffer(); + IMPORT_C TInt Get(); + IMPORT_C TInt Put(TInt aVal); + }; +// + + + +class CActive : public CBase +/** +@publishedAll +@released + +The core class of the active object abstraction. + +It encapsulates both the issuing of a request to an asynchronous service provider +and the handling of completed requests. An application can have one or more +active objects whose processing is controlled by an active scheduler. +*/ + { +public: + +/** +Defines standard priorities for active objects. +*/ +enum TPriority + { + /** + A low priority, useful for active objects representing + background processing. + */ + EPriorityIdle=-100, + + + /** + A priority higher than EPriorityIdle but lower than EPriorityStandard. + */ + EPriorityLow=-20, + + + /** + Most active objects will have this priority. + */ + EPriorityStandard=0, + + + /** + A priority higher than EPriorityStandard; useful for active objects + handling user input. + */ + EPriorityUserInput=10, + + + /** + A priority higher than EPriorityUserInput. + */ + EPriorityHigh=20, + }; +public: + IMPORT_C ~CActive(); + IMPORT_C void Cancel(); + IMPORT_C void Deque(); + IMPORT_C void SetPriority(TInt aPriority); + inline TBool IsActive() const; + inline TBool IsAdded() const; + inline TInt Priority() const; +protected: + IMPORT_C CActive(TInt aPriority); + IMPORT_C void SetActive(); + + + /** + Implements cancellation of an outstanding request. + + This function is called as part of the active object's Cancel(). + + It must call the appropriate cancel function offered by the active object's + asynchronous service provider. The asynchronous service provider's cancel + is expected to act immediately. + + DoCancel() must not wait for event completion; this is handled by Cancel(). + + @see CActive::Cancel + */ + virtual void DoCancel() =0; + + + /** + Handles an active object's request completion event. + + A derived class must provide an implementation to handle the + completed request. If appropriate, it may issue another request. + + The function is called by the active scheduler when a request + completion event occurs, i.e. after the active scheduler's + WaitForAnyRequest() function completes. + + Before calling this active object's RunL() function, the active scheduler + has: + + 1. decided that this is the highest priority active object with + a completed request + + 2. marked this active object's request as complete (i.e. the request is no + longer outstanding) + + RunL() runs under a trap harness in the active scheduler. If it leaves, + then the active scheduler calls RunError() to handle the leave. + + Note that once the active scheduler's Start() function has been called, + all user code is run under one of the program's active object's RunL() or + RunError() functions. + + @see CActiveScheduler::Start + @see CActiveScheduler::Error + @see CActiveScheduler::WaitForAnyRequest + @see TRAPD + */ + virtual void RunL() =0; + IMPORT_C virtual TInt RunError(TInt aError); +protected: + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +public: + + /** + The request status associated with an asynchronous request. + + This is passed as a parameter to all asynchronous service providers. + + The active scheduler uses this to check whether the active object's request + has completed. + + The function can use the completion code to judge the success or otherwise + of the request. + */ + TRequestStatus iStatus; +private: +// TBool iActive; + TPriQueLink iLink; + TAny* iSpare; + friend class CActiveScheduler; + friend class CServer; + friend class CServer2; + }; + + + + +class CIdle : public CActive +/** +@publishedAll +@released + +An active object that performs low-priority processing when no higher-priority +active objects are ready to run. + +An idle time active object together with its associated callback function +may be used to implement potentially long running background tasks, such as +spreadsheet recalculation and word processor repagination. +*/ + { +public: + IMPORT_C static CIdle* New(TInt aPriority); + IMPORT_C static CIdle* NewL(TInt aPriority); + IMPORT_C ~CIdle(); + IMPORT_C void Start(TCallBack aCallBack); +protected: + IMPORT_C CIdle(TInt aPriority); + IMPORT_C void RunL(); + IMPORT_C void DoCancel(); +protected: + + /** + The callback object that encapsulates the background task. + + @see Start + */ + TCallBack iCallBack; + }; + + + + +class CAsyncOneShot : public CActive +/** +@publishedAll +@released + +An active object that performs processing that is only performed once. + +The active object is intended to be given a low priority, so that it runs +only when no higher-priority active objects are ready to run. In addition, +the class ensures that the current thread cannot be closed until the active +object is destroyed. + +The class needs to be derived from to make use of its behaviour, in particular, +it needs to define and implement a RunL() function. + +NB: the constructor creates a process-relative handle to the current thread +and this is stored within this object. If the thread subsequently dies abnormally, +then this handle will not be closed, and the thread will not be destroyed +until the process terminates. + +NB: if Call() is called from a different thread (for example, to implement +a kind of inter-thread communication), a client-specific mechanism must be +used to ensure that the thread that created this object is still alive. + +NB: if the thread that created this object has its own heap and terminates +abnormally, then the handle stored within this object is lost. + +@see CActive::RunL +@see CAsyncOneShot::Call +*/ + { +public: + IMPORT_C CAsyncOneShot(TInt aPriority); + IMPORT_C virtual void DoCancel(); + IMPORT_C virtual void Call(); + IMPORT_C virtual ~CAsyncOneShot(); + inline RThread& Thread(); +private: + void Setup(); + RThread iThread; + }; + + + + +class CAsyncCallBack : public CAsyncOneShot +/** +@publishedAll +@released + +An active object that performs its processing through an associated call back +function, and which is only performed once. +*/ + { +public: + IMPORT_C CAsyncCallBack(TInt aPriority); + IMPORT_C CAsyncCallBack(const TCallBack& aCallBack, TInt aPriority); + IMPORT_C void Set(const TCallBack& aCallBack); + IMPORT_C void CallBack(); + IMPORT_C virtual ~CAsyncCallBack(); +protected: + virtual void RunL(); +// +protected: + /** + The callback object that encapsulates the callback function. + */ + TCallBack iCallBack; + }; + + + + +class TDeltaTimerEntry +/** +@publishedAll +@released + +A timed event entry. + +An object of this type is added to a queue of timed events, as represented +by a CDeltaTimer object. It represents a call back function that is called +when the associated timed event expires. + +@see CDeltaTimer +*/ + { + friend class CDeltaTimer; +public: + inline TDeltaTimerEntry(TCallBack& aCallback); + inline TDeltaTimerEntry(); + inline void Set(TCallBack& aCallback); +private: + TCallBack iCallBack; + TTickCountQueLink iLink; + }; + + + + +class CDeltaTimer : public CActive +/** +@publishedAll +@released + +A queue of timed events. + +A timed event is a callback function encapsulated by a TDeltaTimerEntry object, +and is intended to be called when the time interval represented by the event +expires. + +The queue itself is a TDeltaQue list. A timed event entry is added into a +position in the queue that is determined by the time interval specified for +that event. Although the time interval for a timed event is specified as an +interval from the present moment, when added to the queue the implementation +treats each event as having an interval from the previous timed event (or now). + +CDeltaTimer is an active object, driven by an RTimer which is usually set to +expire upon completion of the event at the head of the queue. If the time to +the next event is too great or an event at the head of the queue has been +removed, the timer may be set to expire prior to the event at the head of the +queue (if any). + +When the timer completes, the head of the queue is inspected to see whether +the timed event at the head of the queue has expired. On expiry, the callback +function represented by that timed event is called, and the timed event entry +is removed from the queue. The queue then inspects further events for expiry, +calling and removing them as necessary until either the queue is empty or there +is an event in the future to wait for. + +Note that the tick period is the minimum time interval for an event and the +granularity of all timings using the queue. Note that in general, any event +may be called back some time after it has expired and that specifically the +duration of all events will at least be rounded up to a muliple of the tick +period. + + +@see TDeltaTimerEntry +@see TDeltaQue +@see RTimer +*/ + { +public: + // Queue management + IMPORT_C virtual void Queue(TTimeIntervalMicroSeconds32 aTimeInMicroSeconds, TDeltaTimerEntry& aEntry); + IMPORT_C virtual void Remove(TDeltaTimerEntry& aEntry); + IMPORT_C TInt QueueLong(TTimeIntervalMicroSeconds aTimeInMicroSeconds, TDeltaTimerEntry& aEntry); + + // Factory functions + IMPORT_C static CDeltaTimer* NewL(TInt aPriority); + IMPORT_C static CDeltaTimer* NewL(TInt aPriority, TTimeIntervalMicroSeconds32 aGranularity); + + // Destructor + ~CDeltaTimer(); + +private: + // Construction + CDeltaTimer(TInt aPriority, TInt aTickPeriod); + + // From CActive + void DoCancel(); + void RunL(); + + // Utility + void Activate(TBool aRequeueTimer = EFalse); + +private: + /** + The asynchronous timer. + */ + RTimer iTimer; + + /** + The list of timed event entries. + */ + TTickCountQue iQueue; + + /** + The period of a tick count. + */ + const TInt iTickPeriod; + + /** + Pseudo-lock on the the queue to avoid reentrancy problems + */ + TBool iQueueBusy; + }; + + + + +class CTimer : public CActive +/** +@publishedAll +@released + +Base class for a timer active object. + +This is an active object that uses the asynchronous services provided by RTimer, +to generate events. These events occur either at a specific time specified +as a TTime, or after an interval specified in microseconds. + +The RunL() virtual member function is called by the active scheduler after +this event occurs. + +To write a class derived from CTimer, first define and implement a constructor +through which the priority of the CTimer active object can be specified. Then +define and implement a suitable RunL() function to handle the completion of +a timer request. This function is not defined by CTimer itself and must, therefore, +be provided by the derived class. + +This class is ultimately implemented in terms of the nanokernel tick, and +therefore the granularity of the generated events is limited to the period of +this timer. This is variant specific, but is usually 1 millisecond. + +Note that the CPeriodic and CHeartbeat classes are derived from CTimer, and +answer most timing needs. + +@see CHeartbeat +@see CPeriodic +@see CHeartbeat +*/ + { +public: + IMPORT_C ~CTimer(); + IMPORT_C void At(const TTime& aTime); + IMPORT_C void AtUTC(const TTime& aTimeInUTC); + IMPORT_C void After(TTimeIntervalMicroSeconds32 anInterval); + IMPORT_C void Lock(TTimerLockSpec aLock); + IMPORT_C void Inactivity(TTimeIntervalSeconds aSeconds); + IMPORT_C void HighRes(TTimeIntervalMicroSeconds32 aInterval); +protected: + IMPORT_C CTimer(TInt aPriority); + IMPORT_C void ConstructL(); + IMPORT_C void DoCancel(); +private: + RTimer iTimer; + }; + + + + +class CPeriodic : public CTimer +/** +@publishedAll +@released + +Periodic timer active object. + +This class generates regular timer events and handles them with a callback +function. The callback is specified as a parameter to Start(). + +The callback may not be called immediately after the signal from the timer +request has been generated, for the following reasons: + +1. the RunL() of another active object may be running at the time of the signal + +2. other active objects may have a higher priority than the CPeriodic + +If timing accuracy is important to your application, you can minimise the +first problem by ensuring all RunL()s complete quickly, and can eliminate +the second by giving the CPeriodic a higher priority than any other active +object. Although it is generally recommended that timer-related active objects +have a high priority, this will not address the problem of CPeriodic timers +running behind, because active object scheduling is not pre-emptive. + +After a timer signal generated by a CPeriodic, the next signal is requested +just before running the callback, and this request can be delayed for the +same reasons that running the callback can be delayed. Therefore, a large +number N of periods may add up to somewhat more than N times the requested +period time. If absolute precision is required in tracking time, do not rely +on counting the number of times the callback is called: read the value of +the system clock every time you need it. + +For many applications, such precision is not required, for example, tick +counting is sufficiently accurate for controlling time-outs in a communications +program. + +Note that you should be familiar with CActive in order to understand +CPeriodic behaviour, but not necessarily with CTimer. + +@see CHeartbeat +*/ + { +public: + IMPORT_C static CPeriodic* New(TInt aPriority); + IMPORT_C static CPeriodic* NewL(TInt aPriority); + IMPORT_C ~CPeriodic(); + IMPORT_C void Start(TTimeIntervalMicroSeconds32 aDelay,TTimeIntervalMicroSeconds32 anInterval,TCallBack aCallBack); +protected: + IMPORT_C CPeriodic(TInt aPriority); + IMPORT_C void RunL(); +private: + TTimeIntervalMicroSeconds32 iInterval; + TCallBack iCallBack; + }; + + + + +class MBeating +/** +@publishedAll +@released + +Heartbeat timer call-back handling interface. + +The interface provides a pair of functions to handle the beating and +synchronisation of heartbeat timers. + +The CHeartbeat active object class uses an object implementing the MBeating +interface. + +@see CHeartbeat::Start +*/ + { +public: + /** + Handles a regular heartbeat timer event. + + This type of event is one where the timer completes in synchronisation + with the system clock. + */ + virtual void Beat() =0; + + /** + Synchronises the heartbeat timer with system clock. + + This function handles a heartbeat timer event where the timer completes out + of synchronisation with the system clock, (i.e. one or more heartbeats have + been missed). + */ + virtual void Synchronize() =0; + }; + + + + +class CHeartbeat : public CTimer +/** +@publishedAll +@released + +Heatbeat timer. + +This class generates regular heartbeat events on a fixed fraction of a second. +It is more accurate than a CPeriodic timer, because it provides a function +to restore timer accuracy if it gets out of synchronisation with the system +clock. + +The protected RunL() function is called when the timer completes. The RunL() +function in turn calls either the MBeating::Beat() or the MBeating::Synchronize() +functions; MBeating is specified as a parameter to the Start() function +used to start the heartbeat timer. + +The relevant MBeating function may not be called immediately after the signal +from the timer request has been generated, for the following reasons: + +1. the RunL() of another active object may be running at the time of the signal + +2. other active objects may have a higher priority than the CHeartbeat + +If no heartbeat is missed, then the Beat() function is called. + +If one or more heartbeats are missed then the Synchronize() function is called. +It is important to bear in mind that the machine might be switched off after +a few beats of the heart, and then Synchronize() will be called several days +later. It is therefore essential that synchronisation is achieved as quickly +as possible, rather than trying to catch up a tick at a time. In the context +of an analogue clock, for instance, the clock should just redraw itself with +the current time - rather than moving the hands round in steps until the time +is correct. + +CHeartbeat is an active object, derived from CActive (via CTimer). You should +be familiar with CActive in order to understand CHeartbeat behaviour, but +not necessarily with CTimer. + +@see MBeating +*/ + { +public: + IMPORT_C static CHeartbeat* New(TInt aPriority); + IMPORT_C static CHeartbeat* NewL(TInt aPriority); + IMPORT_C ~CHeartbeat(); + IMPORT_C void Start(TTimerLockSpec aLock,MBeating *aBeating); +protected: + IMPORT_C CHeartbeat(TInt aPriority); + IMPORT_C void RunL(); +private: + TTimerLockSpec iLock; + MBeating *iBeating; + }; +// + +class CServer2; + + + + +/** +@publishedAll +@released + +Represents a session (version 2) for a client thread on the server-side. + +A session acts as a channel of communication between the client and the server. +A client thread can have multiple concurrent sessions with a server. + +A session can be: +- restricted to the creating thread +- can be shared with other threads in the same process +- can be shared by all threads in the system. + +A server must define and implement a derived class. In particular, +it must provide an implementation for the ServiceL() virtual function. + +(Note that this class should be used instead of CSession) +*/ +class CSession2 : public CBase + { + friend class CServer2; +public: + IMPORT_C virtual ~CSession2() =0; +private: + IMPORT_C virtual void CreateL(); // Default method, does nothing +public: + inline const CServer2* Server() const; + IMPORT_C void ResourceCountMarkStart(); + IMPORT_C void ResourceCountMarkEnd(const RMessage2& aMessage); + IMPORT_C virtual TInt CountResources(); + + /** + Handles the servicing of a client request that has been passed + to the server. + + This function must be implemented in a derived class. The details of + the request are contained within the message. + + @param aMessage The message containing the details of the client request. + */ + virtual void ServiceL(const RMessage2& aMessage) =0; + IMPORT_C virtual void ServiceError(const RMessage2& aMessage,TInt aError); +protected: + IMPORT_C CSession2(); + IMPORT_C virtual void Disconnect(const RMessage2& aMessage); + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +public: + /** + @internalComponent + */ + enum TPanicNo {ESesCountResourcesNotImplemented=1,ESesFoundResCountHeaven}; + +private: + TInt iResourceCountMark; + TDblQueLink iLink; + const CServer2* iServer; + TAny* iSpare; + }; + +/** +@publishedAll +@released + +Abstract base class for servers (version 2). + +This is an active object. It accepts requests from client threads and forwards +them to the relevant server-side client session. It also handles the creation +of server-side client sessions as a result of requests from client threads. + +A server must define and implement a derived class. + +(Note that this class should be used instead of CServer) +*/ +class CServer2 : public CActive + { +public: + /** + Defines the set of session types that the server can create. + + A specific session type is specified when the CServer2 object is created. + */ + enum TServerType + { + /** + The session is not sharable with other threads. + */ + EUnsharableSessions = EIpcSession_Unsharable, + + /** + The session is sharable with other threads in the same process. + */ + ESharableSessions = EIpcSession_Sharable, + + /** + The session is sharable with all other threads in the system. + */ + EGlobalSharableSessions = EIpcSession_GlobalSharable, + }; +public: + IMPORT_C virtual ~CServer2() =0; + IMPORT_C TInt Start(const TDesC& aName); + IMPORT_C void StartL(const TDesC& aName); + IMPORT_C void ReStart(); + + /** + Gets a handle to the server. + + Note that the RServer2 object is classified as Symbian internal, and its + member functions cannot be acessed. However, the handle can be passed + to the RSessionBase::CreateSession() variants that take a server handle. + + @return The handle to the server. + */ + inline RServer2 Server() const { return iServer; } +protected: + inline const RMessage2& Message() const; + IMPORT_C CServer2(TInt aPriority, TServerType aType=EUnsharableSessions); + IMPORT_C void DoCancel(); + IMPORT_C void RunL(); + IMPORT_C TInt RunError(TInt aError); + IMPORT_C virtual void DoConnect(const RMessage2& aMessage); + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +private: + + /** + Creates a server-side session object. + + The session represents a communication link between a client and a server, + and its creation is initiated by the client through a call to one of + the RSessionBase::CreateSession() variants. + + A server must provide an implementation, which as a minimum should: + + - check that the version of the server is compatible with the client by + comparing the client supplied version number against the server's version + number; it should leave if there is incompatibility. + + - construct and return the server side client session object. + + @param aVersion The version information supplied by the client. + @param aMessage Represents the details of the client request that is requesting + the creation of the session. + + @return A pointer to the newly created server-side session object. + + @see User::QueryVersionSupported() + */ + IMPORT_C virtual CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const =0; + void Connect(const RMessage2& aMessage); + void DoConnectL(const RMessage2& aMessage,CSession2* volatile& aSession); +public: + + /** + @internalComponent + */ + enum TPanic + { + EBadMessageNumber, + ESessionNotConnected, + ESessionAlreadyConnected, + EClientDoesntHaveRequiredCaps, + }; + +private: + TInt iSessionType; + RServer2 iServer; + RMessage2 iMessage; + TAny* iSpare; + TDblQue iSessionQ; + +protected: + TDblQueIter iSessionIter; +private: + void Disconnect(const RMessage2& aMessage); + static void BadMessage(const RMessage2& aMessage); + static void NotConnected(const RMessage2& aMessage); + friend class CPolicyServer; + }; + + + +/** +A security policy framework built on top of the normal CServer2 class. + +The two major functions of the Policy Server framework are to check a received +message against a security policy and then to perform an action depending on +the result of this check. The exact behaviour is defined by the contents of +the TPolicy structure given in the constructor for CPolicyServer. + +The processing performed when a server receives a message are describe below. +This should aid understanding of the interaction of the TPolicy structure and +virtual member functions which may be implemented by classes derived from CPolicyServer. + +Checking the Security Policy + +On receipt of a message, the message function number is used to search the +list of ranges pointed to by TPolicy::iRanges. This yields a range +number R, which is between 0 and TPolicy::iRangeCount-1. +The policy index, X, for this range is then fetched from TPolicy::iElementsIndex[R]. +If the message is a Connect message, then X is fetched directly from TPolicy::iOnConnect +instead. + +The further action taken is determined by the value of X. +- If X==TSpecialCase::EAlwaysPass, + the message is processed as normal; either by passing it to the ServiceL() + method of a session, or, in the case of a connection message, a new session + is created. +- If X==TSpecialCase::ENotSupported, + the message is completed with KErrNotSupported. +- If X==TSpecialCase::ECustomCheck, + a call to the virtual function CustomSecurityCheckL() is made. The implementation + of this method must return one of the TCustomResult enumerations which determine + what further action is to be taken: + - TCustomResult::EPass + The message is processed as normal; either by passing it to the ServiceL() + method of a session, or, in the case of a connection message, a new session + is created. + - TCustomResult::EFail + This causes CheckFailedL() to be called with the action specified by the + aAction reference given to CustomSecurityCheckL() (This defaults to + TFailureAction::EFailClient.) + - TCustomResult::EAsync + The derived class is responsible for further processing of the message, + the Policy Server framework will do nothing more with it. +- If X < TSpecialCase::ESpecialCaseHardLimit, + X is taken as an index into the array of TPolicyElement objects pointed + to by TPolicy::iElements. The platform security attributes of the process + which sent the message being processed are checked against the security + policy specified in this TPolicyElement. If the process possesses all of + the attributes specified then the message processed as normal. Otherwise, + CheckFailedL() is called with the action value specified in the TPolicyElement . + +Handling Policy Check Failure + +The CheckFailedL() method is called when a security check has failed. It performs +an action according to the aAction value given to it: + +- If aAction==TFailureAction::EFailClient, the message is completed with + KErrPermissionDenied. +- If aAction==TFailureAction::EPanicClient, the client thread is panicked. +- If aAction < 0 a call to the virtual function CustomFailureActionL() is made. + The implementation of this method must return one of the TCustomResult + enumerations which determine what further action is to be taken: + - TCustomResult::EPass + The message is processed as normal; either by passing it to the ServiceL() + method of a session, or, in the case of a connection message, a new session + is created. + - TCustomResult::EFail + The message is completed with KErrPermissionDenied. + - TCustomResult::EAsync + The derived class is responsible for further processing of the message, + the Policy Server framework will do nothing more with it. + +@publishedAll +@released +*/ +class CPolicyServer : public CServer2 + { +public: + /** Enumeration specifying action to take if a security check fails. + Values >= 0 are handled by CheckFailedL(). Values < 0 are specific to the + derived implementation of the policy server and will result in a call to + CustomFailureActionL() if a security check fails. Attempts to use undefined + values >= 0 will result in a panic in CheckFailedL(). + */ + enum TFailureAction + { + EFailClient = 0, /**< Complete message with KErrPermissionDenied */ + EPanicClient= 1, /**< Panic client */ + }; + + /** Enumeration of acceptable return codes from both of + CustomSecurityCheckL() and CustomFailureActionL(). Results of EPass or EFail + are handled by the CPolicyServer framework. No other action is required on + the part of the derived implementation. However, results of EAsync imply + that the derived implementation will call the appropriate function once the + result is known. See CustomSecurityCheckL() and CustomFailureActionL for + more information. + */ + enum TCustomResult + { + EPass = 0, /**< Security check passed. */ + EFail = 1, /**< Security check failed. */ + EAsync = 2, /**< Security checking will be performed asynchronously. */ + }; + + /** Class specifying a security check and the action to take + + If iAction is >=0 it must be a member of TFailureAction + If iAction is <0 it is assumed to specify a custom action specific to the + derived implementation. In this case, CustomFailureActionL must be implemented + by the derived class. + */ + class TPolicyElement + { + public: + /** Security policy to check against the client which sent a message. + + This class can specify a security policy consisting of either: + + -# A check for between 0 and 7 capabilities + -# A check for a given Secure ID along with 0-3 capabilities + -# A check for a given Vendor ID along with 0-3 capabilities + + This member should only be initialised by one of the following macros: + + - _INIT_SECURITY_POLICY_PASS + - _INIT_SECURITY_POLICY_FAIL + - _INIT_SECURITY_POLICY_C1 + - _INIT_SECURITY_POLICY_C2 + - _INIT_SECURITY_POLICY_C3 + - _INIT_SECURITY_POLICY_C4 + - _INIT_SECURITY_POLICY_C5 + - _INIT_SECURITY_POLICY_C6 + - _INIT_SECURITY_POLICY_C7 + - _INIT_SECURITY_POLICY_S0 + - _INIT_SECURITY_POLICY_S1 + - _INIT_SECURITY_POLICY_S2 + - _INIT_SECURITY_POLICY_S3 + - _INIT_SECURITY_POLICY_V0 + - _INIT_SECURITY_POLICY_V1 + - _INIT_SECURITY_POLICY_V2 + - _INIT_SECURITY_POLICY_V3 + + @see TPolicy + */ + TStaticSecurityPolicy iPolicy; + + /** Action to take on failure. Either a value from TFailureAction + or a negative value which has meaning to the CustomFailureActionL() + method of a derived class. + */ + TInt iAction; + }; + + /** Special case values which can be used instead of a policy element index + contained in the array TPolicy::iElementsIndex + */ + enum TSpecialCase + { + /** Indicates a custom check should be made by calling CustomSecurityCheckL() */ + ECustomCheck =255u, + + /** Indicates that message is requesting an unsupported function. + The message is completed with KErrNotSupported. */ + ENotSupported =254u, + + /** Indicates that the message is requesting an unrestricted function + and therefore should be processed without any further checks. */ + EAlwaysPass =253u, + + ESpecialCaseLimit =252u, /**< @internalTechnology */ + ESpecialCaseHardLimit =250u /**< @internalTechnology */ + }; + + /** Object specifying which security checks to perform on each request + number and what action to take if the check fails. + + Explanations of each of the members of this class are detailed below. + + As explained in CPolicyServer::CPolicyServer, it is important that the + instance of this class (CPolicyServer::TPolicy) given to the policy + server constructor, exists for the lifetime of the server. For this + reason, as well as code size considerations, it is recommended that + the TPolicy instance is const static data. + The following code segment shows the recommended way of doing this. + Further detail on what each of these statements means is given below. + + @code + const TUint myRangeCount = 4; + const TInt myRanges[myRangeCount] = + { + 0, //range is 0-2 inclusive + 3, //range is 3-6 inclusive + 7, //range is 7 + 8, //range is 8-KMaxTInt inclusive + }; + const TUint8 myElementsIndex[myRangeCount] = + { + 1, //applies to 0th range (req num: 0-2) + CPolicyServer::ECustomCheck, //applies to 1st range (req num: 3-6) + 0, //applies to 2nd range (req num: 7) + CPolicyServer::ENotSupported, //applies to 3rd range (req num: 8-KMaxTInt) + }; + const CPolicyServer::TPolicyElement myElements[] = + { + {_INIT_SECURITY_POLICY_C1(ECapabilityDiskAdmin), CPolicyServer::EFailClient}, + {_INIT_SECURITY_POLICY_C1(ECapabilityLocation), CMyPolicyServer::EQueryUser}, + } + const CPolicySErver::TPolicy myPolicy = + { + CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass + myRangeCount, + myRanges, + myElementsIndex, + myElements, + } + @endcode + */ + class TPolicy + { + public: + /** The index into iElements, or an allowed value of TSpecialCase, + that is used to check a connection attempt . */ + TUint8 iOnConnect; + + /** Number of ranges in the iRanges array. */ + TUint16 iRangeCount; + + /** A pointer to an array of ordered ranges of request numbers. Each + element in this array refers to the starting request number of a range. + The range of the previous element is up to and including the current + element minus 1. Thus an array like: + @code + const TInt myRanges[4] = {0, 3, 7, 8}; + @endcode + means that: + - the 0th range is 0-2 (inclusive). + - the 1st range is 3-6 (inclusive). + - the 2nd range is solely request number 7. + - the 3rd range is 8-KMaxTInt (inclusive). + + Note that the all possible request numbers must be accounted for. This + implies that the first element must be 0. It also implies that the + last range goes from the that element to KMaxTint. Finally, each + element must be strictly greater than the previous element. As the + first element is 0, this clearly implies that iRanges must not contain + negative elements. + */ + const TInt* iRanges; + + /** A pointer to an array of TUint8 values specifying the appropriate action + to take for each range in iRanges. For example, the 0th element of + iElementsIndex specifies the appropriate action to take for the 0th + range in iRanges. As such, iElementsIndex must have precisely the same + number of elements as iRanges. + + The following rules apply to the value of each element in iElementsIndex: + -# Each value must be a valid index into iElements (that is, less than + the number of elements in iElements) OR a valid value from + TSpecialCase. + -# Elements' values need not follow any special ordering. + -# Elements may repeat values. + + Continuing the example from iRanges: + @code + const TInt myRanges[4] = {0, 3, 7, 8}; + const TUInt8 myElementsIndex[4] = { + 1, + CPolicyServer::ECustomCheck, + 0, + CPolicyServer::ENotSupported + }; + @endcode + This means that: + -# Requests within the first range of myRanges (request numbers 0-2) + will be checked against the policy specified by the 1st element of + iElements. + -# Requests with the the second range of myRanges (request numbers + 3-6) require a custom check to determine if they are allowed. This requires + derived server implementations to implement CustomSecurityCheckL() + -# Requests within the third range of myRanges (request number 7) will + be checked against the policy specified by the 0th element of iElements. + -# Requests within the fourth range of myRanges (request numbers + 8-KMaxTInt) will automatically be completed with KErrNotSupported by + the policy server framework. + */ + const TUint8* iElementsIndex; + + /** A pointer to an array of distinct policy elements. + + Continuing with the previous examples: + @code + const TInt myRanges[4] = {0, 3, 7, 8}; + const TUInt8 myElementsIndex[4] = { + 1, + CPolicyServer::ECustomCheck, + 0, + CPolicyServer::ENotSupported + }; + const TPolicyElement iElements[] = { + {_INIT_SECURITY_POLICY_C1(ECapabilityDiskAdmin), CPolicyServer::EFailClient}, + {_INIT_SECURITY_POLICY_C1(ECapabilityLocation), CMyPolicyServer::EQueryUser} + } + @endcode + + The instantiation of iElements specifies that: + -# Request numbers 0-2 require the Location capability. As the + iAction member of the 1st element specifies a custom action + (represented by the negative number, CMyPolicyServer::EQueryUser), + requests without Location will passed to the reimplementation of + CustomFailureActionL. + -# Request number 7 requires the DiskAdmin capability. Requestors + without DiskAdmin will have their request completed with + KErrPermissionDenied. + */ + const TPolicyElement* iElements; + }; + +public: + /** Process an accepted message which has passed its policy check. + + The message is either passed to the ServiceL() method of a session, + or, in the case of a connection message, a new session is created. + + This is called by RunL() to process a message which has passed its security + check. If the server implementation returns EAsync from either + CustomSecurityCheckL() or CustomFailureActionL(), then it is the responsibility + of the derived server implementation to call ProcessL at a later point if + the messages passes the asynchronous check. + + This function should only ever be called by derived implementations if + asynchronous security checks are in use. + */ + IMPORT_C void ProcessL(const RMessage2& aMsg); + + /** Called when a security check has failed. + + The aAction parameter determines the action taken: + - If aAction==TFailureAction::EFailClient, the message is completed with + KErrPermissionDenied. + - If aAction==TFailureAction::EPanicClient, the client thread is panicked. + - If aAction < 0 a call to the virtual function CustomFailureActionL() is made. + + This function should only ever be called by derived implementations if + asynchronous security checks are in use. + + @param aMsg The message which failed its check. + @param aAction The action to take. (See description.) + @param aMissing A list of the security attributes that were missing from + the checked process. + */ + IMPORT_C void CheckFailedL(const RMessage2& aMsg, TInt aAction, const TSecurityInfo& aMissing); + + /** Called if a leave occurs during processing of a message. The + underlying framework ensures that leaves which occur during + CSession2::ServiceL are passed to CSession2::ServiceError. Leaves occuring + prior to this (ie. during CustomSecurityCheckL() or CustomFailureActionL() ) are + completed with the leave code. + + This function should only ever be called by derived implementations if + asynchronous security checks are in use. In this case the RunError() of + that other active object must call ProcessError(). + + @param aMsg The message being processed when the leave occurred. + @param aError The leave code. + */ + IMPORT_C void ProcessError(const RMessage2& aMsg, TInt aError); + +protected: + /** Construct a policy server + + @param aPriority Active object priority for this server + @param aPolicy Reference to a policy object describing the security checks + required for each message type. The server does not make a + copy of policy, and therefore this object must exist for the + lifetime of the server. It is recommended that aPolicy + is in const static data. + @param aType Type of session sharing supported by this server + */ + IMPORT_C CPolicyServer(TInt aPriority, const TPolicy& aPolicy, TServerType aType=EUnsharableSessions); + + /** Performs a custom security check. + Derived server classes must implement this function if any element in + iElementsIndex has the value CPolicyServer::ECustomCheck. + Similarly, if CPolicyServer::ECustomCheck is not used, then this function + can be safely ignored. + + If CPolicyServer::ECustomCheck is used, there are two further cases to consider: + -# The custom security check can synchronously decide if the message + should pass. In this case, the derived implementation must simply return + either EPass or EFail depending on the result of the security check. + -# The custom security check needs to use asynchronous methods in order + to determine whether the message should procceed. In this case, these + asysnchronous methods should be started and then the EAsync value returned. + Furthermore, implmentations returning EAsync commit to the following: + - If the security check eventually passes, ProcessL() must be called with + the appropriate message. + - If the security check eventually fails, CheckFailedL() must be called + with that message. + - Pending messages on a given session need to be completed and discarded + if the session is closed. + + IMPORTANT NOTE. When processing a message asynchronously, a copy must be + made of the RMessage2 object. Saving a refernece or pointer to the original + message will produce unpredictable defects. This is because the object will + be reused for the next message that the server receives. + + In both cases, synchronous and asynchronous, the derived implementation has the + option of updating the aAction and/or aMissing parameters if that is + appropriate. + + @param aMsg The message to check. + @param aAction A reference to the action to take if the security check + fails. This is either a value from TFailureAction or a negative + value which has meaning to the CustomFailureActionL() method of + a derived class. + The policy server framework gives this value a default of + EFailClient. If a derived implementation wishes a + different value, then it should change this. + @param aMissing A reference to the list of security attributes missing + from the checked process. The policy server initialises this + object to zero (that is a sid of 0, a vid of 0, and no capabilities). + If derived implementations wish to take advantage of a list of + missing attributes in their implementation of CustomFailureActionL(), + then they should set those missing attributes here in + CustomSecurityCheckL(). + @return A value from TCustomResult. + @panic CBase 95 If the default implementation is called. + */ + IMPORT_C virtual TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing); + + /** Performs a custom action after the failure of a security check. + Derived server classes must implement this function if the aAction value + passed to CheckFailedL() is less than zero. This can happened if the policy + specified a negative number in the iAction member of any of the + TPolicyElements, or, if the derived CustomSecurityCheckL() modified the + value of aAction prior to returning. + + If negative aAction values are used, there are two further cases to consider: + -# The custom security check can synchronously decide if the message + should pass. In this case, the derived implementation must simply return + either EPass or EFail depending on the result of the security check. + -# The custom security check needs to use asynchronous methods in order + to determine whether the message should still proceed. In this case, these + asysnchronous methods should be started and then the EAsync value returned. + Furthermore, implmentations returning EAsync commit to the following: + - If the security check eventually passes, ProcessL() must be called with + the appropriate message. + - If the security check eventually fails, or if a fatal error condition occurs, + including if the previously mentioned call to ProcessL() leaves; + then CPolicyServer::ProcessError() should be called passing the message and + relevant error code. + - Pending messages on a given session need to be completed and discarded + if the session is closed. + + IMPORTANT NOTE. When processing a message asynchronously, a copy must be + made of the RMessage2 object. Saving a refernece or pointer to the original + message will produce unpredictable defects. This is because the object will + be reused for the next message that the server receives. + + The default implementation of this function panics the server. + + @param aMsg The message to check + @param aAction The custom failure action requested. + This is either a value from TFailureAction or a negative + value which has meaning to the CustomFailureActionL() method of + a derived class. + @param aMissing A const reference to the list of security attributes missing + from the checked process. There are two cases to consider: + (a) If this message was checked (and failed) by a static policy + applied by the policy server framework, aMissing will contain a + list of the security attributes that caused the policy to fail. An + completely zeroed aMissing implies that an always fail policy was + encountered. + (b) If this message was failed by a custom security check, then + aMissing will be zeroed unless the CustomSecurityCheckL() method + filled it in. + @return A value from TCustomResult. + @panic CBase 95 If the default implementation is called. + */ + IMPORT_C virtual TCustomResult CustomFailureActionL(const RMessage2& aMsg, TInt aAction, const TSecurityInfo& aMissing); + +protected: + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +private: + IMPORT_C virtual void RunL(); + IMPORT_C virtual TInt RunError(TInt aError); + const CPolicyServer::TPolicyElement* FindPolicyElement(TInt aFn, TUint& aSpecialCase) const; +private: + const TPolicy& iPolicy; + + }; + + + +class CActiveScheduler : public CBase +/** +@publishedAll +@released + +Controls the handling of asynchronous requests as represented by +active objects. + +An active scheduler is used to schedule the sequence in which active object request +completion events are handled by a single event-handling thread. + +An active scheduler can be instantiated and used directly if either: + +- the RunL() function of all of its active objects is guaranteed not to leave, or + +- each of its active objects implements a suitable RunError() function to provide suitable cleanup + +If any of the active scheduler's active objects does not provide a RunError() +function, then a CActiveScheduler derived class must be defined and an implementation +of the Error() function provided to perform the cleanup required. + +There is one active scheduler per thread and the static functions provided by the +class always refer to the current active scheduler. + +@see CActiveScheduler::Error +@see CActive +@see CActiveSchedulerWait +*/ + { + friend class CActiveSchedulerWait; +public: + struct TLoop; + typedef TLoop* TLoopOwner; +public: + IMPORT_C CActiveScheduler(); + IMPORT_C ~CActiveScheduler(); + IMPORT_C static void Install(CActiveScheduler* aScheduler); + IMPORT_C static CActiveScheduler* Current(); + IMPORT_C static void Add(CActive* aActive); + IMPORT_C static void Start(); + IMPORT_C static void Stop(); + IMPORT_C static TBool RunIfReady(TInt& aError, TInt aMinimumPriority); + IMPORT_C static CActiveScheduler* Replace(CActiveScheduler* aNewActiveScheduler); + IMPORT_C virtual void WaitForAnyRequest(); + IMPORT_C virtual void Error(TInt aError) const; + IMPORT_C void Halt(TInt aExitCode) const; + IMPORT_C TInt StackDepth() const; +private: + class TCleanupBundle + { + public: + CCleanup* iCleanupPtr; + TInt iDummyInt; + }; +private: + static void Start(TLoopOwner* aOwner); + IMPORT_C virtual void OnStarting(); + IMPORT_C virtual void OnStopping(); + IMPORT_C virtual void Reserved_1(); + IMPORT_C virtual void Reserved_2(); + void Run(TLoopOwner* const volatile& aLoop); + void DoRunL(TLoopOwner* const volatile& aLoop, CActive* volatile & aCurrentObj, TCleanupBundle* aCleanupBundle); +protected: + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +protected: + inline TInt Level() const; // deprecated +private: + TLoop* iStack; + TPriQue iActiveQ; + TAny* iSpare; + }; + + + + +class CActiveSchedulerWait : public CBase +/** +@publishedAll +@released + +Controls a single scheduling loop in the current active scheduler. + +This class provides better control of nested wait loops in the active +scheduler. + +Note that a CActiveSchedulerWait object can be used as a data member +inside other CBase derived classes. + +@see CActiveScheduler +*/ + { +public: + IMPORT_C CActiveSchedulerWait(); + IMPORT_C ~CActiveSchedulerWait(); + IMPORT_C void Start(); + IMPORT_C void AsyncStop(); + IMPORT_C void AsyncStop(const TCallBack& aCallMeWhenStopped); + inline TBool IsStarted() const; + IMPORT_C TBool CanStopNow() const; +private: + CActiveScheduler::TLoopOwner iLoop; + }; + + + + +class CleanupStack +/** +@publishedAll +@released + +A collection of static functions that are used to add resources to and remove +resources from the cleanup stack. +*/ + { +public: + IMPORT_C static void PushL(TAny* aPtr); + IMPORT_C static void PushL(CBase* aPtr); + IMPORT_C static void PushL(TCleanupItem anItem); + IMPORT_C static void Pop(); + IMPORT_C static void Pop(TInt aCount); + IMPORT_C static void PopAndDestroy(); + IMPORT_C static void PopAndDestroy(TInt aCount); + IMPORT_C static void Check(TAny* aExpectedItem); + inline static void Pop(TAny* aExpectedItem); + inline static void Pop(TInt aCount, TAny* aLastExpectedItem); + inline static void PopAndDestroy(TAny* aExpectedItem); + inline static void PopAndDestroy(TInt aCount, TAny* aLastExpectedItem); + }; + + + + +/** +@publishedAll +@released + +A utility class used by the templated function CleanupDeletePushL() to create +a TCleanupItem item that will perform a delete type operation on +the class T type object. + +@see CleanupDeletePushL() +*/ +template +class CleanupDelete + { +public: + inline static void PushL(T* aPtr); +private: + static void Delete(TAny *aPtr); + }; + + + + +/** +@publishedAll +@released + +Constructs and pushes a TCleanupItem object onto the cleanup stack. + +The TCleanupItem encapsulates: + +- the pointer aPtr to the object of type class T which is to be cleaned up + +- an associated cleanup operation. + +The cleanup operation is the private static function Delete() of the templated +class CleanupDelete, and is called as a result of a subsequent call +to CleanupStack::PopAndDestroy(). + +CleanupDelete::Delete() is passed a pointer to the class T object to be cleaned +up, and the function implements cleanup by deleting the passed object. + +An example of its use: + +@code +... +CTestOne* one = new (ELeave) CTestOne; +CleanupDeletePushL(one); +... +CleanupStack::PopAndDestroy(); // <--- results in "one" being deleted. +... +@endcode + +@param aPtr A pointer to a templated class T type object for which the cleanup item is being created. + +@see TCleanupItem +@see CleanupDelete +@see CleanupStack::PopAndDestroy() +*/ +template +inline void CleanupDeletePushL(T* aPtr); + + + + +/** +@publishedAll +@released + +A utility class used by the templated function CleanupArrayDeletePushL() to +create a TCleanupItem item that will perform a delete type operation on an +array of class T type objects. + +@see CleanupArrayDeletePushL() +*/ +template +class CleanupArrayDelete + { +public: + inline static void PushL(T* aPtr); +private: + static void ArrayDelete(TAny *aPtr); + }; + + + + +/** +@publishedAll +@released + +Constructs and pushes a TCleanupItem object onto the cleanup stack. + +The TCleanupItem encapsulates: + +- the pointer aPtr to an array of type class T objects to be cleaned up + +- an associated cleanup operation. + +The cleanup operation is the private static function ArrayDelete() of the +templated class CleanupArrayDelete, and is called as a result of +a subsequent call to CleanupStack::PopAndDestroy(). + +CleanupArrayDelete::ArrayDelete() is passed a pointer to the array of class T +objects to be cleaned up, and the function implements cleanup by deleting +the passed array using the delete [] operator. + +An example of its use: + +@code +... +RTestOne* one = new (ELeave) RTestOne [KSomeArraySize]; +CleanupArrayDeletePushL(one); +... // Do something with the object......... +CleanupStack::PopAndDestroy(); // <--- results in the array "one" being deleted. +... +@endcode + +@param aPtr A pointer to an array of class T type objects for which + the cleanup item is being created. + +@see TCleanupItem +@see CleanupArrayDelete +@see CleanupStack::PopAndDestroy() +*/ +template +inline void CleanupArrayDeletePushL(T* aPtr); + + + + +/** +@publishedAll +@released + +A utility class used by the templated function CleanupClosePushL() to create +a TCleanupItem item that will perform a close type operation on +the class T type object. + +@see CleanupClosePushL() +*/ +template +class CleanupClose + { +public: + inline static void PushL(T& aRef); +private: + static void Close(TAny *aPtr); + }; + + + + +/** +@publishedAll +@released + +Constructs and pushes a TCleanupItem object onto the cleanup stack. + +The TCleanupItem encapsulates: + +1. a reference aRef to the object of type class T which is to be cleaned up + +2. an associated cleanup operation. + +The cleanup operation is the private static function Close() of the templated +class CleanupClose and is invoked as a result of a subsequent call to +CleanupStack::PopAndDestroy(). + +CleanupClose::Close() is passed a pointer to the class T object to be cleaned +up, and the function implements cleanup by calling Close() on the passed object. +The class T object must, therefore, define and implement (or inherit) a Close() +member function. + +An example of its use: + +@code +class RTestTwo; + { +public : + ... + IMPORT_C void Close(); + ... + } +... +RTestTwo two; +CleanupClosePushL(two); +... +CleanupStack::PopAndDestroy(); // <--- results in Close() being called on "two". +...... +@endcode + +In practice, this type of cleanup operation is commonly applied to handles +to resources; if such handles are constructed on the program stack, then it is +important that such handles are closed. + +@param aRef A reference to a class T type object for which the cleanup item + is being created. + +@see TCleanupItem +@see CleanupClose +@see CleanupStack::PopAndDestroy() +*/ +template +inline void CleanupClosePushL(T& aRef); + + + + +/** +@publishedAll +@released + +A utility class used by the templated function CleanupReleasePushL() to create +a TCleanupItem item that will perform a release type operation on +the class T type object. + +@see CleanupReleasePushL() +*/ +template +class CleanupRelease + { +public: + inline static void PushL(T& aRef); +private: + static void Release(TAny *aPtr); + }; + + + + +/** +@publishedAll +@released + +Constructs and pushes a TCleanupItem object onto the cleanup stack. + +The TCleanupItem encapsulates: + +1. a reference aRef to the object of type class T which is to be cleaned up + +2. an associated cleanup operation. + +The cleanup operation is the private static function Release() of the +templated class CleanupRelease and is invoked as a result of +a subsequent call to CleanupStack::PopAndDestroy(). + +CleanupRelease::Release() is passed a pointer to the class T object to be cleaned +up, and the function implements cleanup by calling Release() on the passed object. +The class T object must, therefore, define and implement (or inherit) a Release() +member function. + +An example of its use: + +@code +class RTestThree; + { +public : + ... + IMPORT_C void Release(); + ... + } +... +RTestThree three; +CleanupReleasePushL(three); +... +CleanupStack::PopAndDestroy(); // <--- results in Release() being called on "three". +...... +@endcode + +@param aRef A reference to a class T type object for which the cleanup item + is being created. + +@see TCleanupItem +@see CleanupRelease +@see CleanupStack::PopAndDestroy() +*/ +template +inline void CleanupReleasePushL(T& aRef); + + + + +class CConsoleBase; + +/** +@publishedPartner +@released +*/ +class Console + { +public: + IMPORT_C static CConsoleBase* NewL(const TDesC& aTitle,TSize aSize); + }; + +#include + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif //__E32BASE_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32base.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32base.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,3199 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32base.inl +// +// + +// Class CBase +inline TAny* CBase::operator new(TUint aSize, TAny* aBase) __NO_THROW +/** +Initialises the object to binary zeroes. + +@param aSize The size of the derived class. This parameter is specified + implicitly by C++ in all circumstances in which a derived + class is allocated. +@param aBase Indicates a base address which is returned as the object's + address. + +@return A pointer to the base address. +*/ + { Mem::FillZ(aBase, aSize); return aBase; } + + + + +inline TAny* CBase::operator new(TUint aSize) __NO_THROW +/** +Allocates the object from the heap and then initialises its contents +to binary zeroes. + +@param aSize The size of the derived class. This parameter is specified + implicitly by C++ in all circumstances in which a derived class + is allocated. + +@return A pointer to the allocated object; NULL if memory could not + be allocated. +*/ + { return User::AllocZ(aSize); } + + + + +inline TAny* CBase::operator new(TUint aSize, TLeave) +/** +Allocates the object from the heap and then initialises its contents +to binary zeroes. + +@param aSize The size of the derived class. This parameter is specified + implicitly by C++ in all circumstances in which a derived class + is allocated. + +@return A pointer to the allocated object; the TLeave parameter indicates + that the operation leaves if allocation fails with out-of-memory. +*/ + { return User::AllocZL(aSize); } + + + + +inline TAny* CBase::operator new(TUint aSize, TUint aExtraSize) __NO_THROW +/** +Allocates the object from the heap and then initialises its contents +to binary zeroes. + +Use of this overload is rare. + +@param aSize The size of the derived class. This parameter is specified + implicitly by C++ in all circumstances in which a derived class + is allocated. + +@param aExtraSize Indicates additional size beyond the end of the base class. + +@return A pointer to the allocated object; NULL if memory could not + be allocated. +*/ + { return User::AllocZ(aSize + aExtraSize); } + + + + +inline TAny* CBase::operator new(TUint aSize, TLeave, TUint aExtraSize) +/** +Allocates the object from the heap and then initialises its contents +to binary zeroes. + +Use of this overload is rare. + +@param aSize The size of the derived class. This parameter is specified + implicitly by C++ in all circumstances in which a derived class + is allocated. + +@param aExtraSize Indicates additional size beyond the end of the base class. + +@return A pointer to the allocated object; the TLeave parameter indicates + that the operation leaves if allocation fails with out-of-memory. +*/ + { return User::AllocZL(aSize + aExtraSize); } + + + + +// Class CBufBase +inline TInt CBufBase::Size() const +/** +Gets the number of data bytes in the buffer. + +Note that the number of heap bytes used by the buffer may be greater than its +size, because there is typically extra room to allow for expansion. Use the +Compress() function to reduce the extra allocation as much as possible. + +@return The number of data bytes in the buffer. +*/ + {return(iSize);} + + + + +// Class CBufFlat +inline TInt CBufFlat::Capacity() const +/** +Gets the size to which the buffer may expand without re-allocation. + +@return The size of the allocated cell associated with the buffer. This is + the maximum size the buffer may be expanded to without re-allocation. +*/ + {return(iMaxSize);} + + + + +// Class CArrayFixBase +inline TInt CArrayFixBase::Count() const +/** +Gets the number of elements held in the array. + +@return The number of array elements +*/ + {return(iCount);} + + + + +inline TInt CArrayFixBase::Length() const +/** +Gets the length of an element. + +@return The length of an element of type class T. +*/ + {return(iLength);} + + + + +// Template class CArrayFix +template +inline CArrayFix::CArrayFix(TBufRep aRep,TInt aGranularity) + : CArrayFixBase(aRep,sizeof(T),aGranularity) +/** +@internalComponent +*/ + {} + + + + +template +inline const T &CArrayFix::operator[](TInt anIndex) const +/** +Gets a const reference to the element located at the specified position +within the array. + +Note that if a pointer to the returned referenced class T object is taken, +be aware that the pointer value becomes invalid once elements have been added +to, or removed from the array. Always refresh the pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A const reference to the required element. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((const T *)CArrayFixBase::At(anIndex)));} + + + + +template +inline T &CArrayFix::operator[](TInt anIndex) +/** +Gets a non-const reference to the element located at the specified position +within the array. + +Note that if a pointer to the returned referenced class T object is taken, +be aware that the pointer value becomes invalid once elements have been added +to, or removed from the array. Always refresh the pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A non-const reference to the required element. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((T *)CArrayFixBase::At(anIndex)));} + + + + +template +inline const T &CArrayFix::At(TInt anIndex) const +/** +Gets a const reference to the element located at the specified position +within the array. + +Note that if a pointer to the returned referenced class T object is taken, +be aware that the pointer value becomes invalid once elements have been added +to, or removed from the array. Always refresh the pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A const reference to the required element. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((const T *)CArrayFixBase::At(anIndex)));} + + + + +template +inline const T *CArrayFix::End(TInt anIndex) const +/** +Gets a pointer to the (const) first byte following the end of the +contiguous region containing the element at the specified position within +the array. + +For arrays implemented using flat buffers, the pointer always points to the +first byte following the end of the buffer. + +For arrays implemented using segmented buffers, the pointer always points +to the first byte following the end of the segment which contains the element. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element + in the array. + +@return A pointer to the constant byte following the end of the contiguous + region. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return((const T *)CArrayFixBase::End(anIndex));} + + + + +template +inline const T *CArrayFix::Back(TInt anIndex) const +/** +Gets a pointer to the (const) beginning of a contiguous region. + +For arrays implemented using flat buffers, the function always returns a +pointer to the beginning of the buffer. + +For arrays implemented using segmented buffers, the function returns a pointer +to the beginning of the segment for all elements in that segment except the +first. If the element at position anIndex is the first in a segment, then +the function returns a pointer the beginning of the previous segment. + +For the first element in the array, the function returns a NULL pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element + in the array. + +@return A pointer to the (const) beginning of the contiguous region. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return((const T *)CArrayFixBase::Back(anIndex));} + + + + +template +inline T &CArrayFix::At(TInt anIndex) +/** +Gets a non-const reference to the element located at the specified position +within the array. + +Note that if a pointer to the returned referenced class T object is taken, +be aware that the pointer value becomes invalid once elements have been added +to, or removed from the array. Always refresh the pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A non-const reference to the required element. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((T *)CArrayFixBase::At(anIndex)));} + + + + +template +inline T *CArrayFix::End(TInt anIndex) +/** +Gets a pointer to the first byte following the end of the contiguous region +containing the element at the specified position within the array. + +For arrays implemented using flat buffers, the pointer always points to the +first byte following the end of the buffer. + +For arrays implemented using segmented buffers, the pointer always points +to the first byte following the end of the segment which contains the element. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element + in the array. + +@return A pointer to the byte following the end of the contiguous region. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(((T *)CArrayFixBase::End(anIndex)));} + + + + +template +inline T *CArrayFix::Back(TInt anIndex) +/** +Gets a pointer to the beginning of a contiguous region. + +For arrays implemented using flat buffers, the function always returns a pointer +to the beginning of the buffer. + +For arrays implemented using segmented buffers, the function returns a pointer +to the beginning of the segment for all elements in that segment except the +first. If the element at position anIndex is the first in a segment, then +the function returns a pointer the beginning of the previous segment. + +For the first element in the array, the function returns a NULL pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element + in the array. + +@return A pointer to the beginning of the contiguous region. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(((T *)CArrayFixBase::Back(anIndex)));} + + + + +template +inline void CArrayFix::AppendL(const T &aRef) +/** +Appends a single element onto the end of the array. + +@param aRef A reference to the class T element to be appended. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. +*/ + {CArrayFixBase::InsertL(Count(),&aRef);} + + + + +template +inline void CArrayFix::AppendL(const T *aPtr,TInt aCount) +/** +Appends one or more elements onto the end of the array. + +@param aPtr A pointer to a contiguous set of type objects to be + appended. +@param aCount The number of contiguous objects of type located at + aPtr to be appended. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. + +@panic E32USER-CBase 23, if aCount is negative. +*/ + {CArrayFixBase::InsertL(Count(),aPtr,aCount);} + + + + +template +inline void CArrayFix::AppendL(const T &aRef,TInt aReplicas) +/** +Appends replicated copies of an element onto the end of the array. + +@param aRef A reference to the object to be replicated and appended. +@param aReplicas The number of copies of the aRef element to be appended. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. + +@panic E32USER-CBase 28 if aReplicas is negative. +*/ + {CArrayFixBase::InsertRepL(Count(),&aRef,aReplicas);} + + + + +template +inline T &CArrayFix::ExpandL(TInt anIndex) +/** +Expands the array by one element at the specified position. + +It: + +1. expands the array by one element at the specified position + +2. constructs a new element at that position + +3. returns a reference to the new element. + +All existing elements from position anIndex to the end of the array are moved +up, so that the element originally at position anIndex is now at position +anIndex + 1 etc. + +The new element of type class T is constructed at position anIndex, using +the default constructor of that class. + +@param anIndex The position within the array where the array is to be expanded + and the new class T object is to be constructed. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. + +@return A reference to the newly constructed class T object at position + anIndex within the array. + +@panic E32USER-CBase 21 if anIndex is negative or greater than the number + of elements currently in the array. +*/ + {return(*new(CArrayFixBase::ExpandL(anIndex)) T);} + + + + +template +inline T &CArrayFix::ExtendL() +/** +Expands the array by one element at the end of the array. + +It: + +1. expands the array by one element at the end of the array, i.e. at position + CArrayFixBase::Count() + +2. constructs a new element at that position + +3. returns a reference to the new element. + +The new element of type class T is constructed at the end of the array, +using the default constructor of that class. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. + +@return A reference to the newly constructed class T object at the end of + the array. + +@see CArrayFixBase::Count +*/ + {return(*new(CArrayFixBase::ExpandL(Count())) T);} + + + + +template +inline TInt CArrayFix::Find(const T &aRef,TKeyArrayFix &aKey,TInt &anIndex) const +/** +Finds the position of an element within the array, based on the matching of +keys, using a sequential search. + +The array is searched sequentially for an element whose key matches the key of the +supplied class T object. The search starts with the first element in the array. + +Note that where an array has elements with duplicate keys, the function only +supplies the position of the first element in the array with that key. + +@param aRef A reference to an object of type class T whose key is used + for comparison. +@param aKey A reference to a key object defining the properties of the key. +@param anIndex A reference to a TInt supplied by the caller. On return, if the + element is found, the reference is set to the position of that + element within the array. The position is relative to zero, + (i.e. the first element in the array is at position 0). + If the element is not found and the array is not empty, then + the value of the reference is set to the number of elements in + the array. + If the element is not found and the array is empty, then the + reference is set to zero. + +@return Zero, if the element with the specified key is found. + Non-zero, if the element with the specified key is not found. +*/ + {return(CArrayFixBase::Find(&aRef,aKey,anIndex));} + + + + +template +inline TInt CArrayFix::FindIsq(const T &aRef,TKeyArrayFix &aKey,TInt &anIndex) const +/** +Finds the position of an element within the array, based on the matching of +keys, using a binary search technique. + +The array is searched, using a binary search technique, for an element whose +key matches the key of the supplied class T object. + +The array must be in key order. + +Note that where an array has elements with duplicate keys, the function cannot +guarantee which element, with the given key value, it will return, except that +it will find one of them. + +@param aRef A reference to an object of type class T whose key is used + for comparison. +@param aKey A reference to a key object defining the properties of the key. +@param anIndex A reference to a TInt supplied by the caller. On return, if the + element is found, the reference is set to the position of that + element within the array. The position is relative to zero, + (i.e. the first element in the array is at position 0). + If the element is not found and the array is not empty, then the + reference is set to the position of the first element in the + array with a key which is greater than the key of the + object aRef. + If the element is not found and the array is empty, then the + reference is set to zero. + +@return Zero, if the element with the specified key is found. + Non-zero, if the element with the specified key is not found. +*/ + {return(CArrayFixBase::FindIsq(&aRef,aKey,anIndex));} + + + + +template +inline void CArrayFix::InsertL(TInt anIndex,const T &aRef) +/** +Inserts an element into the array at the specified position. + +Note that passing a value of anIndex which is the same as the current number +of elements in the array, has the effect of appending the element. + +@param anIndex The position within the array where the element is to be + inserted. The position is relative to zero, i.e. zero implies + that elements are inserted at the beginning of the array. + +@param aRef A reference to the class T object to be inserted into the array + at position anIndex. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. + +@panic E32USER-CBase 21 if anIndex is negative, or is greater than the number + of elements currently in the array. +*/ + {CArrayFixBase::InsertL(anIndex,&aRef);} + + + + +template +inline void CArrayFix::InsertL(TInt anIndex,const T *aPtr,TInt aCount) +/** +Inserts one or more elements into the array at the specified position. + +The objects to be added must all be contiguous. + +Note that passing a value of anIndex which is the same as the current number +of elements in the array, has the effect of appending the element. + +@param anIndex The position within the array where the elements are to be + inserted. The position is relative to zero, i.e. zero implies + that elements are inserted at the beginning of the array. + +@param aPtr A pointer to the first of the contiguous elements of type + class T to be inserted into the array at position anIndex. + +@param aCount The number of contiguous elements of type class T located at + aPtr to be inserted into the array. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. + +@panic E32USER-CBase 21 if anIndex is negative or is greater than the number + of elements currently in the array. +@panic E32USER-CBase 23 if aCount is negative. +*/ + {CArrayFixBase::InsertL(anIndex,aPtr,aCount);} + + + + +template +inline void CArrayFix::InsertL(TInt anIndex,const T &aRef,TInt aReplicas) +/** +Inserts replicated copies of an element into the array at the specified +position. + +Note that passing a value of anIndex which is the same as the current number +of elements in the array, has the effect of appending the element. + + +@param anIndex The position within the array where elements are to be + inserted. The position is relative to zero, i.e. zero implies + that elements are inserted at the beginning of the array. + +@param aRef A reference to the class T object to be replicated and + inserted into the array at position anIndex. + +@param aReplicas The number of copies of the aRef element to be inserted into + the array. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. + +@panic E32USER-CBase 21, if anIndex is negative or is greater than the number + of elements currently in the array. +@panic E32USER-CBase 28, if aReplicas is negative. +*/ + {CArrayFixBase::InsertRepL(anIndex,&aRef,aReplicas);} + + + + +template +inline TInt CArrayFix::InsertIsqL(const T &aRef,TKeyArrayFix &aKey) +/** +Inserts a single element into the array at a position determined by a key. + +The array MUST already be in key sequence (as defined by the key), otherwise +the position of the new element is unpredictable, or duplicates may occur. + +Elements with duplicate keys are not permitted. + +@param aRef A reference to the element of type to be inserted into + the array. +@param aKey A reference to a key object defining the properties of the key. + +@return The position within the array of the newly inserted element. + +@leave KErrAlreadyExists An element with the same key already exists within + the array. NB the array MUST already be in key sequence, otherwise + the function may insert a duplicate and fail to leave with + this value. +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. +*/ + {return(CArrayFixBase::InsertIsqL(&aRef,aKey));} + + + + +template +inline TInt CArrayFix::InsertIsqAllowDuplicatesL(const T &aRef,TKeyArrayFix &aKey) +/** +Inserts a single element into the array at a position determined by a key, +allowing duplicates. + +The array MUST already be in key sequence (as defined by the key), otherwise +the position of the new element is unpredictable. + +If the new element's key is a duplicate of an existing element's key, then +the new element is positioned after the existing element. + +@param aRef A reference to the element of type to be inserted into + the array. +@param aKey A reference to a key object defining the properties of the key. + +@return The position within the array of the newly inserted element. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. +*/ + {return(CArrayFixBase::InsertIsqAllowDuplicatesL(&aRef,aKey));} + + + + +template +inline void CArrayFix::ResizeL(TInt aCount) +/** +Changes the size of the array so that it contains the specified number +of elements. + +The following describes the effects of calling this function: + +1. If aCount is less than the current number of elements in the array, then the + array is shrunk. The elements at positions aCount and above are discarded. + The array buffer is not compressed. + +2. If aCount is greater than the current number of elements in the array, then + the array is extended. + +3. New elements are replicated copies of an object of type , + constructed using the default constructor of that class. + +The new elements are positioned after the existing elements in the array. + +The function may attempt to expand the array buffer. If there is insufficient +memory available, the function leaves. The leave code is one of the system +wide error codes. If the function leaves, the array is left in the state it +was in before the call. + +@param aCount The number of elements the array is to contain after the resizing + operation. + +@panic E32USER-CBase 24, if aCount is negative. +*/ + {TUint8 b[sizeof(T)]; new(&b[0]) T; CArrayFixBase::ResizeL(aCount,&b[0]);} + + + + +template +inline void CArrayFix::ResizeL(TInt aCount,const T &aRef) +/** +Changes the size of the array so that it contains the specified number +of elements. + +The following describes the effects of calling this function: + +1. If aCount is less than the current number of elements in the array, then the + array is shrunk. The elements at positions aCount and above are discarded. + The array buffer is not compressed. + +2. If aCount is greater than the current number of elements in the array, then + the array is extended. + +3. New elements are replicated copies of aRef. + +The new elements are positioned after the existing elements in the array. + +The function may attempt to expand the array buffer. If there is insufficient +memory available, the function leaves. The leave code is one of the system +wide error codes. If the function leaves, the array is left in the state it +was in before the call. + +@param aCount The number of elements the array is to contain after the resizing + operation. + +@param aRef A reference to an object of type , copies of which are + used as the new elements of the array, if the array is extended. + +@panic E32USER-CBase 24, if aCount is negative. +*/ + {CArrayFixBase::ResizeL(aCount,&aRef);} + + + + +template +inline const TArray CArrayFix::Array() const +/** +Constructs and returns a TArray object. + +@return A TArray object representing this array. +*/ + {return(TArray(CountR,AtR,this));} + + + + +inline CArrayFix::CArrayFix(TBufRep aRep,TInt aRecordLength,TInt aGranularity) + : CArrayFixBase(aRep,aRecordLength,aGranularity) +/** +@internalComponent +*/ + {} + + + + +inline const TAny *CArrayFix::At(TInt anIndex) const +/** +Gets a pointer to the untyped element located at the specified position +within the array. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in the + array. + +@return A pointer to the untyped element located at position anIndex within + the array. + +@panic E32User-CBase 21, if anIndex is negative or is greater than or equal + to the number of objects currently within the array. +*/ + {return(CArrayFixBase::At(anIndex));} + + + + +inline const TAny *CArrayFix::End(TInt anIndex) const +/** +Gets a pointer to the first byte following the end of the contiguous region +containing the element at the specfied position within the array. + +For flat buffers, the pointer always points to the first byte following the +end of the buffer. + +For segmented buffers, the pointer always points to the first byte following +the end of the segment which contains the element. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A pointer to the byte following the end of the contiguous region. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + the number of objects currently within the array. +*/ + {return(CArrayFixBase::End(anIndex));} + + + + +inline const TAny *CArrayFix::Back(TInt anIndex) const +/** +Gets a pointer to the beginning of a contiguous region. + +For flat buffers, the function always returns a pointer to the beginning of +the buffer. + +For segmented buffers, the function returns a pointer to the beginning of +the segment for all elements in that segment except the first. If the element +at the specified position is the first in a segment, then the function returns +a pointer the beginning of the previous segment. + +For the first element in the array, the function returns a NULL pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in the array. + +@return A pointer to the beginning of the contiguous region. + +@panic E32User-CBase 21, if anIndex is negative or is greater than or equal to + the number of objects currently within the array. +*/ + {return(CArrayFixBase::Back(anIndex));} + + + + +inline TAny *CArrayFix::At(TInt anIndex) +/** +Gets a pointer to the untyped element located at the specified position +within the array. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in the + array. + +@return A pointer to the untyped element located at position anIndex within + the array. + +@panic E32User-CBase 21, if anIndex is negative or is greater than or equal + to the number of objects currently within the array. +*/ + {return(CArrayFixBase::At(anIndex));} + + + + +inline TAny *CArrayFix::End(TInt anIndex) +/** +Gets a pointer to the first byte following the end of the contiguous region +containing the element at the specfied position within the array. + +For flat buffers, the pointer always points to the first byte following the +end of the buffer. + +For segmented buffers, the pointer always points to the first byte following +the end of the segment which contains the element. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A pointer to the byte following the end of the contiguous region. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + the number of objects currently within the array. +*/ + {return(CArrayFixBase::End(anIndex));} + + + + +inline TAny *CArrayFix::Back(TInt anIndex) +/** +Gets a pointer to the beginning of a contiguous region. + +For flat buffers, the function always returns a pointer to the beginning of +the buffer. + +For segmented buffers, the function returns a pointer to the beginning of +the segment for all elements in that segment except the first. If the element +at the specified position is the first in a segment, then the function returns +a pointer the beginning of the previous segment. + +For the first element in the array, the function returns a NULL pointer. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in the array. + +@return A pointer to the beginning of the contiguous region. + +@panic E32User-CBase 21, if anIndex is negative or is greater than or equal to + the number of objects currently within the array. +*/ + {return(CArrayFixBase::Back(anIndex));} + + + + +inline void CArrayFix::AppendL(const TAny *aPtr) +/** +Appends the specified untyped element onto the end of the array. + +@param aPtr A pointer to an untyped element to be appended. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. +*/ + {CArrayFixBase::InsertL(Count(),aPtr);} + + + + +inline void CArrayFix::AppendL(const TAny *aPtr,TInt aCount) +/** +Appends one or more untyped elements onto the end of the array. + +@param aPtr A pointer to the first of the contiguous untyped elements to be + appended. +@param aCount The number of contiguous elements located at aPtr to be appended. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. +@panic E32USER-CBase 23, if aCount is negative. +*/ + {CArrayFixBase::InsertL(Count(),aPtr,aCount);} + + + + +inline TAny *CArrayFix::ExtendL() +/** +Expands the array by the length of one element at the end of the array and +returns a pointer to this new location. + +As elements are untyped, no construction is possible and the content of the +new location remains undefined. + +@return A pointer to the new element location at the end of the array. + +@leave KErrNoMemory The function may attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case the array is left in the state it was in before the call. +*/ + {return(CArrayFixBase::ExpandL(Count()));} + + + + +// Template class CArrayFixFlat +template +inline CArrayFixFlat::CArrayFixFlat(TInt aGranularity) + : CArrayFix((TBufRep)CBufFlat::NewL,aGranularity) +/** +Constructs a flat array of fixed length objects with the specified granularity. + +The length of all array elements is the length of the class passed as the +template parameter. The length must be non-zero. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 17, if the length of the class implied by the template parameter is zero. + +@panic E32USER-CBase 18, if aGranularity is not positive. +*/ + {} + + + + +template +inline void CArrayFixFlat::SetReserveL(TInt aCount) +/** +Reserves space in the array buffer. + +If necessary, the array buffer is allocated or re-allocated so that it can +accommodate the specified number of elements. + +After a successful call to this function, elements can be added to the array +and the process is guaranteed not to fail for lack of memory - provided the +total number of elements does not exceed the number specified in this function. + +This function does not increase the number of elements in the array; i.e. +the member function CArrayFixBase::Count() returns the same value both before +and after a call to CArrayFixFlat::SetReserveL(). + +@param aCount The total number of elements for which space is to be reserved. + +@panic E32USER-CBase 27, if aCount is less than the current number of elements + in the array. +*/ + {this->SetReserveFlatL(aCount);} + + + + +inline CArrayFixFlat::CArrayFixFlat(TInt aRecordLength,TInt aGranularity) + : CArrayFix((TBufRep)CBufFlat::NewL,aRecordLength,aGranularity) +/** +Constructs a flat array of fixed length objects with the specified granularity +to contain elements of the specified length. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aRecordLength The length of the elements of this fixed length array. +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 17, if aRecordLength is not positive. +@panic E32USER-CBase 18, if aGranularity is not positive. +*/ + {} + + + + +inline void CArrayFixFlat::SetReserveL(TInt aCount) +/** +Reserves space in the array buffer. + +If necessary, the array buffer is allocated or re-allocated so that it can +accommodate the specified number of elements. + +After a successful call to this function, elements can be added to the array +and the process is guaranteed not to fail for lack of memory - provided the +total number of elements does not exceed the specified number. + +This function does not increase the number of elements in the array; i.e. +the member function CArrayFixBase::Count() returns the same value both before +and after a call to this function. + +@param aCount The total number of elements for which space is to be reserved. + +@panic E32USER-CBase 27, if aCount is less than the current number of elements + in the array. +*/ + {SetReserveFlatL(aCount);} + + + + +inline void CArrayFixFlat::SetReserveL(TInt aCount) +/** +Reserves space in the array buffer. + +If necessary, the array buffer is allocated or re-allocated so that it can +accommodate the specified number of TInt elements. + +After a successful call to this function, elements can be added to the array +and the process is guaranteed not to fail for lack of memory - provided the +total number of elements does not exceed the specified number. + +This function does not increase the number of elements in the array; i.e. +the member function CArrayFixBase::Count() returns the same value both before +and after a call to this function. + +@param aCount The total number of elements for which space is to be reserved. + +@panic E32USER-CBase 27, if aCount is less than the current number of elements + in the array. +*/ + {SetReserveFlatL(aCount);} + + + + +inline void CArrayFixFlat::SetReserveL(TInt aCount) +/** +Reserves space in the array buffer. + +If necessary, the array buffer is allocated or re-allocated so that it can +accommodate the specified number of TUid elements. + +After a successful call to this function, elements can be added to the array +and the process is guaranteed not to fail for lack of memory - provided the +total number of elements does not exceed the specified number. + +This function does not increase the number of elements in the array; i.e. +the member function CArrayFixBase::Count() returns the same value both before +and after a call to this function. + +@param aCount The total number of elements for which space is to be reserved. + +@panic E32USER-CBase 27, if aCount is less than the current number of elements + in the array. +*/ + {SetReserveFlatL(aCount);} + + + + +// Template class CArrayFixSeg +template +inline CArrayFixSeg::CArrayFixSeg(TInt aGranularity) + : CArrayFix((TBufRep)CBufSeg::NewL,aGranularity) +/** +Constructs a segmented array of fixed length objects with the specified +granularity. + +The length of all array elements is the length of the class passed as the +template parameter. The length must be non-zero. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 17, if the length of the class implied by the template + parameter is zero. +@panic E32USER-CBase 18, if aGranularity is not positive. +*/ + {} + + + + +inline CArrayFixSeg::CArrayFixSeg(TInt aRecordLength,TInt aGranularity) + : CArrayFix((TBufRep)CBufSeg::NewL,aRecordLength,aGranularity) +/** +Constructs a segmented array of fixed length objects with the specified +granularity to contain elements of the specified length. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aRecordLength The length of the elements of this array. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 17, if aRecordLength is not positive. +@panic E32USER-CBase 18, if aGranularity is not positive. +*/ + {} + + + + +// Template class CArrayPtr +template +inline CArrayPtr::CArrayPtr(TBufRep aRep,TInt aGranularity) + : CArrayFix(aRep,aGranularity) +/** +@internalComponent +*/ + {} + + + + +template +void CArrayPtr::ResetAndDestroy() +/** +Destroys all objects whose pointers form the elements of the array, before +resetting the array. + +The destructor of each class T object is called before the objects themselves +are destroyed. + +If the array is not empty, this member function must be called before the +array is deleted to prevent the CBase derived objects from being orphaned +on the heap. + +Note that each call to this function results in a small, but non-trivial, +amount of code being generated. +*/ + { + for (TInt i=0;iCount();++i) + delete this->At(i); + this->Reset(); + } + + + + +// Template class CArrayPtrFlat +template +inline CArrayPtrFlat::CArrayPtrFlat(TInt aGranularity) + : CArrayPtr((TBufRep)CBufFlat::NewL,aGranularity) +/** +Constructs a flat array of pointers with specified granularity. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 18, if aGranularity is not positive. +*/ + {} + + + + +template +inline void CArrayPtrFlat::SetReserveL(TInt aCount) +/** +Reserves space in the array buffer. + +If necessary, the array buffer is allocated or re-allocated so that it can +accommodate the specified number of elements. + +After a successful call to this function, elements can be added to the array +and the process is guaranteed not to fail for lack of memory - provided the +total number of elements does not exceed the specified number. + +This function does not increase the number of elements in the array; i.e. +the member function CArrayFixBase::Count() returns the same value both before +and after a call to this function. + +@param aCount The total number of elements for which space is to be reserved. + +@panic E32USER-CBase 27, if aCount is less than the current number of elements + in the array. +*/ + {this->SetReserveFlatL(aCount);} + + + + +// Template class CArrayPtrSeg +template +inline CArrayPtrSeg::CArrayPtrSeg(TInt aGranularity) + : CArrayPtr((TBufRep)CBufSeg::NewL,aGranularity) +/** +Constructs a segmented array of pointers with specified granularity. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 18, if aGranularity is not positive. +*/ + {} + + + + +// Class CArrayVarBase +inline TInt CArrayVarBase::Count() const +/** +Gets the number of elements held in the array. + +@return The number of array elements. +*/ + {return(iCount);} + + + + +// Template class CArrayVar +template +inline CArrayVar::CArrayVar(TBufRep aRep,TInt aGranularity) + : CArrayVarBase(aRep,aGranularity) +/** +@internalComponent +*/ + {} + + + + +template +inline const T &CArrayVar::operator[](TInt anIndex) const +/** +Gets a reference to the const element located at the specified position +within the array. + +The compiler uses this variant of the function if the returned reference is +used in an expression where it cannot be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + +@return A const reference to the element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((const T *)CArrayVarBase::At(anIndex)));} + + + + +template +inline T &CArrayVar::operator[](TInt anIndex) +/** +Gets a reference to the element located at the specified position within +the array. + +The compiler uses this variant of the function if the returned reference is +used in an expression where it can be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + + +@return A reference to the non-const element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((T *)CArrayVarBase::At(anIndex)));} + + + + +template +inline const T &CArrayVar::At(TInt anIndex) const +/** +Gets a reference to the const element located at the specified position +within the array. + +The compiler uses this variant of the function if the returned reference is +used in an expression where it cannot be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + +@return A const reference to the element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((const T *)CArrayVarBase::At(anIndex)));} + + + +template +inline T &CArrayVar::At(TInt anIndex) +/** +Gets a reference to the element located at the specified position within +the array. + +The compiler uses this variant of the function if the returned reference is +used in an expression where it can be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + +@return A reference to the non-const element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(*((T *)CArrayVarBase::At(anIndex)));} + + + + +template +inline void CArrayVar::AppendL(const T &aRef,TInt aLength) +/** +Appends an element of a specified length onto the array. + +@param aRef A reference to the element to be appended. +@param aLength The length of the element to be appended. + +@leave KErrNoMemory The function always attempts to allocate a cell to + contain the new element and may also attempt to expand the array buffer. + If there is insufficient memory available, the function leaves, in which + case, the array is left in the state it was in before the call. + +@panic E32USER-CBase 30, if aLength is negative. +*/ + {CArrayVarBase::InsertL(Count(),&aRef,aLength);} + + + + +template +inline T &CArrayVar::ExpandL(TInt anIndex,TInt aLength) +/** +Expands the array by one element of specified length at the specified position. + +It: + +1. expands the array by one element position anIndex + +2. constructs a new element of specified length at that position + +3. returns a reference to the new element. + +All existing elements from position anIndex to the end of the array are moved +up, so that the element originally at position anIndex is now at position +anIndex + 1 etc. + +The new element of type and length aLength is constructed at position +anIndex, using the default constructor of that class. + +@param anIndex The position within the array where the array is to be expanded + and the new object is to be constructed. + +@param aLength The length of the new element. + +@return A reference to the newly constructed object at position + anIndex within the array. + +@leave KErrNoMemory The function always attempts to allocate a cell to contain + the new element and may also attempt to expand the array buffer. If there + is insufficient memory available, the function leaves, in which case, the + array is left in the state it was in before the call. + +@panic E32USER-CBase 21, if anIndex is negative or is greater than the number + of elements currently in the array. +@panic E32USER-CBase 30, if aLength is negative. +*/ + {return(*new(CArrayVarBase::ExpandL(anIndex,aLength)) T);} + + + + +template +inline T &CArrayVar::ExtendL(TInt aLength) +/** +Expands the array by one element of specified length at the end of the array. + +It: + +1. expands the array by one element at the end of the array, i.e. at position + CArrayVarBase::Count() + +2. constructs a new element of specified length at that position. + +3. returns a reference to the new element. + +The new element of type is constructed at the end of the array, +using the default constructor of that class. + +@param aLength The length of the new element. + +@return A reference to the newly constructed object at the end of + the array. + +@leave KErrNoMemory The function always attempts to allocate a cell to contain + the new element and may also attempt to expand the array buffer. If there + is insufficient memory available, the function leaves, in which case, the + array is left in the state it was in before the call. + +@panic E32USER-CBase 30, if aLength is negative. +*/ + {return(*new(CArrayVarBase::ExpandL(Count(),aLength)) T);} + + + + +template +inline TInt CArrayVar::Find(const T &aRef,TKeyArrayVar &aKey,TInt &anIndex) const +/** +Finds the position of an element within the array, based on the matching of +keys, using a sequential search. + +The array is searched sequentially for an element whose key matches the key +of the supplied object. The search starts with the first element in the array. + +Note that where an array has elements with duplicate keys, the function only +supplies the position of the first element in the array with that key. + +@param aRef A reference to an object of type whose key is used + for comparison. +@param aKey A reference to a key object defining the properties of the key. +@param anIndex A TInt supplied by the caller. On return, if the element is + found, this is set to the position of that element + within the array. The position is relative to zero, (i.e. + the first element in the array is at position 0). + If the element is not found or the array is empty, then + this is undefined. + +@return Zero, if the element with the specified key is found. Non-zero, if + the element with the specified key is not found. +*/ + {return(CArrayVarBase::Find(&aRef,aKey,anIndex));} + + + + +template +inline TInt CArrayVar::FindIsq(const T &aRef,TKeyArrayVar &aKey,TInt &anIndex) const +/** +Finds the position of an element within the array, based on the matching of +keys, using a binary search technique. + +The array is searched, using a binary search technique, for an element whose +key matches the key of the supplied object. + +The array must be in key order. + +Note that where an array has elements with duplicate keys, the function cannot +guarantee which element, with the given key value, it will return, except that +it will find one of them. + +@param aRef A reference to an object of type whose key is used + for comparison. +@param aKey A reference to a key object defining the properties of the key. +@param anIndex A TInt supplied by the caller. On return, if the element is + found, this is set to the position of that element within + the array. The position is relative to zero, (i.e. + the first element in the array is at position zero). + If the element is not found and the array is not empty, then + this is set to the position of the first element in the array + with a key which is greater than the key of the object aRef. + If the element is not found and the array is empty, then + this is undefined. + +@return Zero, if the element with the specified key is found or the array is + empty. Non-zero, if the element with the specified key is not found. +*/ + {return(CArrayVarBase::FindIsq(&aRef,aKey,anIndex));} + + + + +template +inline void CArrayVar::InsertL(TInt anIndex,const T &aRef,TInt aLength) +/** +Inserts an element of a specified length into the array at the specified +position. + +Note that passing a value of anIndex which is the same as the current number +of elements in the array, has the effect of appending that element. + +@param anIndex The position within the array where the element is to be + inserted. The position is relative to zero, i.e. zero implies + that elements are inserted at the beginning of the array. +@param aRef A reference to the object to be inserted into + the array. +@param aLength The length of the element to be inserted into the array. + +@leave KErrNoMemory The function always attempts to allocate a cell to contain + the new element and may also attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case, the array is left in the state it was in before the call. + +@panic E32USER-CBase 21, if anIndex is negative or is greater than the number + of objects currently in the array. +@panic E32USER-CBase 30, if aLength is is negative. +*/ + {CArrayVarBase::InsertL(anIndex,&aRef,aLength);} + + + + +template +inline TInt CArrayVar::InsertIsqL(const T &aRef,TInt aLength,TKeyArrayVar &aKey) +/** +Inserts a single element of a specified length into the array at a position +determined by a key. + +The array MUST already be in key sequence (as defined by the key), otherwise +the position of the new element is unpredictable, or duplicates may occur. + +Elements with duplicate keys are not permitted. + +@param aRef A reference to the element of type to be inserted into + the array. +@param aLength The length of the new element of type to be inserted + into the array. +@param aKey A reference to a key object defining the properties of the key. + +@return The position within the array of the newly inserted element. + +@leave KErrAlreadyExists An element with the same key already exists within + the array. NB the array MUST already be in key sequence, otherwise + the function may insert a duplicate and fail to leave with + this value. +@leave KErrNoMemory The function always attempts to allocate a cell to contain + the new element and may also attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case, the array is left in the state it was in before the call. +*/ + {return(CArrayVarBase::InsertIsqL(&aRef,aLength,aKey));} + + + + +template +inline TInt CArrayVar::InsertIsqAllowDuplicatesL(const T &aRef,TInt aLength,TKeyArrayVar &aKey) +/** +Inserts a single element of a specified length into the array at a position +determined by a key, allowing duplicates. + +The array MUST already be in key sequence, otherwise the position of the +new element is unpredictable. + +Elements with duplicate keys are permitted. If the new element's key is a +duplicate of an existing element's key, then the new element is positioned +after the existing element. + +@param aRef A reference to the element of type to be inserted + into the array. +@param aLength The length of the new element to be inserted into the array. +@param aKey A reference to a key object defining the properties of the key. + +@return The position within the array of the newly inserted element. + +@leave KErrNoMemory The function always attempts to allocate a cell to contain + the new element and may also attempt to expand the array buffer. If + there is insufficient memory available, the function leaves, in which + case, the array is left in the state it was in before the call. +*/ + {return(CArrayVarBase::InsertIsqAllowDuplicatesL(&aRef,aLength,aKey));} + + + + +template +inline const TArray CArrayVar::Array() const +/** +Constructs and returns a TArray object. + +@return A TArray object for this array. +*/ + {return(TArray(CountR,AtR,this));} + + + + +inline const TAny *CArrayVar::At(TInt anIndex) const +/** +Returns a pointer to the untyped element located at the specified position +within the array. + +The compiler uses this variant of the function if the returned pointer is +used in an expression where it cannot be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + +@return A pointer to the const element located at position anIndex within the + array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(CArrayVarBase::At(anIndex));} + + + + +inline CArrayVar::CArrayVar(TBufRep aRep,TInt aGranularity) + : CArrayVarBase(aRep,aGranularity) +/** +Constructs a variable array with the specified granularity and buffer +organization. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aRep A pointer to a function used to expand the array buffer. + The organisation of the array buffer is implied by the + choice of this function. + For a flat array buffer, pass (TBufRep)CBufFlat::NewL. + For a segmented array buffer, pass (TBufRep)CBufSeg::NewL. +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 19, if aGranularity is not positive. +*/ + {} + + + + +inline TAny *CArrayVar::At(TInt anIndex) +/** +Returns a pointer to the untyped element located at the specified position +within the array. + +The compiler uses this variant of the function if the returned pointer is +used in an expression where it can be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + +@return A pointer to the non-const element located at position anIndex within the + array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to the + number of objects currently within the array. +*/ + {return(CArrayVarBase::At(anIndex));} + + + + +inline void CArrayVar::AppendL(const TAny *aPtr,TInt aLength) +/** +Appends an untyped element of specified length onto the end of the array. + +@param aPtr A pointer to an untyped element to be appended. +@param aLength The length of the untyped element. +*/ + {CArrayVarBase::InsertL(Count(),aPtr,aLength);} + + + + +inline TAny *CArrayVar::ExtendL(TInt aLength) +/** +Extends the array by one element of specified length at the end of the array, +i.e. at position CArrayVarBase::Count(), and returns a pointer to the new +element location. + +As elements are untyped, no construction is possible and the content of the +new location remains undefined. + +Note that the function always attempts to allocate a cell to contain the new +element and may also attempt to expand the array buffer. If there is +insufficient memory available, the function leaves. +The leave code is one of the system wide error codes. +If the function leaves, the array is left in the state it was in before +the call. + +@param aLength The length of the new element. + +@return A pointer to the new element location at the end of the array. +*/ + {return(CArrayVarBase::ExpandL(Count(),aLength));} + + + + +// Template class CArrayVarFlat +template +inline CArrayVarFlat::CArrayVarFlat(TInt aGranularity) + : CArrayVar((TBufRep)CBufFlat::NewL,aGranularity) +/** +Constructs a variable flat array with specified granularity. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 19, if aGranularity is not positive. +*/ + {} + + + + +// Template class CArrayVarSeg +template +inline CArrayVarSeg::CArrayVarSeg(TInt aGranularity) + : CArrayVar((TBufRep)CBufSeg::NewL,aGranularity) +/** +Constructs a variable segmented array with specified granularity. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 19, if aGranularity is not positive. +*/ + {} + + + + +// Class CArrayPakBase +inline TInt CArrayPakBase::Count() const +/** +Gets the number of elements held in the array. + +@return The number of array elements. +*/ + {return(iCount);} + + + + +// Template class CArrayPak +template +inline CArrayPak::CArrayPak(TBufRep aRep,TInt aGranularity) + : CArrayPakBase(aRep,aGranularity) +/** +@internalComponent +*/ + {} + + + + +template +inline const T &CArrayPak::operator[](TInt anIndex) const +/** +Gets a reference to the element located at the specified position within the +array. + +The compiler uses this variant of the function when the returned reference +is used in an expression where it cannot be modified. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A const reference to the element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + number of objects currently within the array. +*/ + {return(*((const T *)CArrayPakBase::At(anIndex)));} + + + + +template +inline T &CArrayPak::operator[](TInt anIndex) +/** +Gets a reference to the element located at the specified position within the +array. + +The compiler uses this variant of the function when the returned reference +is used in an expression where it can be modified. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A non-const reference to the element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + number of objects currently within the array. +*/ + {return(*((T *)CArrayPakBase::At(anIndex)));} + + + + +template +inline const T &CArrayPak::At(TInt anIndex) const +/** +Gets a reference to the element located at the specified position within the +array. + +The compiler uses this variant of the function when the returned reference +is used in an expression where it cannot be modified. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A const reference to the element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + number of objects currently within the array. +*/ + {return(*((const T *)CArrayPakBase::At(anIndex)));} + + + + +template +inline T &CArrayPak::At(TInt anIndex) +/** +Gets a reference to the element located at the specified position within the +array. + +The compiler uses this variant of the function when the returned reference +is used in an expression where it can be modified. + +@param anIndex The position of the element within the array. The position + is relative to zero; i.e. zero implies the first element in + the array. + +@return A non-const reference to the element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + number of objects currently within the array. +*/ + {return(*((T *)CArrayPakBase::At(anIndex)));} + + + + +template +inline void CArrayPak::AppendL(const T &aRef,TInt aLength) +/** +Appends an element of a specified length onto the array. + +@param aRef A reference to the class T element to be appended. +@param aLength The length of the element to be appended. + +@leave KErrNoMemory The function attempted to allocate from the heap and there + is insufficient memory available. In this case, the array is left in + the state it was in before the call. + +@panic E32USER-CBase 30, if aLength is negative. +*/ + {CArrayPakBase::InsertL(Count(),&aRef,aLength);} + + + + +template +inline T &CArrayPak::ExpandL(TInt anIndex,TInt aLength) +/** +Expands the array by one element of specified length at the specified position. + +It: + +1. expands the array by one element at the specified position. + +2. constructs a new element of specified length at that position. + +3. returns a reference to the new element. + +All existing elements from position anIndex to the end of the array are moved +up, so that the element originally at position anIndex is now at position +anIndex + 1 etc. + +The new element of type and length aLength is constructed at position +anIndex, using the default constructor of that class. + +@param anIndex The position within the array where the array is to be expanded + and the new object is to be constructed. +@param aLength The length of the new element. + +@return A reference to the newly constructed object at position + anIndex within the array. + +@leave KErrNoMemory The function attempted to allocate from the heap and there + is insufficient memory available. In this case, the array is left in the + state it was in before the call. + +@panic E32USER-CBase 21, if anIndex is negative or greater than the number of + elements currently in the array. +@panic E32USER-CBase 30, if aLength is negative. +*/ + {return(*new(CArrayPakBase::ExpandL(anIndex,aLength)) T);} + + + + +template +inline T &CArrayPak::ExtendL(TInt aLength) +/** +Expands the array by one element of specified length at the end of the array. + +It: + +1. expands the array by one element at the end of the array, i.e. at position + CArrayPakbase::Count(). + +2. constructs a new element of length aLength at that position. + +3. returns a reference to the new element. + +The new element of type is constructed at the end of the array, +using the default constructor of that class. + +@param aLength The length of the new element. + +@return A reference to the newly constructed object at the end of + the array. + +@leave KErrNoMemory The function attempted to allocate from the heap and there + is insufficient memory available. In this case, the array is left in the + state it was in before the call. + +@panic E32USER-CBase 30, if aLength is negative. +*/ + {return(*new(CArrayPakBase::ExpandL(Count(),aLength)) T);} + + + + +template +inline TInt CArrayPak::Find(const T &aRef,TKeyArrayPak &aKey,TInt &anIndex) const +/** +Finds the position of an element within the array, based on the matching of +keys, using a sequential search. + +The array is searched sequentially for an element whose key matches the key +of the supplied object. The search starts with the first element +in the array. + +Note that where an array has elements with duplicate keys, the function only +supplies the position of the first element in the array with that key. + +@param aRef A reference to an object of type whose key is used + for comparison. +@param aKey A reference to a key object defining the properties of the key. +@param anIndex A reference to a TInt supplied by the caller. On return, if the + element is found, this is set to the position + of that element within the array. The position is relative to zero, (i.e. + the first element in the array is at position 0). + If the element is not found or the array is empty, then this is undefined. + +@return Zero, if the element with the specified key is found. Non-zero, if + the element with the specified key is not found. +*/ + {return(CArrayPakBase::Find(&aRef,aKey,anIndex));} + + + + +template +inline TInt CArrayPak::FindIsq(const T &aRef,TKeyArrayPak &aKey,TInt &anIndex) const +/** +Finds the position of an element within the array, based on the matching of +keys, using a binary search technique. + +The array is searched, using a binary search technique, for an element whose +key matches the key of the supplied object. + +The array must be in key order. + +Note that where an array has elements with duplicate keys, the function cannot +guarantee which element, with the given key value, it will return, except that it +will find one of them. + +@param aRef A reference to an object of type whose key is used + for comparison. +@param aKey A reference to a key object defining the properties of the key. +@param anIndex A reference to a TInt supplied by the caller. On return, if the + element is found, this is set to the position of that element + within the array. The position is relative to zero, (i.e. + the first element in the array is at position 0). + If the element is not found and the array is not empty, then + this is set to the position of the first element in the array + with a key which is greater than the key of the object aRef. + If the element is not found and the array is empty, then this + is undefined. + +@return Zero, if the element with the specified key is found or the array is + empty. + Non-zero, if the element with the specified key is not found. +*/ + {return(CArrayPakBase::FindIsq(&aRef,aKey,anIndex));} + + + + +template +inline void CArrayPak::InsertL(TInt anIndex,const T &aRef,TInt aLength) +/** +Inserts an element of a specified length into the array at the specified +position. + +@param anIndex The position within the array where the element is to be + inserted. The position is relative to zero, i.e. zero implies + that elements are inserted at the beginning of the array. +@param aRef A reference to the class T object to be inserted into + the array. +@param aLength The length of the element to be inserted into the array. + +@leave KErrNoMemory The function attempted to expand the array buffer and there + is insufficient memory available. In this case, the array is left in the + state it was in before the call. + +@panic E32USER-CBase 21, if anIndex is negative or greater than the number of + objects currently in the array. +@panic E32USER-CBase 30, if aLength is negative. +*/ + {CArrayPakBase::InsertL(anIndex,&aRef,aLength);} + + + + +template +inline TInt CArrayPak::InsertIsqL(const T &aRef,TInt aLength,TKeyArrayPak &aKey) +/** +Inserts a single element of a specified length into the array at a position +determined by a key. + +The array MUST already be in key sequence (as defined by the key), otherwise +the position of the new element is unpredictable, or duplicates may occur. + +Elements with duplicate keys are not permitted. + +@param aRef A reference to the element of type to be inserted into + the array. +@param aLength The length of the new element of type to be inserted + into the array. +@param aKey A reference to a key object defining the properties of the key. + +@return The position within the array of the newly inserted element. + +@leave KErrAlreadyExists An element with the same key already exists within + the array. NB the array MUST already be in key sequence, otherwise + the function may insert a duplicate and fail to leave with + this value. +@leave KErrNoMemory The function attempted to expand the array buffer and there + is insufficient memory available. In this case, the array is left in the + state it was in before the call. +*/ + {return(CArrayPakBase::InsertIsqL(&aRef,aLength,aKey));} + + + + +template +inline TInt CArrayPak::InsertIsqAllowDuplicatesL(const T &aRef,TInt aLength,TKeyArrayPak &aKey) +/** +Inserts a single element of a specified length into the array at a position +determined by a key, allowing duplicates. + +The array MUST already be in key sequence, otherwise the position of the +new element is unpredictable. + +Elements with duplicate keys are permitted. If the new element's key is a +duplicate of an existing element's key, then the new element is positioned +after the existing element. + +@param aRef A reference to the element of type to be inserted into + the array. +@param aLength The length of the new element to be inserted into the array. +@param aKey A reference to a key object defining the properties of the key. + +@return The position within the array of the newly inserted element. + +@leave KErrNoMemory The function attempted to expand the array buffer and there + is insufficient memory available. In this case, the array is left in the + state it was in before the call. +*/ + {return(CArrayPakBase::InsertIsqAllowDuplicatesL(&aRef,aLength,aKey));} + + + + +template +inline const TArray CArrayPak::Array() const +/** +Constructs and returns a TArray object. + +@return A Tarray object for this array. +*/ + {return(TArray(CountR,AtR,this));} + + + + +inline CArrayPak::CArrayPak(TBufRep aRep,TInt aGranularity) + : CArrayPakBase(aRep,aGranularity) +/** +Constructs a variable array with the specified granularity and +buffer organisation. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aRep A pointer to a function used to expand the array buffer. + The organisation of the array buffer is implied by the + choice of this function. + For a flat array buffer, pass (TBufRep)CBufFlat::NewL. + For a segmented array buffer, pass (TBufRep)CBufSeg::NewL. +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 19, if aGranularity is not positive. +*/ + {} + + + + +inline const TAny *CArrayPak::At(TInt anIndex) const +/** +Gets a pointer to the untyped element located at the specified position +within the array. + +The compiler uses this variant of the function if the returned reference is +used in an expression where that reference cannot be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + +@return A pointer to the const element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + the number of objects currently within the array. +*/ + {return(CArrayPakBase::At(anIndex));} + + + + +inline TAny *CArrayPak::At(TInt anIndex) +/** +Gets a pointer to the untyped element located at the specified position +within the array. + +The compiler uses this variant of the function if the returned reference is +used in an expression where that reference can be modified. + +@param anIndex The position of the element within the array, relative to zero; + i.e. zero implies the first element. + +@return A pointer to the non-const element located at position anIndex within + the array. + +@panic E32USER-CBase 21, if anIndex is negative or greater than or equal to + the number of objects currently within the array. +*/ + {return(CArrayPakBase::At(anIndex));} + + + + +inline void CArrayPak::AppendL(const TAny *aPtr,TInt aLength) +/** +Appends the untyped element of the specified length onto the end of the array. + +@param aPtr A pointer to an untyped element to be appended. +@param aLength The length of the untyped element. + +@leave KErrNoMemory The function attempted to expand the array buffer and there + is insufficient memory available. In this case, the array is left in the + state it was in before the call. +*/ + {CArrayPakBase::InsertL(Count(),aPtr,aLength);} + + + + +inline TAny *CArrayPak::ExtendL(TInt aLength) +/** +Expands the array by one element of the specified length at the end of +the array, and returns a pointer to this new location. + +As elements are untyped, no construction is possible and the content of +the new location remains undefined. + +@param aLength The length of the new element. + +@return A pointer to the new element location at the end of the array. + +@leave KErrNoMemory The function attempted to expand the array buffer and there + is insufficient memory available. In this case, the array is left in the + state it was in before the call. +*/ + {return(CArrayPakBase::ExpandL(Count(),aLength));} + + + + +// Template class CArrayPakFlat +template +inline CArrayPakFlat::CArrayPakFlat(TInt aGranularity) + : CArrayPak((TBufRep)CBufFlat::NewL,aGranularity) +/** +Constructs a packed flat array with specified granularity. + +Note that no memory is allocated to the array buffer by this constructor. + +@param aGranularity The granularity of the array. + +@panic E32USER-CBase 20, if aGranularity is not positive. +*/ + {} + + + + +// Class CObject +inline TInt CObject::UniqueID() const +/** +Gets this reference counting object's unique ID. + +The unique ID is an integer which is a property of the object container. It +forms part of the identity of all reference counting objects and is the same +value for all reference counting objects held within the same object container. + +@return This reference counting object's unique ID. + +@see CObjectCon +*/ + {return(iContainer->UniqueID());} + + + + +inline TInt CObject::AccessCount() const +/** +Gets the number of open references to this reference counting object. + +@return The number of open references. +*/ + {return(iAccessCount);} + + + + +inline void CObject::Inc() +/** +Adds one to the reference count. + +This function is called by the default implementation of the Open() member +function of this class. + +@see CObject::Open +*/ + {iAccessCount++;} + + + + +inline void CObject::Dec() +/** +Subtracts one from the reference count. + +This function is called by the default implementation of the Close() member +function of this class. + +@see CObject::Close +*/ + {iAccessCount--;} + + + + +inline CObject * CObject::Owner() const +/** +Gets a pointer to the reference counting object which owns this +reference counting object. + +@return A pointer to the owning reference counting object. This is NULL, if + there is no owner. +*/ + {return(iOwner);} + + + + +inline void CObject::SetOwner(CObject *anOwner) +/** +Sets the owner of this reference counting object. + +If this reference counting object already has an owner, then all knowledge +of that owner is lost. + +@param anOwner A pointer to the reference counting object which is to be the + new owner of this reference counting object. +*/ + {iOwner=anOwner;} + + + + +// class CObjectIx +inline TInt CObjectIx::Count() const +/** +Gets the number greater then the last slot number used to hold valid CObject pointer. +The input argument of CObject* CObjectIx::operator[]() must be less then the number returned by this method. + +@return The number greater then the last used slot. + +@see CObjectIx::ActiveCount +@see CObjectIx::operator[] +*/ + {return iHighWaterMark;} + + + + +inline TInt CObjectIx::ActiveCount() const +/** +Gets the current number of reference counting objects held by this +object index. + +@return The current number. +*/ + {return iNumEntries;} + + + +// class CObjectCon +inline TInt CObjectCon::UniqueID() const +/** +Gets this object container's unique ID. + +@return The unique ID value. +*/ + {return iUniqueID;} + + + + +inline TInt CObjectCon::Count() const +/** +Gets the number of reference counting objects in this object container. + +@return The number of objects. +*/ + {return iCount;} + + + + + +// class CCirBufBase +inline TInt CCirBufBase::Count() const +/** +Gets the current number of objects in this circular buffer. + +@return The number of objects in this circular buffer. + This value can never be greater than the maximum capacity. +*/ + {return(iCount);} + + + + +inline TInt CCirBufBase::Length() const +/** +Gets the maximum capacity of this circular buffer. + +The capacity is the maximum number of elements that the buffer can hold. + +Use SetLengthL() to change the capacity of the circular buffer. + +@return The maximum capacity of this circular buffer. + +@see CCirBufBase::SetLengthL +*/ + {return(iLength);} + + + + +// Template class CCirBuf +template +inline CCirBuf::CCirBuf() + : CCirBufBase(sizeof(T)) +/** +Default C++ constructor. + +The size of each object in the buffer is fixed and is the length of the class +passed as the template parameter. + +@panic E32USER-CBase 72, if the length of the template class is zero. +*/ + {} + + + + +template +inline TInt CCirBuf::Add(const T *aPtr) +/** +Adds a single object to the circular buffer. + +The object is of type class T and is only added if there is space available. + +@param aPtr A pointer to the object of type class T to be added to the circular + buffer. + +@return 1 if the object is successfully added. 0 if the object cannot be added + because the circular buffer is full. + +@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been + made before calling this function. + +@see CCirBufBase::SetLengthL +*/ + {return(DoAdd((const TUint8 *)aPtr));} + + + + +template +inline TInt CCirBuf::Add(const T *aPtr,TInt aCount) +/** +Adds multiple objects to the circular buffer. + +The function attempts to add aCount objects of type class T. The objects are +only added if there is space available. + +@param aPtr A pointer to a set of contiguous objects of type class T to be + added to the circular buffer. + +@param aCount The number of objects to be added to the circular buffer. + +@return The number of objects successfully added to the buffer. This value + may be less than the number requested and can range from 0 to aCount. + +@panic E32USER-CBase 74, if a call to CCirBufBase::SetLengthL() has not been + made before calling this function. +@panic E32USER-CBase 75, if aCount is not a positive value. + +@see CCirBufBase::SetLengthL +*/ + {return(DoAdd((const TUint8 *)aPtr,aCount));} + + + + +template +inline TInt CCirBuf::Remove(T *aPtr) +/** +Removes a single object from the circular buffer. + +An object can only be removed if there are objects in the buffer. + +A binary copy of the object is made to aPtr. + +@param aPtr A pointer to an object of type class T supplied by the caller. + +@return 1 if an object is successfully removed. 0 if an object cannot be removed + because the circular buffer is empty. +*/ + {return(DoRemove((TUint8 *)aPtr));} + + + + +template +inline TInt CCirBuf::Remove(T *aPtr,TInt aCount) +/** +Removes multiple objects from the circular buffer. + +The function attempts to remove aCount objects of type class T. +Objects can only be removed if there are objects in the buffer + +A binary copy of the objects is made to aPtr. + +@param aPtr A pointer to contiguous memory able to hold aCount class T objects, + supplied by the caller. + +@param aCount The number of objects to be removed from the circular buffer. + +@return The number of objects successfully removed from the buffer. This value + may be less than the number requested, and can range from 0 to aCount. + +@panic E32USER-CBase 76, if aCount is not a positive value. +*/ + {return(DoRemove((TUint8 *)aPtr,aCount));} + + + + +// Class CActive +inline TBool CActive::IsActive() const +/** +Determines whether the active object has a request outstanding. + +A request is outstanding when: + +1. it has been issued + +2. it has not been cancelled + +3. it servicing has not yet begun. + +@return True, if a request is outstanding; false, otherwise. +*/ + {return(iStatus.iFlags&TRequestStatus::EActive);} + + + + +inline TBool CActive::IsAdded() const +/** +Determines whether the active object has been added to the active scheduler's +list of active objects. + +If the active object has not been added to a scheduler, it cannot handle the +completion of any request. No request should be issued until the active object +has been added to a scheduler because completion of that request generates +what appears to be a stray signal. + +Use the active object function Deque() to remove the active object from the +scheduler. + +@return True, if the active object has been added to an active scheduler; + false, otherwise. + +@see CActive::Deque +*/ + {return(iLink.iNext!=NULL);} + + + + +inline TInt CActive::Priority() const +/** +Gets the priority of the active object. + +@return The active object's priority value. +*/ + {return iLink.iPriority;} + + + + +// class CDeltaTimer +inline TDeltaTimerEntry::TDeltaTimerEntry(TCallBack& aCallback) +/** +Constructor specifying a general callback. + +@param aCallback The callback to be called when this timed event entry expires. +*/ + {iCallBack=aCallback;} + + + + +inline TDeltaTimerEntry::TDeltaTimerEntry() +/** +Default constructor. +*/ + {} + + + + +inline void TDeltaTimerEntry::Set(TCallBack& aCallback) +/** +Sets the specified callback. + +@param aCallback The callback to be called when this timed event entry expires. +*/ + {iCallBack=aCallback;} + + + + +/** +Gets a reference to the server's current message. + +@return The current message that contains the client request details. +*/ +inline const RMessage2 &CServer2::Message() const + {return iMessage;} + + + + +/** +Gets the server active object that handles messages for this session. + +This is the instance of the CServer2 derived class that created +this session object. + +@return The server active object. +*/ +inline const CServer2 *CSession2::Server() const + {return iServer;} + + + + +// Class CAsyncOneShot +inline RThread& CAsyncOneShot::Thread() +/** +Gets a handle to the current thread. + +@return The handle to the current thread. +*/ + { return iThread; } + + + + +// Class CActiveScheduler +inline TInt CActiveScheduler::Level() const +/** +@deprecated Use the StackDepth() function instead. + +Gets the scheduler's level of nestedness. + +@return The level of nestedness. + +@see StackDepth() +*/ + {return StackDepth();} + + + + +// Class CActiveSchedulerWait +inline TBool CActiveSchedulerWait::IsStarted() const +/** +Reports whether this CActiveSchedulerWait object is currently started. + +Note: a CActiveSchedulerWait object itself becomes "stopped" as +soon as AsyncStop() is called, and can be started again immediately if +required (but this would start a new nested level of the scheduler). + +@return True if the scheduling loop is active; false, otherwise. + +@see CActiveSchedulerWait::Start +@see CActiveSchedulerWait::AsyncStop +*/ + {return iLoop != NULL;} + + + + +// Class CleanupStack +#ifdef _DEBUG +inline void CleanupStack::Pop(TAny* aExpectedItem) +/** +Pops an object from the top of the cleanup stack. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function checks that the specified item is at the top + of the cleanup stack before attempting to pop it; an E32USER-CBase 90 panic + is raised if the check fails. + +2 In a release build, the function just pops the object which is at the top + of the cleanup stack; no checking is done. + +@param aExpectedItem A pointer to the item expected to be at the top of the + cleanup stack. In a release build, this parameter + is not used. +*/ + { CleanupStack::Check(aExpectedItem); CleanupStack::Pop(); } + + + + +inline void CleanupStack::Pop(TInt aCount, TAny* aLastExpectedItem) +/** +Pops the specified number of objects from the top of the cleanup stack. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function pops (aCount-1) items from the cleanup stack, + and then checks that the specified item is the next one on the cleanup stack + before attempting to pop it; an E32USER-CBase 90 panic is raised if the + check fails. + +2. In a release build, the function just pops aCount items from the cleanup stack; + no checking is done. + +@param aCount The number of items top be popped from + the cleanup stack. +@param aLastExpectedItem A pointer to the item expected to be at the top of + the cleanup stack, after (aCount-1) items have been + popped. In a release build, this parameter is + not used. +*/ + { + if (--aCount) + CleanupStack::Pop(aCount); + CleanupStack::Check(aLastExpectedItem); + CleanupStack::Pop(); + } + + + + +inline void CleanupStack::PopAndDestroy(TAny* aExpectedItem) +/** +Pops an object from the top of the cleanup stack, and cleans it up. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function checks that the specified item is at the top + of the cleanup stack before attempting to pop and clean it up; + an E32USER-CBase 90 panic is raised if the check fails. + +2. In a release build, the function just pops and cleans up the object at + the top of the cleanup stack; no checking is done. + +@param aExpectedItem A pointer to the item expected to be at the top of the + cleanup stack. In a release build, this parameter is + not used. +*/ + { CleanupStack::Check(aExpectedItem); CleanupStack::PopAndDestroy(); } + + + + +inline void CleanupStack::PopAndDestroy(TInt aCount, TAny* aLastExpectedItem) +/** +Pops the specified number of objects from the top of the cleanup stack, and +cleans them up. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function pops and cleans up (aCount-1) items from the + cleanup stack, and then checks that the specified item is the next one on + the cleanup stack before attempting to pop it and clean it up; + an E32USER-CBase 90 panic is raised if the check fails. + +2. In a release build, the function just pops and cleans up aCount items from + the cleanup stack; no checking is done. + +@param aCount The number of items top be popped from the + cleanup stack, and cleaned up. +@param aLastExpectedItem A pointer to the item expected to be at the top of + the cleanup stack, after (aCount-1) items have been + popped and cleaned up. In a release build, this + parameter is not used. +*/ + { + if (--aCount) + CleanupStack::PopAndDestroy(aCount); + CleanupStack::Check(aLastExpectedItem); + CleanupStack::PopAndDestroy(); + } +#else +inline void CleanupStack::Pop(TAny*) +/** +Pops an object from the top of the cleanup stack. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function checks that the specified item is at the top + of the cleanup stack before attempting to pop it; an E32USER-CBase 90 panic + is raised if the check fails. + +2 In a release build, the function just pops the object which is at the top + of the cleanup stack; no checking is done. + +@param aExpectedItem A pointer to the item expected to be at the top of the + cleanup stack. In a release build, this parameter + is not used. +*/ + { CleanupStack::Pop(); } + + + + +inline void CleanupStack::Pop(TInt aCount, TAny*) +/** +Pops the specified number of objects from the top of the cleanup stack. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function pops (aCount-1) items from the cleanup stack, + and then checks that the specified item is the next one on the cleanup stack + before attempting to pop it; an E32USER-CBase 90 panic is raised if the + check fails. + +2. In a release build, the function just pops aCount items from the cleanup stack; + no checking is done. + +@param aCount The number of items top be popped from + the cleanup stack. +@param aLastExpectedItem A pointer to the item expected to be at the top of + the cleanup stack, after (aCount-1) items have been + popped. In a release build, this parameter is + not used. +*/ + { CleanupStack::Pop(aCount); } + + + + +inline void CleanupStack::PopAndDestroy(TAny*) +/** +Pops an object from the top of the cleanup stack, and cleans it up. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function checks that the specified item is at the top + of the cleanup stack before attempting to pop and clean it up; + an E32USER-CBase 90 panic is raised if the check fails. + +2. In a release build, the function just pops and cleans up the object at + the top of the cleanup stack; no checking is done. + +@param aExpectedItem A pointer to the item expected to be at the top of the + cleanup stack. In a release build, this parameter is + not used. +*/ + { CleanupStack::PopAndDestroy(); } + + + + +inline void CleanupStack::PopAndDestroy(TInt aCount, TAny*) +/** +Pops the specified number of objects from the top of the cleanup stack, and +cleans them up. + +The function has two modes of operation, depending on whether it is part of +a debug build or a release build. + +1. In a debug build, the function pops and cleans up (aCount-1) items from the + cleanup stack, and then checks that the specified item is the next one on + the cleanup stack before attempting to pop it and clean it up; + an E32USER-CBase 90 panic is raised if the check fails. + +2. In a release build, the function just pops and cleans up aCount items from + the cleanup stack; no checking is done. + +@param aCount The number of items top be popped from the + cleanup stack, and cleaned up. +@param aLastExpectedItem A pointer to the item expected to be at the top of + the cleanup stack, after (aCount-1) items have been + popped and cleaned up. In a release build, this + parameter is not used. +*/ + { CleanupStack::PopAndDestroy(aCount); } +#endif + + + + +// Class TCleanupItem +inline TCleanupItem::TCleanupItem(TCleanupOperation anOperation) + : iOperation(anOperation) +/** +Constructs the object with a cleanup operation. + +@param anOperation A cleanup operation which will be invoked by the pop and + destroy action resulting from a subsequent call to + CleanupStack::PopAndDestroy(). +*/ + {} + + + + +inline TCleanupItem::TCleanupItem(TCleanupOperation anOperation,TAny *aPtr) + : iOperation(anOperation), iPtr(aPtr) +/** +Constructs the object with a cleanup operation and a pointer to the object +to be cleaned up. + +@param anOperation A cleanup operation which will be invoked by the pop + and destroy action resulting from a subsequent call to + CleanupStack::PopAndDestroy(). + +@param aPtr A pointer to an object which is the target of the + cleanup operation. +*/ + {} + + + + +// Class TCleanupTrapHandler +inline CCleanup &TCleanupTrapHandler::Cleanup() + {return(*iCleanup);} + +// Class TAutoClose +template +inline TAutoClose::~TAutoClose() +/** +Destructor. + +The implementation calls Close() on iObj, the instance of the template class. +*/ +#ifdef __LEAVE_EQUALS_THROW__ + {if (!std::uncaught_exception()) iObj.Close();} +#else + {iObj.Close();} +#endif + + + + +template +inline void TAutoClose::PushL() +/** +Pushes a cleanup item onto the cleanup stack, so that Close() is called on the +templated class object, iObj, if a leave occurs. +*/ + {CleanupStack::PushL(TCleanupItem(Close, (TAny *)&iObj));} + + + + +template +inline void TAutoClose::Pop() +/** +Pops a single cleanup item from the cleanup stack. +*/ + {CleanupStack::Pop();} + + + + +template +void TAutoClose::Close(TAny *aObj) + {((T *)aObj)->Close();} + + + + +// Template class CleanupDelete +template +inline void CleanupDelete::PushL(T* aPtr) +/** +Creates a TCleanupItem for the specified object. + +The cleanup operation is the private static function Delete() of this class, which +deletes the specified object. + +@param aPtr The object for which a TCleanupItem is to be constructed. +*/ + {CleanupStack::PushL(TCleanupItem(&Delete,aPtr));} + + + + +template +void CleanupDelete::Delete(TAny *aPtr) +/** +The cleanup operation to be performed. + +@param aPtr A pointer to the object for which clean up is to be performed. + The implementation deletes this object. +*/ + {delete STATIC_CAST(T*,aPtr);} + + + + +// See header file e32base.h for in-source comment. +template +inline void CleanupDeletePushL(T* aPtr) + {CleanupDelete::PushL(aPtr);} + + + + +// Template class CleanupArrayDelete +template +inline void CleanupArrayDelete::PushL(T* aPtr) +/** +Creates a TCleanupItem for the specified array. + +The cleanup operation is the private static function ArrayDelete() of +this class, which deletes the specified array. + +@param aPtr The array of class T type objects for which a TCleanupItem is + to be constructed. +*/ + {CleanupStack::PushL(TCleanupItem(&ArrayDelete,aPtr));} + + + + +template +void CleanupArrayDelete::ArrayDelete(TAny *aPtr) +/** +The cleanup operation to be performed. + +@param aPtr A pointer to the array for which clean up is to be performed. + The implementation deletes this array. +*/ + {delete [] STATIC_CAST(T*,aPtr);} + + + + +// See header file e32base.h for in-source comment. +template +inline void CleanupArrayDeletePushL(T* aPtr) + {CleanupArrayDelete::PushL(aPtr);} + + + + +// Template class CleanupClose +template +inline void CleanupClose::PushL(T& aRef) +/** +Creates a TCleanupItem for the specified object. + +The cleanup operation is the private static function Close() of this class. + +@param aRef The object for which a TCleanupItem is to be constructed. +*/ + {CleanupStack::PushL(TCleanupItem(&Close,&aRef));} + + + + +template +void CleanupClose::Close(TAny *aPtr) +/** +The cleanup operation to be performed. + +@param aPtr A pointer to the object for which clean up is to be performed. + The implementation calls Close() on this object. +*/ + {(STATIC_CAST(T*,aPtr))->Close();} + + + + +// See header file e32base.h for in-source comment. +template +inline void CleanupClosePushL(T& aRef) + {CleanupClose::PushL(aRef);} + + + + +// Template class CleanupRelease +template +inline void CleanupRelease::PushL(T& aRef) +/** +Creates a TCleanupItem for the specified object. + +The cleanup operation is the private static function Release() of this class. + +@param aRef The object for which a TCleanupItem is to be constructed. +*/ + {CleanupStack::PushL(TCleanupItem(&Release,&aRef));} + + + + +template +void CleanupRelease::Release(TAny *aPtr) +/** +The cleanup operation to be performed. + +@param aPtr A pointer to the object for which clean up is to be performed. + The implementation calls Release() on this object. +*/ + {(STATIC_CAST(T*,aPtr))->Release();} + + + + +// See header file e32base.h for in-source comment. +template +inline void CleanupReleasePushL(T& aRef) + {CleanupRelease::PushL(aRef);} + + + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32base_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32base_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,88 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32base_private.h +// +// + +/** + @file + @internalTechnology + @released +*/ + +#ifndef __E32BASE_PRIVATE_H__ +#define __E32BASE_PRIVATE_H__ +#include +#include +#include + +/** +@internalComponent +*/ + struct TObjectDataStr //In use if this slot contains pointer to object. + { + TInt16 instance; + TUint16 uniqueID; + }; +/** +@internalComponent +*/ + struct SObjectIxRec + { + union + { + TObjectDataStr str; //This is in use if the slot contains pointer to CObject. + TInt nextEmpty; //This is in use if the slot is empty. Points to the next empty slot ... + //... in the list. 16 bits would be enough but ARM prefers 32 bytes. + }; + CObject* obj; + }; + +/** +@internalTechnology +@deprecated +*/ +class CBitMapAllocator : public CBase + { +public: + IMPORT_C static CBitMapAllocator* New(TInt aSize); + IMPORT_C static CBitMapAllocator* NewL(TInt aSize); + IMPORT_C ~CBitMapAllocator(); + IMPORT_C TInt Alloc(); + IMPORT_C TInt AllocFrom(TInt aPos); + IMPORT_C TInt Alloc(TInt aCount, TInt& aConsecutive); + IMPORT_C TInt AllocAligned(TInt anAlignment); + IMPORT_C TInt AllocAlignedBlock(TInt anAlignment); + IMPORT_C TInt AllocFromTop(); + IMPORT_C TInt AllocFromTopFrom(TInt aPos); + IMPORT_C void AllocAt(TInt aPos); + IMPORT_C void AllocAt(TInt aPos, TInt aCount); + IMPORT_C TBool IsFree(TInt aPos); + IMPORT_C TBool IsFree(TInt aPos, TInt aCount); + IMPORT_C void Free(TInt aPos); + IMPORT_C void Free(TInt aPos, TInt aCount); + IMPORT_C TInt Avail(); + IMPORT_C TInt Size(); + IMPORT_C TInt ExtractRamPages(TInt aConsecutive,TInt& aPageNo); +protected: + IMPORT_C CBitMapAllocator(TInt aSize,TInt aLength); +protected: + TInt iAvail; + TInt iSize; + TInt iLength; + TUint iMap[1]; + }; + + +#endif //__E32BASE_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32btrace.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32btrace.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,4139 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32btrace.h +// +// + +#ifndef E32BTRACE_H +#define E32BTRACE_H + +#ifdef __KERNEL_MODE__ +class TSpinLock; +#endif + +/** +Class for handling fast tracing. + +A trace record consists of three parts: a header, header extensions, +and the trace data itself. + +The header consists of four bytes containing: + +-# Size of the record in bytes. (Maximum value is KMaxBTraceRecordSize.) +-# Flags. See enum TFlags. +-# Category. Category value from enum BTrace::TCategory. +-# Sub-category. The meaning of this is dependent on the value of Category. + +When trace records are stored in memory they are stored word (32 bit) aligned. +Therefore the size must be rounded up to a multiple of four when calculating +the address of the next record. E.g. +@code + TUint8* record; // pointer to trace record + TInt size = record[BTrace::ESizeIndex]; + record += (size+3)&~3; // move record pointer on to next record. +@endcode +The NextRecord() method is provided to do this operation. + +Following the header are optionally a number of 32 bit 'header extension' values. +These are present in the order shown below but only exist if the appropriate flag bit +is set in the Header. + +-# Header2. Contains flag values from enum Flags2. + This value is only present if the EHeader2Present flag is set. +-# Timestamp. A timestamp value indicating when the trace was generated. + The format and resolution of this value are platform-dependent, but + typically will contain the same values as would be returned by + User::FastCounter() or NKern::FastCounter(). + This value is only present if the ETimestampPresent flag is set. +-# Timestamp2. Additional timestamp information. E.g. the most significant + half of a 64bit timestamp value. Note, it is valid for a Timestamp2 value + to be present even if the previous Timestamp is absent. + This value is only present if the ETimestamp2Present flag is set. +-# Context ID. This value indicates the context in which the trace was generated. + The meaning of the id is dependent on the contents of the two + least significant bits: + - 00 indicates the value is the address of the NThread object for + the currently executing thread. + - 01 indicates Fast Interrupt (FIQ) context. + Other bits of the value are currently reserved for future use. + - 10 indicates Interrupt (IRQ) context. Other bits of the value + are currently reserved for future use. + - 11 indicates Immediate Delayed Function Call (IDFC) context. + Other bits of the value are currently reserved for future use. + . + This value is only present if the EContextIdPresent flag is set. +-# Program Counter. This is the memory address of the instruction after the location + the trace was output. + This value is only present if the EPcPresent flag is set. +-# Extra. An extra value used for different purposes depending on the trace type. + This value is only present if the EExtraPresent flag is set. + +Following the header extensions are 0 or more bytes of trace data specified when the trace +was output. + +To output a trace, the following macros can be used: +- BTrace0 +- BTrace4 +- BTrace8 +- BTrace12 +- BTraceN +- BTraceBig +- BTracePc0 +- BTracePc4 +- BTracePc8 +- BTracePc12 +- BTracePcN +- BTracePcBig +- BTraceContext0 +- BTraceContext4 +- BTraceContext8 +- BTraceContext12 +- BTraceContextN +- BTraceContextBig +- BTraceContextPc0 +- BTraceContextPc4 +- BTraceContextPc8 +- BTraceContextPc12 +- BTraceContextPcN +- BTraceContextPcBig + +Whenever a trace is output, the trace handler is called with the arguments specified. +See typedef THandler and SetHandler(). + +Each tracing category has a filter bit, which if set to zero means that traces in that category +are discarded, see SetFilter(). This filtering is performed before the trace handler is +called. This filter may also be initialised from boot time by using the 'btrace' keyword in +an OBY file used to build a ROM image. + +Traces may also be additionally sent through a second level of filtering. This examines the +first 32 bits of data in the trace and if this value isn't present in the list maintained +in the secondary filter, the trace is discarded. The contents of the secondary filter are +set using the SetFilter2 methods. + +Values used for secondary filtering must be Symbian Unique Identifiers (UIDs) allocated +using the normal UID allocation process. Note, the following non-valid UID value ranges +are reserved. +- 0x00000000..0x007fffff Reserved for platform specific use. +- 0x00800000..0x00ffffff Reserved for use by Symbian. + +To generate traces which are to be processed by the secondary filter, the following +macros can be used: + +- BTraceFiltered4 +- BTraceFiltered8 +- BTraceFiltered12 +- BTraceFilteredN +- BTraceFilteredBig +- BTraceFilteredPc4 +- BTraceFilteredPc8 +- BTraceFilteredPc12 +- BTraceFilteredPcN +- BTraceFilteredPcBig +- BTraceFilteredContext4 +- BTraceFilteredContext8 +- BTraceFilteredContext12 +- BTraceFilteredContextN +- BTraceFilteredContextBig +- BTraceFilteredContextPc4 +- BTraceFilteredContextPc8 +- BTraceFilteredContextPc12 +- BTraceFilteredContextPcN +- BTraceFilteredContextPcBig + +Traces generated using the above methods will be filtered twice; once using the primary +filter which checks the trace's category, and once using the secondary filter which checks +the 32 bit UID value at the start of the trace data. Therefore the trace must pass both filter +checks for it to be sent to the trace handler for output. + +@publishedPartner +@released +*/ +class BTrace + { +public: + /** + Byte indices into the trace header for specific fields. + */ + enum THeaderStructure + { + /** + Size of record in bytes. + */ + ESizeIndex = 0, + + /** + Bitfield of flags from enum TFlags. E.g. to detect if a timestamp is present in + the record, code like this could be used. + @code + TUint8* record; // pointer to trace record + if(record[BTrace::EFlagsIndex]&BTrace::ETimestampPresent) + TimestampPresent(); + else + TimestampNotPresent(); + @endcode + */ + EFlagsIndex = 1, + + /** + Category value from enum BTrace::TCategory. + */ + ECategoryIndex = 2, + + /** + Sub-category value. The meaning of this is dependent on the Category. + */ + ESubCategoryIndex = 3, + }; + + /** + Bit flags which indicate state of a trace record. + */ + enum TFlags + { + /** + Header2 is present in the trace record. + */ + EHeader2Present = 1<<0, + + /** + A timestamp value is present in the trace record. + */ + ETimestampPresent = 1<<1, + + /** + A second timestamp value is present in the trace record. + */ + ETimestamp2Present = 1<<2, + + /** + A context ID is present in the trace record. + */ + EContextIdPresent = 1<<3, + + /** + A CPU program counter (PC) value is present in the trace record. + */ + EPcPresent = 1<<4, + + /** + An 'extra' value is present in the trace record. + */ + EExtraPresent = 1<<5, + + /** + Indicates that the data in this trace record was truncated to keep the size + within the maximum permissible. + */ + ERecordTruncated = 1<<6, + + /** + Indicates that trace record(s) before this one are missing. + This can happen if the trace buffer was full when a trace output was attempted. + */ + EMissingRecord = 1<<7 + }; + + /** + Bit flags present in the Flags2 value of the header extension. + */ + enum TFlags2 + { + /** + Masks out the bits for the multipart trace type. (See enum TMultiPart.) + */ + EMultipartFlagMask = 3<<0, + + /** + Masks out the bits for the CPU ID for SMP systems (zero if present on non SMP systems) + */ + ECpuIdMask = 0xfff<<20, + }; + + /** + Values for multipart trace indicator. These values are stored in Flags2 an + are obtained by ANDing with the value EMultipartFlagMask. + + If a 'Big' trace is generated which doesn't fit into a single trace record + then its data is split into several separate trace records; a multipart trace. + + In multipart traces the 'extra' trace value is present in the header extension. + (EExtraPresent is set.) This extra value contains a unique trace identifier + which is the same is all parts of the trace. + + The structure of the data part of each trace record in a multipart trace is described + below. In this description, the following labels are used. + - A is the initial 4 bytes of data; the a1 argument of BTraceBig. + - D is the array of bytes of additional data; the aData argument of BTraceBig. + - N is the size of D; the aDataSize argument of BTraceBig + - X is the maximum number of additional bytes which will fit into a trace record. + This is usually KMaxBTraceDataArray but this should not be assumed, instead + the size and other information present in each trace record should be examined. + + For the first part of a multipart trace, the data in a trace record has the following + structure: + + - 4 bytes containing N. + - 4 bytes containing A. + - X bytes containing D[0..X-1] + + If the parts are numbered 0 through to 'j', then a middle part of a multipart trace + is numbered 'i' where 0\header.iby) + or at runtime by running the following at the Eshell command prompt: + + trace 0 0 1 + + Note that changing this flag at runtime only affects processes created after the flag + is set or unset. It will not affect running processes. + + @see enum THeap + @prototype 9.4 + */ + EHeap = 14, + + /** + Meta trace. Trace that is only useful to programs which use or display BTrace-based data. + @see enum TMetaTrace + @prototype 9.4 + */ + EMetaTrace = 15, + + /** + Trace generated by the ram allocator to allow the physical layout of RAM + to be tracked. + @internalTechnology + */ + ERamAllocator = 16, + + /** + Trace generated by the Fast Mutex in the Nkern. + */ + EFastMutex = 17, + + + /** + Trace generated by any sampling profiler. + @see enum TProfiling + */ + EProfiling = 18, + + /** + Trace generated by Power Resource Manager. + @prototype 9.5 + */ + EResourceManager = 19, + + + /** + Trace generated by Power Resource Manager User-Side API. + @prototype 9.5 + */ + EResourceManagerUs = 20, + + /** + Trace generated by Raw Event subsystem APIs + @see enum TRawEventTrace + @prototype 9.5 + */ + ERawEvent =21, + + /** + Trace generated by USB communications (Client, Host and OTG) where use + of standard logging (conditional Kern::Printf() calls) is sufficiently + time-consuming that the required device timings mandated by the core + USB standards cannot be achieved + @prototype 9.5 + */ + EUsb = 22, + + /** + Trace generated by Symbian OS kernel synchronization objects. + @prototype 9.5 + */ + ESymbianKernelSync = 23, + + /** + First category value in the range reserved for platform specific use; + the end of this range is #EPlatformSpecificLast. + Symbian's code will not generate any traces with categories in this range. + + It is strongly recommended that platforms reserve the first half of this range + (128..143) for definition and use by base-port (kernel-side) code. Any general + trace framework built on top of BTrace APIs should use the second half of the range. + This allows fast (primary filtered only) BTrace categories to be used in device drivers + and other base-port code, without clashing with more general trace frameworks implemented + for application layer code. + */ + EPlatformSpecificFirst = 128, + + /** + Last category value in the range reserved for platform specific use. + @see EPlatformSpecificFirst + */ + EPlatformSpecificLast = 191, + + /** + First category value in the range reserved for Symbian tools and future trace framework + implementations; the end of this range is #ESymbianExtentionsLast. + */ + ESymbianExtentionsFirst = 192, + + /** + Last category value in the range reserved for Symbian tools and future trace framework + implementations. + @see ESymbianExtentionsFirst + */ + ESymbianExtentionsLast = 253, + + /** + Used for testing purposes. + + This may be used for ad-hoc testing purposes, e.g. special builds of components + with tracing enabled for diagnostic purposes. + + This category is also used by the E32 BTrace unit tests. + @test + */ + ETest1 = 254, + + /** + Used for testing purposes. + + This may be used for ad-hoc testing purposes, e.g. special builds of components + with tracing enabled for diagnostic purposes. + + This category is also used by the E32 BTrace unit tests. + @test + */ + ETest2 = 255 + }; + + /** + Enumeration of sub-category values for trace category EThreadIdentification. + @see EThreadIdentification + */ + enum TThreadIdentification + { + /** + A nano-kernel thread (NThread) has been created. + + Trace data format: + - 4 bytes containing the context id (an NThread*) for this thread. + */ + ENanoThreadCreate, + + /** + A nano-kernel thread (NThread) has been destroyed. + + Trace data format: + - 4 bytes containing the context id (an NThread*) for this thread. + */ + ENanoThreadDestroy, + + /** + A thread (DThread) has been created. + + Trace data format: + - 4 bytes containing the context id (an NThread*) for this thread. + - 4 bytes containing trace id (a DProcess*) for the process to which this thread belongs. + - Remaining data is the ASCII name of the thread. + */ + EThreadCreate, + + /** + A thread (DThread) has been destroyed. + + Trace data format: + - 4 bytes containing the context id (an NThread*) for this thread. + - 4 bytes containing trace id for the process to which this thread belongs. + - 4 bytes containing thread ID, as returned by RThread::Id(). + */ + EThreadDestroy, + + /** + A thread (DThread) has been renamed. + This trace may also be output by the tracing system at initialisation + in order to identify threads already in existence. + + Trace data format: + - 4 bytes containing the context id (an NThread*) for this thread. + - 4 bytes containing trace id (a DProcess*) for the process to which this thread belongs. + - Remaining data is the ASCII name of the thread. + */ + EThreadName, + + /** + A process has been renamed. + This trace may also be output together with EThreadCreate or EThreadName traces + to help identify the name of the process to which the thread belongs. + + Trace data format: + - 4 bytes containing zero, or if this trace is generated together with EThreadName + or EThreadCreate, this contains the context id (an NThread*) for the thread. + - 4 bytes containing trace id (a DProcess*) for process. + - Remaining data is the ASCII name of the process. + */ + EProcessName, + + /** + Informational trace giving a threads ID, as returned by RThread::Id(). + Trace data format: + - 4 bytes containing the context id (an NThread*) for this thread. + - 4 bytes containing trace id (a DProcess*) for the process to which this thread belongs. + - 4 bytes containing thread ID, as returned by RThread::Id(). + */ + EThreadId, + + /** + A process has been created. + + Trace data format: + - 4 bytes containing trace id (a DProcess*) for the process. + */ + EProcessCreate, + + /** + A process has been destroyed. + + Trace data format: + - 4 bytes containing trace id (a DProcess*) for the process. + */ + EProcessDestroy + + }; + + /** + Enumeration of sub-category values for trace category ECpuUsage. + @see ECpuUsage + */ + enum TCpuUsage + { + /** + Trace output at start of Interrupt (IRQ) dispatch. + + On platforms which support nested interrupts, traces for these will also + be nested. + */ + EIrqStart, + + /** + Trace output at end of Interrupt (IRQ) dispatch. + + Note, this trace isn't generated if an Interrupt Service Routine queues + a DFC or causes a thread to be scheduled. In these cases, the traces for + these events (EIDFCStart or ENewThreadContext) should be taken to indicate + that interrupt servicing has ended. + */ + EIrqEnd, + + /** + Trace output at start of Fast Interrupt (FIQ) dispatch. + + On platforms which support nested interrupts, traces for these will also + be nested. + */ + EFiqStart, + + /** + Trace output at end of Fast Interrupt (FIQ) dispatch. + + Note, this trace isn't generated if an Interrupt Service Routine queues + a DFC or causes a thread to be scheduled. In these cases, the traces for + these events (EIDFCStart or ENewThreadContext) should be taken to indicate + that interrupt servicing has ended. + */ + EFiqEnd, + + /** + Trace output at start of Immediate Delayed Function Call (IDFC) processing. + This processing also includes moving DFCs to their final queue, so the trace + does not necessarily indicate that any IDFCs have been executed. + */ + EIDFCStart, + + /** + Trace output at end of Immediate Delayed Function Call (IDFC) processing. + */ + EIDFCEnd, + + /** + Trace output when a thread is scheduled to run. + The context id (NThread*) in this trace is that of the thread being scheduled. + */ + ENewThreadContext + }; + + /** + @internalTechnology + @prototype 9.3 + */ + enum TClientServer + { + /** + Trace generated whenever a server is created. + + Trace data format: + - 4 bytes containing the server id (a DServer*). + - 4 bytes containing undefined data + - Remaining data is the ASCII name of the server. + + The context id (NThread*) in this trace is that of the thread creating the server. + */ + EServerCreate, + + /** + Trace generated whenever a server is destroyed. + + Trace data format: + - 4 bytes containing the server id (a DServer*). + + */ + EServerDestroy, + + /** + Trace generated whenever a new session is attached to a server. + I.e. a new session has been created. + + Trace data format: + - 4 bytes containing the session id (a DSession*). + - 4 bytes containing the server id (a DServer*). + + The context id (NThread*) in this trace is that of the thread creating the session. + */ + ESessionAttach, + + /** + Trace generated whenever a server session is detached from a server. + I.e. a session has been closed. + + Trace data format: + - 4 bytes containing the session id (a DSession*). + - 4 bytes containing the reasons (error code) for the session being closed. + + */ + ESessionDetach, + + /** + Trace generated whenever a new message is sent to a server. + + Trace data format: + - 4 bytes containing the message handle. + - 4 bytes containing the iFunction value for the message. + - 4 bytes containing the server id (a DServer*). + + The context id (NThread*) in this trace is that of the thread which sent the message. + */ + EMessageSend, + + /** + Trace generated when a server receives a new message. + + Trace data format: + - 4 bytes containing the message handle. + */ + EMessageReceive, + + /** + Trace generated whenever a message is completed using RMessagePtr2::Complete. + + Trace data format: + - 4 bytes containing the message handle. + - 4 bytes containing the completion reason, or object handle, value. + (The object handle value is that which is delivered to the sender of the + message, not that supplied by the server actually completing the request.) + + The context id (NThread*) in this trace is that of the thread which completed the message. + */ + EMessageComplete + }; + + + /** + @internalTechnology + @prototype 9.3 + */ + enum TRequests + { + /** + Trace generated whenever a request status is completed. + + Trace data format: + - 4 bytes containing the thread id (NThread*) of the thread being signalled. + - 4 bytes containing the address of the TRequestStatus object. + - 4 bytes containing the completion reason. + + The context id (NThread*) in this trace is that of the thread which completed the request. + */ + ERequestComplete + }; + + + /** + Enumeration of sub-category values for trace category EChunks. + @see EChunks + */ + enum TChunks + { + /** + Trace output when a chunk is created. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*). + - 4 bytes containing the maximum size of the chunk. + - The ASCII name of the chunk. + */ + EChunkCreated, + + /** + @internalTechnology + + Trace output when a chunk is created containing extra chunk information. + + Note that the meaning of the data in this trace is different between + memory models, and may change without warning. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*). + - 4 bytes containing the chunk type. + - 4 bytes containing the chunk's attributes. + */ + EChunkInfo, + + /** + Trace output when a chunk is destroyed. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*) + */ + EChunkDestroyed, + + /** + Trace output when memory is allocated and committed to a chunk. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*). + - 4 bytes containing the offset into the chunk. + - 4 bytes containing the size of the memory committed. + */ + EChunkMemoryAllocated, + + /** + Trace output when memory is decommitted from a chunk and deallocated. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*). + - 4 bytes containing the offset into the chunk. + - 4 bytes containing the size of the memory decommitted. + */ + EChunkMemoryDeallocated, + + /** + Trace output when un-owned memory is committed to a chunk. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*). + - 4 bytes containing the offset into the chunk. + - 4 bytes containing the size of the memory committed. + */ + EChunkMemoryAdded, + + /** + Trace output when un-owned memory is decommitted to a chunk. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*). + - 4 bytes containing the offset into the chunk. + - 4 bytes containing the size of the memory decommitted. + */ + EChunkMemoryRemoved, + + /** + Trace to indicate the owning process of a chunk - only for local (private) chunks. + + Trace data format: + - 4 bytes containing the chunk id (a DChunk*). + - 4 bytes containing the process id of the owner (a DProcess*). + */ + EChunkOwner + }; + + /** + Enumeration of sub-category values for trace category ECodeSegs. + @see ECodeSegs + */ + enum TCodeSegs + { + /** + Trace output when a code segment is created to associate a code segment + id with a filename. + + Trace data format: + - 4 bytes containing the code segment id (a DCodeSeg*). + - The ASCII filename. + */ + ECodeSegCreated, + + /** + Trace output when a code segment is created. + + Trace data format: + - 4 bytes containing the code segment id (a DCodeSeg*). + - 4 bytes containing the attributes. + - 4 bytes containing the code base address (.text). + - 4 bytes containing the size of the code section (.text). + - 4 bytes containing the base address of the constant data section (.rodata). + - 4 bytes containing the size of the constant data section (.rodata). + - 4 bytes containing the base address of the initialised data section (.data). + - 4 bytes containing the size of the initialised data section (.data). + - 4 bytes containing the base address of the uninitialised data section (.bss). + - 4 bytes containing the size of the uninitialised data section (.bss). + */ + ECodeSegInfo, + + /** + Trace output when a code segment is destroyed. + + Trace data format: + - 4 bytes containing the code segment id (a DCodeSeg*). + */ + ECodeSegDestroyed, + + /** + Trace output when a code segment is mapped into a process. + + Trace data format: + - 4 bytes containing the code segment id (a DCodeSeg*). + - 4 bytes containing the process id (a DProcess*). + */ + ECodeSegMapped, + + /** + Trace output when a code segment is unmapped from a process. + + Trace data format: + - 4 bytes containing the code segment id (a DCodeSeg*). + - 4 bytes containing the process id (a DProcess*). + */ + ECodeSegUnmapped, + + /** + Trace output when memory is allocated to a code segment. + + Under the multiple memory model, code segments for RAM-loaded user code + own the RAM pages the code occupies. The pages are not owned by any + chunk, but are mapped into the code chunk of each process that uses the + code segment. + + Trace data format: + - 4 bytes containing the code segment id (a DCodeSeg*). + - 4 bytes containing the size of the memory allocated. + */ + ECodeSegMemoryAllocated, + + /** + Trace output when memory is deallocated from a code segment. + + Under the multiple memory model, code segments for RAM-loaded user code + own the RAM pages the code occupies. The pages are not owned by any + chunk, but are mapped into the code chunk of each process that uses the + code segment. + + Trace data format: + - 4 bytes containing the code segment id (a DCodeSeg*). + - 4 bytes containing the size of the memory deallocated. + */ + ECodeSegMemoryDeallocated + }; + + + /** + Enumeration of sub-category values for trace category EPaging. + @see EPaging + */ + enum TPaging + { + /** + This event indicates the beginning of the 'page in' activity. + The end of this activity is indicated by one of the following events: + - EPagingPageInUnneeded + - EPagingPageInROM + - EPagingPageInCode + + Trace data format: + - 4 bytes containing the virtual address which was accessed, causing this paging event. + - 4 bytes containing the virtual address of the instruction which caused this paging event. + (The PC value.) + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageInBegin, + + /** + Event which terminates the 'page in' activity when the required page was found to + already be paged in. (See EPagingPageInBegin.) + + Trace data format: + - 0 bytes. (No extra data.) + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageInUnneeded, + + /** + A ROM page has been paged in. + This event indicates the end of the 'page in' activity. (See EPagingPageInBegin.) + + Trace data format: + - 4 bytes containing the physical address of the page 'paged in'. + - 4 bytes containing the virtual address of the page 'paged in'. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageInROM, + + /** + A ROM page has been 'paged out'. I.e. removed from the live list to be either + reused or returned to free pool. + + Trace data format: + - 4 bytes containing the physical address of the page being 'paged out'. + - 4 bytes containing the virtual address of the page being 'paged out'. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageOutROM, + + /** + A Free page has been 'paged in'. I.e. added to the live list. + + Trace data format: + - 4 bytes containing the physical address of the page being 'paged in'. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageInFree, + + /** + A Free page has been 'paged out'. I.e. removed from the live list to be either + reused or returned to free pool. + + Trace data format: + - 4 bytes containing the physical address of the page being 'paged out'. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageOutFree, + + /** + A page has been made 'young' again because it was accessed. + + Trace data format: + - 4 bytes containing the physical address of the page being rejuvenated, (made young). + - 4 bytes containing the virtual address which was accessed, causing this paging event. + - 4 bytes containing the virtual address of the instruction which caused this paging event. + (The PC value.) + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingRejuvenate, + + /** + A page fault was found to have already been previously serviced. + + Trace data format: + - 4 bytes containing the physical address of the page accessed. + - 4 bytes containing the virtual address which was accessed, causing this paging event. + - 4 bytes containing the virtual address of the instruction which caused this paging event. + (The PC value.) + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageNop, + + /** + A page has been locked. + + Trace data format: + - 4 bytes containing the physical address of the page being locked. + - 4 bytes containing the value of the lock count after the paged was locked. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageLock, + + /** + A page has been unlocked. + + Trace data format: + - 4 bytes containing the physical address of the page being unlocked. + - 4 bytes containing the value of the lock count before the paged was unlocked. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageUnlock, + + /** + A page containing RAM cache has been 'paged out'. I.e. removed from the live list to be + either reused or returned to free pool. + + Trace data format: + - 4 bytes containing the physical address of the page being 'paged out'. + - 4 bytes containing the virtual address of the page being 'paged out'. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageOutCache, + + /** + A page containing RAM-loaded code has been paged in. + This event indicates the end of the 'page in' activity. (See EPagingPageInBegin.) + + Trace data format: + - 4 bytes containing the physical address of the page 'paged in'. + - 4 bytes containing the virtual address of the page 'paged in'. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageInCode, + + /** + A page containing RAM-loaded code has been 'paged out'. I.e. removed from the live list to be + either reused or returned to free pool. + + Trace data format: + - 4 bytes containing the physical address of the page being 'paged out'. + - 4 bytes containing the virtual address of the page being 'paged out'. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingPageOutCode, + + /** + A page of RAM-loaded code was found to already be 'paged in' but not mapped in + the faulting process. + This event is only emitted on the multiple memory model. + + Trace data format: + - 4 bytes containing the physical address of the page 'paged in'. + - 4 bytes containing the virtual address which was accessed, causing this paging event. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingMapCode, + + /** + A page has been made 'old' because it was the last young page to be accessed. + + This trace is only produced when the kernel is compiled with the #BTRACE_PAGING_VERBOSE + macro defined. + + Trace data format: + - 4 bytes containing the physical address of the page being aged, (made old). + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingAged, + + /** + Trace emitted at the start of decompression of demand paged data. + + This trace is only produced when the kernel is compiled with the #BTRACE_PAGING_VERBOSE + macro defined. + + Trace data format: + - 4 bytes containing an integer which indicates the compression type being used: + 0, no compression; + 1, bytepair compression. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingDecompressStart, + + /** + Trace emitted at the end of decompression of demand paged data. + + This trace is only produced when the kernel is compiled with the #BTRACE_PAGING_VERBOSE + macro defined. + + The context id (NThread*) in this trace is that of the thread caused this paging event. + */ + EPagingDecompressEnd, + }; + + /** + Enumeration of sub-category values for trace category EResourceManager. + @see EResourceManager + @prototype 9.5 + */ + enum TResourceManager + { + /** + Trace output for resource registration. + + Trace data format: + - 4 bytes containing the Resource Id. + - 4 bytes containing the Resource address. + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing the Resource Minimum Level + - 4 bytes containing the Resource Maximum Level + - 4 bytes containing the Resource Default Level + */ + ERegisterResource = 0, + + /** + Trace output for client registration + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing client address + - N bytes containing client name, where 0 < N < 32 + */ + ERegisterClient, + + /** + Trace output for client deregistration + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing client address + - N bytes containing client name, where 0 < N < 32 + */ + EDeRegisterClient, + + /** + Trace output for resource state change start operation + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing client name, where 0 < N < 32 + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing the Resource state + */ + ESetResourceStateStart, + + /** + Trace output for resource state change end operation + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing client name, where 0 < N < 32 + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing return value. + - 4 bytes containing the Resource state. + */ + ESetResourceStateEnd, + + /** + Trace output for registration for post notification + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - 4 bytest containing the callback address + - 4 bytes containing return value. + */ + EPostNotificationRegister, + + /** + Trace output for deregistration for post notification + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - 4 bytes containing the callback address + - 4 bytes containing the return value. + */ + EPostNotificationDeRegister, + + /** + Trace output for post notification sent. + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + */ + EPostNotificationSent, + + /** + Trace output for Callback complete + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + */ + ECallbackComplete, + + /** + Trace output for resource manager memory usage + + Trace data format: + - 4 bytes containing memory allocated in bytes. + */ + EMemoryUsage, + + /** + Trace output for get resource state start operation + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing client name, where 0 < N < 32 + - N bytes containing the Resource name, where 0 < N < 32 + */ + EGetResourceStateStart, + + /** + Trace output for get resource state end operation + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing client name, where 0 < N < 32 + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing the Resource state + - 4 bytes containing return value. + */ + EGetResourceStateEnd, + + /** + Trace output for cancellation of long latency operation + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing client name, where 0 < N < 32 + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing return value + */ + ECancelLongLatencyOperation, + + /** + Trace output for booting of resource manager + + Trace data format: + - 4 bytes containing entry point + */ + EBooting, + + /** + Trace output for PSL resource state change operation + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing the Resource current state + - 4 bytes containing the resource requested state + */ + EPslChangeResourceStateStart, + + /** + Trace output for PSL resource state change operation + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing the Resource current state + - 4 bytes containing the resource requested state + - 4 bytes containing return value + */ + EPslChangeResourceStateEnd, + + /** + Trace output for get resource state start operation in PSL + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing the Resource name, where 0 < N < 32 + */ + EPslGetResourceStateStart, + + /** + Trace output for get resource state end operation in PSL + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id. + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing the Resource state + - 4 bytes containing return value. + */ + EPslGetResourceStateEnd, + + /** + Trace output for resource creation + + Trace data format: + - 4 bytes containing minimum value of resource + - 4 bytes containing maximum value of resource + - 4 bytes containing the default value of resource + - 4 bytes containing the properties of the resource + - N bytes containing the Resource name, where 0 < N < 32 + */ + EPslResourceCreate, + + /** + Trace output for static resource with dependency registration + + Trace data format: + - 4 bytes containing the Resource Id + - 4 bytes containing the Resource address + - N bytes containing the Resource name, where 0 < N < 32 + - 4 bytes containing the minimum value of resource + - 4 bytes containing the maximum value of resource + - 4 bytes containing the default value of resource + */ + ERegisterStaticResourceWithDependency, + + /** + Trace output for dynamic resource registration + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id + - N bytes containing the client name, where 0 < N < 32 + - N bytes containing the resource name, where 0 < N < 32 + - 4 bytes containing the resouce address + */ + ERegisterDynamicResource, + + /** + Trace output for dynamic resource deregistration + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id + - N bytes containing the client name, where 0 < N < 32 + - N bytes containing the resource name, where 0 < N < 32 + - 4 bytes containing the resource address + - 4 bytes containing the resource level. + */ + EDeRegisterDynamicResource, + + /** + Trace output for resource dependency registration + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id of first dependent resource + - N bytes containing the client name, where 0 < N < 32 + - N bytes containing the resource name of first dependent resource, where 0 < N < 32 + - 4 bytes containing the Resource Id of second dependent resource + - N bytes containing the resource name of second dependent resource, where 0 < N < 32 + - 4 bytes containing the address of first dependent resource + - 4 bytes containing the address of second dependent resource + */ + ERegisterResourceDependency, + + /** + Trace output for resource dependency deregistration + + Trace data format: + - 4 bytes containing clientId + - 4 bytes containing the Resource Id of first dependent resource + - N bytes containing the client name, where 0 < N < 32 + - N bytes containing the resource name of first dependent resource, where 0 < N < 32 + - 4 bytes containing the resource id of second dependent resource + - N bytes containing the resource name of second dependent resource, where 0 < N < 32 + - 4 bytes containing the address of first dependent resource + - 4 bytes containing the address of second dependent resource + */ + EDeRegisterResourceDependency + }; + /** + Enumeration of sub-category values for trace category EResourceManagerUs. + @see EResourceManagerUs + @prototype 9.5 + */ + enum TResourceManagerUs + { + /** + Trace output for the start of opening a channel to the Resource Controller. + + Trace data format: + - 4 bytes unused (displays 0) + - 4 bytes containing the client thread identifier. + - N bytes containing the client name, where 0 < N < 32 + */ + EOpenChannelUsStart = 0, + /** + Trace output for the end of opening a channel to the Resource Controller. + + Trace data format: + - 4 bytes unused (displays 0) + - 4 bytes containing the client identifier provided by the Resource Controller + - N bytes containing the client name, where 0 < N < 32 + */ + EOpenChannelUsEnd, + /** + Trace output for the start of registering a client with the Resource Controller. + + Trace data format: + - 4 bytes the number of concurrent change resource state operations to be supported + - 4 bytes the number of concurrent notification requests to be supported + - N bytes containing the client name, where 0 < N < 32 + - 4 bytes the number of concurrent get resource state operations to be supported + */ + ERegisterClientUsStart, + /** + Trace output for the end of registering a client with the Resource Controller. + + Trace data format: + - 4 bytes containing the client identifier provided by the Resource Controller. + - 4 bytes specifying the value returned from the call to Resource Controller's AllocReserve method + */ + ERegisterClientUsEnd, + /** + Trace output for the start of de-registering a client with the Resource Controller. + + Trace data format: + - 4 bytes unused (displays 0) + - 4 bytes containing the client identifier provided by the Resource Controller. + - N bytes containing the client name, where 0 < N < 32 + */ + EDeRegisterClientUsStart, + /** + Trace output for the end of registering a client with the Resource Controller. + + Trace data format: + - 4 bytes containing the client identifier provided by the Resource Controller. + */ + EDeRegisterClientUsEnd, + /** + Trace output for the start of a GetResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes containing the client identifier provided by the Resource Controller. + - N bytes containing the client name, where 0 < N < 32 + */ + EGetResourceStateUsStart, + /** + Trace output for the end of a GetResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes specifying the resource level + - 4 bytes containing the client identifier + - 4 bytes specifying the success code returned by the Resource Controller. + */ + EGetResourceStateUsEnd, + /** + Trace output for the start of a ChangeResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes specifying the required state + - N bytes containing the client name, where 0 < N < 32 + - 4 bytes containing the client identifier provided by the Resource Controller. + */ + ESetResourceStateUsStart, + /** + Trace output for the end of a ChangeResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes specifying the requested state + - 4 bytes containing the client identifier + - 4 bytes specifying the success code returned by the Resource Controller. + */ + ESetResourceStateUsEnd, + /** + Trace output for the start of a cancel GetResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes containing the client identifier provided by the Resource Controller. + - N bytes containing the client name, where 0 < N < 32 + */ + ECancelGetResourceStateUsStart, + /** + Trace output for the end of a cancel GetResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes containing the client identifier provided by the Resource Controller. + - N bytes containing the client name, where 0 < N < 32 + */ + ECancelGetResourceStateUsEnd, + /** + Trace output for the start of a cancel ChangeResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes containing the client identifier provided by the Resource Controller. + - N bytes containing the client name, where 0 < N < 32 + */ + ECancelSetResourceStateUsStart, + /** + Trace output for the end of a cancel ChangeResourceState request to the Resource Controller. + + Trace data format: + - 4 bytes specifying the resource ID + - 4 bytes containing the client identifier provided by the Resource Controller. + - N bytes containing the client name, where 0 < N < 32 + */ + ECancelSetResourceStateUsEnd + }; + + /** + Enumeration of sub-category values for trace category EThreadPriority. + @see EThreadPriority + @internalTechnology + @prototype 9.3 + */ + enum TThreadPriority + { + /** + Trace output when a nanothread priority is changed. + + Trace data format: + - 4 bytes containing the context id (an NThread*) for the thread whose priority is changing. + - 4 bytes containing the new absolute priority. + */ + ENThreadPriority=0, + + /** + Trace output when a DThread's default priority is set. + + Trace data format: + - 4 bytes containing the context id (an NThread*) for the thread whose priority is changing. + - 4 bytes containing the iThreadPriority member - a value from enum ::TThrdPriority. + - 4 bytes containing the new default absolute priority. + */ + EDThreadPriority=1, + + /** + Trace output when a DProcess priority is changed. + + Trace data format: + - 4 bytes containing trace id (a DProcess*) for process. + - 4 bytes containing the new process priority, a value from enum ::TProcPriority + */ + EProcessPriority=2 + }; + + /** + Enumeration of sub-category values for trace category EPagingMedia. + @see EPagingMedia + */ + enum TPagingMedia + { + /** + Event generated when a request to 'page in' data is received by the Local Media Subsystem. + + Trace data format: + - 4 bytes containing the linear address of the buffer to where the data is to be written. + - 4 bytes containing the offset from start of the partition to where the data to be paged in resides. + - 4 bytes containing the number of bytes to be read off the media. + - 4 bytes containing local drive number for the drive where the data to be paged in resides (-1 if ROM paging). + - 4 bytes containing the linear address in memory where this request object resides. + + The context id (NThread*) in this trace is that of the thread that took the page fault that caused this event. + */ + EPagingMediaLocMedPageInBegin, + + /** + Event generated by the Local Media Subsystem when a request to 'page in' data is completed. + + Trace data format: + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing the completion code to be returned. + - 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId). + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaLocMedPageInPagedIn, + + /** + Event generated by the Local Media Subsystem when a request to 'page in' data is deferred. + + Trace data format: + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId). + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaLocMedPageInDeferred, + + /** + Event generated by the Local Media Subsystem when a request to 'page in' data that has been deferred is re-posted. + + Trace data format: + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId). + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaLocMedPageInDeferredReposted, + + /** + Event generated by the Local Media Subsystem when a request to 'page in' data is re-deferred. + + Trace data format: + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId). + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaLocMedPageInReDeferred, + + /** + Event generated by the Local Media Subsystem when a request to 'page in' data is issued when the media is not yet open. + + Trace data format: + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing the state of the media (one of TMediaState). + - 4 bytes containing a code qualifying this request as either a ROM or Code 'page in' (see TPagingRequestId). + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaLocMedPageInQuietlyDeferred, + + /** + Event generated by the Local Media Subsystem when a fragment of a Write request is created and is ready to be sent to the Media + Driver thread . + + Trace data format: + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing the ID of this fragment (middle or last). + - 4 bytes containing the length of data in this request fragment. + - 4 bytes containing the offset within the original request to the start of data in this fragment. + - 4 bytes containing the offset from start of the partition to where the data in this fragment is to be written. + - 4 bytes containing the address of the DThread object representing the thread that issued the original Write request. + + The context id (NThread*) in this trace is that of the File Server drive thread that issued the original Write request. + */ + EPagingMediaLocMedFragmentBegin, + + /** + Event generated by the Local Media Subsystem when a Write fragment is completed . + + Trace data format: + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing the completion code to be returned. + + The context id (NThread*) in this trace is that of the File Server drive thread that issued the original Write request. + */ + EPagingMediaLocMedFragmentEnd, + + /** + Event generated when the Media Driver starts processing a request to 'page in' data in its specific Request(..) function. + + Trace data format: + - 4 bytes containing a code describing the type of the media (one of TMediaDevice). + - 4 bytes containing the linear address in memory where this request object resides. + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaPagingMedDrvBegin, + + /** + Event generated by the Media Driver when the data read by a 'page in' request is written to the paging buffer. + + Trace data format: + - 4 bytes containing a code describing the type of the media (one of TMediaDevice). + - 4 bytes containing the linear address in memory where this request object resides. + - 4 bytes containing the linear address of the buffer to where the data is to be written. + - 4 bytes containing the offset within the buffer to where the data will be written. + - 4 bytes containing the length of data to be written. + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaMedDrvWriteBack, + + /** + Event generated when a request to 'page in' data is put on hold because the Media Driver is performing some background + operation (not another request) and cannot service the request. + + Trace data format: + - 4 bytes containing a code describing the type of the media (one of TMediaDevice). + - 4 bytes containing the linear address in memory where this request object resides. + + The context id (NThread*) in this trace is that of the media driver thread that services this 'page in' request. + */ + EPagingMediaMedDrvOnHold, + }; + + /** + Enumeration of sub-category values for trace category EKernelMemory. + @see EKernelMemory + */ + enum TKernelMemory + { + /** + Event recorded during startup and prime which details the initial amount of free RAM. + + Trace data format: + - 4 bytes containing the number of bytes of RAM the system started with. + */ + EKernelMemoryInitialFree, + + /** + Event recorded during prime which records the then-current amount of free RAM. + + Trace data format: + - 4 bytes containing the number of bytes of free RAM. + */ + EKernelMemoryCurrentFree, + + /** + Event recorded when a miscellaneous kernel allocation is made. These include: + - Memory for MMU page table contents + - Memory for MMU SPageTableInfos + - Memory for shadow pages + + Trace data format: + - 4 bytes containing the size, in bytes, of the allocation. + */ + EKernelMemoryMiscAlloc, + + /** + Event recorded when a miscellaneous kernel allocation (see EKernelMemoryMiscAlloc + above) is freed. + + Trace data format: + - 4 bytes containing the size, in bytes, of the freed allocation. + */ + EKernelMemoryMiscFree, + + /** + The amount of memory reserved for the minimum demand paging cache. The *actual* DP cache + also uses free memory, only this minimum amount is permanently reserved for that purpose. + This event is recorded during prime and when the amount changes. + + Trace data format: + - 4 bytes containing the minimum size, in bytes, of the demand paging cache. + */ + EKernelMemoryDemandPagingCache, + + /** + Physically contiguous memory allocated by device drivers via one of: + Epoc::AllocPhysicalRam() + Epoc::ZoneAllocPhysicalRam() + Epoc::ClaimPhysicalRam() + TRamDefragRequest::ClaimRamZone() + + Trace data format: + - 4 bytes containing the size of the allocated memory. + - 4 bytes containing the physical base address of allocated memory. + + NB: The prime function logs a EKernelMemoryDrvPhysAlloc record where the physical + address is -1 and should be ignored. + */ + EKernelMemoryDrvPhysAlloc, + + /** + Memory freed by device drivers via calls to all versions of + Epoc::FreePhysicalRam(). + + Trace data format: + - 4 bytes containing the size of the freed memory. + - 4 bytes containing the physical base address of freed memory. + */ + EKernelMemoryDrvPhysFree, + }; + + /** + Enumeration of sub-category values for trace category EHeap. + @see EHeap + */ + enum THeap + { + /** + Event recorded during process startup which logs the point of heap creation. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 2 bytes containing the size of header overhead, per allocation (0xFFFF indicates a variable size) + - 2 bytes containing the size of footer overhead, per allocation (0xFFFF indicates a variable size) + */ + EHeapCreate, + + /** + Event recorded during process startup which details the chunk being used as a heap. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 4 bytes containing the chunk ID (The RHandleBase* of the chunk) + */ + EHeapChunkCreate, + + /** + Event recorded when RHeap::Alloc() is called. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 4 bytes containing the address of the allocation + - 4 bytes containing the size of the allocation + - 4 bytes containing the requested size of allocation + */ + EHeapAlloc, + + /** + Event recorded when RHeap::ReAlloc() is called. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 4 bytes containing the address of the new allocation + - 4 bytes containing the size of the allocation + - 4 bytes containing the requested size of allocation + - 4 bytes containing the address of the old allocation + */ + EHeapReAlloc, + + /** + Event recorded when RHeap::Free() is called. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 4 bytes containing the address of the free'd allocation + */ + EHeapFree, + + /** + Event recorded when RHeap::Alloc() fails. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 4 bytes containing the requested size of allocation + */ + EHeapAllocFail, + + /** + Event recorded when RHeap::ReAlloc() fails. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 4 bytes containing the address of the old allocation + - 4 bytes containing the requested size of allocation + */ + EHeapReAllocFail, + + /** + Event recorded when heap memory corruption occurs. + + Trace data format: + - 4 bytes containing the heap ID (The RAllocator*) + - 4 bytes containing address of the corrupted memory block + - 4 bytes containing length of the corrupted memory block + */ + EHeapCorruption, + }; + + /** + Enumeration of sub-category values for trace category EMetaTrace. + @see EMetaTrace + */ + enum TMetaTrace + { + /** + Information about timestamps used for tracing. + + Trace data format: + - 4 bytes containing the period of the Timestamp value. + - 4 bytes containing the period of the Timestamp2 value. + - 4 bytes containing a set of bit flags with the following meaning: + - Bit 0, if true, indicates that Timestamp and Timestamp2 are two halves + of a single 64bit timestamp value; Timestamp2 is the most significant part. + - All other bits are presently undefined. + + The format of the timestamp period data is a period in seconds given using an exponent and mantissa + format, where the most significant 8 bits are the signed power-of-two value for the exponent, and + the least significant 24 bits are the integer value of the mantissa. The binary point is to the right + of the least significant mantissa bit, and the mantissa may not be in normalised form. + + Example code for decoding the period: + @code + TInt32 period; // value from trace record + int exponent = (signed char)(period>>24); + int mantissa = period&0xffffff; + double periodInSeconds = (double)mantissa*pow(2,exponent); + @endcode + */ + EMetaTraceTimestampsInfo, + + /** + Trace indicating the start of a test case being measured. + + Trace data format: + - 4 bytes containing measurement specific value. + - 4 bytes containing a further measurement specific value. + - Remaining data is ASCII text providing human readable information. + */ + EMetaTraceMeasurementStart, + + /** + Trace indicating the end of a test case being measured. + + Trace data format: + - 4 bytes containing measurement specific identifying value. + - 4 bytes containing a further measurement specific identifying value. + + The values contained in this trace must be identical to those in the corresponding + ETraceInfoMeasurementStart trace. + */ + EMetaTraceMeasurementEnd, + + /** + Trace indicating a change in state of the primary filter. + + Trace data format: + - 1 byte containing a trace category number. + - 1 byte containing the new filter state for the category. (0=off, 1=on). + - 2 byte padding. (Should be output as zeros.) + */ + EMetaTraceFilterChange + }; + + /** + Enumeration of sub-category values for trace category ERamAllocator. + @see BTrace::ERamAllocator + */ + enum TRamAllocator + { + /** + The number of RAM zones. + + Trace data format: + - 4 bytes containing the number of RAM zones. + */ + ERamAllocZoneCount, + + /** + Information on the layout of a RAM zone. + + Trace data format: + - 4 bytes containing the number of pages in the zone + - 4 bytes containing the physical base address of the zone + - 4 bytes containing the ID of the zone + - 1 bytes containing the preference of the zone + - 1 bytes containing the flags of the zone + - 2 bytes reserved for future use + */ + ERamAllocZoneConfig, + + /** + This trace is sent for every contiguous block of RAM that was allocated + during the kernel boot process. + + Trace data format: + - 4 bytes containing the number of contiguous pages allocated for the block + - 4 bytes containing the physical base address of the block + */ + ERamAllocBootAllocation, + + + /** + This trace marks the end of the boot allocations + + Trace data format: + - no extra bytes are sent + */ + ERamAllocBootAllocationEnd, + + /** + Event generated when a RAM zone's flags have been modified + This could occur when a RAM zone is blocked/unblocked from further + allocations from all/certain page types. + + Trace data format: + - 4 bytes containing the ID of the zone + - 4 bytes containing the flags of the zone + */ + ERamAllocZoneFlagsModified, + + /** + Event generated when DRamAllocator::ClaimPhysicalRam has successfully + claimed the specified RAM pages. + + Trace data format: + - 4 bytes containing the number of contiguous pages + - 4 bytes containing the base address of the pages + */ + ERamAllocClaimRam, + + /** + Event generated when DRamAllocator::MarkPageAllocated has successfully + marked the specified page as allocated. + + Trace data format: + - 4 bytes containing the TZonePageType type of the page + - 4 bytes containing the address of the page + */ + ERamAllocMarkAllocated, + + /** + Event generated when DRamAllocator::AllocContiguousRam successfully + allocates the requested number of pages. + + Trace data format: + - 4 bytes containing the TZonePageType type of the pages + - 4 bytes containing the number of contiguous pages + - 4 bytes containing the base address of the pages + */ + ERamAllocContiguousRam, + + /** + Event generated when DRamAllocator::FreePage has successfully freed + the specified RAM page. + + Trace data format: + - 4 bytes containing the TZonePageType type of the page + - 4 bytes containing the address of the page + */ + ERamAllocFreePage, + + /** + Event generated when DRamAllocator::FreePhysical successfully freed + the specified RAM page(s). + + Trace data format: + - 4 bytes containing the number of contiguous pages + - 4 bytes containing the base address of the pages + */ + ERamAllocFreePhysical, + + /** + Event generated for each contiguous block of pages when + DRamAllocator::AllocRamPages or DRamAllocator::ZoneAllocRamPages + are attempting to fulfil a request. + + Trace data format: + - 4 bytes containing the TZonePageType type of the pages + - 4 bytes containing the number of contiguous pages + - 4 bytes containing the base address of the pages + */ + ERamAllocRamPages, + + /** + Event generated for contiguous block of pages when + DRamAllocator::FreeRamPages is invoked. + + Trace data format: + - 4 bytes containing the TZonePageType type of the pages + - 4 bytes containing the number of contiguous pages + - 4 bytes containing the base address of the pages + */ + ERamAllocFreePages, + + /** + Event generated when DRamAllocator::AllocRamPages has successfully + allocated all the requested number of RAM pages. If DRamAllocator::AllocRamPages + couldn't allocate all the requested pages then this event is not generated. + + Trace data format: + - no extra bytes sent + */ + ERamAllocRamPagesEnd, + + /** + Event generated when all ERamAllocFreePages events for a particular + call of DRamAllocator::FreeRamPages have been generated. + + Trace data format: + - no extra bytes sent + */ + ERamAllocFreePagesEnd, + + /** + Event generated when DRamAllocator::ChangePageType is has successfully + updated the type of the specified page. + + Trace data format: + - 4 bytes containing the new TZonePageType type of the page + - 4 bytes containing the physical address of the page + */ + ERamAllocChangePageType, + + /** + Event generated when DRamAllocator::ZoneAllocContiguousRam has + successfully allocated the required number of pages. + + Trace data format: + - 4 bytes containing the TZonePageType type of the pages + - 4 bytes containing the number of contiguous pages + - 4 bytes containing the base address of the pages + */ + ERamAllocZoneContiguousRam, + + /** + Event generated when DRamAllocator::ZoneAllocRamPages has successfully + allocated all the requested RAM pages. If DRamAllocator::ZoneAllocRamPages + couldn't allocate all the requested pages then this event is not generated. + + Trace data format: + - no extra bytes sent + */ + ERamAllocZoneRamPagesEnd, + + /** + Event generated when Epoc::ClaimRamZone has successfully claimed + the requested zone. + + Trace data format: + - 4 bytes containing the ID of the zone that has been claimed. + */ + ERamAllocClaimZone, + }; + + enum TFastMutex + { + /** + Event generated when a thread acquires a fast mutex, (waits on it). + + Trace data format: + - 4 bytes containing the fast mutex id, (an NFastMutex*). + */ + EFastMutexWait, + + /** + Event generated when a thread releases a fast mutex, (signals it). + + Trace data format: + - 4 bytes containing the fast mutex id, (an NFastMutex*). + */ + EFastMutexSignal, + + /** + Event generated when a fast mutex is 'flashed' (signalled then immediately + waited on again). E.g the operation performed by NKern::FlashSystem. + + Trace data format: + - 4 bytes containing the fast mutex id, (an NFastMutex*). + */ + EFastMutexFlash, + + /** + Trace to associate a fast mutex with a textual name. + + Trace data format: + - 4 bytes containing the fast mutex id, (an NFastMutex*). + - 4 bytes containing unspecified data (should be output as zero). + - Remaining data is the ASCII name for the fast mutex. + */ + EFastMutexName, + + /** + Event generated when a thread blocks on a fast mutex. + + Trace data format: + - 4 bytes containing the fast mutex id, (an NFastMutex*). + */ + EFastMutexBlock, + }; + + /** + Enumeration of sub-category values for trace category EProfiling. + @see BTrace::EProfiling + */ + enum TProfiling + { + /** + CPU sample including program counter and thread context. + + Trace data format: + - 4 bytes containing the program counter. + - 4 bytes containing thread context (an NThread*). + */ + ECpuFullSample = 0, + + /** + Optimised CPU sample including program counter. + Doesn't include a thread context id as it hasn't changed since + the last sample. + + Trace data format: + - 4 bytes containing the program counter. + */ + ECpuOptimisedSample, + + /** + CPU sample from iDFC including program counter. + + Trace data format: + - 4 bytes containing the program counter. + */ + ECpuIdfcSample, + + /** + CPU sample from non-Symbian thread. + + Trace data format: + - no extra bytes are sent + */ + ECpuNonSymbianThreadSample + + }; + + /** + Enumeration of sub-category values for trace category ERawEvent. + @see BTrace::ERawEvent + */ + enum TRawEventTrace + { + + /** + For all the set Functions in the TRawEvent class. + Trace Data Format Varies depends which of the Overloaded Set Method from where its set . + Trace data format: + if there are only one 4 byte data + + --The Following oder is folloed for data. + - 4 bytes containing the event type + + if there are 2*4 byte data + - 4 bytes containing the event type + - 4 bytes containing the scan code + + if there are 3*4 byte data + - 4 bytes containing the event type + --4 bytes containining the X co-ordinate + --4 bytes containining the Y co-ordinate + + if there are 4*4 byte data + - 4 bytes containing the event type + --4 bytes containining the X co-ordinate + --4 bytes containining the Y co-ordinate + --4 bytes containining the Z co-ordinate + + if there are 5*4 byte data + - 4 bytes containing the event type + --4 bytes containining the X co-ordinate + --4 bytes containining the Y co-ordinate + --4 bytes containining the Z co-ordinate + --4 bytes containining the PointerNumber + + if there are 7*4 byte data + - 4 bytes containing the event type + --4 bytes containining the X co-ordinate + --4 bytes containining the Y co-ordinate + --4 bytes containining the Z co-ordinate + --4 bytes containining the Phi polar coordinate. + --4 bytes containining the Theta polar coordinate. + --4 bytes containining the rotation angle(alpha) + */ + + ESetEvent = 1, + + /** + For user side SetTip Events + Trace data format: + - 4 bytes to state containing Tip Info. + */ + ESetTipEvent, + + /** + For SetTilt Events + Trace data format: + - 4 bytes containing the event type + --4 bytes containining the Phi polar coordinate. + --4 bytes containining the Theta polar coordinate. + */ + ESetTiltEvent, + + /** + For SetRotation Events + Trace data format: + - 4 bytes containing the event type + --4 bytes containining the rotation angle (alpha) + */ + ESetRotationtEvent, + + /** + For SetPointerNumber Events + Trace data format: + - 4 bytes containing the Pointer Number + */ + ESetPointerNumberEvent, + + /** + For user side addevents (User::AddEvent) + Trace data format: + - 4 bytes containing the event type + */ + EUserAddEvent, + + /** + For kernal side addevents (Kern::AddEvent) + Trace data format: + - 4 bytes containing the event type + */ + EKernelAddEvent + }; + + enum TSymbianKernelSync + { + /** + A semaphore (DSemaphore) has been created. + + Trace data format: + - 4 bytes containing trace id (a DSemaphore*) for this semaphore. + - 4 bytes containing the owning DThread* or DProcess* + - Remaining data is the ASCII name of the semaphore. + */ + ESemaphoreCreate=0x00, + + /** + A semaphore (DSemaphore) has been destroyed. + + Trace data format: + - 4 bytes containing trace id (a DSemaphore*) for this semaphore. + */ + ESemaphoreDestroy=0x01, + + /** + A semaphore (DSemaphore) has been acquired. + + Trace data format: + - 4 bytes containing trace id (a DSemaphore*) for this semaphore. + */ + ESemaphoreAcquire=0x02, + + /** + A semaphore (DSemaphore) has been released. + + Trace data format: + - 4 bytes containing trace id (a DSemaphore*) for this semaphore. + */ + ESemaphoreRelease=0x03, + + /** + A thread has blocked on a semaphore (DSemaphore) + + Trace data format: + - 4 bytes containing trace id (a DSemaphore*) for this semaphore. + */ + ESemaphoreBlock=0x04, + + + /** + A mutex (DMutex) has been created. + + Trace data format: + - 4 bytes containing trace id (a DMutex*) for this mutex. + - 4 bytes containing the owning DThread* or DProcess* + - Remaining data is the ASCII name of the mutex. + */ + EMutexCreate=0x10, + + /** + A mutex (DMutex) has been destroyed. + + Trace data format: + - 4 bytes containing trace id (a DMutex*) for this mutex. + */ + EMutexDestroy=0x11, + + /** + A mutex (DMutex) has been acquired. + + Trace data format: + - 4 bytes containing trace id (a DMutex*) for this mutex. + */ + EMutexAcquire=0x12, + + /** + A mutex (DMutex) has been released. + + Trace data format: + - 4 bytes containing trace id (a DMutex*) for this mutex. + */ + EMutexRelease=0x13, + + /** + A thread has blocked on a mutex (DMutex) + + Trace data format: + - 4 bytes containing trace id (a DMutex*) for this mutex. + */ + EMutexBlock=0x14, + + + /** + A condition variable (DCondVar) has been created. + + Trace data format: + - 4 bytes containing trace id (a DCondVar*) for this condition variable. + - 4 bytes containing the owning DThread* or DProcess* + - Remaining data is the ASCII name of the condition variable. + */ + ECondVarCreate=0x20, + + /** + A condition variable (DCondVar) has been destroyed. + + Trace data format: + - 4 bytes containing trace id (a DCondVar*) for this condition variable. + */ + ECondVarDestroy=0x21, + + /** + A thread has blocked on a condition variable (DCondVar) + + Trace data format: + - 4 bytes containing trace id (a DCondVar*) for this condition variable. + - 4 bytes containing trace id (DMutex*) for the associated mutex. + */ + ECondVarBlock=0x22, + + /** + A thread has been released from a condition variable (DCondVar) wait + + Trace data format: + - 4 bytes containing trace id (a DCondVar*) for this condition variable. + - 4 bytes containing trace id (DMutex*) for the associated mutex. + */ + ECondVarWakeUp=0x23, + + /** + A condition variable (DCondVar) has been signalled + + Trace data format: + - 4 bytes containing trace id (a DCondVar*) for this condition variable. + - 4 bytes containing trace id (DMutex*) for the associated mutex. + */ + ECondVarSignal=0x24, + + /** + A condition variable (DCondVar) has been signalled in broadcast mode. + + Trace data format: + - 4 bytes containing trace id (a DCondVar*) for this condition variable. + - 4 bytes containing trace id (DMutex*) for the associated mutex. + */ + ECondVarBroadcast=0x25, + + }; + + /** + Calculate the address of the next trace record. + @param aCurrentRecord A pointer to a trace record. + @return The address of the trace record which follows aCurrentRecord. + */ + inline static TUint8* NextRecord(TAny* aCurrentRecord); + +#ifdef __KERNEL_MODE__ + + /** + Create initial trace output required for the specified trace category. + E.g. For the EThreadIdentification category, this will cause traces which identify + all threads already in existence at this point. + + @aCategory The trace category, or -1 to indicate all trace categories. + + @publishedPartner + @released + */ + IMPORT_C static void Prime(TInt aCategory=-1); + + /** + Prototype for function which is called to output trace records. + I.e. as set by SetHandler(). + + The handler function should output all values which are appropriate for the + trace as specified in aHeader. + + @param aHeader The 4 bytes for the trace header. + @param aHeader2 The second header word. + (If EHeader2Present is set in the header flags.) + @param aContext The context id. + (If EContextIdPresent is set in the header flags.) + @param a1 The first four bytes of trace data. + (Only if the header size indicates that this is present.) + @param a2 The second four bytes of trace data. + (Only if the header size indicates that this is present.) + @param a3 This is either the third four bytes of trace data, if + the header size indicates there is between 9 and 12 bytes + of trace data. If more than 12 of trace data are indicated, then + a3 contains a pointer to the remaining trace data, bytes 8 trough to N. + This trace data is word aligned. + @param aExtra The 'extra' value. + (If EExtraPresent is set in the header flags.) + @param aPc The Program Counter value. + (If EPcPresent is set in the header flags.) + + @return True, if the trace handler is enabled and outputting trace. + False otherwise. + + Here is an example implementation of a trace handler: + + @code + TInt size = (aHeader>>BTrace::ESizeIndex*8)&0xff; + TInt flags = (aHeader>>BTrace::EFlagsIndex*8)&0xff; + Output(aHeader), size -= 4; + if(flags&BTrace::EHeader2Present) + Output(aHeader2), size -= 4; + if(flags&BTrace::EContextIdPresent) + Output(aContext), size -= 4; + if(flags&BTrace::EPcPresent) + Output(aPc), size -= 4; + if(flags&BTrace::EExtraPresent) + Output(aExtra), size -= 4; + if(size<=0) + return ETrue; + Output(a1), size -= 4; + if(size<=0) + return ETrue; + Output(a2), size -= 4; + if(size<=0) + return ETrue; + if(size<=4) + Output(a3); + else + { + TUint32* data = (TUint32*)a3; + TUint32* end = (TUint32*)(a3+size); + do Output(*data++); while(data + +extern "C" { +/** +@publishedAll +@released + +A Nanokernel utility function that compares two memory buffers for equality. + +The two buffers are considered equal only if: + +1. the buffers have the same length + +and + +2. the binary content of both buffers is the same. + +@param aLeft The start address of the first buffer in the comparison. +@param aLeftLen The length of the first buffer in the comparison. +@param aRight The start address of the second buffer in the comparison. +@param aRightLen The length of the second buffer in the comparison. + +@return Zero if both buffers are equal; non-zero, otherwise. + +@panic USER 88 In debug mode only, if aLeftL is negative, + and the function is called on the user side. +@panic KERN-COMMON 88 In debug mode only, if aLeftL is negative, + and the function is called on the kernel side. +@panic USER 89 In debug mode only, if aRightL is negative, + and the function is called on the user side. +@panic KERN-COMMON 89 In debug mode only, if aRightL is negative, + and the function is called on the kernel side. +*/ +IMPORT_C TInt memcompare(const TUint8* aLeft, TInt aLeftLen, const TUint8* aRight, TInt aRightLen); + + + + +/** +@publishedAll +@released + +A Nanokernel utility function that moves (copies) bytes in memory. + +The function assumes that the addresses are aligned on word boundaries, +and that the length value is a multiple of 4. + +@param aTrg The target address. +@param aSrc The source address. +@param aLength The number of bytes to be moved. + +@return The target address. + +@panic USER 91 In debug mode only, if aLength is not a multiple of 4, + and the function is called on the user side. +@panic KERN-COMMON 91 In debug mode only, if aLength is not a multiple of 4, + and the function is called on the kernel side. +@panic USER 92 In debug mode only, if aSrc is not aligned on a word boundary, + and the function is called on the user side. +@panic KERN-COMMON 92 In debug mode only, if aSrc is not aligned on a word boundary, + and the function is called on the kernel side. +@panic USER 93 In debug mode only, if aTrg is not aligned on a word boundary, + and the function is called on the user side. +@panic KERN-COMMON 93 In debug mode only, if aTrg is not aligned on a word boundary, + and the function is called on the kernel side. +*/ +IMPORT_C TAny* wordmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength); + + + + +/** +@publishedAll +@released + +A Nanokernel utility function that sets the specified number of bytes +to binary zero. + +@param aTrg The start address. +@param aLength The number of bytes to be set. + +@return The target address. +*/ +IMPORT_C TAny* memclr(TAny* aTrg, unsigned int aLength); +} + + +#if defined(__TOOLS2__) && !defined(_WIN32) +// memcpy prototype clash: Throw spec on Linux differs from Symbian? +#include +#elif !defined(__TOOLS__) +extern "C" { +/** +@publishedAll +@released + +A Nanokernel utility function that sets all of the specified number of bytes to +the specified fill value. + +@param aTrg The start address. +@param aValue The fill value (the first or junior byte). +@param aLength The number of bytes to be set. + +@return The target address. +*/ + IMPORT_C TAny* memset(TAny* aTrg, TInt aValue, unsigned int aLength); + + + + +/** +@publishedAll +@released + +A Nanokernel utility function that copies bytes in memory. + +@param aTrg The target address. +@param aSrc The source address. +@param aLength The number of bytes to be moved. + +@return The target address. +*/ + IMPORT_C TAny* memcpy(TAny* aTrg, const TAny* aSrc, unsigned int aLength); + + + + +/** +@publishedAll +@released + +A Nanokernel utility function that moves (copies) bytes in memory. + +@param aTrg The target address. +@param aSrc The source address. +@param aLength The number of bytes to be moved. + +@return The target address. +*/ + IMPORT_C TAny* memmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength); +} +#else +#include +#endif + + + + +/** +@publishedAll +@released + +Tests whether the specified value is less than or equal to the +specified upper limit. + +@param aVal The value to be tested. +@param aLimit The upper limit. + +@return True, if the value is less than or equal to the specified upper limit; + false, otherwise. +*/ +inline TInt Lim(TInt aVal,TUint aLimit) + {return(((TUint)aVal)<=aLimit);} + + + + +/** +@publishedAll +@released + +Tests whether the specified value is strictly less than the +specified upper limit. + +@param aVal The value to be tested. +@param aLimit The upper limit. + +@return True, if the value is strictly less than the specified upper limit; + false, otherwise. +*/ +inline TInt LimX(TInt aVal,TUint aLimit) + {return(((TUint)aVal) +inline T Min(T aLeft,T aRight) + {return(aLeft +inline T Min(T aLeft,TUint aRight) + {return(aLeft<(TInt)aRight ? aLeft : (T)aRight);} + + + + +/** +@publishedAll +@released + +Returns the larger of two values. + +@param aLeft The first value to be compared. +@param aRight The second value to be compared. + +@return The larger value. +*/ +template +inline T Max(T aLeft,T aRight) + {return(aLeft +inline T Max(T aLeft,TUint aRight) + {return(aLeft<(TInt)aRight ? (TInt)aRight : aLeft);} + + + + +/** +@publishedAll +@released + +Returns an absolute value. + +@param aVal The source value. + +@return The absolute value +*/ +template +inline T Abs(T aVal) + {return(aVal<0 ? -aVal : aVal);} + + + + +/** +@publishedAll +@released + +Determines whether a specified value lies within a defined range of values. + +@param aMin The lower value of the range. +@param aVal The value to be compared. +@param aMax The higher value of the range. + +@return True, if the specified value lies within the range; false, otherwise. +*/ +template +inline TBool Rng(T aMin,T aVal,T aMax) + {return(aVal>=aMin && aVal<=aMax);} + + + + +/** +@publishedAll +@released + +Adds a value to a pointer. + +@param aPtr Pointer to an object of type T. +@param aVal The value to be added. + +@return The resulting pointer value, as a pointer to a type T. +*/ +template +inline T* PtrAdd(T* aPtr,S aVal) + {return((T*)(((TUint8*)aPtr)+aVal));} + + + + +/** +@publishedAll +@released + +Subtracts a value from a pointer. + +@param aPtr Pointer to an object of type T. +@param aVal The value to be added. + +@return The resulting pointer value, as a pointer to a type T. +*/ +template +inline T* PtrSub(T* aPtr,S aVal) + {return((T*)(((TUint8*)aPtr)-aVal));} + + + + +/** +@publishedAll +@released + +Aligns the specified value onto a 2-byte boundary. + +@param aValue The value to be aligned. + +@return The aligned value. +*/ +template +inline T Align2(T aValue) + {return((T)((((TUint)aValue)+sizeof(TUint16)-1)&~(sizeof(TUint16)-1)));} + + + + +/** +@publishedAll +@released + +Aligns the specified value onto a 4-byte boundary. + +@param aValue The value to be aligned. + +@return The aligned value. +*/ +template +inline T Align4(T aValue) + {return((T)((((TUint)aValue)+sizeof(TUint32)-1)&~(sizeof(TUint32)-1)));} + + + + +/** +@publishedAll +@released + +A templated class which encapsulates a reference to an object within a wrapper. + +The wrapper object can be passed to a function as a value type. This allows +a reference to be passed to a function as a value type. + +This wrapper object is commonly termed a value reference. +*/ +template +class TRefByValue + { +public: + inline TRefByValue(T& aRef); + inline operator T&(); +private: + TRefByValue& operator=(TRefByValue aRef); +private: + T &iRef; + }; + + + + +#if !defined (__KERNEL_MODE__) +class TDesC16; // forward declaration for TChar member functions +class TPtrC16; // forward declaration for TChar member functions +#endif + + + + +/** +@publishedAll +@released + +Holds a character value and provides a number of utility functions to +manipulate it and test its properties. + +For example, there are functions to convert the character +to uppercase and test whether or not it is a control character. + +The character value is stored as a 32-bit unsigned integer. The shorthand +"TChar value" is used to describe the character value wrapped by a TChar +object. + +TChar can be used to represent Unicode values outside plane 0 (that is, the +extended Unicode range from 0x10000 to 0xFFFFF). This differentiates it from +TText which can only be used for 16-bit Unicode character values. + +@see TText +*/ +class TChar + { +public: + + + /** + General Unicode character category. + + The high nibble encodes the major category (Mark, Number, etc.) and a low + nibble encodes the subdivisions of that category. + + The category codes can be used in three ways: + + (i) as unique constants: there is one for each Unicode category, with a + name of the form + @code + ECategory + @endcode + where + @code + + @endcode + is the category name given by + the Unicode database (e.g., the constant ELuCategory is used for lowercase + letters, category Lu); + + (ii) as numbers in certain ranges: letter categories are all <= EMaxLetterCategory; + + (iii) as codes in which the upper nibble gives the category group + (e.g., punctuation categories all yield TRUE for + the test (category & 0xF0) ==EPunctuationGroup). + */ + enum TCategory + { + /** + Alphabetic letters. + + Includes ELuCategory, ELlCategory and ELtCategory. + */ + EAlphaGroup = 0x00, + + + /** + Other letters. + + Includes ELoCategory. + */ + ELetterOtherGroup = 0x10, + + + /** + Letter modifiers. + + Includes ELmCategory. + */ + ELetterModifierGroup = 0x20, + + + /** + Marks group. + + Includes EMnCategory, EMcCategory and EMeCategory. + */ + EMarkGroup = 0x30, + + + /** + Numbers group. + + Includes ENdCategory, ENlCategory and ENoCategory. + */ + ENumberGroup = 0x40, + + + /** + Punctuation group. + + IncludesEPcCategory, PdCategory, EpeCategory, EPsCategory and EPoCategory. + */ + EPunctuationGroup = 0x50, + + + /** + Symbols group. + + Includes ESmCategory, EScCategory, ESkCategory and ESoCategory. + */ + ESymbolGroup = 0x60, + + + /** + Separators group. + + Includes EZsCategory, EZlCategory and EZlpCategory. + */ + ESeparatorGroup = 0x70, + + + /** + Control, format, private use, unassigned. + + Includes ECcCategory, ECtCategory, ECsCategory, + ECoCategory and ECnCategory. + */ + EControlGroup = 0x80, + + + /** + The highest possible groups category. + */ + EMaxAssignedGroup = 0xE0, + + + /** + Unassigned to any other group. + */ + EUnassignedGroup = 0xF0, + + + /** + Letter, Uppercase. + */ + ELuCategory = EAlphaGroup | 0, + + + /** + Letter, Lowercase. + */ + ELlCategory = EAlphaGroup | 1, + + + /** + Letter, Titlecase. + */ + ELtCategory = EAlphaGroup | 2, + + + /** + Letter, Other. + */ + ELoCategory = ELetterOtherGroup | 0, + + + /** + The highest possible (non-modifier) letter category. + */ + EMaxLetterCategory = ELetterOtherGroup | 0x0F, + + /** + Letter, Modifier. + */ + ELmCategory = ELetterModifierGroup | 0, + + + /** + The highest possible letter category. + */ + EMaxLetterOrLetterModifierCategory = ELetterModifierGroup | 0x0F, + + /** + Mark, Non-Spacing + */ + EMnCategory = EMarkGroup | 0, + + + /** + Mark, Combining. + */ + EMcCategory = EMarkGroup | 1, + + + /** + Mark, Enclosing. + */ + EMeCategory = EMarkGroup | 2, + + + /** + Number, Decimal Digit. + */ + ENdCategory = ENumberGroup | 0, + + + /** + Number, Letter. + */ + ENlCategory = ENumberGroup | 1, + + + /** + Number, Other. + */ + ENoCategory = ENumberGroup | 2, + + + /** + Punctuation, Connector. + */ + EPcCategory = EPunctuationGroup | 0, + + + /** + Punctuation, Dash. + */ + EPdCategory = EPunctuationGroup | 1, + + + /** + Punctuation, Open. + */ + EPsCategory = EPunctuationGroup | 2, + + + /** + Punctuation, Close. + */ + EPeCategory = EPunctuationGroup | 3, + + + /** + Punctuation, Initial Quote + */ + EPiCategory = EPunctuationGroup | 4, + + + /** + Punctuation, Final Quote + */ + EPfCategory = EPunctuationGroup | 5, + + + /** + Punctuation, Other. + */ + EPoCategory = EPunctuationGroup | 6, + + + /** + Symbol, Math. + */ + ESmCategory = ESymbolGroup | 0, + + + /** + Symbol, Currency. + */ + EScCategory = ESymbolGroup | 1, + + + /** + Symbol, Modifier. + */ + ESkCategory = ESymbolGroup | 2, + + + /** + Symbol, Other. + */ + ESoCategory = ESymbolGroup | 3, + + + /** + The highest possible graphic character category. + */ + EMaxGraphicCategory = ESymbolGroup | 0x0F, + + + /** + Separator, Space. + */ + EZsCategory = ESeparatorGroup | 0, + + + /** + The highest possible printable character category. + */ + EMaxPrintableCategory = EZsCategory, + + + /** + Separator, Line. + */ + EZlCategory = ESeparatorGroup | 1, + + + /** + Separator, Paragraph. + */ + EZpCategory = ESeparatorGroup | 2, + + + /** + Other, Control. + */ + ECcCategory = EControlGroup | 0, + + + /** + Other, Format. + */ + ECfCategory = EControlGroup | 1, + + + /** + The highest possible category for assigned 16-bit characters; does not + include surrogates, which are interpreted as pairs and have no meaning + on their own. + */ + EMaxAssignedCategory = EMaxAssignedGroup | 0x0F, + + + /** + Other, Surrogate. + */ + ECsCategory = EUnassignedGroup | 0, + + + /** + Other, Private Use. + */ + ECoCategory = EUnassignedGroup | 1, + + + /** + Other, Not Assigned. + */ + ECnCategory = EUnassignedGroup | 2 + }; + + + /** + The bi-directional Unicode character category. + + For more information on the bi-directional algorithm, see Unicode Technical + Report No. 9 available at: http://www.unicode.org/unicode/reports/tr9. + */ + enum TBdCategory + { + /** + Left to right. + */ + ELeftToRight, // L Left-to-Right + + + /** + Left to right embedding. + */ + ELeftToRightEmbedding, // LRE Left-to-Right Embedding + + + /** + Left-to-Right Override. + */ + ELeftToRightOverride, // LRO Left-to-Right Override + + + /** + Right to left. + */ + ERightToLeft, // R Right-to-Left + + + /** + Right to left Arabic. + */ + ERightToLeftArabic, // AL Right-to-Left Arabic + + + /** + Right to left embedding. + */ + ERightToLeftEmbedding, // RLE Right-to-Left Embedding + + + /** + Right-to-Left Override. + */ + ERightToLeftOverride, // RLO Right-to-Left Override + + + /** + Pop Directional Format. + */ + EPopDirectionalFormat, // PDF Pop Directional Format + + + /** + European number. + */ + EEuropeanNumber, // EN European Number + + + /** + European number separator. + */ + EEuropeanNumberSeparator, // ES European Number Separator + + + /** + European number terminator. + */ + EEuropeanNumberTerminator, // ET European Number Terminator + + + /** + Arabic number. + */ + EArabicNumber, // AN Arabic Number + + + /** + Common number separator. + */ + ECommonNumberSeparator, // CS Common Number Separator + + + /** + Non Spacing Mark. + */ + ENonSpacingMark, // NSM Non-Spacing Mark + + + /** + Boundary Neutral. + */ + EBoundaryNeutral, // BN Boundary Neutral + + + /** + Paragraph Separator. + */ + EParagraphSeparator, // B Paragraph Separator + + + /** + Segment separator. + */ + ESegmentSeparator, // S Segment Separator + + + /** + Whitespace + */ + EWhitespace, // WS Whitespace + + + /** + Other neutrals; all other characters: punctuation, symbols. + */ + EOtherNeutral // ON Other Neutrals + }; + + + /** + Notional character width as known to East Asian (Chinese, Japanese, + Korean (CJK)) coding systems. + */ + enum TCjkWidth + { + /** + Includes 'ambiguous width' defined in Unicode Technical Report 11: East Asian Width + */ + ENeutralWidth, + + + /** + Character which occupies a single cell. + */ + EHalfWidth, // other categories are as defined in the report + + + /** + Character which occupies 2 cells. + */ + EFullWidth, + + + /** + Characters that are always narrow and have explicit full-width + counterparts. All of ASCII is an example of East Asian Narrow + characters. + */ + ENarrow, + + /** + Characters that are always wide. This category includes characters that + have explicit half-width counterparts. + */ + EWide + }; + + + /** + @deprecated + + Encoding systems used by the translation functions. + */ + enum TEncoding + { + /** + The Unicode encoding. + */ + EUnicode, + + + /** + The shift-JIS encoding (used in Japan). + */ + EShiftJIS + }; + + + /** + Flags defining operations to be performed using TChar::Fold(). + + The flag values are passed to the Fold() funtion. + + @see TChar::Fold + */ + enum + { + /** + Convert characters to their lower case form if any. + */ + EFoldCase = 1, + + + /** + Strip accents + */ + EFoldAccents = 2, + + + /** + Convert digits representing values 0..9 to characters '0'..'9' + */ + EFoldDigits = 4, + + + /** + Convert all spaces (ordinary, fixed-width, ideographic, etc.) to ' ' + */ + EFoldSpaces = 8, + + + /** + Convert hiragana to katakana. + */ + EFoldKana = 16, + + + /** + Fold fullwidth and halfwidth variants to their standard forms + */ + EFoldWidth = 32, + + + /** + Perform standard folding operations, i.e.those done by Fold() with no argument + */ + EFoldStandard = EFoldCase | EFoldAccents | EFoldDigits | EFoldSpaces, + + + /** + Perform all possible folding operations + */ + EFoldAll = -1 + }; + + + struct TCharInfo + /** + A structure to hold information about a Unicode character. + + An object of this type is passed to TChar::GetInfo(). + + @see TChar::GetInfo + */ + { + /** + General category. + */ + TCategory iCategory; + + + /** + Bi-directional category. + */ + TBdCategory iBdCategory; + + + /** + Combining class: number (currently) in the range 0..234 + */ + TInt iCombiningClass; + + + /** + Lower case form. + */ + TUint iLowerCase; + + + /** + Upper case form. + */ + TUint iUpperCase; + + + /** + Title case form. + */ + TUint iTitleCase; + + + /** + True, if the character is mirrored. + */ + TBool iMirrored; + + + /** + Integer numeric value: -1 if none, -2 if a fraction. + */ + TInt iNumericValue; + }; + + inline TChar(); + inline TChar(TUint aChar); + inline TChar& operator-=(TUint aChar); + inline TChar& operator+=(TUint aChar); + inline TChar operator-(TUint aChar); + inline TChar operator+(TUint aChar); + inline operator TUint() const; +#ifndef __KERNEL_MODE__ + inline void Fold(); + inline void LowerCase(); + inline void UpperCase(); + inline TBool Eos() const; + IMPORT_C TUint GetUpperCase() const; + IMPORT_C TUint GetLowerCase() const; + IMPORT_C TBool IsLower() const; + IMPORT_C TBool IsUpper() const; + IMPORT_C TBool IsAlpha() const; + IMPORT_C TBool IsDigit() const; + IMPORT_C TBool IsAlphaDigit() const; + IMPORT_C TBool IsHexDigit() const; + IMPORT_C TBool IsSpace() const; + IMPORT_C TBool IsPunctuation() const; + IMPORT_C TBool IsGraph() const; + IMPORT_C TBool IsPrint() const; + IMPORT_C TBool IsControl() const; + inline void Fold(TInt aFlags); + inline void TitleCase(); + IMPORT_C TUint GetTitleCase() const; + IMPORT_C TBool IsTitle() const; + IMPORT_C TBool IsAssigned() const; + IMPORT_C void GetInfo(TCharInfo& aInfo) const; + IMPORT_C TCategory GetCategory() const; + IMPORT_C TBdCategory GetBdCategory() const; + IMPORT_C TInt GetCombiningClass() const; + IMPORT_C TBool IsMirrored() const; + IMPORT_C TInt GetNumericValue() const; + IMPORT_C TCjkWidth GetCjkWidth() const; + IMPORT_C static TBool Compose(TUint& aResult,const TDesC16& aSource); + IMPORT_C TBool Decompose(TPtrC16& aResult) const; + +protected: + inline void SetChar(TUint aChar); +#endif +private: + TUint iChar; + __DECLARE_TEST; + }; + +#include +#ifndef __KERNEL_MODE__ +#include +#endif + + + + +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +#define __Size (sizeof(TUint)/sizeof(TUint16)) +/** +@publishedAll +@released + +Defines a build-independent non-modifiable descriptor. + +A 16-bit build variant is generated for a Unicode, non-kernel +mode build. + +A build-independent type should always be used unless an explicit 8-bit +or 16-bit type is required. + +@see TDesC8 +@see TDesC16 +*/ +typedef TDesC16 TDesC; + + + + +/** +@publishedAll +@released + +Defines a build-independent non-modifiable pointer descriptor. + +A 16-bit build variant is generated for a Unicode, non-kernel +mode build. + +A build-independent type should always be used unless an explicit 8-bit +or 16-bit type is required. + +@see TPtrC8 +@see TPtrC16 +*/ +typedef TPtrC16 TPtrC; + + + + +/** +@publishedAll +@released + +Defines a build-independent modifiable descriptor. + +A 16-bit build variant is generated for a Unicode, non-kernel +mode build. + +A build-independent type should always be used unless an explicit 8-bit +or 16-bit type is required. + +@see TDes8 +@see TDes16 +*/ +typedef TDes16 TDes; + + + + +/** +@publishedAll +@released + +Defines a build-independent modifiable pointer descriptor. + +A 16-bit build variant is generated for a Unicode, non-kernel +mode build. + +A build-independent type should always be used unless an explicit 8-bit +or 16-bit type is required. + +@see TPtr8 +@see TPtr16 +*/ +typedef TPtr16 TPtr; + + + + +#ifndef __KERNEL_MODE__ +/** +@publishedAll +@released + +Defines a build-independent heap descriptor. + +A 16-bit build variant is generated for a Unicode, non-kernel +mode build. + +A build-independent type should always be used unless an explicit 8-bit +or 16-bit type is required. + +@see HBufC8 +@see HBufC16 +*/ +typedef HBufC16 HBufC; + + + + +/** +@publishedAll +@released + +Defines a build-independent descriptor overflow handler. + +A 16-bit build variant is generated for a Unicode, non-kernel +mode build. + +A build-independent type should always be used unless an explicit 8-bit +or 16-bit type is required. + +@see TDes8Overflow +@see TDes16Overflow +*/ +typedef TDes16Overflow TDesOverflow; + + +/** +@publishedAll +@released + +Defines a build-independent resizable buffer descriptor. + +A 16-bit build variant is generated for a Unicode, non-kernel mode build. + +A build-independent type should always be used unless an explicit 8-bit +or 16-bit type is required. + +@see RBuf8 +@see RBuf16 +*/ +typedef RBuf16 RBuf; + +#endif +#else +#define __Size (sizeof(TUint)/sizeof(TUint8)) + + + + +/** +@publishedAll +@released + +Defines a build-independent non-modifiable descriptor. + +An 8-bit build variant is generated for a non-Unicode build. + +This build-independent type should always be used unless an explicit 8-bit +or 16-bit build variant is required. + +@see TDesC8 +@see TDesC16 +*/ +typedef TDesC8 TDesC; + + + + +/** +@publishedAll +@released + +Defines a build-independent non-modifiable pointer descriptor. + +An 8-bit build variant is generated for a non-Unicode build. + +This build-independent type should always be used unless an explicit 8-bit +or 16-bit build variant is required. + +@see TPtrC8 +@see TPtrC16 +*/ +typedef TPtrC8 TPtrC; + + + + +/** +@publishedAll +@released + +Defines a build-independent modifiable descriptor. + +An 8-bit build variant is generated for a non-Unicode build. + +This build-independent type should always be used unless an explicit 8-bit +or 16-bit build variant is required. + +@see TDes8 +@see TDes16 +*/ +typedef TDes8 TDes; + + + + +/** +@publishedAll +@released + +Defines a build-independent modifiable pointer descriptor. + +An 8-bit build variant is generated for a non-Unicode build. + +This build-independent type should always be used unless an explicit 8-bit +or 16-bit build variant is required. + +@see TPtr8 +@see TPtr16 +*/ +typedef TPtr8 TPtr; +#ifndef __KERNEL_MODE__ + + + + +/** +@publishedAll +@released + +Defines a build-independent heap descriptor. + +An 8-bit build variant is generated for a non-Unicode, non-kernel +mode build. + +This build-independent type should always be used unless an explicit 8-bit +or 16-bit build variant is required. + +@see HBufC8 +@see HBufC16 +*/ +typedef HBufC8 HBufC; + + + + +/** +@publishedAll +@released + +Defines a build-independent descriptor overflow handler. + +An 8-bit build variant is generated for a non-Unicode, non-kernel +mode build. + +This build-independent type should always be used unless an explicit 8-bit +or 16-bit build variant is required. + +@see TDes8Overflow +@see TDes16Overflow +*/ +typedef TDes8Overflow TDesOverflow; + + +/** +@publishedAll +@released + +Defines a build-independent resizable buffer descriptor. + +An 8-bit build variant is generated for a non-Unicode, non-kernel mode build. + +This build-independent type should always be used unless an explicit 8-bit +or 16-bit build variant is required. + +@see RBuf8 +@see RBuf16 +*/ +typedef RBuf8 RBuf; + +#endif +#endif + + +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +typedef TBufCBase16 TBufCBase; +#else +typedef TBufCBase8 TBufCBase; +#endif + +/** +@publishedAll +@released + +A build-independent non-modifiable buffer descriptor. + +This is a descriptor class which provides a buffer of fixed length for +containing and accessing TUint16 or TUint8 data, depending on the build. + +The class intended for instantiation. The data that the descriptor represents +is part of the descriptor object itself. + +The class is templated, based on an integer value which defines the size of +the descriptor's data area. + +The data is intended to be accessed, but not modified; however, it can be +completely replaced using the assignment operators of this class. The base +class provides the functions through which the data is accessed. + +This class derives from TBufCBase16 for a Unicode, non-kernel build, but +derives from TBufCBase8 for a non-Unicode build. + +@see TDesC +@see TDesC8 +@see TDesC16 +@see TPtr +@see TPtr8 +@see TPtr16 +@see TBufC8 +@see TBufC16 +*/ +template +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +class TBufC : public TBufCBase16 +#else +class TBufC : public TBufCBase8 +#endif + { +public: + inline TBufC(); + inline TBufC(const TText* aString); + inline TBufC(const TDesC& aDes); + inline TBufC& operator=(const TText* aString); + inline TBufC& operator=(const TDesC& aDes); + inline TPtr Des(); +private: + TText iBuf[__Align(S)]; + }; + + + +/** +@publishedAll +@released + +A build-independent modifiable buffer descriptor. + +This is a descriptor class which provides a buffer of fixed length for +containing, accessing and manipulating TUint16 or TUint8 data, depending +on the build. + +The class is intended for instantiation. The data that the descriptor represents +is part of the descriptor object itself. + +The class is templated, based on an integer value which determines the size +of the data area created as part of the buffer descriptor object; this is +also the maximum length of the descriptor. + +The data is intended to be both accessed and modified. The base classes provide +the functions through which the data is accessed. + +This class derives from TBufCBase16 for a Unicode, non-kernel build, but +derives from TBufCBase8 for a non-Unicode build. + +@see TDesC +@see TDesC8 +@see TDesC16 +@see TDes +@see TDes8 +@see TDes16 +@see TPtr +@see TPtr8 +@see TPtr16 +*/ +template +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +class TBuf : public TBufBase16 +#else +class TBuf : public TBufBase8 +#endif + { +public: + inline TBuf(); + inline explicit TBuf(TInt aLength); + inline TBuf(const TText* aString); + inline TBuf(const TDesC& aDes); + inline TBuf& operator=(const TText* aString); + inline TBuf& operator=(const TDesC& aDes); + inline TBuf& operator=(const TBuf& aBuf); +private: + TText iBuf[__Align(S)]; + }; + + + + +/** +@publishedAll +@released + +Value reference used in operator TLitC::__TRefDesC(). + +@see TRefByValue +*/ +typedef TRefByValue __TRefDesC; + + + + +/** +@publishedAll +@released + +Encapsulates literal text. + +This is always constructed using an _LIT macro. + +This class is build independent; i.e. for a non-Unicode build, an 8-bit build +variant is generated; for a Unicode build, a 16 bit build variant is generated. + +The class has no explicit constructors. See the _LIT macro definition. +*/ +template +class TLitC + { +public: + /** + @internalComponent + */ + enum {BufferSize=S-1}; + inline const TDesC* operator&() const; + inline operator const TDesC&() const; + inline const TDesC& operator()() const; + inline operator const __TRefDesC() const; +public: +#if !defined(_UNICODE) || defined(__KERNEL_MODE__) + + /** + @internalComponent + */ + typedef TUint8 __TText; +#elif defined(__GCC32__) + + /** + @internalComponent + */ + typedef wchar_t __TText; +#elif defined(__VC32__) + + /** + @internalComponent + */ + typedef TUint16 __TText; + +#elif defined(__CW32__) + + /** + @internalComponent + */ + typedef TUint16 __TText; +#elif !defined(__TText_defined) +#error no typedef for __TText +#endif +public: + /** + @internalComponent + */ + TUint iTypeLength; + + /** + @internalComponent + */ + __TText iBuf[__Align(S)]; + }; + + +/** +@publishedAll +@released + +Defines an empty or null literal descriptor. + +This is the build independent form. +An 8 bit build variant is generated for a non-Unicode build; +a 16 bit build variant is generated for a Unicode build. +*/ +_LIT(KNullDesC,""); + + + +/** +@publishedAll +@released + +Defines an empty or null literal descriptor for use with 8-bit descriptors. +*/ +_LIT8(KNullDesC8,""); +#ifndef __KERNEL_MODE__ + + + +/** +@publishedAll +@released + +Defines an empty or null literal descriptor for use with 16-bit descriptors +*/ +_LIT16(KNullDesC16,""); +#endif + + + + +/** +@publishedAll +@released + +Packages a non-modifiable pointer descriptor which represents an object of +specific type. + +The template parameter defines the type of object. + +The object represented by the packaged pointer descriptor is accessible through +the package but cannot be changed. */ +template +class TPckgC : public TPtrC8 + { +public: + inline TPckgC(const T& aRef); + inline const T& operator()() const; +private: + TPckgC& operator=(const TPckgC& aRef); + }; + + + + +/** +@publishedAll +@released + +Packages a modifiable pointer descriptor which represents an object of specific +type. + +The template parameter defines the type of object. + +The object represented by the packaged pointer descriptor is accessible through +the package. +*/ +template +class TPckg : public TPtr8 + { +public: + inline TPckg(const T& aRef); + inline T& operator()(); +private: + TPckg& operator=(const TPckg& aRef); + }; + + + + +/** +@publishedAll +@released + +Packages an object into a modifiable buffer descriptor. + +The template parameter defines the type of object to be packaged. + +The package provides a type safe way of transferring an object or data structure +which is contained within a modifiable buffer descriptor. Typically, a package +is used for passing data via inter thread communication. + +The contained object is accessible through the package. +*/ +template +class TPckgBuf : public TAlignedBuf8 + { +public: + inline TPckgBuf(); + inline TPckgBuf(const T& aRef); + inline TPckgBuf& operator=(const TPckgBuf& aRef); + inline T& operator=(const T& aRef); + inline T& operator()(); + inline const T& operator()() const; + }; + + + + +/** +@publishedAll +@released + +Defines a modifiable buffer descriptor that can contain the name of a reference +counting object. + +@see TBuf +@see CObject +*/ +typedef TBuf TName; + + +/** +@publishedAll +@released + +Defines a modifiable buffer descriptor that can contain the full name of a +reference counting object. + +@see TBuf +@see CObject +*/ +typedef TBuf TFullName; + + + +/** +@publishedAll +@released + +Defines a modifiable buffer descriptor to contain the category name identifying +the cause of thread or process termination. The buffer takes a maximum length +of KMaxExitCategoryName. + +@see RThread::ExitCategory +@see RThread::ExitCategory +*/ +typedef TBuf TExitCategoryName; + + + +/** +@publishedAll +@released + +A buffer that can contain the name of a file. +The name can have a maximum length of KMaxFileName +(currently 256 but check the definition of KMaxFileName). + +@see KMaxFileName +*/ +typedef TBuf TFileName; + + + +/** +@publishedAll +@released + +A buffer that can contain the name of a path. +The name can have a maximum length of KMaxPath +(currently 256 but check the definition of KMaxPath). + +@see KMaxPath +*/ +typedef TBuf TPath; + + + + +/** +@publishedAll +@released + +Version name type. + +This is a buffer descriptor with a maximum length of KMaxVersionName. +A TVersion object returns the formatted character representation of its version +information in a descriptor of this type. + +@see TVersion +*/ +typedef TBuf TVersionName; + + + + +/** +@publishedAll +@released + +Defines a modifiable buffer descriptor for the text form of the UID. +The descriptor has a maximum length of KMaxUidName and is used to contain +the standard text format returned by the function TUid::Name(). + +@see TUid::Name +*/ +typedef TBuf TUidName; + + + + +/** +@publishedAll +@released + +Defines a null UID +*/ +#define KNullUid TUid::Null() + + + + +/** +@publishedAll +@released + +A globally unique 32-bit number. +*/ +class TUid + { +public: +#ifndef __KERNEL_MODE__ + IMPORT_C TBool operator==(const TUid& aUid) const; + IMPORT_C TBool operator!=(const TUid& aUid) const; + IMPORT_C TUidName Name() const; +#endif + static inline TUid Uid(TInt aUid); + static inline TUid Null(); +public: + /** + The 32-bit integer UID value. + */ + TInt32 iUid; + }; + + + + +/** +@publishedAll +@released + +Encapsulates a set of three unique identifiers (UIDs) which, in combination, +identify a system object such as a GUI application or a DLL. The three +component UIDs are referred to as UID1, UID2 and UID3. + +An object of this type is referred to as a compound identifier or a UID type. +*/ +class TUidType + { +public: +#ifndef __KERNEL_MODE__ + IMPORT_C TUidType(); + IMPORT_C TUidType(TUid aUid1); + IMPORT_C TUidType(TUid aUid1,TUid aUid2); + IMPORT_C TUidType(TUid aUid1,TUid aUid2,TUid aUid3); + IMPORT_C TBool operator==(const TUidType& aUidType) const; + IMPORT_C TBool operator!=(const TUidType& aUidType) const; + IMPORT_C const TUid& operator[](TInt anIndex) const; + IMPORT_C TUid MostDerived() const; + IMPORT_C TBool IsPresent(TUid aUid) const; + IMPORT_C TBool IsValid() const; +private: +#endif + TUid iUid[KMaxCheckedUid]; + }; + + + + +/** +A class used to represent the Secure ID of a process or executable image. + +Constructors and conversion operators are provided to enable conversion +of this class to and from both TUint32 and TUid objects. + +Because this class has non-default constructors, compilers will not initialise +this objects at compile time, instead code will be generated to construct the object +at run-time. This is wastefull, and Symbian OS DLLs are not permitted to have +such uninitialised data. To overcome these problems a macro is provided to construct +a const object which behaves like a TSecureId. This is _LIT_SECURE_ID. +This macro should be used where it is desirable to define const TSecureId objects, +like in header files. E.g. Instead of writing: +@code + const TSecureId MyId=0x1234567 +@endcode +use +@code + _LIT_SECURE_ID(MyId,0x1234567) +@endcode + +@publishedAll +@released + +@see _LIT_SECURE_ID +*/ +class TSecureId + { +public: + inline TSecureId(); + inline TSecureId(TUint32 aId); + inline operator TUint32() const; + inline TSecureId(TUid aId); + inline operator TUid() const; +public: + TUint32 iId; + }; + + + + +/** +A class used to represent the Vendor ID of a process or executable image + +Constructors and conversion operators are provided to enable conversion +of this class to and from both TUint32 and TUid objects. + +Because this class has non-default constructors, compilers will not initialise +this objects at compile time, instead code will be generated to construct the object +at run-time. This is wastefull, and Symbian OS DLLs are not permitted to have +such uninitialised data. To overcome these problems a macro is provided to construct +a const object which behaves like a TSecureId. This is _LIT_VENDOR_ID. +This macro should be used where it is desirable to define const TSecureId objects, +like in header files. E.g. Instead of writing: +@code + const TVendorId MyId=0x1234567 +@endcode +use +@code + _LIT_VENDOR_ID(MyId,0x1234567) +@endcode + +@publishedAll +@released + +@see _LIT_VENDOR_ID +*/ +class TVendorId + { +public: + inline TVendorId(); + inline TVendorId(TUint32 aId); + inline operator TUint32() const; + inline TVendorId(TUid aId); + inline operator TUid() const; +public: + TUint32 iId; + }; + + + +/** +Structure for compile-time definition of a secure ID +@internalComponent +*/ +class SSecureId + { +public: + inline const TSecureId* operator&() const; + inline operator const TSecureId&() const; + inline operator TUint32() const; + inline operator TUid() const; +public: + TUint32 iId; + }; + + + + +/** +Structure for compile-time definition of a vendor ID +@internalComponent +*/ +class SVendorId + { +public: + inline const TVendorId* operator&() const; + inline operator const TVendorId&() const; + inline operator TUint32() const; + inline operator TUid() const; +public: + TUint32 iId; + }; + + + + +/** +Macro for compile-time definition of a secure ID +@param name Name to use for secure ID +@param value Value of secure ID +@publishedAll +@released +*/ +#define _LIT_SECURE_ID(name,value) const SSecureId name={value} + + + + +/** +Macro for compile-time definition of a vendor ID +@param name Name to use for vendor ID +@param value Value of vendor ID +@publishedAll +@released +*/ +#define _LIT_VENDOR_ID(name,value) const SVendorId name={value} + + + + +/** +@publishedAll +@released + +Contains version information. + +A version is defined by a set of three numbers: + +1. the major version number, ranging from 0 to 127, inclusive + +2. the minor version number, ranging from 0 to 99 inclusive + +3. the build number, ranging from 0 to 32767 inclusive. + +The class provides a constructor for setting all three numbers. +It also provides a member function to build a character representation of +this information in a TVersionName descriptor. + +@see TVersionName +*/ +class TVersion + { +public: + IMPORT_C TVersion(); + IMPORT_C TVersion(TInt aMajor,TInt aMinor,TInt aBuild); + IMPORT_C TVersionName Name() const; +public: + /** + The major version number. + */ + TInt8 iMajor; + + + /** + The minor version number. + */ + TInt8 iMinor; + + + /** + The build number. + */ + TInt16 iBuild; + }; + + + + +/** +@publishedAll +@released + +Indicates the completion status of a request made to a service provider. + +When a thread makes a request, it passes a request status as a parameter. +On completion, the provider signals the requesting thread's request semaphore +and stores a completion code in the request status. Typically, this is KErrNone +or one of the other system-wide error codes. + +This class is not intended for user derivation. +*/ +class TRequestStatus + { +public: + inline TRequestStatus(); + inline TRequestStatus(TInt aVal); + inline TInt operator=(TInt aVal); + inline TBool operator==(TInt aVal) const; + inline TBool operator!=(TInt aVal) const; + inline TBool operator>=(TInt aVal) const; + inline TBool operator<=(TInt aVal) const; + inline TBool operator>(TInt aVal) const; + inline TBool operator<(TInt aVal) const; + inline TInt Int() const; +private: + enum + { + EActive = 1, //bit0 + ERequestPending = 2, //bit1 + }; + TInt iStatus; + TUint iFlags; + friend class CActive; + friend class CActiveScheduler; + friend class CServer2; + }; + + + + +class TSize; +/** +@publishedAll +@released + +Stores a two-dimensional point in Cartesian co-ordinates. + +Its data members (iX and iY) are public and can be manipulated directly, or +by means of the functions provided. Functions are provided to set and manipulate +the point, and to compare points for equality. +*/ +class TPoint + { +public: +#ifndef __KERNEL_MODE__ + enum TUninitialized { EUninitialized }; + /** + Constructs default point, initialising its iX and iY members to zero. + */ + TPoint(TUninitialized) {} + inline TPoint(); + inline TPoint(TInt aX,TInt aY); + IMPORT_C TBool operator==(const TPoint& aPoint) const; + IMPORT_C TBool operator!=(const TPoint& aPoint) const; + IMPORT_C TPoint& operator-=(const TPoint& aPoint); + IMPORT_C TPoint& operator+=(const TPoint& aPoint); + IMPORT_C TPoint& operator-=(const TSize& aSize); + IMPORT_C TPoint& operator+=(const TSize& aSize); + IMPORT_C TPoint operator-(const TPoint& aPoint) const; + IMPORT_C TPoint operator+(const TPoint& aPoint) const; + IMPORT_C TPoint operator-(const TSize& aSize) const; + IMPORT_C TPoint operator+(const TSize& aSize) const; + IMPORT_C TPoint operator-() const; + IMPORT_C void SetXY(TInt aX,TInt aY); + IMPORT_C TSize AsSize() const; +#endif +public: + /** + The x co-ordinate. + */ + TInt iX; + /** + The y co-ordinate. + */ + TInt iY; + }; + + + + +/** +@publishedAll +@prototype + +Stores a three-dimensional point in Cartesian or polar co-ordinates. +Its data members (iX, iY and iZ) are public and can be manipulated directly. + +*/ +class TPoint3D + { +public: +#ifndef __KERNEL_MODE__ + enum TUninitialized { EUninitialized }; + + /** + TUninitialized Constructor + */ + TPoint3D(TUninitialized) {} + /** + Constructs default TPoint3D, initialising its iX , iY and iZ members to zero. + */ + inline TPoint3D(); + /** + Constructs TPoint3D with the specified x,y and z co-ordinates. + */ + inline TPoint3D(TInt aX,TInt aY,TInt aZ); + /** + Copy Construct from TPoint , initialises Z co-ordinate to Zero + */ + inline TPoint3D(const TPoint& aPoint); + + IMPORT_C TBool operator==(const TPoint3D& aPoint3D) const; + IMPORT_C TBool operator!=(const TPoint3D& aPoint3D) const; + + IMPORT_C TPoint3D& operator-=(const TPoint3D& aPoint3D); + IMPORT_C TPoint3D& operator-=(const TPoint& aPoint); + + IMPORT_C TPoint3D& operator+=(const TPoint3D& aPoint3D); + IMPORT_C TPoint3D& operator+=(const TPoint& aPoint); + + IMPORT_C TPoint3D operator-(const TPoint3D& aPoint3D) const; + IMPORT_C TPoint3D operator-(const TPoint& aPoint) const; + + IMPORT_C TPoint3D operator+(const TPoint3D& aPoint3D) const; + IMPORT_C TPoint3D operator+(const TPoint& aPoint) const; + /** + Unary minus operator. The operator returns the negation of this Point3D + */ + IMPORT_C TPoint3D operator-() const; + + /** + Set Method to set the xyz co-ordinates of TPoint3D + */ + IMPORT_C void SetXYZ(TInt aX,TInt aY,TInt aZ); + + /** + TPoint3D from TPoint, sets the Z co-ordinate to Zero + */ + IMPORT_C void SetPoint(const TPoint& aPoint); + + /** + Returns TPoint from TPoint3D + */ + IMPORT_C TPoint AsPoint() const; +#endif +public: + /** + The x co-ordinate. + */ + TInt iX; + /** + The y co-ordinate. + */ + TInt iY; + /** + The z co-ordinate. + */ + TInt iZ; + }; + + + +/** +@internalTechnology +@prototype For now, only intended to be used by TRwEvent and the Windows Server + +Stores the angular spherical coordinates (Phi,Theta) of a three-dimensional point. + +Its data members (iPhi, iTheta) are public and can be manipulated directly. +*/ +class TAngle3D + { +public: + /** + The Phi co-ordinate (angle between X-axis and the line that links the projection of the point on the X-Y plane and the origin). + */ + TInt iPhi; + /** + The Theta co-ordinate (angle between the Z-axis and the line that links the point and the origin). + */ + TInt iTheta; + }; + + +/** +@publishedAll +@released + +Stores a two-dimensional size as a width and a height value. + +Its data members are public and can be manipulated directly, or by means of +the functions provided. +*/ +class TSize + { +public: +#ifndef __KERNEL_MODE__ + enum TUninitialized { EUninitialized }; + /** + Constructs the size object with its iWidth and iHeight members set to zero. + */ + TSize(TUninitialized) {} + inline TSize(); + inline TSize(TInt aWidth,TInt aHeight); + IMPORT_C TBool operator==(const TSize& aSize) const; + IMPORT_C TBool operator!=(const TSize& aSize) const; + IMPORT_C TSize& operator-=(const TSize& aSize); + IMPORT_C TSize& operator-=(const TPoint& aPoint); + IMPORT_C TSize& operator+=(const TSize& aSize); + IMPORT_C TSize& operator+=(const TPoint& aPoint); + IMPORT_C TSize operator-(const TSize& aSize) const; + IMPORT_C TSize operator-(const TPoint& aPoint) const; + IMPORT_C TSize operator+(const TSize& aSize) const; + IMPORT_C TSize operator+(const TPoint& aPoint) const; + IMPORT_C TSize operator-() const; + IMPORT_C void SetSize(TInt aWidth,TInt aHeight); + IMPORT_C TPoint AsPoint() const; +#endif +public: + /** + The width of this TSize object. + */ + TInt iWidth; + /** + The height of this TSize object. + */ + TInt iHeight; + }; + + + + +/** +@publishedAll +@released + +Information about a kernel object. + +This type of object is passed to RHandleBase::HandleInfo(). The function +fetches information on the usage of the kernel object associated with that +handle and stores the information in the THandleInfo object. + +The class contains four data members and no explicitly defined function +members. +*/ +class THandleInfo + { +public: + /** + The number of times that the kernel object is open in the current process. + */ + TInt iNumOpenInProcess; + + /** + The number of times that the kernel object is open in the current thread. + */ + TInt iNumOpenInThread; + + /** + The number of processes which have a handle on the kernel object. + */ + TInt iNumProcesses; + + /** + The number of threads which have a handle on the kernel object. + */ + TInt iNumThreads; + }; + + + + +/** +@internalComponent +*/ +class TFindHandle + { +public: + inline TFindHandle(); + inline TInt Handle() const; +#ifdef __KERNEL_MODE__ + inline TInt Index() const; + inline TInt UniqueID() const; + inline TUint64 ObjectID() const; + inline void Set(TInt aIndex, TInt aUniqueId, TUint64 aObjectId); +#else +protected: + inline void Reset(); +#endif +private: + TInt iHandle; + TInt iSpare1; + TInt iObjectIdLow; + TInt iObjectIdHigh; + }; + + + +class RThread; +class TFindHandleBase; +class TFindSemaphore; +/** +@publishedAll +@released + +A handle to an object. + +The class encapsulates the basic behaviour of a handle, hiding the +handle-number which identifies the object which the handle represents. + +The class is abstract in the sense that a RHandleBase object is never +explicitly instantiated. It is always a base class to a concrete handle class; +for example, RSemaphore, RThread, RProcess, RCriticalSection etc. +*/ +class RHandleBase + { +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +public: + /** + @internalComponent + */ +#else +protected: +#endif + enum + { + EReadAccess=0x1, + EWriteAccess=0x2, + EDirectReadAccess=0x4, + EDirectWriteAccess=0x8, + }; +public: + inline RHandleBase(); + inline TInt Handle() const; + inline void SetHandle(TInt aHandle); + inline TInt SetReturnedHandle(TInt aHandleOrError); + static void DoExtendedClose(); +#ifndef __KERNEL_MODE__ + IMPORT_C void Close(); + IMPORT_C TName Name() const; + IMPORT_C TFullName FullName() const; + IMPORT_C void FullName(TDes& aName) const; + IMPORT_C void SetHandleNC(TInt aHandle); + IMPORT_C TInt Duplicate(const RThread& aSrc,TOwnerType aType=EOwnerProcess); + IMPORT_C void HandleInfo(THandleInfo* anInfo); + IMPORT_C TUint Attributes() const; + IMPORT_C TInt BTraceId() const; + IMPORT_C void NotifyDestruction(TRequestStatus& aStatus); /**< @internalTechnology */ +protected: + inline RHandleBase(TInt aHandle); + IMPORT_C TInt Open(const TFindHandleBase& aHandle,TOwnerType aType); + static TInt SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle); + TInt OpenByName(const TDesC &aName,TOwnerType aOwnerType,TInt aObjectType); +#endif +private: + static void DoExtendedCloseL(); +protected: + TInt iHandle; + }; + + + + +class RMessagePtr2; +/** +@publishedAll +@released + +A handle to a semaphore. + +The semaphore itself is a Kernel side object. + +As with all handles, they should be closed after use. RHandleBase provides +the necessary Close() function, which should be called when the handle is +no longer required. + +@see RHandleBase::Close +*/ +class RSemaphore : public RHandleBase + { +public: +#ifndef __KERNEL_MODE__ + inline TInt Open(const TFindSemaphore& aFind,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateLocal(TInt aCount,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateGlobal(const TDesC& aName,TInt aCount,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt OpenGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess); + IMPORT_C void Wait(); + IMPORT_C TInt Wait(TInt aTimeout); // timeout in microseconds + IMPORT_C void Signal(); + IMPORT_C void Signal(TInt aCount); +#endif + }; + + + + +/** +@publishedAll +@released + +A fast semaphore. + +This is a layer over a standard semaphore, and only calls into the kernel side +if there is contention. +*/ +class RFastLock : public RSemaphore + { +public: + inline RFastLock(); + IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess); + IMPORT_C void Wait(); + IMPORT_C void Signal(); +private: + TInt iCount; + }; + + + + +/** +@publishedAll +@released + +The user-side handle to a logical channel. + +The class provides functions that are used to open a channel +to a device driver, and to make requests. A device driver provides +a derived class to give the user-side a tailored interface to the driver. +*/ +class RBusLogicalChannel : public RHandleBase + { +public: + IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess); +protected: + inline TInt DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* anInfo, TOwnerType aType=EOwnerProcess, TBool aProtected=EFalse); + IMPORT_C void DoCancel(TUint aReqMask); + IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus); + IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TAny* a1); + IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TAny* a1,TAny* a2); + IMPORT_C TInt DoControl(TInt aFunction); + IMPORT_C TInt DoControl(TInt aFunction,TAny* a1); + IMPORT_C TInt DoControl(TInt aFunction,TAny* a1,TAny* a2); + inline TInt DoSvControl(TInt aFunction) { return DoControl(aFunction); } + inline TInt DoSvControl(TInt aFunction,TAny* a1) { return DoControl(aFunction, a1); } + inline TInt DoSvControl(TInt aFunction,TAny* a1,TAny* a2) { return DoControl(aFunction, a1, a2); } +private: + IMPORT_C TInt DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* aInfo, TInt aType); +private: + // Padding for Binary Compatibility purposes + TInt iPadding1; + TInt iPadding2; + }; + + + + +/** +@internalComponent + +Base class for memory allocators. +*/ +// Put pure virtual functions into a separate base class so that vptr is at same +// place in both GCC98r2 and EABI builds. +class MAllocator + { +public: + virtual TAny* Alloc(TInt aSize)=0; + virtual void Free(TAny* aPtr)=0; + virtual TAny* ReAlloc(TAny* aPtr, TInt aSize, TInt aMode=0)=0; + virtual TInt AllocLen(const TAny* aCell) const =0; + virtual TInt Compress()=0; + virtual void Reset()=0; + virtual TInt AllocSize(TInt& aTotalAllocSize) const =0; + virtual TInt Available(TInt& aBiggestBlock) const =0; + virtual TInt DebugFunction(TInt aFunc, TAny* a1=NULL, TAny* a2=NULL)=0; + virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)=0; + }; + + + + +/** +@publishedAll +@released + +Base class for heaps. +*/ +class RAllocator : public MAllocator + { +public: + + + /** + A set of heap allocation failure flags. + + This enumeration indicates how to simulate heap allocation failure. + + @see RAllocator::__DbgSetAllocFail() + */ + enum TAllocFail { + /** + Attempts to allocate from this heap fail at a random rate; + however, the interval pattern between failures is the same + every time simulation is started. + */ + ERandom, + + + /** + Attempts to allocate from this heap fail at a random rate. + The interval pattern between failures may be different every + time the simulation is started. + */ + ETrueRandom, + + + /** + Attempts to allocate from this heap fail at a rate aRate; + for example, if aRate is 3, allocation fails at every + third attempt. + */ + EDeterministic, + + + /** + Cancels simulated heap allocation failure. + */ + ENone, + + + /** + An allocation from this heap will fail after the next aRate - 1 + allocation attempts. For example, if aRate = 1 then the next + attempt to allocate from this heap will fail. + */ + EFailNext, + + /** + Cancels simulated heap allocation failure, and sets + the nesting level for all allocated cells to zero. + */ + EReset, + + /** + aBurst allocations from this heap fail at a random rate; + however, the interval pattern between failures is the same + every time the simulation is started. + */ + EBurstRandom, + + + /** + aBurst allocations from this heap fail at a random rate. + The interval pattern between failures may be different every + time the simulation is started. + */ + EBurstTrueRandom, + + + /** + aBurst allocations from this heap fail at a rate aRate. + For example, if aRate is 10 and aBurst is 2, then 2 allocations + will fail at every tenth attempt. + */ + EBurstDeterministic, + + /** + aBurst allocations from this heap will fail after the next aRate - 1 + allocation attempts have occurred. For example, if aRate = 1 and + aBurst = 3 then the next 3 attempts to allocate from this heap will fail. + */ + EBurstFailNext, + + /** + Use this to determine how many times the current debug + failure mode has failed so far. + @see RAllocator::__DbgCheckFailure() + */ + ECheckFailure, + }; + + + /** + Heap debug checking type flag. + */ + enum TDbgHeapType { + /** + The heap is a user heap. + */ + EUser, + + /** + The heap is the Kernel heap. + */ + EKernel + }; + + + enum TAllocDebugOp {ECount, EMarkStart, EMarkEnd, ECheck, ESetFail, ECopyDebugInfo, ESetBurstFail}; + + + /** + Flags controlling reallocation. + */ + enum TReAllocMode { + /** + A reallocation of a cell must not change + the start address of the cell. + */ + ENeverMove=1, + + /** + Allows the start address of the cell to change + if the cell shrinks in size. + */ + EAllowMoveOnShrink=2 + }; + + + enum TFlags {ESingleThreaded=1, EFixedSize=2, ETraceAllocs=4, EMonitorMemory=8,}; + struct SCheckInfo {TBool iAll; TInt iCount; const TDesC8* iFileName; TInt iLineNum;}; +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS + struct SRAllocatorBurstFail {TInt iBurst; TInt iRate; TInt iUnused[2];}; +#endif + enum {EMaxHandles=32}; + +public: + inline RAllocator(); +#ifndef __KERNEL_MODE__ + IMPORT_C TInt Open(); + IMPORT_C void Close(); + IMPORT_C TAny* AllocZ(TInt aSize); + IMPORT_C TAny* AllocZL(TInt aSize); + IMPORT_C TAny* AllocL(TInt aSize); + IMPORT_C TAny* AllocLC(TInt aSize); + IMPORT_C void FreeZ(TAny*& aCell); + IMPORT_C TAny* ReAllocL(TAny* aCell, TInt aSize, TInt aMode=0); + IMPORT_C TInt Count() const; + IMPORT_C TInt Count(TInt& aFreeCount) const; +#endif + UIMPORT_C void Check() const; + UIMPORT_C void __DbgMarkStart(); + UIMPORT_C TUint32 __DbgMarkEnd(TInt aCount); + UIMPORT_C TInt __DbgMarkCheck(TBool aCountAll, TInt aCount, const TDesC8& aFileName, TInt aLineNum); + inline void __DbgMarkCheck(TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum); + UIMPORT_C void __DbgSetAllocFail(TAllocFail aType, TInt aRate); + UIMPORT_C void __DbgSetBurstAllocFail(TAllocFail aType, TUint aRate, TUint aBurst); + UIMPORT_C TUint __DbgCheckFailure(); +protected: + UIMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +#ifndef __KERNEL_MODE__ + IMPORT_C virtual void DoClose(); +#endif +protected: + TInt iAccessCount; + TInt iHandleCount; + TInt* iHandles; + TUint32 iFlags; + TInt iCellCount; + TInt iTotalAllocSize; + }; + + + + +class UserHeap; +/** +@publishedAll +@released + +Represents the default implementation for a heap. + +The default implementation uses an address-ordered first fit type algorithm. + +The heap itself is contained in a chunk and may be the only occupant of the +chunk or may share the chunk with the program stack. + +The class contains member functions for allocating, adjusting, freeing individual +cells and generally managing the heap. + +The class is not a handle in the same sense that RChunk is a handle; i.e. +there is no Kernel object which corresponds to the heap. +*/ +class RHeap : public RAllocator + { +public: + /** + The structure of a heap cell header for a heap cell on the free list. + */ + struct SCell { + /** + The length of the cell, which includes the length of + this header. + */ + TInt len; + + + /** + A pointer to the next cell in the free list. + */ + SCell* next; + }; + + + /** + The structure of a heap cell header for an allocated heap cell in a debug build. + */ + struct SDebugCell { + /** + The length of the cell, which includes the length of + this header. + */ + TInt len; + + + /** + The nested level. + */ + TInt nestingLevel; + + + /** + The cumulative number of allocated cells + */ + TInt allocCount; + }; + + /** + @internalComponent + */ + struct SHeapCellInfo { RHeap* iHeap; TInt iTotalAlloc; TInt iTotalAllocSize; TInt iTotalFree; TInt iLevelAlloc; SDebugCell* iStranded; }; + + /** + @internalComponent + */ + struct _s_align {char c; double d;}; + + /** + The default cell alignment. + */ + enum {ECellAlignment = sizeof(_s_align)-sizeof(double)}; + + /** + Size of a free cell header. + */ + enum {EFreeCellSize = sizeof(SCell)}; + + +#ifdef _DEBUG + /** + Size of an allocated cell header in a debug build. + */ + enum {EAllocCellSize = sizeof(SDebugCell)}; +#else + /** + Size of an allocated cell header in a release build. + */ + enum {EAllocCellSize = sizeof(SCell*)}; +#endif + + + /** + @internalComponent + */ + enum TDebugOp {EWalk=128}; + + + /** + @internalComponent + */ + enum TCellType + {EGoodAllocatedCell, EGoodFreeCell, EBadAllocatedCellSize, EBadAllocatedCellAddress, + EBadFreeCellAddress, EBadFreeCellSize}; + + + /** + @internalComponent + */ + enum TDebugHeapId {EUser=0, EKernel=1}; + + /** + @internalComponent + */ + enum TDefaultShrinkRatios {EShrinkRatio1=256, EShrinkRatioDflt=512}; + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS + /** + @internalComponent + */ +#else +private: +#endif + typedef void (*TWalkFunc)(TAny*, TCellType, TAny*, TInt); + +public: + UIMPORT_C virtual TAny* Alloc(TInt aSize); + UIMPORT_C virtual void Free(TAny* aPtr); + UIMPORT_C virtual TAny* ReAlloc(TAny* aPtr, TInt aSize, TInt aMode=0); + UIMPORT_C virtual TInt AllocLen(const TAny* aCell) const; +#ifndef __KERNEL_MODE__ + UIMPORT_C virtual TInt Compress(); + UIMPORT_C virtual void Reset(); + UIMPORT_C virtual TInt AllocSize(TInt& aTotalAllocSize) const; + UIMPORT_C virtual TInt Available(TInt& aBiggestBlock) const; +#endif + UIMPORT_C virtual TInt DebugFunction(TInt aFunc, TAny* a1=NULL, TAny* a2=NULL); +protected: + UIMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +public: + UIMPORT_C RHeap(TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue); + UIMPORT_C RHeap(TInt aChunkHandle, TInt aOffset, TInt aMinLength, TInt aMaxLength, TInt aGrowBy, TInt aAlign=0, TBool aSingleThread=EFalse); + UIMPORT_C TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW; + inline void operator delete(TAny* aPtr, TAny* aBase); + inline TUint8* Base() const; + inline TInt Size() const; + inline TInt MaxLength() const; + inline TInt Align(TInt a) const; + inline const TAny* Align(const TAny* a) const; + inline TBool IsLastCell(const SCell* aCell) const; + inline void Lock() const; + inline void Unlock() const; + inline TInt ChunkHandle() const; +protected: + inline RHeap(); + void Initialise(); + SCell* DoAlloc(TInt aSize, SCell*& aLastFree); + void DoFree(SCell* pC); + TInt TryToGrowHeap(TInt aSize, SCell* aLastFree); + inline void FindFollowingFreeCell(SCell* aCell, SCell*& pPrev, SCell*& aNext); + TInt TryToGrowCell(SCell* pC, SCell* pP, SCell* pE, TInt aSize); + TInt Reduce(SCell* aCell); + UIMPORT_C SCell* GetAddress(const TAny* aCell) const; + void CheckCell(const SCell* aCell) const; + void Walk(TWalkFunc aFunc, TAny* aPtr); + static void WalkCheckCell(TAny* aPtr, TCellType aType, TAny* aCell, TInt aLen); + TInt DoCountAllocFree(TInt& aFree); + TInt DoCheckHeap(SCheckInfo* aInfo); + void DoMarkStart(); + TUint32 DoMarkEnd(TInt aExpected); + void DoSetAllocFail(TAllocFail aType, TInt aRate); + TBool CheckForSimulatedAllocFail(); + inline TInt SetBrk(TInt aBrk); + inline TAny* ReAllocImpl(TAny* aPtr, TInt aSize, TInt aMode); + void DoSetAllocFail(TAllocFail aType, TInt aRate, TUint aBurst); +protected: + TInt iMinLength; + TInt iMaxLength; + TInt iOffset; + TInt iGrowBy; + TInt iChunkHandle; + RFastLock iLock; + TUint8* iBase; + TUint8* iTop; + TInt iAlign; + TInt iMinCell; + TInt iPageSize; + SCell iFree; +protected: + TInt iNestingLevel; + TInt iAllocCount; + TAllocFail iFailType; + TInt iFailRate; + TBool iFailed; + TInt iFailAllocCount; + TInt iRand; + TAny* iTestData; + + friend class UserHeap; + }; + + + + + +class OnlyCreateWithNull; + +/** @internalTechnology */ +typedef void (OnlyCreateWithNull::* __NullPMF)(); + +/** @internalTechnology */ +class OnlyCreateWithNull + { +public: + inline OnlyCreateWithNull(__NullPMF /*aPointerToNull*/) {} + }; + +/** +@publishedAll +@released + +A handle to a message sent by the client to the server. + +A server's interaction with its clients is channelled through an RMessagePtr2 +object, which acts as a handle to a message sent by the client. +The details of the original message are kept by the kernel allowing it enforce +correct usage of the member functions of this class. + +@see RMessage2 +*/ +class RMessagePtr2 + { +public: + inline RMessagePtr2(); + inline TBool IsNull() const; + inline TInt Handle() const; +#ifndef __KERNEL_MODE__ + IMPORT_C void Complete(TInt aReason) const; + IMPORT_C void Complete(RHandleBase aHandle) const; + IMPORT_C TInt GetDesLength(TInt aParam) const; + IMPORT_C TInt GetDesLengthL(TInt aParam) const; + IMPORT_C TInt GetDesMaxLength(TInt aParam) const; + IMPORT_C TInt GetDesMaxLengthL(TInt aParam) const; + IMPORT_C void ReadL(TInt aParam,TDes8& aDes,TInt aOffset=0) const; + IMPORT_C void ReadL(TInt aParam,TDes16 &aDes,TInt aOffset=0) const; + IMPORT_C void WriteL(TInt aParam,const TDesC8& aDes,TInt aOffset=0) const; + IMPORT_C void WriteL(TInt aParam,const TDesC16& aDes,TInt aOffset=0) const; + IMPORT_C TInt Read(TInt aParam,TDes8& aDes,TInt aOffset=0) const; + IMPORT_C TInt Read(TInt aParam,TDes16 &aDes,TInt aOffset=0) const; + IMPORT_C TInt Write(TInt aParam,const TDesC8& aDes,TInt aOffset=0) const; + IMPORT_C TInt Write(TInt aParam,const TDesC16& aDes,TInt aOffset=0) const; + IMPORT_C void Panic(const TDesC& aCategory,TInt aReason) const; + IMPORT_C void Kill(TInt aReason) const; + IMPORT_C void Terminate(TInt aReason) const; + IMPORT_C TInt SetProcessPriority(TProcessPriority aPriority) const; + inline void SetProcessPriorityL(TProcessPriority aPriority) const; + IMPORT_C TInt Client(RThread& aClient, TOwnerType aOwnerType=EOwnerProcess) const; + inline void ClientL(RThread& aClient, TOwnerType aOwnerType=EOwnerProcess) const; + IMPORT_C TUint ClientProcessFlags() const; + IMPORT_C const TRequestStatus* ClientStatus() const; + + /** + Return the Secure ID of the process which sent this message. + + If an intended use of this method is to check that the Secure ID is + a given value, then the use of a TSecurityPolicy object should be + considered. E.g. Instead of something like: + + @code + RMessagePtr2& message; + TInt error = message.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied; + @endcode + + this could be used; + + @code + RMessagePtr2& message; + static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId); + TBool pass = mySidPolicy().CheckPolicy(message); + @endcode + + This has the benefit that the TSecurityPolicy::CheckPolicy methods are + configured by the system wide Platform Security configuration. I.e. are + capable of emitting diagnostic messages when a check fails and/or the + check can be forced to always pass. + + @see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const + @see _LIT_SECURITY_POLICY_S0 + + @return The Secure ID. + + @publishedAll + @released + */ + IMPORT_C TSecureId SecureId() const; + + /** + Return the Vendor ID of the process which sent this message. + + If an intended use of this method is to check that the Vendor ID is + a given value, then the use of a TSecurityPolicy object should be + considered. E.g. Instead of something like: + + @code + RMessagePtr2& message; + TInt error = message.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied; + @endcode + + this could be used; + + @code + RMessagePtr2& message; + static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId); + TBool pass = myVidPolicy().CheckPolicy(message); + @endcode + + This has the benefit that the TSecurityPolicy::CheckPolicy methods are + configured by the system wide Platform Security configuration. I.e. are + capable of emitting diagnostic messages when a check fails and/or the + check can be forced to always pass. + + @see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const + @see _LIT_SECURITY_POLICY_V0 + + @return The Vendor ID. + @publishedAll + @released + */ + IMPORT_C TVendorId VendorId() const; + + /** + Check if the process which sent this message has a given capability. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability The capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds the capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if process which sent this message has the capability, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** + Check if the process which sent this message has a given capability. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will not leave even though the + check failed. + + @param aCapability The capability to test. + @param aDiagnosticMessage A string that will be emitted along with any diagnostic message + that may be issued if the test finds the capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @leave KErrPermissionDenied, if the process does not have the capability. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline void HasCapabilityL(TCapability aCapability, const char* aDiagnosticMessage=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline void HasCapabilityL(TCapability aCapability, OnlyCreateWithNull aDiagnosticMessage=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline void HasCapabilityL(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** + Check if the process which sent this message has both of the given capabilities. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability1 The first capability to test. + @param aCapability2 The second capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds a capability is not present. + This string should be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if the process which sent this message has both the capabilities, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** + Check if the process which sent this message has both of the given capabilities. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will not leave even though the + check failed. + + @param aCapability1 The first capability to test. + @param aCapability2 The second capability to test. + @param aDiagnosticMessage A string that will be emitted along with any diagnostic message + that may be issued if the test finds a capability is not present. + This string should be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @leave KErrPermissionDenied, if the process does not have the capabilities. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, const char* aDiagnosticMessage=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnosticMessage=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** + @deprecated Use SecureId() + */ + inline TUid Identity() const { return SecureId(); } +#endif + +private: + // Implementations of functions with diagnostics + IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability, TCapability aCapability2, const char* aDiagnostic) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability, TCapability aCapability2) const; + +protected: + TInt iHandle; + }; +inline TBool operator==(RMessagePtr2 aLeft,RMessagePtr2 aRight); +inline TBool operator!=(RMessagePtr2 aLeft,RMessagePtr2 aRight); + +class CSession2; + +#define __IPC_V2_PRESENT__ + +/** +@publishedAll +@released + +An object that encapsulates the details of a client request. +*/ +class RMessage2 : public RMessagePtr2 + { + friend class CServer2; +public: + + /** + Defines internal message types. + */ + enum TSessionMessages { + /** + A message type used internally that means connect. + */ + EConnect=-1, + + /** + A message type used internally that means disconnect. + */ + EDisConnect=-2 + }; +public: + inline RMessage2(); +#ifndef __KERNEL_MODE__ + IMPORT_C explicit RMessage2(const RMessagePtr2& aPtr); + void SetAuthorised() const; + void ClearAuthorised() const; + TBool Authorised() const; +#endif + inline TInt Function() const; + inline TInt Int0() const; + inline TInt Int1() const; + inline TInt Int2() const; + inline TInt Int3() const; + inline const TAny* Ptr0() const; + inline const TAny* Ptr1() const; + inline const TAny* Ptr2() const; + inline const TAny* Ptr3() const; + inline CSession2* Session() const; +protected: + + /** + The request type. + */ + TInt iFunction; + + /** + A copy of the message arguments. + */ + TInt iArgs[KMaxMessageArguments]; +private: + TInt iSpare1; +protected: + /** + @internalComponent + */ + const TAny* iSessionPtr; +private: + mutable TInt iFlags;// Currently only used for *Authorised above + TInt iSpare3; // Reserved for future use + + friend class RMessage; + }; + + + + +/** +@publishedAll +@released + +Defines an 8-bit modifiable buffer descriptor to contain passwords when dealing +with password security support in a file server session. + +The descriptor takes a maximum length of KMaxMediaPassword. + +@see KMaxMediaPassword +*/ +typedef TBuf8 TMediaPassword; // 128 bit + + + +/** +@publishedPartner +@prototype +A configuration flag for the shared chunk buffer configuration class (used by the multimedia device drivers). This being +set signifies that a buffer offset list follows the buffer configuration class. This list holds the offset of each buffer. +*/ +const TUint KScFlagBufOffsetListInUse=0x00000001; + +/** +@publishedPartner +@prototype +A configuration flag for the shared chunk buffer configuration class (used by the multimedia device drivers). This being +set is a suggestion that the shared chunk should be configured leaving guard pages around each buffers. +*/ +const TUint KScFlagUseGuardPages=0x00000002; + +/** +@publishedPartner +@prototype +The shared chunk buffer configuration class (used by the multimedia device drivers). This is used to hold information +on the current buffer configuration within a shared chunk. +*/ +class TSharedChunkBufConfigBase + { +public: + inline TSharedChunkBufConfigBase(); +public: + /** The number of buffers. */ + TInt iNumBuffers; + /** The size of each buffer in bytes. */ + TInt iBufferSizeInBytes; + /** Reserved field. */ + TInt iReserved1; + /** Shared chunk buffer flag settings. */ + TUint iFlags; + }; + + +/** Maximum size of capability set + +@internalTechnology +*/ +const TInt KCapabilitySetMaxSize = (((TInt)ECapability_HardLimit + 7)>>3); + +/** Maximum size of any future extension to TSecurityPolicy + +@internalTechnology +*/ +const TInt KMaxSecurityPolicySize = KCapabilitySetMaxSize + 3*sizeof(TUint32); + + +/** Class representing an arbitrary set of capabilities. + +This class can only contain capabilities supported by the current OS version. + +@publishedAll +@released +*/ +class TCapabilitySet + { +public: + inline TCapabilitySet(); + inline TCapabilitySet(TCapability aCapability); + IMPORT_C TCapabilitySet(TCapability aCapability1, TCapability aCapability2); + IMPORT_C void SetEmpty(); + inline void Set(TCapability aCapability); + inline void Set(TCapability aCapability1, TCapability aCapability2); + IMPORT_C void SetAllSupported(); + IMPORT_C void AddCapability(TCapability aCapability); + IMPORT_C void RemoveCapability(TCapability aCapability); + IMPORT_C void Union(const TCapabilitySet& aCapabilities); + IMPORT_C void Intersection(const TCapabilitySet& aCapabilities); + IMPORT_C void Remove(const TCapabilitySet& aCapabilities); + IMPORT_C TBool HasCapability(TCapability aCapability) const; + IMPORT_C TBool HasCapabilities(const TCapabilitySet& aCapabilities) const; + + /** + Make this set consist of the capabilities which are disabled on this platform. + @internalTechnology + */ + IMPORT_C void SetDisabled(); + /** + @internalComponent + */ + TBool NotEmpty() const; + +private: + TUint32 iCaps[KCapabilitySetMaxSize / sizeof(TUint32)]; + }; + +#ifndef __SECURITY_INFO_DEFINED__ +#define __SECURITY_INFO_DEFINED__ +/** +@internalTechnology + */ +struct SCapabilitySet + { + enum {ENCapW=2}; + + inline void AddCapability(TCapability aCap1) {((TCapabilitySet*)this)->AddCapability(aCap1);} + inline void Remove(const SCapabilitySet& aCaps) {((TCapabilitySet*)this)->Remove(*((TCapabilitySet*)&aCaps));} + inline TBool NotEmpty() const {return ((TCapabilitySet*)this)->NotEmpty();} + + inline const TUint32& operator[] (TInt aIndex) const { return iCaps[aIndex]; } + inline TUint32& operator[] (TInt aIndex) { return iCaps[aIndex]; } + + TUint32 iCaps[ENCapW]; + }; + +/** +@internalTechnology + */ +struct SSecurityInfo + { + TUint32 iSecureId; + TUint32 iVendorId; + SCapabilitySet iCaps; // Capabilities re. platform security + }; + +#endif + +/** Define this macro to reference the set of all capabilities. + @internalTechnology +*/ +#ifdef __REFERENCE_ALL_SUPPORTED_CAPABILITIES__ + +extern const SCapabilitySet AllSupportedCapabilities; + +#endif //__REFERENCE_ALL_SUPPORTED_CAPABILITIES__ + +/** Define this macro to include the set of all capabilities. + @internalTechnology +*/ +#ifdef __INCLUDE_ALL_SUPPORTED_CAPABILITIES__ + +/** The set of all capabilities. + @internalTechnology +*/ +const SCapabilitySet AllSupportedCapabilities = { + { + ECapability_Limit<32 ? (TUint32)((1u<<(ECapability_Limit&31))-1u) : 0xffffffffu + , + ECapability_Limit>=32 ? (TUint32)((1u<<(ECapability_Limit&31))-1u) : 0u + } + }; + +#endif // __INCLUDE_ALL_SUPPORTED_CAPABILITIES__ + +#ifndef __KERNEL_MODE__ +class RProcess; +class RThread; +class RMessagePtr2; +class RSessionBase; +#else +class DProcess; +class DThread; +#endif + +/** Class representing all security attributes of a process or DLL. + These comprise a set of capabilities, a Secure ID and a Vendor ID. + +@publishedAll +@released +*/ +class TSecurityInfo + { +public: + inline TSecurityInfo(); +#ifdef __KERNEL_MODE__ + IMPORT_C TSecurityInfo(DProcess* aProcess); + IMPORT_C TSecurityInfo(DThread* aThread); +#else + IMPORT_C TSecurityInfo(RProcess aProcess); + IMPORT_C TSecurityInfo(RThread aThread); + IMPORT_C TSecurityInfo(RMessagePtr2 aMesPtr); + inline void Set(RProcess aProcess); + inline void Set(RThread aThread); + inline void Set(RMessagePtr2 aMsgPtr); + TInt Set(RSessionBase aSession); /**< @internalComponent */ + inline void SetToCurrentInfo(); + IMPORT_C void SetToCreatorInfo(); +#endif //__KERNEL_MODE__ +public: + TSecureId iSecureId; /**< Secure ID */ + TVendorId iVendorId; /**< Vendor ID */ + TCapabilitySet iCaps; /**< Capability Set */ + }; + + +/** Class representing a generic security policy + +This class can specify a security policy consisting of either: + +-# A check for between 0 and 7 capabilities +-# A check for a given Secure ID along with 0-3 capabilities +-# A check for a given Vendor ID along with 0-3 capabilities + +If multiple capabilities are specified, all of them must be present for the +security check to succeed ('AND' relation). + +The envisaged use case for this class is to specify access rights to an object +managed either by the kernel or by a server but in principle owned by a client +and usable in a limited way by other clients. For example +- Publish and Subscribe properties +- DBMS databases + +In these cases the owning client would pass one (or more) of these objects to +the server to specify which security checks should be done on other clients +before allowing access to the object. + +To pass a TSecurityPolicy object via IPC, a client should obtain a descriptor +for the object using Package() and send this. When a server receives this descriptor +it should read the descriptor contents into a TSecurityPolicyBuf and then +Set() should be used to create a policy object from this. + +Because this class has non-default constructors, compilers will not initialise +this object at compile time, instead code will be generated to construct the object +at run-time. This is wasteful - and Symbian OS DLLs are not permitted to have +such uninitialised data. To overcome these problems a set of macros are provided to +construct a const object which behaves like a TSecurityPolicy. These are: + +_LIT_SECURITY_POLICY_C1 through _LIT_SECURITY_POLICY_C7, +_LIT_SECURITY_POLICY_S0 through _LIT_SECURITY_POLICY_S3 and +_LIT_SECURITY_POLICY_V0 through _LIT_SECURITY_POLICY_V3. + +Also, the macros _LIT_SECURITY_POLICY_PASS and _LIT_SECURITY_POLICY_FAIL are provided +in order to allow easy construction of a const object which can be used as a +TSecuityPolicy which always passes or always fails, respectively. + +If a security policy object is needed to be embedded in another class then the +TStaticSecurityPolicy structure can be used. This behaves in the same way as a +TSecurityPolicy object but may be initialised at compile time. + +@see TStaticSecurityPolicy +@see TSecurityPolicyBuf +@see _LIT_SECURITY_POLICY_PASS +@see _LIT_SECURITY_POLICY_FAIL +@see _LIT_SECURITY_POLICY_C1 +@see _LIT_SECURITY_POLICY_C2 +@see _LIT_SECURITY_POLICY_C3 +@see _LIT_SECURITY_POLICY_C4 +@see _LIT_SECURITY_POLICY_C5 +@see _LIT_SECURITY_POLICY_C6 +@see _LIT_SECURITY_POLICY_C7 +@see _LIT_SECURITY_POLICY_S0 +@see _LIT_SECURITY_POLICY_S1 +@see _LIT_SECURITY_POLICY_S2 +@see _LIT_SECURITY_POLICY_S3 +@see _LIT_SECURITY_POLICY_V0 +@see _LIT_SECURITY_POLICY_V1 +@see _LIT_SECURITY_POLICY_V2 +@see _LIT_SECURITY_POLICY_V3 + +@publishedAll +@released +*/ +class TSecurityPolicy + { +public: + enum TSecPolicyType + { + EAlwaysFail=0, + EAlwaysPass=1, + }; + +public: + inline TSecurityPolicy(); + IMPORT_C TSecurityPolicy(TSecPolicyType aType); + IMPORT_C TSecurityPolicy(TCapability aCap1, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None); + IMPORT_C TSecurityPolicy(TCapability aCap1, TCapability aCap2, TCapability aCap3, TCapability aCap4, TCapability aCap5 = ECapability_None, TCapability aCap6 = ECapability_None, TCapability aCap7 = ECapability_None); + IMPORT_C TSecurityPolicy(TSecureId aSecureId, TCapability aCap1 = ECapability_None, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None); + IMPORT_C TSecurityPolicy(TVendorId aVendorId, TCapability aCap1 = ECapability_None, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None); + IMPORT_C TInt Set(const TDesC8& aDes); + IMPORT_C TPtrC8 Package() const; + +#ifdef __KERNEL_MODE__ + +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool CheckPolicy(DProcess* aProcess, const char* aDiagnostic=0) const; + inline TBool CheckPolicy(DThread* aThread, const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool CheckPolicy(DProcess* aProcess, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicy(DThread* aThread, OnlyCreateWithNull aDiagnostic=NULL) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +#else // !__KERNEL_MODE__ + +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool CheckPolicy(RProcess aProcess, const char* aDiagnostic=0) const; + inline TBool CheckPolicy(RThread aThread, const char* aDiagnostic=0) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic=0) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic=0) const; + inline TBool CheckPolicyCreator(const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + TInt CheckPolicy(RSessionBase aSession) const; /**< @internalComponent */ + +#endif //__KERNEL_MODE__ + + TBool Validate() const; + +private: +#ifdef __KERNEL_MODE__ + IMPORT_C TBool DoCheckPolicy(DProcess* aProcess, const char* aDiagnostic) const; + IMPORT_C TBool DoCheckPolicy(DProcess* aProcess) const; + IMPORT_C TBool DoCheckPolicy(DThread* aThread, const char* aDiagnostic) const; + IMPORT_C TBool DoCheckPolicy(DThread* aThread) const; +#else // !__KERNEL_MODE__ + IMPORT_C TBool DoCheckPolicy(RProcess aProcess, const char* aDiagnostic) const; + IMPORT_C TBool DoCheckPolicy(RProcess aProcess) const; + IMPORT_C TBool DoCheckPolicy(RThread aThread, const char* aDiagnostic) const; + IMPORT_C TBool DoCheckPolicy(RThread aThread) const; + IMPORT_C TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const; + IMPORT_C TBool DoCheckPolicy(RMessagePtr2 aMsgPtr) const; + IMPORT_C TBool DoCheckPolicyCreator(const char* aDiagnostic) const; + IMPORT_C TBool DoCheckPolicyCreator() const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const; +#endif //__REMOVE_PLATSEC_DIAGNOSTICS__ + TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing) const; +#endif //__KERNEL_MODE__ + +public: + /** Constants to specify the type of TSecurityPolicy objects. + */ + enum TType + { + ETypeFail=0, /**< Always fail*/ + ETypePass=1, /**< Always pass*/ + ETypeC3=2, /**< Up to 3 capabilities*/ + ETypeC7=3, /**< Up to 7 capabilities*/ + ETypeS3=4, /**< Secure ID and up to 3 capabilities*/ + ETypeV3=5, /**< Vendor ID and up to 3 capabilities*/ + + /** The number of possible TSecurityPolicy types + This is intended of internal Symbain use only. + @internalTechnology + */ + ETypeLimit + + // other values may be added to indicate expanded policy objects (future extensions) + }; +protected: + TBool CheckPolicy(const SSecurityInfo& aSecInfo, SSecurityInfo& aMissing) const; +private: + void ConstructAndCheck3(TCapability aCap1, TCapability aCap2, TCapability aCap3); +private: + TUint8 iType; + TUint8 iCaps[3]; // missing capabilities are set to 0xff + union + { + TUint32 iSecureId; + TUint32 iVendorId; + TUint8 iExtraCaps[4]; // missing capabilities are set to 0xff + }; + friend class TCompiledSecurityPolicy; + }; + +/** Provides a TPkcgBuf wrapper for a descriptorised TSecurityPolicy. This a +suitable container for passing a security policy across IPC. +@publishedAll +@released +*/ +typedef TPckgBuf TSecurityPolicyBuf; + + +/** Structure for compile-time initialisation of a security policy. + +This structure behaves in the same way as a TSecurityPolicy object but has +the advantage that it may be initialised at compile time. E.g. +the following line defines a security policy 'KSecurityPolictReadUserData' +which checks ReadUserData capability. + +@code +_LIT_SECURITY_POLICY_C1(KSecurityPolictReadUserData,ECapabilityReadUserData) +@endcode + +Or, an array of security policies may be created like this: +@code +static const TStaticSecurityPolicy MyPolicies[] = + { + _INIT_SECURITY_POLICY_C1(ECapabilityReadUserData), + _INIT_SECURITY_POLICY_PASS(), + _INIT_SECURITY_POLICY_S0(0x1234567) + } +@endcode + +This class should not be initialised directly, instead one of the following +macros should be used: + +- _INIT_SECURITY_POLICY_PASS +- _INIT_SECURITY_POLICY_FAIL +- _INIT_SECURITY_POLICY_C1 +- _INIT_SECURITY_POLICY_C2 +- _INIT_SECURITY_POLICY_C3 +- _INIT_SECURITY_POLICY_C4 +- _INIT_SECURITY_POLICY_C5 +- _INIT_SECURITY_POLICY_C6 +- _INIT_SECURITY_POLICY_C7 +- _INIT_SECURITY_POLICY_S0 +- _INIT_SECURITY_POLICY_S1 +- _INIT_SECURITY_POLICY_S2 +- _INIT_SECURITY_POLICY_S3 +- _INIT_SECURITY_POLICY_V0 +- _INIT_SECURITY_POLICY_V1 +- _INIT_SECURITY_POLICY_V2 +- _INIT_SECURITY_POLICY_V3 +- _LIT_SECURITY_POLICY_PASS +- _LIT_SECURITY_POLICY_FAIL +- _LIT_SECURITY_POLICY_C1 +- _LIT_SECURITY_POLICY_C2 +- _LIT_SECURITY_POLICY_C3 +- _LIT_SECURITY_POLICY_C4 +- _LIT_SECURITY_POLICY_C5 +- _LIT_SECURITY_POLICY_C6 +- _LIT_SECURITY_POLICY_C7 +- _LIT_SECURITY_POLICY_S0 +- _LIT_SECURITY_POLICY_S1 +- _LIT_SECURITY_POLICY_S2 +- _LIT_SECURITY_POLICY_S3 +- _LIT_SECURITY_POLICY_V0 +- _LIT_SECURITY_POLICY_V1 +- _LIT_SECURITY_POLICY_V2 +- _LIT_SECURITY_POLICY_V3 + +@see TSecurityPolicy +@publishedAll +@released +*/ +struct TStaticSecurityPolicy + { + inline const TSecurityPolicy* operator&() const; + inline operator const TSecurityPolicy&() const; + inline const TSecurityPolicy& operator()() const; + +#ifndef __KERNEL_MODE__ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool CheckPolicy(RProcess aProcess, const char* aDiagnostic=0) const; + inline TBool CheckPolicy(RThread aThread, const char* aDiagnostic=0) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic=0) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic=0) const; + inline TBool CheckPolicyCreator(const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic=NULL) const; + inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; + inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ +#endif // !__KERNEL_MODE__ + + TUint32 iA; /**< @internalComponent */ + TUint32 iB; /**< @internalComponent */ + }; + + +/** +A dummy enum for use by the CAPABILITY_AS_TUINT8 macro +@internalComponent +*/ +enum __invalid_capability_value {}; + +/** +A macro to cast a TCapability to a TUint8. + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param cap The capability value +@internalComponent +*/ +#define CAPABILITY_AS_TUINT8(cap) \ + ((TUint8)(int)( \ + (cap)==ECapability_None \ + ? (__invalid_capability_value(*)[1])(ECapability_None) \ + : (__invalid_capability_value(*)[((TUint)(cap+1)<=(TUint)ECapability_Limit)?1:2])(cap) \ + )) + + +/** +A macro to construct a TUint32 from four TUint8s. The TUint32 is in BigEndian +ordering useful for class layout rather than number generation. + +@param i1 The first TUint8 +@param i2 The second TUint8 +@param i3 The third TUint8 +@param i4 The fourth TUint8 +@internalComponent +*/ +#define FOUR_TUINT8(i1,i2,i3,i4) \ + (TUint32)( \ + (TUint8)i1 | \ + (TUint8)i2 << 8 | \ + (TUint8)i3 << 16 | \ + (TUint8)i4 << 24 \ + ) + + +/** Macro for compile-time initialisation of a security policy object that +always fails. That is, checks against this policy will always fail, +irrespective of the security attributes of the item being checked. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_FAIL \ + { \ + FOUR_TUINT8( \ + (TUint8)TSecurityPolicy::ETypeFail, \ + (TUint8)0xff, \ + (TUint8)0xff, \ + (TUint8)0xff \ + ), \ + (TUint32)0xffffffff \ + } + + +/** Macro for compile-time definition of a security policy object that always +fails. That is, checks against this policy will always fail, irrespective of +the security attributes of the item being checked. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). +@param n Name to use for policy object +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_FAIL(n) const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_FAIL + + +/** Macro for compile-time initialisation of a security policy object that +always passes. That is, checks against this policy will always pass, +irrespective of the security attributes of the item being checked. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_PASS \ + { \ + FOUR_TUINT8( \ + (TUint8)TSecurityPolicy::ETypePass, \ + (TUint8)0xff, \ + (TUint8)0xff, \ + (TUint8)0xff \ + ), \ + (TUint32)0xffffffff \ + } + + +/** Macro for compile-time definition of a security policy object that always +passes. That is, checks against this policy will always pass, irrespective of +the security attributes of the item being checked. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). +@param n Name to use for policy object +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_PASS(n) const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_PASS + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for seven capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) +@param c5 The fifth capability to check (enumerator of TCapability) +@param c6 The sixth capability to check (enumerator of TCapability) +@param c7 The seventh capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,c7) \ + { \ + FOUR_TUINT8( \ + (TUint8)TSecurityPolicy::ETypeC7, \ + CAPABILITY_AS_TUINT8(c1), \ + CAPABILITY_AS_TUINT8(c2), \ + CAPABILITY_AS_TUINT8(c3) \ + ), \ + FOUR_TUINT8( \ + CAPABILITY_AS_TUINT8(c4), \ + CAPABILITY_AS_TUINT8(c5), \ + CAPABILITY_AS_TUINT8(c6), \ + CAPABILITY_AS_TUINT8(c7) \ + ) \ + } + + +/** Macro for compile-time definition of a security policy object +The policy will check for seven capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) +@param c5 The fifth capability to check (enumerator of TCapability) +@param c6 The sixth capability to check (enumerator of TCapability) +@param c7 The seventh capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,c6,c7) \ + const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,c7) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for six capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) +@param c5 The fifth capability to check (enumerator of TCapability) +@param c6 The sixth capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_C6(c1,c2,c3,c4,c5,c6) \ + _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for six capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) +@param c5 The fifth capability to check (enumerator of TCapability) +@param c6 The sixth capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_C6(n,c1,c2,c3,c4,c5,c6) \ + _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,c6,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for five capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) +@param c5 The fifth capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_C5(c1,c2,c3,c4,c5) \ + _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,ECapability_None,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for five capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) +@param c5 The fifth capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_C5(n,c1,c2,c3,c4,c5) \ + _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,ECapability_None,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for four capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_C4(c1,c2,c3,c4) \ + _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,ECapability_None,ECapability_None,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for four capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) +@param c4 The fourth capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_C4(n,c1,c2,c3,c4) \ + _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,ECapability_None,ECapability_None,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for three capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_C3(c1,c2,c3) \ + { \ + FOUR_TUINT8( \ + (TUint8)TSecurityPolicy::ETypeC3, \ + CAPABILITY_AS_TUINT8(c1), \ + CAPABILITY_AS_TUINT8(c2), \ + CAPABILITY_AS_TUINT8(c3) \ + ), \ + (TUint32)0xffffffff \ + } + + +/** Macro for compile-time definition of a security policy object +The policy will check for three capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_C3(n,c1,c2,c3) \ + const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_C3(c1,c2,c3) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for two capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_C2(c1,c2) \ + _INIT_SECURITY_POLICY_C3(c1,c2,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for two capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_C2(n,c1,c2) \ + _LIT_SECURITY_POLICY_C3(n,c1,c2,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for one capability. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param c1 The first capability to check (enumerator of TCapability) + + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_C1(c1) \ + _INIT_SECURITY_POLICY_C3(c1,ECapability_None,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for one capability. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning will be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param c1 The first capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_C1(n,c1) \ + _LIT_SECURITY_POLICY_C3(n,c1,ECapability_None,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a secure ID and three capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param sid The SID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_S3(sid,c1,c2,c3) \ + { \ + FOUR_TUINT8( \ + (TUint8)TSecurityPolicy::ETypeS3, \ + CAPABILITY_AS_TUINT8(c1), \ + CAPABILITY_AS_TUINT8(c2), \ + CAPABILITY_AS_TUINT8(c3) \ + ), \ + (TUint32)(sid) \ + } + + +/** Macro for compile-time definition of a security policy object +The policy will check for a secure ID and three capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param sid The SID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_S3(n,sid,c1,c2,c3) \ + const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_S3(sid,c1,c2,c3) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a secure ID and two capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param sid The SID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_S2(sid,c1,c2) \ + _INIT_SECURITY_POLICY_S3(sid,c1,c2,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for a secure ID and two capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param sid The SID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_S2(n,sid,c1,c2) \ + _LIT_SECURITY_POLICY_S3(n,sid,c1,c2,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a secure ID and one capability. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param sid The SID value to check for +@param c1 The first capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_S1(sid,c1) \ + _INIT_SECURITY_POLICY_S3(sid,c1,ECapability_None,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for a secure ID and one capability. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param sid The SID value to check for +@param c1 The first capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_S1(n,sid,c1) \ + _LIT_SECURITY_POLICY_S3(n,sid,c1,ECapability_None,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a secure ID. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +@param sid The SID value to check for + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_S0(sid) \ + _INIT_SECURITY_POLICY_S3(sid,ECapability_None,ECapability_None,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for a secure ID. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +@param n Name to use for policy object +@param sid The SID value to check for + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_S0(n,sid) \ + _LIT_SECURITY_POLICY_S3(n,sid,ECapability_None,ECapability_None,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a vendor ID and three capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param vid The VID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_V3(vid,c1,c2,c3) \ + { \ + FOUR_TUINT8( \ + (TUint8)TSecurityPolicy::ETypeV3, \ + CAPABILITY_AS_TUINT8(c1), \ + CAPABILITY_AS_TUINT8(c2), \ + CAPABILITY_AS_TUINT8(c3) \ + ), \ + (TUint32)(vid) \ + } + + +/** Macro for compile-time definition of a security policy object +The policy will check for a vendor ID and three capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param vid The VID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) +@param c3 The third capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_V3(n,vid,c1,c2,c3) \ + const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_V3(vid,c1,c2,c3) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a vendor ID and two capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param vid The VID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_V2(vid,c1,c2) \ + _INIT_SECURITY_POLICY_V3(vid,c1,c2,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for a vendor ID and two capabilities. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param vid The VID value to check for +@param c1 The first capability to check (enumerator of TCapability) +@param c2 The second capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_V2(n,vid,c1,c2) \ + _LIT_SECURITY_POLICY_V3(n,vid,c1,c2,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a vendor ID and one capability. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param vid The VID value to check for +@param c1 The first capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_V1(vid,c1) \ + _INIT_SECURITY_POLICY_V3(vid,c1,ECapability_None,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for a vendor ID and one capability. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +If an invlid capability value is specified then, dependant on the compiler, +a compile time error or warning be produced which includes the label +"__invalid_capability_value" + +@param n Name to use for policy object +@param vid The VID value to check for +@param c1 The first capability to check (enumerator of TCapability) + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_V1(n,vid,c1) \ + _LIT_SECURITY_POLICY_V3(n,vid,c1,ECapability_None,ECapability_None) + + +/** Macro for compile-time initialisation of a security policy object +The policy will check for a vendor ID. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +@param vid The VID value to check for + +@publishedAll +@released +*/ +#define _INIT_SECURITY_POLICY_V0(vid) \ + _INIT_SECURITY_POLICY_V3(vid,ECapability_None,ECapability_None,ECapability_None) + + +/** Macro for compile-time definition of a security policy object +The policy will check for a vendor ID. + +The object declared has an implicit conversion to const TSecurityPolicy&. +Taking the address of the object will return a const TSecurityPolicy*. +Explicit conversion to const TSecurityPolicy& may be effected by using the +function call operator n(). + +@param n Name to use for policy object +@param vid The VID value to check for + +@publishedAll +@released +*/ +#define _LIT_SECURITY_POLICY_V0(n,vid) \ + _LIT_SECURITY_POLICY_V3(n,vid,ECapability_None,ECapability_None,ECapability_None) + + + +#ifdef __KERNEL_MODE__ +class DThread; +class RMessageK; +#endif +class TPlatSecDiagnostic; + +/** +Class containing Platform Security related methods +@internalTechnology +*/ +class PlatSec + { +#ifndef __KERNEL_MODE__ +public: + /** + Tests whether a given Platform Security capability is enforced by the system. + + Capabilities may not be enforced for several reasons: + -# The capability has been explicitly disabled on this system + by use of the PlatSecDisabledCaps configuration parameter + -# Platform Security checks have been globally disabled + by use of the EPlatSecEnforcement configuration parameter + -# The capability value is unknown. I.e. Is not part of the set of supported + capabilities. See TCapabilitySet::SetAllSupported(). + + @param aCapability The capability to test + @return A non-zero value if the capability is enforced, zero if it is not. + + @publishedAll + @released + */ + IMPORT_C static TBool IsCapabilityEnforced(TCapability aCapability); + + /** + An enumeration used with PlatSecSetting() + @see PlatSecSetting() + @publishedAll + @test + */ + enum TConfigSetting + { + EPlatSecEnforcement, /**< Used to request the value of the PlatSecEnforcement setting */ + EPlatSecDiagnotics, /**< Used to request the value of the PlatSecDiagnotics setting */ + EPlatSecProcessIsolation, /**< Used to request the value of the PlatSecProcessIsolation setting */ + EPlatSecEnforceSysBin, /**< Used to request the value of the PlatSecEnforceSysBin setting */ + EPlatSecLocked, /**< Used to request the value of the PlatSecLocked setting */ + }; + + /** + A test function to return the state of a given Platform Security configuration setting. + @param aSetting An enumerated value representing the required setting + @return A value representing the setting. 0 represents 'OFF', 1 represents 'ON' + Other values may be returned for some settings, these exceptions are documented + in the description for individual enumerations of TConfigSetting. + @see TConfigSetting + @publishedAll + @test + */ + IMPORT_C static TInt ConfigSetting(TConfigSetting aSetting); + +#endif // Not __KERNEL_MODE__ + + // + // All methods below here are internalTechnology + // + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +public: + /** @internalTechnology */ + static inline TInt LoaderCapabilityViolation(const TDesC8& aImporterName, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps); +#ifdef __KERNEL_MODE__ + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(const DProcess* aViolatingProcess, TCapability aCapability, const char* aContextText); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(const DThread* aViolatingThread, TCapability aCapability, const char* aContextText); + /** @internalTechnology */ + static inline TInt SecureIdCheckFail(const DProcess* aViolatingProcess, TSecureId aSid, const char* aContextText); + /** @internalTechnology */ + static inline TInt PolicyCheckFail(const DProcess* aProcess, const SSecurityInfo& aMissing, const char* aContextText); + /** @internalTechnology */ + static inline TInt PolicyCheckFail(const DThread* aProcess, const SSecurityInfo& aMissing, const char* aContextText); + /** @internalTechnology */ + static inline TInt ProcessIsolationFail(const char* aContextText); + /** @internalTechnology */ + static inline TInt ProcessIsolationIPCFail(RMessageK* aMessage, const char* aContextText); +#else // !__KERNEL_MODE__ + /** @internalTechnology */ + static inline TInt LoaderCapabilityViolation(RProcess aLoadingProcess, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps); + /** @internalTechnology */ + static inline TInt CreatorCapabilityCheckFail(TCapability aCapability, const char* aContextText); + /** @internalTechnology */ + static inline TInt CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps, const char* aContextText); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(TInt aHandle, TCapability aCapability, const char* aContextText); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps, const char* aContextText); + /** @internalTechnology */ + static inline TInt PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissing, const char* aContextText); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability, const char* aContextText); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps, const char* aContextText); + /** @internalTechnology */ + static inline TInt PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissingCaps, const char* aContextText); + /** @internalTechnology */ + static inline TInt PolicyCheckFail(RSessionBase aSession, const SSecurityInfo& aMissingCaps, const char* aContextText); + /** @internalTechnology */ + static inline TInt CreatorPolicyCheckFail(const SSecurityInfo& aMissingCaps, const char* aContextText); + /** @internalTechnology */ + static inline TInt CreatorCapabilityCheckFail(TCapability aCapability); + /** @internalTechnology */ + static inline TInt CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(TInt aHandle, TCapability aCapability); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps); + /** @internalTechnology */ + static inline TInt PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissing); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability); + /** @internalTechnology */ + static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps); + /** @internalTechnology */ + static inline TInt PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissingCaps); + /** @internalTechnology */ + static inline TInt CreatorPolicyCheckFail(const SSecurityInfo& aMissingCaps); +#endif //__KERNEL_MODE__ + +private: + UIMPORT_C static TInt EmitDiagnostic(TPlatSecDiagnostic& aDiagnostic, const char* aContextText); +#else //__REMOVE_PLATSEC_DIAGNOSTICS__ +#ifndef __KERNEL_MODE__ +private: + IMPORT_C static TInt EmitDiagnostic(TPlatSecDiagnostic& aDiagnostic, const char* aContextText); +#endif // !__KERNEL_MODE__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +public: + /** @internalTechnology */ + UIMPORT_C static TInt EmitDiagnostic(); + }; + + + +/** +@publishedAll +@released + +Contains information about the code and data sections belonging to a process. + +@see RProcess::GetMemoryInfo +*/ +class TProcessMemoryInfo + { +public: + /** + The code base address (.text). + */ + TUint32 iCodeBase; + + + /** + The size of the code section (.text). + */ + TUint32 iCodeSize; + + + /** + The base address of the constant data section (.radata). + */ + TUint32 iConstDataBase; + + + /** + The size of the constant data section (.radata). + */ + + TUint32 iConstDataSize; + + + /** + The base address of the initialised data section (.data). + */ + TUint32 iInitialisedDataBase; + + + /** + The size of the initialised data section (.data). + */ + TUint32 iInitialisedDataSize; + + + /** + The base address of the uninitialised data section (.bss). + */ + TUint32 iUninitialisedDataBase; + + + /** + The size of the uninitialised data section (.bss). + */ + TUint32 iUninitialisedDataSize; + }; + + + + +/** +@publishedAll +@released + +Defines a more useful synonym for TProcessMemoryInfo. +*/ +typedef TProcessMemoryInfo TModuleMemoryInfo; // more accurate name - remove old one later + + + + +#ifndef __KERNEL_MODE__ +class CBase; +/** +@publishedAll +@released + +Generic array. + +This class defines a generic array which can be constructed by any of the +following templated concrete arrays: + +1. CArrayFixFlat + +2. CArrayFixSeg + +3. CArrayVarFlat + +4. CArrayVarSeg + +5. CArrayPakFlat + +6. RArray + +7. RPointerArray + +and also by the following template specialisation classes: + +1. RArray + +2. RArray + +It allows a degree of polymorphism amongst the array classes. It permits the +operator[] and the Count() member functions of an array to be invoked without +knowing which array class has been used to construct that array. + +TArray allows access to elements of an array but does not permit changes to +those elements. + +Use the Array() member function of an array to construct and return +a TArray object for that array. + +A TArray type object is not intended to be constructed explicitly +by user code. + +@see CArrayFixFlat +@see CArrayFixSeg +@see CArrayVarFlat +@see CArrayVarSeg +@see CArrayPakFlat +@see RArray +@see RPointerArray +@see RArray +@see RArray +*/ +template +class TArray + { +public: + inline TArray(TInt (*aCount)(const CBase* aPtr),const TAny*(*anAt)(const CBase* aPtr,TInt anIndex),const CBase* aPtr); + inline TInt Count() const; + inline const T& operator[](TInt anIndex) const; +private: + const CBase* iPtr; + TInt (*iCount)(const CBase* aPtr); + const TAny*(*iAt)(const CBase* aPtr,TInt anIndex); + }; +#endif + + + + +/** +@publishedAll +@released + +Defines a function type used by a TIdentityRelation object. + +A function of this type implements an algorithm for determining whether +two objects match. + +@see TIdentityRelation +*/ +typedef TBool (*TGeneralIdentityRelation)(const TAny*, const TAny*); + + + + +/** +@publishedAll +@released + +Defines a function type used by a TLinearOrder object + +A function of this type implements an algorithm that determines +the order of two objects. + +@see TLinearOrder +*/ +typedef TInt (*TGeneralLinearOrder)(const TAny*, const TAny*); + + + + +/** +@publishedAll +@released + +A templated class which packages a function that determines whether two +objects of a given class type match. During linear search operations the search +term is always passed as the first argument and the second argument is an +element of the array being searched. + +A TIdentityRelation object is constructed and passed as a parameter to +member functions of the array classes RArray and RPointerArray. + +@see RArray +@see RPointerArray +*/ +template +class TIdentityRelation + { +public: + inline TIdentityRelation(); + inline TIdentityRelation( TBool (*anIdentity)(const T&, const T&) ); + inline operator TGeneralIdentityRelation() const; +private: + inline static TBool EqualityOperatorCompare(const T& aLeft, const T& aRight); +private: + TGeneralIdentityRelation iIdentity; + }; + + + +/** +@publishedAll +@released + +A set of common identity relations for frequently occurring types. + +@see RArray +@see RPointerArray +@see RHashSet +@see RPtrHashSet +@see RHashMap +@see RPtrHashMap +*/ +class DefaultIdentity + { +public: + IMPORT_C static TBool Integer(const TInt&, const TInt&); + IMPORT_C static TBool Des8(const TDesC8&, const TDesC8&); + IMPORT_C static TBool Des16(const TDesC16&, const TDesC16&); + IMPORT_C static TBool IntegerPtr(TInt* const&, TInt* const&); + IMPORT_C static TBool Des8Ptr(TDesC8* const&, TDesC8* const&); + IMPORT_C static TBool Des16Ptr(TDesC16* const&, TDesC16* const&); + }; + + + + +/** +@publishedAll +@released + +A templated class which packages a function that determines the order of two +objects of a given class type. During binary search operations the search term +is always passed as the first argument and the second argument is an element +of the array being searched. + +A TLinearOrder object is constructed and passed as a parameter to member +functions of the array classes RArray and RPointerArray. + +@see RArray +@see RPointerArray +*/ +template +class TLinearOrder + { +public: + inline TLinearOrder( TInt(*anOrder)(const T&, const T&) ); + inline operator TGeneralLinearOrder() const; +private: + TGeneralLinearOrder iOrder; + }; + + +/* +@publishedAll +@released + +A set of values that tell array search functions which array element is to be +returned when there are duplicate elements in the array. + +These values are used by RArray, RPointerArray, RArray, +and RArray search functions. + +Examples of functions that take +these enum values are: RPointerArray::SpecificFindInOrderL(), +and RArray::SpecificFindInSignedKeyOrder(). + +@see RArray +@see RPointerArray +@see RArray +@see RArray +*/ +enum TArrayFindMode + { + /** + Indicates that any element in a block of duplicate elements can be + returned by a search function. + + Note that using this mode, there can be no guarantee that the element + returned by the search functions will be the same if the size of the array + changes between successive calls to those functions. + */ + EArrayFindMode_Any = 0, + + /** + Indicates that the first element in a block of duplicate elements + is returned. + */ + EArrayFindMode_First = 1, + + /** + Indicates that the first element after the last element in a block + of duplicate elements is returned. + */ + EArrayFindMode_Last = 2, + + /** + @internalTechnology + */ + EArrayFindMode_Limit = 3 + }; + + +/** +@internalComponent + +Base class used in the derivation of RPointerArray, RArray, +and RArray. + +The base class is inherited privately. + +The class is internal and is not intended for use. +*/ +class RPointerArrayBase + { +protected: + IMPORT_C RPointerArrayBase(); + IMPORT_C RPointerArrayBase(TInt aGranularity); + IMPORT_C RPointerArrayBase(TInt aMinGrowBy, TInt aFactor); + IMPORT_C void Close(); + IMPORT_C TInt Count() const; + inline void ZeroCount() {iCount=0;} + inline TAny** Entries() {return iEntries;} + IMPORT_C TAny*& At(TInt anIndex) const; + IMPORT_C TInt Append(const TAny* anEntry); + IMPORT_C TInt Insert(const TAny* anEntry, TInt aPos); + IMPORT_C void Remove(TInt anIndex); + IMPORT_C void Compress(); + IMPORT_C void Reset(); + IMPORT_C TInt Find(const TAny* anEntry) const; + IMPORT_C TInt Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const; + IMPORT_C TInt FindReverse(const TAny* aEntry) const; + IMPORT_C TInt FindReverse(const TAny* aEntry, TGeneralIdentityRelation aIdentity) const; + IMPORT_C TInt FindIsqSigned(TInt anEntry) const; + IMPORT_C TInt FindIsqUnsigned(TUint anEntry) const; + IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const; + IMPORT_C TInt FindIsqSigned(TInt anEntry, TInt aMode) const; + IMPORT_C TInt FindIsqUnsigned(TUint anEntry, TInt aMode) const; + IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const; + IMPORT_C TInt InsertIsqSigned(TInt anEntry, TBool aAllowRepeats); + IMPORT_C TInt InsertIsqUnsigned(TUint anEntry, TBool aAllowRepeats); + IMPORT_C TInt InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats); + IMPORT_C TInt BinarySearchSigned(TInt anEntry, TInt& anIndex) const; + IMPORT_C TInt BinarySearchUnsigned(TUint anEntry, TInt& anIndex) const; + IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const; + IMPORT_C TInt BinarySearchSigned(TInt anEntry, TInt& anIndex, TInt aMode) const; + IMPORT_C TInt BinarySearchUnsigned(TUint anEntry, TInt& anIndex, TInt aMode) const; + IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const; +#ifndef __KERNEL_MODE__ + IMPORT_C RPointerArrayBase(TAny** aEntries, TInt aCount); + IMPORT_C void GranularCompress(); + IMPORT_C TInt DoReserve(TInt aCount); + IMPORT_C void HeapSortSigned(); + IMPORT_C void HeapSortUnsigned(); + IMPORT_C void HeapSort(TGeneralLinearOrder anOrder); + IMPORT_C static TInt GetCount(const CBase* aPtr); + IMPORT_C static const TAny* GetElementPtr(const CBase* aPtr, TInt aIndex); +#endif +private: + TInt Grow(); +private: + TInt iCount; + TAny** iEntries; + TInt iAllocated; + TInt iGranularity; // positive means linear, negative means exponential growth + TInt iSpare1; + TInt iSpare2; + }; + + + + +/** +@publishedAll +@released + +A simple and efficient array of pointers to objects. + +The elements of the array are pointers to instances of a class; this class +is specified as the template parameter T. + +The class offers standard array behaviour which includes insertion, appending +and sorting of pointers. + +Derivation from RPointerArrayBase is private. +*/ +template +class RPointerArray : private RPointerArrayBase + { +public: + inline RPointerArray(); + inline explicit RPointerArray(TInt aGranularity); + inline RPointerArray(TInt aMinGrowBy, TInt aFactor); + inline void Close(); + inline TInt Count() const; + inline T* const& operator[](TInt anIndex) const; + inline T*& operator[](TInt anIndex); + inline TInt Append(const T* anEntry); + inline TInt Insert(const T* anEntry, TInt aPos); + inline void Remove(TInt anIndex); + inline void Compress(); + inline void Reset(); + void ResetAndDestroy(); + inline TInt Find(const T* anEntry) const; + inline TInt Find(const T* anEntry, TIdentityRelation anIdentity) const; + template + inline TInt Find(const K& aKey, TBool (*apfnCompare)(const K* k, const T& t)) const + /** + Finds the first object pointer in the array which matches aKey using + the comparison algorithm provided by apfnCompare. + + The find operation always starts at the low index end of the array. There + is no assumption about the order of objects in the array. + + @param aKey The key of type K to be compared with the elements of the array using apfnCompare. + @param apfnCompare A function defining the identity relation between the + object pointers in the array, and their keys of type K. The + function returns true if k and t match based on this relationship. + + @return The index of the first matching object pointer within the array. + KErrNotFound, if no suitable object pointer can be found. + */ + { return RPointerArrayBase::Find((T*)&aKey,*(TIdentityRelation*)&apfnCompare); } + inline TInt FindReverse(const T* anEntry) const; + inline TInt FindReverse(const T* anEntry, TIdentityRelation anIdentity) const; + template + inline TInt FindReverse(const K& aKey, TInt (*apfnMatch)(const K* k, const T& t)) const + /** + Finds the first object pointer in the array which matches aKey using + the comparison algorithm provided by apfnCompare. + + The find operation always starts at the high index end of the array. There + is no assumption about the order of objects in the array. + + @param aKey The key of type K to be compared with the elements of the array using apfnMatch. + @param apfnMatch A function defining the identity relation between the + object pointers in the array, and their keys of type K. The + function returns true if k and t match based on this relationship. + + @return The index of the first matching object pointer within the array. + KErrNotFound, if no suitable object pointer can be found. + */ + + { return RPointerArrayBase::FindReverse((T*)&aKey,*(TIdentityRelation*)&apfnMatch); } + inline TInt FindInAddressOrder(const T* anEntry) const; + inline TInt FindInOrder(const T* anEntry, TLinearOrder anOrder) const; + inline TInt FindInAddressOrder(const T* anEntry, TInt& anIndex) const; + inline TInt FindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder anOrder) const; + template + inline TInt FindInOrder(const K& aKey, TInt (*apfnCompare)(const K* k, const T& t)) const + /** + Finds the object pointer in the array whose object matches the specified + key, (Using the relationship defined within apfnCompare) using a binary search + technique and an ordering algorithm. + + The function assumes that existing object pointers in the array are ordered + so that the objects themselves are in object order as determined by an algorithm + supplied by the caller and packaged as a TLinearOrder. + + @param aKey The key of type K to be compared with the elements of the array using apfnCompare. + @param apfnCompare A function which defines the order that the array was sorted, + where in it aKey (via the defined relationship) should fit, and if the key is present. + + @return The index of the matching object pointer within the array. + KErrNotFound, if no suitable object pointer can be found. + */ + { return RPointerArrayBase::FindIsq((T*)&aKey,*(TLinearOrder*)&apfnCompare); } + inline TInt SpecificFindInAddressOrder(const T* anEntry, TInt aMode) const; + inline TInt SpecificFindInOrder(const T* anEntry, TLinearOrder anOrder, TInt aMode) const; + inline TInt SpecificFindInAddressOrder(const T* anEntry, TInt& anIndex, TInt aMode) const; + inline TInt SpecificFindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const; + inline TInt InsertInAddressOrder(const T* anEntry); + inline TInt InsertInOrder(const T* anEntry, TLinearOrder anOrder); + inline TInt InsertInAddressOrderAllowRepeats(const T* anEntry); + inline TInt InsertInOrderAllowRepeats(const T* anEntry, TLinearOrder anOrder); +#ifndef __KERNEL_MODE__ + inline void AppendL(const T* anEntry); + inline void InsertL(const T* anEntry, TInt aPos); + inline TInt FindL(const T* anEntry) const; + inline TInt FindL(const T* anEntry, TIdentityRelation anIdentity) const; + inline TInt FindReverseL(const T* anEntry) const; + inline TInt FindReverseL(const T* anEntry, TIdentityRelation anIdentity) const; + inline TInt FindInAddressOrderL(const T* anEntry) const; + inline TInt FindInOrderL(const T* anEntry, TLinearOrder anOrder) const; + inline void FindInAddressOrderL(const T* anEntry, TInt& anIndex) const; + inline void FindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder anOrder) const; + inline TInt SpecificFindInAddressOrderL(const T* anEntry, TInt aMode) const; + inline TInt SpecificFindInOrderL(const T* anEntry, TLinearOrder anOrder, TInt aMode) const; + inline void SpecificFindInAddressOrderL(const T* anEntry, TInt& anIndex, TInt aMode) const; + inline void SpecificFindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const; + inline void InsertInAddressOrderL(const T* anEntry); + inline void InsertInOrderL(const T* anEntry, TLinearOrder anOrder); + inline void InsertInAddressOrderAllowRepeatsL(const T* anEntry); + inline void InsertInOrderAllowRepeatsL(const T* anEntry, TLinearOrder anOrder); + + inline RPointerArray(T** aEntries, TInt aCount); + inline void GranularCompress(); + inline TInt Reserve(TInt aCount); + inline void ReserveL(TInt aCount); + inline void SortIntoAddressOrder(); + inline void Sort(TLinearOrder anOrder); + inline TArray Array() const; +#endif + }; + + + +/** +@publishedAll +@released + +Array of raw pointers. + +The array is a simple and efficient specialized array of TAny pointers offering +standard array behaviour. + +The derivation from RPointerArrayBase is private. +*/ +TEMPLATE_SPECIALIZATION class RPointerArray : private RPointerArrayBase + { +public: + inline RPointerArray(); + inline explicit RPointerArray(TInt aGranularity); + inline RPointerArray(TInt aMinGrowBy, TInt aFactor); + inline void Close(); + inline TInt Count() const; + inline TAny* const& operator[](TInt anIndex) const; + inline TAny*& operator[](TInt anIndex); + inline TInt Append(const TAny* anEntry); + inline TInt Insert(const TAny* anEntry, TInt aPos); + inline void Remove(TInt anIndex); + inline void Compress(); + inline void Reset(); + inline TInt Find(const TAny* anEntry) const; + inline TInt FindReverse(const TAny* anEntry) const; + inline TInt FindInAddressOrder(const TAny* anEntry) const; + inline TInt FindInAddressOrder(const TAny* anEntry, TInt& anIndex) const; + inline TInt SpecificFindInAddressOrder(const TAny* anEntry, TInt aMode) const; + inline TInt SpecificFindInAddressOrder(const TAny* anEntry, TInt& anIndex, TInt aMode) const; + inline TInt InsertInAddressOrder(const TAny* anEntry); + inline TInt InsertInAddressOrderAllowRepeats(const TAny* anEntry); +#ifndef __KERNEL_MODE__ + inline void AppendL(const TAny* anEntry); + inline void InsertL(const TAny* anEntry, TInt aPos); + inline TInt FindL(const TAny* anEntry) const; + inline TInt FindReverseL(const TAny* anEntry) const; + inline TInt FindInAddressOrderL(const TAny* anEntry) const; + inline void FindInAddressOrderL(const TAny* anEntry, TInt& anIndex) const; + inline TInt SpecificFindInAddressOrderL(const TAny* anEntry, TInt aMode) const; + inline void SpecificFindInAddressOrderL(const TAny* anEntry, TInt& anIndex, TInt aMode) const; + inline void InsertInAddressOrderL(const TAny* anEntry); + inline void InsertInAddressOrderAllowRepeatsL(const TAny* anEntry); + + inline RPointerArray(TAny** aEntries, TInt aCount); + inline void GranularCompress(); + inline void SortIntoAddressOrder(); + inline TArray Array() const; +#endif + }; + + + +/** +@internalComponent + +Base class used in the derivation of RArray. + +The base class is inherited privately. + +The class is internal and is not intended for use. +*/ +class RArrayBase + { +protected: + IMPORT_C RArrayBase(TInt anEntrySize); + IMPORT_C RArrayBase(TInt anEntrySize, TInt aGranularity); + IMPORT_C RArrayBase(TInt anEntrySize, TInt aGranularity, TInt aKeyOffset); + IMPORT_C RArrayBase(TInt anEntrySize, TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor); + IMPORT_C RArrayBase(TInt aEntrySize,TAny* aEntries, TInt aCount); + IMPORT_C void Close(); + IMPORT_C TInt Count() const; + IMPORT_C TAny* At(TInt anIndex) const; + IMPORT_C TInt Append(const TAny* anEntry); + IMPORT_C TInt Insert(const TAny* anEntry, TInt aPos); + IMPORT_C void Remove(TInt anIndex); + IMPORT_C void Compress(); + IMPORT_C void Reset(); + IMPORT_C TInt Find(const TAny* anEntry) const; + IMPORT_C TInt Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const; + IMPORT_C TInt FindReverse(const TAny* aEntry) const; + IMPORT_C TInt FindReverse(const TAny* aEntry, TGeneralIdentityRelation aIdentity) const; + IMPORT_C TInt FindIsqSigned(const TAny* anEntry) const; + IMPORT_C TInt FindIsqUnsigned(const TAny* anEntry) const; + IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const; + IMPORT_C TInt FindIsqSigned(const TAny* anEntry, TInt aMode) const; + IMPORT_C TInt FindIsqUnsigned(const TAny* anEntry, TInt aMode) const; + IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const; + IMPORT_C TInt InsertIsqSigned(const TAny* anEntry, TBool aAllowRepeats); + IMPORT_C TInt InsertIsqUnsigned(const TAny* anEntry, TBool aAllowRepeats); + IMPORT_C TInt InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats); + IMPORT_C TInt BinarySearchSigned(const TAny* anEntry, TInt& anIndex) const; + IMPORT_C TInt BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex) const; + IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const; + IMPORT_C TInt BinarySearchSigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const; + IMPORT_C TInt BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const; + IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const; +#ifndef __KERNEL_MODE__ + IMPORT_C void GranularCompress(); + IMPORT_C TInt DoReserve(TInt aCount); + IMPORT_C void HeapSortSigned(); + IMPORT_C void HeapSortUnsigned(); + IMPORT_C void HeapSort(TGeneralLinearOrder anOrder); + IMPORT_C static TInt GetCount(const CBase* aPtr); + IMPORT_C static const TAny* GetElementPtr(const CBase* aPtr, TInt aIndex); +#endif +private: + TInt Grow(); +private: + TInt iCount; + TAny* iEntries; + TInt iEntrySize; + TInt iKeyOffset; + TInt iAllocated; + TInt iGranularity; // positive means linear, negative means exponential growth + TInt iSpare1; + TInt iSpare2; + }; + + + + +/** +@publishedAll +@released + +A simple and efficient array of fixed length objects. + +The elements of the array are instances of a class; this class is specified +as the template parameter T. + +The array offers standard array behaviour which includes insertion, appending +and sorting of elements. + +Note: + +1. where possible, this class should be used in preference to + CArrayFixFlat. + +2. the derivation from RArrayBase is private. + +3. for performance reasons, RArray stores objects in the array as + word (4 byte) aligned quantities. This means that some member functions + do not work when RArray is instantiated for classes of less than 4 bytes + in size, or when the class's alignment requirement is not 4. + Be aware that it is possible to get an unhandled exception on hardware + that enforces strict alignment. + + The affected functions are: + + 3.1 the constructor: RArray(TInt, T*, TInt) + + 3.2 Append(const T&) + + 3.3 Insert(const T&, TInt) + + 3.4 the [] operator, and then using the pointer to iterate through + the array as you would with a C array. +*/ +template +class RArray : private RArrayBase + { +public: + inline RArray(); + inline explicit RArray(TInt aGranularity); + inline RArray(TInt aGranularity, TInt aKeyOffset); + inline RArray(TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor); + inline RArray(TInt aEntrySize,T* aEntries, TInt aCount); + inline void Close(); + inline TInt Count() const; + inline const T& operator[](TInt anIndex) const; + inline T& operator[](TInt anIndex); + inline TInt Append(const T& anEntry); + inline TInt Insert(const T& anEntry, TInt aPos); + inline void Remove(TInt anIndex); + inline void Compress(); + inline void Reset(); + inline TInt Find(const T& anEntry) const; + inline TInt Find(const T& anEntry, TIdentityRelation anIdentity) const; + template + inline TInt Find(const K& aKey, TBool (*apfnCompare)(const K* k, const T& t)) const + /** + Finds the first object in the array which matches aKey using + the comparison algorithm provided by apfnCompare. + + The find operation always starts at the low index end of the array. There + is no assumption about the order of objects in the array. + + @param aKey The key of type K to be compared with the elements of the array using apfnCompare. + @param apfnCompare A function defining the identity relation between the + object in the array, and their keys of type K. The function + returns true if k and t match based on this relationship. + + @return The index of the first matching object within the array. + KErrNotFound, if no suitable object can be found. + */ + { return RArrayBase::Find((T*)&aKey,*(TIdentityRelation*)&apfnCompare); } + inline TInt FindReverse(const T& anEntry) const; + inline TInt FindReverse(const T& anEntry, TIdentityRelation anIdentity) const; + template + inline TInt FindReverse(const K& aKey, TInt (*apfnMatch)(const K* k, const T& t)) const + /** + Finds the first object in the array which matches aKey using the comparison + algorithm provided by apfnCompare. + + The find operation always starts at the high index end of the array. There + is no assumption about the order of objects in the array. + + @param aKey The key of type K to be compared with the elements of the array using apfnMatch. + @param apfnMatch A function defining the identity relation between the + object in the array, and their keys of type K. The function + returns true if k and t match based on this relationship. + + @return The index of the first matching object within the array. + KErrNotFound, if no suitable object can be found. + */ + { return RArrayBase::FindReverse((T*)&aKey,*(TIdentityRelation*)&apfnMatch); } + inline TInt FindInSignedKeyOrder(const T& anEntry) const; + inline TInt FindInUnsignedKeyOrder(const T& anEntry) const; + inline TInt FindInOrder(const T& anEntry, TLinearOrder anOrder) const; + inline TInt FindInSignedKeyOrder(const T& anEntry, TInt& anIndex) const; + inline TInt FindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex) const; + inline TInt FindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder anOrder) const; + template + inline TInt FindInOrder(const K& aKey, TInt (*apfnCompare)(const K* k, const T& t)) const + /** + Finds the object in the array whose object matches the specified + key, (Using the relationship defined within apfnCompare) using a binary search + technique and an ordering algorithm. + + The function assumes that existing objects in the array are ordered so + that the objects themselves are in object order as determined by an algorithm + supplied by the caller and packaged as a TLinearOrder. + + @param aKey The key of type K to be compared with the elements of the array using apfnCompare. + @param apfnCompare A function which defines the order that the array was sorted, + where in it aKey (via the defined relationship) should fit, and if the key is present. + + @return The index of the matching object within the array. + KErrNotFound, if no suitable object can be found. + */ + + { return RArrayBase::FindIsq((T*)&aKey,*(TLinearOrder*)&apfnCompare); } + inline TInt SpecificFindInSignedKeyOrder(const T& anEntry, TInt aMode) const; + inline TInt SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt aMode) const; + inline TInt SpecificFindInOrder(const T& anEntry, TLinearOrder anOrder, TInt aMode) const; + inline TInt SpecificFindInSignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const; + inline TInt SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const; + inline TInt SpecificFindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const; + inline TInt InsertInSignedKeyOrder(const T& anEntry); + inline TInt InsertInUnsignedKeyOrder(const T& anEntry); + inline TInt InsertInOrder(const T& anEntry, TLinearOrder anOrder); + inline TInt InsertInSignedKeyOrderAllowRepeats(const T& anEntry); + inline TInt InsertInUnsignedKeyOrderAllowRepeats(const T& anEntry); + inline TInt InsertInOrderAllowRepeats(const T& anEntry, TLinearOrder anOrder); +#ifndef __KERNEL_MODE__ + inline void AppendL(const T& anEntry); + inline void InsertL(const T& anEntry, TInt aPos); + inline TInt FindL(const T& anEntry) const; + inline TInt FindL(const T& anEntry, TIdentityRelation anIdentity) const; + inline TInt FindReverseL(const T& anEntry) const; + inline TInt FindReverseL(const T& anEntry, TIdentityRelation anIdentity) const; + inline TInt FindInSignedKeyOrderL(const T& anEntry) const; + inline TInt FindInUnsignedKeyOrderL(const T& anEntry) const; + inline TInt FindInOrderL(const T& anEntry, TLinearOrder anOrder) const; + inline void FindInSignedKeyOrderL(const T& anEntry, TInt& anIndex) const; + inline void FindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex) const; + inline void FindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder anOrder) const; + inline TInt SpecificFindInSignedKeyOrderL(const T& anEntry, TInt aMode) const; + inline TInt SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt aMode) const; + inline TInt SpecificFindInOrderL(const T& anEntry, TLinearOrder anOrder, TInt aMode) const; + inline void SpecificFindInSignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const; + inline void SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const; + inline void SpecificFindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const; + inline void InsertInSignedKeyOrderL(const T& anEntry); + inline void InsertInUnsignedKeyOrderL(const T& anEntry); + inline void InsertInOrderL(const T& anEntry, TLinearOrder anOrder); + inline void InsertInSignedKeyOrderAllowRepeatsL(const T& anEntry); + inline void InsertInUnsignedKeyOrderAllowRepeatsL(const T& anEntry); + inline void InsertInOrderAllowRepeatsL(const T& anEntry, TLinearOrder anOrder); + + inline void GranularCompress(); + inline TInt Reserve(TInt aCount); + inline void ReserveL(TInt aCount); + inline void SortSigned(); + inline void SortUnsigned(); + inline void Sort(TLinearOrder anOrder); + inline TArray Array() const; +#endif + }; + + + + +/** +@publishedAll +@released + +A simple and efficient specialized array of signed integers offering standard +array behaviour. + +Note that derivation from RPointerArrayBase is private. +*/ +TEMPLATE_SPECIALIZATION class RArray : private RPointerArrayBase + { +public: + inline RArray(); + inline explicit RArray(TInt aGranularity); + inline RArray(TInt aMinGrowBy, TInt aFactor); + inline void Close(); + inline TInt Count() const; + inline const TInt& operator[](TInt anIndex) const; + inline TInt& operator[](TInt anIndex); + inline TInt Append(TInt anEntry); + inline TInt Insert(TInt anEntry, TInt aPos); + inline void Remove(TInt anIndex); + inline void Compress(); + inline void Reset(); + inline TInt Find(TInt anEntry) const; + inline TInt FindReverse(TInt anEntry) const; + inline TInt FindInOrder(TInt anEntry) const; + inline TInt FindInOrder(TInt anEntry, TInt& anIndex) const; + inline TInt SpecificFindInOrder(TInt anEntry, TInt aMode) const; + inline TInt SpecificFindInOrder(TInt anEntry, TInt& anIndex, TInt aMode) const; + inline TInt InsertInOrder(TInt anEntry); + inline TInt InsertInOrderAllowRepeats(TInt anEntry); +#ifndef __KERNEL_MODE__ + inline void AppendL(TInt anEntry); + inline void InsertL(TInt anEntry, TInt aPos); + inline TInt FindL(TInt anEntry) const; + inline TInt FindReverseL(TInt anEntry) const; + inline TInt FindInOrderL(TInt anEntry) const; + inline void FindInOrderL(TInt anEntry, TInt& anIndex) const; + inline TInt SpecificFindInOrderL(TInt anEntry, TInt aMode) const; + inline void SpecificFindInOrderL(TInt anEntry, TInt& anIndex, TInt aMode) const; + inline void InsertInOrderL(TInt anEntry); + inline void InsertInOrderAllowRepeatsL(TInt anEntry); + + inline RArray(TInt* aEntries, TInt aCount); + inline void GranularCompress(); + inline TInt Reserve(TInt aCount); + inline void ReserveL(TInt aCount); + inline void Sort(); + inline TArray Array() const; +#endif + }; + + + + +/** +@publishedAll +@released + +Array of unsigned integers. + +The array is a simple and efficient specialized array of unsigned integers +offering standard array behaviour. + +The derivation from RPointerArrayBase is private. +*/ +TEMPLATE_SPECIALIZATION class RArray : private RPointerArrayBase + { +public: + inline RArray(); + inline explicit RArray(TInt aGranularity); + inline RArray(TInt aMinGrowBy, TInt aFactor); + inline void Close(); + inline TInt Count() const; + inline const TUint& operator[](TInt anIndex) const; + inline TUint& operator[](TInt anIndex); + inline TInt Append(TUint anEntry); + inline TInt Insert(TUint anEntry, TInt aPos); + inline void Remove(TInt anIndex); + inline void Compress(); + inline void Reset(); + inline TInt Find(TUint anEntry) const; + inline TInt FindReverse(TUint anEntry) const; + inline TInt FindInOrder(TUint anEntry) const; + inline TInt FindInOrder(TUint anEntry, TInt& anIndex) const; + inline TInt SpecificFindInOrder(TUint anEntry, TInt aMode) const; + inline TInt SpecificFindInOrder(TUint anEntry, TInt& anIndex, TInt aMode) const; + inline TInt InsertInOrder(TUint anEntry); + inline TInt InsertInOrderAllowRepeats(TUint anEntry); +#ifndef __KERNEL_MODE__ + inline void AppendL(TUint anEntry); + inline void InsertL(TUint anEntry, TInt aPos); + inline TInt FindL(TUint anEntry) const; + inline TInt FindReverseL(TUint anEntry) const; + inline TInt FindInOrderL(TUint anEntry) const; + inline void FindInOrderL(TUint anEntry, TInt& anIndex) const; + inline TInt SpecificFindInOrderL(TUint anEntry, TInt aMode) const; + inline void SpecificFindInOrderL(TUint anEntry, TInt& anIndex, TInt aMode) const; + inline void InsertInOrderL(TUint anEntry); + inline void InsertInOrderAllowRepeatsL(TUint anEntry); + + inline RArray(TUint* aEntries, TInt aCount); + inline void GranularCompress(); + inline TInt Reserve(TInt aCount); + inline void ReserveL(TInt aCount); + inline void Sort(); + inline TArray Array() const; +#endif + }; + +#ifndef __LEAVE_EQUALS_THROW__ + +class TTrapHandler; + +/** +@internalComponent +*/ +class TTrap + { +public: +#ifndef __KERNEL_MODE__ + IMPORT_C TInt Trap(TInt& aResult); + IMPORT_C static void UnTrap(); +#endif +public: + enum {EMaxState=0x10}; +public: + TInt iState[EMaxState]; + TTrap* iNext; + TInt* iResult; + TTrapHandler* iHandler; + }; + + + +/** +@publishedAll +@released + +Executes the set of C++ statements _s under a trap harness. + +Use this macro as a C++ statement. + +_r must be a TInt which has already been declared; if any of the +C++ statements _s leaves, then the leave code is returned in _r, +otherwise _r is set to KErrNone. + +_s can consist of multiple C++ statements; in theory, _s can consist +of any legal C++ code but in practice, such statements consist of simple +function calls, e.g. Foo() or an assignment of some value to the result of +a function call, e.g. functionValue=GetFoo(). + +A cleanup stack is constructed for the set of C++ statements _s. +If any function in _s leaves, objects pushed to the cleanup stack are +cleaned-up. In addition, if any of the C++ statements in _s leaves, +then remaining C++ code in _s is not executed and any variables which +are assigned within that remaining code are not defined. + +@param _r An lvalue, convertible to TInt&, which will receive the result of + any User::Leave() executed within _s or, if no leave occurred, + it will be set to KErrNone. The value of _r on entry is not used. + +@param _s C++ statements which will be executed under a trap harness. + +@see TRAPD +*/ +#define TRAP(_r,_s) {TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}} + +/** +@publishedAll +@released + +Executes the set of C++ statements _s under a trap harness. + +Use this macro in the same way as you would TRAP, except that the +variable _r is defined as part of the macro (and is therefore valid for the +rest of the block in which the macro occurs). Often, this saves a line of code. + +@param _r A name, which will be declared as a TInt, and will receive the result + of any User::Leave() executed within _s or, if no leave occurred, it + will be set to KErrNone. After the macro, _r remains in scope until + the end of its enclosing block. + +@param _s C++ statements which will be executed under a trap harness. + +@see TRAP +*/ +#define TRAPD(_r,_s) TInt _r;{TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}} + +/** +@publishedAll +@released + +Executes the set of C++ statements _s under a trap harness. +Any leave code generated is ignored. + +Use this macro as a C++ statement. + +This macro is functionally equivalent to: +@code + TInt x; + TRAP(x,_s) +@endcode +or +@code + TRAPD(x,_s) +@endcode +where the value in 'x' is not used by any subsequent code. + +_s can consist of multiple C++ statements; in theory, _s can consist +of any legal C++ code but in practice, such statements consist of simple +function calls, e.g. Foo() or an assignment of some value to the result of +a function call, e.g. functionValue=GetFoo(). + +A cleanup stack is constructed for the set of C++ statements _s. +If any function in _s leaves, objects pushed to the cleanup stack are +cleaned-up. In addition, if any of the C++ statements in _s leaves, +then remaining C++ code in _s is not executed and any variables which +are assigned within that remaining code are not defined. + +@param _s C++ statements which will be executed under a trap harness. + +@see TRAPD +@see TRAP +*/ +#define TRAP_IGNORE(_s) {TInt _ignore;TTrap __t;if (__t.Trap(_ignore)==0){_s;TTrap::UnTrap();}} + + +#else //__LEAVE_EQUALS_THROW__ + +#ifdef __WINS__ +/** @internalComponent */ +#define __WIN32SEHTRAP TWin32SEHTrap __trap; __trap.Trap(); +/** @internalComponent */ +#define __WIN32SEHUNTRAP __trap.UnTrap(); +IMPORT_C void EmptyFunction(); +#define __CALL_EMPTY_FUNCTION EmptyFunction(); +#else // !__WINS__ +#define __WIN32SEHTRAP +#define __WIN32SEHUNTRAP +#define __CALL_EMPTY_FUNCTION +#endif //__WINS__ + +/** +This macro is used by the TRAP and TRAPD macros and provides a means +of inserting code into uses of these. + +This macro is invoked before any 'trapped' code is called, and it should be +redefined to do whatever task is required. E.g. this code: + +@code + #undef TRAP_INSTRUMENTATION_START + #define TRAP_INSTRUMENTATION_START DoMyLoging(__LINE__) +@endcode + +Will cause all subsequent uses of the TRAP macros to behave in an +equivalent way to: + +@code + DoMyLoging(__LINE__) + TRAP(r,SomeCodeL()); +@endcode + + +@publishedPartner +@released + +@see TRAP +@see TRAPD +*/ +#define TRAP_INSTRUMENTATION_START + + + +/** +This macro is used by the TRAP and TRAPD macros and provides a means +of inserting code into uses of these. + +This macro is invoked if the 'trapped' code did not Leave. +E.g. this code: + +@code + #undef TRAP_INSTRUMENTATION_NOLEAVE + #define TRAP_INSTRUMENTATION_NOLEAVE DoMyLoging(__LINE__) +@endcode + +Will cause all subsequent uses of the TRAP macros to behave in an +equivalent way to: + +@code + TRAP(r,SomeCodeL()); + if(r==KErrNone) DoMyLoging(__LINE__); +@endcode + + +@param aLine The line number in the C++ source file where the TRAP or TRAPD + macro was used. + +@publishedPartner +@released + +@see TRAP +@see TRAPD +*/ +#define TRAP_INSTRUMENTATION_NOLEAVE + + +/** +This macro is used by the TRAP and TRAPD macros and provides a means +of inserting code into uses of these. + +This macro is invoked if the 'trapped' code did Leave. E.g. this code: + +@code + #undef TRAP_INSTRUMENTATION_LEAVE + #define TRAP_INSTRUMENTATION_LEAVE(aResult) DoMyLoging(aResult,__LINE__) +@endcode + +Will cause all subsequent uses of the TRAP macros to behave in an +equivalent way to: + +@code + TRAP(r,SomeCodeL()); + if(r!=KErrNone) DoMyLoging(r,__LINE__); +@endcode + + +@param aResult A reference to the result value used in the TRAP macro. + + +@publishedPartner +@released + +@see TRAP +@see TRAPD +*/ +#define TRAP_INSTRUMENTATION_LEAVE(aResult) + + + +/** +This macro is used by the TRAP and TRAPD macros and provides a means +of inserting code into uses of these. + +This macro is invoked after the 'trapped' code is called, regardless of whether +or not it did Leave. It should be redefined to do whatever task is +required. E.g. this code: + +@code + #undef TRAP_INSTRUMENTATION_END + #define TRAP_INSTRUMENTATION_END DoMyLoging(__LINE__) +@endcode + +Will cause all subsequent uses of the TRAP macros to behave in an +equivalent way to: + +@code + TRAP(r,SomeCodeL()); + DoMyLoging(__LINE__) +@endcode + + +@publishedPartner +@released + +@see TRAP +@see TRAPD +*/ +#define TRAP_INSTRUMENTATION_END + + + +/** +@publishedAll +@released + +Executes the set of C++ statements _s under a trap harness. + +Use this macro as a C++ statement. + +_r must be a TInt which has already been declared; if any of the +C++ statements _s leaves, then the leave code is returned in _r, +otherwise _r is set to KErrNone. + +_s can consist of multiple C++ statements; in theory, _s can consist +of any legal C++ code but in practice, such statements consist of simple +function calls, e.g. Foo() or an assignment of some value to the result of +a function call, e.g. functionValue=GetFoo(). + +A cleanup stack is constructed for the set of C++ statements _s. +If any function in _s leaves, objects pushed to the cleanup stack are +cleaned-up. In addition, if any of the C++ statements in _s leaves, +then remaining C++ code in _s is not executed and any variables which +are assigned within that remaining code are not defined. + +@param _r An lvalue, convertible to TInt&, which will receive the result of + any User::Leave() executed within _s or, if no leave occurred, + it will be set to KErrNone. The value of _r on entry is not used. + +@param _s C++ statements which will be executed under a trap harness. + +@see TRAPD +*/ + +/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a +workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect +trap handler to be invoked when multiple nested TRAP's were present and +User::Leave(..) was called. */ + +#define TRAP(_r, _s) \ + { \ + TInt& __rref = _r; \ + __rref = 0; \ + { TRAP_INSTRUMENTATION_START; } \ + try { \ + __WIN32SEHTRAP \ + TTrapHandler* ____t = User::MarkCleanupStack(); \ + _s; \ + User::UnMarkCleanupStack(____t); \ + { TRAP_INSTRUMENTATION_NOLEAVE; } \ + __WIN32SEHUNTRAP \ + } \ + catch (XLeaveException& l) \ + { \ + __rref = l.GetReason(); \ + { TRAP_INSTRUMENTATION_LEAVE(__rref); } \ + } \ + catch (...) \ + { \ + User::Invariant(); \ + } \ + __CALL_EMPTY_FUNCTION \ + { TRAP_INSTRUMENTATION_END; } \ + } + + +/** +@publishedAll +@released + +Executes the set of C++ statements _s under a trap harness. + +Use this macro in the same way as you would TRAP, except that the +variable _r is defined as part of the macro (and is therefore valid for the +rest of the block in which the macro occurs). Often, this saves a line of code. + +@param _r A name, which will be declared as a TInt, and will receive the result + of any User::Leave() executed within _s or, if no leave occurred, it + will be set to KErrNone. After the macro, _r remains in scope until + the end of its enclosing block. + +@param _s C++ statements which will be executed under a trap harness. + +@see TRAP +*/ + +/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a +workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect +trap handler to be invoked when multiple nested TRAP's were present and +User::Leave(..) was called. */ + + +#define TRAPD(_r, _s) \ + TInt _r; \ + { \ + _r = 0; \ + { TRAP_INSTRUMENTATION_START; } \ + try { \ + __WIN32SEHTRAP \ + TTrapHandler* ____t = User::MarkCleanupStack(); \ + _s; \ + User::UnMarkCleanupStack(____t); \ + { TRAP_INSTRUMENTATION_NOLEAVE; } \ + __WIN32SEHUNTRAP \ + } \ + catch (XLeaveException& l) \ + { \ + _r = l.GetReason(); \ + { TRAP_INSTRUMENTATION_LEAVE(_r); } \ + } \ + catch (...) \ + { \ + User::Invariant(); \ + } \ + __CALL_EMPTY_FUNCTION \ + { TRAP_INSTRUMENTATION_END; } \ + } + +/** +@publishedAll +@released + +Executes the set of C++ statements _s under a trap harness. +Any leave code generated is ignored. + +Use this macro as a C++ statement. + +This macro is functionally equivalent to: +@code + TInt x; + TRAP(x,_s) +@endcode +or +@code + TRAPD(x,_s) +@endcode +where the value in 'x' is not used by any subsequent code. + +Use this macro as a C++ statement. + +_s can consist of multiple C++ statements; in theory, _s can consist +of any legal C++ code but in practice, such statements consist of simple +function calls, e.g. Foo() or an assignment of some value to the result of +a function call, e.g. functionValue=GetFoo(). + +A cleanup stack is constructed for the set of C++ statements _s. +If any function in _s leaves, objects pushed to the cleanup stack are +cleaned-up. In addition, if any of the C++ statements in _s leaves, +then remaining C++ code in _s is not executed and any variables which +are assigned within that remaining code are not defined. + +@param _s C++ statements which will be executed under a trap harness. + +@see TRAPD +@see TRAP +*/ + +/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a +workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect +trap handler to be invoked when multiple nested TRAP's were present and +User::Leave(..) was called. */ + +#define TRAP_IGNORE(_s) \ + { \ + { TRAP_INSTRUMENTATION_START; } \ + try { \ + __WIN32SEHTRAP \ + TTrapHandler* ____t = User::MarkCleanupStack(); \ + _s; \ + User::UnMarkCleanupStack(____t); \ + { TRAP_INSTRUMENTATION_NOLEAVE; } \ + __WIN32SEHUNTRAP \ + } \ + catch (XLeaveException& l) \ + { \ + l.GetReason(); \ + { TRAP_INSTRUMENTATION_LEAVE(l.Reason()); } \ + } \ + catch (...) \ + { \ + User::Invariant(); \ + } \ + __CALL_EMPTY_FUNCTION \ + { TRAP_INSTRUMENTATION_END; } \ + } + + +#endif //__LEAVE_EQUALS_THROW__ + +/* The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target. + * In this case, operator new and operator delete below should not be declared + * to avoid clashing with StdC++ declarations. + */ + +#ifndef __SYMBIAN_STDCPP_SUPPORT__ + +#ifndef __OPERATOR_NEW_DECLARED__ + +/* Some operator new and operator delete overloads may be declared in compiler + * pre-include files. + * + * __OPERATOR_NEW_DECLARED__ is #defined if they are, so that we can avoid + * re-declaring them here. + */ + +#define __OPERATOR_NEW_DECLARED__ + +/** +@publishedAll +@released +*/ +GLREF_C TAny* operator new(TUint aSize) __NO_THROW; + +/** +@publishedAll +@released +*/ +GLREF_C TAny* operator new(TUint aSize,TUint anExtraSize) __NO_THROW; + +/** +@publishedAll +@released +*/ +GLREF_C void operator delete(TAny* aPtr) __NO_THROW; + +#ifndef __PLACEMENT_VEC_NEW_INLINE +/** +@publishedAll +@released +*/ +GLREF_C TAny* operator new[](TUint aSize) __NO_THROW; + +/** +@publishedAll +@released +*/ +GLREF_C void operator delete[](TAny* aPtr) __NO_THROW; +#endif // !__PLACEMENT_VEC_NEW_INLINE + +#endif // !__OPERATOR_NEW_DECLARED__ + +#endif // !__SYMBIAN_STDCPP_SUPPORT__ + +/** +@publishedAll +@released +*/ +inline TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW; + +/** +@publishedAll +@released +*/ +inline void operator delete(TAny* aPtr, TAny* aBase) __NO_THROW; + +#ifndef __PLACEMENT_VEC_NEW_INLINE +/** +@publishedAll +@released +*/ +inline TAny* operator new[](TUint aSize, TAny* aBase) __NO_THROW; + +/** +@publishedAll +@released +*/ +inline void operator delete[](TAny* aPtr, TAny* aBase) __NO_THROW; + +#endif // !__PLACEMENT_VEC_NEW_INLINE + +#if !defined(__BOOL_NO_TRUE_TRAP__) + +/** +@publishedAll +@released +*/ +TBool operator==(TTrue,volatile const TBool); + +/** +@publishedAll +@released +*/ +TBool operator==(volatile const TBool,TTrue); + +/** +@publishedAll +@released +*/ +TBool operator!=(TTrue,volatile const TBool); + +/** +@publishedAll +@released +*/ +TBool operator!=(volatile const TBool,TTrue); +#endif + + + + +/** +@publishedAll +@released + +A Version 2 client/server class that clients use to package +the arguments to be sent to a server. + +The object can package up to 4 arguments together with information about each +argument's type, width and accessibility; it is also possible for +the package to contain zero arguments. In addition to the default constructor, +the class has four templated constructors, allowing an object of this type to +be constructed for 0, 1, 2, 3 or 4 arguments. + +Internally, the arguments are stored in a simple TInt array. +Consecutive arguments in a constructor's parameter list are put into +consecutive slots in the array. The Set() overloaded functions can be used +to set argument values into specific slots within this array. +*/ +class TIpcArgs + { +public: + /** + @internalComponent + + Argument types; some of these may be ORed together to specify + type, accessibility, and width. + */ + enum TArgType + { + EUnspecified = 0, /**< Type not specified.*/ + EHandle = 1, /**< Handle type.*/ + EFlagDes = 4, /**< Descriptor type.*/ + EFlagConst = 2, /**< Read only type.*/ + EFlag16Bit = 1, /**< 16 bit rather than 8 bit.*/ + EDes8 = EFlagDes, /**< 8 bit read/write descriptor.*/ + EDes16 = EFlagDes|EFlag16Bit, /**< 16 bit read/write descriptor.*/ + EDesC8 = EFlagDes|EFlagConst, /**< 8 bit read only descriptor.*/ + EDesC16 = EFlagDes|EFlagConst|EFlag16Bit, /**< 16 bit read only descriptor.*/ + }; + + + /** + @internalComponent + + Bit width of type information. + */ + enum { + KBitsPerType=3 /** Number of bits of type information used for each of the 4 arguments. */ + }; + + + /** + Indicates a Null argument. + */ + enum TNothing { + /** + An enum value that can be used to indicate an empty or + unused argument to a server. For example: + + @code + TIpcArgs args(arg1, TIpcArgs::ENothing, arg2); + @endcode + + This argument will have an undefined value when the server + receives the message. + */ + ENothing + }; +public: + /** + Default constructor. + + An argument package constructed using this constructor has no arguments; + however, arguments can subsequently be set into this argument package object + using the Set() member functions. + */ + inline TIpcArgs() + :iFlags(0) + {} + + + /** + A templated constructor that constructs the argument package; it takes + 1 argument. + + @param a0 An argument of general class type T0 to be contained by + this object. + */ + template + inline explicit TIpcArgs(T0 a0) + { + Assign(iArgs[0],a0); + iFlags=(Type(a0)<<(0*KBitsPerType)); + } + + + /** + A templated constructor that constructs the argument package; it takes + 2 arguments. + + @param a0 An argument of general class type T0 to be contained by + this object. + @param a1 An argument of general class type T1 to be contained by + this object. + */ + template + inline TIpcArgs(T0 a0,T1 a1) + { + Assign(iArgs[0],a0); + Assign(iArgs[1],a1); + iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType)); + } + + + /** + A templated constructor that constructs the argument package; it takes + 3 arguments. + + @param a0 An argument of general class type T0 to be contained by + this object. + @param a1 An argument of general class type T1 to be contained by + this object. + @param a2 An argument of general class type T2 to be contained by + this object. + */ + template + inline TIpcArgs(T0 a0,T1 a1,T2 a2) + { + Assign(iArgs[0],a0); + Assign(iArgs[1],a1); + Assign(iArgs[2],a2); + iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType))|(Type(a2)<<(2*KBitsPerType)); + } + + + /** + A templated constructor that constructs the argument package; it takes + 4 arguments. + + @param a0 An argument of general class type T0 to be contained by + this object. + @param a1 An argument of general class type T1 to be contained by + this object. + @param a2 An argument of general class type T2 to be contained by + this object. + @param a3 An argument of general class type T3 to be contained by + this object. + */ + template + inline TIpcArgs(T0 a0,T1 a1,T2 a2,T3 a3) + { + Assign(iArgs[0],a0); + Assign(iArgs[1],a1); + Assign(iArgs[2],a2); + Assign(iArgs[3],a3); + iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType))|(Type(a2)<<(2*KBitsPerType))|(Type(a3)<<(3*KBitsPerType)); + } + // + inline void Set(TInt aIndex,TNothing); + inline void Set(TInt aIndex,TInt aValue); + inline void Set(TInt aIndex,const TAny* aValue); + inline void Set(TInt aIndex,RHandleBase aValue); + inline void Set(TInt aIndex,const TDesC8* aValue); +#ifndef __KERNEL_MODE__ + inline void Set(TInt aIndex,const TDesC16* aValue); +#endif + inline void Set(TInt aIndex,TDes8* aValue); +#ifndef __KERNEL_MODE__ + inline void Set(TInt aIndex,TDes16* aValue); +#endif +private: + inline static TArgType Type(TNothing); + inline static TArgType Type(TInt); + inline static TArgType Type(const TAny*); + inline static TArgType Type(RHandleBase aValue); + inline static TArgType Type(const TDesC8*); +#ifndef __KERNEL_MODE__ + inline static TArgType Type(const TDesC16*); +#endif + inline static TArgType Type(TDes8*); +#ifndef __KERNEL_MODE__ + inline static TArgType Type(TDes16*); +#endif + // + inline static void Assign(TInt&,TNothing); + inline static void Assign(TInt& aArg,TInt aValue); + inline static void Assign(TInt& aArg,const TAny* aValue); + inline static void Assign(TInt& aArg,RHandleBase aValue); + inline static void Assign(TInt& aArg,const TDesC8* aValue); +#ifndef __KERNEL_MODE__ + inline static void Assign(TInt& aArg,const TDesC16* aValue); +#endif + inline static void Assign(TInt& aArg,TDes8* aValue); +#ifndef __KERNEL_MODE__ + inline static void Assign(TInt& aArg,TDes16* aValue); +#endif +public: + + /** + The location where the message arguments are stored. + + There is no reason to access this data member directly and it should be + considered as internal. + */ + TInt iArgs[KMaxMessageArguments]; + + /** + The location where the flag bits describing the argument types are stored. + + The symbolic values describing the argument types are internal to Symbian, + and there is therefore no reason to access this data member directly. + It should be considered as internal. + */ + TInt iFlags; + }; + +// Structures for passing 64 bit integers and doubles across GCC/EABI boundaries + +/** +@internalComponent +*/ +struct SInt64 + { +public: + inline SInt64(); + inline SInt64(Int64 a); + inline SInt64& operator=(Int64 a); + inline operator Int64() const; +public: + TUint32 iData[2]; // little endian + }; + +/** +@internalComponent +*/ +struct SUint64 + { +public: + inline SUint64(); + inline SUint64(Uint64 a); + inline SUint64& operator=(Uint64 a); + inline operator Uint64() const; +public: + TUint32 iData[2]; // little endian + }; + +/** +@internalComponent +*/ +struct SDouble + { +public: + inline SDouble(); + inline SDouble(TReal a); + inline SDouble& operator=(TReal a); + inline operator TReal() const; +public: + TUint32 iData[2]; // always little endian + }; + +/** +@publishedAll +@released + +Stores information about a thread's stack. + +Note, on the emulator, the memory between iLimit and the thread's current stack pointer +may not actually be committed. + +@see RThread::StackInfo() +*/ +class TThreadStackInfo + { +public: + /** + The address which the stack pointer would contain if the stack were empty. + */ + TLinAddr iBase; + + /** + The address which the stack pointer would contain if the stack were full, + (The lowest valid address). + */ + TLinAddr iLimit; + + /** + The limit value for the stack if it were expanded to its maximum size. + + Currently expanding stacks is not supported so iExpandLimit==iLimit + */ + TLinAddr iExpandLimit; + }; + + + + +#ifdef __SUPPORT_CPP_EXCEPTIONS__ +/** +@internalComponent +@released + +The class used to implement User::Leave in term of throw and TRAP in terms of catch. + +*/ +class XLeaveException + { +public: + inline XLeaveException() {} + inline XLeaveException(TInt aReason) {iR = aReason;} + inline TInt Reason() const {return iR;} + IMPORT_C TInt GetReason() const; +private: +#if __ARMCC_VERSION >= 220000 || (defined(__TOOLS2__) && defined(__linux__)) + // From rvct 2.2 onwards we want the class impedimenta to be shared, so create a key function. + // Unfortunately we can't make this the key function the dtor since this would make it impossible for existing 2.1 + // derived binaries to be 'BC' with 2.2 binaries (in the general case (which I wont attempt to describe coz its + // too complex) so its best to be safe). As a clue: if 2.1 is used to compile with a key function its not possible + // for catch handlers to work :-( (see the old code). + virtual void ForceKeyFunction(); +#endif +private: +#if __ARMCC_VERSION < 220000 + TAny* iVtable; // reserve space for vtable +#endif + TInt iR; + }; + +// The standard header file defines the following guard macro for EDG and CW, VC++, GCC respectively. +// The guard below is ugly. It will surely come back and bite us unless we resolve the whole issue of standard headers +// when we move to supporting Standard C++. + +// The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target. +// In this case, we wish to avoid declaring uncaught_exception below since it clashes with the StdC++ specification + +#if !defined(_EXCEPTION) && !defined(_EXCEPTION_) && !defined(__EXCEPTION__) && !defined(__SYMBIAN_STDCPP_SUPPORT__) +// Declare standard C++ functions relating to exceptions here +namespace std { +#if defined(__VC32__) || defined(__CW32__) + bool uncaught_exception(); +#else + IMPORT_C bool uncaught_exception(); +#endif + void terminate(void); + void unexpected(void); + typedef void (*terminate_handler)(); + terminate_handler set_terminate(terminate_handler h) throw(); + typedef void (*unexpected_handler)(); + unexpected_handler set_unexpected(unexpected_handler h) throw(); +} + +#endif +#endif //__SUPPORT_CPP_EXCEPTIONS__ + +#ifdef __WINS__ + +#ifndef __WIN32_SEH_TYPES_KNOWN__ +class __UnknownWindowsType1; +class __UnknownWindowsType2; +#endif + +class TWin32SEHTrap; + +/** + * Typedef for the SEH handler function + * @internalComponent + */ +typedef TUint32 (TWin32SEHExceptionHandler)(__UnknownWindowsType1* aExceptionRecord, TWin32SEHTrap* aRegistrationRecord, __UnknownWindowsType2* aContext); + +/** + * @internalComponent + */ +class TWin32SEHTrap + { +private: + // Prevent copy/assign + TWin32SEHTrap(TWin32SEHTrap const &); + TWin32SEHTrap& operator=(TWin32SEHTrap const &); + +#ifdef __KERNEL_MODE__ +// +// Kernel-side functions for nkern exception handler +// +public: + /** Find final exception handler in SEH chain */ + static TWin32SEHTrap* IterateForFinal(); + + /** Access exception handler */ + TWin32SEHExceptionHandler* ExceptionHandler(); + +private: + +#else // !__KERNEL_MODE__ +// +// User-side functions for use in TRAP(...) +// +public: + UIMPORT_C TWin32SEHTrap(); + +public: + /** Add object to SEH chain */ + UIMPORT_C void Trap(); + + /** Remove object from SEH chain */ + UIMPORT_C void UnTrap(); + +#ifndef __IN_SEH_CPP__ +private: +#endif + /** Handle Win32 exceptions */ + static TUint32 ExceptionHandler(__UnknownWindowsType1* aException, TWin32SEHTrap* aRegistrationRecord, __UnknownWindowsType2* aContext); + +#endif //__KERNEL_MODE__ + + // + // NB: This is really an _EXCEPTION_REGISTRATION_RECORD + // + TWin32SEHTrap* iPrevExceptionRegistrationRecord; /** Link to previous SEH record */ + TWin32SEHExceptionHandler* iExceptionHandler; /** SEH handler function */ + +private: + TUint32 iPadding[254]; // discourage the compiler from putting this in reused function parameter space + }; + +#else // !__WINS__ + +#ifdef __X86__ +/** + * @internalComponent + */ +class TWin32SEHTrap + { +public: + UIMPORT_C TWin32SEHTrap(); + UIMPORT_C void Trap(); + UIMPORT_C void UnTrap(); + }; +#endif //__X86__ +#endif //__WINS__ + +/** +@internalTechnology + */ +struct TEmulatorImageHeader + { + TUid iUids[KMaxCheckedUid]; + TProcessPriority iPriority; + SSecurityInfo iS; + TUint32 iSpare1; + TUint32 iSpare2; + TUint32 iModuleVersion; + TUint32 iFlags; + }; + +// forward declaration of shareable data buffers pool infomation +class TShPoolInfo; + +#include + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif //__E32CMN_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32cmn.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32cmn.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,7268 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32cmn.inl +// +// + +#ifndef __PLACEMENT_NEW_INLINE +#define __PLACEMENT_NEW_INLINE +// Global placement operator new +inline TAny* operator new(TUint /*aSize*/, TAny* aBase) __NO_THROW + {return aBase;} + +// Global placement operator delete +inline void operator delete(TAny* /*aPtr*/, TAny* /*aBase*/) __NO_THROW + {} +#endif //__PLACEMENT_NEW_INLINE + +#ifndef __PLACEMENT_VEC_NEW_INLINE +#define __PLACEMENT_VEC_NEW_INLINE +// Global placement operator new[] +inline TAny* operator new[](TUint /*aSize*/, TAny* aBase) __NO_THROW + {return aBase;} + +// Global placement operator delete[] +inline void operator delete[](TAny* /*aPtr*/, TAny* /*aBase*/) __NO_THROW + {} +#endif //__PLACEMENT_VEC_NEW_INLINE + + +// class RAllocator +inline RAllocator::RAllocator() + { + iAccessCount=1; + iHandleCount=0; + iHandles=0; + iFlags=0; + iCellCount=0; + iTotalAllocSize=0; + } +inline void RAllocator::__DbgMarkCheck(TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum) + {__DbgMarkCheck(aCountAll, aCount, TPtrC8(aFileName), aLineNum);} + +// Class RHeap +inline RHeap::RHeap() + {} + +/** +@return The maximum length to which the heap can grow. + +@publishedAll +@released +*/ +inline TInt RHeap::MaxLength() const + {return iMaxLength;} + +inline void RHeap::operator delete(TAny*, TAny*) +/** +Called if constructor issued by operator new(TUint aSize, TAny* aBase) throws exception. +This is dummy as corresponding new operator does not allocate memory. +*/ + {} + + +inline TUint8* RHeap::Base() const +/** +Gets a pointer to the start of the heap. + +Note that because of the small space overhead incurred by all allocated cells, +no cell will have the same address as that returned by this function. + +@return A pointer to the base of the heap. +*/ + {return iBase;} + + + + +inline TInt RHeap::Size() const +/** +Gets the current size of the heap. + +This is the total number of bytes committed by the host chunk. +It is the requested size rounded up by page size minus the size of RHeap object(116 bytes) +minus the cell alignment overhead as shown: + +Size = (Rounded committed size - Size of RHeap - Cell Alignment Overhead). + +The cell alignment overhead varies between release builds and debug builds. + +Note that this value is always greater than the total space available across all allocated cells. + +@return The size of the heap. + +@see Rheap::Available( ) +*/ + {return iTop-iBase;} + + + + +inline TInt RHeap::Align(TInt a) const +/** +@internalComponent +*/ + {return _ALIGN_UP(a, iAlign);} + + + + +inline const TAny* RHeap::Align(const TAny* a) const +/** +@internalComponent +*/ + {return (const TAny*)_ALIGN_UP((TLinAddr)a, iAlign);} + + + + +inline TBool RHeap::IsLastCell(const SCell* aCell) const +/** +@internalComponent +*/ + {return (((TUint8*)aCell) + aCell->len) == iTop;} + + + + +#ifndef __KERNEL_MODE__ +inline void RHeap::Lock() const +/** +@internalComponent +*/ + {((RFastLock&)iLock).Wait();} + + + + +inline void RHeap::Unlock() const +/** +@internalComponent +*/ + {((RFastLock&)iLock).Signal();} + + +inline TInt RHeap::ChunkHandle() const +/** +@internalComponent +*/ + { + return iChunkHandle; + } +#endif + + + + +// Class TRefByValue +template +inline TRefByValue::TRefByValue(T &aRef) + : iRef(aRef) +/** +Constructs this value reference for the specified referenced object. + +@param aRef The referenced object. +*/ + {} + + + + +template +inline TRefByValue::operator T &() +/** +Gets a reference to the object encapsulated inside this value reference. +*/ + {return(iRef);} + + + + +/** +Creates the logical channel. + +@param aDevice The name of the logical device for which the channel + is to be constructed. This is the name by which + the LDD factory object, i.e. the instance of + the DLogicalDevice derived class, is known. +@param aVer The required version of the logical device. The driver + normally checks this against the version of the logical + channel, returning KErrNotSupported if the logical channel + is not compatible. +@param aUnit A unit of the device. This argument only has meaning if + the flag KDeviceAllowUnit is set in the iParseMask data + member of the LDD factory object. +@param aDriver A pointer to a descriptor containing the name of + a physical device. This is the name by which the PDD + factory object, i.e. the instance of the DPhysicalDevice + derived class, is known. + This is NULL, if no explicit name is to be supplied, or + the logical device does not require an accompanying physical + device. +@param aInfo A pointer to an explicit 8-bit descriptor containing extra + information for the physical device. This argument only has + meaning if the KDeviceAllowInfo flag is set in the iParseMask + data member of the LDD factory object. +@param aType An enumeration whose enumerators define the ownership of + this handle. If not explicitly specified, EOwnerProcess is + taken as default. +@param aTransferable If false, the channel is created as an object which is + local/private to the current process. + If true, the channel is an object which may be shared with + other processes using the IPC mechanisms for handle passing. + +@return KErrNone, if successful; otherwise one of the other system wide + error codes. +*/ +inline TInt RBusLogicalChannel::DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* aInfo, TOwnerType aType, TBool aTransferable) + { return DoCreate(aDevice, aVer, aUnit, aDriver, aInfo, (TInt)aType | (aTransferable?KCreateProtectedObject:0) ); } + + + + +// Class TChar +inline TChar::TChar() +/** +Default constructor. + +Constructs this character object with an undefined value. +*/ + {} + + + + +inline TChar::TChar(TUint aChar) + : iChar(aChar) +/** +Constructs this character object and initialises it with the specified value. + +@param aChar The initialisation value. +*/ + {} + + + + +inline TChar& TChar::operator-=(TUint aChar) +/** +Subtracts an unsigned integer value from this character object. + +This character object is changed by the operation. + +@param aChar The value to be subtracted. + +@return A reference to this character object. +*/ + {iChar-=aChar;return(*this);} + + + + +inline TChar& TChar::operator+=(TUint aChar) +/** +Adds an unsigned integer value to this character object. + +This character object is changed by the operation. + +@param aChar The value to be added. + +@return A reference to this character object. +*/ + {iChar+=aChar;return(*this);} + + + + +inline TChar TChar::operator-(TUint aChar) +/** +Gets the result of subtracting an unsigned integer value from this character +object. + +This character object is not changed. + +@param aChar The value to be subtracted. + +@return A character object whose value is the result of the subtraction + operation. +*/ + {return(iChar-aChar);} + + + + +inline TChar TChar::operator+(TUint aChar) +/** +Gets the result of adding an unsigned integer value to this character object. + +This character object is not changed. + +@param aChar The value to be added. + +@return A character object whose value is the result of the addition operation. +*/ + {return(iChar+aChar);} + + + + +inline TChar::operator TUint() const +/** +Gets the value of the character as an unsigned integer. + +The operator casts a TChar to a TUint, returning the TUint value wrapped by +this character object. +*/ + {return(iChar);} + + + + +// Class TDesC8 +inline TBool TDesC8::operator<(const TDesC8 &aDes) const +/** +Determines whether this descriptor's data is less than the specified +descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 8-bit non-modifable descriptor whose data is to be compared + with this descriptor's data. + +@return True if greater than or equal, false otherwise. + +@see TDesC8::Compare +*/ + {return(Compare(aDes)<0);} + + + + +inline TBool TDesC8::operator<=(const TDesC8 &aDes) const +/** +Determines whether this descriptor's data is less than or equal to the +specified descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 8-bit non-modifable descriptor whose data is to be compared + with this descriptor's data. + +@return True if less than or equal, false otherwise. + +@see TDesC8::Compare +*/ + {return(Compare(aDes)<=0);} + + + + +inline TBool TDesC8::operator>(const TDesC8 &aDes) const +/** +Determines whether this descriptor's data is greater than the specified +descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 8-bit non-modifable descriptor whose data is to be compared + with this descriptor's data. + +@return True if greater than, false otherwise. + +@see TDesC8::Compare +*/ + {return(Compare(aDes)>0);} + + + + +inline TBool TDesC8::operator>=(const TDesC8 &aDes) const +/** +Determines whether this descriptor's data is greater than or equal to the +specified descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 8-bit non-modifable descriptor whose data is to be compared + with this descriptor's data. + +@return True if greater than, false otherwise. + +@see TDesC8::Compare +*/ + {return(Compare(aDes)>=0);} + + + + +inline TBool TDesC8::operator==(const TDesC8 &aDes) const +/** +Determines whether this descriptor's data is equal to the specified +descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 8-bit non-modifable descriptor whose data is to be compared + with this descriptor's data. + +@return True if equal, false otherwise. + +@see TDesC8::Compare +*/ + {return(Compare(aDes)==0);} + + + + +inline TBool TDesC8::operator!=(const TDesC8 &aDes) const +/** +Determines whether this descriptor's data is not equal to the specified +descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 8-bit non-modifable descriptor whose data is to be compared + with this descriptor's data. + +@return True if not equal, false otherwise. + +@see TDesC8::Compare +*/ + {return(Compare(aDes)!=0);} + + + + +inline const TUint8 &TDesC8::operator[](TInt anIndex) const +/** +Gets a reference to a single data item within this descriptor's data. + +@param anIndex The position of the individual data item within the descriptor's + data. This is an offset value; a zero value refers to the + leftmost data position. + +@return A reference to the data item. + +@panic USER 21, if anIndex is negative or greater than or equal to the current + length of the descriptor. +*/ + {return(AtC(anIndex));} + + + + +inline TInt TDesC8::Length() const +/** +Gets the length of the data. + +This is the number of 8-bit values or data items represented by the descriptor. + +@return The length of the data represented by the descriptor. +*/ + {return(iLength&KMaskDesLength8);} + + + + +inline TInt TDesC8::Size() const +/** +Gets the size of the data. + +This is the number of bytes occupied by the data represented by the descriptor. + +@return The size of the data represented by the descriptor. +*/ + {return(Length());} + + + + +inline void TDesC8::DoSetLength(TInt aLength) + {iLength=(iLength&(~KMaskDesLength8))|aLength;} + + + + +// Class TPtrC8 +inline void TPtrC8::Set(const TUint8 *aBuf,TInt aLength) +/** +Sets the 8-bit non-modifiable pointer descriptor to point to the specified +location in memory, whether in RAM or ROM. + +The length of the descriptor is set to the specified length. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aLength The length of the descriptor. This value must be non-negative. + +@panic USER 29, if aLength is negative. +*/ + {new(this) TPtrC8(aBuf,aLength);} + + + + +inline void TPtrC8::Set(const TDesC8 &aDes) +/** +Sets the 8-bit non-modifiable pointer descriptor from the specified descriptor. + +It is set to point to the same data and is given the same length. + +@param aDes A reference to an 8-bit non-modifiable descriptor. +*/ + {new(this) TPtrC8(aDes);} + + + + +inline void TPtrC8::Set(const TPtrC8& aPtr) +/** +Sets the 8-bit non-modifiable pointer descriptor from the specified +non-modifiable pointer descriptor. + +It is set to point to the same data and is given the same length. + +@param aPtr A reference to an 8-bit non-modifiable pointer descriptor. +*/ + {new(this) TPtrC8(aPtr);} + + + + + +// class TBufCBase8 +inline TPtr8 TBufCBase8::DoDes(TInt aMaxLength) + {return TPtr8(*this,aMaxLength);} + + + + +// Template class TBufC8 +template +inline TBufC8::TBufC8() + : TBufCBase8() +/** +Constructs an empty 8-bit non-modifiable buffer descriptor. + +It contains no data. + +The integer template parameter determines the size of the data area which +is created as part of the buffer descriptor object. + +Data can, subsequently, be assigned into this buffer descriptor using the +assignment operators. + +@see TBufC8::operator= +*/ + {} + + + + +template +inline TBufC8::TBufC8(const TUint8 *aString) + : TBufCBase8(aString,S) +/** +Constructs the 8-bit non-modifiable buffer descriptor from a zero terminated +string. + +The integer template parameter determines the size of the data area which +is created as part of this object. + +The string, excluding the zero terminator, is copied into this buffer descriptor's +data area. The length of this buffer descriptor is set to the length of the +string, excluding the zero terminator. + +@param aString A pointer to a zero terminated string. + +@panic USER 20, if the length of the string, excluding the zero terminator, is + greater than the value of the integer template parameter. +*/ + {} + + + + +template +inline TBufC8::TBufC8(const TDesC8 &aDes) + : TBufCBase8(aDes,S) +/** +Constructs the 8-bit non-modifiable buffer descriptor from any +existing descriptor. + +The integer template parameter determines the size of the data area which +is created as part of this object. + +Data is copied from the source descriptor into this buffer descriptor and +the length of this buffer descriptor is set to the length of the +source descriptor. + +@param aDes The source 8-bit non-modifiable descriptor. + +@panic USER 20, if the length of the source descriptor is + greater than the value of the integer template parameter. +*/ + {} + + + + +template +inline TBufC8 &TBufC8::operator=(const TUint8 *aString) +/** +Copies data into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this descriptor. + +@panic USER 23, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString,S);return(*this);} + + + + +template +inline TBufC8 &TBufC8::operator=(const TDesC8 &aDes) +/** +Copies data into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8-bit non-modifiable descriptor. + +@return A reference to this descriptor. + +@panic USER 23, if the length of the descriptor aDes is + greater than the maximum length of this (target) descriptor. +*/ + {Copy(aDes,S);return(*this);} + + + + +template +inline TPtr8 TBufC8::Des() +/** +Creates and returns an 8-bit modifiable pointer descriptor for the data +represented by this 8-bit non-modifiable buffer descriptor. + +The content of a non-modifiable buffer descriptor normally cannot be altered, +other than by complete replacement of the data. Creating a modifiable pointer +descriptor provides a way of changing the data. + +The modifiable pointer descriptor is set to point to this non-modifiable buffer +descriptor's data. + +The length of the modifiable pointer descriptor is set to the length of this +non-modifiable buffer descriptor. + +The maximum length of the modifiable pointer descriptor is set to the value +of the integer template parameter. + +When data is modified through this new pointer descriptor, the lengths of +both it and this constant buffer descriptor are changed. + +@return An 8-bit modifiable pointer descriptor representing the data in this + 8-bit non-modifiable buffer descriptor. +*/ + {return DoDes(S);} + + + + +#ifndef __KERNEL_MODE__ +// Class HBufC8 +inline HBufC8 &HBufC8::operator=(const HBufC8 &aLcb) +/** +Copies data into this 8-bit heap descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +Note that the maximum length of this (target) descriptor is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length specified when this descriptor was created or +last re-allocated. + +@param aLcb The source 8-bit heap descriptor. + +@return A reference to this 8-bit heap descriptor. + +@panic USER 23, if the length of the descriptor aLcb is greater than the + maximum length of this (target) descriptor +*/ + {return *this=static_cast(aLcb);} + + + + +// Class RBuf8 +inline RBuf8& RBuf8::operator=(const TUint8* aString) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString);return(*this);} + + + + +inline RBuf8& RBuf8::operator=(const TDesC8& aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8-bit non-modifiable descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline RBuf8& RBuf8::operator=(const RBuf8& aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 8-bit buffer descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +/** +Creates an 8-bit resizable buffer descriptor that has been initialised with +data from the specified read stream; leaves on failure. + +Data is assigned to the new descriptor from the specified stream. +This variant assumes that the stream contains the length of the data followed +by the data itself. + +The function is implemented by calling the HBufC8::NewL(RReadStream&,TInt) +variant and then assigning the resulting heap descriptor using +the RBuf8::Assign(HBufC8*) variant. The comments that describe +the HBufC8::NewL() variant also apply to this RBuf8::CreateL() function. + +The function may leave with one of the system-wide error codes, specifically +KErrOverflow, if the length of the data as read from the stream is greater than +the upper limit as specified by the aMaxLength parameter. + +@param aStream The stream from which the data length and the data to be + assigned to the new descriptor, are taken. +@param aMaxLength The upper limit on the length of data that the descriptor is + to represent. The value of this parameter must be non-negative + otherwise the underlying function will panic. +*/ +inline void RBuf8::CreateL(RReadStream &aStream,TInt aMaxLength) + { + Assign(HBufC8::NewL(aStream,aMaxLength)); + } +#endif + + + + +// Class TDes8 +inline TDes8 &TDes8::operator=(const TUint8 *aString) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this, the target descriptor. + +@panic USER 23, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString);return(*this);} + + + + +inline TDes8 &TDes8::operator=(const TDesC8 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8-bit non-modifiable descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 23, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline TDes8 &TDes8::operator=(const TDes8 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8-bit modifiable descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 23, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline TDes8 &TDes8::operator+=(const TDesC8 &aDes) +/** +Appends data onto the end of this descriptor's data and returns a reference +to this descriptor. + +The length of this descriptor is incremented to reflect the new content. + +@param aDes An-8 bit non-modifiable descriptor whose data is to be appended. + +@return A reference to this descriptor. + +@panic USER 23, if the resulting length of this descriptor is greater than its + maximum length. +*/ + {Append(aDes);return(*this);} + + + + +inline const TUint8 &TDes8::operator[](TInt anIndex) const +/** +Gets a const reference to a single data item within this descriptor's data. + +@param anIndex The position of the data item within this descriptor's data. + This is an offset value; a zero value refers to the leftmost + data position. + +@return A const reference to the data item at the specified position. + +@panic USER 21, if anIndex is negative or is greater than or equal to the + current length of this descriptor. +*/ + {return(AtC(anIndex));} + + + + +inline TUint8 &TDes8::operator[](TInt anIndex) +/** +Gets a non-const reference to a single data item within this descriptor's +data. + +@param anIndex The position of the data item within this descriptor's data. + This is an offset value; a zero value refers to the leftmost + data position. + +@return A non-const reference to the data item at the specified position. + +@panic USER 21, if anIndex is negative or is greater than or equal to the + current length of this descriptor. +*/ + {return((TUint8 &)AtC(anIndex));} + + + + +inline TInt TDes8::MaxLength() const +/** +Gets the maximum length of the descriptor. + +This is the upper limit for the number of 8-bit values or data items that +the descriptor can represent. + +@return The maximum length of data that the descriptor can represent. +*/ + {return(iMaxLength);} + + + + +inline TInt TDes8::MaxSize() const +/** +Gets the maximum size of the descriptor. + +This is the upper limit for the number of bytes which the data represented by +the descriptor can occupy. + +@return The maximum size of the descriptor data. +*/ + {return(iMaxLength);} + + + + +inline TUint8 * TDes8::WPtr() const + {return((TUint8 *)Ptr());} + + + + +// Class TPtr8 +inline TPtr8 &TPtr8::operator=(const TUint8 *aString) +/** +Copies data into this 8-bit modifiable pointer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this 8-bit modifiable pointer descriptor. + +@panic USER 23, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this descriptor. +*/ + {Copy(aString);return(*this);} + + + + +inline TPtr8 &TPtr8::operator=(const TDesC8 &aDes) +/** +Copies data into this 8-bit modifiable pointer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8-bit modifiable pointer descriptor whose data is to be copied + into this descriptor. + +@return A reference to this 8-bit modifiable pointer descriptor. + +@panic USER 23, if the length of aDes is greater than the maximum + length of this descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline TPtr8 &TPtr8::operator=(const TPtr8 &aDes) +/** +Copies data into this 8-bit modifiable pointer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8-bit modifiable pointer descriptor whose data is to be copied + into this descriptor. + +@return A reference to this 8-bit modifiable pointer descriptor. + +@panic USER 23, if the length of aDes is greater than the maximum + length of this descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline void TPtr8::Set(TUint8 *aBuf,TInt aLength,TInt aMaxLength) +/** +Sets the 8-bit modifiable pointer descriptor to point to the specified location +in memory, whether in RAM or ROM. + +The length of the descriptor and its maximum length are set to the specified +values. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aLength The length of the descriptor. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 20, if aLength is negative or is greater than the maximum length of + this descriptor. +@panic USER 30, if aMaxLength is negative. +*/ + {new(this) TPtr8(aBuf,aLength,aMaxLength);} + + + + +inline void TPtr8::Set(const TPtr8 &aPtr) +/** +Sets the 8-bit modifiable pointer descriptor from an existing 8-bit modifiable +pointer descriptor. + +It is set to point to the same data, is given the same length and the same +maximum length as the source pointer descriptor. + +@param aPtr The source 8-bit modifiable pointer descriptor. +*/ + {new(this) TPtr8(aPtr);} + + + + +// Template class TBuf8 +template +inline TBuf8::TBuf8() + : TBufBase8(S) +/** +Constructs an empty 8-bit modifiable buffer descriptor. + +It contains no data. + +The integer template parameter determines the size of the data area that is created +as part of the object, and defines the descriptor's maximum length. +*/ + {} + + + + +template +inline TBuf8::TBuf8(TInt aLength) + : TBufBase8(aLength,S) +/** +Constructs an empty 8-bit modifiable buffer descriptor and sets the its length +to the specified value. + +No data is assigned to the descriptor. + +The integer template parameter determines the size of the data area that is created +as part of the object, and defines the descriptor's maximum length. + +@param aLength The length of this modifiable buffer descriptor. + +@panic USER 20, if aLength is negative or is greater than the + value of the integer template parameter. +*/ + {} + + + + +template +inline TBuf8::TBuf8(const TUint8 *aString) + : TBufBase8(aString,S) +/** +Constructs the 8-bit modifiable buffer descriptor from a +zero terminated string. + +The integer template parameter determines the size of the data area that +is created as part of the object, and defines the descriptor's maximum length. + +The string, excluding the zero terminator, is copied into this buffer +descriptor's data area. The length of this buffer descriptor is set to the +length of the string, excluding the zero terminator. + +@param aString A pointer to a zero terminated string. + +@panic USER 23, if the length of the string, excluding the zero terminator, + is greater than the value of the integer template parameter. +*/ + {} + + + + +template +inline TBuf8::TBuf8(const TDesC8 &aDes) + : TBufBase8(aDes,S) +/** +Constructs the 8-bit modifiable buffer descriptor from any existing +8-bit descriptor. + +The integer template parameter determines the size of the data area created +as part of this object and defines the descriptor's maximum length. + +Data is copied from the source descriptor into this modifiable buffer +descriptor and the length of this modifiable buffer descriptor is set to +the length of the source descriptor. + +@param aDes The source 8-bit non-modifiable descriptor. + +@panic USER 23, if the length of the source descriptor is greater than the + value of the integer template parameter. +*/ + {} + + + + +template +inline TBuf8 &TBuf8::operator=(const TUint8 *aString) +/** +Copies data into this 8-bit modifiable buffer descriptor, replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this 8-bit modifiable buffer descriptor. + +@panic USER 23, if the length of the string, excluding the zero terminator, + is greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString);return(*this);} + + + + +template +inline TBuf8 &TBuf8::operator=(const TDesC8 &aDes) +/** +Copies data into this 8-bit modifiable buffer descriptor, replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8 bit non-modifiable descriptor. + +@return A reference to this 8-bit modifiable buffer descriptor. + +@panic USER 23, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +template +inline TBuf8& TBuf8::operator=(const TBuf8& aBuf) +/** +Copies data into this 8-bit modifiable buffer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aBuf The source 8-bit modifiable buffer descriptor with the same + template value. + +@return A reference to this 8-bit modifiable buffer descriptor. +*/ + {Copy(aBuf);return *this;} + + + + +// Template class TAlignedBuf8 +template +inline TAlignedBuf8::TAlignedBuf8() + : TBufBase8(S) +/** +Constructs an empty 8-bit modifiable buffer descriptor. + +It contains no data. + +The integer template parameter determines the size of the data area that is created +as part of the object, and defines the descriptor's maximum length. +*/ + {} + + + + +template +inline TAlignedBuf8::TAlignedBuf8(TInt aLength) + : TBufBase8(aLength,S) +/** +Constructs an empty 8-bit modifiable buffer descriptor and sets the its length +to the specified value. + +No data is assigned to the descriptor. + +The integer template parameter determines the size of the data area that is created +as part of the object, and defines the descriptor's maximum length. + +@param aLength The length of this modifiable buffer descriptor. + +@panic USER 20, if aLength is negative or is greater than the + value of the integer template parameter. +*/ + {} + + + + +template +inline TAlignedBuf8::TAlignedBuf8(const TUint8 *aString) + : TBufBase8(aString,S) +/** +Constructs the 8-bit modifiable buffer descriptor from a +zero terminated string. + +The integer template parameter determines the size of the data area that +is created as part of the object, and defines the descriptor's maximum length. + +The string, excluding the zero terminator, is copied into this buffer +descriptor's data area. The length of this buffer descriptor is set to the +length of the string, excluding the zero terminator. + +@param aString A pointer to a zero terminated string. + +@panic USER 23, if the length of the string, excluding the zero terminator, + is greater than the value of the integer template parameter. +*/ + {} + + + + +template +inline TAlignedBuf8::TAlignedBuf8(const TDesC8 &aDes) + : TBufBase8(aDes,S) +/** +Constructs the 8-bit modifiable buffer descriptor from any existing +8-bit descriptor. + +The integer template parameter determines the size of the data area created +as part of this object and defines the descriptor's maximum length. + +Data is copied from the source descriptor into this modifiable buffer +descriptor and the length of this modifiable buffer descriptor is set to +the length of the source descriptor. + +@param aDes The source 8-bit non-modifiable descriptor. + +@panic USER 23, if the length of the source descriptor is greater than the + value of the integer template parameter. +*/ + {} + + + + +template +inline TAlignedBuf8 &TAlignedBuf8::operator=(const TUint8 *aString) +/** +Copies data into this 8-bit modifiable buffer descriptor, replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this 8-bit modifiable buffer descriptor. + +@panic USER 23, if the length of the string, excluding the zero terminator, + is greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString);return(*this);} + + + + +template +inline TAlignedBuf8 &TAlignedBuf8::operator=(const TDesC8 &aDes) +/** +Copies data into this 8-bit modifiable buffer descriptor, replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes An 8 bit non-modifiable descriptor. + +@return A reference to this 8-bit modifiable buffer descriptor. + +@panic USER 23, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +template +inline TAlignedBuf8& TAlignedBuf8::operator=(const TAlignedBuf8& aBuf) +/** +Copies data into this 8-bit modifiable buffer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aBuf The source 8-bit modifiable buffer descriptor with the same + template value. + +@return A reference to this 8-bit modifiable buffer descriptor. +*/ + {Copy(aBuf);return *this;} + + + + +// Template class TLitC8 +template +inline const TDesC8* TLitC8::operator&() const +/** +Returns a const TDesC8 type pointer. + +@return A descriptor type pointer to this literal. +*/ + {return REINTERPRET_CAST(const TDesC8*,this);} + + + + +template +inline const TDesC8& TLitC8::operator()() const +/** +Returns a const TDesC8 type reference. + +@return A descriptor type reference to this literal +*/ + {return *operator&();} + + + + +template +inline TLitC8::operator const TDesC8&() const +/** +Invoked by the compiler when a TLitC8 type is passed to a function +which is prototyped to take a const TDesC8& type. +*/ + {return *operator&();} + + + +template +inline TLitC8::operator const __TRefDesC8() const +/** +Invoked by the compiler when a TLitC8 type is passed to a function +which is prototyped to take a const TRefByValue type. + +@see __TRefDesC8 +*/ + {return *operator&();} + + + + +#ifndef __KERNEL_MODE__ +// Class TDesC16 +inline TBool TDesC16::operator<(const TDesC16 &aDes) const +/** +Determines whether this descriptor's data is less than the specified descriptor's +data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 16-bit non-modifable descriptor whose data is to be compared + with this descriptor's data. + +@return True if less than, false otherwise. + +@see TDesC16::Compare +*/ + {return(Compare(aDes)<0);} + + + + +inline TBool TDesC16::operator<=(const TDesC16 &aDes) const +/** +Determines whether this descriptor's data is less than or equal +to the specified descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 16-bit non- modifiable descriptor whose data is to be compared + with this descriptor's data. + +@return True if less than or equal, false otherwise. + +@see TDesC16::Compare +*/ + {return(Compare(aDes)<=0);} + + + + +inline TBool TDesC16::operator>(const TDesC16 &aDes) const +/** +Determines whether this descriptor's data is greater than the specified +descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 16-bit non-modifiable descriptor whose data is to be compared + with this descriptor's data. + +@return True if greater than, false otherwise. + +@see TDesC16::Compare +*/ + {return(Compare(aDes)>0);} + + + + +inline TBool TDesC16::operator>=(const TDesC16 &aDes) const +/** +Determines whether this descriptor's data is greater than or equal to the +specified descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 16-bit non-modifiable descriptor whose data is to be compared + with this descriptor's data. + +@return True if greater than or equal, false otherwise. + +@see TDesC16::Compare +*/ + {return(Compare(aDes)>=0);} + + + + +inline TBool TDesC16::operator==(const TDesC16 &aDes) const +/** +Determines whether this descriptor's data is equal to the specified +descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 16-bit non-modifiable descriptor whose data is to be compared + with this descriptor's data. + +@return True if equal, false otherwise. + +@see TDesC16::Compare +*/ + {return(Compare(aDes)==0);} + + + + +inline TBool TDesC16::operator!=(const TDesC16 &aDes) const +/** +Determines whether this descriptor's data is not equal to the specified +descriptor's data. + +The comparison is implemented using the Compare() member function. + +@param aDes The 16-bit non-modifiable descriptor whose data is to be compared + with this descriptor's data. + +@return True if not equal, false otherwise. + +@see TDesC16::Compare +*/ + {return(Compare(aDes)!=0);} + + + + +inline const TUint16 &TDesC16::operator[](TInt anIndex) const +/** +Gets a reference to a single data item within this descriptor's data. + +@param anIndex The position of the individual data item within the descriptor's + data. This is an offset value; a zero value refers to the + leftmost data position. + +@return A reference to the data item. + +@panic USER 9, if anIndex is negative or greater than or equal to the current + length of the descriptor. +*/ + {return(AtC(anIndex));} + + + + +inline TInt TDesC16::Length() const +/** +Gets the length of the data. + +This is the number of 16-bit values or data items represented by the descriptor. + +@return The length of the data represented by the descriptor. +*/ + {return(iLength&KMaskDesLength16);} + + + + +inline TInt TDesC16::Size() const +/** +Gets the size of the data. + +This is the number of bytes occupied by the data represented by the descriptor. + +@return The size of the data represented by the descriptor. This is always + twice the length. + */ + {return(Length()<<1);} + + + + +inline void TDesC16::DoSetLength(TInt aLength) + {iLength=(iLength&(~KMaskDesLength16))|aLength;} + + + + +// Class TPtrC16 +inline void TPtrC16::Set(const TUint16 *aBuf,TInt aLength) +/** +Sets the 16-bit non-modifiable pointer descriptor to point to the specified +location in memory, whether in RAM or ROM. + +The length of the descriptor is set to the specified length. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aLength The length of the descriptor. This value must be non-negative + +@panic USER 17, if aLength is negative. +*/ + {new(this) TPtrC16(aBuf,aLength);} + + + + +inline void TPtrC16::Set(const TDesC16 &aDes) +/** +Sets the 16-bit non-modifiable pointer descriptor from the specified descriptor. + +It is set to point to the same data and is given the same length. + +@param aDes A reference to a 16-bit non-modifiable descriptor +*/ + {new(this) TPtrC16(aDes);} + + + + +inline void TPtrC16::Set(const TPtrC16& aPtr) + {new(this) TPtrC16(aPtr);} + + + + +// class TBufCBase16 +inline TPtr16 TBufCBase16::DoDes(TInt aMaxLength) + {return TPtr16(*this,aMaxLength);} + + + + +// Template class TBufC16 +template +inline TBufC16::TBufC16() + : TBufCBase16() +/** +Constructs an empty 16-bit non-modifiable buffer descriptor. + +It contains no data. + +The integer template parameter determines the size of the data area which +is created as part of the buffer descriptor object. + +Data can, subsequently, be assigned into this buffer descriptor using the +assignment operators. + +@see TBufC16::operator= +*/ + {} + + + + +template +inline TBufC16::TBufC16(const TUint16 *aString) + : TBufCBase16(aString,S) +/** +Constructs the 16-bit non-modifiable buffer descriptor from a zero terminated +string. + +The integer template parameter determines the size of the data area which +is created as part of this object. + +The string, excluding the zero terminator, is copied into this buffer descriptor's +data area. The length of this buffer descriptor is set to the length of the +string, excluding the zero terminator. + +@panic USER 8, if the length of the string, excluding the zero terminator, is + greater than the value of the integer template parameter. + +@param aString A pointer to a zero terminated string. +*/ + {} + + + + +template +inline TBufC16::TBufC16(const TDesC16 &aDes) + : TBufCBase16(aDes,S) +/** +Constructs the 16-bit non-modifiable buffer descriptor from any +existing descriptor. + +The integer template parameter determines the size of the data area which +is created as part of this object. + +Data is copied from the source descriptor into this buffer descriptor and +the length of this buffer descriptor is set to the length of the +source descriptor. + +@param aDes The source 16-bit non-modifiable descriptor. + +@panic USER 8, if the length of the source descriptor is + greater than the value of the integer template parameter. +*/ + {} + + + + +template +inline TBufC16 &TBufC16::operator=(const TUint16 *aString) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this descriptor. + +@panic USER 11, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString,S);return(*this);} + + + + +template +inline TBufC16 &TBufC16::operator=(const TDesC16 &aDes) +/** +Copies data into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit non-modifiable descriptor. + +@panic USER 11, if the length of the descriptor aDes is + greater than the maximum length of this (target) descriptor. + +@return A reference to this descriptor. +*/ + {Copy(aDes,S);return(*this);} + + + + +template +inline TPtr16 TBufC16::Des() +/** +Creates and returns a 16-bit modifiable pointer descriptor for the data +represented by this 16-bit non-modifiable buffer descriptor. + +The content of a non-modifiable buffer descriptor normally cannot be altered, +other than by complete replacement of the data. Creating a modifiable pointer +descriptor provides a way of changing the data. + +The modifiable pointer descriptor is set to point to this non-modifiable buffer +descriptor's data. + +The length of the modifiable pointer descriptor is set to the length of this +non-modifiable buffer descriptor. + +The maximum length of the modifiable pointer descriptor is set to the value +of the integer template parameter. + +When data is modified through this new pointer descriptor, the lengths of +both it and this constant buffer descriptor are changed. + +@return A 16-bit modifiable pointer descriptor representing the data in this + 16-bit non-modifiable buffer descriptor. +*/ + {return(DoDes(S));} + + + + +#ifndef __KERNEL_MODE__ +// Class HBufC16 +inline HBufC16 &HBufC16::operator=(const HBufC16 &aLcb) +/** +Copies data into this 16-bit heap descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +Note that the maximum length of this (target) descriptor is the length +of the descriptor buffer in the allocated host heap cell; this may be greater +than the maximum length specified when this descriptor was created or +last re-allocated. + +@param aLcb The source 16-bit heap descriptor. + +@return A reference to this 16-bit heap descriptor. + +@panic USER 11, if the length of the descriptor aLcb is greater than the + maximum length of this (target) descriptor +*/ + {return *this=static_cast(aLcb);} +#endif + + + + +// Class TDes16 +inline TDes16 &TDes16::operator=(const TUint16 *aString) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString);return(*this);} + + + + +inline TDes16 &TDes16::operator=(const TDesC16 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit non-modifiable descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline TDes16 &TDes16::operator=(const TDes16 &aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit modifiable descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline TDes16 &TDes16::operator+=(const TDesC16 &aDes) +/** +Appends data onto the end of this descriptor's data and returns a reference +to this descriptor. + +The length of this descriptor is incremented to reflect the new content. + +@param aDes A 16-bit non-modifiable descriptor whose data is to be appended. + +@return A reference to this descriptor. + +@panic USER 11, if the resulting length of this descriptor is greater than its + maximum length. +*/ + {Append(aDes);return(*this);} + + + + +inline const TUint16 &TDes16::operator[](TInt anIndex) const +/** +Gets a const reference to a single data item within this descriptor's data. + +@param anIndex The position the data item within this descriptor's data. This +is an offset value; a zero value refers to the leftmost data position. + +@return A const reference to the data item at the specified position. + +@panic USER 9, if anIndex is negative or is greater than or equal to the + current length of this descriptor. +*/ + {return(AtC(anIndex));} + + + + +inline TUint16 &TDes16::operator[](TInt anIndex) +/** +Gets a non-const reference to a single data item within this descriptor's +data. + +@param anIndex The position of the data item within this descriptor's data. + This is an offset value; a zero value refers to the leftmost + data position. + +@return A non-const reference to the data item at the specified position. + +@panic USER 9, if anIndex is negative or is greater than or equal to the + current length of this descriptor. +*/ + {return((TUint16 &)AtC(anIndex));} + + + + +inline TInt TDes16::MaxLength() const +/** +Gets the maximum length of the descriptor. + +This is the upper limit for the number of 16-bit values or data items that +the descriptor can represent. + +@return The maximum length of data that the descriptor can represent. +*/ + {return(iMaxLength);} + + + + +inline TInt TDes16::MaxSize() const +/** +Gets the maximum size of the descriptor. + +This is the upper limit for the number of bytes which the data represented by +the descriptor can occupy. + +@return The maximum size of the descriptor data. +*/ + {return(iMaxLength<<1);} + + + + +inline TUint16 * TDes16::WPtr() const + {return((TUint16 *)Ptr());} + + + + +// Class TPtr16 +inline TPtr16 &TPtr16::operator=(const TUint16 *aString) +/** +Copies data into this 16-bit modifiable pointer descriptor replacing +any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this 16-bit modifiable pointer descriptor. + +@panic USER 11, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this descriptor. +*/ + {Copy(aString);return(*this);} + + + + +inline TPtr16 &TPtr16::operator=(const TDesC16 &aDes) +/** +Copies data into this 16-bit modifiable pointer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit non-modifiable descriptor whose data is to be copied + into this descriptor. + +@return A reference to this 16-bit modifiable pointer descriptor. + +@panic USER 11, if the length of aDes is greater than the maximum + length of this descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline TPtr16 &TPtr16::operator=(const TPtr16 &aDes) +/** +Copies data into this 16-bit modifiable pointer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit modifiable pointer descriptor whose data is to be copied + into this descriptor. + +@return A reference to this 16-bit modifiable pointer descriptor. + +@panic USER 11, if the length of aDes is greater than the maximum + length of this descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline void TPtr16::Set(TUint16 *aBuf,TInt aLength,TInt aMaxLength) +/** +Sets the 16-bit modifiable pointer descriptor to point to the specified location +in memory, whether in RAM or ROM. + +The length of the descriptor and its maximum length are set to the specified +values. + +@param aBuf A pointer to the location that the descriptor is to represent. +@param aLength The length of the descriptor. +@param aMaxLength The maximum length of the descriptor. + +@panic USER 8, if aLength is negative or is greater than the maximum length of + this descriptor. +@panic USER 18, if aMaxLength is negative. +*/ + {new(this) TPtr16(aBuf,aLength,aMaxLength);} + + + + +inline void TPtr16::Set(const TPtr16 &aPtr) +/** +Sets the 16-bit modifiable pointer descriptor from an existing +16-bit modifiable pointer descriptor. + +It is set to point to the same data, is given the same length and the same +maximum length as the source pointer descriptor. + +@param aPtr The source 16-bit modifiable pointer descriptor. +*/ + {new(this) TPtr16(aPtr);} + + + + +// Template class TBuf16 +template +inline TBuf16::TBuf16() + : TBufBase16(S) +/** +Constructs an empty 16-bit modifiable buffer descriptor. + +It contains no data. + +The integer template parameter determines the size of the data area created +as part of the object and defines the descriptor's maximum length. +*/ + {} + + + + +template +inline TBuf16::TBuf16(TInt aLength) + : TBufBase16(aLength,S) +/** +Constructs an empty 16-bit modifiable buffer descriptor and sets the its length +to the specified value. + +No data is assigned to the descriptor. + +The integer template parameter defines the size of the data area created as +part of the object and defines the descriptor's maximum length. + +@param aLength The length of this modifiable buffer descriptor. + +@panic USER 8, if aLength is negative or is greater than the + value of the integer template parameter. +*/ + {} + + + + +template +inline TBuf16::TBuf16(const TUint16 *aString) + : TBufBase16(aString,S) +/** +Constructs the 16-bit modifiable buffer descriptor from +a zero terminated string. + +The integer template parameter determines the size of the data area that is +created as part of this object, and defines the descriptor's maximum length. + +The string, excluding the zero terminator, is copied into this buffer +descriptor's data area. The length of this buffer descriptor is set to the +length of the string, excluding the zero terminator. + +@param aString A pointer to a zero terminated string. + +@panic USER 11, if the length of the string, excluding the zero terminator, + is greater than the value of the integer template parameter. +*/ + {} + + + + +template +inline TBuf16::TBuf16(const TDesC16 &aDes) + : TBufBase16(aDes,S) +/** +Constructs the 16-bit modifiable buffer descriptor from any existing +16-bit descriptor. + +The integer template parameter determines the size of the data area created +as part of this object and defines the descriptor's maximum length. + +Data is copied from the source descriptor into this modifiable buffer descriptor +and the length of this modifiable buffer descriptor is set to the length of +the source descriptor. + +@param aDes The source 16-bit non-modifiable descriptor. + +@panic USER 11, if the length of the source descriptor is greater than the + value of the integer template parameter. +*/ + {} + + + + +template +inline TBuf16 &TBuf16::operator=(const TUint16 *aString) +/** +Copies data into this 16-bit modifiable buffer descriptor, replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this descriptor. + +@panic USER 11, if the length of the string, excluding the zero terminator, + is greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString);return(*this);} + + + + +template +inline TBuf16 &TBuf16::operator=(const TDesC16 &aDes) +/** +Copies data into this 16-bit modifiable descriptor, replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit non-modifiable descriptor. + +@return A reference to this descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +template +inline TBuf16& TBuf16::operator=(const TBuf16& aBuf) +/** +Copies data into this 16-bit modifiable buffer descriptor replacing any +existing data. + +The length of this descriptor is set to reflect the new data. + +@param aBuf The source 16-bit modifiable buffer descriptor with the same + template value. + +@return A reference to this 16-bit modifiable buffer descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aBuf);return *this;} + + +// Class RBuf16 +inline RBuf16& RBuf16::operator=(const TUint16* aString) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the string, excluding the zero terminator, is + greater than the maximum length of this (target) descriptor. +*/ + {Copy(aString);return(*this);} + + + + +inline RBuf16& RBuf16::operator=(const TDesC16& aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit non-modifiable descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +inline RBuf16& RBuf16::operator=(const RBuf16& aDes) +/** +Copies data into this descriptor replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A 16-bit buffer descriptor. + +@return A reference to this, the target descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor. +*/ + {Copy(aDes);return(*this);} + + + + +/** +Creates a 16-bit resizable buffer descriptor that has been initialised with +data from the specified read stream; leaves on failure. + +Data is assigned to the new descriptor from the specified stream. +This variant assumes that the stream contains the length of the data followed +by the data itself. + +The function is implemented by calling the HBufC16::NewL(RReadStream&,TInt) +variant and then assigning the resulting heap descriptor using +the RBuf16::Assign(HBufC16*) variant. The comments that describe +the HBufC16::NewL() variant also apply to this RBuf16::CreateL() function. + +The function may leave with one of the system-wide error codes, specifically +KErrOverflow, if the length of the data as read from the stream is greater than +the upper limit as specified by the aMaxLength parameter. + +@param aStream The stream from which the data length and the data to be + assigned to the new descriptor, are taken. +@param aMaxLength The upper limit on the length of data that the descriptor is + to represent. The value of this parameter must be non-negative + otherwise the underlying function will panic. +*/ +inline void RBuf16::CreateL(RReadStream &aStream,TInt aMaxLength) + { + Assign(HBufC16::NewL(aStream,aMaxLength)); + } + + +// Template class TLitC16 +template +inline const TDesC16* TLitC16::operator&() const +/** +Returns a const TDesC16 type pointer. + +@return A descriptor type pointer to this literal. +*/ + {return REINTERPRET_CAST(const TDesC16*,this);} + + + + +template +inline const TDesC16& TLitC16::operator()() const +/** +Returns a const TDesC16 type reference. + +@return A descriptor type reference to this literal +*/ + {return *operator&();} + + + + +template +inline TLitC16::operator const TDesC16&() const +/** +Invoked by the compiler when a TLitC16 type is passed to a function +which is prototyped to take a const TDesC16& type. +*/ + {return *operator&();} + + + + +template +inline TLitC16::operator const __TRefDesC16() const +/** +Invoked by the compiler when a TLitC16 type is passed to a function +which is prototyped to take a const TRefByValue type. + +@see __TRefDesC16 +*/ + {return *operator&();} +#endif //__KERNEL_MODE__ + + + + +// Template class TBufC +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +template +inline TBufC::TBufC() + : TBufCBase16() +/** +Constructs an empty build independent non-modifiable buffer descriptor. + +It contains no data. + +The integer template parameter determines the size of the data area which +is created as part of the buffer descriptor object. + +Data can, subsequently, be assigned into this buffer descriptor using the +assignment operators. + +@see TBufC::operator= +*/ + {} + + + + +template +inline TBufC::TBufC(const TText *aString) + : TBufCBase16(aString,S) +/** +Constructs a build independent non-modifiable +buffer descriptor from a zero terminated string. + +The integer template parameter determines the size of the data area which +is created as part of this object. + +The string, excluding the zero terminator, is copied into this buffer descriptor's +data area. The length of this buffer descriptor is set to the length of the +string, excluding the zero terminator. + +@param aString A pointer to a zero terminated string. + +@panic USER 8, if the length of the string, excluding the zero terminator, is + greater than the value of the integer template parameter for + the 16-bit build variant. + +@panic USER 20, if the length of the string, excluding the zero terminator, is + greater than the value of the integer template parameter for + the 8-bit build variant. +*/ + {} + + + + +template +inline TBufC::TBufC(const TDesC &aDes) + : TBufCBase16(aDes,S) +/** +Constructs a build-independent non-modifiable buffer descriptor from any +existing build independent descriptor. + +The integer template parameter determines the size of the data area which +is created as part of this object. + +Data is copied from the source descriptor into this buffer descriptor and +the length of this buffer descriptor is set to the length of the source descriptor. + +The length of the source descriptor must not be greater than the value of +the integer template parameter, otherwise the constructor raises a USER 20 +panic for an 8 bit build variant or a USER 8 panic for a 16 bit (Unicode) +build variant. + +@param aDes The source build independent non-modifiable descriptor. + +@panic USER 8, if the length of the source descriptor is + greater than the value of the integer template parameter for + the 16-bit build variant. + +@panic USER 20, if the length of the source descriptor is + greater than the value of the integer template parameter for + the 8-bit build variant. +*/ + {} +#else +template +inline TBufC::TBufC() + : TBufCBase8() + {} +template +inline TBufC::TBufC(const TText *aString) + : TBufCBase8(aString,S) + {} +template +inline TBufC::TBufC(const TDesC &aDes) + : TBufCBase8(aDes,S) + {} +#endif +template +inline TBufC &TBufC::operator=(const TText *aString) +/** +Copies data into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aString A pointer to a zero-terminated string. + +@return A reference to this descriptor. + +@panic USER 11, if the length of the string, excluding the zero terminator, + is greater than the maximum length of this (target) descriptor + for the 16-bit build variant. + +@panic USER 23, if the length of the string, excluding the zero terminator, + is greater than the maximum length of this (target) descriptor + for the 8-bit build variant. +*/ + {Copy(aString,S);return(*this);} + + + + +template +inline TBufC &TBufC::operator=(const TDesC &aDes) +/** +Copies data into this descriptor, replacing any existing data. + +The length of this descriptor is set to reflect the new data. + +@param aDes A build independent non-modifiable descriptor. + +@return A reference to this descriptor. + +@panic USER 11, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor for the 16-bit + build variant. + +@panic USER 23, if the length of the descriptor aDes is greater than the + maximum length of this (target) descriptor for the 8-bit + build variant. +*/ + {Copy(aDes,S);return(*this);} + + + + +template +inline TPtr TBufC::Des() +/** +Creates and returns a build-independent modifiable pointer descriptor for +the data represented by this build-independent non-modifiable buffer +descriptor. + +The content of a non-modifiable buffer descriptor normally cannot be altered, +other than by complete replacement of the data. Creating a modifiable pointer +descriptor provides a way of changing the data. + +The modifiable pointer descriptor is set to point to this non-modifiable buffer +descriptor's data. + +The length of the modifiable pointer descriptor is set to the length of this +non-modifiable buffer descriptor. + +The maximum length of the modifiable pointer descriptor is set to the value +of the integer template parameter. + +When data is modified through this new pointer descriptor, the lengths of +both it and this constant buffer descriptor are changed. + +@return A build independent modifiable pointer descriptor representing the + data in this build independent non-modifiable buffer descriptor. +*/ + {return(DoDes(S));} + + + + +// Template class TBuf +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +template +inline TBuf::TBuf() + : TBufBase16(S) +/** +Creates a build-independent modifiable buffer descriptor which +contains no data. + +The integer template parameter determines the size of the data area that is created +as part of the object, and defines the descriptor's maximum length. +*/ + {} + + + + +template +inline TBuf::TBuf(TInt aLength) + : TBufBase16(aLength,S) +/** +Constructs an empty build independent modifiable buffer descriptor and +sets its length to the specified value. + +No data is assigned to the descriptor. + +The integer template parameter determines the size of the data area created +as part of the object and defines the descriptor's maximum length. + +@param aLength The length of this modifiable buffer descriptor. + +@panic USER 8, if aLength is negative and is greater than the value of the + integer template parameter for a 16-bit build variant. + +@panic USER 20, if aLength is negative and is greater than the value of the + integer template parameter for a 8-bit build variant. +*/ + {} + + + + +template +inline TBuf::TBuf(const TText *aString) + : TBufBase16(aString,S) +/** +Constructs the build-independent modifiable buffer descriptor from +a zero terminated string. + +The integer template parameter determines the size of the data area which +is created as part of this object. + +The string, excluding the zero terminator, is copied into this buffer +descriptor's data area. The length of this buffer descriptor is set to +the length of the string, excluding the zero terminator. + +@param aString A pointer to a zero terminated string. + +@panic USER 11, if the length of the string, excluding the zero terminator, + is greater than the value of the integer template parameter + for a 16-bit build variant. +@panic USER 23, if the length of the string, excluding the zero terminator, + is greater than the value of the integer template parameter + for a 8-bit build variant. +*/ + {} + + + + +template +inline TBuf::TBuf(const TDesC &aDes) + : TBufBase16(aDes,S) +/** +Constructs the build-independent modifiable buffer descriptor from any +existing build-independent descriptor. + +The integer template parameter determines the size of the data area created +as part of this object, and defines the descriptor's maximum length. + +Data is copied from the source descriptor into this modifiable buffer descriptor +and the length of this modifiable buffer descriptor is set to the length of +the source descriptor. + +@param aDes The source build independent non-modifiable descriptor. + +@panic USER 11, if the length of the source descriptor is greater than the + value of the integer template parameter for a 16-bit + build variant. +@panic USER 23, if the length of the source descriptor is greater than the + value of the integer template parameter for an 8-bit + build variant. + +*/ + {} +#else +template +inline TBuf::TBuf() + : TBufBase8(S) + {} +template +inline TBuf::TBuf(TInt aLength) + : TBufBase8(aLength,S) + {} +template +inline TBuf::TBuf(const TText *aString) + : TBufBase8(aString,S) + {} +template +inline TBuf::TBuf(const TDesC &aDes) + : TBufBase8(aDes,S) + {} +#endif +template +inline TBuf &TBuf::operator=(const TText *aString) + {Copy(aString);return(*this);} +template +inline TBuf &TBuf::operator=(const TDesC &aDes) + {Copy(aDes);return(*this);} +template +inline TBuf &TBuf::operator=(const TBuf &aBuf) + {Copy(aBuf);return(*this);} + + + + +// Template class TLitC +template +inline const TDesC* TLitC::operator&() const +/** +Returns a const TDesC type pointer. + +@return A descriptor type pointer to this literal. +*/ + {return REINTERPRET_CAST(const TDesC*,this);} + + + + +template +inline const TDesC& TLitC::operator()() const +/** +Returns a const TDesC type reference. + +@return A descriptor type reference to this literal +*/ + {return *operator&();} + + + + +template +inline TLitC::operator const TDesC&() const +/** +Invoked by the compiler when a TLitC type is passed to a function +which is prototyped to take a const TDesC& type. +*/ + {return *operator&();} + + + + +template +inline TLitC::operator const __TRefDesC() const +/** +Invoked by the compiler when a TLitC type is passed to a function +which is prototyped to take a const TRefByValue type. + +@see __TRefDesC. +*/ + {return *operator&();} + + + + +// Template class TPckgC +template +inline TPckgC::TPckgC(const T &aRef) + : TPtrC8((const TUint8 *)&aRef,sizeof(T)) +/** +Constructs a packaged non-modifiable pointer descriptor to represent +the specified object whose type is defined by the template parameter. + +@param aRef The object to be represented by this packaged non-modifiable + pointer descriptor. +*/ + {} + + + + +template +inline const T &TPckgC::operator()() const +/** +Gets a reference to the object represented by this packaged non-modifiable +pointer descriptor. + +@return The packaged object +*/ + {return(*((const T *)iPtr));} + + + + +// Template class TPckg +template +inline TPckg::TPckg(const T &aRef) + : TPtr8((TUint8 *)&aRef,sizeof(T),sizeof(T)) +/** +Constructs a packaged modifiable pointer descriptor to represent the specified +object whose type is defined by the template parameter. + +@param aRef The object to be represented by this packaged modifiable pointer + descriptor. +*/ + {} + + + + +template +inline T &TPckg::operator()() +/** +Gets a reference to the object represented by this packaged +modifiable pointer descriptor. + +@return The packaged object. +*/ + {return(*((T *)iPtr));} + + + + +// Template class TPckgBuf +template +inline TPckgBuf::TPckgBuf() + : TAlignedBuf8(sizeof(T)) +/** +Constructs a packaged modifiable buffer descriptor for an object whose type +is defined by the template parameter. + +The length of the packaged descriptor is set to the length of the templated +class but no data is assigned into the descriptor. +*/ + {new(&this->iBuf[0]) T;} + + + + +template +inline TPckgBuf::TPckgBuf(const T &aRef) + : TAlignedBuf8(sizeof(T)) +/** +Constructs a packaged modifiable buffer descriptor for an object whose type +is defined by the template parameter and copies the supplied object into the +descriptor. + +The length of the packaged descriptor is set to the length of the templated +class. + +@param aRef The source object to be copied into the packaged modifiable buffer + descriptor. +*/ + {new(&this->iBuf[0]) T(aRef);} + + + + +template +inline TPckgBuf &TPckgBuf::operator=(const TPckgBuf &aRef) +/** +Copies data from the specified packaged modifiable buffer descriptor into this +packaged modifiable buffer descriptor, replacing any existing data. + +@param aRef The source packaged modifiable buffer descriptor. +@return A reference to this packaged modifiable descriptor. +*/ + {this->Copy(aRef);return(*this);} + + + + +template +inline T &TPckgBuf::operator=(const T &aRef) +/** +Copies data from the specified object into this packaged modifiable buffer +descriptor, replacing any existing data. + +@param aRef The source object. +@return A reference to the copy of the source object in the packaged modifiable + buffer descriptor. +*/ + {this->Copy((TUint8 *)&aRef,sizeof(T));return(*((T *)&this->iBuf[0]));} + + + + +template +inline T &TPckgBuf::operator()() +/** +Gets a reference to the object contained by this packaged modifiable +buffer descriptor. + +@return The packaged object. +*/ + {return(*((T *)&this->iBuf[0]));} + + + + +template +inline const T &TPckgBuf::operator()() const +/** +Gets a const reference to the object contained by this packaged modifiable +buffer descriptor. + +@return The (const) packaged object. +*/ + {return(*((T *)&this->iBuf[0]));} + + + + +// Class TRequestStatus +inline TRequestStatus::TRequestStatus() +/** +Default constructor. +*/ +: iFlags(0) + {} + + + + +inline TRequestStatus::TRequestStatus(TInt aVal) +/** +Constructs an asynchronous request status object and assigns a completion value +to it. + +@param aVal The completion value to be assigned to the constructed request + status object. +*/ + : iStatus(aVal), + iFlags(aVal==KRequestPending ? TRequestStatus::ERequestPending : 0) + + {} + + + + +inline TInt TRequestStatus::operator=(TInt aVal) +/** +Assigns the specified completion code to the request status object. + +@param aVal The value to be assigned. + +@return The value assigned. +*/ + { + if(aVal==KRequestPending) + iFlags|=TRequestStatus::ERequestPending; + else + iFlags&=~TRequestStatus::ERequestPending; + return (iStatus=aVal); + } + + + + +inline TBool TRequestStatus::operator==(TInt aVal) const +/** +Tests whether the request status object's completion code is the same as +the specified value. + +@param aVal The value to be compared. + +@return True, if the values are equal; false otherwise. +*/ + {return(iStatus==aVal);} + + + + +inline TBool TRequestStatus::operator!=(TInt aVal) const +/** +Tests whether the request status object's completion code is not equal to +the specified value. + +@param aVal The value to be compared. + +@return True, if the values are unequal; false otherwise. +*/ + {return(iStatus!=aVal);} + + + + +inline TBool TRequestStatus::operator>=(TInt aVal) const +/** +Tests whether the request status object's completion code is greater than +or equal to the specified value. + +@param aVal The value to be compared. + +@return True, if the request status object's value is greater than or equal + to the specified value; false, otherwise. +*/ + {return(iStatus>=aVal);} + + + + +inline TBool TRequestStatus::operator<=(TInt aVal) const +/** +Tests whether the request status object's completion code is less than or +equal to the specified value. + +@param aVal The value to be compared. + +@return True, if the request status object's value is less than or equal + to the specified value; false, otherwise. +*/ + {return(iStatus<=aVal);} + + + + +inline TBool TRequestStatus::operator>(TInt aVal) const +/** +Tests whether the request status object's completion code is greater than +the specified value. + +@param aVal The value to be compared. + +@return True, if the request status object's value is greater than + the specified value; false, otherwise. +*/ + {return(iStatus>aVal);} + + + + +inline TBool TRequestStatus::operator<(TInt aVal) const +/** +Tests whether the request status object's completion code is less than the +specified value. + +@param aVal The value to be compared. + +@return True, if the request status object's value is less than the specified + value; false, otherwise. +*/ + {return(iStatus>KFindHandleUniqueIdShift)&KFindHandleUniqueIdMask);} + + + + +/** +Gets the unique ID of the kernel object itself. + +@return The ID of the object. +*/ +inline TUint64 TFindHandle::ObjectID() const + {return MAKE_TUINT64(iObjectIdHigh, iObjectIdLow);} + + + + +/** +Sets the find handle to refer to a specific object. + +@oaram aIndex The current index of the object in its container. +@param aUniqueId The unique ID of the container object. +@param aObjectId The unique ID of the object iteself. +*/ +inline void TFindHandle::Set(TInt aIndex, TInt aUniqueId, TUint64 aObjectId) + { + iHandle=(TInt)((aUniqueId<=0) + { + iHandle = aHandleOrError; + return KErrNone; + } + iHandle = 0; + return aHandleOrError; + } + + + + +// Class RSemaphore +#ifndef __KERNEL_MODE__ +inline TInt RSemaphore::Open(const TFindSemaphore& aFind,TOwnerType aType) +/** +Opens a handle to the global semaphore found using a TFindSemaphore object. + +A TFindSemaphore object is used to find all global semaphores whose full names +match a specified pattern. + +By default, any thread in the process can use this instance of RSemaphore +to access the semaphore. However, specifying EOwnerThread as the second parameter +to this function, means that only the opening thread can use this instance +of RSemaphore to access the semaphore; any other thread in this process that +wants to access the semaphore must either duplicate the handle or use OpenGlobal() +again. + +@param aFind A reference to the TFindSemaphore object used to find the semaphore. +@param aType An enumeration whose enumerators define the ownership of this + semaphore handle. If not explicitly specified, EOwnerProcess is + taken as default. + +@return KErrNone if successful otherwise another of the system wide error codes. +*/ + {return(RHandleBase::Open((const TFindHandleBase&)aFind,aType));} +#endif + + + + +// Class RFastLock + + +/** +Default constructor. +*/ +inline RFastLock::RFastLock() + : iCount(0) + {} + + + + +// Class RMessagePtr2 + + +/** +Default constructor +*/ +inline RMessagePtr2::RMessagePtr2() + : iHandle(0) + {} + + + + +/** +Tests whether this message handle is empty. + +@return True, if this message handle is empty, false, otherwise. +*/ +inline TBool RMessagePtr2::IsNull() const + {return iHandle==0;} + + + + +/** +Gets the message handle value. + +@return The message handle value. +*/ +inline TInt RMessagePtr2::Handle() const + {return iHandle;} +inline TBool operator==(RMessagePtr2 aLeft,RMessagePtr2 aRight) + {return aLeft.Handle()==aRight.Handle();} +inline TBool operator!=(RMessagePtr2 aLeft,RMessagePtr2 aRight) + {return aLeft.Handle()!=aRight.Handle();} + + + + + +// Class RMessage + + +/** +Default constructor +*/ +inline RMessage2::RMessage2() + {} + + + + +/** +Gets the the number of the function requested by the client. + +@return The function number. +*/ +inline TInt RMessage2::Function() const + {return(iFunction);} + + + + +/** +Gets the first message argument as an integer value. + +@return The first message argument. +*/ +inline TInt RMessage2::Int0() const + {return(iArgs[0]);} + + + + +/** +Gets the second message argument as an integer value. + +@return The second message argument. +*/ +inline TInt RMessage2::Int1() const + {return(iArgs[1]);} + + + + +/** +Gets the third message argument as an integer value. + +@return The third message argument. +*/ +inline TInt RMessage2::Int2() const + {return(iArgs[2]);} + + + +/** +Gets the fourth message argument as an integer value. + +@return The fourth message argument. +*/ +inline TInt RMessage2::Int3() const + {return(iArgs[3]);} + + + +/** +Gets the first message argument as a pointer type. + +@return The first message argument. +*/ +inline const TAny *RMessage2::Ptr0() const + {return((const TAny *)iArgs[0]);} + + + + +/** +Gets the second message argument as a pointer type. + +@return The second message argument. +*/ +inline const TAny *RMessage2::Ptr1() const + {return((const TAny *)iArgs[1]);} + + + + +/** +Gets the third message argument as a pointer type. + +@return The third message argument. +*/ +inline const TAny *RMessage2::Ptr2() const + {return((const TAny *)iArgs[2]);} + + + + +/** +Gets the fourth message argument as a pointer type. + +@return The fourth message argument. +*/ +inline const TAny *RMessage2::Ptr3() const + {return((const TAny *)iArgs[3]);} + + + +/** +Gets a pointer to the session. + +@return A pointer to the session object. +*/ +inline CSession2* RMessage2::Session() const + {return (CSession2*)iSessionPtr; } + + + + +// Class TUid +inline TUid TUid::Uid(TInt aUid) +/** +Constructs the TUid object from a 32-bit integer. + +@param aUid The 32-bit integer value from which the TUid object is to be + constructed. + +@return The constructed TUid object. +*/ + {TUid uid={aUid};return uid;} + + + + +inline TUid TUid::Null() +/** +Constructs a Null-valued TUid object. + +@return The constructed Null-valued TUid object. +*/ + {TUid uid={KNullUidValue};return uid;} + + + + +#ifndef __KERNEL_MODE__ +// Template class TArray +template +inline TArray::TArray(TInt (*aCount)(const CBase *aPtr),const TAny *(*anAt)(const CBase *aPtr,TInt anIndex),const CBase *aPtr) + : iPtr(aPtr),iCount(aCount),iAt(anAt) +/** +Constructor. + +A TArray object is not intended to be instantiated explicitly. An object of +this type is instantiated as a result of a call to to the Array() member +function of a concrete array class + +@param aCount A pointer to a function which takes a + @code + const CBase* + @endcode + argument and returns a + @code + TInt + @endcode + aCount must point to the member function which returns the + current number of elements of type class T contained in the + array at aPtr, for which this TArray is being constructed. + This argument is supplied by the Array() member function of the + array class. +@param anAt A pointer to a function which takes a + @code + const CBase* + @endcode + and a + @code + TInt + @endcode + argument, and returns a pointer to + @code + TAny + @endcode + anAt must point to the member function which returns a reference + to the element located at position anIndex within the array at + aPtr, for which this TArray is being constructed. + This argument is supplied by the Array() member function of the + array class. +@param aPtr A pointer to the array for which this TArray is being + constructed. This argument is supplied by the Array() member + function of the array class. + +@see CArrayFixFlat::Array +@see CArrayFixSeg::Array +@see CArrayVarFlat::Array +@see CArrayVarSeg::Array +@see CArrayPakFlat::Array +@see RArray::Array +@see RPointerArray::Array +@see RArray::Array +@see RArray::Array +*/ + {} + + + + +template +inline TInt TArray::Count() const +/** +Gets the number of elements currently held in the array for which this generic +array has been constructed. + +@return The number of array elements. +*/ + {return((*iCount)(iPtr));} + + + + +template +inline const T &TArray::operator[](TInt anIndex) const +/** +Gets a reference to the element located at the specified position. + +The returned reference is const and cannot be used to change the element. +Any member function of the referenced template class T must be declared +as const if that function is to be accessed through this operator. + +@param anIndex The position of the element within the array for which this + TArray has been constructed. The position is relative to zero; + i.e. zero implies the first element in the array. + +@return A const reference to the element located at position anIndex within + the array for which this TArray has been constructed. + +@panic E32USER-CBase 21, if anIndex is negative, or greater than or equal to + the number of objects currently within the array. +*/ + {return(*((const T *)(*iAt)(iPtr,anIndex)));} +#endif + + + + +// Class TIdentityRelation +template +inline TIdentityRelation::TIdentityRelation() +/** +Constructs the object to use the equality operator (==) defined for class T +to determine whether two class T type objects match. +*/ + {iIdentity=(TGeneralIdentityRelation)&EqualityOperatorCompare;} + + + + +template +inline TIdentityRelation::TIdentityRelation( TBool (*anIdentity)(const T&, const T&) ) +/** +Constructs the object taking the specified function as an argument. + +The specified function should implement an algorithm for determining whether +two class T type objects match. It should return: + +1. true, if the two objects match. + +2. false, if the two objects do not match. + +@param anIdentity A pointer to a function that takes constant references to two + class T objects and returns a TInt value. +*/ + { iIdentity=(TGeneralIdentityRelation)anIdentity; } + + + + +template +inline TIdentityRelation::operator TGeneralIdentityRelation() const +/** +Operator that gets the function that determines whether two +objects of a given class type match. +*/ + { return iIdentity; } + + + +template +inline TBool TIdentityRelation::EqualityOperatorCompare(const T& aLeft, const T& aRight) +/** +Compares two objects of class T using the equality operator defined for class T. +*/ + {return aLeft == aRight;} + + + +// Class TLinearOrder +template +inline TLinearOrder::TLinearOrder( TInt(*anOrder)(const T&, const T&) ) +/** +Constructs the object taking the specified function as an argument. + +The specified function should implement an algorithm that determines the +order of two class T type objects. It should return: + +1. zero, if the two objects are equal. + +2. a negative value, if the first object is less than the second. + +3. a positive value, if the first object is greater than the second. + +@param anOrder A pointer to a function that takes constant references to two + class T objects and returns a TInt value. +*/ + { iOrder=(TGeneralLinearOrder)anOrder; } + + + + +template +inline TLinearOrder::operator TGeneralLinearOrder() const +/** +Operator that gets the function that determines the order of two +objects of a given class type. +*/ + { return iOrder; } + + + + +// Class RPointerArray + +/** +Default C++ constructor. + +This constructs an array object for an array of pointers with default +granularity, which is 8. +*/ +template +inline RPointerArray::RPointerArray() + : RPointerArrayBase() + {} + + + + +/** +C++ constructor with granularity. + +This constructs an array object for an array of pointers with the specified +granularity. + +@param aGranularity The granularity of the array. + +@panic USER 127, if aGranularity is not positive, or greater than or equal + to 0x10000000. +*/ +template +inline RPointerArray::RPointerArray(TInt aGranularity) + : RPointerArrayBase(aGranularity) + {} + + + + +/** +C++ constructor with minimum growth step and exponential growth factor. + +This constructs an array object for an array of pointers with the specified +minimum growth step and exponential growth factor. + +@param aMinGrowBy The minimum growth step of the array. Must be between 1 and + 65535 inclusive. +@param aFactor The factor by which the array grows, multiplied by 256. + For example 512 specifies a factor of 2. Must be between 257 + and 32767 inclusive. + +@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535. +@panic USER 193, if aFactor<=257 or aFactor>32767. +*/ +template +inline RPointerArray::RPointerArray(TInt aMinGrowBy, TInt aFactor) + : RPointerArrayBase(aMinGrowBy, aFactor) + {} + + + + +template +inline void RPointerArray::Close() +/** +Closes the array and frees all memory allocated to it. + +The function must be called before this array object goes out of scope. + +Note that the function does not delete the objects whose pointers are contained +in the array. +*/ + {RPointerArrayBase::Close();} + + + + +template +inline TInt RPointerArray::Count() const +/** +Gets the number of object pointers in the array. + +@return The number of object pointers in the array. +*/ + { return RPointerArrayBase::Count(); } + + + + +template +inline T* const& RPointerArray::operator[](TInt anIndex) const +/** +Gets a reference to the object pointer located at the specified +position within the array. + +The compiler chooses this option if the returned reference is used in +an expression where the reference cannot be modified. + +@param anIndex The position of the object pointer within the array. The + position is relative to zero, i.e. zero implies the object + pointer at the beginning of the array. + +@return A const reference to the object pointer at position anIndex within + the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + objects currently in the array. +*/ + {return (T* const&)At(anIndex);} + + + + +template +inline T*& RPointerArray::operator[](TInt anIndex) +/** +Gets a reference to the object pointer located at the specified +position within the array. + +The compiler chooses this option if the returned reference is used in +an expression where the reference can be modified. + +@param anIndex The position of the object pointer within the array. The + position is relative to zero, i.e. zero implies the object + pointer at the beginning of the array. + +@return A non-const reference to the object pointer at position anIndex within + the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + objects currently in the array. +*/ + {return (T*&)At(anIndex);} + + + + +template +inline TInt RPointerArray::Append(const T* anEntry) +/** +Appends an object pointer onto the array. + +@param anEntry The object pointer to be appended. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::Append(anEntry); } + + + + +template +inline TInt RPointerArray::Insert(const T* anEntry, TInt aPos) +/** +Inserts an object pointer into the array at the specified position. + +@param anEntry The object pointer to be inserted. +@param aPos The position within the array where the object pointer is to be + inserted. The position is relative to zero, i.e. zero implies + that a pointer is inserted at the beginning of the array. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. + +@panic USER 131, if aPos is negative, or is greater than the number of object + pointers currently in the array. +*/ + { return RPointerArrayBase::Insert(anEntry,aPos); } + + + + +template +inline void RPointerArray::Remove(TInt anIndex) +/** +Removes the object pointer at the specified position from the array. + +Note that the function does not delete the object whose pointer is removed. + +@param anIndex The position within the array from where the object pointer + is to be removed. The position is relative to zero, i.e. zero + implies that a pointer at the beginning of the array is to be + removed. + +@panic USER 130, if anIndex is negative, or is greater than the number of + objects currently in the array. +*/ + {RPointerArrayBase::Remove(anIndex);} + + + + +template +inline void RPointerArray::Compress() +/** +Compresses the array down to a minimum. + +After a call to this function, the memory allocated to the array is just +sufficient for its contained object pointers. +Subsequently adding a new object pointer to the array +always results in a re-allocation of memory. +*/ + {RPointerArrayBase::Compress();} + + + + +template +inline void RPointerArray::Reset() +/** +Empties the array. + +It frees all memory allocated to the array and resets the internal state so +that it is ready to be reused. + +This array object can be allowed to go out of scope after a call to this +function. + +Note that the function does not delete the objects whose pointers are contained +in the array. +*/ + {RPointerArrayBase::Reset();} + + + + +template +inline TInt RPointerArray::Find(const T* anEntry) const +/** +Finds the first object pointer in the array which matches the specified object +pointer, using a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry The object pointer to be found. +@return The index of the first matching object pointer within the array. + KErrNotFound, if no matching object pointer can be found. +*/ + { return RPointerArrayBase::Find(anEntry); } + + + + +template +inline TInt RPointerArray::Find(const T* anEntry, TIdentityRelation anIdentity) const +/** +Finds the first object pointer in the array whose object matches the specified +object, using a sequential search and a matching algorithm. + +The algorithm for determining whether two class T objects match is provided +by a function supplied by the caller. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry The object pointer to be found. +@param anIdentity A package encapsulating the function which determines whether + two class T objects match. + +@return The index of the first matching object pointer within the array. + KErrNotFound, if no suitable object pointer can be found. +*/ + { return RPointerArrayBase::Find(anEntry,anIdentity); } + + + + +template +inline TInt RPointerArray::FindReverse(const T* anEntry) const +/** +Finds the last object pointer in the array which matches the specified object +pointer, using a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry The object pointer to be found. +@return The index of the last matching object pointer within the array. + KErrNotFound, if no matching object pointer can be found. +*/ + { return RPointerArrayBase::FindReverse(anEntry); } + + + + +template +inline TInt RPointerArray::FindReverse(const T* anEntry, TIdentityRelation anIdentity) const +/** +Finds the last object pointer in the array whose object matches the specified +object, using a sequential search and a matching algorithm. + +The algorithm for determining whether two class T objects match is provided +by a function supplied by the caller. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry The object pointer to be found. +@param anIdentity A package encapsulating the function which determines whether + two class T objects match. + +@return The index of the last matching object pointer within the array. + KErrNotFound, if no suitable object pointer can be found. +*/ + { return RPointerArrayBase::FindReverse(anEntry,anIdentity); } + + + + +template +inline TInt RPointerArray::FindInAddressOrder(const T* anEntry) const +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +The function assumes that object pointers in the array are in address order. + +@param anEntry The object pointer to be found. + +@return The index of the matching object pointer within the array or KErrNotFound + if no suitable object pointer can be found. +*/ + { return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry); } + + + + +template +inline TInt RPointerArray::FindInOrder(const T* anEntry, TLinearOrder anOrder) const +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an algorithm +supplied by the caller and packaged as a TLinearOrder. + +@param anEntry The object pointer to be found. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return The index of the matching object pointer within the array or KErrNotFound, + if no suitable object pointer can be found. +*/ + { return RPointerArrayBase::FindIsq(anEntry,anOrder); } + + + + +template +inline TInt RPointerArray::FindInAddressOrder(const T* anEntry, TInt& anIndex) const +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +The function assumes that object pointers in the array are in address order. + +@param anEntry The object pointer to be found. +@param anIndex A TInt supplied by the caller. On return, contains an index + value: + If the function returns KErrNone, this is the index of the + matching object pointer within the array. + If the function returns KErrNotFound, this is the + index of the first object pointer within the array which + logically follows after anEntry. + +@return KErrNone, if a matching object pointer is found. + KErrNotFound, if no suitable object pointer can be found. +*/ + { return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex); } + + + + +template +inline TInt RPointerArray::FindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder anOrder) const +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an +algorithm supplied by the caller and packaged as a TLinearOrder. + +@param anEntry The object pointer to be found. +@param anIndex A TInt supplied by the caller. On return, contains an + index value: + If the function returns KErrNone, this is the index of the + matching object pointer within the array. + If the function returns KErrNotFound, this is the index of + the first object pointer in the array whose object is larger + than the entry being searched for - if no objects pointed to in + the array are larger, then the index value is the same as the + total number of object pointers in the array. + +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return KErrNone, if a matching object pointer is found. + KErrNotFound, if no suitable object pointer can be found. +*/ + { return RPointerArrayBase::BinarySearch(anEntry,anIndex,anOrder); } + + + + +template +inline TInt RPointerArray::SpecificFindInAddressOrder(const T* anEntry, TInt aMode) const +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that object pointers in the array are in address order. + +@param anEntry The object pointer to be found. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array + index of a matching element - what the index refers to depends on the + value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry, aMode); } + + + + +template +inline TInt RPointerArray::SpecificFindInOrder(const T* anEntry, TLinearOrder anOrder, TInt aMode) const +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an algorithm +supplied by the caller and packaged as a TLinearOrder type. + +@param anEntry The object pointer to be found. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array + index of a matching element - what the index refers to depends on + the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::FindIsq(anEntry,anOrder,aMode); } + + + + +template +inline TInt RPointerArray::SpecificFindInAddressOrder(const T* anEntry, TInt& anIndex, TInt aMode) const +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that object pointers in the array are in address order. + +@param anEntry The object pointer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an + index value depending on whether a match is found and on the + value of aMode. + If there is no matching element in the array, then this is + the index of the first element in the array that is bigger than + the element being searched for - if no elements in the array are + bigger, then the index value is the same as the total number of + elements in the array. If there is a matching element, then what + the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows the + last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. + +@param aMode Specifies whether to find the first match, the last match or any + match, as defined by one of the TArrayFindMode enum values. + +@return KErrNone, if a matching object pointer is found. + KErrNotFound, if no suitable object pointer can be found. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex,aMode); } + + + + +template +inline TInt RPointerArray::SpecificFindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +Where there is more than one matching element, it finds the first, the last or any +matching element as specified by the value of aMode. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an +algorithm supplied by the caller and packaged as a TLinearOrder type. + +@param anEntry The object pointer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an + index value depending on whether a match is found and on the + value of aMode. If there is no matching element in the array, + then this is the index of the first element in the array + that is bigger than the element being searched for - if + no elements in the array are bigger, then the index value + is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to + depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return KErrNone, if a matching object pointer is found. + KErrNotFound, if no suitable object pointer can be found. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::BinarySearch(anEntry,anIndex,anOrder,aMode); } + + + + +template +inline TInt RPointerArray::InsertInAddressOrder(const T* anEntry) +/** +Inserts an object pointer into the array in address order. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +The function assumes that existing object pointers within the array are in +address order. + +@param anEntry The object pointer to be inserted. + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + { return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,EFalse); } + + + + +template +inline TInt RPointerArray::InsertInOrder(const T* anEntry, TLinearOrder anOrder) +/** +Inserts an object pointer into the array so that the object itself is in object +order. + +The algorithm for determining the order of two class T objects is provided +by a function supplied by the caller. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +The function assumes that the array is ordered so that the referenced objects +are in object order. + +@param anEntry The object pointer to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + { return RPointerArrayBase::InsertIsq(anEntry,anOrder,EFalse); } + + + + +template +inline TInt RPointerArray::InsertInAddressOrderAllowRepeats(const T* anEntry) +/** +Inserts an object pointer into the array in address order, allowing duplicates. + +If the new object pointer is a duplicate of an existing object pointer in +the array, then the new pointer is inserted after the existing one. If more +than one duplicate object pointer already exists in the array, then any new +duplicate pointer is inserted after the last one. + +The function assumes that existing object pointers within the array are in +address order. + +@param anEntry The object pointer to be inserted. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,ETrue); } + + + + +template +inline TInt RPointerArray::InsertInOrderAllowRepeats(const T* anEntry, TLinearOrder anOrder) +/** +Inserts an object pointer into the array so that the object itself is in object +order, allowing duplicates + +The algorithm for determining the order of two class T objects is provided +by a function supplied by the caller. + +If the specified object is a duplicate of an existing object, then the new +pointer is inserted after the pointer to the existing object. If more than +one duplicate object already exists, then the new pointer is inserted after +the pointer to the last one. + +@param anEntry The object pointer to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::InsertIsq(anEntry,anOrder,ETrue); } + + + + +#ifndef __KERNEL_MODE__ +template +inline RPointerArray::RPointerArray(T** aEntries, TInt aCount) + : RPointerArrayBase((TAny **)aEntries, aCount) +/** +C++ constructor with a pointer to the first array entry in a pre-existing +array, and the number of entries in that array. + +This constructor takes a pointer to a pre-existing set of entries of type +pointer to class T, which is owned by another RPointerArray object. Ownership +of the set of entries still resides with the original RPointerArray object. + +@param aEntries A pointer to the first entry of type pointer to class T in + the set of entries belonging to the existing array. +@param aCount The number of entries in the existing array. The granularity of + this array is set to this value. + +@panic USER 156, if aCount is not positive. +*/ + {} + + + + +template +inline void RPointerArray::GranularCompress() +/** +Compresses the array down to a granular boundary. + +After a call to this function, the memory allocated to the array is sufficient +for its contained object pointers. Adding new object pointers to the array +does not result in a re-allocation of memory until the the total number of +pointers reaches a multiple of the granularity. +*/ + {RPointerArrayBase::GranularCompress();} + + + + +template +inline TInt RPointerArray::Reserve(TInt aCount) +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of object pointers specified. Adding new object pointers to the array +does not result in a re-allocation of memory until the the total number of +pointers exceeds the specified count. + +@param aCount The number of object pointers for which space should be reserved +@return KErrNone If the operation completed successfully +@return KErrNoMemory If the requested amount of memory could not be allocated +*/ + { return RPointerArrayBase::DoReserve(aCount); } + + + + +template +inline void RPointerArray::SortIntoAddressOrder() +/** +Sorts the object pointers within the array into address order. +*/ + { HeapSortUnsigned(); } + + + + +template +inline void RPointerArray::Sort(TLinearOrder anOrder) +/** +Sorts the object pointers within the array. + +The sort order of the pointers is based on the order of the referenced objects. +The referenced object order is determined by an algorithm supplied by the +caller and packaged as a TLinerOrder. + +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +*/ + { HeapSort(anOrder); } + + + + +template +inline TArray RPointerArray::Array() const +/** +Constructs and returns a generic array. + +@return A generic array representing this array. + +@see TArray +*/ + { return TArray(GetCount,GetElementPtr,(const CBase*)this); } +#endif + + + +template +void RPointerArray::ResetAndDestroy() +/** +Empties the array and deletes the referenced objects. + +It frees all memory allocated to the array and resets the internal state so +that it is ready to be reused. The function also deletes all of the objects +whose pointers are contained by the array. + +This array object can be allowed to go out of scope after a call to this function. +*/ + { + TInt c=Count(); + T** pE=(T**)Entries(); + ZeroCount(); + TInt i; + for (i=0; i + +/** +Default C++ constructor. + +This constructs an array object for an array of TAny pointers with default +granularity, which is 8. +*/ +inline RPointerArray::RPointerArray() + : RPointerArrayBase() + {} + + + + +/** +C++ constructor with granularity. + +This constructs an array object for an array of TAny pointers with the specified +granularity. + +@param aGranularity The granularity of the array. + +@panic USER 127, if aGranularity is not positive, or greater than or equal + to 0x10000000. +*/ +inline RPointerArray::RPointerArray(TInt aGranularity) + : RPointerArrayBase(aGranularity) + {} + + + + +/** +C++ constructor with minimum growth step and exponential growth factor. + +This constructs an array object for an array of TAny pointers with the specified +minimum growth step and exponential growth factor. + +@param aMinGrowBy The minimum growth step of the array. Must be between 1 and + 65535 inclusive. +@param aFactor The factor by which the array grows, multiplied by 256. + For example 512 specifies a factor of 2. Must be between 257 + and 32767 inclusive. + +@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535. +@panic USER 193, if aFactor<=257 or aFactor>32767. +*/ +inline RPointerArray::RPointerArray(TInt aMinGrowBy, TInt aFactor) + : RPointerArrayBase(aMinGrowBy, aFactor) + {} + + + + +inline void RPointerArray::Close() +/** +Closes the array and frees all memory allocated to it. + +The function must be called before this array object goes out of scope. + +Note that the function does not delete the objects whose pointers are contained +in the array. +*/ + {RPointerArrayBase::Close();} + + + + +inline TInt RPointerArray::Count() const +/** +Gets the number of pointers in the array. + +@return The number of pointers in the array. +*/ + { return RPointerArrayBase::Count(); } + + + + +inline TAny* const& RPointerArray::operator[](TInt anIndex) const +/** +Gets a reference to the pointer located at the specified +position within the array. + +The compiler chooses this option if the returned reference is used in +an expression where the reference cannot be modified. + +@param anIndex The position of the pointer within the array. The + position is relative to zero, i.e. zero implies the object + pointer at the beginning of the array. + +@return A const reference to the pointer at position anIndex within + the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + objects currently in the array. +*/ + {return At(anIndex);} + + + + +inline TAny*& RPointerArray::operator[](TInt anIndex) +/** +Gets a reference to the pointer located at the specified +position within the array. + +The compiler chooses this option if the returned reference is used in +an expression where the reference can be modified. + +@param anIndex The position of the pointer within the array. The + position is relative to zero, i.e. zero implies the object + pointer at the beginning of the array. + +@return A non-const reference to the pointer at position anIndex within + the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + objects currently in the array. +*/ + {return At(anIndex);} + + + + +inline TInt RPointerArray::Append(const TAny* anEntry) +/** +Appends an pointer onto the array. + +@param anEntry The pointer to be appended. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::Append(anEntry); } + + + + +inline TInt RPointerArray::Insert(const TAny* anEntry, TInt aPos) +/** +Inserts an pointer into the array at the specified position. + +@param anEntry The pointer to be inserted. +@param aPos The position within the array where the pointer is to be + inserted. The position is relative to zero, i.e. zero implies + that a pointer is inserted at the beginning of the array. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. + +@panic USER 131, if aPos is negative, or is greater than the number of object + pointers currently in the array. +*/ + { return RPointerArrayBase::Insert(anEntry,aPos); } + + + + +inline void RPointerArray::Remove(TInt anIndex) +/** +Removes the pointer at the specified position from the array. + +Note that the function does not delete the object whose pointer is removed. + +@param anIndex The position within the array from where the pointer + is to be removed. The position is relative to zero, i.e. zero + implies that a pointer at the beginning of the array is to be + removed. + +@panic USER 130, if anIndex is negative, or is greater than the number of + objects currently in the array. +*/ + {RPointerArrayBase::Remove(anIndex);} + + + + +inline void RPointerArray::Compress() +/** +Compresses the array down to a minimum. + +After a call to this function, the memory allocated to the array is just +sufficient for its contained pointers. +Subsequently adding a new pointer to the array +always results in a re-allocation of memory. +*/ + {RPointerArrayBase::Compress();} + + + + +inline void RPointerArray::Reset() +/** +Empties the array. + +It frees all memory allocated to the array and resets the internal state so +that it is ready to be reused. + +This array object can be allowed to go out of scope after a call to this +function. + +Note that the function does not delete the objects whose pointers are contained +in the array. +*/ + {RPointerArrayBase::Reset();} + + + + +inline TInt RPointerArray::Find(const TAny* anEntry) const +/** +Finds the first pointer in the array which matches the specified pointer, using +a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry The pointer to be found. +@return The index of the first matching pointer within the array. + KErrNotFound, if no matching pointer can be found. +*/ + { return RPointerArrayBase::Find(anEntry); } + + + + +inline TInt RPointerArray::FindReverse(const TAny* anEntry) const +/** +Finds the last pointer in the array which matches the specified pointer, using +a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry The pointer to be found. +@return The index of the last matching pointer within the array. + KErrNotFound, if no matching pointer can be found. +*/ + { return RPointerArrayBase::FindReverse(anEntry); } + + + + +inline TInt RPointerArray::FindInAddressOrder(const TAny* anEntry) const +/** +Finds the pointer in the array that matches the specified object +pointer, using a binary search technique. + +The function assumes that pointers in the array are in address order. + +@param anEntry The pointer to be found. + +@return The index of the matching pointer within the array or KErrNotFound + if no suitable pointer can be found. +*/ + { return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry); } + + + + +inline TInt RPointerArray::FindInAddressOrder(const TAny* anEntry, TInt& anIndex) const +/** +Finds the pointer in the array that matches the specified object +pointer, using a binary search technique. + +The function assumes that pointers in the array are in address order. + +@param anEntry The pointer to be found. +@param anIndex A TInt supplied by the caller. On return, contains an index + value: + If the function returns KErrNone, this is the index of the + matching pointer within the array. + If the function returns KErrNotFound, this is the index of the + last pointer within the array which logically + precedes anEntry. + +@return KErrNone, if a matching pointer is found. + KErrNotFound, if no suitable pointer can be found. +*/ + { return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex); } + + + + +inline TInt RPointerArray::SpecificFindInAddressOrder(const TAny* anEntry, TInt aMode) const +/** +Finds the pointer in the array that matches the specified pointer, using a +binary search technique. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that pointers in the array are in address order. + +@param anEntry The pointer to be found. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array + index of a matching element - what the index refers to depends on the + value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::FindIsqUnsigned((TUint)anEntry, aMode); } + + + + +inline TInt RPointerArray::SpecificFindInAddressOrder(const TAny* anEntry, TInt& anIndex, TInt aMode) const +/** +Finds the pointer in the array that matches the specified pointer, using a +binary search technique. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that pointers in the array are in address order. + +@param anEntry The pointer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an + index value depending on whether a match is found and on the + value of aMode. + If there is no matching element in the array, then this is + the index of the first element in the array that is bigger than + the element being searched for - if no elements in the array are + bigger, then the index value is the same as the total number of + elements in the array. If there is a matching element, then what + the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows the + last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. + +@param aMode Specifies whether to find the first match, the last match or any + match, as defined by one of the TArrayFindMode enum values. + +@return KErrNone, if a matching pointer is found. + KErrNotFound, if no suitable pointer can be found. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::BinarySearchUnsigned((TUint)anEntry,anIndex,aMode); } + + + + +inline TInt RPointerArray::InsertInAddressOrder(const TAny* anEntry) +/** +Inserts an pointer into the array in address order. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +The function assumes that existing pointers within the array are in +address order. + +@param anEntry The pointer to be inserted. + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + { return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,EFalse); } + + + + +inline TInt RPointerArray::InsertInAddressOrderAllowRepeats(const TAny* anEntry) +/** +Inserts an pointer into the array in address order, allowing duplicates. + +If the new pointer is a duplicate of an existing pointer in +the array, then the new pointer is inserted after the existing one. If more +than one duplicate pointer already exists in the array, then any new +duplicate pointer is inserted after the last one. + +The function assumes that existing pointers within the array are in +address order. + +@param anEntry The pointer to be inserted. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::InsertIsqUnsigned((TUint)anEntry,ETrue); } + + + + +#ifndef __KERNEL_MODE__ +inline RPointerArray::RPointerArray(TAny** aEntries, TInt aCount) + : RPointerArrayBase((TAny **)aEntries, aCount) +/** +C++ constructor with a pointer to the first array entry in a pre-existing +array, and the number of entries in that array. + +This constructor takes a pointer to a pre-existing set of entries of type TAny*, +which is owned by another RPointerArray object. Ownership of the set of entries +still resides with the original RPointerArray object. + +@param aEntries A pointer to the first entry of type TAny* in the set of entries + belonging to the existing array. +@param aCount The number of entries in the existing array. The granularity of + this array is set to this value. + +@panic USER 156, if aCount is not positive. +*/ + {} + + + + +inline void RPointerArray::GranularCompress() +/** +Compresses the array down to a granular boundary. + +After a call to this function, the memory allocated to the array is sufficient +for its contained pointers. Adding new pointers to the array +does not result in a re-allocation of memory until the the total number of +pointers reaches a multiple of the granularity. +*/ + {RPointerArrayBase::GranularCompress();} + + + + +inline void RPointerArray::SortIntoAddressOrder() +/** +Sorts the pointers within the array into address order. +*/ + { HeapSortUnsigned(); } + + + + +inline TArray RPointerArray::Array() const +/** +Constructs and returns a generic array. + +@return A generic array representing this array. + +@see TArray +*/ + { return TArray(GetCount,GetElementPtr,(const CBase*)this); } +#endif + + + +template +inline RArray::RArray() + : RArrayBase(sizeof(T)) +/** +Default C++ constructor. + +This constructs an array object for an array of type class T objects with +default granularity and key offset value. The default granularity is 8 and +the defaul key offset value is zero. + +@panic USER 129, if the size of class T is not positive or is not less + than 640. +*/ + {} + + + + +template +inline RArray::RArray(TInt aGranularity) + : RArrayBase(sizeof(T),aGranularity) +/** +C++ constructor with granularity. + +This constructs an array object for an array of type class T objects with +a specified granularity and default key offset value. The default key offset +value is zero. + +@param aGranularity The granularity of the array. + +@panic USER 129, if the size of class T is not positive or is not less + than 640. +@panic USER 127, if aGranularity is not positive or the product of this + value and the size of class T is not less than 0x10000000. +*/ + {} + + + + +template +inline RArray::RArray(TInt aGranularity, TInt aKeyOffset) + : RArrayBase(sizeof(T),aGranularity,aKeyOffset) +/** +C++ constructor with granularity and key offset. + +This constructs an array object for an array of type class T objects with +a specified granularity and a specified key offset value. + +@param aGranularity The granularity of the array. +@param aKeyOffset The key offset. + +@panic USER 129, if the size of class T is not positive or is not less + than 640. +@panic USER 127, if aGranularity is not positive or the product of this + value and the size of class T is not less than 0x10000000. +@panic USER 128, if aKeyOffset is not positive, or is not less than the + size of class T, or is not a multiple of 4. +*/ + {} + + + + +/** +C++ constructor with minimum growth step and exponential growth factor. + +This constructs an array object for an array of class T objects with the +specified minimum growth step and exponential growth factor. + +@param aMinGrowBy The minimum growth step of the array. Must be between 1 and + 65535 inclusive. +@param aKeyOffset The key offset. +@param aFactor The factor by which the array grows, multiplied by 256. + For example 512 specifies a factor of 2. Must be between 257 + and 32767 inclusive. + +@panic USER 129, if the size of class T is not positive or is not less than 640. +@panic USER 128, if aKeyOffset is negative, or is not less than the + size of class T, or is not a multiple of 4. +@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535. +@panic USER 193, if aFactor<=257 or aFactor>32767. +*/ +template +inline RArray::RArray(TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor) + : RArrayBase(sizeof(T), aMinGrowBy, aKeyOffset, aFactor) + {} + + + + +template +inline RArray::RArray(TInt aEntrySize,T* aEntries, TInt aCount) + : RArrayBase(aEntrySize,aEntries,aCount) +/** +C++ constructor with size of entry, a pointer to the first array entry in a +pre-existing array, and the number of entries in that array. + +This constructor takes a pointer to a pre-existing set of entries of type +class T objects owned by another RArray object. Ownership of the set of entries +still resides with the original RArray object. + +This array is assigned a default granularity and key offset value. The default +granularity is 8 and the default key offset value is zero. + +The purpose of constructing an array in this way is to allow sorting and +finding operations to be done without further allocation of memory. + +@param aEntrySize The size of an entry in the existing array. +@param aEntries A pointer to the first entry of type class T in the set of + entries belonging to the existing array. +@param aCount The number of entries in the existing array. + +@panic USER 129, if aEntrySize is not positive or is not less than 640. +@panic USER 156, if aCount is not positive. +*/ + {} + + + + +template +inline void RArray::Close() +/** +Closes the array and frees all memory allocated to the array. + +The function must be called before this array object is destroyed. +*/ + {RArrayBase::Close();} + + + + +template +inline TInt RArray::Count() const +/** +Gets the number of objects in the array. + +@return The number of objects in the array. +*/ + {return RArrayBase::Count();} + + + + +template +inline const T& RArray::operator[](TInt anIndex) const +/** +Gets a reference to an object located at a specified position within the array. + +The compiler chooses this function if the returned reference is used in an +expression where the reference cannot be modified. + +@param anIndex The position of the object within the array. The position is + relative to zero, i.e. zero implies the object at the beginning + of the array. + +@return A const reference to the object at position anIndex within the array. + +@panic USER 130, if anIndex is negative or is greater than the number of + objects currently in the array +*/ + {return *(const T*)At(anIndex); } + + + + +template +inline T& RArray::operator[](TInt anIndex) +/** +Gets a reference to an object located at a specified position within the array. + +The compiler chooses this function if the returned reference is used in an +expression where the reference can be modified. + +@param anIndex The position of the object within the array. The position is + relative to zero, i.e. zero implies the object at the beginning + of the array. + +@return A non-const reference to the object at position anIndex within the array. + +@panic USER 130, if anIndex is negative or is greater than the number of + objects currently in the array +*/ + {return *(T*)At(anIndex); } + + + + +template +inline TInt RArray::Append(const T& anEntry) +/** +Apends an object onto the array. + +@param anEntry A reference to the object of type class T to be appended. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + {return RArrayBase::Append(&anEntry);} + + + + +template +inline TInt RArray::Insert(const T& anEntry, TInt aPos) +/** +Inserts an object into the array at a specified position. + +@param anEntry The class T object to be inserted. +@param aPos The position within the array where the object is to + be inserted. The position is relative to zero, i.e. zero + implies that an object is inserted at the beginning of + the array. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. + +@panic USER 131, if aPos is negative or is greater than the number of objects + currently in the array. +*/ + {return RArrayBase::Insert(&anEntry,aPos);} + + + + +template +inline void RArray::Remove(TInt anIndex) +/** +Removes the object at a specified position from the array. + +@param anIndex The position within the array from where the object is to be + removed. The position is relative to zero, i.e. zero implies + that an object at the beginning of the array is to be removed. + +@panic USER 130, if anIndex is negative or is greater than the number of + objects currently in the array. +*/ + {RArrayBase::Remove(anIndex);} + + + + +template +inline void RArray::Compress() +/** +Compresses the array down to a minimum. + +After a call to this function, the memory allocated to the array is just +sufficient for its contained objects. Subsequently adding a new object to the +array always results in a re-allocation of memory. +*/ + {RArrayBase::Compress();} + + + + +template +inline void RArray::Reset() +/** +Empties the array, so that it is ready to be reused. + +The function frees all memory allocated to the array and resets the internal +state so that it is ready to be reused. + +This array object can be allowed to go out of scope after a call to this function. +*/ + {RArrayBase::Reset();} + + + + +template +inline TInt RArray::Find(const T& anEntry) const +/** +Finds the first object in the array which matches the specified object using +a sequential search. + +Matching is based on the comparison of a TInt value at the key offset position +within the objects. + +For classes which define their own equality operator (==), the alternative method +Find(const T& anEntry, TIdentityRelation anIdentity) is recommended. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the first matching object within the array. + KErrNotFound, if no matching object can be found. +*/ + {return RArrayBase::Find(&anEntry);} + + + + +template +inline TInt RArray::Find(const T& anEntry, TIdentityRelation anIdentity) const +/** +Finds the first object in the array which matches the specified object using +a sequential search and a matching algorithm. + +The algorithm for determining whether two class T type objects match is provided +by a function supplied by the caller. + +Such a function need not be supplied if an equality operator (==) is defined for class T. +In this case, default construction of anIdentity provides matching, as in the example below: + +@code +//Construct a TPoint and append to an RArray +TPoint p1(0,0); +RArray points; +points.AppendL(p1); +//Find position of p1 in points using TIdentityRelation default construction +TInt r = points.Find(p1, TIdentityRelation()); +@endcode + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry A reference to an object of type class T to be used + for matching. +@param anIdentity A package encapsulating the function which determines whether + two class T type objects match. + +@return The index of the first matching object within the array. + KErrNotFound, if no matching object can be found. +*/ + {return RArrayBase::Find(&anEntry,anIdentity);} + + + + +template +inline TInt RArray::FindReverse(const T& anEntry) const +/** +Finds the last object in the array which matches the specified object using +a sequential search. + +Matching is based on the comparison of a TInt value at the key offset position +within the objects. + +For classes which define their own equality operator (==), the alternative method +FindReverse(const T& anEntry, TIdentityRelation anIdentity) is recommended. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the last matching object within the array. + KErrNotFound, if no matching object can be found. +*/ + {return RArrayBase::FindReverse(&anEntry);} + + + + +template +inline TInt RArray::FindReverse(const T& anEntry, TIdentityRelation anIdentity) const +/** +Finds the last object in the array which matches the specified object using +a sequential search and a matching algorithm. + +The algorithm for determining whether two class T type objects match is provided +by a function supplied by the caller. + +Such a function need not be supplied if an equality operator (==) is defined for class T. +In this case, default construction of anIdentity provides matching. + +See Find(const T& anEntry, TIdentityRelation anIdentity) for more details. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +@param anEntry A reference to an object of type class T to be used + for matching. +@param anIdentity A package encapsulating the function which determines whether + two class T type objects match. + +@return The index of the last matching object within the array. + KErrNotFound, if no matching object can be found. +*/ + {return RArrayBase::FindReverse(&anEntry,anIdentity);} + + + + +template +inline TInt RArray::FindInSignedKeyOrder(const T& anEntry) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in signed +key order. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the matching object within the array, or KErrNotFound + if no matching object can be found. +*/ + {return RArrayBase::FindIsqSigned(&anEntry);} + + + + +template +inline TInt RArray::FindInUnsignedKeyOrder(const T& anEntry) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in unsigned +key order. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the matching object within the array, or KErrNotFound + if no matching object can be found. +*/ + {return RArrayBase::FindIsqUnsigned(&anEntry);} + + + + +template +inline TInt RArray::FindInOrder(const T& anEntry, TLinearOrder anOrder) const +/** +Finds the object in the array which matches the specified object using a binary +search technique and an ordering algorithm. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return The index of the matching object within the array, or KErrNotFound if + no matching object can be found. +*/ + {return RArrayBase::FindIsq(&anEntry,anOrder);} + + + + +template +inline TInt RArray::FindInSignedKeyOrder(const T& anEntry, TInt& anIndex) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in signed +key order. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex On return contains an index value. If the function returns KErrNone, + this is the index of the matching object within the array. + If the function returns KErrNotFound, this is the index of the + first element in the array whose key is bigger than the key of the + element being sought. If there are no elements in the array with + a bigger key, then the index value is the same as the total + number of elements in the array. +@return KErrNone if a matching object is found, or KErrNotFound if no matching + object can be found. +*/ + {return RArrayBase::BinarySearchSigned(&anEntry,anIndex);} + + + + +template +inline TInt RArray::FindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in unsigned +key order. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex On return contains an index value. If the function returns + KErrNone, this is the index of the matching object within the + array. + If the function returns KErrNotFound, this is the index of the + first element in the array whose key is bigger than the key of the + element being sought. If there are no elements in the array with + a bigger key, then the index value is the same as the total + number of elements in the array. +@return KErrNone if a matching object is found, or KErrNotFound if no matching + object can be found. +*/ + {return RArrayBase::BinarySearchUnsigned(&anEntry,anIndex);} + + + + +template +inline TInt RArray::FindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder anOrder) const +/** +Finds the object in the array which matches the specified object using a binary +search technique and an ordering algorithm. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex On return contains an index value. If the function returns + KErrNone, this is the index of the matching object within the + array. + If the function returns KErrNotFound, this is the index of the + first element in the array that is bigger than the element being + searched for - if no elements in the array are bigger, then + the index value is the same as the total number of elements in + the array. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return KErrNone if a matching object is found. KErrNotFound if no matching + object can be found. +*/ + {return RArrayBase::BinarySearch(&anEntry,anIndex,anOrder);} + + + + +template +inline TInt RArray::SpecificFindInSignedKeyOrder(const T& anEntry, TInt aMode) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by a signed 32-bit word +(the key) embedded in each array element. In the case that there is more than +one matching element, finds the first, last or any match as specified by +the value of aMode. + +The function assumes that existing objects within the array are in signed +key order. + +@param anEntry A reference to an object of type class T to be used for matching. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array + index of a matching element - what the index refers to depends on the + value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. + +@see TArrayFindMode +*/ + {return RArrayBase::FindIsqSigned(&anEntry,aMode);} + + + + +template +inline TInt RArray::SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt aMode) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by an unsigned 32-bit word +(the key) embedded in each array element. Where there is more than +one matching element, it finds the first, last or any matching element +as specified by the value of aMode. + +The function assumes that existing objects within the array are in unsigned +key order. + +@param anEntry A reference to an object of type class T to be used for matching. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array + index of a matching element - what the index refers to depends on the + value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows the + last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. + +@see TArrayFindMode +*/ + {return RArrayBase::FindIsqUnsigned(&anEntry,aMode);} + + + + +template +inline TInt RArray::SpecificFindInOrder(const T& anEntry, TLinearOrder anOrder, TInt aMode) const +/** +Finds the object in the array which matches the specified object using a binary +search technique and an ordering algorithm. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder type. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or any + match, as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array index + of a matching element - what the index refers to depends on the value of + aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. +*/ + {return RArrayBase::FindIsq(&anEntry,anOrder,aMode);} + + + + +template +inline TInt RArray::SpecificFindInSignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by a signed 32-bit word +(the key) embedded in each array element. Where there is more than +one matching element, finds the first, last or any matching element as +specified specified by the value of aMode. + +The function assumes that existing objects within the array are in signed +key order. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex A TInt type supplied by the caller. On return, it contains + an index value depending on whether a match is found and on the + value of aMode. If there is no matching element in the array, + then this is the index of the first element in the array that + is bigger than the element being searched for - if no elements + in the array are bigger, then the index value is the same as the + total number of elements in the array. If there is a matching + element, then what the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@return KErrNone, if a matching object pointer is found; + KErrNotFound, if no suitable object pointer can be found. +*/ + {return RArrayBase::BinarySearchSigned(&anEntry,anIndex,aMode);} + + + + +template +inline TInt RArray::SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by an unsigned 32-bit word +(the key) embedded in each array element. Where there is more than +one matching element, it finds the first, last or any matching element as +specified by the value of aMode. + +The function assumes that existing objects within the array are in unsigned +key order. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex A TInt type supplied by the caller. On return, it contains an index + value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is the index + of the first element in the array that is bigger than the element + being searched for - if no elements in the array are bigger, then + the index value is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to depends on + the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows the + last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. +@param aMode Specifies whether to find the first match, the last match or any match, as defined by one + of the TArrayFindMode enum values. +@return KErrNone, if a matching object pointer is found; KErrNotFound, if no suitable object pointer can be found. + +@see TArrayFindMode +*/ + {return RArrayBase::BinarySearchUnsigned(&anEntry,anIndex,aMode);} + + + + +template +inline TInt RArray::SpecificFindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const +/** +Finds the object in the array which matches the specified object using a binary +search technique and a specified ordering algorithm. + +Where there is more than one matching element, it finds the first, the last or +any matching element as specified by the value of aMode. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder type. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex A TInt type supplied by the caller. On return, it contains + an index value depending on whether a match is found and on the + value of aMode. If there is no matching element in the array, + then this is the index of the first element in the array that + is bigger than the element being searched for - if no elements + in the array are bigger, then the index value is the same as + the total number of elements in the array. + If there is a matching element, then what the index refers to + depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also + the last element of the array, then the index value is the same as + the total number of elements in the array. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. +@return KErrNone, if a matching object pointer is found; + KErrNotFound, if no suitable object pointer can be found. + +*/ + {return RArrayBase::BinarySearch(&anEntry,anIndex,anOrder,aMode);} + + + + +template +inline TInt RArray::InsertInSignedKeyOrder(const T& anEntry) +/** +Inserts an object into the array in ascending signed key order. + +The order of two class T type objects is based on comparing a TInt value +located at the key offset position within the class T object. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +@param anEntry A reference to the object of type class T to be inserted. + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + {return RArrayBase::InsertIsqSigned(&anEntry,EFalse);} + + + + +template +inline TInt RArray::InsertInUnsignedKeyOrder(const T& anEntry) +/** +Inserts an object into the array in ascending unsigned key order. + +The order of two class T type objects is based on comparing a TUint value +located at the key offset position within the class T object. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +@param anEntry A reference to the object of type class T to be inserted. + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + {return RArrayBase::InsertIsqUnsigned(&anEntry,EFalse);} + + + + +template +inline TInt RArray::InsertInOrder(const T& anEntry, TLinearOrder anOrder) +/** +Inserts an object of into the array in object order. + +The algorithm for determining the order of two class T type objects is provided +by a function supplied by the caller. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +The function assumes that existing objects within the array are in object +order. + +@param anEntry A reference to the object of type class T to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + {return RArrayBase::InsertIsq(&anEntry,anOrder,EFalse);} + + + + +template +inline TInt RArray::InsertInSignedKeyOrderAllowRepeats(const T& anEntry) +/** +Inserts an object into the array in ascending signed key order, +allowing duplicates. + +The order of two class T type objects is based on comparing a TInt value +located at the key offset position within the class T object. + +If anEntry is a duplicate of an existing object in the array, then the new +object is inserted after the existing object. If more than one duplicate object +already exists in the array, then any new duplicate object is inserted after +the last one. + +@param anEntry A reference to the object of type class T to be inserted. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + {return RArrayBase::InsertIsqSigned(&anEntry,ETrue);} + + + + +template +inline TInt RArray::InsertInUnsignedKeyOrderAllowRepeats(const T& anEntry) +/** +Inserts an object into the array in ascending unsigned key order, allowing +duplicates. + +The order of two class T type objects is based on comparing a TUint value +located at the key offset position within the class T object. + +If anEntry is a duplicate of an existing object in the array, then the new +object is inserted after the existing object. If more than one duplicate object +already exists in the array, then any new duplicate object is inserted after +the last one. + +@param anEntry A reference to the object of type class T to be inserted. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + {return RArrayBase::InsertIsqUnsigned(&anEntry,ETrue);} + + + + +template +inline TInt RArray::InsertInOrderAllowRepeats(const T& anEntry, TLinearOrder anOrder) +/** +Inserts an object into the array in object order, allowing duplicates. + +The algorithm for determining the order of two class T type objects is provided +by a function supplied by the caller. + +If anEntry is a duplicate of an existing object in the array, then the new +object is inserted after the existing object. If more than one duplicate object +already exists in the array, then anEntry is inserted after the last one. + +The function assumes that existing objects within the array are in object +order. + +@param anEntry A reference to the object of type class T to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + {return RArrayBase::InsertIsq(&anEntry,anOrder,ETrue);} + + + +#ifndef __KERNEL_MODE__ + +template +inline void RArray::GranularCompress() +/** +Compresses the array down to a granular boundary. + +After a call to this function, the memory allocated to the array is sufficient +for its contained objects. Adding new objects to the array does not result +in a re-allocation of memory until the the total number of objects reaches +a multiple of the granularity. +*/ + {RArrayBase::GranularCompress();} + + + + +template +inline TInt RArray::Reserve(TInt aCount) +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of objects specified. Adding new objects to the array +does not result in a re-allocation of memory until the the total number of +objects exceeds the specified count. + +@param aCount The number of objects for which space should be reserved +@return KErrNone If the operation completed successfully +@return KErrNoMemory If the requested amount of memory could not be allocated +*/ + { return RArrayBase::DoReserve(aCount); } + + + + +template +inline void RArray::SortSigned() +/** +Sorts the objects within the array; the sort order is assumed to be in signed +integer order. +*/ + {HeapSortSigned();} + + + + +template +inline void RArray::SortUnsigned() +/** +Sorts the objects within the array; the sort order is assumed to be in unsigned +integer order. +*/ + {HeapSortUnsigned();} + + + + +template +inline void RArray::Sort(TLinearOrder anOrder) +/** +Sorts the objects within the array using the specified TLinearOrder. + +The sort order is determined by an algorithm supplied by the caller and +packaged as a TLinerOrder. + +@param anOrder A package encapsulating the function which determines the order + of two class T type objects. +*/ + {HeapSort(anOrder);} + + + + +template +inline TArray RArray::Array() const +/** +Constructs and returns a generic array. + +@return A generic array representing this array. +*/ + { return TArray(GetCount,GetElementPtr,(const CBase*)this); } +#endif + + + + +inline RArray::RArray() + : RPointerArrayBase() +/** +Constructs an array object for an array of signed integers with +default granularity. + +The default granularity is 8. +*/ + {} + + + + +inline RArray::RArray(TInt aGranularity) + : RPointerArrayBase(aGranularity) +/** +Constructs an array object for an array of signed integers with the specified +granularity. + +@param aGranularity The granularity of the array. + +@panic USER 127, if aGranularity is not positive or is greater than or + equal to 0x10000000. +*/ + {} + + + + +/** +C++ constructor with minimum growth step and exponential growth factor. + +This constructs an array object for an array of signed integers with the +specified minimum growth step and exponential growth factor. + +@param aMinGrowBy The minimum growth step of the array. Must be between 1 and + 65535 inclusive. +@param aFactor The factor by which the array grows, multiplied by 256. + For example 512 specifies a factor of 2. Must be between 257 + and 32767 inclusive. + +@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535. +@panic USER 193, if aFactor<=257 or aFactor>32767. +*/ +inline RArray::RArray(TInt aMinGrowBy, TInt aFactor) + : RPointerArrayBase(aMinGrowBy, aFactor) + {} + + + + +inline void RArray::Close() +/** +Closes the array and frees all memory allocated to the array. + +The function must be called before this array object goes out of scope. +*/ + {RPointerArrayBase::Close();} + + + + +inline TInt RArray::Count() const +/** +Gets the number of signed integers in the array. + +@return The number of signed integers in the array. +*/ + { return RPointerArrayBase::Count(); } + + + + +inline const TInt& RArray::operator[](TInt anIndex) const +/** +Gets a reference to the signed integer located at a specified position within +the array. + +The compiler chooses this function if the returned reference is used in an +expression where the reference cannot be modified. + +@param anIndex The position of the signed integer within the array. The + position is relative to zero, i.e. zero implies the entry + at the beginning of the array. + +@return A const reference to the signed integer at position anIndex within + the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + entries currently in the array. +*/ + {return (const TInt&)At(anIndex);} + + + + +inline TInt& RArray::operator[](TInt anIndex) +/** +Gets a reference to the signed integer located at a specified position within +the array. + +The compiler chooses this function if the returned reference is used in an +expression where the reference can be modified. + +@param anIndex The position of the signed integer within the array. The + position is relative to zero, i.e. zero implies the entry + at the beginning of the array. + +@return A non-const reference to the signed integer at position anIndex within + the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + entries currently in the array. +*/ + {return (TInt&)At(anIndex);} + + + + +inline TInt RArray::Append(TInt anEntry) +/** +Appends a signed integer onto the array. + +@param anEntry The signed integer to be appended. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::Append((const TAny*)anEntry); } + + + + +inline TInt RArray::Insert(TInt anEntry, TInt aPos) +/** +Inserts a signed integer into the array at the specified position. + +@param anEntry The signed integer to be inserted. +@param aPos The position within the array where the signed integer is to be + inserted. The position is relative to zero, i.e. zero implies + that an entry is inserted at the beginning of the array. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. + +@panic USER 131, if aPos is negative, or is greater than the number of entries + currently in the array. +*/ + { return RPointerArrayBase::Insert((const TAny*)anEntry,aPos); } + + + + +inline void RArray::Remove(TInt anIndex) +/** +Removes the signed integer at the specified position from the array. + +@param anIndex The position within the array from where the signed integer + is to be removed. The position is relative to zero, i.e. zero + implies that an entry at the beginning of the array is to be + removed. + +@panic USER 130, if anIndex is negative or is greater than the number of + entries currently in the array. +*/ + {RPointerArrayBase::Remove(anIndex);} + + + + +inline void RArray::Compress() +/** +Compresses the array down to a minimum. + +After a call to this function, the memory allocated to the array is just +sufficient for its entries. Subsequently adding a new signed integer to the +array always results in a re-allocation of memory. +*/ + {RPointerArrayBase::Compress();} + + + + +inline void RArray::Reset() +/** +Empties the array. + +The function frees all memory allocated to the array and +resets the internal state so that it is ready to be reused. + +This array object can be allowed to go out of scope after a call to this +function. +*/ + {RPointerArrayBase::Reset();} + + + + +inline TInt RArray::Find(TInt anEntry) const +/** +Finds the first signed integer in the array which matches the specified signed +integer using a sequential search. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of entries in the array. + +@param anEntry The signed integer to be found. + +@return The index of the first matching signed integer within the array. + KErrNotFound, if no matching entry can be found. +*/ + { return RPointerArrayBase::Find((const TAny*)anEntry); } + + + + +inline TInt RArray::FindReverse(TInt anEntry) const +/** +Finds the last signed integer in the array which matches the specified signed +integer using a sequential search. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of entries in the array. + +@param anEntry The signed integer to be found. + +@return The index of the last matching signed integer within the array. + KErrNotFound, if no matching entry can be found. +*/ + { return RPointerArrayBase::FindReverse((const TAny*)anEntry); } + + + + +inline TInt RArray::FindInOrder(TInt anEntry) const +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +The function assumes that the array is in signed integer order. + +@param anEntry The signed integer to find. + +@return The index of the matching signed integer within the array or KErrNotFound, + if no match can be found. +*/ + { return RPointerArrayBase::FindIsqSigned(anEntry); } + + + + +inline TInt RArray::FindInOrder(TInt anEntry, TInt& anIndex) const +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +The function assumes that the array is in signed integer order. + +@param anEntry The signed integer to find. +@param anIndex A TInt suplied by the caller. On return contains an index value. + If the function returns KErrNone, this is the index of the + matching signed integer within the array. + If the function returns KErrNotFound, this is the index of the + first signed integer within the array that is bigger than the + signed integer being searched for - if no signed integers within + the array are bigger, then the index value is the same as the + total number of signed integers within the array. + +@return KErrNone if a matching signed integer is found. + KErrNotFound if no match can be found. +*/ + { return RPointerArrayBase::BinarySearchSigned(anEntry,anIndex); } + + + + +inline TInt RArray::SpecificFindInOrder(TInt anEntry, TInt aMode) const +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +Where there is more than one matching element, it finds the first, last or any +matching element as specified by the value of aMode. + +The function assumes that the array is in signed integer order. + +@param anEntry The signed integer to be found. +@param aMode Specifies whether to find the first match, the last match or any + match, as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array + index of a matching element - what the index refers to depends on the + value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in + the array. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::FindIsqSigned(anEntry,aMode); } + + + + +inline TInt RArray::SpecificFindInOrder(TInt anEntry, TInt& anIndex, TInt aMode) const +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +Where there is more than one matching element, it finds the first, last or any +matching element as specified by the value of aMode. + +The function assumes that the array is in signed integer order. + +@param anEntry The signed integer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an index + value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is the index of + the first element in the array that is bigger than the element being + searched for - if no elements in the array are bigger, then the index + value is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to depends + on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@return KErrNone, if a matching element is found; + KErrNotFound, if no suitable element can be found. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::BinarySearchSigned(anEntry,anIndex,aMode); } + + + + +inline TInt RArray::InsertInOrder(TInt anEntry) +/** +Inserts a signed integer into the array in signed integer order. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +The function assumes that existing entries within the array are in signed +integer order. + +@param anEntry The signed integer to be inserted + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + { return RPointerArrayBase::InsertIsqSigned(anEntry,EFalse); } + + + + +inline TInt RArray::InsertInOrderAllowRepeats(TInt anEntry) +/** +Inserts a signed integer into the array in signed integer order, +allowing duplicates. + +If anEntry is a duplicate of an existing entry in the array, then the new +signed integer is inserted after the existing one. If more than one duplicate +entry already exists in the array, then any new duplicate signed integer is +inserted after the last one. + +The function assumes that existing entries within the array are in signed +integer order. + +@param anEntry The signed integer to be inserted. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::InsertIsqSigned(anEntry,ETrue); } + + + + +#ifndef __KERNEL_MODE__ +inline RArray::RArray(TInt* aEntries, TInt aCount) + : RPointerArrayBase((TAny**)aEntries, aCount) +/** +C++ constructor with a pointer to the first array entry in a +pre-existing array, and the number of entries in that array. + +This constructor takes a pointer to a pre-existing set of entries of type +TInt objects. Ownership of the set of entries does not transfer to +this RArray object. + +The purpose of constructing an array in this way is to allow sorting and +finding operations to be done without further allocation of memory. + +@param aEntries A pointer to the first entry of type class TInt in the set of + entries belonging to the existing array. +@param aCount The number of entries in the existing array. +*/ + {} + +inline void RArray::GranularCompress() +/** +Compresses the array down to a granular boundary. + +After a call to this function, the memory allocated to the array is sufficient +for its contained entries. Adding new signed integers to the array does not +result in a re-allocation of memory until the total number of entries reaches +a multiple of the granularity. +*/ + {RPointerArrayBase::GranularCompress();} + + + + +inline TInt RArray::Reserve(TInt aCount) +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of integers specified. Adding new integers to the array +does not result in a re-allocation of memory until the the total number of +integers exceeds the specified count. + +@param aCount The number of integers for which space should be reserved +@return KErrNone If the operation completed successfully +@return KErrNoMemory If the requested amount of memory could not be allocated +*/ + { return RPointerArrayBase::DoReserve(aCount); } + + + + +inline void RArray::Sort() +/** +Sorts the array entries into signed integer order. +*/ + { HeapSortSigned(); } + + + + +inline TArray RArray::Array() const +/** +Constructs and returns a generic array. + +@return A generic array representing this array. + +@see TArray +*/ + { return TArray(GetCount,GetElementPtr,(const CBase*)this); } +#endif + + + +inline RArray::RArray() + : RPointerArrayBase() +/** +Default C++ constructor. + +This constructs an array object for an array of unsigned +integers with default granularity. + +The default granularity of the array is 8. +*/ + {} + + + + +inline RArray::RArray(TInt aGranularity) + : RPointerArrayBase(aGranularity) +/** +Constructs an array object for an array of unsigned integers with the specified +granularity. + +@param aGranularity The granularity of the array. + +@panic USER 127, if aGranularity is not positive or is greater than or + equal to 0x10000000. +*/ + {} + + + + +/** +C++ constructor with minimum growth step and exponential growth factor. + +This constructs an array object for an array of unsigned integers with the +specified minimum growth step and exponential growth factor. + +@param aMinGrowBy The minimum growth step of the array. Must be between 1 and + 65535 inclusive. +@param aFactor The factor by which the array grows, multiplied by 256. + For example 512 specifies a factor of 2. Must be between 257 + and 32767 inclusive. + +@panic USER 192, if aMinGrowBy<=0 or aMinGrowBy>65535. +@panic USER 193, if aFactor<=257 or aFactor>32767. +*/ +inline RArray::RArray(TInt aMinGrowBy, TInt aFactor) + : RPointerArrayBase(aMinGrowBy, aFactor) + {} + + + + +inline void RArray::Close() +/** +Closes the array and frees all memory allocated to the array. + +The function must be called before this array object goes out of scope. +*/ + {RPointerArrayBase::Close();} + + + + +inline TInt RArray::Count() const +/** +Gets the number of unsigned integers in the array. + +@return The number of unsigned integers in the array. +*/ + {return RPointerArrayBase::Count(); } + + + + +inline const TUint& RArray::operator[](TInt anIndex) const +/** +Gets a reference to the unsigned integer located at the specified position +within the array. + +The compiler uses this variant if the returned reference is used in an +expression where the reference cannot be modified. + +@param anIndex The position of the unsigned integer within the array, relative + to zero, i.e. zero implies the entry at the beginning of + the array. + +@return A reference to the const unsigned integer at position anIndex within + the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + entries currently in the array. +*/ + {return (const TUint&)At(anIndex);} + + + + +inline TUint& RArray::operator[](TInt anIndex) +/** +Gets a reference to the unsigned integer located at the specified position +within the array. + +The compiler uses this variant if the returned reference is used in an +expression where the reference can be modified. + +@param anIndex The position of the unsigned integer within the array, relative + to zero, i.e. zero implies the entry at the beginning of + the array. + +@return A reference to the non-const unsigned integer at position anIndex + within the array. + +@panic USER 130, if anIndex is negative, or is greater than the number of + entries currently in the array. +*/ + {return (TUint&)At(anIndex);} + + + + +inline TInt RArray::Append(TUint anEntry) +/** +Appends an unsigned integer onto the array. + +@param anEntry The unsigned integer to be appended. +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::Append((const TAny*)anEntry); } + + + + +inline TInt RArray::Insert(TUint anEntry, TInt aPos) +/** +Inserts an unsigned integer into the array at the specified position. + +@param anEntry The unsigned integer to be inserted. +@param aPos The position within the array where the unsigned integer is to + be inserted. The position is relative to zero, i.e. zero + implies that an entry is inserted at the beginning of + the array. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. + +@panic USER 131, if aPos is negative, or is greater than the number of entries + currently in the array. +*/ + { return RPointerArrayBase::Insert((const TAny*)anEntry,aPos); } + + + + +inline void RArray::Remove(TInt anIndex) +/** +Removes the unsigned integer at the specified position from the array. + +@param anIndex The position within the array from where the unsigned integer + is to be removed. The position is relative to zero, i.e. zero + implies that an entry at the beginning of the array is to be + removed. + + +@panic USER 130, if anIndex is negative, or is greater than the number of + entries currently in the array. +*/ + {RPointerArrayBase::Remove(anIndex);} + + + + +inline void RArray::Compress() +/** +Compresses the array down to a minimum. + +After a call to this function, the memory allocated to the array is just +sufficient for its entries. Subsequently adding a new unsigned integer to the +array always results in a re-allocation of memory. +*/ + {RPointerArrayBase::Compress();} + + + + +inline void RArray::Reset() +/** +Empties the array. + +It frees all memory allocated to the array and resets the +internal state so that it is ready to be reused. + +This array object can be allowed to go out of scope after a call to +this function. +*/ + {RPointerArrayBase::Reset();} + + + + +inline TInt RArray::Find(TUint anEntry) const +/** +Finds the first unsigned integer in the array which matches the specified +value, using a sequential search. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of entries in the array. + +@param anEntry The unsigned integer to be found. + +@return The index of the first matching unsigned integer within the array. + KErrNotFound, if no matching entry can be found. +*/ + { return RPointerArrayBase::Find((const TAny*)anEntry); } + + + + +inline TInt RArray::FindReverse(TUint anEntry) const +/** +Finds the last unsigned integer in the array which matches the specified +value, using a sequential search. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of entries in the array. + +@param anEntry The unsigned integer to be found. + +@return The index of the last matching unsigned integer within the array. + KErrNotFound, if no matching entry can be found. +*/ + { return RPointerArrayBase::FindReverse((const TAny*)anEntry); } + + + + +inline TInt RArray::FindInOrder(TUint anEntry) const +/** +Finds the unsigned integer in the array which matches the specified value, +using a binary search technique. + +The functions assume that existing entries within the array are in unsigned +integer order. + +@param anEntry The unsigned integer to be found. + +@return This is either: the index of the matching unsigned integer within the + array; + KErrNotFound, if no suitable entry can be found. +*/ + { return RPointerArrayBase::FindIsqUnsigned(anEntry); } + + + + +inline TInt RArray::FindInOrder(TUint anEntry, TInt& anIndex) const +/** +Finds the unsigned integer in the array which matches the specified value, +using a binary search technique. + +If the index cannot be found, the function returns the index of the last +unsigned integer within the array which logically precedes anEntry. + +The functions assume that existing entries within the array are in unsigned +integer order. + +@param anEntry The unsigned integer to be found. +@param anIndex A TInt supplied by the caller. On return, contains an index + value. + If the function returns KErrNone, this is the index of the + matching unsigned integer within the array. + If the function returns KErrNotFound, this is the index of the + first unsigned integer within the array that is bigger than the + unsigned integer being searched for - if no unsigned integers within + the array are bigger, then the index value is the same as the + total number of unsigned integers within the array. +@return KErrNone, if a matching unsigned integer is found. + KErrNotFound, if no suitable entry can be found. +*/ + { return RPointerArrayBase::BinarySearchUnsigned(anEntry,anIndex); } + + + + +inline TInt RArray::SpecificFindInOrder(TUint anEntry, TInt aMode) const +/** +Finds the unsigned integer in the array that matches the specified unsigned integer +using a binary search technique. + +In the case that there is more than one matching element, finds the first, last +or any match as specified by the value of aMode. + +The function assumes that the array is in unsigned integer order. + +@param anEntry The unsigned integer to be found.. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@return KErrNotFound, if there is no matching element, otherwise the array index of + a matching element - what the index refers to depends on the value of + aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::FindIsqUnsigned(anEntry,aMode); } + + + + +inline TInt RArray::SpecificFindInOrder(TUint anEntry, TInt& anIndex, TInt aMode) const +/** +Finds the unsigned integer in the array that matches the specified unsigned integer +using a binary search technique. + +In the case that there is more than one matching element, finds the first, last or any match as specified. + +The function assumes that the array is in unsigned integer order. + +@param anEntry The unsigned integer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an index + value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is the index + of the first element in the array that is bigger than the element being + searched for - if no elements in the array are bigger, then the index + value is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to depends + on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. +@param aMode Specifies whether to find the first match, the last match or any match, as defined by one + of the TArrayFindMode enum values. + +@return KErrNone, if a matching entry is found; KErrNotFound, if no matching entry exists. + +@see TArrayFindMode +*/ + { return RPointerArrayBase::BinarySearchUnsigned(anEntry,anIndex,aMode); } + + + + +inline TInt RArray::InsertInOrder(TUint anEntry) +/** +Inserts an unsigned integer into the array in unsigned integer order. + +No duplicate entries are permitted. The array remains unchanged following +an attempt to insert a duplicate entry. + +The function assumes that existing entries within the array are in unsigned +integer order. + +@param anEntry The unsigned integer to be inserted. + +@return KErrNone, if the insertion is successful; + KErrAlreadyExists, if an attempt is being made + to insert a duplicate entry; otherwise one of the other system wide + error codes. +*/ + { return RPointerArrayBase::InsertIsqUnsigned(anEntry,EFalse); } + + + + +inline TInt RArray::InsertInOrderAllowRepeats(TUint anEntry) +/** +Inserts an unsigned integer into the array in unsigned integer order, allowing +duplicates. + +If the new integer is a duplicate of an existing entry in the array, then +the new unsigned integer is inserted after the existing one. If more than +one duplicate entry already exists in the array, then any new duplicate +unsigned integer is inserted after the last one. + +The function assumes that existing entries within the array are in unsigned +integer order. + +@param anEntry The unsigned integer to be inserted. + +@return KErrNone, if the insertion is successful, otherwise one of the system + wide error codes. +*/ + { return RPointerArrayBase::InsertIsqUnsigned(anEntry,ETrue); } + + + + +#ifndef __KERNEL_MODE__ +inline RArray::RArray(TUint* aEntries, TInt aCount) + : RPointerArrayBase((TAny**)aEntries, aCount) +/** +C++ constructor with a pointer to the first array entry in a +pre-existing array, and the number of entries in that array. + +This constructor takes a pointer to a pre-existing set of entries of type +TUint objects. Ownership of the set of entries does not transfer to +this RArray object. + +The purpose of constructing an array in this way is to allow sorting and +finding operations to be done without further allocation of memory. + +@param aEntries A pointer to the first entry of type class TUint in the set of + entries belonging to the existing array. +@param aCount The number of entries in the existing array. +*/ + {} + + + +inline void RArray::GranularCompress() +/** +Compresses the array down to a granular boundary. + +After a call to this function, the memory allocated to the array is sufficient +for its contained entries. Adding new unsigned integers to the array does not +result in a re-allocation of memory until the total number of entries reaches +a multiple of the granularity. +*/ + {RPointerArrayBase::GranularCompress();} + + + + +inline TInt RArray::Reserve(TInt aCount) +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of integers specified. Adding new integers to the array +does not result in a re-allocation of memory until the the total number of +integers exceeds the specified count. + +@param aCount The number of integers for which space should be reserved +@return KErrNone If the operation completed successfully +@return KErrNoMemory If the requested amount of memory could not be allocated +*/ + { return RPointerArrayBase::DoReserve(aCount); } + + + + +inline void RArray::Sort() +/** +Sorts the array entries into unsigned integer order. +*/ + { HeapSortUnsigned(); } + + + + +inline TArray RArray::Array() const +/** +Constructs and returns a generic array. + +@return A generic array representing this array. + +@see TArray +*/ + { return TArray(GetCount,GetElementPtr,(const CBase*)this); } +#endif + + + + +/** +Sets an argument to default value and type. +*/ +inline void TIpcArgs::Set(TInt,TNothing) + {} + + + + +/** +Sets an argument value of TInt type. + +@param aIndex An index value that identifies the slot in the array of arguments + into which the argument value is to be placed. + This must be a value in the range 0 to 3. +@param aValue The argument value. +*/ +inline void TIpcArgs::Set(TInt aIndex,TInt aValue) + { + iArgs[aIndex] = aValue; + iFlags |= EUnspecified<<(aIndex*KBitsPerType); + } + + + + +/** +Sets an argument value of TAny* type. + +@param aIndex An index value that identifies the slot in the array of arguments + into which the argument value is to be placed. + This must be a value in the range 0 to 3. +@param aValue The argument value. +*/ +inline void TIpcArgs::Set(TInt aIndex,const TAny* aValue) + { + iArgs[aIndex] = (TInt)aValue; + iFlags |= EUnspecified<<(aIndex*KBitsPerType); + } + + + + +/** +Sets an argument value of RHandleBase type. + +@param aIndex An index value that identifies the slot in the array of arguments + into which the argument value is to be placed. + This must be a value in the range 0 to 3. +@param aValue The argument value. +*/ +inline void TIpcArgs::Set(TInt aIndex,RHandleBase aValue) + { + iArgs[aIndex] = (TInt)aValue.Handle(); + iFlags |= EHandle<<(aIndex*KBitsPerType); + } + + + + +/** +Sets an argument value TDesC8* type. + +@param aIndex An index value that identifies the slot in the array of arguments + into which the argument value is to be placed. + This must be a value in the range 0 to 3. +@param aValue The argument value. +*/ +inline void TIpcArgs::Set(TInt aIndex,const TDesC8* aValue) + { + iArgs[aIndex] = (TInt)aValue; + iFlags |= EDesC8<<(aIndex*KBitsPerType); + } + + + + +#ifndef __KERNEL_MODE__ + +/** +Sets an argument value of TDesC16* type. + +@param aIndex An index value that identifies the slot in the array of arguments + into which the argument value is to be placed. + This must be a value in the range 0 to 3. +@param aValue The argument value. +*/ +inline void TIpcArgs::Set(TInt aIndex,const TDesC16* aValue) + { + iArgs[aIndex] = (TInt)aValue; + iFlags |= EDesC16<<(aIndex*KBitsPerType); + } + +#endif + + + + +/** +Sets an argument value of TDes8* type. + +@param aIndex An index value that identifies the slot in the array of arguments + into which the argument value is to be placed. + This must be a value in the range 0 to 3. +@param aValue The argument value. +*/ +inline void TIpcArgs::Set(TInt aIndex,TDes8* aValue) + { + iArgs[aIndex] = (TInt)aValue; + iFlags |= EDes8<<(aIndex*KBitsPerType); + } + + + + +#ifndef __KERNEL_MODE__ + +/** +Sets an argument value of TDes16* type. + +@param aIndex An index value that identifies the slot in the array of arguments + into which the argument value is to be placed. + This must be a value in the range 0 to 3. +@param aValue The argument value. +*/ +inline void TIpcArgs::Set(TInt aIndex,TDes16* aValue) + { + iArgs[aIndex] = (TInt)aValue; + iFlags |= EDes16<<(aIndex*KBitsPerType); + } + +#endif + + + + +inline TIpcArgs::TArgType TIpcArgs::Type(TNothing) + { return EUnspecified; } +inline TIpcArgs::TArgType TIpcArgs::Type(TInt) + { return EUnspecified; } +inline TIpcArgs::TArgType TIpcArgs::Type(const TAny*) + { return EUnspecified; } +inline TIpcArgs::TArgType TIpcArgs::Type(RHandleBase) + { return EHandle; } +inline TIpcArgs::TArgType TIpcArgs::Type(const TDesC8*) + { return EDesC8; } +#ifndef __KERNEL_MODE__ +inline TIpcArgs::TArgType TIpcArgs::Type(const TDesC16*) + { return EDesC16; } +#endif +inline TIpcArgs::TArgType TIpcArgs::Type(TDes8*) + { return EDes8; } +#ifndef __KERNEL_MODE__ +inline TIpcArgs::TArgType TIpcArgs::Type(TDes16*) + { return EDes16; } +#endif +inline void TIpcArgs::Assign(TInt&,TIpcArgs::TNothing) + {} +inline void TIpcArgs::Assign(TInt& aArg,TInt aValue) + { aArg = aValue; } +inline void TIpcArgs::Assign(TInt& aArg,const TAny* aValue) + { aArg = (TInt)aValue; } +inline void TIpcArgs::Assign(TInt& aArg,RHandleBase aValue) + { aArg = (TInt)aValue.Handle(); } +inline void TIpcArgs::Assign(TInt& aArg,const TDesC8* aValue) + { aArg = (TInt)aValue; } +#ifndef __KERNEL_MODE__ +inline void TIpcArgs::Assign(TInt& aArg,const TDesC16* aValue) + { aArg = (TInt)aValue; } +#endif +inline void TIpcArgs::Assign(TInt& aArg,TDes8* aValue) + { aArg = (TInt)aValue; } +#ifndef __KERNEL_MODE__ +inline void TIpcArgs::Assign(TInt& aArg,TDes16* aValue) + { aArg = (TInt)aValue; } +#endif + + + +// Structures for passing 64 bit integers and doubles across GCC/EABI boundaries + +inline SInt64::SInt64() + {} + +inline SInt64::SInt64(Int64 a) + { + iData[0] = (TUint32)((Uint64)a); + iData[1] = (TUint32)(((Uint64)a)>>32); + } + +inline SInt64& SInt64::operator=(Int64 a) + { + iData[0] = (TUint32)((Uint64)a); + iData[1] = (TUint32)(((Uint64)a)>>32); + return *this; + } + +inline SInt64::operator Int64() const + { + Int64 x; + TUint32* px = (TUint32*)&x; + px[0] = iData[0]; + px[1] = iData[1]; + return x; + } + +inline SUint64::SUint64() + {} + +inline SUint64::SUint64(Uint64 a) + { + iData[0] = (TUint32)a; + iData[1] = (TUint32)(a>>32); + } + +inline SUint64& SUint64::operator=(Uint64 a) + { + iData[0] = (TUint32)a; + iData[1] = (TUint32)(a>>32); + return *this; + } + +inline SUint64::operator Uint64() const + { + Uint64 x; + TUint32* px = (TUint32*)&x; + px[0] = iData[0]; + px[1] = iData[1]; + return x; + } + +inline SDouble::SDouble() + {} + +inline SDouble::SDouble(TReal a) + { + const TUint32* pa = (const TUint32*)&a; +#ifdef __DOUBLE_WORDS_SWAPPED__ + iData[0] = pa[1]; + iData[1] = pa[0]; // compiler puts MS word of double first +#else + iData[0] = pa[0]; + iData[1] = pa[1]; // compiler puts MS word of double second +#endif + } + +inline SDouble& SDouble::operator=(TReal a) + { + new (this) SDouble(a); + return *this; + } + +inline SDouble::operator TReal() const + { + TReal x; + TUint32* px = (TUint32*)&x; +#ifdef __DOUBLE_WORDS_SWAPPED__ + px[1] = iData[0]; + px[0] = iData[1]; // compiler puts MS word of double first +#else + px[0] = iData[0]; + px[1] = iData[1]; // compiler puts MS word of double second +#endif + return x; + } + +// +// TSecureId +// + +/** Default constructor. This leaves the object in an undefined state */ +inline TSecureId::TSecureId() + {} + +/** Construct 'this' using a TUint32 +@param aId The value for the ID */ +inline TSecureId::TSecureId(TUint32 aId) + : iId(aId) {} + +/** Convert 'this' into a TUint32 +*/ +inline TSecureId::operator TUint32() const + { return iId; } + +/** Construct 'this' using a TUid +@param aId The value for the ID */ +inline TSecureId::TSecureId(TUid aId) + : iId(aId.iUid) {} + +/** Convert 'this' into a TUid +*/ +inline TSecureId::operator TUid() const + { return (TUid&)iId; } + +// +// SSecureId +// +inline const TSecureId* SSecureId::operator&() const + { return (const TSecureId*)this; } +inline SSecureId::operator const TSecureId&() const + { return (const TSecureId&)iId; } +inline SSecureId::operator TUint32() const + { return iId; } +inline SSecureId::operator TUid() const + { return (TUid&)iId; } + +// +// TVendorId +// + +/** Default constructor which leaves the object in an undefined state */ +inline TVendorId::TVendorId() + {} + +/** Construct 'this' using a TUint32 +@param aId The value for the ID */ +inline TVendorId::TVendorId(TUint32 aId) + : iId(aId) {} + +/** Convert 'this' into a TUint32 +*/ +inline TVendorId::operator TUint32() const + { return iId; } + +/** Construct 'this' using a TUid +@param aId The value for the ID */ +inline TVendorId::TVendorId(TUid aId) + : iId(aId.iUid) {} + +/** Convert 'this' into a TUid +*/ +inline TVendorId::operator TUid() const + { return (TUid&)iId; } + +// +// SSecureId +// +inline const TVendorId* SVendorId::operator&() const + { return (const TVendorId*)this; } +inline SVendorId::operator const TVendorId&() const + { return (const TVendorId&)iId; } +inline SVendorId::operator TUint32() const + { return iId; } +inline SVendorId::operator TUid() const + { return (TUid&)iId; } + +// +// TSharedChunkBufConfigBase +// +inline TSharedChunkBufConfigBase::TSharedChunkBufConfigBase() + {memset(this,0,sizeof(TSharedChunkBufConfigBase));} + +/** +Default constructor. This leaves the set in an undefned state. +*/ +inline TCapabilitySet::TCapabilitySet() + {} + +/** +Construct a set consisting of a single capability. +@param aCapability The single capability +*/ +inline TCapabilitySet::TCapabilitySet(TCapability aCapability) + { new (this) TCapabilitySet(aCapability, aCapability); } + +/** +Make this set consist of a single capability. +@param aCapability The single capability. +*/ +inline void TCapabilitySet::Set(TCapability aCapability) + { new (this) TCapabilitySet(aCapability, aCapability); } + +/** +Make this set consist of two capabilities. +@param aCapability1 The first capability. +@param aCapability2 The second capability. +*/ +inline void TCapabilitySet::Set(TCapability aCapability1, TCapability aCapability2) + { new (this) TCapabilitySet(aCapability1, aCapability2); } + + +/** +Default constructor. This leaves the object in an undefned state. +*/ +inline TSecurityInfo::TSecurityInfo() + {} + +/** Constructs a TSecurityPolicy that will always fail, irrespective of the +checked object's attributes. +*/ +inline TSecurityPolicy::TSecurityPolicy() + { new (this) TSecurityPolicy(EAlwaysFail); } + +/** +'Address of' operator which generates a TSecurityPolicy* +@return A pointer of type TSecurityPolicy which refers to this object +*/ +inline const TSecurityPolicy* TStaticSecurityPolicy::operator&() const + { return (const TSecurityPolicy*)this; } + +/** +'Reference of' operator which generates a TSecurityPolicy& +@return A reference of type TSecurityPolicy which refers to this object +*/ +inline TStaticSecurityPolicy::operator const TSecurityPolicy&() const + { return *(const TSecurityPolicy*)this; } + +/** +A method to explicity generate a TSecurityPolicy reference. +@return A reference of type TSecurityPolicy which refers to this object +*/ +inline const TSecurityPolicy& TStaticSecurityPolicy::operator()() const + { return *(const TSecurityPolicy*)this; } + +#ifdef __KERNEL_MODE__ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The DProcess object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(DProcess* aProcess, const char* aDiagnostic) const + { + return DoCheckPolicy(aProcess, aDiagnostic); + } + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(DThread* aThread, const char* aDiagnostic) const + { + return DoCheckPolicy(aThread, aDiagnostic); + } + +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The DProcess object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(DProcess* aProcess, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoCheckPolicy(aProcess); + } + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic KERN-COMMON 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(DThread* aThread, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoCheckPolicy(aThread); + } + +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ +#endif // __KERNEL_MODE__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32cmn_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32cmn_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,66 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32cmn_private.h +// +// + +#ifndef __E32CMN_PRIVATE_H__ +#define __E32CMN_PRIVATE_H__ +#include +#include + +#include +#include +#ifndef __KERNEL_MODE__ +#include +#include +#endif + + +/** +@internalTechnology +*/ +struct SRAllocatorBurstFail {TInt iBurst; TInt iRate; TInt iUnused[2];}; + +/** +@internalTechnology +*/ +typedef TBuf TKName; + +/** +@internalTechnology +*/ +typedef TBuf TInfoName; + +/** +@internalComponent +*/ +typedef TBuf TDeviceInfo; + +/** +@internalComponent +*/ +typedef TBuf TPassword; + +/** Default value to clear all data to committed to a chunk to. +@see TChunkCreateInfo::SetClearByte() +@see RChunk::Create() +@internalComponent +*/ +const TUint8 KChunkClearByteDefault = 0x3; + +/**@internalComponent */ +const TUint32 KEmulatorImageFlagAllowDllData = 0x01; + +#endif //__E32CMN_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32cons.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32cons.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,243 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32cons.h +// +// + +#ifndef __E32CONS_H__ +#define __E32CONS_H__ +#include +#include +// + +/** +@publishedAll +@released + +Defines a default console width that can be used when creating a console. + +@see CConsoleBase::Create() +*/ +const TInt KDefaultConsWidth=78; + +/** +@publishedAll +@released + +Defines a default console height that can be used when creating a console. + +@see CConsoleBase::Create() +*/ +const TInt KDefaultConsHeight=18; + +/** +@publishedAll +@released + +Implies a full size screen console when passed as the width and height +values when creating a console. + +@see CConsoleBase::Create() +*/ +const TInt KConsFullScreen=-1; + + +/** +@publishedAll +@released + +Defines a set of text attributes used for consoles that support colour. + +@see CColorConsoleBase::SetTextAttribute(). +*/ +enum TTextAttribute + { + ETextAttributeNormal, /**< Defines the normal text attribute. */ + ETextAttributeBold, /**< Defines the bold text attribute. */ + ETextAttributeInverse, /**< Defines the inverse text attribute. */ + ETextAttributeHighlight/**< Defines the highlight text attribute.*/ + }; + + +/** +@publishedAll +@released + +A base class that defines a console interface. +*/ +class CConsoleBase : public CBase + { +public: + IMPORT_C virtual ~CConsoleBase(); + IMPORT_C TKeyCode Getch(); + IMPORT_C void Printf(TRefByValue aFmt,...); + IMPORT_C void SetPos(TInt aX); + IMPORT_C void SetPos(TInt aX,TInt aY); + IMPORT_C TInt WhereX() const; + IMPORT_C TInt WhereY() const; +// Pure virtual + + + /** + Creates a new console window. + + @param aTitle The title text for the console. + This should not be longer than 256 characters. + @param aSize The size of the console window. + + @return KErrNone, if successful; otherwise one of the other + system wide error codes. + */ + virtual TInt Create(const TDesC &aTitle,TSize aSize) =0; + + + /** + Gets a keystroke from the console window, asynchronously. + + @param aStatus The request status object. + */ + virtual void Read(TRequestStatus &aStatus) =0; + + + /** + Cancels any outstanding request to get a keystroke from the console window. + */ + virtual void ReadCancel() =0; + + + /** + Writes the content of the specified descriptor to the console window. + + @param aDes Descriptor containing the characters to be written to + the console window. + */ + virtual void Write(const TDesC &aDes) =0; + + + /** + Gets the current cursor position relative to the console window. + + @return The current cursor position. + */ + virtual TPoint CursorPos() const =0; + + + /** + Puts the cursor at the absolute position in the window. + + @param aPoint The cursor position. + */ + virtual void SetCursorPosAbs(const TPoint &aPoint) =0; + + + /** + Puts the cursor at the specified position relative + to the current cursor position. + + @param aPoint The cursor position. + */ + virtual void SetCursorPosRel(const TPoint &aPoint) =0; + + + /** + Sets the percentage height of the cursor. + + @param aPercentage The percentage height. This is a value from 0 to 100. + If 0 is specified, then no cursor is displayed. + */ + virtual void SetCursorHeight(TInt aPercentage) =0; + + + /** + Sets a new console title. + + @param aTitle The title text for the console. + This should not be longer than 256 characters. + */ + virtual void SetTitle(const TDesC &aTitle) =0; + + + /** + Clears the console. + */ + virtual void ClearScreen() =0; + + + /** + Clears the console from the current cursor position to + the end of the line. + */ + virtual void ClearToEndOfLine() =0; + + + /** + Gets the size of the console. + */ + virtual TSize ScreenSize() const =0; + + + /** + Gets the current key code value. + + @return The key code value. + */ + virtual TKeyCode KeyCode() const =0; + + /** + Gets the current key modifiers. + + @return The key modifiers. + */ + virtual TUint KeyModifiers() const =0; +protected: + IMPORT_C CConsoleBase(); +protected: + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); + }; + + +class CProxyConsole; + +/** +@publishedAll +@released + +Adds colour support to the basic console interface. +*/ +class CColorConsoleBase : public CConsoleBase + { +public: + + /** + Sets the text attribute as defined by TTextAttribute. + + @param anAttribute The text attribute to be set. + */ + virtual void SetTextAttribute(TTextAttribute /*anAttribute*/); +protected: + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); + + friend class CProxyConsole; + }; +// + +/** +@publishedAll +@released +*/ +extern "C" { +IMPORT_C TAny *NewConsole(); +} +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32const.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32const.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,3131 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32const.h +// +// + +#ifndef __E32CONST_H__ +#define __E32CONST_H__ + +#include +#include + + + +/** +@publishedAll +@released + +The default width value used when appending and justifying data +in a descriptor. + +@see TDes16::AppendJustify() +@see TDes16::Justify() +@see TDes8::AppendJustify() +@see TDes8::Justify() +*/ +const TInt KDefaultJustifyWidth=(-1); + + + +/** +@publishedAll +@released + +Defines the number of TUids that form a TUidType. + +@see TUid +@see TUidType +*/ +const TInt KMaxCheckedUid=3; + + +/** +@publishedAll +@released + +Defines the number of 32-bit debug trace mask words. + +*/ +const TInt KNumTraceMaskWords = 8; + + +/** +@publishedAll +@released + +Defines the maximum length for the text form of a UID name. + +@see TUidName +@see TUid::Name() +*/ +const TInt KMaxUidName=10; + + + + +/** +@publishedAll +@released + +Defines the maximum length of a module name. +*/ +const TInt KMaxModuleVersionName=10; + + + + +/** +@publishedAll +@released + +Defines the maximum length of the name of a reference counted object. + +@see TName +*/ +const TInt KMaxName=0x80; + + + + +/** +@publishedAll +@released + +Defines the maximum length of the name of a reference counted kernel-side object. +*/ +const TInt KMaxKernelName=0x50; + + + + +/** +@publishedAll +@released + +Defines the maximum size of a process name. +*/ +const TInt KMaxProcessName=(KMaxKernelName-KMaxUidName-KMaxModuleVersionName-4); + + + + +/** +@publishedAll +@released + +Defines the maximum size of a library name. +*/ +const TInt KMaxLibraryName=(KMaxKernelName-KMaxUidName-KMaxModuleVersionName); + + + + +/** +@publishedAll +@released + +Defines the maximum length of a TInfoName object. +*/ +const TInt KMaxInfoName=0x10; + + + + +/** +@publishedAll +@released + +Defines the maximum length of the full name of a reference counted object. + +@see TFullName +*/ +const TInt KMaxFullName=(KMaxName<<1); + + + + +/** +@publishedAll +@released + +The maximum length for a password buffer. + +@see TPassword +*/ +const TInt KMaxPassword=0x10; + + + + +/** +@publishedAll +@released + +The maximum length of a category name. + +@see TExitCategoryName +*/ +const TInt KMaxExitCategoryName=0x10; + + + + +/** +@publishedAll +@released + +The maximum length of the full text name for a day of the week. + +@see TDayName +*/ +const TInt KMaxDayName=0x20; + + + + +/** +@publishedAll +@released + +The maximum length of the abbreviated text name for a day of the week. + +@see TDayNameAbb +*/ +const TInt KMaxDayNameAbb=0x08; + + + + +/** +@publishedAll +@released + +Defines the maximum size of arrays or data structures required +to hold the names of the days of the week. +*/ +const TInt KMaxDays=7; + + + + +/** +@publishedAll +@released + +The maximum length of the full text name for a month. + +@see TDayName +*/ +const TInt KMaxMonthName=0x20; + + + + +/** +@publishedAll +@released + +The maximum length of the abbreviated text name for a month. + +@see TMonthNameAbb +*/ +const TInt KMaxMonthNameAbb=0x08; + + + + +/** +@publishedAll +@released + +Defines the maximum size of arrays or data structures required +to hold the names of the months of the year. +*/ +const TInt KMaxMonths=12; + + + + +/** +@publishedAll +@released + +The maximum length of the text for a date suffix. + +@see TDateSuffix +*/ +const TInt KMaxSuffix=0x04; + + + + +/** +@publishedAll +@released + +Defines the maximum size of arrays and data structures required +to hold date suffix strings. +*/ +const TInt KMaxSuffixes=31; + + + + +/** +@publishedAll +@released + +The maximum length of the text for AM and PM. + +@see TAmPmName +*/ +const TInt KMaxAmPmName=0x04; + + + + +/** +@publishedAll +@released + +Defines the maximum size of arrays and data structures required +to hold am/pm strings. +*/ +const TInt KMaxAmPms=2; + + + + +/** +@publishedAll +@released + +Defines the maximum number of date separator characters in a date string. +*/ +const TInt KMaxDateSeparators=4; + + + + +/** +@publishedAll +@released + +Defines the maximum number of time separator characters in a time string. +*/ +const TInt KMaxTimeSeparators=4; + + + + +/** +@publishedAll +@released + +Defines the maximum size of data structures to hold the translate tables +for Western European alphabetic conversions. +*/ +const TInt KMaxTranslateTable=0x100; + + + + +/** +@publishedAll +@released + +The maximum length of the text for a currency symbol. + +@see TCurrencySymbol +*/ +const TInt KMaxCurrencySymbol=0x08; + + + + +/** +@publishedAll +@released + +The maximum length of the short date format specification text. + +@see TShortDateFormatSpec +*/ +const TInt KMaxShortDateFormatSpec=40; + + + + +/** +@publishedAll +@released + +The maximum length of the short date format specification text. + +@see TLongDateFormatSpec +*/ +const TInt KMaxLongDateFormatSpec=80; + + + + +/** +@publishedAll +@released + +The maximum length of the time string formatting commands. + +@see TTimeFormatSpec +*/ +const TInt KMaxTimeFormatSpec=60; + + + + +/** +@publishedAll +@released + +Defines the maximum length of a filename. +*/ +const TInt KMaxFileName=0x100; + + + + +/** +@publishedAll +@released + +The maximum length of the character representation of version information. + +@see TVersion::Name() +*/ +const TInt KMaxVersionName=0x10; + + + + +/** +@publishedAll +@released + +Defines the maximum length of a path. + +@see TPath +*/ +const TInt KMaxPath=0x100; + + + + +/** +@publishedAll +@released + +Defines the maximum length of a TDeviceInfo object. + +@see TDeviceInfo +*/ +const TInt KMaxDeviceInfo=0x80; + + + + +/** +@publishedAll +@released + +The maximum size of the password required to unlock a media drive. +*/ +const TInt KMaxMediaPassword=16; + + + + +/** +@publishedAll +@released + +Defines the minimum size of a new heap. + +Functions that require a new heap to be allocated will either panic, +or will reset the required heap size to this value if a smaller heap +size is specified. + +@see UserHeap +@see RThread::Create() +*/ +const TInt KMinHeapSize=0x100; + + + + +/** +@publishedAll +@released + +Not used by Symbian OS. +*/ +const TInt KDstHome=0x01; + + + + +/** +@publishedAll +@released + +Not used by Symbian OS. +*/ +const TInt KDstEuropean=0x02; + + + + +/** +@publishedAll +@released + +Not used by Symbian OS. +*/ +const TInt KDstNorthern=0x04; + + + + +/** +@publishedAll +@released + +Not used by Symbian OS. +*/ +const TInt KDstSouthern=0x08; + + + + +/** +@publishedAll +@released + +A default stack size that can be used when creating threads. +*/ +#ifdef __X86GCC__ +const TInt KDefaultStackSize=0x4000; +#else +const TInt KDefaultStackSize=0x2000; +#endif // __X86GCC__ + + + + +/** +@publishedAll +@released + +Indicates an undefined character, used internally when formatting text. +*/ +const TUint KNoChar=0xffffffffu; + + + + +/** +@publishedAll +@released + +Defines an index value that is interpreted by the TKey class, +and derived classes, as having a specific meaning. + +@see TKey::SetPtr() +@see TKey::At() +*/ +const TInt KIndexPtr=(-1); + + + + +/** +@publishedAll +@released + +A flag used by the kernel to mark a handle as not being closable. +*/ +const TInt KHandleNoClose=0x00008000; + + + + +/** +@publishedAll +@released + +A flag used by the kernel to mark a handle as being local. +*/ +const TInt KHandleFlagLocal=0x40000000; + + + + +/** +@publishedAll +@released + +A flag used by the Kernel to indicate the current process. +*/ +const TInt KCurrentProcessHandle=0xffff0000|KHandleNoClose; + + + + +/** +@publishedAll +@released + +A flag used by the Kernel to indicate the current thread. +*/ +const TInt KCurrentThreadHandle=0xffff0001|KHandleNoClose; + + + + +/** +@publishedAll +@released + +Defines a handle number value of zero. + +@see RHandleBase +*/ +const TInt KNullHandle=0; + + + + +/** +@publishedAll +@released + +Defines a default unit. Not generally used by Symbian OS. +*/ +const TInt KDefaultUnit=0x00; + + + + +/** +@publishedAll +@released + +The device unit that must be passed in a call +to RBusLogicalChannel::DoCreate(), if units are not permitted. + +@see RBusLogicalChannel +*/ +const TInt KNullUnit=0xffffffff; + + + + +/** +@publishedAll +@released + +The maximum unit number that can be passed in a call +to RBusLogicalChannel::DoCreate(). + +@see RBusLogicalChannel +*/ +const TInt KMaxUnits=0x20; + + + + +/** +@publishedAll +@released + +Defines the maximum number of message arguments that can be passed +across the user side/kernel side boundary. +*/ +const TInt KMaxMessageArguments=0x04; + + + + +/** +@publishedAll +@released + +The default width of the character representation of a real number, used by +the default constructor of a TRealFormat object and the formatting functions +of descriptors. + +@see TRealFormat +@see TDes16::AppendFormat() +@see TDes8::AppendFormat() +*/ +const TInt KDefaultRealWidth=20; + + + + +/** +@publishedAll +@released + +The default value used by UserHeap::ChunkHeap() for defining increments to +the size of a chunk, when no explicit value specified by the caller. + +@see UserHeap::ChunkHeap() +*/ +const TInt KMinHeapGrowBy=0x1000; + + + + +/** +@publishedAll +@released + +Not used by Symbian OS. +*/ +const TInt KMaxExponentConversion=99; + + + + +/** +@publishedAll +@released + +Defines a Null UID value. + +@see TUid +*/ +const TInt KNullUidValue=0; + + + + +/** +@publishedAll +@deprecated + +The timer granularity used by a CDeltaTimer object is +now the tick period and this constant is obsolete. + +@see CDeltaTimer +*/ +const TInt KDeltaTimerDefaultGranularity=100000; + + + + +/** +@publishedAll +@released + +The largest possible value for a TInt8. +*/ +const TInt KMaxTInt8=0x7f; + + + + +/** +@publishedAll +@released + +The smallest possible value for a TInt8. +*/ +const TInt KMinTInt8=(-128); + + + + +/** +@publishedAll +@released + +The largest possible value for a TUint8. +*/ +const TUint KMaxTUint8=0xffu; + + + + +/** +@publishedAll +@released + +The largest possible value for a TInt16. +*/ +const TInt KMaxTInt16=0x7fff; + + + + +/** +@publishedAll +@released + +The smallest possible value for a TInt16. +*/ +const TInt KMinTInt16=(-32768); + + + + +/** +@publishedAll +@released + +The largest possible value for a TUint16. +*/ +const TUint KMaxTUint16=0xffffu; + + + + +/** +@publishedAll +@released + +The largest possible value for a TInt32. +*/ +const TInt KMaxTInt32=0x7fffffff; + + + + +/** +@publishedAll +@released + +The smallest possible value for a TInt32. +*/ +const TInt KMinTInt32=(TInt)0x80000000; + + + + +/** +@publishedAll +@released + +The largest possible value for a TUint32. +*/ +const TUint KMaxTUint32=0xffffffffu; + + + + +/** +@publishedAll +@released + +The largest possible value for a TInt. +*/ +const TInt KMaxTInt=0x7fffffff; + + + + +/** +@publishedAll +@released + +The smallest possible value for a TInt. +*/ +const TInt KMinTInt=(TInt)0x80000000; + + + + +/** +@publishedAll +@released + +The largest possible value for a TUint. +*/ +const TUint KMaxTUint=0xffffffffu; + + + + +/** +@publishedAll +@released + +The largest possible value for a TInt64. +*/ +const TInt64 KMaxTInt64 = I64LIT(0x7fffffffffffffff); + + + + +/** +@publishedAll +@released + +The smallest possible value for a TInt64. +*/ +const TInt64 KMinTInt64 = UI64LIT(0x8000000000000000); + + + + +/** +@publishedAll +@released + +The largest possible value for a TUint64. +*/ +const TUint64 KMaxTUint64 = UI64LIT(0xffffffffffffffff); + + + + +/** +@publishedAll +@released + +Defines the character *, and represents any number of characters in any +part of a path component, filename or extension. + +It is used in a TParse file specification. + +@see TParse +*/ +const TUint KMatchAny='*'; + + + + +/** +@publishedAll +@released + +Defines the character ?, and represents a single character in +a path component, filename or extension. + +It is used in a TParse file specification. + +@see TParse +*/ +const TUint KMatchOne='?'; + + + + +/** +@publishedAll +@released + +Defines the maximum number of local drives. +*/ +const TInt KMaxLocalDrives=16; + + + + +/** +@publishedAll +@released + +Defines the maximum number of peripheral bus sockets. +*/ +const TInt KMaxPBusSockets=4; + + + + +/** +@publishedAll +@released + +Not used by Symbian OS. +*/ +const TInt KNoCallEntryPoint = 0x01; + + + + +/** +@publishedAll +@released + +The value to which CActive::iStatus is set by an active object's +service provider before the service provider initiates an asynchronous request. + +@see CActive +*/ +const TInt KRequestPending=(-KMaxTInt); + + + + +// Drive capabilities + +/** +@publishedAll +@released + +Defines the possible media types. +*/ +enum TMediaType + { + EMediaNotPresent, + + EMediaUnknown, + + EMediaFloppy, + + /** Solid-state media. */ + EMediaHardDisk, + + EMediaCdRom, + + EMediaRam, + + EMediaFlash, + + EMediaRom, + + EMediaRemote, + + EMediaNANDFlash, + + /** Rotating media. */ + EMediaRotatingMedia + }; + + + + +/** +@publishedAll +@released + +Defines the state of a battery, if supported. +*/ +enum TBatteryState {EBatNotSupported,EBatGood,EBatLow}; + + + + +/** +@publishedAll +@released + +Drive attribute - drive is local. +*/ +const TUint KDriveAttLocal=0x01; + + + + +/** +@publishedAll +@released + +Drive attribute - ROM drive. +*/ +const TUint KDriveAttRom=0x02; + + + + +/** +@publishedAll +@released + +Drive attribute - output from a process on one drive is redirected +to another drive. +*/ +const TUint KDriveAttRedirected=0x04; + + + + +/** +@publishedAll +@released + +Drive attribute - drive letter has been substituted (assigned a path). +*/ +const TUint KDriveAttSubsted=0x08; + + + + +/** +@publishedAll +@released + +Drive attribute - drive is internal (not removable). +*/ +const TUint KDriveAttInternal=0x10; + + + + +/** +@publishedAll +@released + +Drive attribute - drive is removable. +*/ +const TUint KDriveAttRemovable=0x20; + + + + +/** +@publishedAll +@released + +Drive attribute - drive is remote. +*/ +const TUint KDriveAttRemote=0x40; + + + + +/** +@publishedAll +@released + +Drive attribute -. +*/ +const TUint KDriveAttTransaction=0x80; + + +/** +@publishedAll +@released + +Drive attribute - drive is used for paging. +*/ +const TUint KDriveAttPageable=0x100; + + + +/** +@publishedAll +@released + +Drive attribute - drive is logically removable (can be taken offline from Symbian OS). +If not logically removable then physically removable e.g. a card can be take out. +*/ +const TUint KDriveAttLogicallyRemovable=0x200; + + +/** +@publishedAll +@released + +Drive attribute - drive is hidden. +A drive which has its hidden attribute set would be excluded from the list of available drives. +*/ +const TUint KDriveAttHidden=0x400; + + +/** +@publishedAll +@released + +Drive attribute - It can be set in a search in order to instruct that all drives should be returned. +*/ +const TUint KDriveAttAll=0x100000; + + +/** +@publishedAll +@released + +Drive attribute - It can be set in combination with other drive attributes in order to exclude during a drive search, drives with +these attributes set. +*/ +const TUint KDriveAttExclude=0x40000; + + + +/** +@publishedAll +@released + +Drive attribute - It can be set in combination with other drive attributes in order to search and return exclusively drives with these attributes set. +*/ +const TUint KDriveAttExclusive=0x80000; + + + +/** +@internalTechnology + +Used as a mask in order to extract the actual drive attributes. + +*/ +const TUint KDriveAttMatchedFlags=0xFFF; + + + +/** +@internalTechnology + +Used as a mask in order to extract the extra(ex KDriveAttAll ,KDriveAttExclude, KDriveAttExclusive ,0) drive attributes. +*/ +const TUint KDriveAttMatchedAtt=0x0FFF0000; + + + + +/** +@publishedAll +@released + +Media attribute - the media capacity can change over time. +*/ +const TUint KMediaAttVariableSize=0x01; + + + + +/** +@publishedAll +@released + +Media attribute - media is dual density. +*/ +const TUint KMediaAttDualDensity=0x02; + + + + +/** +@publishedAll +@released + +Media attribute - media is formattable. +*/ +const TUint KMediaAttFormattable=0x04; + + + + +/** +@publishedAll +@released + +Media attribute - media is write-protected. +*/ +const TUint KMediaAttWriteProtected=0x08; + + + + +/** +@publishedAll +@released + +Media attribute - media is lockable; this is provided for +lockable multi-media cards +*/ +const TUint KMediaAttLockable=0x10; + + + + +/** +@publishedAll +@released + +Media attribute - media is locked; this is provided for +lockable multi-media cards +*/ +const TUint KMediaAttLocked=0x20; + + + +/** +@publishedAll +@released + +Media attribute - media has password. +*/ +const TUint KMediaAttHasPassword=0x40; + +/** +@publishedAll +@released +*/ +const TUint KMediaAttReadWhileWrite=0x80; + +/** +@publishedAll +@released + +Media attribute - media supports TBusLocalDrive::DeleteNotify() +*/ +const TUint KMediaAttDeleteNotify=0x100; + +/** +@publishedAll +@released + +Media attribute - media supports paging +*/ +const TUint KMediaAttPageable=0x200; + + + +/** +@publishedAll +@released + +Identifies a FAT file system +*/ +const TUint KDriveFileSysFAT=0x01; + + + + +/** +@publishedAll +@released + +Identifies a ROM file system. +*/ +const TUint KDriveFileSysROM=0x02; + + + + +/** +@publishedAll +@released + +Identifies an LFFS file system. +*/ +const TUint KDriveFileSysLFFS=0x03; + + + + +/** +@publishedAll +@released + +Identifies a read-only file system. +*/ +const TUint KDriveFileSysROFS=0x04; + + + + +/** +@publishedAll +@released + +Identifies a non-file system. That is a partition without any file system layer. +*/ +const TUint KDriveFileNone=0x05; + + + + +/** +@publishedAll +@released + +An enumerator with a single enumeration value that defines the Boolean value +false in Symbian OS. + +@see TBool +*/ +enum TFalse { + /** + Defines the value false that is passed to a TBool type. + */ + EFalse=FALSE + }; + + + + +/** +@publishedAll +@released + +An enumerator with a single enumeration value that defines the Boolean value +true in Symbian OS. + +@see TBool +*/ +enum TTrue { + /** + Defines the value true that is passed to a TBool type. + */ + ETrue=TRUE + }; + + + + +/** +@publishedAll +@released + +Defines flags that can be used to indicate whether duplicates, for example in +a list, are allowed. +*/ +enum TAllowDuplicates { + /** + No duplicates allowed. + */ + ENoDuplicates, + + /** + Duplicates allowed. + */ + EAllowDuplicates + }; + + + + +/** +@publishedAll +@released + +An enumeration whose enumerators determine the number system to be used +when converting numbers into a character format. + +@see TDes8::Num() +@see TDes8::NumUC() +@see TDes8::AppendNum() +@see TDes8::AppendNumUC() +@see TDes16::Num() +@see TDes16::NumUC() +@see TDes16::AppendNum() +@see TDes16::AppendNumUC() +*/ +enum TRadix { + /** + Convert number into binary character representation. + */ + EBinary=2, + /** + Convert number into octal character representation. + */ + EOctal=8, + /** + Convert number into decimal character representation. + */ + EDecimal=10, + /** + Convert number into hexadecimal character representation. + */ + EHex=16 + }; + + + + + +/** +@publishedAll +@released + +The mask for the dialect bits +*/ +const TUint KDialectMask=0x03FF; + + + + + +/** +@publishedAll +@released + +Defines the date formats. +*/ +enum TDateFormat { + /** + US format (mm/dd/yyyy) + */ + EDateAmerican, + + /** + European format (dd/mm/yyyy) + */ + EDateEuropean, + + /** + Japanese format (yyyy/mm/dd) + */ + EDateJapanese}; + + + + +/** +@publishedAll +@released + +Defines the time formats as either 12 hour or 24 hour. +*/ +enum TTimeFormat { + ETime12, + ETime24 + }; + + + + +/** +@publishedAll +@released + +Defines the clock display formats, as either analog or digital. +*/ +enum TClockFormat { + EClockAnalog, + EClockDigital + }; + + + + +/** +@publishedAll +@released + +Enumerates the units of measurement as either Imperial or Metric. +*/ +enum TUnitsFormat { + EUnitsImperial, + EUnitsMetric + }; + + + + +/** +@publishedAll +@released + +Identifies a time as being am or pm. +*/ +enum TAmPm { + EAm, + EPm + }; + + + + +/** +@publishedAll +@released + +Defines whether: + +1. the currency symbol is located before or after the currency amount. + +2. the am/pm text is located before or after the time. +*/ +enum TLocalePos + { + /** + The currency symbol is located before the currency amount. + The am/pm text is located before the time. + */ + ELocaleBefore, + + /** + The currency symbol is located after the currency amount. + The am/pm text is located after the time. + */ + ELocaleAfter + }; + + + + +/** +@publishedAll +@released + +Number Modes available to select. +*/ +enum TDigitType + { + EDigitTypeUnknown = 0x0000, + EDigitTypeWestern = 0x0030, + EDigitTypeArabicIndic = 0x0660, + EDigitTypeEasternArabicIndic = 0x6F0, + EDigitTypeDevanagari = 0x0966, + EDigitTypeBengali = 0x09E6, + EDigitTypeGurmukhi = 0x0A66, + EDigitTypeGujarati = 0x0AE6, + EDigitTypeOriya = 0x0B66, + EDigitTypeTamil = 0x0BE6, + EDigitTypeTelugu = 0x0C66, + EDigitTypeKannada = 0x0CE6, + EDigitTypeMalayalam = 0x0D66, + EDigitTypeThai = 0x0E50, + EDigitTypeLao = 0x0ED0, + EDigitTypeTibetan = 0x0F20, + EDigitTypeMayanmar = 0x1040, + EDigitTypeKhmer = 0x17E0, + EDigitTypeAllTypes = 0xFFFF + }; + + + + +/** +@publishedAll +@released + +Defines the daylight saving zones. +*/ +enum TDaylightSavingZone + { + /** + The home daylight saving zone. Its value is usually the same as that of the + zone in which the home city is located, but may differ. In this case, the + value for home overrides the value of the zone in which home is located. + */ + EDstHome=0x40000000, + + /** + No daylight saving zone. + */ + EDstNone=0, + + /** + The European daylight saving zone. + */ + EDstEuropean=1, + + /** + The Northern hemisphere (non-European) daylight saving zone. + */ + EDstNorthern=2, + + /** + Southern hemisphere daylight saving zone. + */ + EDstSouthern=4 + }; + + + + +/** +@internalComponent + +Indicates how negative currency values are formatted. +*/ +enum TNegativeCurrencyFormat // must match TLocale:: version, included here so ELOCL.DLL can see it + { + E_NegC_LeadingMinusSign, + E_NegC_InBrackets,// this one must be non-zero for binary compatibility with the old TBool TLocale::iCurrencyNegativeInBrackets which was exposed in the binary interface because it was accessed via *inline* functions + E_NegC_InterveningMinusSignWithSpaces, + E_NegC_InterveningMinusSignWithoutSpaces, + E_NegC_TrailingMinusSign + }; + +/** +@internalComponent + + +Indicates how the device universal time is maintained +*/ +enum TDeviceTimeState // must match TLocale:: version + { + /** Universal time is maintained by the device RTC and the user selection + of the locale of the device indicating offset from GMT and daylight saving*/ + EDeviceUserTime, + + /** Universal time and offset from GMT is supplied by the mobile network + and maintained by device RTC */ + ENITZNetworkTimeSync + }; + + + +/** +@publishedAll +@released + +Defines the days of the week. + +The enumerator symbol names correspond with the days of the week, +i.e. EMonday refers to Monday etc. +*/ +enum TDay + { + EMonday, + ETuesday, + EWednesday, + EThursday, + EFriday, + ESaturday, + ESunday + }; + + + + +/** +@publishedAll +@released + +Defines the months of the year. + +The enumerator symbol names correspond with the months of the year, +i.e. EJanuary refers to January etc. +*/ +enum TMonth + { + EJanuary, + EFebruary, + EMarch, + EApril, + EMay, + EJune, + EJuly, + EAugust, + ESeptember, + EOctober, + ENovember, + EDecember + }; + + + + +/** +@publishedAll +@released + +Handle ownership flags. + +The flags indicate whether a handle being opened is owned by a process or +a thread. + +Ownership by a process means that the handle instance can be used by all +threads in the process to access the Kernel side object that the +handle represents. + +Ownership by a thread means that the handle instance can only be used by the +thread that creates or opens the handle. + +An enumerator of this type is passed to all member functions of RHandleBase, +and classes derived from RHandleBase, which open a handle. +*/ +enum TOwnerType { + /** + Ownership of the handle is to be vested in the process. + */ + EOwnerProcess, + + /** + Ownership of the handle is to be vested in the thread. + */ + EOwnerThread + }; + + + + +const TInt KCreateProtectedObject = (TInt)0x80000000; + + + + + +/** +@publishedAll +@released + +Defines process priorities. + +The enumerator values are passed to RProcess::SetPriority(). + +The priorities are listed in relative order stating with the lowest. +*/ +enum TProcessPriority + { + EPriorityLow=150, + EPriorityBackground=250, + EPriorityForeground=350, + EPriorityHigh=450, + EPriorityWindowServer=650, + EPriorityFileServer=750, + EPriorityRealTimeServer=850, + EPrioritySupervisor=950 + }; + + + + +/** +@publishedAll +@released + +Defines thread priorities. + +The enumerator values are passed to RThread::SetPriority(). + +The relative priorities are listed in order starting with the lowest. + +The absolute thread priorities are listed in order starting with the lowest. +*/ +enum TThreadPriority + { + EPriorityNull=(-30), + EPriorityMuchLess=(-20), + EPriorityLess=(-10), + EPriorityNormal=0, + EPriorityMore=10, + EPriorityMuchMore=20, + EPriorityRealTime=30, + EPriorityAbsoluteVeryLow=100, + EPriorityAbsoluteLowNormal=150, + EPriorityAbsoluteLow=200, + EPriorityAbsoluteBackgroundNormal=250, + EPriorityAbsoluteBackground=300, + EPriorityAbsoluteForegroundNormal=350, + EPriorityAbsoluteForeground=400, + EPriorityAbsoluteHighNormal=450, + EPriorityAbsoluteHigh=500, + EPriorityAbsoluteRealTime1=810, + EPriorityAbsoluteRealTime2=820, + EPriorityAbsoluteRealTime3=830, + EPriorityAbsoluteRealTime4=840, + EPriorityAbsoluteRealTime5=850, + EPriorityAbsoluteRealTime6=860, + EPriorityAbsoluteRealTime7=870, + EPriorityAbsoluteRealTime8=880 + }; + + +/** +@publishedAll +@released + +A list of exception types which a thread's exception handler might deal with. +An enumerator of this type is passed to User::IsExceptionHandled() +and User::RaiseException(). + +While an exception handler can deal with exceptions as listed in the exception +constants set, a TExcType is simply a type of exception. +For example, EExcIntegerDivideByZero and EExcIntegerOverflow are types +of KExceptionInteger exception. +*/ +enum TExcType + { + EExcGeneral=0, /// + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32const_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32const_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,43 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32const_private.h +// +// + +/** + @file + @internalTechnology + @released +*/ + +#ifndef __E32CONST_PRIVATE_H__ +#define __E32CONST_PRIVATE_H__ + +/** +@publishedPartner +@released +*/ +const TText KProtectedServerNamePrefix = '!'; + +/** +@internalTechnology +*/ +const TUint32 KModuleVersionWild=0xfffffffeu; + +/** +@internalTechnology +*/ +const TUint32 KModuleVersionNull=0xffffffffu; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32debug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32debug.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,51 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32debug.h +// +// + +#ifndef __E32DEBUG_H__ +#define __E32DEBUG_H__ +#include // TThreadId + +/** @publishedPartner + @removed +*/ +const TInt KMaxProfiles=64; + +/** @publishedPartner + @removed +*/ +class TProfile + { +public: + TInt iTime; + TInt iCount; + }; +// + +/** @publishedPartner + @released +*/ +class RDebug + { +public: + IMPORT_C static void Printf(const char*, ...); + IMPORT_C static void RawPrint(const TDesC8& aDes); + IMPORT_C static TInt Print(TRefByValue aFmt,...); + IMPORT_C static void RawPrint(const TDesC16& aDes); + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32def.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32def.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2636 @@ +/* +* Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* e32\include\e32def.h +* NOTE: THIS FILE SHOULD BE ACCEPTABLE TO A C COMPILER +* +* +*/ + + + +#ifndef __E32DEF_H__ +#define __E32DEF_H__ + +/* + * __LEAVE_EQUALS_THROW__ requires the compiler to support C++ exceptions + */ +#ifndef __SUPPORT_CPP_EXCEPTIONS__ +#undef __LEAVE_EQUALS_THROW__ +#endif + + +#if defined(__VC32__) +/** +@publishedAll +@released +*/ +#define __NO_CLASS_CONSTS__ +#if (_MSC_VER >= 1200) +/** +@publishedAll +@released +*/ +#define __NORETURN__ __declspec(noreturn) +#else +#define __NORETURN__ +#endif +/** +@publishedAll +@released +*/ +#define __NORETURN_TERMINATOR() +/** +@publishedAll +@released +*/ +#define IMPORT_C __declspec(dllexport) +/** +@publishedAll +@released +*/ +#define EXPORT_C __declspec(dllexport) +/** +@publishedAll +@released +*/ +#define IMPORT_D __declspec(dllexport) +/** +@publishedAll +@released +*/ +#define EXPORT_D __declspec(dllexport) +/** +@publishedAll +@released +*/ +#define NONSHARABLE_CLASS(x) class x +/** +@publishedAll +@released +*/ +#define NONSHARABLE_STRUCT(x) struct x +/** +@publishedAll +@released +*/ +#define __NO_THROW throw() +/** +@publishedAll +@released +*/ +#define __THROW(t) throw(t) +#pragma warning( disable : 4355 ) /* 'this' used in base member initializer list */ +#pragma warning( disable : 4511 ) /* copy constructor could not be generated */ +#pragma warning( disable : 4512 ) /* assignment operator could not be generated */ +#pragma warning( disable : 4514 ) /* unreferenced inline function has been removed */ +#pragma warning( disable : 4699 ) /* Note: Using precompiled header %s */ +#pragma warning( disable : 4710 ) /* function not inlined */ +#pragma warning( disable : 4121 ) /* alignment sensitive to packing */ +#pragma warning( disable : 4273 ) +#pragma warning( disable : 4097 ) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */ +#pragma warning( disable : 4291 ) /* 'TAny *CBase::operator new(TUint,TLeave)' : no matching operator delete found; memory will not be freed if initialization throws an exception */ + +#if _MSC_VER >= 1100 +/** +@publishedAll +@released +*/ +#define TEMPLATE_SPECIALIZATION template<> +#else +#define TEMPLATE_SPECIALIZATION +#endif +#endif + + + +#if defined(__CW32__) +#undef __embedded_cplusplus +/** @internalTechnology */ +#define __embedded_cplusplus 1 +#define __NO_CLASS_CONSTS__ +#define __NORETURN__ +#define __NORETURN_TERMINATOR() +#define IMPORT_C __declspec(dllexport) +#define EXPORT_C __declspec(dllexport) +#define IMPORT_D __declspec(dllexport) +#define EXPORT_D __declspec(dllexport) +#define NONSHARABLE_CLASS(x) class x +#define NONSHARABLE_STRUCT(x) struct x +#define __NO_THROW throw() +#define __THROW(t) throw(t) + +#define TEMPLATE_SPECIALIZATION template<> +/** +@publishedAll +@released +*/ +#define _asm asm +#ifndef __int64 +#pragma longlong on +/** @internalTechnology */ +#define __int64 long long +#endif +#ifndef __SUPPORT_CPP_EXCEPTIONS__ +#pragma exceptions off /* no support for C++ exception handling */ +#pragma RTTI off /* no support for C++ runtime type information */ +#endif +#if __MWERKS__ >= 0x3200 +#pragma warning off (10480) /* deleteing void pointer is undefined */ +#pragma warning off (10350) /* N pad byte(s) inserted after data member */ +#endif +#endif + + +// +// GCC (ARM) compiler +// +#if defined(__GCC32__) && defined(__MARM__) +#ifndef __GNUC__ /* GCC98r2 doesn't define this for some reason */ +#define __GNUC__ 2 +#endif +#define __NO_CLASS_CONSTS__ +#define __NORETURN__ __attribute__ ((noreturn)) +#ifdef __GCCV3__ +#define __NORETURN_TERMINATOR() +#else +#define __NORETURN_TERMINATOR() abort() +#endif +#define IMPORT_C +#define IMPORT_D +#if !defined __WINS__ && defined _WIN32 /* VC++ Browser Hack */ +#define EXPORT_C +#define EXPORT_D +/** @internalTechnology */ +#define asm(x) +#else +#define EXPORT_C __declspec(dllexport) +#define EXPORT_D __declspec(dllexport) +#endif +#define NONSHARABLE_CLASS(x) class x +#define NONSHARABLE_STRUCT(x) struct x +#define __NO_THROW +#define __THROW(t) +#ifdef __EABI__ +#define TEMPLATE_SPECIALIZATION template<> +#else +#define TEMPLATE_SPECIALIZATION +#endif +/** +@publishedAll +@released +*/ +#define __DOUBLE_WORDS_SWAPPED__ +#endif + + +/** @internalTechnology */ +#define __NO_MUTABLE_KEYWORD +#if defined(__NO_MUTABLE_KEYWORD) +/** +@publishedAll +@deprecated +*/ +#define __MUTABLE +#else +#define __MUTABLE mutable +#endif + + + +/** +@publishedAll +@deprecated +*/ +#define CONST_CAST(type,exp) (const_cast(exp)) + +/** +@publishedAll +@deprecated +*/ +#define STATIC_CAST(type,exp) (static_cast(exp)) + +/** +@publishedAll +@deprecated +*/ +#define REINTERPRET_CAST(type,exp) (reinterpret_cast(exp)) + +#if defined(__NO_MUTABLE_KEYWORD) +/** +@publishedAll +@deprecated +*/ +#define MUTABLE_CAST(type,exp) (const_cast(exp)) +#else +#define MUTABLE_CAST(type,exp) (exp) +#endif + +/** +@publishedAll +@deprecated +*/ +#define GLREF_D extern +/** +@publishedAll +@deprecated +*/ +#define GLDEF_D +/** +@publishedAll +@deprecated +*/ +#define LOCAL_D static +/** +@publishedAll +@deprecated +*/ +#define GLREF_C extern +/** +@publishedAll +@deprecated +*/ +#define GLDEF_C +/** +@publishedAll +@deprecated +*/ +#define LOCAL_C static +/** +@internalAll +@prototype +*/ +#ifndef IMPORT_D +#define IMPORT_D IMPORT_C +#endif + +/** +@publishedAll +@deprecated +*/ +#define FOREVER for(;;) + + + + +/** +@publishedAll +@released + +Symbolic definition for a true value. +*/ +#define TRUE 1 + + + + +/** +@publishedAll +@released + +Symbolic definition for a false value. +*/ +#define FALSE 0 +#ifndef NULL + + + + +/** +@publishedAll +@released + +Symbolic definition for a NULL value. +*/ +#define NULL 0 +#endif + + + + +#ifndef VA_START +/** +@publishedAll +@released + +A macro used by Symbian OS code for handling a variable argument list +in a function call. + +Sets a pointer to point to the first of the variable arguments. + +Typical usage: + +@code +Foo(CAbcdef aAbcdef,...) + { + VA_LIST list; + VA_START(list, aAbcdef); + // other code + } +@endcode + +@param ap A pointer used to hold the address of an argument in + the variable argument list. After execution of the code generated + by this macro, the pointer points to the first argument in + the variable argument list. + This symbol is usually declared as a VA_LIST type. + +@param pn The argument that immediately precedes the variable argument list. + +@see VA_LIST +@see VA_ARG +*/ +#define VA_START(ap,pn) ((ap)[0]=(TInt8 *)&pn+((sizeof(pn)+sizeof(TInt)-1)&~(sizeof(TInt)-1)),(void)0) +#endif + + + + +#ifndef VA_ARG +/** +@publishedAll +@released + +A macro used by Symbian OS code for handling a variable argument list +in a function call. + +Increments a pointer to a variable argument list to point to the next argument +in the list. The current argument is assumed to be of a type defined by +the second parameter to this macro. + +Typical usage: + +@code +Foo(CAbcdef aAbcdef,...) + { + VA_LIST list; + VA_START(list, aAbcdef); + ... + TInt x = VA_ARG(list,TInt); + ... + const TDesC *pS=VA_ARG(aList,const TDesC*); + ... + etc + } +@endcode + +@param ap A pointer used to hold the address of an argument in + the variable argument list. It is assumed to point to the current + argument in the variable argument list. After execution of the code + generated by this macro, the pointer points to the next argument in + the list. This symbol is usually declared as a VA_LIST type. + +@param type The type of the current argument. + This can be any valid type, for example, TInt, const TDesC*, etc. + +@see VA_LIST +@see VA_START +*/ +#define VA_ARG(ap,type) ((ap)[0]+=((sizeof(type)+sizeof(TInt)-1)&~(sizeof(TInt)-1)),(*(type *)((ap)[0]-((sizeof(type)+sizeof(TInt)-1)&~(sizeof(TInt)-1))))) +#endif + + + + +#ifndef VA_END +/** +@publishedAll +@released + +A macro used by Symbian OS code for handling a variable argument list +in a function call. + +Sets a pointer to zero. + +@param ap A pointer used to hold the address of an argument in + the variable argument list. After execution of the code generated + by this macro, the pointer is reset to 0. + This symbol is usually declared as a VA_LIST type. + +@see VA_LIST +@see VA_START +@see VA_ARG +*/ +#define VA_END(ap) ((ap)[0]=0,(void)0) +#endif + + + +/** +@publishedAll +@released + +Calculates the offset of member f within class c. + +This is used in the TSglQue and TDblQue constructors to set the offset of +the link object from the start of a list element. + +@param c The name of the class. +@param f The name of the member within the specified class. + +@see TSglQue +@see TDblQue +*/ +#ifndef _FOFF +#if __GNUC__ < 4 +#define _FOFF(c,f) (((TInt)&(((c *)0x1000)->f))-0x1000) +#else +#define _FOFF(c,f) __builtin_offsetof(c,f) +#endif +#endif + + + +/** +@internalTechnology +@released +*/ +#define _ALIGN_DOWN(x,a) ((x)&~((a)-1)) +/** +@internalTechnology +@released +*/ +#define _ALIGN_UP(x,a) _ALIGN_DOWN((x)+(a)-1, a) + + + + +/** +@publishedAll +@released + +Pointer to any type. + +TAny* is equivalent to void* in standard C or C++. TAny* is used in preference +to void* because it is more suggestive of the actual meaning, +e.g. TAny* foo();. + +TAny is not used where it really means "nothing", as in the declaration of +functions which do not return a value; void is used instead, e.g. void Foo();. +*/ +typedef void TAny; + + + + +/** +@publishedAll +@released + +8-bit signed integer type, used in Symbian OS to mean an 8-bit +signed integer, independent of the implementation. +*/ +typedef signed char TInt8; + + + + +/** +@publishedAll +@released + +8-bit unsigned integer type; used in Symbian OS to mean an 8-bit +unsigned integer, independent of the implementation. +*/ +typedef unsigned char TUint8; + + + + +/** +@publishedAll +@released + +16-bit signed integer type, used in Symbian OS to mean a 16-bit +signed integer, independent of the implementation. +*/ +typedef short int TInt16; + + + + +/** +@publishedAll +@released + +16-bit unsigned integer type. used in Symbian OS to mean a 16-bit +unsigned integer, independent of the implementation. +*/ +typedef unsigned short int TUint16; + + + + +/** +@publishedAll +@released + +32-bit signed integer type, used in Symbian OS to mean a 32-bit +signed integer, independent of the implementation. +*/ +typedef long int TInt32; + + + + +/** +@publishedAll +@released + +A signed integer type of the same size as a pointer. +*/ +typedef TInt32 T_IntPtr; +typedef TInt32 TIntPtr; + + + + +/** +@publishedAll +@released + +32-bit unsigned integer type; used in Symbian OS to mean a 32-bit +unsigned integer, independent of the implementation. +*/ +typedef unsigned long int TUint32; + + + + +/** +@publishedAll +@released + +An unsigned integer type of the same size as a pointer. +*/ +typedef TUint32 T_UintPtr; +typedef TUint32 TUintPtr; + + + + +/** +@publishedAll +@released + +Signed integer type of the natural machine word length. + +This is as defined by the C++ implementation's int type. In all +implementations, this is guaranteed to be at least 32 bits. + +A TInt should be used in preference to a sized integer (TInt32, TInt16) for +all general use. Sized integers should only be used when packing is essential. +C++'s type conversion rules imply that all sized integers smaller than the +natural machine word are in any case broadened to the natural machine word +size when passed as function parameters. + +A TInt should be used in preference to an unsigned integer (TUint) for all +general use. Unsigned integers should only be used for flags (which use Boolean +operations but not arithmetic) and, in very rare cases, for numbers whose +range exceeds that available from signed integers. Although it is natural +to attempt to use unsigned integers for quantities which cannot by nature +be negative, the C++ language does not provide the support necessary to enforce +the "expected" behaviour in these circumstances, and experience has shown +that it is better to use signed integers unless there is good reason not to. + +@see TUint +@see TInt32 +@see TInt16 +*/ +typedef signed int TInt; + + + + +/** +@publishedAll +@released + +Unsigned integer type of the natural machine word length. + +This is guaranteed to be at least 32 bits in all implementations. + +In almost all circumstances, a TInt should be used in preference to a TUint. +The main exception is in flags bytes. + +@see TInt +*/ +typedef unsigned int TUint; + + + + +/** +@publishedAll +@released + +32-bit floating point number, providing IEEE754 single precision on all Symbian +OS implementations. + +TReal should normally be used in preference to TReal32. + +Use of floating-point numbers should generally be avoided unless a natural +part of the problem specification. Most Symbian OS implementations do not +have a hardware floating point unit: as a result, their floating-point performance +is hundreds of times slower than integer performance. +*/ +typedef float TReal32; + + + + +/** +@publishedAll +@released + +64-bit floating point number, providing IEEE754 double precision on all Symbian +OS implementations. + +Use of floating-point numbers should generally be avoided unless a natural +part of the problem specification. Most Symbian OS implementations do not +have a hardware floating point unit: as a result, their floating-point performance +is hundreds of times slower than integer performance. + +This type is identical to TReal. + +@see TReal +*/ +typedef double TReal64; + + + + +/** +@publishedAll +@released + +64-bit floating point number; identical to TReal64. + +Use of floating-point numbers should generally be avoided unless a natural +part of the problem specification. Most Symbian OS implementations do not +have a hardware floating point unit: as a result, their floating-point performance +is hundreds of times slower than integer performance. + +Most serious floating-point calculations require double-precision. All standard +math functions (see Math class) take double-precision arguments. Single-precision +should only be used where space and performance are at a premium, and when +their limited precision is acceptable. + +@see TReal64 +@see Math +*/ +typedef double TReal; + + + + +/** +@publishedAll +@released + +8-bit unsigned character. + +Use instead of C++ built-in char type because it is guaranteed to be unsigned. +Use instead of TInt8 where the application is really for text rather than +8-bit arithmetic or binary quantities. + +For most purposes, you should use TText rather than TText8. TText is mapped +onto either TText8 or TText16 depending on whether a non-Unicode or Unicode +variant is being built. Use TText8 only when you are dealing explicitly with +8-bit text, regardless of build. + +@see TText */ +typedef unsigned char TText8; + + + + +/** +@publishedAll +@released + +16-bit unsigned character. + +Use instead of C++ wchar_t type because it is guaranteed to be unsigned. Use +instead of TInt16 where the application is really for text rather than 8-bit +arithmetic or binary quantities. + +For most purposes, you should use TText rather than TText16. TText is mapped +onto either TText8 or TText16 depending on whether a non-Unicode or Unicode +variant is being built. Use TText16 only when you are dealing explicitly with +16-bit text, regardless of build. + +@see TText +*/ +typedef unsigned short int TText16; + + + + +/** +@publishedAll +@released + +Boolean type which takes the value either ETrue or EFalse. + +Although only a single bit would theoretically be necessary to represent a +Boolean, a machine word is used instead, so that these quantities can be easily +passed. Also, TBool must map onto int because of C++'s interpretation of +operands in conditional expressions. + +On implementations of Symbian OS in which the compiler supports the ANSI-recommended +bool type, TBool will be typedef'ed to bool instead of int. +*/ +typedef int TBool; + + + + +/** +@publishedPartner +@released + +Defines a linear (virtual) address type. +*/ +typedef T_UintPtr TLinAddr; + + + +#if defined(__GCC32__) + + + + +/** +@publishedAll +@released + +Defines a 64-bit signed integer type. +*/ +typedef long long Int64; + + + + +/** +@publishedAll +@released + +Defines a 64-bit unsigned integer type. +*/ +typedef unsigned long long Uint64; + + + + +/** +@publishedAll +@released +*/ +#define I64LIT(x) x##LL +/** +@publishedAll +@released +*/ +#define UI64LIT(x) x##ULL + +#elif defined(__VC32__) +typedef __int64 Int64; +typedef unsigned __int64 Uint64; +#define I64LIT(x) (__int64)##x +#define UI64LIT(x) (unsigned __int64)##x + +#elif defined(__CW32__) +#pragma longlong on +typedef long long Int64; +typedef unsigned long long Uint64; +#define I64LIT(x) x##LL +#define UI64LIT(x) x##ULL +#endif + + + + +/** +@publishedAll +@released + +Defines a 64-bit signed integer type. + +NOTE: For those migrating from versions of Symbian OS before 8.1b (i.e. 8.1a, 7.0s etc) +TInt64 is now defined as a built-in type instead of as a class type. This means +that the member functions of the old TInt64 class are no longer exported +from EUSER.LIB, and represents a compatibility break. + +To ease migration of source code, a number of macros are provided. Similar +macros have also been defined in Symbian OS versions 7.0s and 8.1a, but +implemented in terms of the old TInt64 class. This is important for code that +is common to : one or both of these Symbian OS versions, and to 8.1b and +subsequent versions. + +The following list shows the new macros and the functions that they replace. +It also shows some alternative techniques. +In this list: x, v and r are declared as TInt64, c is declared as TInt, High +and Low are declared as TUint. + +@code +OLD USAGE REPLACEMENT + +TInt64(High,Low); MAKE_TINT64(High,Low); +x.Set(High,Low); MAKE_TINT64(High,Low); +x.Low(); I64LOW(x); +x.High(); I64HIGH(x); +x.GetTInt(); I64INT(x); +x.GetTReal(); I64REAL(x); +x.Lsr(c); I64LSR(x,c); +x.Mul10(); x*=10; +x.MulTop(a); I64MULTOP(x,a); +x.DivMod(v,r); r=x%v; x/=v; +@endcode +*/ +typedef Int64 TInt64; + + + + +/** +@publishedAll +@released + +Defines a 64-bit unsigned integer type. +*/ +typedef Uint64 TUint64; + + + + +/** @internalComponent */ +#define _MAKE_TINT64_ZX(x) ((TInt64)((TUint32)(x))) + +/** @internalComponent */ +#define _MAKE_TUINT64_ZX(x) ((TUint64)((TUint32)(x))) + + + + +/** +@publishedAll +@released +*/ +#define MAKE_TINT64(h,l) ( (_MAKE_TINT64_ZX(h)<<32) | _MAKE_TINT64_ZX(l) ) + + + + +/** +@publishedAll +@released +*/ +#define MAKE_TUINT64(h,l) ( (_MAKE_TUINT64_ZX(h)<<32) | _MAKE_TUINT64_ZX(l) ) + + + + +/** +@publishedAll +@released + +Generates code to access the high order 32 bits of a 64 bit number. +*/ +#define I64HIGH(x) ( (TUint32)((x)>>32) ) + + + + +/** +@publishedAll +@released + +Generates code to access the low order 32 bits of a 64 bit number. +*/ +#define I64LOW(x) ( (TUint32)(x) ) + + + + +/** +@publishedAll +@released + +Generates code to cast a 64 bit value as an signed integer. +*/ +#define I64INT(x) ( (TInt)(x) ) + + + + +/** +@publishedAll +@released + +Generates code to cast a 64 bit value as a TReal type. +*/ +#define I64REAL(x) ( (TReal)(x) ) + + + + +/** +@publishedAll +@released + +Generates code to logically shift a 64 bit integer right. +*/ +#define I64LSR(x, shift) ( *reinterpret_cast(&(x)) >>= (shift) ) + + + +/** +@publishedAll +@released + +Generates code to multiply a 64 bit integer by 10. +*/ +#define I64MUL10(x) ( (x) *= 10 ) + + + +/** +@publishedAll +@released + +Generates code to divide a 64 bit integer by another and find the remainder. +*/ +#define I64DIVMOD(x, divisor, remainder) ( ((remainder) = (x) % (divisor), (x) /= (divisor)) ) + + + + +/** +@publishedAll +@released + +Generates code to cast a double to a 64 bit integer. +*/ +#define I64DOUBLECAST(x) ( static_cast(x) ) + + + + +/** +@publishedAll +@deprecated Use _LIT8 instead. + +8-bit literal. + +The macro defines an explicit 8-bit constant literal which is suitable +for non-Unicode literal text, regardless of the build. + +@see _L +@see _LIT8 +@see _LIT +*/ +#define _L8(a) (TPtrC8((const TText8 *)(a))) + + + + +/** +@publishedAll +@released + +Defines an explicit 8-bit string which is suitable when non-Unicode text +is required, regardless of the build. + +This is used by the deprecated literal descriptor _L8. +*/ +#define _S8(a) ((const TText8 *)a) + + + + +/** +@publishedAll +@released + +Constructs a constant literal descriptor of type TLitC8 with +the specified name and text. + +The 8-bit build variant is generated for both non-Unicode and Unicode builds. + +@param name The name of the C++ variable to be generated. +@param s The literal text enclosed within a pair of double quotes. + +@see _LIT +*/ +#define _LIT8(name,s) const static TLitC8 name={sizeof(s)-1,s} + + + + +/** +@publishedAll +@deprecated Use _LIT16 instead. + +16-bit literal. + +The macro defines an explicit 16-bit constant literal which is suitable +for Unicode literal text, regardless of the build. + +@see _L +@see _LIT16 +@see _LIT +*/ +#define _L16(a) (TPtrC16((const TText16 *)L ## a)) + + + +/** +@publishedAll +@released + +Defines an explicit 16-bit string which is suitable when Unicode text +is required, regardless of the build. + +This is used by the deprecated literal descriptor _L16. +*/ +#define _S16(a) ((const TText16 *)L ## a) + + + + +/** +@publishedAll +@released + +Constructs a constant literal descriptor of type TLitC16 with +the specified name and text. + +The 16-bit build variant is generated for both non-Unicode and Unicode builds. + +@param name The name of the C++ variable to be generated. +@param s The literal text enclosed within a pair of double quotes. + +@see _LIT +*/ +#define _LIT16(name,s) const static TLitC16 name={sizeof(L##s)/2-1,L##s} + + + + +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +/** +@publishedAll +@released + +Build independent general text character. + +In non-Unicode builds, this is mapped to TText8. In Unicode builds, this is +mapped to TText16. Use the classes with explicit width only when you wish +the width to be independent of the build variant. + +Use this class rather than TChar for general use. +*/ +typedef TText16 TText; + + + +/** +@publishedAll +@deprecated Use _LIT instead. + +Build independent literal. + +The macro defines either an 8-bit constant literal (for non-Unicode text), +or a 16-bit constant literal (for Unicode text) depending on the build. + +@see _LIT +@see _L16 +@see _L8 +*/ +#define _L(a) (TPtrC((const TText *)L ## a)) + + + + +/** +@publishedAll +@released + +Defines either an 8-bit string (for non-Unicode text), +or a 16-bit string (for Unicode text) depending on the build. + +This is used by the deprecated build independent literal _L. +*/ +#define _S(a) ((const TText *)L ## a) + + + + +/** +@publishedAll +@released + +Constructs a build independent constant literal descriptor of type TLitC +with the specified name and text. + +An 8-bit build variant is generated for a non-Unicode build; +A 16-bit build variant is generated for a Unicode build. + +@param name The name of the C++ variable to be generated. +@param s The literal text enclosed within a pair of double quotes. + +@see _LIT16 +@see _LIT8 +*/ +#define _LIT(name,s) const static TLitC name={sizeof(L##s)/2-1,L##s} + + + + +#else +/** +@publishedAll +@released + +Build independent general text character. + +In non-Unicode builds, this is mapped to TText8. In Unicode builds, this is +mapped to TText16. Use the classes with explicit width only when you wish +the width to be independent of the build variant. + +Use this class rather than TChar for general use. +*/ +typedef TText8 TText; + + + +/** +@publishedAll +@released + +@deprecated Use _LIT instead. + +Build independent literal. + +The macro defines either an 8-bit constant literal (for non-Unicode text), +or a 16-bit constant literal (for Unicode text) depending on the build. + +@see _LIT +@see _L16 +@see _L8 +*/ +#define _L(a) (TPtrC((const TText *)(a))) + + + + +/** +@publishedAll +@released + +Defines either an 8-bit string (for non-Unicode text), +or a 16-bit string (for Unicode text) depending on the build. + +This is used by the deprecated build independent literal _L. +*/ +#define _S(a) ((const TText *)a) + + + + +/** +@publishedAll +@released + +Constructs a build independent constant literal descriptor of type TLitC +with the specified name and text. + +An 8-bit build variant is generated for a non-Unicode build; +A 16-bit build variant is generated for a Unicode build. + +@param name The name of the C++ variable to be generated. +@param s The literal text enclosed within a pair of double quotes. + +@see _LIT16 +@see _LIT8 +*/ +#define _LIT(name,s) const static TLitC name={sizeof(s)-1,s} +#endif + + + + +#ifndef __VA_LIST_defined +/** +@publishedAll +@released + +Defines a 'C' style array of pointers to TInt8 types. + +The type is most commonly used by code that needs to deal with a variable +number of arguments passed to a function. + +@see TInt8 +*/ +typedef TInt8 *VA_LIST[1]; +#endif + +/** +@publishedAll +@released + +Asserts that a condition is true. + +Code is generated for all builds. + +This macro is used as a C++ statement to assert the truth of some condition, +and to take appropriate action if the condition is false. Unlike __ASSERT_DEBUG +it is defined in both release and debug builds. + +The most common use for this macro is to check that the external environment of +a function or class is behaving as expected; for example, that parameters +passed to a function are credible, or that called functions are behaving as +expected; the macro is commonly placed at the beginning of a function. + +The effect of the macro is to generate code which tests +the conditional expression c; if the expression is false, then +function p is called. In the majority of cases, the function p is one that +raises a panic. + +Note that the macro definition is, in effect, equivalent to: + +@code +if !(c)p; +@endcode + +@param c a conditional expression which results in true or false. +@param p a function which is called if the conditional expression c is false. + +@see __ASSERT_DEBUG +*/ +#define __ASSERT_ALWAYS(c,p) (void)((c)||(p,0)) + + + +#ifdef __WINS__ +#ifdef __CW32__ +/** +@internalAll +@released +*/ +#define __BREAKPOINT() \ + { \ + __asm { byte 0xcc }; \ + } +#else // !__CW32__ +/** +@internalAll +@released +*/ +#define __BREAKPOINT() \ + { \ + __asm { int 3 }; \ + } +#endif //__CW32__ +#else +/** +@internalAll +@released +*/ +#define __BREAKPOINT() +#endif + +#if defined(_DEBUG) + + +/** +@publishedAll +@released + +Asserts that a condition is true. + +Code is generated for debug builds only. + +This macro is used as a C++ statement to assert the truth of some condition, +and to take appropriate action if the condition is false. It is used in +the same way as __ASSERT_ALWAYS, except that it is only defined for debug builds. + +The macro may be used to insert extra checks at various points in source code +as desired; the code will only be generated in debug builds and not in release +builds. + +@param c A conditional expression which results in true or false. +@param p A function which is called if the conditional expression c is false. + +@see __ASSERT_ALWAYS +*/ +#define __ASSERT_DEBUG(c,p) (void)((c)||(p,0)) + + + +/** +@internalAll +@removed +*/ +#define __DECLARE_NAME(t) + + + + +/** +@publishedAll +@released + +Calls the function for testing object invariance. + +Classes can define a standard member function __DbgTestInvariant(), +which checks that the object is in a valid state, and panics if it is not. +In debug builds, this macro simply expands to call that function. For details on how +to define __DbgTestInvariant(), and an example of its use, see __DECLARE_TEST. + +The macro is typically invoked at the beginning of all the member functions of +the class. For non-const functions (those which can change the object’s state), +you can ensure that the object has been left in a stable state by invoking +the macro at the end of the function. + +In release builds, no code is generated for the macro. +*/ +#define __TEST_INVARIANT __DbgTestInvariant() + + + + +/** +@publishedAll +@released + +Marks the start of checking the current thread's heap. + +This macro is defined only for debug builds. + +This macro must be matched by a corresponding call to __UHEAP_MARKEND or __UHEAP_MARKENDC. + +Calls to this macro can be nested but each call must be matched by corresponding +call to __UHEAP_MARKEND or __UHEAP_MARKENDC. + +@see User::__DbgMarkStart() +@see __UHEAP_MARKEND +@see __UHEAP_MARKENDC +*/ +#define __UHEAP_MARK User::__DbgMarkStart(FALSE) + + + + +/** +@publishedAll +@released + +Checks that the number of allocated cells at the current nested level on the +current thread's heap is the same as the specified value. + +This macro is defined only for debug builds. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +The macro assumes that: + +1. the heap being checked is a user heap + +2. checking is being done for the number of allocated cells at the current nested + level; i.e. that aCountAll is set to false + +3. the line number is the line number of this source code statement. + +4. the file name is the full path name of the file containing this source statement + +@param aCount The number of heap cells expected to be allocated at + the current nest level. + +@see User::__DbgMarkCheck() +@see __KHEAP_CHECK +*/ +#define __UHEAP_CHECK(aCount) User::__DbgMarkCheck(FALSE,FALSE,aCount,(TText8*)__FILE__,__LINE__) + + + + +/** +@publishedAll +@released + +Checks that the total number of allocated cells on the current thread's heap +is the same as the specified value. + +This macro is defined only for debug builds. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +@param aCount The total number of heap cells expected to be allocated. + +@see User::__DbgMarkCheck() +@see __KHEAP_CHECKALL +*/ +#define __UHEAP_CHECKALL(aCount) User::__DbgMarkCheck(FALSE,TRUE,aCount,(TText8*)__FILE__,__LINE__) + + + + +/** +@publishedAll +@released + +Marks the end of checking the current thread's heap. + +The macro expects zero heap cells to remain allocated at the current nest +level. This macro is defined only for debug builds. + +This macro must match an earlier call to __UHEAP_MARK. + +@see User::__DbgMarkEnd() +@see __UHEAP_MARK +*/ +#define __UHEAP_MARKEND User::__DbgMarkEnd(FALSE,0) + + + + +/** +@publishedAll +@released + +Marks the end of checking the current thread's heap. + +The macro expects aCount heap cells to remain allocated at the current nest +level. + +This macro must match an earlier call to __UHEAP_MARK. + +@param aCount The number of heap cells expected to remain allocated at + the current nest level. + +@see User::__DbgMarkEnd() +@see __UHEAP_MARK +*/ +#define __UHEAP_MARKENDC(aCount) User::__DbgMarkEnd(FALSE,aCount) + + + + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failure occurs on the next call to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aCount Determines when the allocation will fail. + Heap allocation fails on attempt number aCount - later + allocations will succeed. + For example, if aCount is 3, then heap allocation fails + on the 3rd attempt, but all subsequent allocations succeed. + +@see User::__DbgSetAllocFail() +*/ +#define __UHEAP_FAILNEXT(aCount) User::__DbgSetAllocFail(FALSE,RAllocator::EFailNext,aCount) + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failures will occur for aBurst times from the next call to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aCount Determines when the allocation will fail. + Heap allocation fails on attempt number aCount - later + allocations will succeed. + For example, if aCount is 3, then heap allocation fails + on the 3rd attempt, but all subsequent allocations succeed. + Note when used with RHeap the maximum value aCount can be set + to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set to + is KMaxTUint16. + +@see User::__DbgSetBurstAllocFail() +*/ +#define __UHEAP_BURSTFAILNEXT(aCount,aBurst) User::__DbgSetBurstAllocFail(FALSE,RAllocator::EBurstFailNext,aCount,aBurst) + + + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aType The type of failure to be simulated. +@param aRate The failure rate. + +@see User::__DbgSetAllocFail() +@see RAllocator::TAllocFail +*/ +#define __UHEAP_SETFAIL(aType,aRate) User::__DbgSetAllocFail(FALSE, aType, aRate) + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aType The type of failure to be simulated. +@param aRate The failure rate. Note when used with RHeap the maximum value + aRate can be set to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set + to is KMaxTUint16. + +@see User::__DbgSetBurstAllocFail() +@see RAllocator::TAllocFail +*/ +#define __UHEAP_SETBURSTFAIL(aType,aRate,aBurst) User::__DbgSetBurstAllocFail(FALSE, aType, aRate, aBurst) + + + +/** +@publishedAll +@released + +Cancels simulated heap allocation failure for the current thread's heap. + +This macro is defined only for debug builds. + +@see User::__DbgSetAllocFail() +*/ +#define __UHEAP_RESET User::__DbgSetAllocFail(FALSE,RAllocator::ENone,1) + + +/** +@publishedAll +@released + +Cancels simulated heap allocation failure for the current thread's heap. +It walks the the heap and sets the nesting level for all allocated +cells to zero. + +This macro is defined only for debug builds. +*/ +#define __UHEAP_TOTAL_RESET User::__DbgSetAllocFail(FALSE,RAllocator::EReset,1) + +/** +@publishedAll +@released + +Returns the number of heap allocation failures the current debug allocator fail +function has caused so far. + +This is intended to only be used with fail types RAllocator::EFailNext, +RAllocator::EBurstFailNext, RAllocator::EDeterministic and +RAllocator::EBurstDeterministic. The return value is unreliable for +all other fail types. + +@return The number of heap allocation failures the current debug fail +function has caused. + +@see RAllocator::TAllocFail +*/ +#define __UHEAP_CHECKFAILURE User::__DbgCheckFailure(FALSE) + +/** +@publishedAll +@released + +Returns the number of kernel heap allocation failures the current debug +allocator fail function has caused so far. + +This is intended to only be used with fail types RAllocator::EFailNext, +RAllocator::EBurstFailNext, RAllocator::EDeterministic and +RAllocator::EBurstDeterministic. The return value is unreliable for +all other fail types. + +@return The number of heap allocation failures the current debug fail +function has caused. + +@see RAllocator::TAllocFail +*/ +#define __KHEAP_CHECKFAILURE User::__DbgCheckFailure(TRUE) + + + +/** +@publishedAll +@released + +Marks the start of heap checking for the specific heap. + +This macro is defined only for debug builds. + +This macro must be matched by a corresponding call to __RHEAP_MARKEND or __RHEAP_MARKENDC. + +Calls to this macro can be nested but each call must be matched by corresponding +call to __RHEAP_MARKEND or __RHEAP_MARKENDC. + +@param aHeap A pointer to the specific RHeap + +@see RHeap +@see RAllocator::__DbgMarkStart() +@see __RHEAP_MARKEND +@see __RHEAP_MARKENDC +*/ +#define __RHEAP_MARK(aHeap) (aHeap)->__DbgMarkStart() + + + + +/** +@publishedAll +@released + +Checks that the number of allocated cells at the current nested level on the +specified heap is the same as the specified value. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The number of heap cells expected to be allocated at + the current nest level. + +@see RAllocator::__DbgMarkCheck() +*/ +#define __RHEAP_CHECK(aHeap,aCount) (aHeap)->__DbgMarkCheck(FALSE,aCount,(TText8*)__FILE__,__LINE__) + + + + +/** +@publishedAll +@released + +Checks that the total number of allocated cells on the specified heap is the +same as the specified value. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The total number of heap cells expected to be allocated. + +@see RAllocator::__DbgMarkCheck() +*/ +#define __RHEAP_CHECKALL(aHeap,aCount) (aHeap)->__DbgMarkCheck(TRUE,aCount,(TText8*)__FILE__,__LINE__) + + + + +/** +@publishedAll +@released + +Marks the end of heap checking for the specific heap. + +The macro expects zero heap cells to remain allocated at the current nest +level. This macro is defined only for debug builds. + +This macro must match an earlier call to __RHEAP_MARK. + +@param aHeap A pointer to the specific RHeap. + +@see RAllocator::__DbgMarkEnd() +@see __RHEAP_MARK +*/ +#define __RHEAP_MARKEND(aHeap) (aHeap)->__DbgMarkEnd(0) + + + + +/** +@publishedAll +@released + +Marks the end of heap checking for the specific heap. + +The macro expects aCount heap cells to remain allocated at the current nest +level. This macro is defined only for debug builds. + +This macro must match an earlier call to __RHEAP_MARK. + +@param aHeap A pointer to the specific RHeap. +@param aCount The number of heap cells expected to remain allocated at + the current nest level + +@see RAllocator::__DbgMarkEnd() +@see __RHEAP_MARK +*/ +#define __RHEAP_MARKENDC(aHeap,aCount) (aHeap)->__DbgMarkEnd(aCount) + + + + +/** +@publishedAll +@released + +Simulates an allocation failure for the specific heap. + +The failure occurs on the next call to new or any of the functions which allocate +memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The rate of failure - heap allocation fails every aCount attempt. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_FAILNEXT(aHeap,aCount) (aHeap)->__DbgSetAllocFail(RAllocator::EFailNext,aCount) + +/** +@publishedAll +@released + +Simulates aBurst allocation failures for the specific heap. + +The failure occurs on the next call to new or any of the functions which allocate +memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The heap allocation will fail after aCount-1 allocation attempts. + Note when used with RHeap the maximum value aCount can be set + to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set + to is KMaxTUint16. + +@see RAllocator::__DbgSetBurstAllocFail() +*/ +#define __RHEAP_BURSTFAILNEXT(aHeap,aCount,aBurst) (aHeap)->__DbgSetBurstAllocFail(RAllocator::EBurstFailNext,aCount, aBurst) + + + +/** +@publishedAll +@released + +Simulates an allocation failure for the specific heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aType The type of failure to be simulated. +@param aRate The failure rate. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_SETFAIL(aHeap,aType,aRate) (aHeap)->__DbgSetAllocFail(aType,aRate) + +/** +@publishedAll +@released + +Simulates an allocation failure for the specific heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aType The type of failure to be simulated. +@param aRate The failure rate. Note when used with RHeap the maximum value + aRate can be set to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set + to is KMaxTUint16. + +@see RAllocator::__DbgSetBurstAllocFail() +*/ +#define __RHEAP_SETBURSTFAIL(aHeap,aType,aRate,aBurst) (aHeap)->__DbgSetBurstAllocFail(aType,aRate,aBurst) + + + +/** +@publishedAll +@released + +Cancels simulated allocation failure for the specific heap. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_RESET(aHeap) (aHeap)->__DbgSetAllocFail(RAllocator::ENone,1) + + + +/** +@publishedAll +@released + +Cancels simulated allocation failure for the specific heap. +It walks the the heap and sets the nesting level for all allocated +cells to zero. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_TOTAL_RESET(aHeap) (aHeap)->__DbgSetAllocFail(RAllocator::EReset,1) + +/** +@publishedAll +@released + +Returns the number of heap allocation failures the current debug allocator fail +function has caused so far. + +This is intended to only be used with fail types RAllocator::EFailNext, +RAllocator::EBurstFailNext, RAllocator::EDeterministic and +RAllocator::EBurstDeterministic. The return value is unreliable for +all other fail types. + +@return The number of heap allocation failures the current debug fail +function has caused. + +@see RAllocator::TAllocFail +*/ +#define __RHEAP_CHECKFAILURE(aHeap) (aHeap)->__DbgCheckFailure() + + +#if defined (__WINS__) + +/** +@publishedAll +@released +*/ +#define __DEBUGGER() {if (User::JustInTime()) __BREAKPOINT()} + +#else +#define __DEBUGGER() +#endif + + +#if defined(__DLL__) +/** +@publishedAll +@released + +Declares a function for testing object invariance. + +For complex classes, it is often useful to provide a function that can +be called to check that the object is in a valid state. +The __DECLARE_TEST macro supplies a standard prototype for such a function +named __DbgTestInvariant(). A companion macro __TEST_INVARIANT is provided +to call the function. + +For DLLs, as opposed to EXEs, __DbgTestInvariant() is exported, +i.e. the macro expands to: + +@code +public: IMPORT_C void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const +@endcode + +This macro should placed as the last item in a class declaration (as it +switches back to public access). Note that a terminating semi-colon must be used. + +You should define the __DbgTestInvariant() function to check that the object +is in a healthy state. If it finds an error, it should call User::Invariant(), +which will cause a panic. + +If a class is derived from a base class, then the base class __DbgTestInvariant() +should be called first, and then any further checking done. + +The second function declared, __DbgTest(), is intended to allow test code a way +of directly accessing non-public members of a class. The function is +implemented by any test code that requires it, rather than in the class’s own +source code. The function is therefore not exported. + +__DECLARE_TEST is defined for both debug and release builds. This point is +particularly important for DLLs, as otherwise the exported interfaces would +differ between the build versions, giving potential binary compatibility +problems. To avoid using memory unnecessarily in release builds, you can, +however, use preprocessor directives to define the code within +__DbgTestInvariant() only for debug builds. __DbgTestInvariant() is never +called in release builds. + +@see __TEST_INVARIANT +*/ +#define __DECLARE_TEST public: IMPORT_C void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const +#else +#define __DECLARE_TEST public: void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const +#endif + +#else +#define __ASSERT_DEBUG(c,p) +#define __DECLARE_NAME(t) +#define __TEST_INVARIANT +#if defined(__DLL__) +#define __DECLARE_TEST public: IMPORT_C void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const +#else +#define __DECLARE_TEST public: void __DbgTestInvariant() const; void __DbgTest(TAny *aPtr) const +#endif + + + + +/** +@publishedAll +@released + +Marks the start of checking the current thread's heap. + +This macro is defined only for debug builds. + +This macro must be matched by a corresponding call to __UHEAP_MARKEND or __UHEAP_MARKENDC. + +Calls to this macro can be nested but each call must be matched by corresponding +call to __UHEAP_MARKEND or __UHEAP_MARKENDC. + +@see User::__DbgMarkStart() +@see __UHEAP_MARKEND +@see __UHEAP_MARKENDC +*/ +#define __UHEAP_MARK + + + + +/** +@publishedAll +@released + +Checks that the number of allocated cells at the current nested level on the +current thread's heap is the same as the specified value. + +This macro is defined only for debug builds. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +The macro assumes that: + +1. the heap being checked is a user heap + +2. checking is being done for the number of allocated cells at the current nested + level; i.e. that aCountAll is set to false + +3. the line number is the line number of this source code statement. + +4. the file name is the full path name of the file containing this source statement + +@param aCount The number of heap cells expected to be allocated at + the current nest level. + +@see User::__DbgMarkCheck() +@see __KHEAP_CHECK +*/ +#define __UHEAP_CHECK(aCount) + + + + +/** +@publishedAll +@released + +Checks that the total number of allocated cells on the current thread's heap +is the same as the specified value. + +This macro is defined only for debug builds. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +@param aCount The total number of heap cells expected to be allocated. + +@see User::__DbgMarkCheck() +@see __KHEAP_CHECKALL +*/ +#define __UHEAP_CHECKALL(aCount) + + + + +/** +@publishedAll +@released + +Marks the end of checking the current thread's heap. + +The macro expects zero heap cells to remain allocated at the current nest +level. This macro is defined only for debug builds. + +This macro must match an earlier call to __UHEAP_MARK. + +@see User::__DbgMarkEnd() +@see __UHEAP_MARK +*/ +#define __UHEAP_MARKEND + + + + +/** +@publishedAll +@released + +Marks the end of checking the current thread's heap. + +The macro expects aCount heap cells to remain allocated at the current nest +level. + +This macro must match an earlier call to __UHEAP_MARK. + +@param aCount The number of heap cells expected to remain allocated at + the current nest level. + +@see User::__DbgMarkEnd() +@see __UHEAP_MARK +*/ +#define __UHEAP_MARKENDC(aCount) + + + + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failure occurs on the next call to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aCount Determines when the allocation will fail. + Heap allocation fails on attempt number aCount - later + allocations will succeed. + For example, if aCount is 3, then heap allocation fails + on the 3rd attempt, but all subsequent allocations succeed. + +@see User::__DbgSetAllocFail() +*/ +#define __UHEAP_FAILNEXT(aCount) + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failures will occur for aBurst times from the next call to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aCount Determines when the allocation will fail. + Heap allocation fails on attempt number aCount - later + allocations will succeed. + For example, if aCount is 3, then heap allocation fails + on the 3rd attempt, but all subsequent allocations succeed. + Note when used with RHeap the maximum value aBurst can be + set to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set + to is KMaxTUint16. + +@see User::__DbgSetBurstAllocFail() +*/ +#define __UHEAP_BURSTFAILNEXT(aCount,aBurst) + + + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aType The type of failure to be simulated. +@param aRate The failure rate. + +@see User::__DbgSetAllocFail() +*/ +#define __UHEAP_SETFAIL(aType,aRate) + +/** +@publishedAll +@released + +Simulates heap allocation failure for the current thread's heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aType The type of failure to be simulated. +@param aRate The failure rate. Note when used with RHeap the maximum value + aRate can be set to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set + to is KMaxTUint16. + +@see User::__DbgSetBurstAllocFail() +@see RAllocator::TAllocFail +*/ +#define __UHEAP_SETBURSTFAIL(aType,aRate,aBurst) + + + +/** +@publishedAll +@released + +Cancels simulated heap allocation failure for the current thread's heap. + +This macro is defined only for debug builds. + +@see User::__DbgSetAllocFail() +*/ +#define __UHEAP_RESET + + + +/** +@publishedAll +@released + +Cancels simulated heap allocation failure for the current thread's heap. +It walks the the heap and sets the nesting level for all allocated +cells to zero. + +This macro is defined only for debug builds. +*/ +#define __UHEAP_TOTAL_RESET + +/** +@publishedAll +@released + +Returns the number of heap allocation failures the current debug allocator fail +function has caused so far. + +This is intended to only be used with fail types RAllocator::EFailNext, +RAllocator::EBurstFailNext, RAllocator::EDeterministic and +RAllocator::EBurstDeterministic. The return value is unreliable for +all other fail types. + +@return The number of heap allocation failures the current debug fail +function has caused. + +@see RAllocator::TAllocFail +*/ +#define __UHEAP_CHECKFAILURE ((TUint)0) + +/** +@publishedAll +@released + +Returns the number of kernel heap allocation failures the current debug +allocator fail function has caused so far. + +This is intended to only be used with fail types RAllocator::EFailNext, +RAllocator::EBurstFailNext, RAllocator::EDeterministic and +RAllocator::EBurstDeterministic. The return value is unreliable for +all other fail types. + +@return The number of heap allocation failures the current debug fail +function has caused. + +@see RAllocator::TAllocFail +*/ +#define __KHEAP_CHECKFAILURE ((TUint)0) + +/** +@publishedAll +@released + +Marks the start of heap checking for the specific heap. + +This macro is defined only for debug builds. + +This macro must be matched by a corresponding call to __RHEAP_MARKEND or __RHEAP_MARKENDC. + +Calls to this macro can be nested but each call must be matched by corresponding +call to __RHEAP_MARKEND or __RHEAP_MARKENDC. + +@param aHeap A pointer to the specific RHeap + +@see RHeap +@see RAllocator::__DbgMarkStart() +@see __RHEAP_MARKEND +@see __RHEAP_MARKENDC +*/ +#define __RHEAP_MARK(aHeap) + + + + +/** +@publishedAll +@released + +Checks that the number of allocated cells at the current nested level on the +specified heap is the same as the specified value. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The number of heap cells expected to be allocated at + the current nest level. + +@see RAllocator::__DbgMarkCheck() +*/ +#define __RHEAP_CHECK(aHeap,aCount) + + + + +/** +@publishedAll +@released + +Checks that the total number of allocated cells on the specified heap is the +same as the specified value. + +The macro also takes the name of the file containing this source code statement +and the line number of this source code statement; they are displayed as part +of the panic category, if the checks fail. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The total number of heap cells expected to be allocated. + +@see RAllocator::__DbgMarkCheck() +*/ +#define __RHEAP_CHECKALL(aHeap,aCount) + + + + +/** +@publishedAll +@released + +Marks the end of heap checking for the specific heap. + +The macro expects zero heap cells to remain allocated at the current nest +level. This macro is defined only for debug builds. + +This macro must match an earlier call to __RHEAP_MARK. + +@param aHeap A pointer to the specific RHeap. + +@see RAllocator::__DbgMarkEnd() +@see __RHEAP_MARK +*/ +#define __RHEAP_MARKEND(aHeap) + + + + +/** +@publishedAll +@released + +Marks the end of heap checking for the specific heap. + +The macro expects aCount heap cells to remain allocated at the current nest +level. This macro is defined only for debug builds. + +This macro must match an earlier call to __RHEAP_MARK. + +@param aHeap A pointer to the specific RHeap. +@param aCount The number of heap cells expected to remain allocated at + the current nest level + +@see RAllocator::__DbgMarkEnd() +@see __RHEAP_MARK +*/ +#define __RHEAP_MARKENDC(aHeap,aCount) + + + + +/** +@publishedAll +@released + +Simulates an allocation failure for the specific heap. + +The failure occurs on the next call to new or any of the functions which allocate +memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The rate of failure - heap allocation fails every aCount attempt. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_FAILNEXT(aHeap,aCount) + +/** +@publishedAll +@released + +Simulates aBurst allocation failures for the specific heap. + +The failure occurs on the next call to new or any of the functions which allocate +memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aCount The heap allocation will fail after aCount-1 allocation attempts. + Note when used with RHeap the maximum value aCount can be set + to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set + to is KMaxTUint16. + +@see RAllocator::__DbgSetBurstAllocFail() +*/ +#define __RHEAP_BURSTFAILNEXT(aHeap,aCount,aBurst) + + + +/** +@publishedAll +@released + +Simulates an allocation failure for the specific heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aType The type of failure to be simulated. +@param aRate The failure rate. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_SETFAIL(aHeap,aType,aRate) + +/** +@publishedAll +@released + +Simulates an allocation failure for the specific heap. + +The failure occurs on subsequent calls to new or any of the functions which +allocate memory from the heap. This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. +@param aType The type of failure to be simulated. +@param aRate The failure rate. Note when used with RHeap the maximum value + aRate can be set to is KMaxTUint16. +@param aBurst The number of consecutive allocations that will fail. Note + when used with RHeap the maximum value aBurst can be set + to is KMaxTUint16. + +@see RAllocator::__DbgSetBurstAllocFail() +*/ +#define __RHEAP_SETBURSTFAIL(aHeap,aType,aRate,aBurst) + + + +/** +@publishedAll +@released + +Cancels simulated allocation failure for the specific heap. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_RESET(aHeap) + + + +/** +@publishedAll +@released + +Cancels simulated allocation failure for the specific heap. +It walks the the heap and sets the nesting level for all allocated +cells to zero. + +This macro is defined only for debug builds. + +@param aHeap A pointer to the specific RHeap. + +@see RAllocator::__DbgSetAllocFail() +*/ +#define __RHEAP_TOTAL_RESET(aHeap) + + +/** +@publishedAll +@released + +Returns the number of heap allocation failures the current debug allocator fail +function has caused so far. + +This is intended to only be used with fail types RAllocator::EFailNext, +RAllocator::EBurstFailNext, RAllocator::EDeterministic and +RAllocator::EBurstDeterministic. The return value is unreliable for +all other fail types. + +@return The number of heap allocation failures the current debug fail +function has caused. + +@see RAllocator::TAllocFail +*/ +#define __RHEAP_CHECKFAILURE(aHeap) ((TUint)0) + +#define __DEBUGGER() +#endif + +#if defined (__WINS__) +/** @internalTechnology */ +#define __EMULATOR_IMAGE_HEADER2(aUid0,aUid1,aUid2,aPriority,aCap0,aCap1,aSid,aVid,aVer,aFlags) TEmulatorImageHeader uid={{aUid0,aUid1,aUid2},aPriority,{aSid,aVid,{aCap0,aCap1}},0,0,aVer,aFlags}; +/** @internalTechnology */ +#define __EMULATOR_IMAGE_HEADER(aUid0,aUid1,aUid2,aPriority,aCap,aFlags) TEmulatorImageHeader uid={{aUid0,aUid1,aUid2},aPriority,{aUid2,0,{aCap,0}},0,0,0x00010000u,aFlags}; +#else +#define __EMULATOR_IMAGE_HEADER2(aUid0,aUid1,aUid2,aPriority,aCap0,aCap1,aSid,aVer,aFlags) +#define __EMULATOR_IMAGE_HEADER(aUid0,aUid1,aUid2,aPriority,aCap,aFlags) +#endif + +#if defined(_UNICODE) +#if !defined(UNICODE) +/** +@publishedAll +@deprecated +*/ +#define UNICODE +#endif +#endif + +#if !defined(ASSERT) +/** +@publishedAll +@released + +Generates _ASSERT_DEBUG code that calls User::Invariant() if the specified +condition is not true. + +@param x A conditional expression which results in true or false. +*/ +#define ASSERT(x) __ASSERT_DEBUG(x,User::Invariant()) +#endif + + + + +#if defined(_DEBUG) +/** +@publishedAll +@released +*/ +#define __DEBUG_ONLY(x) x +#else +#define __DEBUG_ONLY(x) +#endif + + + + +#ifdef __KERNEL_MODE__ + +/** @internalComponent */ +#define KIMPORT_C IMPORT_C + +/** @internalComponent */ +#define KEXPORT_C EXPORT_C + +/** @internalComponent */ +#define UIMPORT_C + +/** @internalComponent */ +#define UEXPORT_C +#else +#define KIMPORT_C +#define KEXPORT_C +#define UIMPORT_C IMPORT_C +#define UEXPORT_C EXPORT_C +#endif + + + + +/** +@publishedAll +@released + +Asserts that a condition is true at compilation time. + +@param x Condition to assert +*/ +#define __ASSERT_COMPILE(x) void __compile_time_assert(int __check[(x)?1:-1]) + +/** +@internalComponent +*/ +static const char* const KSuppressPlatSecDiagnosticMagicValue = (const char*)1; +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ +/** +When this value is used in Platform Security APIs as the value for the aDiagnosticText +argument, these APIs will not emit any form of diagnostic message. +@publishedPartner +@released +*/ +// Note this value is the same as KSuppressPlatSecDiagnosticMagicValue +// and used to be a set by it but that caused an error with GCCE compiler +static const char* const KSuppressPlatSecDiagnostic = (const char*)1; + +#else /* __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ */ + +#ifndef __KERNEL_MODE__ +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +/** +When this value is used in Platform Security APIs as the value for the aDiagnostic +argument, these APIs will not emit any form of diagnostic message. +@publishedPartner +@released +*/ +#define KSuppressPlatSecDiagnostic NULL, NULL + +#else /* __REMOVE_PLATSEC_DIAGNOSTICS__ */ + +/** +When this value is used in Platform Security APIs as the value for the aDiagnostic +argument, these APIs will not emit any form of diagnostic message. +@publishedPartner +@released +*/ +#define KSuppressPlatSecDiagnostic NULL + +#endif /* !__REMOVE_PLATSEC_DIAGNOSTICS__ */ +#endif /* !__KERNEL_MODE__ */ +#endif /* !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ */ + +/* + * MSVC operator new and operator new[] header guards + */ +#ifdef __PLACEMENT_NEW +#define __PLACEMENT_NEW_INLINE +#endif /* __PLACEMENT_NEW */ + +#if defined(__VC32__) && (_MSC_VER < 1300) +#define __PLACEMENT_VEC_NEW_INLINE +#endif /* version of MSVC that doesn't support overloaded operator new[] */ + +/** +Calling convention qualifier for functions involving floating point +variables passed or returned by value. +@publishedAll +@released +*/ +#ifndef __SOFTFP +#define __SOFTFP +#endif /* __SOFTFP */ + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif /* __E32DEF_H__ */ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32def_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32def_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,658 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32def_private.h +// +// + +#ifndef __E32DEF_PRIVATE_H__ +#define __E32DEF_PRIVATE_H__ + +#ifdef __PROFILING__ + +/** +@publishedPartner +@removed +*/ +#define __PROFILE_START(aBin) RDebug::ProfileStart(aBin) + +/** +@publishedPartner +@removed +*/ +#define __PROFILE_END(aBin) RDebug::ProfileEnd(aBin) + +/** +@publishedPartner +@removed +*/ +#define __PROFILE_RESET(aNumberOfBins) RDebug::ProfileReset(0,aNumberOfBins) + +/** +@publishedPartner +@removed +*/ +#define __PROFILE_DISPLAY(aNumberOfBins) \ + { TFixedArray result; \ + RDebug::ProfileResult(result.Begin(), 0, aNumberOfBins); \ + for (TInt i=0; i(const TDesC16 &aDes) const; + inline TBool operator>=(const TDesC16 &aDes) const; + inline TBool operator==(const TDesC16 &aDes) const; + inline TBool operator!=(const TDesC16 &aDes) const; + inline const TUint16 &operator[](TInt anIndex) const; + inline TInt Length() const; + inline TInt Size() const; + IMPORT_C const TUint16 *Ptr() const; + IMPORT_C TInt Compare(const TDesC16 &aDes) const; + IMPORT_C TInt CompareF(const TDesC16 &aDes) const; + IMPORT_C TInt CompareC(const TDesC16 &aDes) const; + IMPORT_C TInt CompareC(const TDesC16& aDes,TInt aMaxLevel,const TCollationMethod* aCollationMethod) const; + /** + @internalComponent + */ + IMPORT_C HBufC16* GetNormalizedDecomposedFormL() const; + /** + @internalComponent + */ + IMPORT_C HBufC16* GetFoldedDecomposedFormL() const; + /** + @internalComponent + */ + IMPORT_C HBufC8* GetCollationKeysL(TInt aMaxLevel,const TCollationMethod* aCollationMethod) const; + IMPORT_C TInt Match(const TDesC16 &aDes) const; + IMPORT_C TInt MatchF(const TDesC16 &aDes) const; + IMPORT_C TInt MatchC(const TDesC16 &aDes) const; + IMPORT_C TInt MatchC(const TDesC16 &aPattern, TInt aWildChar, TInt aWildSequenceChar, + TInt aEscapeChar, TInt aMaxLevel = 3, const TCollationMethod* aCollationMethod = NULL) const; + IMPORT_C TInt MatchC(const TDesC16 &aPattern, const TCollationMethod* aCollationMethod, + TInt aMaxLevel = 3, TInt aWildChar = '?', TInt aWildSequenceChar = '*', TInt aEscapeChar = 0) const; + IMPORT_C TInt Locate(TChar aChar) const; + IMPORT_C TInt LocateReverse(TChar aChar) const; + IMPORT_C TInt Find(const TDesC16 &aDes) const; + IMPORT_C TInt Find(const TUint16 *aBuf,TInt aLen) const; + IMPORT_C TPrefix HasPrefixC(const TDesC16& aPossiblePrefix, TInt aLevel, const TCollationMethod* aCollationMethod) const; + IMPORT_C TPtrC16 Left(TInt aLength) const; + IMPORT_C TPtrC16 Right(TInt aLength) const; + IMPORT_C TPtrC16 Mid(TInt aPos) const; + IMPORT_C TPtrC16 Mid(TInt aPos,TInt aLength) const; + IMPORT_C TInt LocateF(TChar aChar) const; + IMPORT_C TInt LocateReverseF(TChar aChar) const; + IMPORT_C TInt FindF(const TDesC16 &aDes) const; + IMPORT_C TInt FindF(const TUint16 *aBuf,TInt aLen) const; + IMPORT_C TInt FindC(const TDesC16 &aDes) const; + IMPORT_C TInt FindC(const TUint16 *aBuf,TInt aLen) const; + IMPORT_C TInt FindC(const TUint16 *aText,TInt aLength, TInt aMaxLevel) const; + IMPORT_C TInt FindC(const TDesC16 &aDes,TInt &aLengthFound, const TCollationMethod &aMethod,TInt aMaxLevel) const; + IMPORT_C HBufC16 *Alloc() const; + IMPORT_C HBufC16 *AllocL() const; + IMPORT_C HBufC16 *AllocLC() const; +protected: + inline TDesC16() {} + inline TDesC16(TInt aType,TInt aLength); +// delay this for a while +#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS + inline TDesC16( const TDesC16& aOther) : iLength(aOther.iLength) {} +#endif +// inline ~TDesC16() {} Commented out for the moment since it breaks code + inline TInt Type() const; + inline void DoSetLength(TInt aLength); + IMPORT_C const TUint16 &AtC(TInt anIndex) const; +private: + TUint iLength; + __DECLARE_TEST; + }; +// +class TPtrC16 : public TDesC16 +/** +@publishedAll +@released + +16-bit non-modifiable pointer descriptor. + +This is a descriptor class intended for instantiation and encapsulates a +pointer to the 16-bit data that it represents. The data can live in ROM or RAM +and this location is separate from the descriptor object itself. + +The data is intended to be accessed, but not changed, through this descriptor. +The base class provides the functions through which data is accessed. + +@see TPtr16 +@see TDesC16 +@see TDes16 +@see TBufC16 +@see TBuf16 +@see HBufC16 +*/ + { +public: + IMPORT_C TPtrC16(); + IMPORT_C TPtrC16(const TDesC16 &aDes); + IMPORT_C TPtrC16(const TUint16 *aString); + IMPORT_C TPtrC16(const TUint16 *aBuf,TInt aLength); + inline void Set(const TUint16 *aBuf,TInt aLength); + inline void Set(const TDesC16 &aDes); + inline void Set(const TPtrC16 &aPtr); +private: + TPtrC16& operator=(const TPtrC16 &aDes); +protected: + const TUint16 *iPtr; +private: + __DECLARE_TEST; + }; +// +class TDes16Overflow +/** +@publishedAll +@released + +An interface that defines an overflow handler for a 16-bit descriptor. + +The interface encapsulates a function that is called when an attempt to append +formatted text fails because the descriptor is already at its maximum length. + +A derived class must provide an implementation for the Overflow() member function. + +@see TDes16::AppendFormat +*/ + { +public: + /** + Handles the overflow. + + This function is called when the TDes16::AppendFormat() + variant that takes an overflow handler argument, fails. + + @param aDes The 16-bit modifiable descriptor whose overflow results in the + call to this overflow handler. + */ + virtual void Overflow(TDes16 &aDes)=0; + }; +// +class TDes16IgnoreOverflow : public TDes16Overflow +/** +@publishedAll +@released + +A derived class which provides an implementation for the Overflow() member function +where truncation is required. + +@see TDes16::AppendFormat +*/ + { +public: + /** + Handles the overflow. + + This function is called when the TDes16::AppendFormat() + variant that takes an overflow handler argument, fails. + + @param aDes The 16-bit modifiable descriptor whose overflow results in the + call to this overflow handler. + */ + IMPORT_C virtual void Overflow(TDes16 &aDes); + }; +// +class TRealFormat; +class TDes16 : public TDesC16 +/** +@publishedAll +@released + +Abstract base class for 16-bit modifiable descriptors. + +The class encapsulates the data member containing the maximum length of data +represented by a 16-bit descriptor. It also provides member functions through +which the data can be modified. + +The class adds to the behaviour provided by TDesC16. + +This class cannot be instantiated as it is intended to form part of a class +hierarchy; it provides a well defined part of descriptor behaviour. It can, +however, be passed as an argument type for functions which need to both modify +and access descriptor data. + +@see TDes +@see TDesC8 +@see TDesC16 +*/ + { +public: + inline TDes16& operator=(const TUint16 *aString); + inline TDes16& operator=(const TDesC16 &aDes); + inline TDes16& operator=(const TDes16 &aDes); + inline TInt MaxLength() const; + inline TInt MaxSize() const; + inline const TUint16 &operator[](TInt anIndex) const; + inline TUint16 &operator[](TInt anIndex); + inline TDes16 &operator+=(const TDesC16 &aDes); + IMPORT_C void Zero(); + IMPORT_C void SetLength(TInt aLength); + IMPORT_C void SetMax(); + IMPORT_C void Copy(const TDesC8 &aDes); + IMPORT_C void Copy(const TDesC16 &aDes); + IMPORT_C void Copy(const TUint16 *aBuf,TInt aLength); + IMPORT_C void Copy(const TUint16 *aString); + IMPORT_C void Append(TChar aChar); + IMPORT_C void Append(const TDesC16 &aDes); + IMPORT_C void Append(const TUint16 *aBuf,TInt aLength); + IMPORT_C void Fill(TChar aChar); + IMPORT_C void Fill(TChar aChar,TInt aLength); + IMPORT_C void FillZ(); + IMPORT_C void FillZ(TInt aLength); + IMPORT_C void NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth); + IMPORT_C void AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth); + IMPORT_C TPtr16 LeftTPtr(TInt aLength) const; + IMPORT_C TPtr16 RightTPtr(TInt aLength) const; + IMPORT_C TPtr16 MidTPtr(TInt aPos) const; + IMPORT_C TPtr16 MidTPtr(TInt aPos,TInt aLength) const; + IMPORT_C const TUint16 *PtrZ(); + IMPORT_C void CopyF(const TDesC16 &aDes); + IMPORT_C void CopyC(const TDesC16 &aDes); + IMPORT_C void CopyLC(const TDesC16 &aDes); + IMPORT_C void CopyUC(const TDesC16 &aDes); + IMPORT_C void CopyCP(const TDesC16 &aDes); + IMPORT_C void AppendFill(TChar aChar,TInt aLength); + IMPORT_C void ZeroTerminate(); + IMPORT_C void Swap(TDes16 &aDes); + IMPORT_C void Fold(); + IMPORT_C void Collate(); + IMPORT_C void LowerCase(); + IMPORT_C void UpperCase(); + IMPORT_C void Capitalize(); + IMPORT_C void Repeat(const TDesC16 &aDes); + IMPORT_C void Repeat(const TUint16 *aBuf,TInt aLength); + IMPORT_C void Trim(); + IMPORT_C void TrimAll(); + IMPORT_C void TrimLeft(); + IMPORT_C void TrimRight(); + IMPORT_C void Insert(TInt aPos,const TDesC16 &aDes); + IMPORT_C void Delete(TInt aPos,TInt aLength); + IMPORT_C void Replace(TInt aPos,TInt aLength,const TDesC16 &aDes); + IMPORT_C void Justify(const TDesC16 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth); + IMPORT_C void NumUC(TUint64 aVal, TRadix aRadix=EDecimal); + IMPORT_C TInt Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP; + IMPORT_C void Num(TInt64 aVal); + IMPORT_C void Num(TUint64 aVal, TRadix aRadix); + IMPORT_C void Format(TRefByValue aFmt,...); + IMPORT_C void FormatList(const TDesC16 &aFmt,VA_LIST aList); + IMPORT_C void AppendJustify(const TDesC16 &Des,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendJustify(const TDesC16 &Des,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendJustify(const TUint16 *aString,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendJustify(const TUint16 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth); + IMPORT_C void AppendNumUC(TUint64 aVal, TRadix aRadix=EDecimal); + IMPORT_C TInt AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP; + IMPORT_C void AppendNum(TInt64 aVal); + IMPORT_C void AppendNum(TUint64 aVal, TRadix aRadix); + IMPORT_C void AppendFormat(TRefByValue aFmt,TDes16Overflow *aOverflowHandler,...); + IMPORT_C void AppendFormat(TRefByValue aFmt,...); + IMPORT_C void AppendFormatList(const TDesC16 &aFmt,VA_LIST aList,TDes16Overflow *aOverflowHandler=NULL); + IMPORT_C TPtr8 Collapse(); +protected: + inline TDes16() {} + inline TDes16(TInt aType,TInt aLength,TInt aMaxLength); +// delay this for a while +#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS + inline TDes16(const TDes16& aOther) : TDesC16(aOther), iMaxLength(aOther.iMaxLength) {} +#endif + inline TUint16 *WPtr() const; + void DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW); + void DoPadAppendNum(TInt aLength, TInt aW, const TUint8* aBuf); +protected: + TInt iMaxLength; + __DECLARE_TEST; + }; +// +class TPtr16 : public TDes16 +/** +@publishedAll +@released + +16-bit modifiable pointer descriptor + +This is a descriptor class intended for instantiation and encapsulates a +pointer to the 16-bit data that it represents. The data can live in ROM or +RAM and this location is separate from the descriptor object itself. + +The data is intended to be accessed and modified through this descriptor. +The base classes provide the functions through which the data can be +manipulated. + +@see TPtr +@see TPtrC16 +@see TDesC16 +@see TDes16 +@see TBufC16 +@see TBuf16 +@see HBufC16 +*/ + { +public: + IMPORT_C TPtr16(TUint16 *aBuf,TInt aMaxLength); + IMPORT_C TPtr16(TUint16 *aBuf,TInt aLength,TInt aMaxLength); + inline TPtr16& operator=(const TUint16 *aString); + inline TPtr16& operator=(const TDesC16& aDes); + inline TPtr16& operator=(const TPtr16& aDes); + inline void Set(TUint16 *aBuf,TInt aLength,TInt aMaxLength); + inline void Set(const TPtr16 &aPtr); +private: + IMPORT_C TPtr16(TBufCBase16 &aLcb,TInt aMaxLength); +protected: + TUint16 *iPtr; +private: + friend class TBufCBase16; + __DECLARE_TEST; + }; +// +class TBufCBase16 : public TDesC16 +/** +@internalAll +*/ + { +protected: + IMPORT_C TBufCBase16(); + inline TBufCBase16(TInt aLength); + IMPORT_C TBufCBase16(const TUint16 *aString,TInt aMaxLength); + IMPORT_C TBufCBase16(const TDesC16 &aDes,TInt aMaxLength); + IMPORT_C void Copy(const TUint16 *aString,TInt aMaxLength); + IMPORT_C void Copy(const TDesC16 &aDes,TInt aMaxLength); + inline TPtr16 DoDes(TInt aMaxLength); + inline TUint16 *WPtr() const; + }; +// +class RReadStream; +class HBufC16 : public TBufCBase16 +/** +@publishedAll +@released + +16-bit heap descriptor. + +This is a descriptor class which provides a buffer of fixed length, allocated +on the heap, for containing and accessing data. + +The class is intended for instantiation. + +Heap descriptors have the important property that they can be made larger +or smaller, changing the size of the descriptor buffer. This is achieved by +reallocating the descriptor. Unlike the behaviour of dynamic buffers, reallocation +is not done automatically. + +Data is intended to be accessed, but not modified; however, it can be completely +replaced using the assignment operators of this class. The base class (TDesC16) provides +the functions through which the data is accessed. + +The descriptor is hosted by a heap cell, and the 16-bit data that the descriptor +represents is part of the descriptor object itself. The size of the cell depends +on the requested maximum length of the descriptor buffer when the descriptor +is created or re-allocated. + +It is important to note that the size of the allocated cell, and, therefore, +the resulting maximum length of the descriptor, may be larger than requested +due to the way memory is allocated in Symbian OS. The amount by which this +may be rounded up depends on the platform and build type. + +@see HBufC +@see TPtr16 +@see TDesC16 +*/ + { +public: + IMPORT_C static HBufC16 *New(TInt aMaxLength); + IMPORT_C static HBufC16 *NewL(TInt aMaxLength); + IMPORT_C static HBufC16 *NewLC(TInt aMaxLength); + IMPORT_C static HBufC16 *NewMax(TInt aMaxLength); + IMPORT_C static HBufC16 *NewMaxL(TInt aMaxLength); + IMPORT_C static HBufC16 *NewMaxLC(TInt aMaxLength); + IMPORT_C static HBufC16 *NewL(RReadStream &aStream,TInt aMaxLength); + IMPORT_C static HBufC16 *NewLC(RReadStream &aStream,TInt aMaxLength); + IMPORT_C HBufC16& operator=(const TUint16 *aString); + IMPORT_C HBufC16& operator=(const TDesC16 &aDes); + inline HBufC16& operator=(const HBufC16 &aLcb); + IMPORT_C HBufC16 *ReAlloc(TInt aMaxLength); + IMPORT_C HBufC16 *ReAllocL(TInt aMaxLength); + IMPORT_C TPtr16 Des(); +private: + inline HBufC16(TInt aLength); +private: + TText16 iBuf[1]; + __DECLARE_TEST; + }; +// +/** +@internalComponent +*/ +#define __Size16 (sizeof(TInt)/sizeof(TInt16)) +/** +@internalComponent +*/ +#define __Align16(s) ((((s)+__Size16-1)/__Size16)*__Size16) +// +template +class TBufC16 : public TBufCBase16 +/** +@publishedAll +@released + +16-bit non-modifiable buffer descriptor. + +This is a descriptor class which provides a buffer of fixed length for +containing and accessing TUint16 data. + +The class intended for instantiation. The 16-bit data that the descriptor +represents is part of the descriptor object itself. + +The class is templated, based on an integer value which defines the size of +the descriptor's data area. + +The data is intended to be accessed, but not modified; however, it can be +completely replaced using the assignment operators of this class. The base +class provides the functions through which the data is accessed. + +@see TBufC +@see TDesC16 +@see TPtr16 +@see TUint16 +*/ + { +public: + inline TBufC16(); + inline TBufC16(const TUint16 *aString); + inline TBufC16(const TDesC16 &aDes); + inline TBufC16 &operator=(const TUint16 *aString); + inline TBufC16 &operator=(const TDesC16 &aDes); + inline TPtr16 Des(); +protected: + TUint16 iBuf[__Align16(S)]; + }; +// +class TBufBase16 : public TDes16 +/** +@internalAll +*/ + { +protected: + IMPORT_C TBufBase16(TInt aMaxLength); + IMPORT_C TBufBase16(TInt aLength,TInt aMaxLength); + IMPORT_C TBufBase16(const TUint16* aString,TInt aMaxLength); + IMPORT_C TBufBase16(const TDesC16& aDes,TInt aMaxLength); + }; +// +template +class TBuf16 : public TBufBase16 +/** +@publishedAll +@released + +A descriptor class which provides a buffer of fixed length for +containing, accessing and manipulating TUint16 data. + +The class is intended for instantiation. The 16-bit data that the descriptor +represents is part of the descriptor object itself. + +The class is templated, based on an integer value which determines the size +of the data area which is created as part of the buffer descriptor object; +this is also the maximum length of the descriptor. + +The data is intended to be both accessed and modified. The base classes provide +the functions through which the data is accessed. + +@see TBuf +@see TDesC16 +@see TDes16 +@see TPtr16 +*/ + { +public: + inline TBuf16(); + inline explicit TBuf16(TInt aLength); + inline TBuf16(const TUint16* aString); + inline TBuf16(const TDesC16& aDes); + inline TBuf16& operator=(const TUint16* aString); + inline TBuf16& operator=(const TDesC16& aDes); + inline TBuf16& operator=(const TBuf16& aDes); +protected: + TUint16 iBuf[__Align16(S)]; + }; + + +#ifndef __KERNEL_MODE__ + +class RBuf16 : public TDes16 +/** +@publishedAll +@released + +16 bit resizable buffer descriptor. + +The class provides a buffer that contains, accesses and manipulates +TUint16 data. The buffer itself is on the heap, and is managed by the class. + +Internally, RBuf16 behaves in one of two ways: + +- as a TPtr16 descriptor type, where the buffer just contains data +- as a pointer to a heap descriptor, an HBufC16* type, where the buffer + contains both descriptor information and the data. + +Note that the handling of the distinction is hidden from view. + +An RBuf16 object can allocate its own buffer. Alternatively, it can take +ownership of a pre-existing section of allocated memory, or it can take +ownership of a pre-existing heap descriptor. It can also reallocate the buffer +to resize it. Regardless of the way in which the buffer has been allocated, +the RBuf16 object is responsible for freeing memory when the object itself is closed. + +The class is intended for instantiation. + +The class is derived from TDes16, which means that data can be both accessed +and modified. The base classes provide the functions through which the data is +accessed. In addition, an RBuf16 object can be passed to any function that is +prototyped to take a TDes16 or a TDesC16 type. + +@see TBuf16 +@see TPtr16 +@see HBufC16 +@see TDesC16 +@see TDes16 +*/ + { +public: + IMPORT_C RBuf16(); + IMPORT_C explicit RBuf16(HBufC16* aHBuf); + inline RBuf16& operator=(const TUint16* aString); + inline RBuf16& operator=(const TDesC16& aDes); + inline RBuf16& operator=(const RBuf16& aDes); + IMPORT_C void Assign(const RBuf16& aRBuf); + IMPORT_C void Assign(TUint16 *aHeapCell,TInt aMaxLength); + IMPORT_C void Assign(TUint16 *aHeapCell,TInt aLength,TInt aMaxLength); + IMPORT_C void Assign(HBufC16* aHBuf); + IMPORT_C void Swap(RBuf16& aRBuf); + IMPORT_C TInt Create(TInt aMaxLength); + IMPORT_C void CreateL(TInt aMaxLength); + IMPORT_C TInt CreateMax(TInt aMaxLength); + IMPORT_C void CreateMaxL(TInt aMaxLength); + inline void CreateL(RReadStream &aStream,TInt aMaxLength); + IMPORT_C TInt Create(const TDesC16& aDes); + IMPORT_C void CreateL(const TDesC16& aDes); + IMPORT_C TInt Create(const TDesC16& aDes,TInt aMaxLength); + IMPORT_C void CreateL(const TDesC16& aDes,TInt aMaxLength); + IMPORT_C TInt ReAlloc(TInt aMaxLength); + IMPORT_C void ReAllocL(TInt aMaxLength); + IMPORT_C void Close(); + IMPORT_C void CleanupClosePushL(); + +protected: + IMPORT_C RBuf16(TInt aType,TInt aLength,TInt aMaxLength); + RBuf16(const RBuf16&); // Outlaw copy construction + union + { + TUint16* iEPtrType; //Pointer to data used when RBuf is of EPtr type + HBufC16* iEBufCPtrType; //Pointer to data used when RBuf is of EBufCPtr type + }; + __DECLARE_TEST; + }; + +#endif //__KERNEL_MODE__ + + +/** +@publishedAll +@released + +Value reference used in operator TLitC16::__TRefDesC16() + +@see TRefByValue +*/ +typedef TRefByValue __TRefDesC16; + + + + +template +class TLitC16 +/** +@publishedAll +@released + +Encapsulates literal text. + +This is always constructed using an _LIT16 macro. + +This class is build independent; i.e. an explicit 16-bit build variant +is generated for both a non-Unicode build and a Unicode build. + +The class has no explicit constructors. + +@see _LIT16 +*/ + { +public: + inline const TDesC16* operator&() const; + inline operator const TDesC16&() const; + inline const TDesC16& operator()() const; + inline operator const __TRefDesC16() const; +public: +#if defined(__GCC32__) + /** + @internalComponent + */ + typedef wchar_t __TText; +#elif defined(__VC32__) + /** + @internalComponent + */ + typedef TUint16 __TText; +#elif defined(__CW32__) + /** + @internalComponent + */ + typedef TUint16 __TText; +#elif !defined(__TText_defined) +#error no typedef for __TText +#endif +public: + /** + @internalComponent + */ + TUint iTypeLength; + + /** + @internalComponent + */ + __TText iBuf[__Align16(S)]; + }; + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32des16_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32des16_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,26 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32des16_private.h +// +// + +#ifndef __E32DES16_PRIVATE_H__ +#define __E32DES16_PRIVATE_H__ + +/** +@internalComponent +*/ +const TInt KShiftDesType16=28; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32des8.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32des8.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,693 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32des8.h +// +// + +#ifndef __E32DES8_H__ +#define __E32DES8_H__ + +/** +@internalComponent +*/ +const TUint KMaskDesLength8=0xfffffff; + +class TBufCBase8; +class TDes8; +class TPtrC8; +class TPtr8; +class TPtr16; +#ifndef __KERNEL_MODE__ +class HBufC8; +#endif +class TDesC8 +/** +@publishedAll +@released + +Abstract base class for 8-bit non-modifiable descriptors. + +The class encapsulates the data member containing the length of data +represented by an 8-bit descriptor. It also provides member functions through +which the data can be accessed, but not modified. + +Data represented by this class is treated as a contiguous set of 8-bit (i.e. +single byte) values or data items. + +This class cannot be instantiated as it is intended to form part of a class +hierarchy; it provides a well defined part of descriptor behaviour. It can, +however, be passed as an argument type for functions which want access to +descriptor data but do not need to modify that data. + +@see TDesC +@see TPtrC8 +*/ + { +public: + inline TBool operator<(const TDesC8 &aDes) const; + inline TBool operator<=(const TDesC8 &aDes) const; + inline TBool operator>(const TDesC8 &aDes) const; + inline TBool operator>=(const TDesC8 &aDes) const; + inline TBool operator==(const TDesC8 &aDes) const; + inline TBool operator!=(const TDesC8 &aDes) const; + inline const TUint8 &operator[](TInt anIndex) const; + inline TInt Length() const; + inline TInt Size() const; + IMPORT_C const TUint8 *Ptr() const; + IMPORT_C TInt Compare(const TDesC8 &aDes) const; + IMPORT_C TInt Match(const TDesC8 &aDes) const; + IMPORT_C TInt MatchF(const TDesC8 &aDes) const; + IMPORT_C TInt MatchC(const TDesC8 &aDes) const; + IMPORT_C TInt Locate(TChar aChar) const; + IMPORT_C TInt LocateReverse(TChar aChar) const; + IMPORT_C TInt Find(const TDesC8 &aDes) const; + IMPORT_C TInt Find(const TUint8 *pS,TInt aLenS) const; + IMPORT_C TPtrC8 Left(TInt aLength) const; + IMPORT_C TPtrC8 Right(TInt aLength) const; + IMPORT_C TPtrC8 Mid(TInt aPos) const; + IMPORT_C TPtrC8 Mid(TInt aPos,TInt aLength) const; + IMPORT_C TInt CompareF(const TDesC8 &aDes) const; +#ifndef __KERNEL_MODE__ + IMPORT_C TInt CompareC(const TDesC8 &aDes) const; + IMPORT_C TInt LocateF(TChar aChar) const; + IMPORT_C TInt LocateReverseF(TChar aChar) const; + IMPORT_C TInt FindF(const TDesC8 &aDes) const; + IMPORT_C TInt FindF(const TUint8 *pS,TInt aLenS) const; + IMPORT_C TInt FindC(const TDesC8 &aDes) const; + IMPORT_C TInt FindC(const TUint8 *pS,TInt aLenS) const; + IMPORT_C HBufC8 *Alloc() const; + IMPORT_C HBufC8 *AllocL() const; + IMPORT_C HBufC8 *AllocLC() const; +#endif +protected: + inline TDesC8(TInt aType,TInt aLength); + inline TDesC8() {} +// delay this for a while +#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS + inline TDesC8( const TDesC8& aOther) : iLength(aOther.iLength) {} +#endif +// inline ~TDesC8() {} Commented out for the moment since it breaks code + inline TInt Type() const; + inline void DoSetLength(TInt aLength); + IMPORT_C const TUint8 &AtC(TInt anIndex) const; +private: + TUint iLength; + __DECLARE_TEST; + }; +// +class TPtrC8 : public TDesC8 +/** +@publishedAll +@released + +8-bit non-modifiable pointer descriptor. + +This is a descriptor class intended for instantiation and encapsulates a +pointer to the 8-bit data that it represents. The data can live in ROM or RAM +and this location is separate from the descriptor object itself. + +The data is intended to be accessed, but not changed, through this descriptor. +The base class provides the functions through which data is accessed. + +@see TPtr8 +@see TDesC8 +@see TDes8 +@see TBufC8 +@see TBuf8 +@see HBufC8 +*/ + { +public: + IMPORT_C TPtrC8(); + IMPORT_C TPtrC8(const TDesC8 &aDes); + IMPORT_C TPtrC8(const TUint8 *aString); + IMPORT_C TPtrC8(const TUint8 *aBuf,TInt aLength); + inline void Set(const TUint8 *aBuf,TInt aLength); + inline void Set(const TDesC8 &aDes); + inline void Set(const TPtrC8& aPtr); +private: + TPtrC8& operator=(const TPtrC8 &aDes); +protected: + const TUint8 *iPtr; +private: + __DECLARE_TEST; + }; +// +class TDes8Overflow +/** +@publishedAll +@released + +An interface that defines an overflow handler for an 8-bit descriptor. + +The interface encapsulates a function that is called when an attempt to append +formatted text fails because the descriptor is already at its maximum length. + +A derived class must provide an implementation for the Overflow() member +function. + +@see TDes8::AppendFormat +*/ + { +public: + /** + Handles the overflow. + + This function is called when the TDes8::AppendFormat() variant that takes + an overflow handler argument, fails. + + @param aDes The 8-bit modifiable descriptor whose overflow results in the + call to this overflow handler. + */ + virtual void Overflow(TDes8 &aDes)=0; + }; +// +class TDes8IgnoreOverflow : public TDes8Overflow +/** +@publishedAll +@released + +A derived class which provides an implementation for the Overflow() member function +where truncation is required. + +@see TDes16::AppendFormat +*/ + { +public: + /** + Handles the overflow. + + This function is called when the TDes8::AppendFormat() + variant that takes an overflow handler argument, fails. + + @param aDes The 8-bit modifiable descriptor whose overflow results in the + call to this overflow handler. + */ + IMPORT_C virtual void Overflow(TDes8 &aDes); + }; +// +class TDesC16; +class TRealFormat; +class TDes8 : public TDesC8 +/** +@publishedAll +@released + +Abstract base class for 8-bit modifiable descriptors. + +The class encapsulates the data member containing the maximum length of data +represented by an 8-bit descriptor. It also provides member functions through +which the data can be modified. + +The class adds to the behaviour provided by TDesC8. + +This class cannot be instantiated as it is intended to form part of a class +hierarchy; it provides a well defined part of descriptor behaviour. It can, +however, be passed as an argument type for functions which need to both modify +and access descriptor data. + +@see TDes +@see TDesC8 +@see TDesC16 +*/ + { +public: + inline TDes8& operator=(const TUint8 *aString); + inline TDes8& operator=(const TDesC8 &aDes); + inline TDes8& operator=(const TDes8 &aDes); + inline TInt MaxLength() const; + inline TInt MaxSize() const; + inline const TUint8 &operator[](TInt anIndex) const; + inline TUint8 &operator[](TInt anIndex); + inline TDes8 &operator+=(const TDesC8 &aDes); + IMPORT_C void Zero(); + IMPORT_C void SetLength(TInt aLength); + IMPORT_C void SetMax(); + IMPORT_C void Copy(const TDesC8 &aDes); + IMPORT_C void Copy(const TUint8 *aBuf,TInt aLength); + IMPORT_C void Copy(const TUint8 *aString); + IMPORT_C void Copy(const TDesC16 &aDes); + IMPORT_C void Append(TChar aChar); + IMPORT_C void Append(const TDesC8 &aDes); + IMPORT_C void Append(const TDesC16 &aDes); + IMPORT_C void Append(const TUint8 *aBuf,TInt aLength); + IMPORT_C void Fill(TChar aChar); + IMPORT_C void Fill(TChar aChar,TInt aLength); + IMPORT_C void FillZ(); + IMPORT_C void FillZ(TInt aLength); + IMPORT_C void Num(TInt64 aVal); + IMPORT_C void Num(TUint64 aVal, TRadix aRadix); + IMPORT_C void NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth); + IMPORT_C void AppendNum(TInt64 aVal); + IMPORT_C void AppendNum(TUint64 aVal, TRadix aRadix); + IMPORT_C void AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth); +#ifndef __KERNEL_MODE__ + IMPORT_C TPtr8 LeftTPtr(TInt aLength) const; + IMPORT_C TPtr8 RightTPtr(TInt aLength) const; + IMPORT_C TPtr8 MidTPtr(TInt aPos) const; + IMPORT_C TPtr8 MidTPtr(TInt aPos,TInt aLength) const; + IMPORT_C const TUint8 *PtrZ(); + IMPORT_C void CopyF(const TDesC8 &aDes); + IMPORT_C void CopyC(const TDesC8 &aDes); + IMPORT_C void CopyLC(const TDesC8 &aDes); + IMPORT_C void CopyUC(const TDesC8 &aDes); + IMPORT_C void CopyCP(const TDesC8 &aDes); + IMPORT_C void Swap(TDes8 &aDes); + IMPORT_C void AppendFill(TChar aChar,TInt aLength); + IMPORT_C void ZeroTerminate(); + IMPORT_C void Fold(); + IMPORT_C void Collate(); + IMPORT_C void LowerCase(); + IMPORT_C void UpperCase(); + IMPORT_C void Capitalize(); + IMPORT_C void Repeat(const TUint8 *aBuf,TInt aLength); + IMPORT_C void Repeat(const TDesC8 &aDes); + IMPORT_C void Trim(); + IMPORT_C void TrimAll(); + IMPORT_C void TrimLeft(); + IMPORT_C void TrimRight(); + IMPORT_C void Insert(TInt aPos,const TDesC8 &aDes); + IMPORT_C void Delete(TInt aPos,TInt aLength); + IMPORT_C void Replace(TInt aPos,TInt aLength,const TDesC8 &aDes); + IMPORT_C void Justify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth); + IMPORT_C void NumUC(TUint64 aVal, TRadix aRadix=EDecimal); + IMPORT_C TInt Num(TReal aVal,const TRealFormat &aFormat) __SOFTFP; + IMPORT_C void AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth); + IMPORT_C TInt AppendNum(TReal aVal,const TRealFormat &aFormat) __SOFTFP; + IMPORT_C void AppendNumUC(TUint64 aVal,TRadix aRadix=EDecimal); + IMPORT_C void Format(TRefByValue aFmt,...); + IMPORT_C void FormatList(const TDesC8 &aFmt,VA_LIST aList); + IMPORT_C void AppendJustify(const TDesC8 &Des,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendJustify(const TDesC8 &Des,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendJustify(const TUint8 *aString,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendJustify(const TUint8 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill); + IMPORT_C void AppendFormat(TRefByValue aFmt,TDes8Overflow *aOverflowHandler,...); + IMPORT_C void AppendFormat(TRefByValue aFmt,...); + IMPORT_C void AppendFormatList(const TDesC8 &aFmt,VA_LIST aList,TDes8Overflow *aOverflowHandler=NULL); + IMPORT_C TPtr16 Expand(); + IMPORT_C void Collapse(); +#endif //__KERNEL_MODE__ +protected: + inline TDes8(TInt aType,TInt aLength,TInt aMaxLength); + inline TUint8 *WPtr() const; + inline TDes8() {} +// delay this for a while +#ifdef SYMBIAN_FIX_TDESC_CONSTRUCTORS + inline TDes8(const TDes8& aOther) : TDesC8(aOther), iMaxLength(aOther.iMaxLength) {} +#endif + void DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW); + void DoPadAppendNum(TInt aLength, TInt aW, const TUint8* aBuf); +protected: + TInt iMaxLength; + __DECLARE_TEST; + }; +// +class TPtr8 : public TDes8 +/** +@publishedAll +@released + +8-bit modifiable pointer descriptor. + +This is a descriptor class intended for instantiation and encapsulates a +pointer to the 8-bit data that it represents. The data can live in ROM or +RAM and this location is separate from the descriptor object itself. + +The data is intended to be accessed and modified through this descriptor. +The base classes provide the functions through which the data can be +manipulated. + +@see TPtr +@see TPtrC8 +@see TDesC8 +@see TDes8 +@see TBufC8 +@see TBuf8 +@see HBufC8 +*/ + { +public: + IMPORT_C TPtr8(TUint8 *aBuf,TInt aMaxLength); + IMPORT_C TPtr8(TUint8 *aBuf,TInt aLength,TInt aMaxLength); + inline TPtr8& operator=(const TUint8 *aString); + inline TPtr8& operator=(const TDesC8& aDes); + inline TPtr8& operator=(const TPtr8& aPtr); + inline void Set(TUint8 *aBuf,TInt aLength,TInt aMaxLength); + inline void Set(const TPtr8 &aPtr); +private: + IMPORT_C TPtr8(TBufCBase8 &aLcb,TInt aMaxLength); +protected: + TUint8 *iPtr; +private: + friend class TBufCBase8; + __DECLARE_TEST; + }; +// +class TBufCBase8 : public TDesC8 +/** +@internalAll +*/ + { +protected: + IMPORT_C TBufCBase8(); + inline TBufCBase8(TInt aLength); + IMPORT_C TBufCBase8(const TUint8 *aString,TInt aMaxLength); + IMPORT_C TBufCBase8(const TDesC8 &aDes,TInt aMaxLength); + IMPORT_C void Copy(const TUint8 *aString,TInt aMaxLength); + IMPORT_C void Copy(const TDesC8 &aDes,TInt aMaxLength); + inline TPtr8 DoDes(TInt aMaxLength); + inline TUint8 *WPtr() const; + }; +// +#ifndef __KERNEL_MODE__ +class RReadStream; +class HBufC8 : public TBufCBase8 +/** +@publishedAll +@released + +8-bit heap descriptor. + +This is a descriptor class which provides a buffer of fixed length, allocated +on the heap, for containing and accessing data. + +The class is intended for instantiation. + +Heap descriptors have the important property that they can be made larger +or smaller, changing the size of the descriptor buffer. This is achieved by +reallocating the descriptor. Unlike the behaviour of dynamic buffers, +reallocation is not done automatically. + +Data is intended to be accessed, but not modified; however, it can be +completely replaced using the assignment operators of this class. The base +class (TDesC8) provides the functions through which the data is accessed. + +The descriptor is hosted by a heap cell, and the 8-bit data that the +descriptor represents is part of the descriptor object itself. The size of the +cell depends on the requested maximum length of the descriptor buffer when the +descriptor is created or re-allocated. + +It is important to note that the size of the allocated cell, and, therefore, +the resulting maximum length of the descriptor, may be larger than requested +due to the way memory is allocated in Symbian OS. The amount by which this +may be rounded up depends on the platform and build type. + +@see HBufC +@see TPtr8 +@see TDesC8 +*/ + { +public: + IMPORT_C static HBufC8 *New(TInt aMaxLength); + IMPORT_C static HBufC8 *NewL(TInt aMaxLength); + IMPORT_C static HBufC8 *NewLC(TInt aMaxLength); + IMPORT_C static HBufC8 *NewMax(TInt aMaxLength); + IMPORT_C static HBufC8 *NewMaxL(TInt aMaxLength); + IMPORT_C static HBufC8 *NewMaxLC(TInt aMaxLength); + IMPORT_C static HBufC8 *NewL(RReadStream &aStream,TInt aMaxLength); + IMPORT_C static HBufC8 *NewLC(RReadStream &aStream,TInt aMaxLength); + IMPORT_C HBufC8& operator=(const TUint8 *aString); + IMPORT_C HBufC8& operator=(const TDesC8 &aDes); + inline HBufC8& operator=(const HBufC8 &aLcb); + IMPORT_C HBufC8 *ReAlloc(TInt aMaxLength); + IMPORT_C HBufC8 *ReAllocL(TInt aMaxLength); + IMPORT_C TPtr8 Des(); +private: + inline HBufC8(TInt aLength); +private: + TText8 iBuf[1]; + __DECLARE_TEST; + }; +#endif +// +/** +@internalComponent +*/ +#define __Size8 (sizeof(TInt)/sizeof(TInt8)) +/** +@internalComponent +*/ +#define __Align8(s) ((((s)+__Size8-1)/__Size8)*__Size8) +// +template +class TBufC8 : public TBufCBase8 +/** +@publishedAll +@released + +8-bit non-modifiable buffer descriptor. + +This is a descriptor class which provides a buffer of fixed length for +containing and accessing TUint8 data. + +The class intended for instantiation. The 8-bit data that the descriptor +represents is part of the descriptor object itself. + +The class is templated, based on an integer value which defines the size of +the descriptor's data area. + +The data is intended to be accessed, but not modified; however, it can be +completely replaced using the assignment operators of this class. The base +class provides the functions through which the data is accessed. + +@see TBufC +@see TDesC8 +@see TPtr8 +@see TUint8 +*/ + { +public: + inline TBufC8(); + inline TBufC8(const TUint8 *aString); + inline TBufC8(const TDesC8 &aDes); + inline TBufC8 &operator=(const TUint8 *aString); + inline TBufC8 &operator=(const TDesC8 &aDes); + inline TPtr8 Des(); +protected: + TUint8 iBuf[__Align8(S)]; + }; +// +class TBufBase8 : public TDes8 +/** +@internalAll +*/ + { +protected: + IMPORT_C TBufBase8(TInt aMaxLength); + IMPORT_C TBufBase8(TInt aLength,TInt aMaxLength); + IMPORT_C TBufBase8(const TUint8* aString,TInt aMaxLength); + IMPORT_C TBufBase8(const TDesC8& aDes,TInt aMaxLength); + }; +// +template +class TBuf8 : public TBufBase8 +/** +@publishedAll +@released + +A descriptor class which provides a buffer of fixed length for +containing, accessing and manipulating TUint8 data. + +The class is intended for instantiation. The 8-bit data that the descriptor +represents is part of the descriptor object itself. + +The class is templated, based on an integer value which determines the size +of the data area which is created as part of the buffer descriptor object; +this is also the maximum length of the descriptor. + +The data is intended to be both accessed and modified. The base classes provide +the functions through which the data is accessed. + +@see TBuf +@see TDesC8 +@see TDes8 +@see TPtr8 +*/ + { +public: + inline TBuf8(); + inline explicit TBuf8(TInt aLength); + inline TBuf8(const TUint8* aString); + inline TBuf8(const TDesC8& aDes); + inline TBuf8& operator=(const TUint8* aString); + inline TBuf8& operator=(const TDesC8& aDes); + inline TBuf8& operator=(const TBuf8& aBuf); +protected: + TUint8 iBuf[__Align8(S)]; + }; + +// +template +class TAlignedBuf8 : public TBufBase8 +/** +@internalComponent + +A descriptor class functionally identical to TBuf8, the only +difference from it being that TAlignedBuf8's internal buffer +is guaranteed to be 64-bit aligned. + +At present this class is not intended for general use. It exists +solely to support TPckgBuf which derives from it. + +@see TBuf8 +@see TPckgBuf +*/ +{ +public: + inline TAlignedBuf8(); + inline explicit TAlignedBuf8(TInt aLength); + inline TAlignedBuf8(const TUint8* aString); + inline TAlignedBuf8(const TDesC8& aDes); + inline TAlignedBuf8& operator=(const TUint8* aString); + inline TAlignedBuf8& operator=(const TDesC8& aDes); + inline TAlignedBuf8& operator=(const TAlignedBuf8& aBuf); +protected: + union { + double only_here_to_force_8byte_alignment; + TUint8 iBuf[__Align8(S)]; + }; +}; + +#ifndef __KERNEL_MODE__ + +class RBuf8 : public TDes8 +/** +@publishedAll +@released + +8 bit resizable buffer descriptor. + +The class provides a buffer that contains, accesses and manipulates +TUint8 data. The buffer itself is on the heap, and is managed by the class. + +Internally, RBuf8 behaves in one of two ways: + +- as a TPtr8 descriptor type, where the buffer just contains data +- as a pointer to a heap descriptor, an HBufC8* type, where the buffer + contains both descriptor information and the data. + +Note that the handling of the distinction is hidden from view. + +An RBuf8 object can allocate its own buffer. Alternatively, it can take +ownership of a pre-existing section of allocated memory, or it can take +ownership of a pre-existing heap descriptor. It can also reallocate the buffer +to resize it. Regardless of the way in which the buffer has been allocated, +the RBuf8 object is responsible for freeing memory when the object itself is closed. + +The class is intended for instantiation. + +The class is derived from TDes8, which means that data can be both accessed +and modified. The base classes provide the functions through which the data is +accessed. In addition, an RBuf8 object can be passed to any function that is +prototyped to take a TDes8 or a TDesC8 type. + +@see TBuf8 +@see TPtr8 +@see HBufC8 +@see TDesC8 +@see TDes8 +*/ + { +public: + IMPORT_C RBuf8(); + IMPORT_C explicit RBuf8(HBufC8* aHBuf); + inline RBuf8& operator=(const TUint8* aString); + inline RBuf8& operator=(const TDesC8& aDes); + inline RBuf8& operator=(const RBuf8& aDes); + IMPORT_C void Assign(const RBuf8& aRBuf); + IMPORT_C void Assign(TUint8 *aHeapCell,TInt aMaxLength); + IMPORT_C void Assign(TUint8 *aHeapCell,TInt aLength,TInt aMaxLength); + IMPORT_C void Assign(HBufC8* aHBuf); + IMPORT_C void Swap(RBuf8& aRBuf); + IMPORT_C TInt Create(TInt aMaxLength); + IMPORT_C void CreateL(TInt aMaxLength); + IMPORT_C TInt CreateMax(TInt aMaxLength); + IMPORT_C void CreateMaxL(TInt aMaxLength); + inline void CreateL(RReadStream &aStream,TInt aMaxLength); + IMPORT_C TInt Create(const TDesC8& aDes); + IMPORT_C void CreateL(const TDesC8& aDes); + IMPORT_C TInt Create(const TDesC8& aDes,TInt aMaxLength); + IMPORT_C void CreateL(const TDesC8& aDes,TInt aMaxLength); + IMPORT_C TInt ReAlloc(TInt aMaxLength); + IMPORT_C void ReAllocL(TInt aMaxLength); + IMPORT_C void Close(); + IMPORT_C void CleanupClosePushL(); + +protected: + IMPORT_C RBuf8(TInt aType,TInt aLength,TInt aMaxLength); + RBuf8(const RBuf8&); // Outlaw copy construction + union + { + TUint8* iEPtrType; //Pointer to data used when RBuf is of EPtr type + HBufC8* iEBufCPtrType; //Pointer to data used when RBuf is of EBufCPtr type + }; + __DECLARE_TEST; + }; + +#endif + +/** +@publishedAll +@released + +Value reference used in operator TLitC8::__TRefDesC8() + +@see TRefByValue +*/ +typedef TRefByValue __TRefDesC8; + + + + +template +class TLitC8 +/** +@publishedAll +@released + +Encapsulates literal text. + +This is always constructed using an _LIT8 macro. + +This class is build independent; i.e. an explicit 8-bit build variant +is generated for both a non-Unicode build and a Unicode build. + +The class has no explicit constructors. + +@see _LIT8 +*/ + { +public: + inline const TDesC8* operator&() const; + inline operator const TDesC8&() const; + inline const TDesC8& operator()() const; + inline operator const __TRefDesC8() const; +public: + /** + @internalComponent + */ + TUint iTypeLength; + + /** + @internalComponent + */ + TText8 iBuf[__Align8(S)]; + }; + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32des8_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32des8_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,27 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32des8_private.h +// +// + +#ifndef __E32DES8_PRIVATE_H__ +#define __E32DES8_PRIVATE_H__ + +/** +@internalComponent +*/ +const TInt KShiftDesType8=28; + + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32err.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32err.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,632 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32err.h +// +// + +/** + @file + @publishedAll + @released +*/ + +#ifndef __E32ERR_H__ +#define __E32ERR_H__ +#include +#include + + + +/** +System wide error code 0 : this represents the no-error condition. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrNone=0; + + + + +/** +System wide error code -1 : item not found. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrNotFound=(-1); // Must remain set to -1 + + + + +/** +System wide error code -2 : an error that has no specific categorisation. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrGeneral=(-2); + + + + +/** +System wide error code -3 : indicates an operation that has been cancelled. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCancel=(-3); + + + + +/** +System wide error code -4 : an attempt to allocate memory has failed. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrNoMemory=(-4); + + + + +/** +System wide error code -5 : some functionality is not supported in a given context. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +There may be many reasons for this; for example, a device may not support +some specific behaviour. +*/ +const TInt KErrNotSupported=(-5); + + + + +/** +System wide error code -6 : an argument is out of range. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrArgument=(-6); + + + + +/** +System wide error code -7 : a calculation has lost precision. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +This error arises when converting from an internal 96-bit real representation +to a TReal32; the exponent of the internal representation is so small +that the 32-bit real cannot contain it. +*/ +const TInt KErrTotalLossOfPrecision=(-7); + + + + +/** +System wide error code -8 : an invalid handle has been passed. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +A function involving a resource owned by a server or the kernel has +specified an invalid handle. +*/ +const TInt KErrBadHandle=(-8); + + + + +/** +System wide error code -9 : indicates an overflow in some operation. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +In the context of mathematical or time/date functions, indicates a calculation +that has produced arithmetic overflow exceeding the bounds allowed by +the representation. + +In the context of data transfer, indicates that a buffer has over-filled +without being emptied soon enough. +*/ +const TInt KErrOverflow=(-9); + + + + +/** +System wide error code -10 : indicates an underflow in some operation. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +In the context of mathematical or time/date functions, indicates a calculation +that has produced a result smaller than the smallest magnitude of +a finite number allowed by the representation. + +In the context of data transfer, indicates that a buffer was under-filled +when data was required. +*/ +const TInt KErrUnderflow=(-10); + + + + +/** +System wide error code -11 : an object already exists. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +An object of some name/type is to be created, but an object of +that name/type already exists. +*/ +const TInt KErrAlreadyExists=(-11); + + + + +/** +System wide error code -12 : in the context of file operations, a path +was not found. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrPathNotFound=(-12); + + + + +/** +System wide error code -13 : a handle refers to a thread that has died. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrDied=(-13); + + + + +/** +System wide error code -14 : a requested resource is already in exclusive use. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrInUse=(-14); + + + + +/** +System wide error code -15 : client/server send/receive operation cannot run, +because the server has terminated. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrServerTerminated=(-15); + + + + +/** +System wide error code -16 : a client/server send/receive operation cannot run, +because the server is busy handling another request. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrServerBusy=(-16); + + + + +/** +System wide error code -17 : indicates that an operation is complete, +successfully or otherwise. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +This code may be used to indicate that some follow on operation can take place. +It does not necessarily indicate an error condition. +*/ +const TInt KErrCompletion=(-17); + + + + +/** +System wide error code -18 : indicates that a device required by an i/o operation +is not ready to start operations. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +A common reason for returning this code is because a device has not been +initialised, or has no power. +*/ +const TInt KErrNotReady=(-18); + + + + +/** +System wide error code -19 : a device is of unknown type. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrUnknown=(-19); + + + + +/** +System wide error code -20 : indicates that some media is not formatted properly, +or links between sections of it have been corrupted. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCorrupt=(-20); + + + + +/** +System wide error code -21 : access to a file is denied, because the permissions on +the file do not allow the requested operation to be performed. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrAccessDenied=(-21); + + + + +/** +System wide error code -22 : an operation cannot be performed, because the part +of the file to be read or written is locked. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrLocked=(-22); + + + + +/** +System wide error code -23 : during a file write operation, not all the data +could be written. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrWrite=(-23); + + + + +/** +System wide error code -24 : a volume which was to be used for a file system +operation has been dismounted. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrDisMounted=(-24); + + + + +/** +System wide error code -25 : indicates that end of file has been reached. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. + +Note that RFile::Read() is a higher-level interface. When the end of +the file is reached, it returns zero bytes in the destination descriptor, and +a KErrNone return value. KErrEof is not used for this purpose; other error +conditions are returned only if some other error condition was indicated on +the file. +*/ +const TInt KErrEof=(-25); + + + + +/** +System wide error code -26 : a write operation cannot complete, because the disk +is full. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrDiskFull=(-26); + + + + +/** +System wide error code -27 : a driver DLL is of the wrong type. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrBadDriver=(-27); + + + + +/** +System wide error code -28 : a file name or other object name does not conform to +the required syntax. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrBadName=(-28); + + + + +/** +System wide error code -29 : a communication line has failed. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCommsLineFail=(-29); + + + + +/** +System wide error code -30 : a frame error has occurred in +a communications operation. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCommsFrame=(-30); + + + + +/** +System wide error code -31 : an overrun has been detected by +a communications driver. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCommsOverrun=(-31); + + + + +/** +System wide error code -32 : a parity error has occurred in communications. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCommsParity=(-32); + + + + +/** +System wide error code -33 : an operation has timed out. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrTimedOut=(-33); + + + + +/** +System wide error code -34 : a session could not connect. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCouldNotConnect=(-34); + + + + +/** +System wide error code -35 : a session could not disconnect. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCouldNotDisconnect=(-35); + + + + +/** +System wide error code -36 : a function could not be executed because the required +session was disconnected. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrDisconnected=(-36); + + + + +/** +System wide error code -37 : a library entry point was not of the required type. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrBadLibraryEntryPoint=(-37); + + + + +/** +System wide error code -38 : a non-descriptor parameter was passed by +a client interface, when a server expected a descriptor. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrBadDescriptor=(-38); + + + + +/** +System wide error code -39 : an operation has been aborted. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrAbort=(-39); + + + + +/** +System wide error code -40 : a number was too big. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrTooBig=(-40); + + + + +/** +System wide error code -41 : a divide-by-zero operation has been attempted. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrDivideByZero=(-41); // Added by AnnW + + + + +/** +System wide error code -42 : insufficient power was available to +complete an operation. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrBadPower=(-42); + + + + +/** +System wide error code -43 : an operation on a directory has failed. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrDirFull=(-43); + + + + +/** +System wide error code -44 : an operation cannot be performed because +the necessary hardware is not available. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrHardwareNotAvailable=(-44); + + + + +/** +System wide error code -45 : the completion status when an outstanding +client/server message is completed because a shared session has been closed. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrSessionClosed=(-45); + + + + +/** +System wide error code -46 : an operation cannot be performed due to +a potential security violation. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrPermissionDenied=(-46); + + + +/** +System wide error code -47 : a requested extension function is not +supported by the object concerned. + +*/ +const TInt KErrExtensionNotSupported=(-47); + + + +/** +System wide error code -48 : a break has occurred in +a communications operation. + +A system wide error code indicates an error in the environment, or in +user input from which a program may recover. +*/ +const TInt KErrCommsBreak=(-48); + + +/** +System wide error code -49 : a trusted time source could not be found +and any time value given in conjunction with this error code should +not be trusted as correct. +*/ +const TInt KErrNoSecureTime =(-49); + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32event.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32event.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,435 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32event.h +// +// + +#ifndef __E32EVENT_H__ +#define __E32EVENT_H__ +#include +#include + +/** +@publishedAll +@released +*/ +const TInt KUndefinedDeviceNumber = -1; + +/** +@publishedAll +@released + +Represents a raw hardware event as generated by hardware drivers of +a pointer device, a keyboard etc. + +Raw hardware events are added to the kernel's event queue. +*/ +class TRawEvent + { +public: + + /** + Defines the event type. + */ + enum TType + { + + /** + Represents an uninitialised event object. + */ + ENone, + + /** + A pointer device (e.g. a pen) has moved. Only changes in Cartesian coordinates are tracked. + */ + EPointerMove, + + /** + A switch on event caused by a screen tap using a pointer device. + */ + EPointerSwitchOn, + + /** + Represents a keyboard key down event. + */ + EKeyDown, + + /** + Represents a keyboard key up event. + */ + EKeyUp, + + /** + Represents a redraw event. + + Typically generated in an emulator environment in response + to a host OS redraw event. + */ + ERedraw, + + /** + Represents a device switch on event. + */ + ESwitchOn, + + /** + */ + EActive, + + /** + */ + EInactive, + + /** + Represents a modifier key being pressed. + */ + EUpdateModifiers, + + /** + Represents a button down event. + + This is typically used to represent a pointing device + coming into contact with a touch sensitive screen. + */ + EButton1Down, + + /** + Represents a button up event. + + This is typically used to represent a pointing device + being lifted away from a touch sensitive screen. + */ + EButton1Up, + + /** + Represents a button down event. + + This is typically used to represent a pointing device + coming into contact with a touch sensitive screen. + */ + EButton2Down, + + /** + Represents a button up event. + + This is typically used to represent a pointing device + being lifted away from a touch sensitive screen. + */ + EButton2Up, + + /** + Represents a button down event. + + This is typically used to represent a pointing device + coming into contact with a touch sensitive screen. + */ + EButton3Down, + + /** + Represents a button up event. + + This is typically used to represent a pointing device + being lifted away from a touch sensitive screen. + */ + EButton3Up, + + /** + Represents a device switch off event. + */ + ESwitchOff, + + /** + Represents a key being continually pressed event. + */ + EKeyRepeat, + + /** + Represents a case open event. + + The meaning of a case is hardware specific. + */ + ECaseOpen, + + /** + Represents a case close event. + + The meaning of a case is hardware specific. + */ + ECaseClose, + + /** + @prototype + Represents a 3D pointer entering the detection volume event. + + This is typically used to represent a pointing device + coming into detection range of a sensitive screen. + */ + EPointer3DInRange, + + /** + @prototype + Represents a 3D pointer leaving the detection volume event. + + This is typically used to represent a pointing device + leaving the detection range of a sensitive screen. + */ + EPointer3DOutOfRange, + + /** + @prototype + Represents a 3D pointer tilt changes only event. + + This is typically sent by a 3D pointer driver when it detects + a change in the pointer's polar coordinates (Theta or Phi). + */ + EPointer3DTilt, + + /** + @prototype + Represents a 3D pointer rotation only event. + + This is typically sent by a 3D pointer driver when it detects + a rotation of the pointing device (along ist main axis). + */ + EPointer3DRotation, + + /** + @prototype + Represents a general 3D pointer changes event. + + This is typically sent by a 3D pointer driver when it detects + a change in the pointer's linear and/or polar coordinates and/or rotation. + */ + EPointer3DTiltAndMove, + + /** + @prototype + Reserved for a 3D pointing device button down event. + */ + EButton4Down, + + /** + @prototype + Reserved for a 3D pointing device button up event. + */ + EButton4Up, + + /** + @prototype + Reserved for a 3D pointing device button down event. + */ + EButton5Down, + + /** + @prototype + Reserved for a 3D pointing device button up event. + */ + EButton5Up, + + /** + @prototype + Reserved for a 3D pointing device button down event. + */ + EButton6Down, + + /** + @prototype + Reserved for a 3D pointing device button up event. + */ + EButton6Up, + + /** + Represents a device restart event. + */ + ERestartSystem + }; +public: + + /** + Default constructor + */ + inline TRawEvent() + { *(TInt*)&iType=0; } + + /** + Gets the event type + + @return The event type. + */ + inline TType Type() const + {return TType(iType);} + + /** + Gets the device number (eg. screen number) + + @return The device number. + */ + inline TInt DeviceNumber() const + {return TInt(iDeviceNumber-1);} + + /** + Sets the device number (eg. screen number) + + @param aDeviceNumber The device number + */ + inline void SetDeviceNumber(TInt aDeviceNumber) + {iDeviceNumber = TUint8(aDeviceNumber+1);} + + IMPORT_C TPoint Pos() const; + IMPORT_C TInt ScanCode() const; + IMPORT_C TInt Modifiers() const; + + /** + Gets the Cartesian coordinates of the 3D pointer end that is closer to the screen. + + @return The Cartesian coordinates of the point defined by the end of the 3D pointing device that is closer to the screen. + */ + IMPORT_C TPoint3D Pos3D() const; + + + /** + Gets the angular spherical polar coordinates of the 3D pointer end that is closer to the screen. + + @return The angular spherical polar coordinates of the point defined by the end of the 3D pointing device that is closer to the screen. + @see TAngle3D + */ + IMPORT_C TAngle3D Tilt() const; + + /** + Gets the rotation angle of 3D pointing device. + + Some 3D pointing devices support information regarding the angle formed between the physical and magnetical poles, + as obtaining when rotating the pen along its main axis. + + @return The rotation angle of the 3D pointing device. + */ + IMPORT_C TInt Rotation() const; + + /** + Gets the tick count value associated with the event. + + Note that the interval between tick counts is + hardware dependent. + + @return The tick count value + */ + inline TUint Ticks() const + {return iTicks;} + /** + Gets the information on which end of the pointing device is closer to the screen + + @return A Boolean indicating which end of the pointing device is closer to the screen. + */ + inline TBool IsTip() const + {return TBool(iTip);} + + /** + Sets the information on which end of the pointing device is closer to the screen + + @param aTip A Boolean indicating which end of the pointing device is closer to the screen. + */ + inline void SetTip(TBool aTip) + {iTip = TUint8(aTip); +#ifdef BTRACE_TRAWEVENT + BTraceContext4(BTrace::ERawEvent, BTrace::ESetTipEvent,(TUint32)aTip); +#endif + } + + IMPORT_C void Set(TType aType,TInt aScanCode); + IMPORT_C void Set(TType aType,TInt aX,TInt aY); + IMPORT_C void Set(TType aType); + + IMPORT_C void Set(TType aType,TInt aX,TInt aY,TInt aZ); + IMPORT_C void Set(TType aType,TInt aX,TInt aY,TInt aZ,TInt aPhi,TInt aTheta,TInt aAlpha); + + IMPORT_C void SetTilt(TType aType,TInt aPhi,TInt aTheta); + IMPORT_C void SetRotation(TType aType,TInt aAlpha); + + /** + @return the pointer number of the the event + */ + inline TUint8 PointerNumber() const + { + return iPointerNumber; + } + + + /** + The pointer number for the event is set + The pointer number should be more or equal 0 and should be less than HALData::EPointerMaxPointers, + otherwise WSERV would ignore the event,ie 0 <= aPointerNumber < HALData::EPointerMaxPointers + @param aPointerNumber + Error conditions: None. + */ + inline void SetPointerNumber(const TUint8 aPointerNumber) + { + iPointerNumber=aPointerNumber; +#ifdef BTRACE_TRAWEVENT + BTraceContext4(BTrace::ERawEvent, BTrace::ESetPointerNumberEvent,(TUint32)aPointerNumber); +#endif + } + + /** + Initialises the event with the supplied information + @param aType The event type. + @param aX The X position. + @param aY The Y position. + @param aZ The Z position. + @param aPointerNumber The pointer number for the event + */ + IMPORT_C void Set (TType aType, TInt aX, TInt aY, TInt aZ, TUint8 aPointerNumber); + +protected: + TUint8 iType; + TUint8 iTip; /**< Indicates whether the tip or head of pointing device is closer to screen.*/ + TUint8 iPointerNumber; // + TUint8 iDeviceNumber; + TUint iTicks; + union + { + struct {TInt x;TInt y;} pos; + struct {TInt x;TInt y;TInt z;TInt phi;TInt theta;TInt alpha;} pos3D; + TInt scanCode; + TInt modifiers; + } iU; + }; + + + + +/** +@publishedAll +@released + +Encapsulates a hardware event object as a descriptor (package buffer) for +the purpose of data transfer. +*/ +class TRawEventBuf : public TPckgBuf + { +public: + + /** + Gets the hardware event object from the package buffer. + + @return The hardware event object. + */ + inline TRawEvent &Event() const {return(*((TRawEvent *)&iBuf[0]));} + }; + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32event_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32event_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,40 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32event_private.h +// +// + +#ifndef __E32EVENT_PRIVATE_H__ +#define __E32EVENT_PRIVATE_H__ +#include +#include + +/** +@publishedPartner +@released + +Encapsulates information about a device's display screen. +*/ +class TScreenInfoV01 + { +public: + TBool iWindowHandleValid; /**< Indicates whether the window handle is valid.*/ + TAny *iWindowHandle; /**< The window handle.*/ + TBool iScreenAddressValid;/**< Indicates whether the screen address is valid.*/ + TAny *iScreenAddress; /**< The linear address of the screen.*/ + TSize iScreenSize; /**< The size of the screen.*/ + }; +// +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32hal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32hal.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,622 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32hal.h +// +// + +#ifndef __E32HAL_H__ +#define __E32HAL_H__ +#include +#include + +/** +@publishedPartner +@deprecated No replacement. +*/ +const TInt KMaxRomDevices=8; + + + + +/** +@publishedPartner +@released + +Defines the calibration settings that can be restored by +the digitiser's implementation of DDigitiser::RestoreXYInputCalibration. + +See the digitiser template port in: +@code +...\template\template_variant\specific\xyin.cpp +@endcode + +@see DDigitiser::RestoreXYInputCalibration() +*/ +enum TDigitizerCalibrationType + { + EFactory, /**< Restore to factory settings. */ + ESaved /**< Restore to saved settings. */ + }; + + + + +/** +@publishedPartner +@released + +Defines the screen coordinates of the point touched during calibration. + +An object of this type is passed, via a TPckgBuf, to the HAL handler +that deals with the HAL group function-id pair: +- EHalGroupDigitiser, EDigitiserHalSetXYInputCalibration +- EHalGroupDigitiser, EDigitiserHalCalibrationPoints +- EHalGroupDigitiser, EDigitiserHalRestoreXYInputCalibration + +@see EDigitiserHalSetXYInputCalibration +@see EDigitiserHalCalibrationPoints +@see EDigitiserHalRestoreXYInputCalibration +@see TDigitiserHalFunction +@see EHalGroupDigitiser +@see TPckgBuf +*/ +class TDigitizerCalibration + { +public: + TPoint iTl; /**< Top left point.*/ + TPoint iBl; /**< Bottom left point. */ + TPoint iTr; /**< Top right point.*/ + TPoint iBr; /**< Bottom right point.*/ + }; + + + + +/** +@publishedPartner +@released + +An enum that identifies the full set of keyboard types. + +A variable of this type is defined and used in the TKeyboardInfoV01 struct. + +@see TKeyboardInfoV01::iKeyboardType. +*/ +enum TKeyboard + { + EKeyboard_Keypad=1, /**< Keypad type*/ + EKeyboard_Full=2, /**< Full keyboard type*/ + }; + + + + +/** +@publishedPartner +@released + +Encapsulates information about the keyboard. + +NOTE that the information represented here is not used by Symbian OS, +and exists to maintain binary compatibilty with older versions. + +However, keyboard drivers that implement the HAL handler for +the EHalGroupKeyboard group still need to return a default object +of this type. +See the template port. + +An object of this type is passed, via a TPckgBuf, to the HAL handler +that deals with the HAL group function-id pair: +- EHalGroupKeyboard, EKeyboardHalKeyboardInfo; + +@see EKeyboardHalKeyboardInfo +@see TKeyboardHalFunction +@see EHalGroupKeyboard +@see TPckgBuf +*/ +class TKeyboardInfoV01 + { +public: + /** + The number of device keys. + + NOTE that the information represented by this variable is not + used by Symbian OS, and exists to maintain binary compatibility + with older versions. + */ + TInt iDeviceKeys; + + + /** + The number of application keys. + + NOTE that the information represented by this variable is not + used by Symbian OS, and exists to maintain binary compatibility + with older versions. + */ + TInt iAppsKeys; + + + /** + Defines the type of keyboard available as enumerated by + the TKeyboard enum. + + NOTE that the information represented by this variable is not + used by Symbian OS, and exists to maintain binary compatibility + with older versions. + + @see TKeyboard + */ + TKeyboard iKeyboardType; + }; + + + + +/** +@publishedPartner +@released + +Package buffer for a TKeyboardInfoV01 object. + +@see TKeyboardInfoV01 +*/ +typedef TPckgBuf TKeyboardInfoV01Buf; + + + + +/** +@publishedPartner +@released + +Encapsulates information about the digitiser. + +An object of this type is passed, via a TPckgBuf, to the HAL handler +that deals with the HAL group function-id pair: +- EHalGroupDigitiser, EDigitiserHalXYInfo; + +@see EDigitiserHalXYInfo +@see TDigitiserHalFunction +@see EHalGroupDigitiser +@see TPckgBuf +*/ +class TDigitiserInfoV01 + { +public: + TPoint iOffsetToDisplay;/**< The offset in pixels from the digitiser usable area to the display area. */ + TSize iDigitiserSize; /**< The width/height of the display in pixels as used by digitiser.*/ + }; + + +/** +@publishedPartner +@released +Encapsulates extra information required by 3 dimensional pointing devices. +*/ +class TDigitiserInfoV02 : public TDigitiserInfoV01 + { +public : + TInt iZRange; /**< The maximum distance to screen a pointing device will be detected (settable).*/ + TUint8 iThetaSupported; /**< A Boolean value that indicates if Theta polar angle detection (tilt) is supported.*/ + TUint8 iPhiSupported; /**< A Boolean value that indicates if Phi polar angle detection (tilt) is supported.*/ + TUint8 iAlphaSupported; /**< A Boolean value that indicates if rotation of the pointing device along its main axis is supported.*/ + TUint8 iPressureSupported; /**< A Boolean value that indicates if pressure applied on screen is supported.*/ + TInt iProximityStep; /** TDigitiserInfoV01Buf; + +/** +@publishedPartner +@prototype + +Package buffer for a TDigitiserInfoV02 object. + +@see TDigitiserInfoV02 +*/ +typedef TPckgBuf TDigitiserInfoV02Buf; + +/** +@publishedPartner +@released + +Encapsulates information about the mouse display characteristics. + +An object of this type is passed, via a TPckgBuf, to the HAL handler +that deals with the HAL group function-id pair: +- EHalGroupMouse, EMouseHalMouseInfo; + +@see EMouseHalMouseInfo +@see TMouseHalFunction +@see EHalGroupMouse +@see TPckgBuf +*/ +class TMouseInfoV01 + { +public: + TInt iMouseButtons; /**< The number of mouse buttons.*/ + TPoint iOffsetToDisplay; /**< The offset in pixels from the mouse usable area to the display area.*/ + TSize iMouseAreaSize; /**< The width/height of the display in pixels as used by the mouse. */ + }; + + + + +/** +@publishedPartner +@released + +Package buffer for a TMouseInfoV01 object. + +@see TMouseInfoV01 +*/ +typedef TPckgBuf TMouseInfoV01Buf; + + + +/** +@publishedPartner +@released + +Encapsulates Variant specific information. + +An object of this type is passed, via a TPckgBuf, to the HAL handler +that deals with the HAL group function-id pair: +- EHalGroupVariant, EVariantHalVariantInfo; + +@see EVariantHalVariantInfo +@see TVariantHalFunction +@see EHalGroupVariant +@see TPckgBuf +*/ +class TVariantInfoV01 + { +public: + /** + The ROM version. + */ + TVersion iRomVersion; + + /** + The Id that uniquely identifies the device. + */ + SInt64 iMachineUniqueId; + + /** + The bits that represent the LED capabilities. + + NB capabilities in this context does not mean security capabilities. + */ + TUint iLedCapabilities; + + /** + The processor clock speed. + */ + TInt iProcessorClockInKHz; + + /** + The speed factor. + */ + TInt iSpeedFactor; + }; + + + + +/** +@publishedPartner +@released + +Package buffer for a TVariantInfoV01 object. + +@see TVariantInfoV01 +*/ +typedef TPckgBuf TVariantInfoV01Buf; + + + + +/** +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead with attributes ESystemStartupReason. + +The reason that the device last reset + +Note that not all reasons can occur on all devices. +*/ +enum TMachineStartupType + { + EStartupCold,EStartupColdReset,EStartupNewOs, + EStartupPowerFail,EStartupWarmReset,EStartupKernelFault, + EStartupSafeReset + }; + + + + +/** +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead with attributes EPen or EMouse. + +The XY input method supported +*/ +enum TXYInputType + { + EXYInputNone, + EXYInputPointer, + EXYInputMouse, + EXYInputDeltaMouse + }; + + + +/** +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead. + +Miscellaneous machine info. +*/ +class TMachineInfoV1 + { +public: + TVersion iRomVersion; + TXYInputType iXYInputType; + TBool iKeyboardPresent; + TBool iBacklightPresent; + TSize iDisplaySizeInPixels; + TSize iXYInputSizeInPixels; + TSize iPhysicalScreenSize; + TPoint iOffsetToDisplayInPixels; + TInt iKeyboardId; + TInt iDisplayId; + SInt64 iMachineUniqueId; + TUint iLedCapabilities; + TInt iProcessorClockInKHz; + TInt iSpeedFactor; + TInt iMaximumDisplayColors; + }; +/** +@publishedPartner +@deprecated +*/ +typedef TPckgBuf TMachineInfoV1Buf; + + + + +/** +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead with attributes ELanguageIndex or EKeyboardIndex. + +Miscellaneous locale info. +*/ +class TMachineInfoV2 : public TMachineInfoV1 + { +public: + TInt iLanguageIndex; + TInt iKeyboardIndex; + }; +/** +@publishedPartner +@deprecated +*/ +typedef TPckgBuf TMachineInfoV2Buf; + + + + +/** +@publishedPartner +@deprecated Use HAL::Get() from the HAL library instead with attributes EMemoryRAM, EMemoryRAMFree or EMemoryROM. + +Miscellaneous memory info. +*/ +class TMemoryInfoV1 + { +public: + TInt iTotalRamInBytes; + TInt iTotalRomInBytes; + TInt iMaxFreeRamInBytes; + TInt iFreeRamInBytes; + TInt iInternalDiskRamInBytes; + TBool iRomIsReprogrammable; + }; +/** +@publishedPartner +@deprecated +*/ +typedef TPckgBuf TMemoryInfoV1Buf; + + + + +/** +@publishedPartner +@deprecated No replacement. + +Miscellaneous ROM info. +*/ +class TRomInfoEntryV1 + { +public: + enum TRomTypeV1 + { + ERomTypeRom=0, + ERomTypeFlash=1 + }; + TInt iSize; // size of ROM in bytes, 0=no ROM present + TInt iWidth; // bus width in bits + TInt iSpeed; // number of wait states + TRomTypeV1 iType; // 0=ROM, 1=FLASH + }; + + + + +/** +@publishedPartner +@deprecated No replacement. + +Miscellaneous ROM info. +*/ +class TRomInfoV1 + { +public: + TRomInfoEntryV1 iEntry[KMaxRomDevices]; + }; +/** +@publishedPartner +@deprecated +*/ +typedef TPckgBuf TRomInfoV1Buf; + +/** +@publishedPartner +@released +*/ +const TUint KRuggedFileSystem=0x01; + +/** +@publishedPartner +@released +*/ +class TDriveInfoV1 + { +public: + TInt iTotalSupportedDrives; + TInfoName iDriveName[KMaxLocalDrives]; + TInt iTotalSockets; + TInfoName iSocketName[KMaxPBusSockets]; + TInt iRuggedFileSystem; + TUint iRegisteredDriveBitmask; + }; +/** +@publishedPartner +@released +*/ +typedef TPckgBuf TDriveInfoV1Buf; + +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +/** +@publishedPartner +@released +*/ +class TDriveInfoV18 + { +public: + TInt iTotalSupportedDrives; + TBuf8 iDriveName[KMaxLocalDrives]; //TInfoName + TInt iTotalSockets; + TBuf8 iSocketName[KMaxPBusSockets]; //TInfoName + TInt iRuggedFileSystem; + TUint iRegisteredDriveBitmask; + }; +/** +@publishedPartner +@released +*/ +typedef TPckgBuf TDriveInfoV1Buf8; +#else +typedef TDriveInfoV1 TDriveInfoV18; +typedef TDriveInfoV1Buf TDriveInfoV1Buf8; +#endif + +/** +@publishedPartner +@released +*/ +class TExcInfo + { +public: + TAny *iCodeAddress; + TAny *iDataAddress; + TInt iExtraData; + }; + +#ifndef __KERNEL_MODE__ +#include + + + + +/** +@publishedPartner +@released + +A set of user side utility functions for acessing hardware related +information. + +Four of these functions are DEPRECATED and should NOT be used; some of +these functions have replacements, but others do not; see the description of +the individual functions. + +The following functions are not deprecated, but are only used by Symbian +OS as part of its internal implementation: +- UserHal::FaultReason() +- UserHal::ExceptionId() +- UserHal::ExceptionInfo() +- UserHal::PageSizeInBytes() +- UserHal::TickPeriod() +- UserHal::DriveInfo() +- UserHal::SwitchOff() +- UserHal::SetXYInputCalibration() +- UserHal::CalibrationPoints() +- UserHal::SaveXYInputCalibration() +- UserHal::RestoreXYInputCalibration() +*/ +class UserHal + { +public: + // kernel group + IMPORT_C static TInt MemoryInfo(TDes8& anInfo); + IMPORT_C static TInt RomInfo(TDes8& anInfo); + IMPORT_C static TInt StartupReason(TMachineStartupType& aReason); + IMPORT_C static TInt FaultReason(TInt &aReason); + IMPORT_C static TInt ExceptionId(TInt &anId); + IMPORT_C static TInt ExceptionInfo(TExcInfo &aInfo); + IMPORT_C static TInt PageSizeInBytes(TInt& aSize); + + // variant group + IMPORT_C static TInt MachineInfo(TDes8& anInfo); + IMPORT_C static TInt TickPeriod(TTimeIntervalMicroSeconds32& aPeriod); + + // media group + IMPORT_C static TInt DriveInfo(TDes8& anInfo); + + // power group + IMPORT_C static TInt SwitchOff(); + + // digitiser group + IMPORT_C static TInt SetXYInputCalibration(const TDigitizerCalibration& aCalibration); + IMPORT_C static TInt CalibrationPoints(TDigitizerCalibration& aCalibration); + IMPORT_C static TInt SaveXYInputCalibration(); + IMPORT_C static TInt RestoreXYInputCalibration(TDigitizerCalibrationType aType); + }; +#endif +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32hashtab.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32hashtab.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1748 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/include/e32hashtab.h +// +// + +#ifndef __E32HASHTAB_H__ +#define __E32HASHTAB_H__ +#include + +/** +@publishedAll +@released + +Defines a function type used by a THashFunction32 object. + +A function of this type implements an algorithm for producing a 32 bit hash +value from a key. + +@see THashFunction32 +*/ +typedef TUint32 (*TGeneralHashFunction32)(const TAny*); + + +/** +@publishedAll +@released + +A templated class which packages a function that calculates a 32 bit hash +value from a key of templated type. + +A THashFunction32 object is constructed and passed as a parameter to +member functions of the hash table classes RHashSet, RPtrHashSet, +RHashMap and RPtrHashMap. + +@see RHashSet +@see RPtrHashSet +@see RHashMap +@see RPtrHashMap +*/ +template +class THashFunction32 + { +public: + inline THashFunction32( TUint32 (*aHashFunc)(const T&) ) + { iHashFunction = (TGeneralHashFunction32)aHashFunc; } + inline operator TGeneralHashFunction32() const + { return iHashFunction; } + inline TUint32 Hash(const T& aKey) const + { return (*iHashFunction)(&aKey); } +private: + TGeneralHashFunction32 iHashFunction; + }; + + +/** +@publishedAll +@released + +A set of common hashing functions for frequently occurring types. + +@see RHashSet +@see RPtrHashSet +@see RHashMap +@see RPtrHashMap +*/ +class DefaultHash + { +public: + IMPORT_C static TUint32 Integer(const TInt&); + IMPORT_C static TUint32 Des8(const TDesC8&); + IMPORT_C static TUint32 Des16(const TDesC16&); + IMPORT_C static TUint32 IntegerPtr(TInt* const &); + IMPORT_C static TUint32 Des8Ptr(TDesC8* const &); + IMPORT_C static TUint32 Des16Ptr(TDesC16* const &); + }; + + + +class THashTableIterBase; + +/** +@internalComponent + +Base class used in the derivation of RHashSet, RPtrHashSet, +RHashMap and RPtrHashMap. + +This class provides a general hash table implementation using probe sequences +generated by pseudo-double hashing. +The class is internal and is not intended for use. +*/ +class RHashTableBase + { +public: + enum TDefaultSpecifier + { + EDefaultSpecifier_Normal, + }; + +protected: + template + class Defaults + { + public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +protected: + enum TElementState + { + EEmpty=0, // entry is vacant + EDeleted=1, // entry has been deleted + EGen0=2, // entry is occupied, generation number 0 + EGen1=3, // entry is occupied, generation number 1 + EStateMask=3, + EOccupiedMask=2, + }; + + struct SElement + { + inline void SetEmpty() {iHash=EEmpty;} + inline void SetDeleted() {iHash=EDeleted;} + inline TBool IsEmpty() const {return (iHash&EStateMask)==EEmpty;} + inline TBool IsDeleted() const {return (iHash&EStateMask)==EDeleted;} + inline TBool IsEmptyOrDeleted() const {return !(iHash&EOccupiedMask);} + + TUint32 iHash; // bits 2-31 = 30 bit hash value, bits 0,1 = state + }; + +protected: + IMPORT_C RHashTableBase(TGeneralHashFunction32, TGeneralIdentityRelation, TInt aElementSize, TInt aKeyOffset); + IMPORT_C void Close(); + IMPORT_C TAny* Find(const TAny* aKey, TInt aOffset=0) const; + IMPORT_C TAny* FindL(const TAny* aKey, TInt aOffset=0) const; + TInt Insert(const TAny* aKey, TAny*& aElement); + IMPORT_C TInt PtrInsert(const TAny* aKey, const TAny* aValue); + IMPORT_C void PtrInsertL(const TAny* aKey, const TAny* aValue); + IMPORT_C TInt ValueInsert(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize); + IMPORT_C void ValueInsertL(const TAny* aKey, TInt aKeySize, const TAny* aValue, TInt aValueOffset, TInt aValueSize); + IMPORT_C TInt Remove(const TAny* aKey); + IMPORT_C TInt Count() const; + IMPORT_C TInt Reserve(TInt aCount); + IMPORT_C void ReserveL(TInt aCount); + IMPORT_C void ConsistencyCheck(TUint32* aDeleted=0, TUint32* aComparisons=0, TUint32 aChainLimit=0, TUint32* aChainInfo=0); +private: + void SetThresholds(); + TInt ExpandTable(TInt aNewIndexBits); + void ShrinkTable(); + void ReformTable(TUint aNewIndexBits); + void VerifyReform(); +private: + inline SElement* Element(TInt aIndex) + {return (SElement*)(((TUint8*)iElements) + aIndex*iElementSize);} + inline const SElement* ElementC(TInt aIndex) const + {return (const SElement*)(((TUint8*)iElements) + aIndex*iElementSize);} + inline TAny* GetKey(const SElement* aElement) const + {return iKeyOffset ? ((TUint8*)aElement + iKeyOffset) : (TAny*)((TUint32*)aElement)[1];} +private: + TGeneralHashFunction32 iHashFunc; // generates the hash from a given key + TGeneralIdentityRelation iIdFunc; // compare two keys for equality + TUint8 iIndexBits; // number of bits used to index the table + TUint8 iGeneration; // 2 or 3, generation number used when traversing entire table + TUint8 iKeyOffset; // offset to key + TUint8 iPad0; + TAny* iElements; + TUint32 iCount; // number of valid entries + TUint32 iEmptyCount; // number of empty entries + TUint32 iLowerThreshold; // shrink if count drops below this + TUint32 iUpperThreshold; // expand if count rises above this + TUint32 iCleanThreshold; // clean table if count of empty entries falls below this + TInt iElementSize; + TInt iPad1; // expansion room + TInt iPad2; + + friend struct RHashTableBase::SElement; + friend class THashTableIterBase; + friend class HashTest; + }; + + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;} + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;} + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;} + + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::IntegerPtr;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::IntegerPtr;} + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Des8Ptr;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Des8Ptr;} + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Des16Ptr;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Des16Ptr;} + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Integer;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Integer;} + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Integer;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Integer;} + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Integer;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Integer;} + + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Integer;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Integer;} + + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Des8;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Des8;} + + +/** +@internalComponent +*/ +TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults + { +public: + inline static TGeneralHashFunction32 Hash(); + inline static TGeneralIdentityRelation Id(); + }; + +/** +@internalComponent +*/ +inline TGeneralHashFunction32 RHashTableBase::Defaults::Hash() + {return (TGeneralHashFunction32)&DefaultHash::Des16;} + +/** +@internalComponent +*/ +inline TGeneralIdentityRelation RHashTableBase::Defaults::Id() + {return (TGeneralIdentityRelation)&DefaultIdentity::Des16;} + + + + +/** +@internalComponent + +Base class used in the derivation of THashSetIter, TPtrHashSetIter, +THashMapIter and TPtrHashMapIter. + +This class provides iteration capability for the hash table classes derived +from RHashTableBase. +The class is internal and is not intended for use. +*/ +class THashTableIterBase + { +protected: + IMPORT_C THashTableIterBase(const RHashTableBase& aTable); + IMPORT_C void Reset(); + IMPORT_C const TAny* Next(TInt aOffset=0); + IMPORT_C const TAny* Current(TInt aOffset=0) const; + IMPORT_C void RemoveCurrent(); +private: + const RHashTableBase& iTbl; + TInt iIndex; + TInt iPad1; // expansion room + TInt iPad2; + }; + + + +template class THashSetIter; + +/** +@publishedAll +@released + +A templated class which implements an unordered extensional set of objects of +type T using a probe-sequence hash table. The objects are copied into the set +when they are added. A bitwise binary copy is used here, so the type T must +not implement a nontrivial copy constructor. + +*/ +template +class RHashSet : public RHashTableBase + { +private: + friend class THashSetIter; + + struct SFullElement + { + TUint32 iHash; + T iT; + }; + +public: + +/** +A class which allows iteration over the elements of a RHashSet class. + +The set being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see THashSetIter +*/ + typedef THashSetIter TIter; + +/** +Construct a set of objects of type T using a specified hash function and identity relation. +The set is initially empty. + +@param aHash The hash function used to hash the objects of type T. +@param aIdentity The identity relation used to determine if two objects of type T + should be considered identical. +*/ + inline RHashSet(const THashFunction32& aHash, const TIdentityRelation& aIdentity) + : RHashTableBase(aHash, aIdentity, sizeof(SFullElement), _FOFF(SFullElement,iT)) + {} + + +/** +Construct a set of objects of type T using a default hash function and identity relation. +The set is initially empty. +*/ + inline RHashSet() + : RHashTableBase(Defaults::Hash(), Defaults::Id(), sizeof(SFullElement), _FOFF(SFullElement,iT)) + {} + + +/** +Free all memory used by this set. +Returns the set to the same state it had following construction. +*/ + inline void Close() + { RHashTableBase::Close(); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A pointer to the copy of the specified object in the set, if it + exists. The object may not be modified via this pointer. + NULL if the specified object is not a member of this set. +*/ + inline const T* Find(const T& aKey) const + { return (const T*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iT)); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A reference to the copy of the specified object in the set, if it + exists. The object may not be modified via this reference. +@leave KErrNotFound if the specified object is not a member of this set. +*/ + inline const T& FindL(const T& aKey) const + { return *(const T*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iT)); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A pointer to the copy of the specified object in the set, if it + exists. The object may be modified via this pointer. Care should + be taken not to modify any parts of the object which are used by + either the hash function or the identity relation for this set. + If this is done the set may become inconsistent, resulting in + malfunctions and/or panics at a later time. + NULL if the specified object is not a member of this set. +*/ + inline T* Find(const T& aKey) + { return (T*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iT)); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A reference to the copy of the specified object in the set, if it + exists. The object may be modified via this reference. Care should + be taken not to modify any parts of the object which are used by + either the hash function or the identity relation for this set. + If this is done the set may become inconsistent, resulting in + malfunctions and/or panics at a later time. +@leave KErrNotFound if the specified object is not a member of this set. +*/ + inline T& FindL(const T& aKey) + { return *(T*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iT)); } + + +/** +Insert an element into the set. + +If the specified object is not currently a member of the set, a copy of the +object is added to the set and KErrNone is returned. +If the specified object is currently a member of the set, the existing copy +of the object is replaced by the provided object and KErrNone is +returned. +In both cases the object is copied bitwise into the set. + +@param aKey The object of type T to add to the set. +@return KErrNone if the object was added successfully. + KErrNoMemory if memory could not be allocated to store + the copy of aKey. +*/ + inline TInt Insert(const T& aKey) + { return RHashTableBase::ValueInsert(&aKey, sizeof(T), 0, 0, 0); } + + +/** +Insert an element into the set. + +If the specified object is not currently a member of the set, a copy of the +object is added to the set and KErrNone is returned. +If the specified object is currently a member of the set, the existing copy +of the object is replaced by the provided object and KErrNone is +returned. +In both cases the object is copied bitwise into the set. + +@param aKey The object of type T to add to the set. +@leave KErrNoMemory if memory could not be allocated to store + the copy of aKey. +*/ + inline void InsertL(const T& aKey) + { RHashTableBase::ValueInsertL(&aKey, sizeof(T), 0, 0, 0); } + + +/** +Remove an element from the set. + +@param aKey The object to be removed. +@return KErrNone if the object was removed successfully. + KErrNotFound if the object was not present in the set. +*/ + inline TInt Remove(const T& aKey) + { return RHashTableBase::Remove(&aKey); } + + +/** +Query the number of elements in the set. + +@return The number of elements currently in the set. +*/ + inline TInt Count() const + { return RHashTableBase::Count(); } + + +/** +Expand the set to accommodate a specified number of elements. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of elements for which space should be allocated. +@return KErrNone if the operation completed successfully. +@return KErrNoMemory if sufficient memory could not be allocated. +*/ + inline TInt Reserve(TInt aCount) + { return RHashTableBase::Reserve(aCount); } + + +/** +Expand the set to accommodate a specified number of elements. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of elements for which space should be allocated. +@leave KErrNoMemory if sufficient memory could not be allocated. +*/ + inline void ReserveL(TInt aCount) + { RHashTableBase::ReserveL(aCount); } + + }; + + +/** +@publishedAll +@released + +A templated class which allows iteration over the elements of a RHashSet +class. + +The set being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see RHashSet +*/ +template +class THashSetIter : public THashTableIterBase + { +private: + + struct SFullElement + { + TUint32 iHash; + T iT; + }; + +public: + +/** +Construct an iterator over the specified set. +The iterator starts at conceptual position one before the beginning of the list +being iterated. + +@param aSet The set to be iterated over. +*/ + inline THashSetIter(const RHashSet& aSet) + : THashTableIterBase(aSet) + {} + + +/** +Reset the iterator to its initial state. + +@param aSet The set to be iterated over. +*/ + inline void Reset() + { THashTableIterBase::Reset(); } + + +/** +Return the current position of the iterator. + +@return A pointer to the set member corresponding to the current position of the + iterator. + NULL if the iterator has just been constructed or reset, or if it has + previously reached the end of an iteration. +*/ + inline const T* Current() const + { return (const T*)THashTableIterBase::Current(_FOFF(SFullElement,iT)); } + + +/** +Steps the iterator to the next position. + +@return A pointer to the set member corresponding to the next position of the + iterator. + NULL if the iterator has exhausted all the available set elements. +*/ + inline const T* Next() + { return (const T*)THashTableIterBase::Next(_FOFF(SFullElement,iT)); } + + +/** +Removes the element at the current iterator position from the hash table. +If the iterator does not currently point to a valid element, no action is taken. +Note that the iterator position is not altered so it no longer points to a valid +element following the Remove(). It is illegal to call Current() on the iterator +after calling Remove() - the only legal operations are Reset() and Next(). + +*/ + inline void RemoveCurrent() + { THashTableIterBase::RemoveCurrent(); } + }; + + + +template class TPtrHashSetIter; + +/** +@publishedAll +@released + +A templated class which implements an unordered extensional set of objects of +type T using a probe-sequence hash table. The objects are not copied into the set +when they are added; rather the set stores pointers to the contained objects. + +*/ +template +class RPtrHashSet : public RHashTableBase + { +private: + friend class TPtrHashSetIter; + + struct SFullElement + { + TUint32 iHash; + T* iT; + }; + +public: + +/** +A class which allows iteration over the elements of a RPtrHashSet class. + +The set being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see TPtrHashSetIter +*/ + typedef TPtrHashSetIter TIter; + +/** +Construct a set of objects of type T using a specified hash function and identity relation. +The set is initially empty. + +@param aHash The hash function used to hash the objects of type T. +@param aIdentity The identity relation used to determine if two objects of type T + should be considered identical. +*/ + inline RPtrHashSet(const THashFunction32& aHash, const TIdentityRelation& aIdentity) + : RHashTableBase(aHash, aIdentity, sizeof(SFullElement), 0) + {} + + +/** +Construct a set of objects of type T using a default hash function and identity relation. +The set is initially empty. +*/ + inline RPtrHashSet() + : RHashTableBase(Defaults::Hash(), Defaults::Id(), sizeof(SFullElement), 0) + {} + + +/** +Free all memory used by this set. +Returns the set to the same state it had following construction. +*/ + inline void Close() + { RHashTableBase::Close(); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A pointer to the specified object, if it is in the set. + The object may not be modified via this pointer. + NULL if the specified object is not a member of this set. +*/ + inline const T* Find(const T& aKey) const + { return (const T*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iT)); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A reference to the specified object, if it is in the set. + The object may not be modified via this reference. +@leave KErrNotFound if the specified object is not a member of this set. +*/ + inline const T& FindL(const T& aKey) const + { return *(const T*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iT)); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A pointer to the specified object, if it is in the set. + The object may be modified via this pointer. Care should + be taken not to modify any parts of the object which are used by + either the hash function or the identity relation for this set. + If this is done the set may become inconsistent, resulting in + malfunctions and/or panics at a later time. + NULL if the specified object is not a member of this set. +*/ + inline T* Find(const T& aKey) + { return (T*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iT)); } + + +/** +Locate a specified element in the set. + +@param aKey The object of type T to search for. +@return A reference to the specified object, if it is in the set. + The object may be modified via this reference. Care should + be taken not to modify any parts of the object which are used by + either the hash function or the identity relation for this set. + If this is done the set may become inconsistent, resulting in + malfunctions and/or panics at a later time. +@leave KErrNotFound if the specified object is not a member of this set. +*/ + inline T& FindL(const T& aKey) + { return *(T*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iT)); } + + +/** +Insert an element into the set. + +If the specified object is not currently a member of the set, a pointer to the +object is added to the set and KErrNone is returned. +If the specified object is currently a member of the set, the existing pointer +to the object is replaced by the provided pointer and KErrNone is +returned. +In both cases only a pointer to the object is stored - the object is never copied. + +@param aKey A pointer to the object of type T to add to the set. +@return KErrNone if the object was added successfully. + KErrNoMemory if memory could not be allocated to store + the pointer to the new object. +*/ + inline TInt Insert(const T* aKey) + { return RHashTableBase::PtrInsert(aKey, 0); } + + +/** +Insert an element into the set. + +If the specified object is not currently a member of the set, a pointer to the +object is added to the set and KErrNone is returned. +If the specified object is currently a member of the set, the existing pointer +to the object is replaced by the provided pointer and KErrNone is +returned. +In both cases only a pointer to the object is stored - the object is never copied. + +@param aKey A pointer to the object of type T to add to the set. +@leave KErrNoMemory if memory could not be allocated to store the pointer to the new object. +*/ + inline void InsertL(const T* aKey) + { RHashTableBase::PtrInsertL(aKey, 0); } + + +/** +Remove an element from the set. + +@param aKey A pointer to the object to be removed. +@return KErrNone if the object was removed successfully. + KErrNotFound if the object was not present in the set. +*/ + inline TInt Remove(const T* aKey) + { return RHashTableBase::Remove(aKey); } + + +/** +Query the number of elements in the set. + +@return The number of elements currently in the set. +*/ + inline TInt Count() const + { return RHashTableBase::Count(); } + + +/** +Expand the set to accommodate a specified number of elements. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of elements for which space should be allocated. +@return KErrNone if the operation completed successfully. +@return KErrNoMemory if sufficient memory could not be allocated. +*/ + inline TInt Reserve(TInt aCount) + { return RHashTableBase::Reserve(aCount); } + + +/** +Expand the set to accommodate a specified number of elements. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of elements for which space should be allocated. +@leave KErrNoMemory if sufficient memory could not be allocated. +*/ + inline void ReserveL(TInt aCount) + { RHashTableBase::ReserveL(aCount); } + + + void ResetAndDestroy(); + }; + + +/** +@publishedAll +@released + +A templated class which allows iteration over the elements of a RPtrHashSet +class. + +The set being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see RPtrHashSet +*/ +template +class TPtrHashSetIter : public THashTableIterBase + { +private: + + struct SFullElement + { + TUint32 iHash; + T* iT; + }; + +public: + +/** +Construct an iterator over the specified set. +The iterator starts at conceptual position one before the beginning of the list +being iterated. + +@param aSet The set to be iterated over. +*/ + inline TPtrHashSetIter(const RPtrHashSet& aSet) + : THashTableIterBase(aSet) + {} + + +/** +Reset the iterator to its initial state. + +@param aSet The set to be iterated over. +*/ + inline void Reset() + { THashTableIterBase::Reset(); } + + +/** +Return the current position of the iterator. + +@return A pointer to the set member corresponding to the current position of the + iterator. + NULL if the iterator has just been constructed or reset, or if it has + previously reached the end of an iteration. +*/ + inline const T* Current() const + { return (const T*)THashTableIterBase::Current(-_FOFF(SFullElement,iT)); } + + +/** +Steps the iterator to the next position. + +@return A pointer to the set member corresponding to the next position of the + iterator. + NULL if the iterator has exhausted all the available set elements. +*/ + inline const T* Next() + { return (const T*)THashTableIterBase::Next(-_FOFF(SFullElement,iT)); } + + +/** +Removes the element at the current iterator position from the hash table. +If the iterator does not currently point to a valid element, no action is taken. +Note that the iterator position is not altered so it no longer points to a valid +element following the Remove(). It is illegal to call Current() on the iterator +after calling Remove() - the only legal operations are Reset() and Next(). + +*/ + inline void RemoveCurrent() + { THashTableIterBase::RemoveCurrent(); } + }; + + + +template class THashMapIter; + +/** +@publishedAll +@released + +A templated class which implements an associative array with key type K and value type V, +using a probe-sequence hash table. Both the key and value objects are copied into the +table when they are added. A bitwise binary copy is used here, so neither of the types +K and V may implement a nontrivial copy constructor. + +*/ +template +class RHashMap : public RHashTableBase + { +private: + friend class THashMapIter; + + struct SFullElement + { + TUint32 iHash; + K iK; + V iV; + }; + +public: + +/** +A class which allows iteration over the elements of a RHashMap class. + +The array being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see THashMapIter +*/ + typedef THashMapIter TIter; + +/** +Construct an associative array of key-value pairs of type (K,V) using a +specified hash function and identity relation. +The array initially contains no key-value pairs. + +@param aHash The hash function used to hash the key objects of type K. +@param aIdentity The identity relation used to determine if two key objects + of type K should be considered identical. +*/ + inline RHashMap(const THashFunction32& aHash, const TIdentityRelation& aIdentity) + : RHashTableBase(aHash, aIdentity, sizeof(SFullElement), _FOFF(SFullElement,iK)) + {} + + +/** +Construct an associative array of key-value pairs of type (K,V) using a +default hash function and identity relation. +The array initially contains no key-value pairs. +*/ + inline RHashMap() + : RHashTableBase(Defaults::Hash(), Defaults::Id(), sizeof(SFullElement), _FOFF(SFullElement,iK)) + {} + + +/** +Free all memory used by this array. +Returns the array to the same state it had following construction. +*/ + inline void Close() + { RHashTableBase::Close(); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A pointer to the copy of the corresponding value object in the + array, if the specified key object was found. + The value object may not be modified via this pointer. + NULL if the specified key object was not found. +*/ + inline const V* Find(const K& aKey) const + { return (const V*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iV)); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A reference to the copy of the corresponding value object in the + array, if the specified key object was found. + The value object may not be modified via this reference. +@leave KErrNotFound if the specified key object was not found. +*/ + inline const V& FindL(const K& aKey) const + { return *(const V*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iV)); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A pointer to the copy of the corresponding value object in the + array, if the specified key object was found. + The value object may be modified via this pointer. + NULL if the specified key object was not found. +*/ + inline V* Find(const K& aKey) + { return (V*)RHashTableBase::Find(&aKey, _FOFF(SFullElement,iV)); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A reference to the copy of the corresponding value object in the + array, if the specified key object was found. + The value object may be modified via this reference. +@leave KErrNotFound if the specified key object was not found. +*/ + inline V& FindL(const K& aKey) + { return *(V*)RHashTableBase::FindL(&aKey, _FOFF(SFullElement,iV)); } + + +/** +Insert a key-value pair into the array. + +If the specified key object is not found in the array, a copy of the +key object along with a copy of the value object are added to the array +and KErrNone is returned. +If the specified key object is found in the array, the existing copies +of both the key and value objects are replaced by the provided objects +and KErrNone is returned. +In both cases the objects are copied bitwise into the array. + +@param aKey The key object of type K to add to the array. +@param aValue The value object of type V to associate with aKey. +@return KErrNone if the key-value pair was added successfully. + KErrNoMemory if memory could not be allocated to store + the copies of aKey and aValue. +*/ + inline TInt Insert(const K& aKey, const V& aValue) + { return RHashTableBase::ValueInsert(&aKey, sizeof(K), &aValue, _FOFF(SFullElement,iV), sizeof(V)); } + + +/** +Insert a key-value pair into the array. + +If the specified key object is not found in the array, a copy of the +key object along with a copy of the value object are added to the array +and KErrNone is returned. +If the specified key object is found in the array, the existing copies +of both the key and value objects are replaced by the provided objects +and KErrNone is returned. +In both cases the objects are copied bitwise into the array. + +@param aKey The key object of type K to add to the array. +@param aValue The value object of type V to associate with aKey. +@leave KErrNoMemory if memory could not be allocated to store the copies of aKey and aValue. +*/ + inline void InsertL(const K& aKey, const V& aValue) + { RHashTableBase::ValueInsertL(&aKey, sizeof(K), &aValue, _FOFF(SFullElement,iV), sizeof(V)); } + + +/** +Remove a key-value pair from the array. + +@param aKey The key to be removed. +@return KErrNone if the key object and corresponding value object were + removed successfully. + KErrNotFound if the key object was not present in the array. +*/ + inline TInt Remove(const K& aKey) + { return RHashTableBase::Remove(&aKey); } + + +/** +Query the number of key-value pairs in the array. + +@return The number of key-value pairs currently in the array. +*/ + inline TInt Count() const + { return RHashTableBase::Count(); } + + +/** +Expand the array to accommodate a specified number of key-value pairs. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of key-value pairs for which space should be allocated. +@return KErrNone if the operation completed successfully. +@return KErrNoMemory if sufficient memory could not be allocated. +*/ + inline TInt Reserve(TInt aCount) + { return RHashTableBase::Reserve(aCount); } + + +/** +Expand the array to accommodate a specified number of key-value pairs. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of key-value pairs for which space should be allocated. +@leave KErrNoMemory if sufficient memory could not be allocated. +*/ + inline void ReserveL(TInt aCount) + { RHashTableBase::ReserveL(aCount); } + + }; + + +/** +@publishedAll +@released + +A templated class which allows iteration over the elements of a RHashMap +class. + +The array being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see RHashMap +*/ +template +class THashMapIter : public THashTableIterBase + { +private: + + struct SFullElement + { + TUint32 iHash; + K iK; + V iV; + }; + +public: + +/** +Construct an iterator over the specified associative array. +The iterator starts at conceptual position one before the beginning of the list +being iterated. + +@param aMap The array to be iterated over. +*/ + inline THashMapIter(const RHashMap& aMap) + : THashTableIterBase(aMap) + {} + + +/** +Reset the iterator to its initial state. + +@param aSet The set to be iterated over. +*/ + inline void Reset() + { THashTableIterBase::Reset(); } + + +/** +Return the key corresponding to the current position of the iterator. + +@return A pointer to the key object corresponding to the current position of the + iterator. + NULL if the iterator has just been constructed or reset, or if it has + previously reached the end of an iteration. +*/ + inline const K* CurrentKey() const + { return (const K*)THashTableIterBase::Current(_FOFF(SFullElement,iK)); } + + +/** +Steps the iterator to the next position and returns the corresponding key. + +@return A pointer to the key object corresponding to the next position of the + iterator. + NULL if the iterator has exhausted all the available key-value pairs. +*/ + inline const K* NextKey() + { return (const K*)THashTableIterBase::Next(_FOFF(SFullElement,iK)); } + + +/** +Return the value corresponding to the current position of the iterator. + +@return A pointer to the value object corresponding to the current position of the + iterator. + NULL if the iterator has just been constructed or reset, or if it has + previously reached the end of an iteration. +*/ + inline V* CurrentValue() + { return (V*)THashTableIterBase::Current(_FOFF(SFullElement,iV)); } + + +/** +Steps the iterator to the next position and returns the corresponding value. + +@return A pointer to the value object corresponding to the next position of the + iterator. + NULL if the iterator has exhausted all the available key-value pairs. +*/ + inline const V* NextValue() + { return (const V*)THashTableIterBase::Next(_FOFF(SFullElement,iV)); } + + +/** +Removes the element at the current iterator position from the hash table. +If the iterator does not currently point to a valid element, no action is taken. +Note that the iterator position is not altered so it no longer points to a valid +element following the Remove(). It is illegal to call either CurrentKey() or +CurrentValue() on the iterator after calling Remove() - the only legal +operations are Reset(), NextKey() or NextValue(). + +*/ + inline void RemoveCurrent() + { THashTableIterBase::RemoveCurrent(); } + }; + + + +template class TPtrHashMapIter; + +/** +@publishedAll +@released + +A templated class which implements an associative array with key type K and value type V, +using a probe-sequence hash table. Neither the key nor value objects are copied into the +table when they are added - only pointers are stored. + +*/ +template +class RPtrHashMap : public RHashTableBase + { +private: + friend class TPtrHashMapIter; + + struct SFullElement + { + TUint32 iHash; + K* iK; + V* iV; + }; +public: + +/** +A class which allows iteration over the elements of a RPtrHashMap class. + +The array being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see TPtrHashMapIter +*/ + typedef TPtrHashMapIter TIter; + +/** +Construct an associative array of key-value pairs of type (K,V) using a +specified hash function and identity relation. +The array initially contains no key-value pairs. + +@param aHash The hash function used to hash the key objects of type K. +@param aIdentity The identity relation used to determine if two key objects + of type K should be considered identical. +*/ + inline RPtrHashMap(const THashFunction32& aHash, const TIdentityRelation& aIdentity) + : RHashTableBase(aHash, aIdentity, sizeof(SFullElement), 0) + {} + + +/** +Construct an associative array of key-value pairs of type (K,V) using a +default hash function and identity relation. +The array initially contains no key-value pairs. +*/ + inline RPtrHashMap() + : RHashTableBase(Defaults::Hash(), Defaults::Id(), sizeof(SFullElement), 0) + {} + + +/** +Free all memory used by this array. +Returns the array to the same state it had following construction. +*/ + inline void Close() + { RHashTableBase::Close(); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A pointer to corresponding value object if the specified key + object was found. The value object may not be modified via + this pointer. + NULL if the specified key object was not found. +*/ + inline const V* Find(const K& aKey) const + { return (const V*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iV)); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A reference to corresponding value object if the specified key + object was found. The value object may not be modified via + this reference. +@leave KErrNotFound if the specified key object was not found. +*/ + inline const V& FindL(const K& aKey) const + { return *(const V*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iV)); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A pointer to corresponding value object if the specified key + object was found. The value object may be modified via + this pointer. + NULL if the specified key object was not found. +*/ + inline V* Find(const K& aKey) + { return (V*)RHashTableBase::Find(&aKey, -_FOFF(SFullElement,iV)); } + + +/** +Look up a specified key in the associative array and return a pointer to the +corresponding value. + +@param aKey The key object of type K to look up. +@return A reference to corresponding value object if the specified key + object was found. The value object may be modified via + this reference. +@leave KErrNotFound if the specified key object was not found. +*/ + inline V& FindL(const K& aKey) + { return *(V*)RHashTableBase::FindL(&aKey, -_FOFF(SFullElement,iV)); } + + +/** +Insert a key-value pair into the array. + +If the specified key object is not found in the array, a pointer to the +key object along with a pointer to the value object are added to the array +and KErrNone is returned. +If the specified key object is found in the array, the existing pointers +to both the key and value objects are replaced by the provided pointers +and KErrNone is returned. +In both cases only pointers are stored in the array - the objects themselves +are not copied. + +@param aKey A pointer to the key object of type K to add to the array. +@param aValue A pointer to the value object of type V to associate with aKey. +@return KErrNone if the key-value pair was added successfully. + KErrNoMemory if memory could not be allocated to store + the pointers aKey and aValue. +*/ + inline TInt Insert(const K* aKey, const V* aValue) + { return RHashTableBase::PtrInsert(aKey, aValue); } + + +/** +Insert a key-value pair into the array. + +If the specified key object is not found in the array, a pointer to the +key object along with a pointer to the value object are added to the array +and KErrNone is returned. +If the specified key object is found in the array, the existing pointers +to both the key and value objects are replaced by the provided pointers +and KErrNone is returned. +In both cases only pointers are stored in the array - the objects themselves +are not copied. + +@param aKey A pointer to the key object of type K to add to the array. +@param aValue A pointer to the value object of type V to associate with aKey. +@leave KErrNoMemory if memory could not be allocated to store the pointers aKey and aValue. +*/ + inline void InsertL(const K* aKey, const V* aValue) + { RHashTableBase::PtrInsertL(aKey, aValue); } + + +/** +Remove a key-value pair from the array. + +@param aKey A pointer to the key to be removed. +@return KErrNone if the pointers to the key object and corresponding + value object were removed successfully. + KErrNotFound if the key object was not present in the array. +*/ + inline TInt Remove(const K* aKey) + { return RHashTableBase::Remove(aKey); } + + +/** +Query the number of key-value pairs in the array. + +@return The number of key-value pairs currently in the array. +*/ + inline TInt Count() const + { return RHashTableBase::Count(); } + + +/** +Expand the array to accommodate a specified number of key-value pairs. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of key-value pairs for which space should be allocated. +@return KErrNone if the operation completed successfully. +@return KErrNoMemory if sufficient memory could not be allocated. +*/ + inline TInt Reserve(TInt aCount) + { return RHashTableBase::Reserve(aCount); } + + +/** +Expand the array to accommodate a specified number of key-value pairs. +If the set already has enough space for the specified number of elements, no +action is taken. Any elements already in the set are retained. + +@param aCount The number of key-value pairs for which space should be allocated. +@leave KErrNoMemory if sufficient memory could not be allocated. +*/ + inline void ReserveL(TInt aCount) + { RHashTableBase::ReserveL(aCount); } + + + void ResetAndDestroy(); + }; + + +/** +@publishedAll +@released + +A templated class which allows iteration over the elements of a RPtrHashMap +class. + +The array being iterated over may not be modified while an iteration is in progress +or the iteration operations may malfunction or panic. + +@see RPtrHashMap +*/ +template +class TPtrHashMapIter : public THashTableIterBase + { +private: + + struct SFullElement + { + TUint32 iHash; + K* iK; + V* iV; + }; +public: + +/** +Construct an iterator over the specified associative array. +The iterator starts at conceptual position one before the beginning of the list +being iterated. + +@param aMap The array to be iterated over. +*/ + inline TPtrHashMapIter(const RPtrHashMap& aMap) + : THashTableIterBase(aMap) + {} + + +/** +Reset the iterator to its initial state. + +@param aSet The set to be iterated over. +*/ + inline void Reset() + { THashTableIterBase::Reset(); } + + +/** +Return the key corresponding to the current position of the iterator. + +@return A pointer to the key object corresponding to the current position of the + iterator. + NULL if the iterator has just been constructed or reset, or if it has + previously reached the end of an iteration. +*/ + inline const K* CurrentKey() const + { return (const K*)THashTableIterBase::Current(-_FOFF(SFullElement,iK)); } + + +/** +Steps the iterator to the next position and returns the corresponding key. + +@return A pointer to the key object corresponding to the next position of the + iterator. + NULL if the iterator has exhausted all the available key-value pairs. +*/ + inline const K* NextKey() + { return (const K*)THashTableIterBase::Next(-_FOFF(SFullElement,iK)); } + + +/** +Return the value corresponding to the current position of the iterator. + +@return A pointer to the value object corresponding to the current position of the + iterator. + NULL if the iterator has just been constructed or reset, or if it has + previously reached the end of an iteration. +*/ + inline const V* CurrentValue() const + { return (const V*)THashTableIterBase::Current(-_FOFF(SFullElement,iV)); } + + +/** +Steps the iterator to the next position and returns the corresponding value. + +@return A pointer to the value object corresponding to the next position of the + iterator. + NULL if the iterator has exhausted all the available key-value pairs. +*/ + inline const V* NextValue() + { return (const V*)THashTableIterBase::Next(-_FOFF(SFullElement,iV)); } + + +/** +Removes the element at the current iterator position from the hash table. +If the iterator does not currently point to a valid element, no action is taken. +Note that the iterator position is not altered so it no longer points to a valid +element following the Remove(). It is illegal to call either CurrentKey() or +CurrentValue() on the iterator after calling Remove() - the only legal +operations are Reset(), NextKey() or NextValue(). + +*/ + inline void RemoveCurrent() + { THashTableIterBase::RemoveCurrent(); } + }; + + + +/** +Deletes all the objects of type T to which pointers are stored in this set. +Then frees all the memory used by the set and returns the set to the same state +as immediately following construction. +*/ +template +void RPtrHashSet::ResetAndDestroy() + { + TPtrHashSetIter iter(*this); + T* p; + do { + p = (T*)iter.Next(); + delete p; + } while(p); + Close(); + } + + +/** +Deletes all the key objects of type K and corresponding value objects of type V +to which pointers are stored in this array. +Then frees all the memory used by the array and returns the array to the same +state as immediately following construction. +*/ +template +void RPtrHashMap::ResetAndDestroy() + { + TPtrHashMapIter iter(*this); + K* p; + V* q; + do { + p = (K*)iter.NextKey(); + q = (V*)iter.CurrentValue(); + delete p; + delete q; + } while(p); + Close(); + } + + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32huffman.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32huffman.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,131 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32huffman.h +// +// + +#include + +/** @file + @internalTechnology +*/ + +/** Bit output stream. + Good for writing bit streams for packed, compressed or huffman data algorithms. + + This class must be derived from and OverflowL() reimplemented if the bitstream data + cannot be generated into a single memory buffer. +*/ +class TBitOutput + { +public: + IMPORT_C TBitOutput(); + IMPORT_C TBitOutput(TUint8* aBuf,TInt aSize); + inline void Set(TUint8* aBuf,TInt aSize); + inline const TUint8* Ptr() const; + inline TInt BufferedBits() const; +// + IMPORT_C void WriteL(TUint aValue, TInt aLength); + IMPORT_C void HuffmanL(TUint aHuffCode); + IMPORT_C void PadL(TUint aPadding); +private: + void DoWriteL(TUint aBits, TInt aSize); + virtual void OverflowL(); +private: + TUint iCode; // code in production + TInt iBits; + TUint8* iPtr; + TUint8* iEnd; + }; + +/** Set the memory buffer to use for output + + Data will be written to this buffer until it is full, at which point OverflowL() will + be called. This should handle the data and then can Set() again to reset the buffer + for further output. + + @param aBuf The buffer for output + @param aSize The size of the buffer in bytes +*/ +inline void TBitOutput::Set(TUint8* aBuf,TInt aSize) + {iPtr=aBuf;iEnd=aBuf+aSize;} + +/** Get the current write position in the output buffer + + In conjunction with the address of the buffer, which should be known to the + caller, this describes the data in the bitstream. +*/ +inline const TUint8* TBitOutput::Ptr() const + {return iPtr;} + +/** Get the number of bits that are buffered + + This reports the number of bits that have not yet been written into the + output buffer. It will always lie in the range 0..7. Use PadL() to + pad the data out to the next byte and write it to the buffer. +*/ +inline TInt TBitOutput::BufferedBits() const + {return iBits+8;} + + +/** Bit input stream. Good for reading bit streams for packed, compressed or huffman + data algorithms. +*/ +class TBitInput + { +public: + IMPORT_C TBitInput(); + IMPORT_C TBitInput(const TUint8* aPtr, TInt aLength, TInt aOffset=0); + IMPORT_C void Set(const TUint8* aPtr, TInt aLength, TInt aOffset=0); +// + IMPORT_C TUint ReadL(); + IMPORT_C TUint ReadL(TInt aSize); + IMPORT_C TUint HuffmanL(const TUint32* aTree); +private: + virtual void UnderflowL(); +private: + TInt iCount; + TUint iBits; + TInt iRemain; + const TUint32* iPtr; + }; + +/** Huffman code toolkit. + + This class builds a huffman encoding from a frequency table and builds + a decoding tree from a code-lengths table + + The encoding generated is based on the rule that given two symbols s1 and s2, with + code length l1 and l2, and huffman codes h1 and h2: + + if l1 + +/** +@publishedAll +@released + +These panics represent program errors detected by the Kernel. +Typically, they are caused by passing bad or contradictory parameters +to functions. Threads that cause exceptions also raise a KERN-EXEC type panic. +*/ +enum TKernelPanic + { + + /** + This panic is raised when the Kernel cannot find an object in + the object index for the current process, or current thread, using + a specified object index number (the raw handle number). + */ + EBadHandle=0, + + /** + This is a general panic raised as a result of attempting + some unauthorised activity such as trying to suspend a thread, + or trying to set the priority of a thread, when not authorised to do so. + */ + EAccessDenied=1, + + /** + This panic is raised by the kernel when opening a kernel side object, + a DObject type, and the fullname is invalid. + */ + EBadName=2, + + /** + This panic is raised when an unhandled exception occurs. + Exceptions have many causes, but the most common are access violations + caused, for example, by dreferencing NULL. + + Among other possible causes are: + general protection faults, executing an invalid instruction, + alignment checks, etc. + */ + ECausedException=3, + + /** + Not used. + */ + ECompletion=4, + + /** + Not used. + */ + ELeaveWithoutTrap=5, + + /** + This panic is raised by the kernel when a handle to a code segment + is invalid. + */ + EBadCodeSegHandle=6, + + /** + Not used. + */ + ESegmentWriteOutOfRange=7, + + /** + Not used. + */ + EChunkSizeTooBig=8, + + /** + This is a general panic raised by the kernel when an attempt + is made to issue a request when one is already outstanding, and only one + outstanding request is permitted at any one time. + */ + ERequestAlreadyPending=9, + + /** + This panic is raised by the Request() member function of + the DLogicalChannel() kernel object when the request number passed + to the function is smaller than the permitted minimum. + + @see DLogicalChannel::EMinRequestId + */ + ERequestNoInvalid=10, + + /** + This panic is raised when creating a logical channel, and the unit number + is outside the permitted range. + + If unit numbers are not permmitted, the unit number value + must be KNullUnit. + If unit numbers are permitted, the unit number value must + be less than KMaxUnits. + */ + EBadUnitNumber=11, + + /** + This panic is raised by the kernel if an event capture + hook has already been designated. + */ + EEventAlreadyCaptured=12, + + /** + This panic is raised by the kernel if the current thread is not + the designated event capture hook. + */ + EEventNotCaptured=13, + + /** + This panic is raised when an attempt is made to set the priority of + a thread or process to an illegal value. + */ + EBadPriority=14, + + /** + This panic is raised when a timer event is requested from an asynchronous + timer service, an RTimer, and a timer event is already outstanding. + It is caused by calling either the At(), After() or Lock() member functions + after a previous call to any of these functions but before the timer event + requested by those functions has completed. + */ + ETimerAlreadyPending=15, + + /** + Not used. + */ + EAlreadyLoggedOn=16, + + /** + The panic is raised if kernel heap checking has failed. + */ + EFailedKernelHeapCheck=17, + + /** + Not used. + */ + ERequestFromWrongThread=18, + + /** + This panic is raised by the Kernel when a server program issues a request + to receive a message, i.e. when it calls the Receive() member function + of RServer, the handle to the Kernel side server object. + + The panic occurs when a receive message request has previously been made + and is still outstanding. + */ + EMesAlreadyPending=19, + + /** + This panic is raised by the Kernel when a request for an event + (as originated by a call to UserSvr::RequestEvent()) is made while + a previously made request is still outstanding. + */ + EEventRequestPending=20, + + /** + Not used. + */ + EIllegalWsProcess=21, + + /** + Not used. + */ + EHardwareNotAvailable=22, + + /** + This panic is raised when attempting to create a session with a server, + and access is been denied. + */ + EUnsharableSession=23, + + /** + This panic is raised when writing global DLL data, and the length of + data to be written is greater than the space available. + */ + EDesOverflow=24, + + /** + This panic is raised when searching for objects, using the internal + function TFindHandleBase::NextObject(), and an invalid object type + is specified. + */ + EBadObjectType=25, + + /** + This panic is raised by kernel side code that implements heap debugging + behaviour, when a specific debug request is not recognised. + */ + EBadKernelHeapDebugFunction=26, + + /** + This panic is raised when an executive call is made with an invalid call + number. + */ + EInvalidSystemCall=27, + + /** + Not used. + */ + ESetSessionPtrInvalidMessage=28, + + /** + Not used. + */ + ECompleteDisconnectInvalidMessage=29, + + /** + This panic is raised when an attempt is being made to send + a synchronous message to a server more than once, using + the current thread's dedicated synchronous message. + */ + ESyncMsgSentTwice=30, + + /** + Not used. + */ + EAutoAttachFailed=31, + + /** + This panic is called by DProcess::Resume() when trying to resume + a process that is still being loaded. + */ + EProcessNotLoaded=32, + + /** + This panic is raised in a call to Kern::KUDesInfo(), Kern::KUDesPut() etc + when an invalid descriptor is passed. + */ + EKUDesInfoInvalidType=33, + + /** + This panic is raised in a call to Kern::KUDesSetLength() & Kern::KUDesPut() + when the descriptor passed to it is not a modifiable type. + */ + EKUDesSetLengthInvalidType=34, + + /** + This panic is raised in a call to Kern::KUDesSetLength() & Kern::KUDesPut() + when the length of the source descriptor is longer than the length of + the target descriptor. + */ + EKUDesSetLengthOverflow=35, + + /** + This panic is raised by the kernel side code that implements the setting + of the currency symbol when the length of the currency symbol is + greater than KMaxCurrencySymbol. + */ + EBadParameter=36, + + /** + This panic is raised by kernel code when it tries to acquire the process + DLL lock just before a load, and the wait DLL lock is invalid. + */ + EWaitDllLockInvalid=37, + + /** + This panic is raised by internal kernel code when an illegal attempt + is made to attatch to a library. + */ + ELibraryAttachInvalid=38, + + /** + This panic is raised when extracting a list of DLL entry points + and the number exceeds the maximum permitted. + */ + ETooManyEntryPoints=39, + + /** + This panic is raised by internal kernel code when an illegal attempt + is made to detach a library. + */ + ELibraryDetachInvalid=40, + + /** + This panic is raised by internal kernel code when an illegal attempt + is made to attach to a library. + */ + ELibraryAttachedInvalid=41, + + /** + This panic is raised by internal kernel code when an illegal attempt + is made to detach a library. + */ + ELibraryDetachedInvalid=42, + + /** + This panic is raised by kernel code when it tries to release the process DLL lock + when a load fails, and the release DLL lock is invalid. + */ + EReleaseDllLockInvalid=43, + + /** + This panic is raised when a bad message handle is passed to the kernel. + This usually occurs when using methods on the RMessagePtr2 or RMessage2 classes + after the message has been completed; or when the iHandle data member has become + corrupted. + */ + EBadMessageHandle=44, + + /** + Not used. + */ + EInvalidMessageParameter=45, + + /** + This panic can be raised as a result of a call to one of a large + number of functions. In general, the panic indicates an attempt to perform an + operation on a thread or process by code running in another process - violating + the security principle of process isolation. + + There are exceptions to this general rule, for example, where the + panic is raised because the calling process has insufficient capability. The + precise reason is stated with the function(s). + + -# The panic is raised on a call to the following function if the + process owning the thread performing the call is not the creator of the target + process or, if a handle is specified, the handle is not local. + - RProcess::SetParameter() + . + -# The panic is raised on a call to the following functions if the + process owning the thread performing the call is not the same as the target + process.\n + - RProcess::Kill() + - RProcess::Terminate() + - RProcess::Panic() + - RProcess::SetJustInTime() + - RProcess::Resume() + - RThread::Kill() + - RThread::Terminate() + - RThread::Panic() + - RThread::Suspend() + - RThread::Resume() + - RThread::SetPriority() + - RThread::RequestComplete() + - RThread::RequestSignal() + . + NOTE: the creator of a new process can kill or panic the new + process, change the new process priority and set the new process startup + parameters until the process is resumed (which the creator can also do). After + the new process has been resumed, then it becomes totally independent of its + creator, and any attempt to panic it, kill it etc will raise the KERN-EXEC 46 + panic. + -# The panic is raised on call to the following (Symbian partner + only) functions if the calling process does not have the PowerMgmt + capability (TCapability::ECapabilityPowerMgmt): + - Power::PowerDown() + - Power::EnableWakeupEvents() + - Power::DisableWakeupEvents() + - Power::RequestWakeupEventNotification() + - Power::CancelWakeupEventNotification() + . + -# The panic is raised on call to the following functions if the + calling process does not have the WriteDeviceData capability + (TCapability::ECapabilityWriteDeviceData): + - User::SetMachineConfiguration() + - User::SetHomeTime() + - User::SetUTCTime() + - User::SetUTCOffset() + - User::SetUTCTimeAndOffset() + . + -# The panic is raised on call to the following function if the + calling process does not have the ReadDeviceData capability + (TCapability::ECapabilityReadDeviceData): + - User::MachineConfiguration() + . + */ + EPlatformSecurityTrap=46, + + /** + This panic is raised when the user issues a request to be notified of + messages or the availability of space, when a request has already been + issued and is still outstanding. + + @see RMsgQueue + */ + EMsgQueueRequestPending=47, + + /** + This panic is raised when creating a message queue and the size of + the template parameter is invalid. + + @see RMsgQueue + */ + EMsgQueueInvalidLength=48, + + /** + This panic is raised when creating a message queue and the specified number + of slots is not positive. + + @see RMsgQueue + */ + EMsgQueueInvalidSlots=49, + + /** + This panic is raised if an attempt is made to cancel an outstanding request + to be notified of messages or the availability of space, and the cancel is + being made by a thread in a different process. + */ + EMsgQueueIllegalCancel=50, + + /** + This panic is raised by RProcess::Setparameter() + if a slot value is invalid. + */ + EParameterSlotRange=51, + + /** + This panic is raised by RProcess::Setparameter() + if a slot is in use. + */ + EParameterSlotInUse=52, + + /** + This panic is raised by RProcess::Setparameter() + if the length of the data passed is negative. + */ + EParameterSlotDataLength=53, + + /** + This panic is raised by RCondVar::Wait() when the current thread does + not hold the specified mutex. + */ + ECondVarWaitMutexNotLocked=54, + + /** + This panic is raised when a call is made to RThread::GetDesMaxLength(), + which is obsolete. + */ + EObsoleteFunctionality=55, + + /** + This panic is raised on a process which has not yet been resumed and whoes + creator has died. + */ + EZombieProcessKilled=56, + + /** + A connect message was sent to a session that has already been successfully + connected to the server (cookie is non-NULL). + */ + ESessionAlreadyConnected=57, + + /** + A session tried to set the kernel session cookie to a null value + */ + ESessionNullCookie=58, + + /** + A session tried to set the kernel session cookie twice + */ + ESessionCookieAlreadySet=59, + + /** + A session tried to set the kernel session cookie with a message + that wasn't the connect message + */ + ESessionInvalidCookieMsg=60, + + /** + A realtime thread executed a non-realtime function. + */ + EIllegalFunctionForRealtimeThread=61, + + /** + This panic is raised by Kern::SetThreadRealtimeState when the state argument is invalid. + */ + EInvalidRealtimeState=62, + + /** + An invalid notification type was passed to a shared buffers exec call handler. + */ + EShBufExecBadNotification=64, + + /** + An invalid parameter was passed to a shared buffers exec call handler. + */ + EShBufExecBadParameter=65, + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32ktran.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32ktran.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,110 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32ktran.h +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef __E32KTRAN_H__ +#define __E32KTRAN_H__ +#include +#include +#include +// +class TMaskedModifiers + { +public: + TUint iMask; + TUint iValue; + }; +// +enum TPattern + { + EAnyKey=0x00, + EAnyAlphaNumeric, + EAnyAlpha, + EAnyAlphaLowerCase, + EAnyAlphaUpperCase, + EAnyDecimalDigit, + EAnyDigitGivenRadix, + EAnyModifierKey, + EMatchKey=0x40, + EMatchKeyCaseInsens, + EMatchLeftOrRight + }; +// +class TKeyCodePattern + { +public: + TUint16 iKeyCode; + TInt8 iPattern; + TInt8 iFiller; + }; +// +class TCaptureKey + { +public: + TMaskedModifiers iModifiers; + TKeyCodePattern iKeyCodePattern; + TUint iApp; + TUint iHandle; + }; +// +class TKeyData + { +public: + TInt iModifiers; + TInt iApp; + TInt iHandle; + TBool iIsCaptureKey; + TUint iKeyCode; + }; +// +class CCaptureKeys: public CBase + { +public: + IMPORT_C CCaptureKeys(); + IMPORT_C ~CCaptureKeys(); + IMPORT_C void Construct(); + IMPORT_C void AddCaptureKeyL(const TCaptureKey &aCaptureKey); + IMPORT_C void AddCaptureKeyL(const TCaptureKey &aCaptureKey, TUint8 aPriority); + IMPORT_C void SetCaptureKey(TUint32 aHandle, const TCaptureKey &aCaptureKey); + IMPORT_C void SetCaptureKey(TUint32 aHandle, const TCaptureKey &aCaptureKey, TUint8 aPriority); + IMPORT_C void CancelCaptureKey(TUint32 aHandle); + IMPORT_C void CancelAllCaptureKeys(TUint32 aApp); + IMPORT_C void ProcessCaptureKeys(TKeyData &aKeyData) const; +protected: + void CheckCaptureKey(const TCaptureKey &aCaptureKey); + void removeCaptureKey(TUint index); +protected: + RArray iCKarray; + }; +// +class CKeyTranslator: public CBase + { +public: + IMPORT_C static CKeyTranslator *New(); + virtual TInt GetModifierState()=0; + virtual void SetModifierState(TEventModifier aModifier,TModifierState aState)=0; + virtual TBool TranslateKey(TUint aScanCode,TBool aKeyUp,const CCaptureKeys &aCaptureKeys,TKeyData &aKeyData)=0; + virtual void UpdateModifiers(TInt aModifiers)=0; + virtual TInt ChangeKeyData(const TDesC& aLibraryName)=0; + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32lang.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32lang.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,690 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32lang.h +// +// + +#ifndef __E32LANG_H__ +#define __E32LANG_H__ + + +/** +* +* Extended Languages (aka three-digit locales) +* +* In order to support language variants for specific network operators, the +* language can be extended to 16 bits by pairing it with a dialect. Up to 1024 +* languages and 63 dialects are supported. For example, American Sprint is +* ELangAmerican with EDialectSprint = 10 + 1024 = 1034. +* +* The locale-specific resource files have a file extension of the form RNNNNN, +* where NNNNN is five digits. For compatibility reasons, any leading zeros are +* ignored, so that .R10 and R00010 are considered identical. +* The locale content for American Sprint is stored in .R1034 (or .R01034) +*/ + +/** +@publishedAll +@released + +Language identity enumeration. + +Each value in the enumeration uniquely identifies a language. + +If another value is needed, one of the following actions should be taken: Either +the Internationalization Technology Architect in Symbian should be contacted or +a defect should be raised against EUser. Unallocated values should not have +meanings inferred or extrapolated from already allocated values. + +@see BaflUtils::NearestLanguageFile +@see BaflUtils::GetDowngradePath +*/ +enum TLanguage + { + /** + Enumerated value used for testing - does not represent a language. + */ + ELangTest = 0, + + /** UK English. */ + ELangEnglish = 1, + + /** French. */ + ELangFrench = 2, + + /** German. */ + ELangGerman = 3, + + /** Spanish. */ + ELangSpanish = 4, + + /** Italian. */ + ELangItalian = 5, + + /** Swedish. */ + ELangSwedish = 6, + + /** Danish. */ + ELangDanish = 7, + + /** Norwegian. */ + ELangNorwegian = 8, + + /** Finnish. */ + ELangFinnish = 9, + + /** American. */ + ELangAmerican = 10, + + /** Swiss French. */ + ELangSwissFrench = 11, + + /** Swiss German. */ + ELangSwissGerman = 12, + + /** Portuguese. */ + ELangPortuguese = 13, + + /** Turkish. */ + ELangTurkish = 14, + + /** Icelandic. */ + ELangIcelandic = 15, + + /** Russian. */ + ELangRussian = 16, + + /** Hungarian. */ + ELangHungarian = 17, + + /** Dutch. */ + ELangDutch = 18, + + /** Belgian Flemish. */ + ELangBelgianFlemish = 19, + + /** Australian English. */ + ELangAustralian = 20, + + /** Belgian French. */ + ELangBelgianFrench = 21, + + /** Austrian German. */ + ELangAustrian = 22, + + /** New Zealand English. */ + ELangNewZealand = 23, + + /** International French. */ + ELangInternationalFrench = 24, + + /** Czech. */ + ELangCzech = 25, + + /** Slovak. */ + ELangSlovak = 26, + + /** Polish. */ + ELangPolish = 27, + + /** Slovenian. */ + ELangSlovenian = 28, + + /** Taiwanese Chinese. */ + ELangTaiwanChinese = 29, + + /** Hong Kong Chinese. */ + ELangHongKongChinese = 30, + + /** Peoples Republic of China's Chinese. */ + ELangPrcChinese = 31, + + /** Japanese. */ + ELangJapanese = 32, + + /** Thai. */ + ELangThai = 33, + + /** Afrikaans. */ + ELangAfrikaans = 34, + + /** Albanian. */ + ELangAlbanian = 35, + + /** Amharic. */ + ELangAmharic = 36, + + /** Arabic. */ + ELangArabic = 37, + + /** Armenian. */ + ELangArmenian = 38, + + /** Tagalog. */ + ELangTagalog = 39, + + /** Belarussian. */ + ELangBelarussian = 40, + + /** Bengali. */ + ELangBengali = 41, + + /** Bulgarian. */ + ELangBulgarian = 42, + + /** Burmese. */ + ELangBurmese = 43, + + /** Catalan. */ + ELangCatalan = 44, + + /** Croatian. */ + ELangCroatian = 45, + + /** Canadian English. */ + ELangCanadianEnglish = 46, + + /** International English. */ + ELangInternationalEnglish = 47, + + /** South African English. */ + ELangSouthAfricanEnglish = 48, + + /** Estonian. */ + ELangEstonian = 49, + + /** Farsi. */ + ELangFarsi = 50, + + /** Canadian French. */ + ELangCanadianFrench = 51, + + /** Gaelic. */ + ELangScotsGaelic = 52, + + /** Georgian. */ + ELangGeorgian = 53, + + /** Greek. */ + ELangGreek = 54, + + /** Cyprus Greek. */ + ELangCyprusGreek = 55, + + /** Gujarati. */ + ELangGujarati = 56, + + /** Hebrew. */ + ELangHebrew = 57, + + /** Hindi. */ + ELangHindi = 58, + + /** Indonesian. */ + ELangIndonesian = 59, + + /** Irish. */ + ELangIrish = 60, + + /** Swiss Italian. */ + ELangSwissItalian = 61, + + /** Kannada. */ + ELangKannada = 62, + + /** Kazakh. */ + ELangKazakh = 63, + + /** Khmer. */ + ELangKhmer = 64, + + /** Korean. */ + ELangKorean = 65, + + /** Lao. */ + ELangLao = 66, + + /** Latvian. */ + ELangLatvian = 67, + + /** Lithuanian. */ + ELangLithuanian = 68, + + /** Macedonian. */ + ELangMacedonian = 69, + + /** Malay. */ + ELangMalay = 70, + + /** Malayalam. */ + ELangMalayalam = 71, + + /** Marathi. */ + ELangMarathi = 72, + + /** Moldavian. */ + ELangMoldavian = 73, + + /** Mongolian. */ + ELangMongolian = 74, + + /** Norwegian Nynorsk. */ + ELangNorwegianNynorsk = 75, + + /** Brazilian Portuguese. */ + ELangBrazilianPortuguese = 76, + + /** Punjabi. */ + ELangPunjabi = 77, + + /** Romanian. */ + ELangRomanian = 78, + + /** Serbian. */ + ELangSerbian = 79, + + /** Sinhalese. */ + ELangSinhalese = 80, + + /** Somali. */ + ELangSomali = 81, + + /** International Spanish. */ + ELangInternationalSpanish = 82, + + /** American Spanish. */ + ELangLatinAmericanSpanish = 83, + + /** Swahili. */ + ELangSwahili = 84, + + /** Finland Swedish. */ + ELangFinlandSwedish = 85, + + /** Reserved, not in use. */ + ELangReserved1 = 86, // This enum should not be used for new languages, see INC110543 + + /** Tamil. */ + ELangTamil = 87, + + /** Telugu. */ + ELangTelugu = 88, + + /** Tibetan. */ + ELangTibetan = 89, + + /** Tigrinya. */ + ELangTigrinya = 90, + + /** Cyprus Turkish. */ + ELangCyprusTurkish = 91, + + /** Turkmen. */ + ELangTurkmen = 92, + + /** Ukrainian. */ + ELangUkrainian = 93, + + /** Urdu. */ + ELangUrdu = 94, + + /** Reserved, not in use. */ + ELangReserved2 = 95, // This enum should not be used for new languages, see INC110543 + + /** Vietnamese. */ + ELangVietnamese = 96, + + /** Welsh. */ + ELangWelsh = 97, + + /** Zulu. */ + ELangZulu = 98, + + /** + @deprecated + + Use of this value is deprecated. + */ + ELangOther = 99, + + /** English with terms as used by the device manufacturer, if this needs to + be distinct from the English used by the UI vendor. */ + ELangManufacturerEnglish = 100, + + /** South Sotho. + + A language of Lesotho also called Sesotho. SIL code sot. */ + ELangSouthSotho = 101, + + /** Basque. */ + ELangBasque = 102, + + /** Galician. */ + ELangGalician = 103, + + /** Javanese. */ + ELangJavanese = 104, + + /** Maithili. */ + ELangMaithili = 105, + + /** Azerbaijani(Latin alphabet). */ + ELangAzerbaijani_Latin = 106, + + /** Azerbaijani(Cyrillic alphabet). */ + ELangAzerbaijani_Cyrillic = 107, + + /** Oriya. */ + ELangOriya = 108, + + /** Bhojpuri. */ + ELangBhojpuri = 109, + + /** Sundanese. */ + ELangSundanese = 110, + + /** Kurdish(Latin alphabet). */ + ELangKurdish_Latin = 111, + + /** Kurdish(Arabic alphabet). */ + ELangKurdish_Arabic = 112, + + /** Pashto. */ + ELangPashto = 113, + + /** Hausa. */ + ELangHausa = 114, + + /** Oromo. */ + ELangOromo = 115, + + /** Uzbek(Latin alphabet). */ + ELangUzbek_Latin = 116, + + /** Uzbek(Cyrillic alphabet). */ + ELangUzbek_Cyrillic = 117, + + /** Sindhi(Arabic alphabet). */ + ELangSindhi_Arabic = 118, + + /** Sindhi(using Devanagari script). */ + ELangSindhi_Devanagari = 119, + + /** Yoruba. */ + ELangYoruba = 120, + + /** Cebuano. */ + ELangCebuano = 121, + + /** Igbo. */ + ELangIgbo = 122, + + /** Malagasy. */ + ELangMalagasy = 123, + + /** Nepali. */ + ELangNepali = 124, + + /** Assamese. */ + ELangAssamese = 125, + + /** Shona. */ + ELangShona = 126, + + /** Zhuang. */ + ELangZhuang = 127, + + /** Madurese. */ + ELangMadurese = 128, + + /** English as appropriate for use in Asia-Pacific regions. */ + ELangEnglish_Apac=129, + + /** English as appropriate for use in Taiwan. */ + ELangEnglish_Taiwan=157, + + /** English as appropriate for use in Hong Kong. */ + ELangEnglish_HongKong=158, + + /** English as appropriate for use in the Peoples Republic of China. */ + ELangEnglish_Prc=159, + + /** English as appropriate for use in Japan. */ + ELangEnglish_Japan=160, + + /** English as appropriate for use in Thailand. */ + ELangEnglish_Thailand=161, + + /** Fulfulde, also known as Fula */ + ELangFulfulde = 162, + + /** Tamazight. */ + ELangTamazight = 163, + + /** Bolivian Quechua. */ + ELangBolivianQuechua = 164, + + /** Peru Quechua. */ + ELangPeruQuechua = 165, + + /** Ecuador Quechua. */ + ELangEcuadorQuechua = 166, + + /** Tajik(Cyrillic alphabet). */ + ELangTajik_Cyrillic = 167, + + /** Tajik(using Perso-Arabic script). */ + ELangTajik_PersoArabic = 168, + + /** Nyanja, also known as Chichewa or Chewa. */ + ELangNyanja = 169, + + /** Haitian Creole. */ + ELangHaitianCreole = 170, + + /** Lombard. */ + ELangLombard = 171, + + /** Koongo, also known as Kongo or KiKongo. */ + ELangKoongo = 172, + + /** Akan. */ + ELangAkan = 173, + + /** Hmong. */ + ELangHmong = 174, + + /** Yi. */ + ELangYi = 175, + + /** Tshiluba, also known as Luba-Kasai */ + ELangTshiluba = 176, + + /** Ilocano, also know as Ilokano or Iloko. */ + ELangIlocano = 177, + + /** Uyghur. */ + ELangUyghur = 178, + + /** Neapolitan. */ + ELangNeapolitan = 179, + + /** Rwanda, also known as Kinyarwanda */ + ELangRwanda = 180, + + /** Xhosa. */ + ELangXhosa = 181, + + /** Balochi, also known as Baluchi */ + ELangBalochi = 182, + + /** Hiligaynon. */ + ElangHiligaynon = 183, + + /** Minangkabau. */ + ELangMinangkabau = 184, + + /** Makhuwa. */ + ELangMakhuwa = 185, + + /** Santali. */ + ELangSantali = 186, + + /** Gikuyu, sometimes written Kikuyu. */ + ELangGikuyu = 187, + + /** Mòoré, also known as Mossi or More. */ + ELangMoore = 188, + + /** Guaraní. */ + ELangGuarani = 189, + + /** Rundi, also known as Kirundi. */ + ELangRundi = 190, + + /** Romani(Latin alphabet). */ + ELangRomani_Latin = 191, + + /** Romani(Cyrillic alphabet). */ + ELangRomani_Cyrillic = 192, + + /** Tswana. */ + ELangTswana = 193, + + /** Kanuri. */ + ELangKanuri = 194, + + /** Kashmiri(using Devanagari script). */ + ELangKashmiri_Devanagari = 195, + + /** Kashmiri(using Perso-Arabic script). */ + ELangKashmiri_PersoArabic = 196, + + /** Umbundu. */ + ELangUmbundu = 197, + + /** Konkani. */ + ELangKonkani = 198, + + /** Balinese, a language used in Indonesia (Java and Bali). */ + ELangBalinese = 199, + + /** Northern Sotho. */ + ELangNorthernSotho = 200, + + /** Wolof. */ + ELangWolof = 201, + + /** Bemba. */ + ELangBemba = 202, + + /** Tsonga. */ + ELangTsonga = 203, + + /** Yiddish. */ + ELangYiddish = 204, + + /** Kirghiz, also known as Kyrgyz. */ + ELangKirghiz = 205, + + /** Ganda, also known as Luganda. */ + ELangGanda = 206, + + /** Soga, also known as Lusoga. */ + ELangSoga = 207, + + /** Mbundu, also known as Kimbundu. */ + ELangMbundu = 208, + + /** Bambara. */ + ELangBambara = 209, + + /** Central Aymara. */ + ELangCentralAymara = 210, + + /** Zarma. */ + ELangZarma = 211, + + /** Lingala. */ + ELangLingala = 212, + + /** Bashkir. */ + ELangBashkir = 213, + + /** Chuvash. */ + ELangChuvash = 214, + + /** Swati. */ + ELangSwati = 215, + + /** Tatar. */ + ELangTatar = 216, + + /** Southern Ndebele. */ + ELangSouthernNdebele = 217, + + /** Sardinian. */ + ELangSardinian = 218, + + /** Scots. */ + ELangScots = 219, + + /** Meitei, also known as Meithei or Manipuri */ + ELangMeitei = 220, + + /** Walloon. */ + ELangWalloon = 221, + + /** Kabardian. */ + ELangKabardian = 222, + + /** Mazanderani, also know as Mazandarani or Tabri. */ + ELangMazanderani = 223, + + /** Gilaki. */ + ELangGilaki = 224, + + /** Shan. */ + ELangShan = 225, + + /** Luyia. */ + ELangLuyia = 226, + + /** Luo, also known as Dholuo, a language of Kenya. */ + ELanguageLuo = 227, + + /** Sukuma, also known as Kisukuma. */ + ELangSukuma = 228, + + /** Aceh, also known as Achinese. */ + ELangAceh = 229, + + /** English used in India. */ + ELangEnglish_India = 230, + + /** Malay as appropriate for use in Asia-Pacific regions. */ + ELangMalay_Apac=326, + + /** + Indicates the final language in the language downgrade path. + + @see BaflUtils::NearestLanguageFile + @see BaflUtils::GetDowngradePath + */ + ELangNone = 0xFFFF, // up to 1023 languages * 16 dialects, in 16 bits + ELangMaximum = ELangNone // This must always be equal to the last (largest) TLanguage enum. + }; + + +#endif /* __E32LANG_H__ */ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32ldr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32ldr.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,410 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32ldr.h +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef __E32LDR_H__ +#define __E32LDR_H__ +#include + +const TInt KMaxLibraryEntryPoints=0x100; + +// +// Loader version number. +// +const TInt KLoaderMajorVersionNumber=1; +const TInt KLoaderMinorVersionNumber=0; + +// +// IPC messages to the loader +// +enum TLoaderMsg + { + ELoadProcess=1, + ELoadLibrary=2, + ELoadLogicalDevice=3, + ELoadPhysicalDevice=4, + ELoadLocale=5, + ELoadFileSystem=6, + EGetInfo=7, + ELoaderDebugFunction=8, + ELoadFSExtension=9, + EGetInfoFromHeader=10, + ELoadFSPlugin=11, + ELoaderCancelLazyDllUnload=12, + ELdrDelete=13, + ECheckLibraryHash=14, + ELoadFSProxyDrive=15, + + EMaxLoaderMsg + }; +// +// Loader message arguments: +// 0 = TLdrInfo +// 1 = Filename +// 2 = Command line (process) or path (library) +// +class TLdrInfo + { +public: + IMPORT_C TLdrInfo(); // for BC +public: + TUidType iRequestedUids; + TOwnerType iOwnerType; + TInt iHandle; + TUint32 iSecureId; + TUint32 iRequestedVersion; + TInt iMinStackSize; // Size of new process stack + }; + + +#ifndef __KERNEL_MODE__ +#include +// +// Loader client class +// +class RLoader : public RSessionBase + { +public: + IMPORT_C TInt Connect(); + TVersion Version() const; + TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TOwnerType aType); + IMPORT_C TInt LoadLibrary(TInt& aHandle, const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion); + IMPORT_C TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf); + TInt LoadDeviceDriver(const TDesC& aFileName, TInt aDeviceType); + IMPORT_C TInt DebugFunction(TInt aFunction, TInt a1, TInt a2, TInt a3); + TInt LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList); + TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf); + IMPORT_C TInt CancelLazyDllUnload(); + IMPORT_C TInt Delete(const TDesC& aFileName); + IMPORT_C TInt CheckLibraryHash(const TDesC& aFileName, TBool aValidateHash=EFalse); + TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TInt aMinStackSize, TOwnerType aType); +public: +#ifdef __ARMCC__ + // workaround for possible EDG bug (!!) + inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const + { return RSessionBase::SendReceive(aFunction, aArgs); } +#else + using RSessionBase::SendReceive; +#endif + +#ifdef __TOOLS2__ +public: + void Free(); +private: + TAny* iHandle; +#endif + }; +#endif + +// +// Information required to create a new code segment +// +enum TCodeSegAttributes + { + ECodeSegAttKernel =0x00000001, + ECodeSegAttGlobal =0x00000002, + ECodeSegAttFixed =0x00000004, + ECodeSegAttABIMask =0x00000018, // same values as in image header + ECodeSegAttPaged =0x00000200, // the code seg is demand paged + ECodeSegAttHDll =(TInt)0x80000000,// Emulator host file type: 1=DLL, 0=EXE + ECodeSegAttExpVer =0x40000000, // Filename is explicitly versioned + ECodeSegAttNmdExpData=0x20000000 // Named symbol export data in code seg + }; + +class TBlockMapEntryBase +/** + Where sections of a file are located on the media. + The kernel uses this to load in parts of a demand paged file. + */ + { +public: + TUint iNumberOfBlocks; // Number of contiguous blocks in map. + TUint iStartBlock; // Number for first block in the map. + }; + +struct SBlockMapInfoBase +/** + Describes context for TBlockMapEntryBase objects. + */ + { + TUint iBlockGranularity; // Size of a block in bytes. + TUint iBlockStartOffset; // Offset to start of the file or requested file position within a block. + TInt64 iStartBlockAddress; // Address of the first block of the partition. + TInt iLocalDriveNumber; // Local drive number of where the file lies on. + }; + +// forward declarations from file server +class RFile; +class RFs; + +/** +A Handle used to identify a file on storage media. +@internalTechnology +*/ +class RFileClamp + { +public: + inline RFileClamp() + { + iCookie[0] = 0; + iCookie[1] = 0; + } + IMPORT_C TInt Clamp(RFile& aFile); + IMPORT_C TInt Close(RFs& aFs); + +public: + TInt64 iCookie[2]; + }; + + +class TCodeSegCreateInfo + { +public: + TBuf8 iFileName; // not including {MMMMmmmm} version info + TUidType iUids; // uid1 indicates EXE or DLL + TUint32 iAttr; + TInt iCodeSize; + TInt iTextSize; + TInt iDataSize; + TInt iBssSize; + TInt iTotalDataSize; + TUint32 iEntryPtVeneer; // address of first instruction to be called + TUint32 iFileEntryPoint; // address of entry point within this code segment + TInt iDepCount; + TUint32 iExportDir; + TInt iExportDirCount; + TUint32 iCodeLoadAddress; // 0 for RAM loaded code, else pointer to TRomImageHeader + TUint32 iCodeRunAddress; + TUint32 iDataLoadAddress; + TUint32 iDataRunAddress; + TUint32 iExceptionDescriptor; + TInt iRootNameOffset; + TInt iRootNameLength; + TInt iExtOffset; + TUint32 iModuleVersion; + SSecurityInfo iS; + TAny* iHandle; // pointer to kernel-side DCodeSeg object + TInt iClientProcessHandle; // handle to client process for user DLL loads + /** Code relocation information stored on loader heap. */ + TUint32* iCodeRelocTable; + /** Size of code relocation table in bytes. */ + TInt iCodeRelocTableSize; + /** Import fixup information stored on loader heap. */ + TUint32* iImportFixupTable; + /** Size of import fixup table in bytes. */ + TInt iImportFixupTableSize; + /** Offset to apply to each code address in the image when it is fixed up. */ + TUint32 iCodeDelta; + /** Offset to apply to each data address in the image when it is fixed up. */ + TUint32 iDataDelta; + /** + Whether the code is paged. If this is set, then + TCodeSegCreateInfo::iCodeRelocTable[Size] and + TCodeSegCreateInfo::iImportFixupTable[Size] contain fixup information + which the kernel uses to fix up each page. + (They may be null if the binary has no imports or no code section.) + */ + TBool iUseCodePaging; + /** The UID of the compression scheme in use. */ + TUint32 iCompressionType; + /** + Start of compressed pages within the file. The kernel uses + this to load compressed pages from byte-pair files when demand + paging. + */ + TInt32* iCodePageOffsets; + /** Where (possibly compressed) object code starts in iFile. */ + TInt iCodeStartInFile; + /** Length of (possibly compressed) object code in iFile. */ + TInt iCodeLengthInFile; + /** Information about block map entries in iCodeBlockMapEntries. */ + SBlockMapInfoBase iCodeBlockMapCommon; + /** Where object code is located on the media. */ + TBlockMapEntryBase* iCodeBlockMapEntries; + /** Size of block map entry array in bytes. */ + TInt iCodeBlockMapEntriesSize; + /** + File clamp cookie, used to delete the file when the + codeseg is destroyed. + */ + RFileClamp iFileClamp; +public: + IMPORT_C TPtrC8 RootName() const; + }; + +// +// Information required to create a new process +// +class TProcessCreateInfo : public TCodeSegCreateInfo + { +public: + TInt iHeapSizeMin; + TInt iHeapSizeMax; + TInt iStackSize; + TInt iClientHandle; // handle to loader's client + TInt iProcessHandle; // handle to new DProcess + TInt iFinalHandle; // handle from loader client to new process + TOwnerType iOwnerType; + TProcessPriority iPriority; + TUint iSecurityZone; + enum TDebugAttributes // must be the same as RLibrary::TInfoV2::TDebugAttributes + { + EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged. + ETraceAllowed = 1<<1 ///< Flags set if executable may be traced. + }; + TUint iDebugAttributes; + TRequestStatus* iDestructStat; + + }; + +const TUint KSecurityZoneUnique = 0u; +const TUint KSecurityZoneLegacyCode = ~0u; + +// +// Information required to attach a code segment to a process +// in the form of a library. +// +class TLibraryCreateInfo + { +public: + TAny* iCodeSegHandle; // pointer to kernel-side DCodeSeg object + TInt iClientHandle; // handle to loader's client + TInt iLibraryHandle; // handle to new DLibrary + TOwnerType iOwnerType; + }; + +// +// Information required to find an existing code segment +// +class TFindCodeSeg + { +public: + TUidType iUids; // required UIDs + const TAny* iRomImgHdr; // ROM image header if ROM code required, NULL otherwise + TUint32 iAttrMask; // mask for attributes + TUint32 iAttrVal; // required value for masked attributes + TInt iProcess; // handle to process in which code is required to operate + // not used if kernel only specified + SSecurityInfo iS; // required capabilities/SID + TUint32 iModuleVersion; // required version + TBuf8 iName; // name to look for - zero length means any + }; + +// +// Information required to by the reaper from the codeseg. +// +struct TCodeSegLoaderCookie + { + RFileClamp iFileClamp; + TInt64 iStartAddress; + TInt iDriveNumber; + }; + +// +// Loader magic executive functions +// +class E32Loader + { +public: + // used by loader only + IMPORT_C static TInt CodeSegCreate(TCodeSegCreateInfo& aInfo); + IMPORT_C static TInt CodeSegLoaded(TCodeSegCreateInfo& aInfo); + IMPORT_C static TInt LibraryCreate(TLibraryCreateInfo& aInfo); + IMPORT_C static TInt CodeSegOpen(TAny* aHandle, TInt aClientProcessHandle); + IMPORT_C static void CodeSegClose(TAny* aHandle); + IMPORT_C static void CodeSegNext(TAny*& aHandle, const TFindCodeSeg& aFind); + IMPORT_C static void CodeSegInfo(TAny* aHandle, TCodeSegCreateInfo& aInfo); + IMPORT_C static TInt CodeSegAddDependency(TAny* aImporter, TAny* aExporter); + IMPORT_C static void CodeSegDeferDeletes(); + IMPORT_C static void CodeSegEndDeferDeletes(); + IMPORT_C static TInt ProcessCreate(TProcessCreateInfo& aInfo, const TDesC8* aCommandLine); + IMPORT_C static TInt ProcessLoaded(TProcessCreateInfo& aInfo); + IMPORT_C static TInt CheckClientState(TInt aClientHandle); + IMPORT_C static TInt DeviceLoad(TAny* aHandle, TInt aType); + IMPORT_C static TAny* ThreadProcessCodeSeg(TInt aHandle); + IMPORT_C static void ReadExportDir(TAny* aHandle, TUint32* aDest); + IMPORT_C static TInt LocaleExports(TAny* aHandle, TLibraryFunction* aExportsList); + +#ifdef __MARM__ + IMPORT_C static void GetV7StubAddresses(TLinAddr& aExe, TLinAddr& aDll); + static TInt V7ExeEntryStub(); + static TInt V7DllEntryStub(TInt aReason); +#endif + + IMPORT_C static TUint32 PagingPolicy(); + + IMPORT_C static TInt NotifyIfCodeSegDestroyed(TRequestStatus& aStatus); + IMPORT_C static TInt GetDestroyedCodeSegInfo(TCodeSegLoaderCookie& aCookie); + +public: + // used by client side + static TInt WaitDllLock(); + static TInt ReleaseDllLock(); + static TInt LibraryAttach(TInt aHandle, TInt& aNumEps, TLinAddr* aEpList); + static TInt LibraryAttached(TInt aHandle); + static TInt StaticCallList(TInt& aNumEps, TLinAddr* aEpList); + static TInt LibraryDetach(TInt& aNumEps, TLinAddr* aEpList); + static TInt LibraryDetached(); + }; + +typedef TInt (*TSupervisorFunction)(TAny*); + +// Relocation types +/** +@internalTechnology +@released +*/ +const TUint16 KReservedRelocType = (TUint16)0x0000; +/** +@internalTechnology +@released +*/ +const TUint16 KTextRelocType = (TUint16)0x1000; +/** +@internalTechnology +@released +*/ +const TUint16 KDataRelocType = (TUint16)0x2000; +/** +@internalTechnology +@released +*/ +const TUint16 KInferredRelocType = (TUint16)0x3000; + +// Compression types + +/** +@internalTechnology +@released +*/ +const TUint KFormatNotCompressed=0; +/** +@internalTechnology +@released +*/ +const TUint KUidCompressionDeflate=0x101F7AFC; + + +const TUint KUidCompressionBytePair=0x102822AA; + + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32lmsg.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32lmsg.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,67 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32lmsg.h +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef __E32LMSG_H__ +#define __E32LMSG_H__ +#include + +const TInt KMaxLocaleMessageText=0x80; +// +enum TLocaleMessage + { + EFileServer_Button1, + EFileServer_Button2, + EFileServer_PutTheCardBackLine1, + EFileServer_PutTheCardBackLine2, + EFileServer_LowPowerLine1, + EFileServer_LowPowerLine2, + EFileServer_DiskErrorLine1, + EFileServer_DiskErrorLine2, + ESoundDriver_Chimes, + ESoundDriver_Rings, + ESoundDriver_Signal, + EMediaDriver_DiskNameInternal, + EMediaDriver_DiskNameExternal1, + EMediaDriver_DiskNameExternal2, + EMediaDriver_DiskNameExternal3, + EMediaDriver_DiskNameExternal4, + EMediaDriver_DiskNameExternal5, + EMediaDriver_DiskNameExternal6, + EMediaDriver_DiskNameExternal7, + EMediaDriver_DiskNameExternal8, + EMediaDriver_SocketName0, + EMediaDriver_SocketName1, + EMediaDriver_SocketName2, + EMediaDriver_SocketName3, + ELocaleMessages_LastMsg + }; + +class TLocaleMessageText : public TBuf + { +public: + IMPORT_C TLocaleMessageText(); + IMPORT_C TLocaleMessageText(TLocaleMessage aMessageNo); + IMPORT_C void Set(TLocaleMessage aMessageNo); + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32math.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32math.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,483 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32math.h +// +// + +#ifndef __E32MATH_H__ +#define __E32MATH_H__ +#include + + +/** +@publishedAll +@released +*/ +const TInt KMaxPrecision=15; +/** +@publishedAll +@released + +This constant specifies the maximum number of significant digits available with floating +point computations. Rounding and string formatting methods will not use more digits than this. +*/ +const TInt KPrecisionLimit=12; +/** +@publishedAll +@released +*/ +const TInt KMantissaBits=53; +/** +@publishedAll +@released +*/ +const TInt KMaxExponent=1023; +/** +@publishedAll +@released +*/ +const TInt KExponentBias=1022; +/** +@publishedAll +@released +*/ +const TInt KSpecialExponent=2047; +// + + +/** +@publishedAll +@released + +The maximum exponent for a 32-bit floating point number. +*/ +const TInt KTReal32MaxExponent=128; // changed from 127 + + +/** +@publishedAll +@released + +The minimum exponent for a 32-bit floating point number. +*/ +const TInt KTReal32MinExponent=-125; +/** +@publishedAll +@released +*/ +const TInt KTReal32ExponentBias=126; +/** +@publishedAll +@released +*/ +const TInt KTReal32SpecialExponent=255; // changed from KTReal32ExponentBad + + +/** +@publishedAll +@released + +A zero exponent value for a 32-bit floating point number. +*/ +const TInt KTReal32ZeroExponent=0; +// + + +/** +@publishedAll +@released + +The maximum exponent for a 64-bit floating point number. +*/ +const TInt KTReal64MaxExponent=1024; // changed from 1023 + + +/** +@publishedAll +@released + +The minimum exponent for a 64-bit floating point number. +*/ +const TInt KTReal64MinExponent=-1021; + + +/** +@publishedAll +@released +*/ +const TInt KTReal64ExponentBias=1022; + + +/** +@publishedAll +@released +*/ +const TInt KTReal64SpecialExponent=2047; // changed from KTReal64BadExponent + + +/** +@publishedAll +@released + +A zero exponent value for a 64-bit floating point number. +*/ +const TInt KTReal64ZeroExponent=0; +// + + +/** +@publishedAll +@released + +The minimum value of a 64-bit floating point number. +*/ +const TReal KMinTReal=2.2250738585072015E-308; // changed from TReal64 + + +/** +@publishedAll +@released + +The maximum value of a 64-bit floating point number. +*/ +const TReal KMaxTReal=1.7976931348623157E+308; // +// + + +/** +@publishedAll +@released + +The minimum value of a 32-bit floating point number. +*/ +const TReal32 KMinTReal32=1.17549435E-38f; + + +/** +@publishedAll +@released + +The maximum value of a 32-bit floating point number. +*/ +const TReal32 KMaxTReal32=3.4028234663852885981170418348452e+38f; +// + + +/** +@publishedAll +@released + +The minimum value of a 64-bit floating point number. +*/ +const TReal64 KMinTReal64=2.2250738585072015E-308; + + +/** +@publishedAll +@released + +The maximum value of a 64-bit floating point number. +*/ +const TReal64 KMaxTReal64=1.7976931348623157E+308; +// + + +/** +@publishedAll +@released +*/ +const TReal KSqhf=0.70710678118654752440; + + +/** +@publishedAll +@released + +Log 2 to the base "e". +*/ +const TReal KRln2=1.4426950408889634; + + +/** +@publishedAll +@released + +Log 10 to the base "e". +*/ +const TReal KRln10=0.4342944819032518; + + +/** +@publishedAll +@released + +Log 2 to the base 10. +*/ +const TReal KRlg2=0.3010299956639812; + + +/** +@publishedAll +@released + +The mathematical constant Pi. +*/ +const TReal KPi=3.1415926535897932; + + +/** +@publishedAll +@released + +The reciprocal of the mathematical constant Pi. +*/ +const TReal KPiInv=0.3183098861837907; + + +/** +@publishedAll +@released + +The mathematical constant Pi divided by 2. +*/ +const TReal KPiBy2=1.5707963267948966; + + +/** +@publishedAll +@released + +Not used. +*/ +const TReal KDrpi=0.6366197723675813; + + +/** +@publishedAll +@released + +The square root of 3. +*/ +const TReal KSqt3=1.7320508075688773; + + +/** +@publishedAll +@released +*/ +const TReal KMsq3=0.2679491924311227; + + +/** +@publishedAll +@released + +The multiplying factor to convert radians to degrees. +*/ +const TReal KRadToDeg=57.29577951308232; + + +/** +@publishedAll +@released + +The multiplying factor to convert degrees to radians. +*/ +const TReal KDegToRad=0.017453292519943296; + + + + +class TRealX +/** +@publishedAll +@released + +A class encapsulating an extended precision real value. + +This class provides 64 bit precision and a dynamic range of approximately +1E-9863 to 1E+9863. All member functions are optimized for speed. +*/ + { +public: + enum TRealXOrder {ELessThan=1,EEqual=2,EGreaterThan=4,EUnordered=8}; +public: + IMPORT_C TRealX(); + IMPORT_C TRealX(TInt aInt); + IMPORT_C TRealX(TUint aInt); + IMPORT_C TRealX(TUint aExp, TUint aMantHi, TUint aMantLo); + IMPORT_C TRealX(const TInt64 &aInt); + IMPORT_C TRealX(TReal32 aReal) __SOFTFP; + IMPORT_C TRealX(TReal64 aReal) __SOFTFP; + IMPORT_C TRealX &operator=(TInt aInt); + IMPORT_C TRealX &operator=(TUint aInt); + IMPORT_C TRealX &operator=(const TInt64& aInt); + IMPORT_C TRealX &operator=(TReal32 aReal) __SOFTFP; + IMPORT_C TRealX &operator=(TReal64 aReal) __SOFTFP; + IMPORT_C TInt Set(TInt aInt); + IMPORT_C TInt Set(TUint aInt); + IMPORT_C TInt Set(const TInt64& aInt); + IMPORT_C TInt Set(TReal32 aReal) __SOFTFP; + IMPORT_C TInt Set(TReal64 aReal) __SOFTFP; + IMPORT_C operator TInt() const; + IMPORT_C operator TUint() const; + IMPORT_C operator TInt64() const; + IMPORT_C operator TReal32() const __SOFTFP; + IMPORT_C operator TReal64() const __SOFTFP; + IMPORT_C TInt GetTReal(TReal32 &aVal) const; + IMPORT_C TInt GetTReal(TReal64 &aVal) const; + IMPORT_C void SetZero(TBool aNegative=EFalse); + IMPORT_C void SetNaN(); + IMPORT_C void SetInfinite(TBool aNegative); + IMPORT_C TBool IsZero() const; + IMPORT_C TBool IsNaN() const; + IMPORT_C TBool IsInfinite() const; + IMPORT_C TBool IsFinite() const; + IMPORT_C const TRealX &operator+=(const TRealX &aVal); + IMPORT_C const TRealX &operator-=(const TRealX &aVal); + IMPORT_C const TRealX &operator*=(const TRealX &aVal); + IMPORT_C const TRealX &operator/=(const TRealX &aVal); + IMPORT_C const TRealX &operator%=(const TRealX &aVal); + IMPORT_C TInt AddEq(const TRealX &aVal); + IMPORT_C TInt SubEq(const TRealX &aVal); + IMPORT_C TInt MultEq(const TRealX &aVal); + IMPORT_C TInt DivEq(const TRealX &aVal); + IMPORT_C TInt ModEq(const TRealX &aVal); + IMPORT_C TRealX operator+() const; + IMPORT_C TRealX operator-() const; + IMPORT_C TRealX &operator++(); + IMPORT_C TRealX operator++(TInt); + IMPORT_C TRealX &operator--(); + IMPORT_C TRealX operator--(TInt); + IMPORT_C TRealX operator+(const TRealX &aVal) const; + IMPORT_C TRealX operator-(const TRealX &aVal) const; + IMPORT_C TRealX operator*(const TRealX &aVal) const; + IMPORT_C TRealX operator/(const TRealX &aVal) const; + IMPORT_C TRealX operator%(const TRealX &aVal) const; + IMPORT_C TInt Add(TRealX& aResult,const TRealX &aVal) const; + IMPORT_C TInt Sub(TRealX& aResult,const TRealX &aVal) const; + IMPORT_C TInt Mult(TRealX& aResult,const TRealX &aVal) const; + IMPORT_C TInt Div(TRealX& aResult,const TRealX &aVal) const; + IMPORT_C TInt Mod(TRealX& aResult,const TRealX &aVal) const; + IMPORT_C TRealXOrder Compare(const TRealX& aVal) const; + inline TBool operator==(const TRealX &aVal) const; + inline TBool operator!=(const TRealX &aVal) const; + inline TBool operator>=(const TRealX &aVal) const; + inline TBool operator<=(const TRealX &aVal) const; + inline TBool operator>(const TRealX &aVal) const; + inline TBool operator<(const TRealX &aVal) const; +public: + /** + The mantissa. + */ + // Represented as two adjacent 32 bit values, rather than one 64 value. + // This is to avoid EABI introduced padding overheads and BC breakages. + // This representation works because the mantissa is always accessed from + // assembler code as two 32 bit quantities. The C++ code that accesses it + // now constructs an automatic TInt64 with the two components. + TUint32 iMantLo; + TUint32 iMantHi; + + /** + The sign: 0 for +, 1 for - + */ + TInt8 iSign; + + /** + Flags: 0 for exact, 1 for rounded down, 2 for rounded up + */ + TUint8 iFlag; + + /** + Exponent: biased by 32767, iExp=0 => zero, +65535 => infinity or NaN + */ + TUint16 iExp; + }; + + + + +struct SPoly +/** +@publishedAll +@released + +A structure containing the set of coefficients for a polynomial. + +@see Math::Poly +*/ + { + TInt num; + TReal c[1]; + }; + + + + +class Math +/** +@publishedAll +@released + +A collection of mathematical functions. +*/ + { +public: + IMPORT_C static TInt ACos(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt ASin(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt ATan(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt ATan(TReal &aTrg,const TReal &aSrcY,const TReal &aSrcX); + IMPORT_C static TInt Cos(TReal &aTrg,const TReal &aSrc); + + /** + This function is not implemented by Symbian OS. + */ + IMPORT_C static TInt DtoR(TReal &aTrg,const TDesC &aSrc,TInt &aPos,const TChar aPoint); + IMPORT_C static TInt Exp(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt Frac(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt Int(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt Int(TInt16 &aTrg,const TReal &aSrc); + IMPORT_C static TInt Int(TInt32 &aTrg,const TReal &aSrc); + IMPORT_C static TInt Log(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt Ln(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt Mod(TReal &aTrg,const TReal &aSrc,const TReal &aModulus); + IMPORT_C static TReal Poly(TReal aVal,const SPoly *aPoly) __SOFTFP; + IMPORT_C static TInt Pow(TReal &aTrg,const TReal &aSrc,const TReal &aPower); + IMPORT_C static TInt Pow10(TReal &aTrg,const TInt exp); + IMPORT_C static TInt Rand(TInt64 &aSeed); + IMPORT_C static TReal FRand(TInt64 &aSeed) __SOFTFP; + IMPORT_C static TUint32 Random(); + IMPORT_C static TInt Round(TReal &aTrg,const TReal &aSrc,TInt aDecimalPlaces); + IMPORT_C static TInt Sin(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt Sqrt(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TInt Tan(TReal &aTrg,const TReal &aSrc); + IMPORT_C static TBool IsZero(const TReal &aVal); + IMPORT_C static TBool IsNaN(const TReal &aVal); + IMPORT_C static TBool IsInfinite(const TReal &aVal); + IMPORT_C static TBool IsFinite(const TReal &aVal); + IMPORT_C static void PolyX(TRealX& aY, const TRealX& aX, TInt aDeg, const TRealX *aCoef); + static TInt MultPow10X(TRealX& aTrg, TInt aPower); + IMPORT_C static void Mul64(Int64 aX, Int64 aY, Int64& aOutH, Uint64& aOutL); + IMPORT_C static void UMul64(Uint64 aX, Uint64 aY, Uint64& aOutH, Uint64& aOutL); + IMPORT_C static Int64 DivMod64(Int64 aDividend, Int64 aDivisor, Int64& aRemainder); + IMPORT_C static Uint64 UDivMod64(Uint64 aDividend, Uint64 aDivisor, Uint64& aRemainder); +private: + IMPORT_C static void SetZero(TReal &aVal,TInt aSign=0); + IMPORT_C static void SetNaN(TReal &aVal); + IMPORT_C static void SetInfinite(TReal &aVal,TInt aSign); + }; + +#include + +#endif // __E32MATH_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32math.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32math.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,141 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32math.inl +// +// + +#if !defined(__E32MATH_INL__) +#define __E32MATH_INL__ + + + + +// class TRealX + +TBool TRealX::operator==(const TRealX &aVal) const +/** +@publishedAll +@released + +Compares this extended precision number for equality with another. + +@param aVal A reference to the extended precision value to be compared. + +@return True, if this extended precision number is equal to aVal; + false, otherwise. +*/ + { + return(Compare(aVal)&EEqual); + } + + + + +TBool TRealX::operator!=(const TRealX &aVal) const +/** +@publishedAll +@released + +Compares this extended precision number for in-equality with another. + +@param aVal A reference to the extended precision value to be compared. + +@return True, if this extended precision number is not equal to aVal; + false, otherwise. +*/ + { + return!(Compare(aVal)&EEqual); + } + + + + +TBool TRealX::operator>=(const TRealX &aVal) const +/** +@publishedAll +@released + +Compares this extended precision number for being greater than +or equal to another. + +@param aVal A reference to the extended precision value to be compared. + +@return True, if this extended precision number is greater than or equal + to aVal, false, otherwise. +*/ + { + return(Compare(aVal)&(EEqual|EGreaterThan)); + } + + + + +TBool TRealX::operator<=(const TRealX &aVal) const +/** +@publishedAll +@released + +Compares this extended precision number for being less than +or equal to another. + +@param aVal A reference to the extended precision value to be compared. + +@return True, if this extended precision number is less than or equal + to aVal, false, otherwise. +*/ + { + return(Compare(aVal)&(ELessThan|EEqual)); + } + + + + +TBool TRealX::operator>(const TRealX &aVal) const +/** +@publishedAll +@released + +Compares this extended precision number for being greater than +another. + +@param aVal A reference to the extended precision value to be compared. + +@return True, if this extended precision number is greater than aVal, + false, otherwise. +*/ + { + return(Compare(aVal)&EGreaterThan); + } + + + + +TBool TRealX::operator<(const TRealX &aVal) const +/** +@publishedAll +@released + +Compares this extended precision number for being less than +another. + +@param aVal A reference to the extended precision value to be compared. + +@return True, if this extended precision number is less than aVal, + false, otherwise. +*/ + { + return(Compare(aVal)&ELessThan); + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32notif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32notif.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,43 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32notif.h +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef __E32NOTIF_H__ +#define __E32NOTIF_H__ +#include + +#define __NOTIFIER_NAME _L("!Notifier") +enum TNotifierMessage + { + ENotifierNotify, + ENotifierInfoPrint, + EStartNotifier, + ECancelNotifier, + EUpdateNotifier, + EStartNotifierAndGetResponse, + EStartNotifierFromSpecifiedDll, + EStartNotifierFromSpecifiedDllAndGetResponse, + ENotifierNotifyCancel, + EUpdateNotifierAndGetResponse, + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32panic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32panic.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2994 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32panic.h +// +// + +/** + @file e32panic.h + @publishedAll + @released +*/ + +#ifndef __E32PANIC_H__ +#define __E32PANIC_H__ + + + + +/** +Defines a set of panic numbers associated with the USER panic category. + +Some of these numbers are also associated with panics raised on +the kernel side, and may be associated with +a number of category names, including KERN-COMMON, KERN-HEAP etc. +*/ +enum TCdtPanic + { + + /** + A thread has called User::Invariant(). + + Typically, User::Invariant() is called when a test for a class + invariant fails, i.e. when a test which checks that the internal data + of an object is self-consistent, fails. + + Check the design and implementation of your class. + + @see User + */ + EInvariantFalse=0, + + + /** + Not used. + */ + ETDateTimeUnderflow=1, + + + + /** + Not used. + */ + ETDateTimeBadDate=2, + + + /** + A TDateTime object has been constructed with an invalid date or time field. + + @see TDateTime + */ + ETDateTimeBadDateTime=3, + + + /** + Not used. + */ + ETDateTimeAddDaysRange=4, + + + /** + Not used. + */ + ETDateTimeAddMonthsRange=5, + + + /** + Not used. + */ + ETDateTimeDaySecNegative=6, + + + /** + A panic raised by the Ptr() member function of a 16-bit descriptor + if the descriptor is invalid. + + @see TDesC16::Ptr() + */ + ETDes16BadDescriptorType=7, + + + /** + The length value passed to a 16-bit variant descriptor member + function is invalid. + + This panic may be raised by some descriptor constructors and, specifically, + by the Replace() and Set() descriptor member functions. + + @see TDes16 + */ + ETDes16LengthOutOfRange=8, + + + /** + The index value passed to the 16-bit variant descriptor Operator[] is + out of bounds. + */ + ETDes16IndexOutOfRange=9, + + + /** + The position value passed to a 16-bit variant descriptor member function + is out of bounds. + + The panic can be raised by the Left(), Right(), Mid(), Insert(), Delete() + and Replace() member functions of TDes16. + + @see TDes16 + */ + ETDes16PosOutOfRange=10, + + + /** + An operation to move or copy data to a 16-bit variant descriptor, + will cause the length of that descriptor to exceed its maximum length. + + This may be caused by any of the copying, appending or formatting member + functions but, specifically, by the Insert(), Replace(), Fill(), Fillz(), + and ZeroTerminate() descriptor member functions. It can also be caused by + the SetLength() function. + + @see TDes16 + */ + ETDes16Overflow=11, + + + /** + The format string passed to the 16-bit variant descriptor member functions + Format() and AppendFormat() has incorrect syntax. + + @see TDes16 + */ + ETDes16BadFormatDescriptor=12, + + + /** + An invalid variable list has been passed to the AppendFormatList() member + function of the 16-bit variant descriptor TDes16, when the format is %S or %s. + + This panic is raised in debug builds only. + + @see TDes16 + */ + ETDes16BadFormatParams=13, + + + /** + This panic is raised when expanding or contracting an HBufC16 buffer using + the ReAlloc() or ReAllocL() descriptor member functions and the new + specified length is too small to contain the data. + + @see HBufC16 + */ + ETDes16ReAllocTooSmall=14, + + + /** + Not used. + */ + ETDes16RemoteBadDescriptorType=15, + + + /** + In a call to the Replace() member function of the 16-bit variant + descriptor TDes16,the length of the source descriptor is negative + or exceeds the maximum length of the target descriptor. + + @see TDes16 + */ + ETDes16RemoteLengthOutOfRange=16, + + + /** + A 16-bit variant descriptor is being constructed with a negative + length value. + + This panic may also be raised if the Set(), Repeat() and the Find() member + functions are passed negative length values. + */ + ETDes16LengthNegative=17, + + + /** + A 16-bit variant descriptor is being constructed with a negative maximum + length value. + */ + ETDes16MaxLengthNegative=18, + + + /** + A panic raised by the Ptr() member function of an 8-bit descriptor + if the descriptor is invalid. + + @see TDesC8::Ptr() + */ + ETDes8BadDescriptorType=19, + + + /** + The length value passed to an 8-bit variant descriptor member + function is invalid. + + This panic may be raised by some descriptor constructors and, specifically, + by the Replace() and Set() descriptor member functions. + + @see TDes8 + */ + ETDes8LengthOutOfRange=20, + + + /** + The index value passed to the 8-bit variant descriptor Operator[] is + out of bounds. + */ + ETDes8IndexOutOfRange=21, + + + /** + The position value passed to an 8-bit variant descriptor member function + is out of bounds. + + The panic can be raised by the Left(), Right(), Mid(), Insert(), Delete() + and Replace() member functions of TDes8 + + @see TDes8 + */ + ETDes8PosOutOfRange=22, + + + /** + An operation to move or copy data to an 8-bit variant descriptor, + will cause the length of that descriptor to exceed its maximum length. + + This may be caused by any of the copying, appending or formatting member + functions but, specifically, by the Insert(), Replace(), Fill(), Fillz(), + and ZeroTerminate() descriptor member functions. It can also be caused by + the SetLength() function. + + @see TDes8 + */ + ETDes8Overflow=23, + + + /** + The format string passed to the 8-bit variant descriptor member functions + Format() and AppendFormat() has incorrect syntax. + + @see TDes8 + */ + ETDes8BadFormatDescriptor=24, + + + /** + An invalid variable list has been passed to the AppendFormatList() member + function of the 8-bit variant descriptor TDes8, when the format is %S or %s. + + This panic is raised in debug builds only. + + @see TDes8 + */ + ETDes8BadFormatParams=25, + + + /** + This panic is raised when expanding or contracting an HBufC8 buffer using + the ReAlloc() or ReAllocL() descriptor member functions and the new + specified length is too small to contain the data. + + @see HBufC8 + */ + ETDes8ReAllocTooSmall=26, + + + /** + Not used. + */ + ETDes8RemoteBadDescriptorType=27, + + + + /** + In a call to the Replace() member function of the 8-bit variant + descriptor TDes8,the length of the source descriptor is negative + or exceeds the maximum length of the target descriptor. + + @see TDes8 + */ + ETDes8RemoteLengthOutOfRange=28, + + + /** + An 8-bit variant descriptor is being constructed with a negative + length value. + + This panic may also be raised if the Set(), Repeat() and the Find() member + functions are passed negative length values. + */ + ETDes8LengthNegative=29, + + + /** + An 8-bit variant descriptor is being constructed with a negative maximum + length value. + */ + ETDes8MaxLengthNegative=30, + + + /** + Not used. + */ + ETEntLeaveWithoutEnter=31, + + + /** + It is raised by TRawEvent::Pos() when + the event is not a mouse/pen type event. + + This panic is raised in debug builds only. + */ + ETEventNotMoveType=32, + + + /** + It is raised by TRawEvent::ScanCode() when + the event is not a key down or key up event. + + This panic is raised in debug builds only. + */ + ETEventNotKeyType=33, + + + /** + It is raised by TRawEvent::Modifiers() when + the event is not a modifier update event. + + This panic is raised in debug builds only. + */ + ETEventNotUpdateModifiersType=34, + + + /** + This panic is raised by the default At() virtual member function of TKey. + + The function is intended to be overridden by a derived class. + + @see TKey + */ + ETFuncTKeyVirtualAt=35, + + + /** + This panic is raised by the default Swap() virtual member function of TSwap. + + The function is intended to be overridden by a derived class. + + @see TSwap + */ + ETFuncTSwapVirtualSwap=36, + + + /** + The index value passed to the operator[] of a TUidType is negative + or is greater than or equal to KMaxCheckedUid. + + @see KMaxCheckedUid + @see TUidType + */ + ETFuncUidTypeBadIndex=37, + + + /** + The length of the descriptor passed to the Set(TDesC8&) member function of TCheckedUid + is not equal to the size of a TCheckedUid object. + + @see TCheckedUid + */ + ETFuncCheckedUidBadSet=38, + + + /** + The size specified of a new heap is smaller than the permitted minimum; + it must be at least the size of a RHeap object. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-HEAP category. + */ + ETHeapNewBadSize=39, + + + /** + Not used. + */ + ETHeapCreateSizeTooSmall=40, + + + /** + In a call to UserHeap::ChunkHeap(), the value defining the minimum length + of the heap is greater than the value defining the maximum length to + which the heap can grow. + + @see UserHeap + */ + ETHeapCreateMaxLessThanMin=41, + + + /** + In a call to the RHeap member functions, AllocLen(), Free(), FreeZ(), + ReAlloc(), ReAllocL(), Adjust() and AdjustL(), a pointer passed to these + functions does not point to a valid cell. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-HEAP category. + */ + ETHeapBadCellAddress=42, + + + /** + In a call to the Adjust() and AdjustL() member functions of RHeap, a heap + cell is being shrunk and the amount by which the cell is being shrunk + is less than the current length of the cell. + */ + ETHeapAdjustTooSmall=43, + + + /** + In a call to the Free() and FreeZ() member functions of RHeap,the cell + being freed overlaps the next cell on the free list (i.e. the first cell + on the free list with an address higher than the one being freed). + */ + ETHeapFreeBadNextCell=44, + + + /** + In a call to the Free() and FreeZ() member functions of RHeap, the cell + being freed overlaps the previous cell on the free list (i.e. the last cell + on the free list with an address lower than the one being freed). + */ + ETHeapFreeBadPrevCell=45, + + + /** + In a call to the ReAlloc() and ReAllocL() member functions of RHeap, the + cell being reallocated overlaps the next cell on the free list (i.e. the + first cell on the free list with an address higher than the one being + reallocated). + */ + ETHeapReAllocBadNextCell=46, + + + /** + In a call to the Alloc(), AllocL() or AllocLC() member functions of RHeap, + an attempt has been made to allocate a cell from a heap, using an unsigned + size value which is greater than or equal to the value of KMaxTInt/2. + + This panic may also be raised by the heap walker when it finds a bad + allocated heap cell size. + + @see User::Check() + @see RAllocator::Check() + @see KMaxTInt + */ + ETHeapBadAllocatedCellSize=47, + + + /** + This panic is raised by the heap walker when it finds a bad + allocated heap cell address. + */ + ETHeapBadAllocatedCellAddress=48, + + + /** + This panic is raised by the heap walker when it finds a bad + free heap cell address. + */ + ETHeapBadFreeCellAddress=49, + + + /** + Not used. + */ + ETHeapDebugBufferOverflow=50, + + + /** + A call has been made to the __DbgMarkEnd() member function of RHeap, when + there has been no corresponding call to the __DbgMarkStart() member function. + + This panic is also raised when there are more calls to __DbgMarkEnd() than + to __DbgMarkStart(). These functions are part of the debug assistance provided by + the RHeap class. + + This panic is raised in debug builds only. + */ + ETHeapDebugUnmatchedCallToCheckHeap=51, + + + /** + In a call to the Adjust() and AdjustL() member functions of an RHeap, + the offset from the start of the cell being stretched or shrunk is + a negative value. + */ + ETHeapAdjustOffsetNegative=52, + + + /** + Not used. + */ + ETHeapAllocSizeNegative=53, + + + /** + In a call to the ReAlloc() and ReAllocL() member functions of an RHeap, + the new size for the cell being reallocated is a negative value. + */ + ETHeapReAllocSizeNegative=54, + + + /** + This panic is caused by the UserHeap::ChunkHeap() static function when + the value defining the minimum length of the heap is negative. + */ + ETHeapMinLengthNegative=55, + + + /** + This panic is caused by the UserHeap::ChunkHeap() static function when + the value defining the maximum length to which the heap can grow, + is negative. + */ + ETHeapMaxLengthNegative=56, + + + /** + This panic is raised when closing a shared heap using the Close() member + function of RHeap and the access count is zero or negative. + + A zero or negative access count suggests that an attempt is being made + to close the heap too many times. + */ + EAllocatorClosedTooManyTimes=57, + + + /** + This panic is raised when opening a heap for shared access using the Open() + member function of RHeap and the heap type is not EChunkNormal. + */ + ETHeapOnlyChunkHeaps=58, + + + /** + This panic is raised by the UnGet() member function of the 8-bit variant + lexical analyzer, TLex8, if the character position is already at + the start of the string. + + @see TLex8 + */ + ETLex8UnGetUnderflow=59, + + + /** + This panic is raised by the Inc() member function of the 8-bit variant + lexical analyzer, TLex8, if the resulting character position lies before + the start of the string or after the end of the string. + + @see TLex8 + */ + ETLex8IncOutOfRange=60, + + + /** + This panic is raised by the SkipAndMark() member function of the 8-bit + variant lexical analyzer, TLex8, if the resulting character position lies + before the start of the string, or after the end of the string. + + @see TLex8 + */ + ETLex8SkipOutOfRange=61, + + + /** + Not used. + */ + ETLex8BadFormatList=62, + + + /** + This panic is raised by the ValidateMark() member function of the 8-bit + variant lexical analyzer, TLex8, if the position of the extraction mark + lies before the start of the string or after the end of the string. + + @see TLex8 + */ + ETLex8MarkOutOfRange=63, + + + /** + This panic is raised by the UnGet() member function of the 16-bit variant + lexical analyzer, TLex16, if the character position is already at the start + of the string. + + @see TLex16 + */ + ETLex16UnGetUnderflow=64, + + + /** + This panic is raised by the Inc() member function of the 16-bit variant + lexical analyzer, TLex16, if the resulting character position lies before + the start of the string or after the end of the string. + + @see TLex16 + */ + ETLex16IncOutOfRange=65, + + + /** + This panic is raised by the SkipAndMark() member function of the 16-bit + variant lexical analyzer, TLex16, if the resulting character position lies + before the start of the string or after the end of the string. + + @see TLex16 + */ + ETLex16SkipOutOfRange=66, + + + /** + Not used. + */ + ETLex16BadFormatList=67, + + + /** + This panic is raised by the ValidateMark() member function of the 16-bit + variant lexical analyzer, TLex16, if the position of the extraction mark + lies before the start of the string or after the end of the string. + + @see TLex16 + */ + ETLex16MarkOutOfRange=68, + + + /** + This panic is raised by the TDateSuffix constructor or its Set() member + function when the suffix index specified is negative or is greater than or + equal to the value KMaxSuffixes. + + The index is used to access a locale dependent table of suffix characters, + which can be appended to the dates of the month (e.g. the characters "st" + for 1st, "nd" for 2nd, "st" for 31st). + + @see TDateSuffix + @see KMaxSuffixes + */ + ETLoclSuffixOutOfRange=69, + + + /** + This panic is raised when attempting to complete a client/server request + and the RMessagePtr is null. + */ + ETMesCompletion=70, + + + /** + Not used. + */ + EMesBadRetryCount=71, + + + /** + This panic is raised by the Send() and SendReceive() member functions + of RSessionBase, the client interface for communication with a server, + when the specified operation code identifying the required service is + either negative or a value greater than KMaxTint. + + @see RSessionBase + @see KMaxTint + */ + ETMesBadFunctionNumber=72, + + + /** + This panic is raised by the Receive() member function of RServer, + the handle to the server, when the attempt to receive a message + for the server, synchronously, fails. + + @see RServer + */ + ETMesReceiveFailed=73, + + + /** + Not used. + */ + ESQueOffsetNegative=74, + + + /** + This panic is raised by the constructor of a singly linked list header, + a TSglQue or by the SetOffset() member function when the specified offset + is not 4 byte aligned, i.e. when it is not divisible by 4. + + @see TSglQue + */ + ESQueOffsetNotAligned=75, + + + /** + This panic is raised when attempting to remove an object from a singly + linked list, using the Remove() member function of TSglQue, when + that object is not in the list. + + @see TSglQue + */ + ESQueLinkNotQueued=76, + + + /** + Not used. + */ + ETQueOffsetNegative=77, + + + /** + This panic is raised by the constructor of a doubly linked list header, + a TDblQue or by the SetOffset() member function, when the specified + offset is not 4 byte aligned, i.e. when it is not divisible by 4. + + @see TDblQue + */ + ETQueOffsetNotAligned=78, + + + /** + This panic is raised by a call to either the First() or the Last() member + functions of a doubly linked list, a TDblQue, which return pointers + to the first and last element in the list respectively; the panic + occurs when the list is empty. + + This panic is raised in debug builds only. + + @see TDblQue + */ + ETQueQueueEmpty=79, + + + /** + This panic is raised by the post increment operator, operator++, the post + decrement operator, operator- and the return current element + operator, operator T*, of the doubly linked list iterator, a TDblQueIter; + the panic occurs when the element returned by these operators is not in + the list. + + Typically, this is caused by the removal of the element from the list prior + to calling these operators. + + This panic is raised in debug builds only. + + @see TDblQueIter + */ + ETQueLinkHasBeenRemoved=80, + + + /** + This panic is raised by the get rectangle operator, operator[], of + a clipping region, derived from the abstract base class TRegion. + + The panic occurs when the index, which refers to the specific rectangle + within the region, is greater than or equal to the number of rectangles + contained within the region (as returned by the Count() member function). + + The index must be strictly less than the number of contained rectangles. + + @see TRegion + */ + ETRegionOutOfRange=81, + + + /** + This panic is raised when sorting the rectangles within a clipping region, + derived from the abstract base class TRegion, using the Sort() member + function of TRegion. + + The panic occurs when the region is invalid. + + This panic is raised in debug builds only. + + @see TRegion + */ + ETRegionInvalidRegionInSort=82, + + + /** + This panic occurs when the Kernel sends a message to the Kernel server + and this completes with an error, i.e. an error code which is not KErrNone. + */ + ETUtlKernelServerSend=83, + + + /** + This panic is raised by the Panic() member function of RTest, the test class. + */ + ERTestFailed=84, + + + /** + This panic is raised by the CheckConsoleCreated() member functions of + RTest and RTestJ, the test classes, when the creation of a console, + as derived from a CConsoleBase, fails. + */ + ERTestCreateConsole=85, + + + /** + This panic is raised by the static function User::After() when + the specified time interval is negative. + */ + EExecAfterTimeNegative=86, + + + /** + This panic is raised when the time interval passed to the After() member + function of RTimer is negative. + + @see RTimer + */ + ERTimerAfterTimeNegative=87, + + + /** + This panic is raised by Mem::Compare(), Mem::CompareC() and Mem::CompareF() + when the length of the area of memory designated as the left hand area, + is negative. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EMemLeftNegative=88, + + + /** + This panic is raised by Mem::Compare(), Mem::CompareC() and Mem::CompareF() + when the length of the area of memory designated as the right hand area, + is negative. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EMemRightNegative=89, + + + /** + This panic is raised by Mem::Copy() when the length of the area of memory + to be copied is negative. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EMemCopyLengthNegative=90, + + + /** + This panic is raised by Mem::Move() when the length of the area of memory + to be moved is not a multiple of 4. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EWordMoveLengthNotMultipleOf4=91, + + + /** + This panic is raised by Mem::Move() when the address of the source for + the move operation is not aligned on a 4 byte boundary. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EWordMoveSourceNotAligned=92, + + + /** + This panic is raised by Mem::Move() when the address of the target for + the move operation is not aligned on a 4 byte boundary. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EWordMoveTargetNotAligned=93, + + + /** + This panic is raised by Mem::Swap() when the length of the area of + memory to be swapped is negative. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EMemSwapLengthNegative=94, + + + /** + This panic is raised by Mem::Fill() and Mem::FillZ() when the length of + the area of memory to be filled is negative. + + This panic is raised in debug builds only. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-COMMON category. + + @see Mem + */ + EMemFillLengthNegative=95, + + + /** + The value for the number of records to be sorted passed + to User::QuickSort() is negative. + + @see User + */ + ESortCountNegative=96, + + + /** + The value for the number of records taking part in the search passed + to User::BinarySearch() is negative. + + @see User + */ + EBinarySearchCountNegative=97, + + + /** + This panic is raised by the constructor of the base key class, TKey. + + It occurs when the offset value passed to the constructor is negative. + As TKey is an abstract class, i.e. objects of type TKey are not intended + to be explicitly constructed, look at the offset value passed to + the constructors of derived classes such as TKeyArrayFix, TKeyArrayVar, + and TKeyArrayPak for the cause of the panic. + + @see TKey + @see TKeyArrayFix + @see TKeyArrayVar + @see TKeyArrayPak + */ + EKeyOffsetNegative=98, + + + /** + This panic is raised when a local or global chunk is created using + the RChunk member functions: CreateLocal(), CreateGlobal(), + CreateDoubleEndedLocal() and CreateDoubleEndedGlobal(). + + It occurs when the value for the maximum size to which this chunk can + be adjusted, is negative. + + @see RChunk + */ + EChkCreateMaxSizeNegative=99, + + + /** + This panic is raised when a local or global chunk is created using + the RChunk member functions: CreateLocal() and CreateGlobal(). + + It occurs when the value for the number of bytes to be committed to + this chunk on creation, is negative. + + @see RChunk + */ + EChkCreateSizeNotPositive=100, + + + /** + This panic is raised when a local or global chunk is created using + the RChunk member functions: CreateLocal() and CreateGlobal(). + + It occurs when the value for the number of bytes to be committed to + this chunk on creation is greater than the value for the maximum size + to which this chunk can be adjusted. + + @see RChunk + */ + EChkCreateMaxLessThanMin=101, + + + /** + This panic is raised when changing the number of bytes committed to a chunk + by calling the Adjust() member function of RChunk. + + The panic occurs when the value passed to the function is negative. + + @see RChunk + */ + EChkAdjustNewSizeNegative=102, + + + /** + Not used. + */ + ESesDelayTimeNegative=103, + + + /** + Not used. + */ + ESesRetryCountNegative=104, + + + /** + This panic is raised when a local or global semaphore is created using + the RSemaphore member functions: CreateLocal() and CreateGlobal(), and + the value for the initial semaphore count is negative. + + @see RSemaphore + */ + ESemCreateCountNegative=105, + + + /** + This panic is raised when a semaphore is signaled using + the Signal(TInt aCount) member function and the count value is negative. + + @see RSemaphore + */ + ESemSignalCountNegative=106, + + + /** + This panic is raised when a critical section is signalled using + the Signal() member function and the call to Signal() is not matched + by an earlier call to Wait(), which suggests that this is a stray signal. + + @see RCriticalSection + */ + ECriticalSectionStraySignal=107, + + + /** + Not used. + */ + EThrdHeapNotChunkType=108, + + + /** + This panic is raised when creating a thread using the Create() member + functions of RThread. + + The panic occurs when the value of the stack size passed to + these functions is negative. + + @see RThread + */ + EThrdStackSizeNegative=109, + + + /** + This panic is raised when creating a thread using the Create() member + functions of RThread. + + The panic is only raised by those variants of Create() that create a new + heap for the new thread. The panic occurs if the minimum heap size + specified is less than KMinHeapSize. + + @see RThread + @see KMinHeapSize + */ + EThrdHeapMinTooSmall=110, + + + /** + This panic is raised when creating a thread using the Create() member + functions of RThread. + + The panic is only raised by those variants of Create() which create a new + heap for the new thread. The panic occurs if the minimum heap size + specified is greater than the maximum size to which the heap can grow. + + @see RThread + */ + EThrdHeapMaxLessThanMin=111, + + + /** + This panic is raised by the Alloc() and AllocL() member functions of class + RRef when the size value passed is negative. + */ + ERefAllocSizeNegative=112, + + + /** + This panic is raised by: + + 1. the constructor of a time representation object, a TTime, which takes + a text string, when the format of that text string is incorrect + or represents an invalid date/time. + + 2. the Parse() member function of a time representation object, a TTime, + if the century offset value is either negative or is greater than + or equal to 100. + + 3. the Time::DaysInMonth() function, if an invalid month value is passed. + + @see TTime + @see Time + */ + ETTimeValueOutOfRange=113, + + + /** + This panic is raised by member functions of TBusLocalDrive when no + connection has been made to a local drive. + + This panic is raised in debug builds only. + + @see TBusLocalDrive + */ + EDriveNotConnected=114, + + + /** + This panic is raised when attempting to connect to a local drive + using the Connect() member function of TBusLocalDrive, and + the specified drive number is out of range, i.e. the drive number + is negative or is greater than or equal to KMaxLocalDrives. + + @see TBusLocalDrive + @see KMaxLocalDrives + */ + EDriveOutOfRange=115, + + + /** + This panic is raised by the Lookup() member function of RLibrary when + the ordinal number of the required DLL function, is zero or negative. + + @see RLibrary + */ + EBadLookupOrdinal=116, + + + /** + Not used. + */ + EChunkHeapBadOffset=117, + + + /** + Not used. + */ + ETQueLinkAlreadyInUse=118, + + + /** + This panic is raised when setting a new currency symbol using + the User::SetCurrencySymbol() function. + + The panic occurs when the length of the descriptor containing + the new symbol is greater than KMaxCurrencySymbol. + + @see User + @see KMaxCurrencySymbol + */ + ECurrencySymbolOverflow=119, + + + /** + This panic is raised by the CreateDoubleEndedLocal() + and CreateDoubleEndedGlobal() member functions of RChunk when the lower + address of the committed region is negative. + + @see RChunk + */ + EChkCreateBottomNegative=120, + + + /** + This panic is raised by the CreateDoubleEndedLocal() + and CreateDoubleEndedGlobal() member functions of RChunk when the upper + address of the committed region is negative. + + @see RChunk + */ + EChkCreateTopNegative=121, + + + /** + This panic is raised by the CreateDoubleEndedLocal() + and CreateDoubleEndedGlobal() member functions of RChunk when the upper + address of the committed region is lower than the lower address of + the committed region. + + @see RChunk + */ + EChkCreateTopLessThanBottom=122, + + + /** + This panic is raised by the CreateDoubleEndedLocal() + and CreateDoubleEndedGlobal() member functions of RChunk when the upper + address of the committed region is lower than the maximum size to which + this chunk can be adjusted. + + @see RChunk + */ + EChkCreateTopBiggerThanMax=123, + + + /** + This panic is raised by RChunk::AdjustDoubleEnded() when the lower address + of the committed region is negative. + + @see RChunk + */ + EChkAdjustBottomNegative=124, + + + /** + This panic is raised by RChunk::AdjustDoubleEnded() when the upper address + of the committed region is negative. + + @see RChunk + */ + EChkAdjustTopNegative=125, + + + /** + This panic is raised by RChunk::AdjustDoubleEnded() when the upper address + of the committed region is lower than the lower address of the committed + region. + + @see RChunk + */ + EChkAdjustTopLessThanBottom=126, + + + /** + This panic is raised when constructing an array of pointers, + an RPointerArray, and specifying a granularity value which is + one of the following: + + 1. zero + + 2. negative + + 3. greater than 0x10000000. + + @see RPointerArray + */ + EBadArrayGranularity=127, + + + /** + This panic is raised when constructing an array of fixed length objects, + an RArray, and specifying a key offset value which is one of the following: + + 1. negative + + 2. not a multiple of 4 + + 3. greater than or equal to the size of the array elements. + + @see RArray + */ + EBadArrayKeyOffset=128, + + + /** + This panic is raised when constructing an array of fixed length objects, + an RArray, and the length of the array elements is one of the following: + + 1. zero + + 2. negative + + 3. greater than 640. + + @see RArray + */ + EBadArrayEntrySize=129, + + + /** + This panic is raised when an index value passed to a member function + of RArray or RPointerArray identifying an array element, is out of bounds. + + @see RArray + @see RPointerArray + */ + EBadArrayIndex=130, + + + /** + This panic is raised when the value identifying the insertion position + in a call to RArray::Insert() or RPointerArray::Insert(), is either + negative or greater than the number of elements in the array. + + @see RArray + @see RPointerArray + */ + EBadArrayPosition=131, + + + /** + This panic is raised when an index value passed to + Mem::CollationMethodByIndex() or Mem::CollationMethodId() is out of bounds. + + @see Mem + */ + EBadCollationRulesIndex=132, + + + /** + This panic is raised when an index value passed to TFixedArray::At() + or TFixedArray::operator[] is out of bounds. + + @see TFixedArray + */ + EBadFixedArrayIndex=133, + + + /** + Not used. + */ + ERawEventFlipTypeNotImplemented=134, + + + /** + Not used. + */ + ENumberOfParametersExceedsMaximum=136, + + + /** + This panic is raised internally by the descriptor formatting functions during the handling + of the variable parameter lists when the parameter is too big. + */ + ESizeOfParameterTooBig=137, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists when an index value + for the parameters is outside its permitted range. + */ + EParameterIndexOutOfRange1=138, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists when an index value + for the parameters is outside its permitted range. + + This panic is raised in debug mode only. + */ + EParameterIndexOutOfRange2=139, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EFormatDirectiveAlreadySet1=140, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EFormatDirectiveAlreadySet2=141, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + ENumberOfFormatDirectivesExceedsMaximum=142, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + ENoParametersInFormatDirective=143, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EFormatDirectiveNotYetSet=144, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EBadFormatDirectiveDataPointer=145, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EFormatDirectiveIndexOutOfRange=146, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + ENotOnFirstPassOfFormatDescriptor1=147, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + ENotOnFirstPassOfFormatDescriptor2=148, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EInconsistentSizeOfParameter=149, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + ENullTargetPointer=150, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + ENegativeSizeOfParameter=151, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EErrorOnSecondPassOfFormatDescriptor=152, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EUnexpectedError1=153, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EUnexpectedError2=154, + + + /** + Not used. + */ + ECreateTransferBufferSizeNotPositive=155, + + + /** + This panic occurs in the construction of an RPointerArray object from + an existing pointer array object, when the number defining the number + of entries in the existing array is not positive. + + @see RPointerArray + */ + EBadArrayCount=156, + + + /** + This panic is raised by RChunk::Commit() when the value of the offset of + the committed region is negative. + + @see RChunk + */ + EChkCommitOffsetNegative=157, + + + /** + This panic is raised by RChunk::Commit() when the size of the + the committed region is negative. + + @see RChunk + */ + EChkCommitSizeNegative=158, + + + /** + This panic is raised by RChunk::Allocate() when the size of the + the committed region is negative. + + @see RChunk + */ + EChkAllocateSizeNegative=159, + + + /** + This panic is raised by RChunk::Decommit() when the value of the offset of + the committed region is negative. + + @see RChunk + */ + EChkDecommitOffsetNegative=160, + + + /** + This panic is raised by RChunk::Decommit() when the size of the + the committed region is negative. + + @see RChunk + */ + EChkDecommitSizeNegative=161, + + + /** + This panic is raised when an invalid chunk type has been passed to + the internal member RChunk::Create() + + @see RChunk + */ + EChkCreateInvalidType=162, + + + /** + This panic is raised when a global chunk is being created and + no name has been specified. + + @see RChunk + */ + EChkCreateInvalidName=163, + + + /** + This panic is raised when creating a 'normal' chunk and the offset of the bottom of the new committed region + from the base of the chunk's reserved region is not zero. + + @see RChunk + */ + EChkCreateInvalidBottom=164, + + + /** + This panic is raised by the internal function RLibrary::Init() when the function that + constructs static data following a DLL load, leaves. + */ + EDllStaticConstructorLeave=165, + + + /** + This panic is raised internally, if a call to the static data destructors + following a library handle close, leaves. + */ + EDllStaticDestructorLeave=166, + + + /** + This panic is raised in a call to RAllocator::Close() when the number of + handles is greater than the maximum allowed, RAllocator::EMaxHandles. + + @see RAllocator + */ + EAllocatorBadHandleCount=167, + + + /** + This panic is raised by the internal RHeap constructor when the offset value is invalid. + */ + ETHeapNewBadOffset=168, + + + /** + This panic is raised by the Symbian internal function RHeap::Reduce() on failure. + */ + ETHeapReduceFailed=169, + + + /** + This panic is raised by the Symbian internal function RHeap::Reset() on failure. + */ + ETHeapResetFailed=170, + + + /** + This panic is raised by the Symbian internal function RHeap::WalkCheckCell() on a + bad free cell size. + */ + ETHeapBadFreeCellSize=171, + + + /** + This panic is raised by the Symbian internal function RHeap::Initialise() on a + bad alignment value. + */ + ETHeapNewBadAlignment=172, + + + /** + Not used. + */ + ETHeapBadDebugOp=173, + + + /** + This panic is raised when an unimplemented pure virtual function is called. + */ + EPureVirtualCalled=174, + + + /** + This panic is raised when a User::Leave() is called and there + is no TRAP frame. + */ + EUserLeaveWithoutTrap=175, + + + /** + This panic is raised when a mathematical function fails with an + unrecognized exception, i.e. one that is none of: KErrArgument, + KErrDivideByZero, KErrOverflow or KErrUnderflow. + */ + EMathUnknownError=176, + + + /** + This panic is raised by the Symbian internal function RHeap::WalkCheckCell() on a + bad cell type. + */ + ETHeapWalkBadCellType=177, + + + /** + This panic is raised when descriptors convert integers into text, and + an invalid radix is passed, i.e. a value that is not one + of the TRadix enum values. + */ + EInvalidRadix=178, + + + /** + This panic is raised when converting and appending numbers in descriptors, + and buffers are not aligned on even addresses. + + This panic is raised in debug builds only. + */ + EDes16PadAppendBadAlign=179, + + + /** + Not used. + */ + EMsgQueueSizeInvalid=180, + + + /** + @internalComponent + */ + EHuffmanTooManyCodes=181, + + + /** + @internalComponent + */ + EHuffmanInvalidCoding=182, + + + /** + @internalComponent + */ + EBadArrayFindMode=183, + + + /** + In a call to RNotifier::Notify(), the length of one or more of + the descriptors containing the displayable text is bigger than + the maximum TUint16 value. + */ + ENotifierTextTooLong=184, + + + /** + In a call to one of the functions: + TMonthName::Set() + TMonthNameAbb::Set() + TDayName::Set() + TDayNameAbb::Set() + + the month or day value is outside the permitted range of values. + + @see TMonthName + @see TMonthNameAbb + @see TDayName + @see TDayNameAbb + */ + EBadLocaleParameter=185, + + + /** + This panic is raised internally by the descriptor formatting functions + during the handling of the variable parameter lists. + */ + EUnexpectedError3=186, + + + /** + In a call to TDes8::Expand(), either the length, or the maximum length, + or the pointer to the data is not an even number. + + @see TDes8 + */ + EDes8ExpandOdd=187, + + + /** + In a call to TDes8::Collapse(), either the length, or the maximum length, + or the pointer to the data is not an even number. + + @see TDes8 + */ + EDes8CollapseOdd=188, + + + /** + In a call to one of the TSecurityPolicy constructors, the specified + capability was found to be inavlid. + + @see TCapability + */ + ECapabilityInvalid=189, + + + /** + In a call to TSecurityPolicy::CheckPolicy, the security policy was found to + be corrupt. + + @see TSecurityPolicy + */ + ESecurityPolicyCorrupt=190, + + + /** + In a call to TSecurityPolicy::TSecurityPolicy(TSecPolicyType aType), aType + was not one of ETypePass or ETypeFail. + + @see TSecurityPolicy + */ + ETSecPolicyTypeInvalid=191, + + /** + This panic is raised when constructing an RPointerArray or RArray if the + specified minimum growth step is less than or equal to zero or is greater + than 65535. + + @see RPointerArray + @see RArray + */ + EBadArrayMinGrowBy=192, + + + /** + This panic is raised when constructing an RPointerArray or RArray if the + specified exponential growth factor is less than or equal to 1 or is + greater than or equal to 128. + + @see RPointerArray + @see RArray + */ + EBadArrayFactor=193, + + + /** + This panic is raised if code inside an __ASSERT_*_NO_LEAVE harness leaves. + + @see RPointerArray + @see RArray + */ + EUnexpectedLeave=194, + + + /** + A function was used to grow a cell on the heap, but it did not grow as expected. + */ + ETHeapCellDidntGrow=195, + + + /** + An attempt was made to install a Win32 SE handler not on the stack. + + @see TWin32SEHTrap + */ + EWin32SEHandlerNotOnStack=196, + + /** + This panic is raised when the caller of an API doesn't have the right capabilities to + call the specific API that raises this panic. Please consult the documentation for the + API in question to learn what capabilities you need to call it. + */ + EPlatformSecurityViolation=197, + + /** + This panic is raised if a NULL function pointer is passed in as the hash function + when constructing a hash table class. + */ + EHashTableNoHashFunc=198, + + /** + This panic is raised if a NULL function pointer is passed in as the identity + relation when constructing a hash table class. + */ + EHashTableNoIdentityRelation=199, + + /** + This panic is raised if a negative element size is specified when constructing + a hash table class. + */ + EHashTableBadElementSize=200, + + /** + This panic is raised if, when constructing a hash table class, the specified + key offset is inconsistent with the specified element size. + */ + EHashTableBadKeyOffset=201, + + /** + This panic is raised in debug builds only if a deleted entry still remains after + a hash table reform. It should never occur, since it signifies an error in the + hash table implementation. + */ + EHashTableDeletedEntryAfterReform=202, + + /** + This panic should never occur since it signifies an error in the hash table + implementation. + */ + EHashTableBadGeneration=203, + + /** + This panic should never occur since it signifies an error in the hash table + implementation. + */ + EHashTableBadHash=204, + + /** + This panic should never occur since it signifies an error in the hash table + implementation. + */ + EHashTableEntryLost=205, + + /** + This panic should never occur since it signifies an error in the hash table + implementation. + */ + EHashTableCountWrong=206, + + /** + This panic should never occur since it signifies an error in the hash table + implementation. + */ + EHashTableEmptyCountWrong=207, + + /** + This panic is raised if, while attempting to step a hash table iterator to + the next entry, the iterator is found to point to an invalid table entry. + This will typically occur if elements have been removed from the hash table + without resetting the iterator. + */ + EHashTableIterNextBadIndex=208, + + /** + This panic is raised if, while interrogating the current position of a + hash table iterator, the iterator is found to point to an invalid table entry. + This will typically occur if elements have been added to or removed from + the hash table without resetting the iterator. + */ + EHashTableIterCurrentBadIndex=209, + + /** + This panic is raised if an invalid argument is passed to the Reserve() function + on any of the hash table classes. + */ + EHashTableBadReserveCount=210, + + /** + The Win32 SE handler chain has been corrupted. + + @see TWin32SEHTrap + */ + EWin32SEHChainCorrupt=211, + + + /** + This panic is raised if an invalid argument is passed to the Reserve() function + on the RArray or RPointerArray classes. + */ + EArrayBadReserveCount=212, + + /** + This panic is raised when attempting to set a new debug failure mode on + a heap with an invalid argument. For example, if aBurst > KMaxTUint6 + when invoking __UHEAP_BURSTFAILNEXT when a RHeap object is used for + the user heap. + + On the user side this is associated with the USER category; on the kernel side + this is associated with the KERN-HEAP category. + + @see RAllocator::TAllocFail + */ + ETHeapBadDebugFailParameter = 213, + + + /** + This panic is raised when an invalid chunk attribute has been passed to + the method RChunk::Create(). + + @see RChunk + */ + EChkCreateInvalidAttribute = 214, + + + /** + This panic is raised when a TChunkCreateInfo object with an invalid version + number has been passed to the method RChunk::Create(). + + @see RChunk + @see TChunkCreateInfo + */ + EChkCreateInvalidVersion = 215, + }; + + + + +/** +Defines a set of panic numbers associated with the E32USER-CBASE panic category. + +Panics with this category are raised in user side code by member functions of +CBase derived classes that reside in euser.dll. Typically, they are caused by +passing bad or contradictory values to class constructors or member functions. +*/ +enum TBasePanic + { + + /** + This panic is raised by the Set() member function of CAsyncCallBack, + if this active object is already active when the function is called. + + @see CAsyncCallBack + */ + ECAsyncCBIsActive=1, + + + /** + This panic is raised by the Call() member function of CAsyncOneShot, + if the active object has not already been added to the active scheduler. + + This panic is raised in debug builds only. + + @see CAsyncOneShot + */ + ECAsyncOneShotNotAdded=2, + + + /** + This panic is raised during construction of a dynamic buffer, + a CBufFlat or a CBufSeg object, when the value of the granularity passed + to the constructors is negative. + + @see CBufFlat + @see CBufSeg + */ + EBufExpandSizeNegative=3, + + + /** + This panic is raised when reading from a dynamic buffer, + a CBufFlat or a CBufSeg, using the Read() member function. + + It is caused by attempting to read beyond the end of the buffer. + + @see CBufFlat + @see CBufSeg + */ + EBufReadBeyondEnd=4, + + + /** + This panic is raised when writing to a dynamic buffer, + a CBufFlat or a CBufSeg, using the Write() member function. + + It is caused by attempting to write beyond the end of the buffer. + + @see CBufFlat + @see CBufSeg + */ + EBufWriteBeyondEnd=5, + + + /** + This panic is raised when reading from a dynamic buffer, + a CBufFlat or a CBufSeg, using the Read() member function. + + It is caused by specifying a negative length for the amount of data + to be read. + + @see CBufFlat + @see CBufSeg + */ + EBufReadLengthNegative=6, + + + /** + This panic is raised when writing to a dynamic buffer, + a CBufFlat or a CBufSeg, using the Write() member function. + + It is caused by specifying a negative length for the amount of data + to be written. + + @see CBufFlat + @see CBufSeg + */ + EBufWriteLengthNegative=7, + + + /** + This panic is raised when inserting data into a dynamic buffer, + a CBufFlat or a CBufSeg, using the InsertL() member function or when + inserting an uninitialized region into the dynamic buffer using + the ExpandL() member function. + + It is caused by passing a negative length value to these functions. + + @see CBufFlat + @see CBufSeg + */ + EBufInsertLengthNegative=8, + + + /** + This panic is raised when inserting data into a dynamic buffer, + a CBufFlat or a CBufSeg, using the InsertL() member function. + + It is caused when the variant of InsertL(), which takes a pointer to TAny + is passed a NULL pointer value. + + @see CBufFlat + @see CBufSeg + */ + EBufInsertBadPtr=9, + + + /** + This panic is raised when specifying the minimum amount of space + that a flat dynamic buffer, a CBufFlat, should occupy using + the SetReserveL() member function. + + It is caused when the size value passed to the function is negative. + + @see CBufFlat + */ + EBufFlatReserveNegative=10, + + + /** + This panic is raised when specifying the minimum amount of space + that a flat dynamic buffer, a CBufFlat, should occupy using + the SetReserveL() member function. + + It is caused when the size value passed to the function is less than + the current size of the buffer. + + @see CBufFlat + */ + EBufFlatReserveSetTooSmall=11, + + + /** + This panic is raised by the Delete(), Ptr(), BackPtr() member functions + of a flat dynamic buffer, a CBufFlat; the panic can also be raised by + InsertL() and ExpandL(). + + It is caused when the position value passed to these functions is either + negative or represents a position beyond the end of the current buffer. + + @see CBufFlat + */ + EBufFlatPosOutOfRange=12, + + + /** + This panic is raised by the Delete() member function of + a flat dynamic buffer, a CBufFlat. + + It is caused when the combination of position and length values passed + to the function implies an attempt to delete data beyond the end of + the flat buffer. + + @see CBufFlat + */ + EBufFlatDeleteBeyondEnd=13, + + + /** + This panic is raised by the Delete(), Ptr(), BackPtr() member functions + of a segmented dynamic buffer, a CBufSeg); the panic can also be raised + by InsertL() and ExpandL(). + + It is caused when the position value passed to these functions is either + negative or represents a position beyond the end of the current buffer. + + @see CBufSeg + */ + EBufSegPosOutOfRange=14, + + + /** + This panic is raised by the Delete() member function of a segmented dynamic + buffer, a CBufSeg. + + It is caused when the combination of position and length values passed to + the function implies an attempt to delete data beyond the end of + the segmented buffer. + + @see CBufSeg + */ + EBufSegDeleteBeyondEnd=15, + + + /** + This panic is raised by the InsertL(), Delete(), Ptr() and BackPtr() member + functions as implemented for segmented buffers, CBufSeg, when + the offset within a segment, where data is to be inserted or removed, + is greater than the buffer granularity. + + This panic is raised in debug builds only. + + @see CBufSeg + */ + EBufSegSetSBO=16, + + + /** + This panic is raised by the constructors of arrays of fixed length objects + as represented, for example, by the classes CArrayFixFlat, CArrayFixSeg, + and CArrayFixFlat. + + It is caused when the record length is either negative or zero. The record + length is either explicitly specified, as in the case of + the CArrayFixFlat class, or is implied by the length of the template + class as in the case of the CArrayFixFlat class. + + @see CArrayFixFlat + @see CArrayFixSeg + */ + EArrayFixInvalidLength=17, + + + /** + This panic is raised by the constructors of arrays of fixed length objects + as represented, for example, by the classes: CArrayFixFlat and CArrayFixSeg. + + It is caused when the granularity passed to the constructors is + either negative or zero. + + @see CArrayFixFlat + @see CArrayFixSeg + */ + EArrayFixInvalidGranularity=18, + + + /** + This panic is raised by the constructors of arrays of variable length + objects as represented, for example, by the classes: CArrayVarFlat + and CArrayVarSeg. + + It is caused when the granularity passed to the constructors is either + negative or zero. + + @see CArrayFixFlat + @see CArrayFixSeg + */ + EArrayVarInvalidGranularity=19, + + + /** + This panic is raised by the constructors of packed arrays as represented, + for example, by the class CArrayPakFlat. + + It is caused when the granularity passed to the constructors is either + negative or zero. + + @see CArrayPakFlat + */ + EArrayPakInvalidGranularity=20, + + + /** + This panic is raised by any operation which accesses an element of an array + by explicit reference to an index number, for example, the Delete(), + InsertL() and At() member functions or the operator Operator[]. + + It is caused by specifying an index value which is either negative, + or is greater than or equal to the number of objects currently within the array. + */ + EArrayIndexOutOfRange=21, + + + /** + This panic is raised when deleting contiguous elements from an array of + fixed length objects (derived from CArrayFixBase) using the Delete() + member function. + + It is caused by specifying the number of contiguous elements as + a zero or negative value. + */ + EArrayCountNegative=22, + + + /** + This panic is raised when inserting contiguous elements into an array + of fixed length objects (derived from CArrayFixBase) using the + InsertL() member function. + + It is caused by specifying the number of contiguous elements as + a zero or negative value. + */ + EArrayCountNegative2=23, + + + /** + This panic is raised when resizing an array of fixed length objects + (derived from CArrayFixBase) using the ResizeL() member function. + + It is caused by specifying the number of contiguous elements as a zero + or negative value. + */ + EArrayCountNegative3=24, + + + /** + This panic is raised when deleting contiguous elements from an array of + variable length objects (derived from CArrayVarBase) using the Delete() + member function. + + It is caused by specifying the number of contiguous elements as a zero + or negative value. + */ + EArrayCountNegative4=25, + + + /** + This panic is raised when deleting contiguous elements from + a packed array (derived from CArrayPakBase) using the Delete() + member function. + + It is caused by specifying the number of contiguous elements as + a zero or negative value. + */ + EArrayCountNegative5=26, + + + /** + This panic is raised when reserving space in flat arrays of + fixed length objects, the CArrayFixFlat,CArrayFixFlat + and CArrayPtrFlat classes, using the SetReserveL() member function. + + It is caused by specifying the number of elements, for which space is to be + reserved, as less than the current number of elements in the array. + */ + EArrayReserveTooSmall=27, + + + /** + This panic is raised when inserting or appending replicated + elements to the arrays of fixed length objects CArrayFixFlat and + CArrayFixSeg using the InsertL() or AppendL() functions. + + It is caused by specifying the number of replicas as negative or zero. + */ + EArrayReplicasNegative=28, + + + /** + This panic is raised when deleting elements from a fixed length, variable + length or packed array (derived from CArrayFixBase, CArrayVarBase + and CArrayPakBase) using the Delete() function. + + It is caused when the specification of the position of the first element + to be deleted and the number of contiguous elements to be deleted refers + to elements which are outside the bounds of the array. + */ + EArrayCountTooBig=29, + + + /** + This panic is raised when inserting into, appending onto, expanding or + extending a variable length array or a packed array (i.e. arrays derived + from CArrayVar or CArrayPak) using the InsertL(), AppendL(), ExpandL() + or ExtendL() functions respectively. + + It is caused by specifying the length of the element as a negative value. + */ + EArrayLengthNegative=30, + + + /** + Not used. + */ + EArrayReaderCountVirtual=31, + + + /** + Not used. + */ + EArrayReaderAtVirtual=32, + + + /** + This panic is raised by the destructor of a CObject. + + It is caused when an attempt is made to delete the CObject + when the reference count is not zero. + + @see CObject + */ + EObjObjectStillReferenced=33, + + + /** + This panic is raised by the Close() member function of a CObject. + + It is caused when the reference count is negative. + */ + EObjNegativeAccessCount=34, + + + /** + This panic is raised by the Remove() member function of an object + container, a CObjectCon. + + It is caused when the CObject to be removed from the container is + not contained by the container. + + @see CObject + */ + EObjRemoveObjectNotFound=35, + + + /** + This panic is raised by the Remove() member function of a container + index, a CObjectConIx. + + It is caused when the object container, a CObjectCon, to be removed from + the index is not contained by the index. + */ + EObjRemoveContainerNotFound=36, + + + /** + This panic is raised by the Remove() member function of an object index, + a CObjectIx. + + It is caused when the handle passed to the Remove() function does not + represent a CObject known to the object index. + */ + EObjRemoveBadHandle=37, + + + /** + This panic is raised by the At(), FindByName() and FindByFullName() member + functions of an object container, a CObjectCon. + + It is caused when the unique ID as derived from the handle is not the same + as the unique ID held by the object container. + */ + EObjFindBadHandle=38, + + + /** + This panic is raised by the At() member function of an object container, + a CObjectCon. + + It is caused when the index represented by the handle is outside + the permitted range. In effect, the handle is bad. + */ + EObjFindIndexOutOfRange=39, + + + /** + This panic is raised by the destructor of an active object, a CActive. + + It is caused by an attempt to delete the active object while it still + has a request outstanding. + */ + EReqStillActiveOnDestruct=40, + + + /** + This panic is raised by the Add() member function of an active scheduler, + a CActiveScheduler. + + It is caused by an attempt to add an active object to the active scheduler + when it has already been added to the active scheduler + */ + EReqAlreadyAdded=41, + + + /** + This panic is raised by the SetActive() member function of an active + object, a CActive. + + It is caused by an attempt to flag the active object + as active when it is already active, i.e. a request is still outstanding. + */ + EReqAlreadyActive=42, + + + /** + This panic is raised by the Install() member function of an active + scheduler, a CActiveScheduler. + + It is caused by attempting to install this active scheduler as the current + active scheduler when there is already a current active scheduler; + i.e. an active scheduler has already been installed. + */ + EReqManagerAlreadyExists=43, + + + /** + This panic is raised by the Start(), Stop() and Add() member functions + of an active scheduler, a CActiveScheduler. + + It is caused by attempting to start or stop an active scheduler or by + attempting to add an active object, a CActive, to the active scheduler. + */ + EReqManagerDoesNotExist=44, + + + /** + This panic is raised by the Stop() member function of an active scheduler, + a CActiveScheduler. + + Calling Stop() terminates the wait loop started by the most recent + call to Start(). The panic is caused by a call to Stop() which is not + matched by a corresponding call to Start(). + */ + EReqTooManyStops=45, + + + /** + This panic is raised by an active scheduler, a CActiveScheduler. + + It is caused by a stray signal. + */ + EReqStrayEvent=46, + + + /** + This panic is raised by the Error() virtual member function of an active + scheduler, a CActiveScheduler. + + This function is called when an active object’s RunL() function leaves. + Applications always replace the Error() function in a class derived from + CActiveScheduler; the default behaviour provided by CActiveScheduler raises + this panic. + */ + EReqActiveObjectLeave=47, + + + /** + This panic is raised by the Add() member function of an active scheduler, + a CActiveScheduler, when a NULL pointer is passed to the function. + */ + EReqNull=48, + + + /** + This panic is raised by the SetActive() and Deque() member functions of + an active object, a CActive. + + It is raised if the active object has not been added to the active scheduler. + */ + EActiveNotAdded=49, + + + /** + This panic is raised by the SetPriority() member function of an active + object, a CActive. + + It is caused by an attempt to change the priority of the active object + while it is active, i.e. while a request is outstanding). + */ + ESetPriorityActive=50, + + + /** + This panic is raised by the At(), After() and Lock() member functions of + the CTimer active object. + + It is caused by an attempt to request a timer event when the CTimer active + object has not been added to the active scheduler. + */ + ETimNotAdded=51, + + + /** + This panic is raised by the Start() member function of the periodic timer + active object, a CPeriodic, when a negative time interval is passed to + the function. + */ + ETimIntervalNegativeOrZero=52, + + + /** + This panic is raised by the Start() member function of the periodic + timer active object, a CPeriodic, when a negative delay time interval + is passed to the function. + */ + ETimDelayNegative=53, + + + /** + Not used. + */ + EUnusedBasePanic1=54, // Unused + + + /** + Not used. + */ + ESvrNoServerName=55, + + + /** + This panic is raised by the New() and NewL() member functions of + CBitMapAllocator when a negative or zero size is passed to them. + */ + EBmaSizeLessOrEqualToZero=56, + + + /** + This panic is raised by the Free(TInt aPos) member function of + CBitMapAllocator when a position value is passed which is out of bounds. + */ + EBmaFreeOutOfRange=57, + + + /** + This panic is raised by the IsFree(TInt aPos) member function of + CBitMapAllocator when a position value is passed which is out of bounds. + */ + EBmaAllocOutOfRange=58, + + + /** + This panic is raised by the AllocFromTopFrom(TInt aPos) member function + of CBitMapAllocator when a position value is passed which is out of bounds. + */ + EBmaAllocFromTopFromOutOfRange=59, + + + /** + Not used. + */ + EBmaFreeTooMany=60, + + + /** + Not used. + */ + EBmaFreeNotAllocated=61, + + + /** + This panic is raised by the AllocAt() member function of CBitMapAllocator + when the implied position has already been allocated. + */ + EBmaAllocAtAlreadyAllocated=62, + + + /** + This panic is raised as a result of a call to the Pop() and PopAndDestroy() + static member functions of the CleanupStack class. + + The panic occurs when TRAPs have been nested and an attempt is made to pop too + many items from the cleanup stack for the current nest level. + */ + EClnPopAcrossLevels=63, + + + /** + This panic is raised as a result of a call to the Pop() and PopAndDestroy() + static member functions of the CleanupStack class. + + The panic occurs when attempt is made to pop more items from the cleanup + stack than are on the cleanup stack. + */ + EClnPopUnderflow=64, + + + /** + The panic is raised as a result of a call to the Pop() and PopAndDestroy() + static member functions of the CleanupStack class. + + The panic occurs when an attempt is made to pop more items from the cleanup + stack than are on the cleanup stack. + */ + EClnLevelUnderflow=65, + + + /** + This panic is raised if an attempt is being made to insert a cleanup item + into a position on the cleanup stack reserved for marking the current TRAP + nest level. + + In practice this error occurs if the call to CleanupStack::PushL() happens + when there has been no call to TRAP(). + */ + EClnPushAtLevelZero=66, + + + /** + This panic is raised when building a TCleanupStackItem which is to be added + to the cleanup stack. + + The building of the TCleanupStackItem needs a TCleanupItem and this has + been constructed with a NULL cleanup operation (a TCleanupOperation). + */ + EClnNoCleanupOperation=67, + + + /** + This panic is raised if there are no free slots available on the cleanup + stack to insert a cleanup item. + */ + EClnNoFreeSlotItem=68, + + + /** + This panic is raised if no trap handler has been installed. + + In practice, this occurs if CTrapCleanup::New() has not been called + before using the cleanup stack. + */ + EClnNoTrapHandlerInstalled=69, + + + /** + This panic is raised as a result of a call to the versions of the + Pop() and PopAndDestroy() static member functions of the CleanupStack class + which take an explicit count of the items to be popped. + + The panic is caused by passing a negative value for the number of items + to be popped. + */ + EClnPopCountNegative=70, + + + /** + This panic is raised when TRAPs have been nested and an attempt is made to + exit from a TRAP nest level before all the cleanup items belonging to that + level have been popped off the cleanup stack. + */ + EClnLevelNotEmpty=71, + + + /** + This panic is raised by the constructor of the circular buffer base class, + a CCirBufBase, when the size value passed is zero or negative. + */ + ECircItemSizeNegativeOrZero=72, + + + /** + This panic is raised by a call to the SetLengthL() member function of + the circular buffer base class, a CCirBufBase, by passing a length + value which is zero or negative. + */ + ECircSetLengthNegativeOrZero=73, + + + /** + This panic is raised by a call to the Add() member function of a + circular buffer, a CCirBuf when the pointer to the item + to be added is NULL. + */ + ECircNoBufferAllocated=74, + + + /** + This panic is raised by a call to the Add() member function of a + circular buffer, a CCirBuf when the number of items to be added + is zero or negative. + */ + ECircAddCountNegative=75, + + + /** + This panic is raised by a call to the Remove() member function of + a circular buffer, a CCirBuf when the number of items to be removed is zero + or negative. + */ + ECircRemoveCountNegative=76, + + + /** + This panic is raise by CConsoleBase::Getch() when the asynchronous request + that fetches the character completes with a completion code that + is not KErrNone. + */ + EConsGetchFailed=77, + + + /** + Not used. + */ + ESecurityData=78, + + + /** + This panic is raised by the Alloc() member function + of CBitMapAllocator if the object is in an inconsistnt state. + */ + EBmaInconsistentState=79, + + + /** + This panic is raised by the AllocFrom() member function + of CBitMapAllocator if the position passed into it is outside its valid + range, i.e. is negative or is greater than or equal to the size. + */ + EBmaAllocFromOutOfRange=80, + + + /** + This panic is raised by the Alloc() member function + of CBitMapAllocator if the count value passed into it + is not positive. + */ + EBmaAllocCountNegative=81, + + + /** + This panic is raised by the AllocAligned() member function + of CBitMapAllocator if the alignment value passed into it + is negative or greater than or equal to 32. + */ + EBmaAllAlgnOutOfRange=82, + + + /** + This panic is raised by the AllocAlignedBlock() member function + of CBitMapAllocator if the alignment value passed into it + is negative or greater than or equal to 32. + */ + EBmaAllAlgnBOutOfRange=83, + + + /** + This panic is raised by the AllocAt() member function + of CBitMapAllocator if the position value passed into it + is outside the permitted range. + */ + EBmaAllocBlkOutOfRange=84, + + + /** + This panic is raised by the IsFree() member function + of CBitMapAllocator if the position value passed into it + is outside the permitted range. + */ + EBmaChkBlkOutOfRange=85, + + + /** + This panic is raised by the Free() member function + of CBitMapAllocator if the position value passed into it + is outside the permitted range. + */ + EBmaFreeBlkOutOfRange=86, + + + /** + This panic is raised by the Free() member function + of CBitMapAllocator if attempting to free a block that is not allocated. + */ + EBmaFreeBlkNotAllocated=87, + + + /** + This panic is raised by the Free() member function + of CBitMapAllocator if attempting to allocate a block that is not free. + */ + EBmaAllocBlkNotFree=88, + + + /** + This panic is raised by call to the Replace() member function of + CActiveScheduler when the replacement active scheduler is the same as + the existing active scheduler. + */ + EActiveSchedulerReplacingSelf=89, + + + /** + The panic is raised as a result of a call to the Pop() and PopAndDestroy() + static member functions of the CleanupStack class. + + The panic occurs when an the item to be popped is not the expected item. + */ + EClnCheckFailed=90, + + + /** + This panic is raised by CActiveSchedulerWait::Start() + when the CActiveSchedulerWait has already been started. + + @see CActiveSchedulerWait + */ + EActiveSchedulerWaitAlreadyStarted=91, + + + /** + This panic is raised by CActiveSchedulerWait::AsyncStop() and + CActiveSchedulerWait::CanStopNow() + when the CActiveSchedulerWait has not been started. + */ + EActiveSchedulerWaitNotStarted=92, + + + /** + This panic is raised during construction of a CAsyncOneShot if the attempt + to open a handle to the current thread fails. + */ + EAsyncOneShotSetupFailed=93, + + + /** + Not used. + */ + ESvrBadSecurityPolicy=94, + + + /** + This panic is raised if CPolicyServer::CustomSecurityCheckL(), + or CPolicyServer::CustomFailureActionL() are called. + + Odds are that you forgot to implement one of these two functions in your + CPolicyServer derived Server. + */ + EPolSvrCallingBaseImplementation=95, + + + /** + This panic is raised in debug builds by the CPolicyServer constructor if + TPolicy::iRanges[0] does not have a value of 0. + */ + EPolSvr1stRangeNotZero=96, + + + /** + This panic is raised in debug builds by the CPolicyServer constructor if + each element of TPolicy::iRanges is not greater than the previous. + */ + EPolSvrRangesNotIncreasing=97, + + + /** + This panic is raised in debug builds by the CPolicyServer constructor + unless every element in TPolicy::iElementsIndex is valid. Every element, + x, must not be one of (ESpecialCaseHardLimit <= x <= ESpecialCaseLimit) in + order to be valid. See CPolicyServer::TSpecialCase for more information. + */ + EPolSvrElementsIndexValueInvalid=98, + + + /** + This panic is raised in debug builds by the CPolicyServer constructor if + TPolicy::iOnConnect has an invalid value. iOnConnect must not be one of + (ESpecialCaseHardLimit <= x <= ESpecialCaseLimit) in order to be valid. + See CPolicyServer::TSpecialCase for more information. + */ + EPolSvrIOnConnectValueInvalid=99, + + + /** + This panic is raised if CPolicyServer::iPolicy is found to be invalid for + an unkown reason. There is a good chance that your policy would cause the + server to panic with one of the above specific policy panic codes if you + run it in debug mode. See the policy server documentation for a + description of a valid policy. + */ + EPolSvrPolicyInvalid=100, + + + /** + The value returned from CustomSecurityCheckL or CustomFailureActionL was + invalid. See CPolicyServer::TCustomResult for a list of valid results. + */ + EPolSvrInvalidCustomResult=101, + + + /** + This panic is raised in debug builds by the CPolicyServer constructor if + TPolicy.iRangeCount is not greater than 0. All policies given to the + policy server must contain at least 1 policy. + */ + EPolSvrIRangeCountInvalid=102, + + + /** + This panic is raised by the policy server framework if a message fails a + policy check (custom or not) and the associated action is EPanicClient. + */ + EPolSvrActionPanicClient=103, + + /** + This panic is raised by CObjectIx class methods if inconsistent data condition occurs + It can appear in debug build only. + */ + EObjInconsistent=104, + + /** + This panic is raised as a result of a call to the Pop() and PopAndDestroy() + static member functions of the CleanupStack class. + + The panic occurs when the cleanup operation of a popped item modifies the + cleanup stack. In such a case, the function cannot guarantee that the correct + items will be popped. + */ + EClnStackModified=105, + + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32power.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32power.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,67 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32power.h +// +// + +#ifndef __E32POWER_H__ +#define __E32POWER_H__ + +#include + + + + +/** +@publishedPartner +@released + +System-wide power states +*/ +enum TPowerState + { + /** The system is fully operational; could be busy or idle */ + EPwActive, + /** The system sleeps keeping the full memory state in RAM */ + EPwStandby, + /** System is off; can go to active by rebooting only */ + EPwOff, + /** The system restarts - i.e. switches off and then back on */ + EPwRestart, + /** An integer that strictly greater of any legal power state value */ + EPwLimit, + }; + + + + +/** +@publishedPartner +@released + +User-level domain manager's interface to Kernel-level power management. +*/ +class Power + + { +public: + IMPORT_C static TInt EnableWakeupEvents(TPowerState); + IMPORT_C static void DisableWakeupEvents(); + IMPORT_C static void RequestWakeupEventNotification(TRequestStatus&); + IMPORT_C static void CancelWakeupEventNotification(); + IMPORT_C static TInt PowerDown(); + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32property.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32property.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,179 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32property.h +// +// + +#ifndef __E32PROPERTY_H__ +#define __E32PROPERTY_H__ + +#include + +/** +@publishedAll +@released + +Property category UID value reserved for System services. +*/ +static const TInt32 KUidSystemCategoryValue=0x101f75b6; + + +/** +@publishedAll +@released + +Property category UID reserved for System services +*/ +static const TUid KUidSystemCategory={KUidSystemCategoryValue}; + + +/** +@publishedAll +@released + +The lowest value for Property categories at which additional +security restrictions are applied when defining properties. + +Properties with category values above this threshold may only be defined +if the category matches the defining process's Secure ID. + +Below this threashold, properties may be defined either by processes with +a matching Secure ID, or by processes with the WriteDeviceData capability. +*/ +static const TInt32 KUidSecurityThresholdCategoryValue=0x10273357; + + +/** +@publishedAll +@released + +User side interface to Publish & Subscribe. + +The class defines a handle to a property, a single data value representing +an item of state information. Threads can publish (change) a property value +through this handle. Threads can also subscribe +(request notification of changes) to a property value through this handle; +they can also retrieve the current property value. +*/ +class RProperty : public RHandleBase + { +public: + /** + The largest supported property value, in bytes, for byte-array (binary) + types and text types. + */ + enum { KMaxPropertySize = 512 }; + /** + The largest supported property value, in bytes, for large byte-array (binary) + types and large text types. + */ + enum { KMaxLargePropertySize = 65535 }; + + + /** + Property type attribute. + */ + enum TType + { + /** + Integral property type. + */ + EInt, + + + /** + Byte-array (binary data) property type. + This type provides real-time guarantees but is limited to a maximum size + of 512 bytes. + + @see KMaxPropertySize + */ + EByteArray, + + + /** + Text property type. + This is just a programmer friendly view of a byte-array property, and + is implemented in the same way as EByteArray. + */ + EText = EByteArray, + + + /** + Large byte-array (binary data) property type. + This type provides no real-time guarantees but supports properties + of up to 65536 bytes. + + @see KMaxLargePropertySize + */ + ELargeByteArray, + + + /** + Large text property type. + This is just a programmer friendly view of a byte-array property, and + is implemented in the same way as EByteArray. + */ + ELargeText = ELargeByteArray, + + + /** + Upper limit for TType values. + It is the maximal legal TType value plus 1. + */ + ETypeLimit, + + + /** + Bitmask for TType values coded within TInt attributes. + */ + ETypeMask = 0xff + }; + + +public: + IMPORT_C static TInt Define(TUid aCategory, TUint aKey, TInt aAttr, TInt aPreallocate=0); + IMPORT_C static TInt Define(TUid aCategory, TUint aKey, TInt aAttr, const TSecurityPolicy& aReadPolicy, const TSecurityPolicy& aWritePolicy, TInt aPreallocated=0); + IMPORT_C static TInt Define(TUint aKey, TInt aAttr, const TSecurityPolicy& aReadPolicy, const TSecurityPolicy& aWritePolicy, TInt aPreallocated=0); + IMPORT_C static TInt Delete(TUid aCategory, TUint aKey); + IMPORT_C static TInt Delete(TUint aKey); + IMPORT_C static TInt Get(TUid aCategory, TUint aKey, TInt& aValue); + IMPORT_C static TInt Get(TUid aCategory, TUint aKey, TDes8& aValue); +#ifndef __KERNEL_MODE__ + IMPORT_C static TInt Get(TUid aCategory, TUint aKey, TDes16& aValue); +#endif + IMPORT_C static TInt Set(TUid aCategory, TUint aKey, TInt aValue); + IMPORT_C static TInt Set(TUid aCategory, TUint aKey, const TDesC8& aValue); +#ifndef __KERNEL_MODE__ + IMPORT_C static TInt Set(TUid aCategory, TUint aKey, const TDesC16& aValue); +#endif + + IMPORT_C TInt Attach(TUid aCategory, TUint aKey, TOwnerType aType = EOwnerProcess); + + IMPORT_C void Subscribe(TRequestStatus& aRequest); + IMPORT_C void Cancel(); + + IMPORT_C TInt Get(TInt& aValue); + IMPORT_C TInt Get(TDes8& aValue); +#ifndef __KERNEL_MODE__ + IMPORT_C TInt Get(TDes16& aValue); +#endif + IMPORT_C TInt Set(TInt aValue); + IMPORT_C TInt Set(const TDesC8& aValue); +#ifndef __KERNEL_MODE__ + IMPORT_C TInt Set(const TDesC16& aValue); +#endif + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32rom.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32rom.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1275 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32rom.h +// +// + +#ifndef __E32ROM_H__ +#define __E32ROM_H__ +#include +#include + +// + +#ifndef __SECURITY_INFO_DEFINED__ +#define __SECURITY_INFO_DEFINED__ +/** +@internalTechnology +*/ +//This struct must be identical in size and offset to the one in e32cmn.h +//Functions need not be duplicated. But must be same structurally. +struct SCapabilitySet + { + enum {ENCapW=2}; + TUint32 iCaps[ENCapW]; + inline const TUint32& operator[] (TInt aIndex) const { return iCaps[aIndex]; } + inline TUint32& operator[] (TInt aIndex) { return iCaps[aIndex]; } + }; + +/** +@internalTechnology +*/ +//This struct must be identical in size and offset to the one in e32cmn.h +//Functions need not be duplicated. But must be same structurally. +struct SSecurityInfo + { + TUint32 iSecureId; + TUint32 iVendorId; + SCapabilitySet iCaps; + }; +#endif + +/** +@internalTechnology +@prototype +*/ +struct SDemandPagingConfig + { + TUint16 iMinPages; + TUint16 iMaxPages; + TUint16 iYoungOldRatio; + TUint16 iSpare[3]; + }; + +/** +@internalTechnology +@prototype +*/ +struct SRomPageInfo + { + enum TAttributes + { + EPageable = 1<<0 + }; + enum TCompression + { + ENoCompression, + EBytePair, + }; + TUint32 iDataStart; + TUint16 iDataSize; + TUint8 iCompressionType; + TUint8 iPagingAttributes; + }; + +/** +@publishedPartner +@released + +Defines the size of the header for a ROM image. + +@see TRomHeader +*/ +const TUint KRomHeaderSize=0x200; +// + + +/** +@publishedPartner +@released + +The format of the header for a ROM image. + +This is retained as part of the ROM image. +It is generated by the rombuild tool, and is used by the Bootstrap and +the kernel. +*/ +class TRomHeader + { +public: + enum { KDefaultDebugPort = -1 }; + enum { KNumTraceMask = 8 }; // this is also defined in e23const.h + +__ASSERT_COMPILE(KNumTraceMask==KNumTraceMaskWords); + +public: + /** + Reserved for a small amount of Bootstrap code, if required. + The first 4 bytes of the binary image typically contains + a branch instruction which jumps to code at offset 0x100. + */ + TUint8 iJump[124]; + + + /** + The restart vector. + */ + TLinAddr iRestartVector; + + + /** + The date and time that the ROM image was built, in microseconds. + */ + TInt64 iTime; + + + /** + The high order 32 bits of the ROM image build date & time. + */ + TUint32 iTimeHi; + + + /** + The virtual address of the base of the ROM. + */ + TLinAddr iRomBase; + + + /** + The size of the ROM image, in bytes. + + This includes the second section for sectioned ROMs. + */ + TUint32 iRomSize; + + + /** + The virtual address of the TRomRootDirectoryList structure. + + @see TRomRootDirectoryList + */ + TLinAddr iRomRootDirectoryList; + + + /** + The virtual address of kernel data, when in RAM. + */ + TLinAddr iKernDataAddress; + + + /** + The virtual address of the top of the kernel region, when in RAM. + */ + TLinAddr iKernelLimit; + + + /** + The virtual address of the primarys ROM file image header. + + @see TRomImageHeader + */ + TLinAddr iPrimaryFile; + + + /** + The virtual address of the secondarys ROM file image header. + + @see TRomImageHeader + */ + TLinAddr iSecondaryFile; + + + /** + A computed constant that causes the 32-bit checksum of the image to equal + the value specified by the "romchecksum" keyword. + */ + TUint iCheckSum; + + + /** + A unique number identifying the hardware for which this ROM image + has been built. + + Note that this is only used for testing purposes. + */ + TUint32 iHardware; + + + /** + A bitmask identifying which of the languages are supported by the ROM image, + as specified by the "languages" keyword. + + Note that this is only used for testing purposes. + */ + TInt64 iLanguage; + + + /** + Contains the flags that define the security options in force. + + @see TKernelConfigFlags + */ + TUint32 iKernelConfigFlags; + + /** + The virtual address of the TRomExceptionSearchTable structure. + + @see TRomExceptionSearchTable + */ + TLinAddr iRomExceptionSearchTable; + + /** + Current size of ROM header (Previously iUnused3) + If value is 0x69966996 then header size = 0x100 + */ + TUint32 iRomHeaderSize; + + + /** + The virtual address of the ROM section header, if the ROM is sectioned. + + @see TRomSectionHeader + */ + TLinAddr iRomSectionHeader; + + + /** + The total supervisor data size, i.e. the amount of memory mapped for + the kernel data chunk. + */ + TInt iTotalSvDataSize; + + + /** + The virtual address of the TRomEntry for the Variant file. + + @see TRomEntry + */ + TLinAddr iVariantFile; + + + /** + The virtual address of TRomEntry for the first extension file, if it exists. + + If there is more than one extension, then the next extension field in + the extensions TRomImageHeader points to the TRomEntry for + that next extension. + + @see TRomImageHeader::iNextExtension + @see TRomImageHeader + @see TRomEntry + */ + TLinAddr iExtensionFile; + + + /** + The virtual adress of the first area to be relocated into RAM, as defined + using the "area" keyword. + */ + TLinAddr iRelocInfo; + + + /** + The old position of the kernel trace mask, see iTraceMask below + */ + TUint32 iOldTraceMask; // The old location of the kernel tracemask + + + /** + The virtual address of the user data area. + */ + TLinAddr iUserDataAddress; // non-MMU stuff + + + /** + The total size of the user data. + */ + TInt iTotalUserDataSize; // non-MMU stuff + + + /** + A value that is interpreted by the Bootstrap and kernel as the debug port + to be used. + */ + TUint32 iDebugPort; // semantic is ASSP-specific + + + /** + The ROM version number. + */ + TVersion iVersion; + + + /** + The type of compression used for the image. + + This is a UID, or 0 if there is no compression. + */ + TUint32 iCompressionType; // compression type used + + + /** + The size of the image after compression. + */ + TUint32 iCompressedSize; // Size after compression + + + /** + The size of the image before compression. + */ + TUint32 iUncompressedSize; // Size before compression + + + /** + */ + TUint32 iDisabledCapabilities[2]; // 2==SSecurityInfo::ENCapW + + + /** + The initial value for the kernel trace masks. + */ + TUint32 iTraceMask[KNumTraceMask]; // The kernel debug trace masks + + /** + Initial values for fast-trace filter. + */ + TUint32 iInitialBTraceFilter[8]; + + /** + Initial value for size of fast-trace buffer. + */ + TInt iInitialBTraceBuffer; + + /** + Initial value for size of fast-trace mode. + */ + TInt iInitialBTraceMode; + + /** + Offset, in bytes from ROM start, for the start of the pageable ROM area. + @internalTechnology + @prototype + */ + TInt iPageableRomStart; + + /** + Size, in bytes , of the pageable ROM area. + @internalTechnology + @prototype + */ + TInt iPageableRomSize; + + /** + Offset, in bytes from ROM start, for the page index. (Array of SRomPageInfo objects.) + @internalTechnology + @prototype + */ + TInt iRomPageIndex; + + /** + @internalTechnology + @prototype + */ + SDemandPagingConfig iDemandPagingConfig; + + /** + Offset, in bytes from ROM start, for the start of compressed un-paged ROM area + @internalTechnology + @prototype + */ + TUint32 iCompressedUnpagedStart; + + + /** + Size, in bytes of the un-paged part of image after compression. + @internalTechnology + @prototype + */ + TUint32 iUnpagedCompressedSize; + + + /** + Size, in bytes of the un-paged part of image before compression. + @internalTechnology + @prototype + */ + TUint32 iUnpagedUncompressedSize; + + /** + @internalComponent + */ + TUint32 iSpare[37]; // spare : force size to be correct + + }; + +__ASSERT_COMPILE(sizeof(TRomHeader)==KRomHeaderSize); +__ASSERT_COMPILE(SCapabilitySet::ENCapW==2); // TRomHeader::iDisabledCapabilities has hard coded 2 because h2inc.pl does not parse scoped identifiers + + + + +/** +@publishedPartner +@released + +Contains information about a root directory. + +A variable number of these are contained in a TRomRootDirectoryList structure. + +@see TRomRootDirectoryList +*/ +class TRootDirInfo + { +public: + /** + The hardware variant for this root directory entry. + */ + TUint iHardwareVariant; + + + /** + The virtual address of the root directory. + + @see TRomDir + */ + TLinAddr iAddressLin; + }; + + + + +/** +@publishedPartner +@released + +A structure that allows you to find the root directories for each hardware +Variant supported by the ROM. + +Usually, there is only one Variant and one root directory. However, a ROM can +have multiple root directories and directory trees, one for each hardware Variant +supported by the ROM. This ensures that the file server only sees the files +that are relevant to the hardware on which it is running. In this case, there +are multiple entries in the table describing each root directory. +*/ +class TRomRootDirectoryList + { +public: + /** + The number of root directory entries. + */ + TInt iNumRootDirs; + + + /** + The root directory entries. + + The number of entries is defined by iNumRootDirs. + */ + TRootDirInfo iRootDir[1]; + }; + + + + +/** +@publishedPartner +@released + +The format of a ROM section header. +*/ +class TRomSectionHeader + { +public: + + /** + The ROM version number. + */ + TVersion iVersion; + + + /** + A computed constant that causes the 32-bit checksum of the upper + section to equal zero. + + Upper sections checksum to zero so that the overall ROM checksum in + the TRomHeader is unaffected by changes to this section. + + @see TRomHeader + */ + TUint iCheckSum; + + + /** + The date and time that the ROM image was built, in microseconds. + */ + TInt64 iTime; + + + /** + A bitmask identifying which of the languages are supported by the ROM image, + as specified by the "languages" keyword. + */ + TInt64 iLanguage; + }; +// + + + + +/** +@publishedPartner +@released + +A structure that describes a file or a directory. +*/ +class TRomEntry + { +public: + + + /** + The size of the file. + */ + TInt iSize; + + + /** + The virtual address of the file, or of a TRomDir structure if this entry + describes another directory. + + @see TRomDir + */ + TUint32 iAddressLin; + + + /** + Attributes. + */ + TUint8 iAtt; + + + /** + The length of the file or directory name. + */ + TUint8 iNameLength; + + + /** + A variable length field containing the file or directory name. + */ + TUint8 iName[2]; + }; + + + + +/** +@publishedPartner +@released + +The size of the fixed part of a TRomEntry structure. +*/ +const TInt KRomEntrySize=(sizeof(TRomEntry)-2); + + + + +// +class TRomDirSortInfo; + +/** +@publishedPartner +@released + +A structure that describes the first part of a ROM directory. + +This part of a ROM directory is a sequence of variable length entries, +each describing a file or a subdirectory, in the order that the members +were specified in the original obey file; the variable length entries are +the TRomEntry structures that follow the iSize member. + +This part of the ROM directory is followed by a structure defined +by TRomDirSortInfo, which contains a pair of sorted tables suitable for +a binary search. + +@see TRomDirSortInfo +*/ +class TRomDir + { +public: + inline const TRomDirSortInfo* SortInfo() const; + inline const TRomEntry* SortedEntry(TInt aIndex) const; + inline TInt SubDirCount() const; + inline TInt FileCount() const; + inline TInt EntryCount() const; + TInt BinarySearch(const TDesC& aName, TInt aLengthLimit, TInt aMode, TBool aDir) const; + const TRomDir* FindLeafDir(const TDesC& aPath) const; +public: + + /** + The number of bytes occupied by the set of TRomEntry structures + that follow this field. + + @see TRomDir::iEntry + */ + TInt iSize; + + + /** + A variable number of entries, each of which describes a file or a directory. + + Each entry is 4-byte aligned, and may have padding to ensure that the entry + is 4-bye aligned. + */ + TRomEntry iEntry; + }; + + + + +/** +@publishedPartner +@released + +A structure that describes the second part of a ROM directory. + +It contains a pair of sorted tables suitable for +a binary search. The sorted tables contain unsigned 16-bit scaled offsets, +which point to the start of the corresponding TRomEntry in the TRomDir. + +@see TRomDir +*/ +class TRomDirSortInfo + { +public: + + /** + The number of subdirectories in this directory. + */ + TUint16 iSubDirCount; // number of subdirectories in this directory + + + /** + The number of files in this directory. + */ + TUint16 iFileCount; // number of non-directory files in this directory + + + /** + The two sorted tables: + + 1. First one is a table of 16-bit scaled offsets to the directory entries. + + 2. Second one is a table of 16-bit scaled ofsets to the file entries. + This table starts at offset 2*iSubDirCount from the start of the first table. + + If the offset is X, then the corresponding TRomEntry is at address: + @code + 4*X +(char*)address of the first TRomEntry + @endcode + For example, the first entry is at offset zero. + + The entries are sorted in the order of the UTF-8 representation of + the names in a case insensitive way (compare the C function stricmp()). + In effect, this folds upper and lowercase ASCII characters but leaves all + other Unicode characters unchanged. + */ + TUint16 iEntryOffset[1]; // offsets of each entry from TRomDir::iEntry; extend + // order of offsets is directories first, then files, lexicographic order within each group + }; + + +/** +Gets a pointer to the start of the second part of the ROM directory, +as described by the TRomDirSortInfo structure. + +@return The pointer to the start of the second part of the ROM directory. +*/ +inline const TRomDirSortInfo* TRomDir::SortInfo() const + { return (const TRomDirSortInfo*)( ((TLinAddr)&iEntry) + ( (iSize+sizeof(TUint32)-1) &~ (sizeof(TUint32)-1) )); } + + + + +/** +Gets the TRomEntry corresponding to the file or directory located at +the specified index position within the sorted tables. + +@param aIndex The index of the entry within the sorted tables. + Note that for the purpose of this function, the two tables + are treated as one single table. + +@return The required TRomEntry +*/ +inline const TRomEntry* TRomDir::SortedEntry(TInt aIndex) const + { + const TRomDirSortInfo* s = SortInfo(); + return (const TRomEntry*)(((TLinAddr)&iEntry) + s->iEntryOffset[aIndex] * sizeof(TUint32)); + } + + + + +/** +Gets the number of subdirectories in the directory. + +@return The number of subdirectories. +*/ +inline TInt TRomDir::SubDirCount() const + { return SortInfo()->iSubDirCount; } + + + + +/** +Gets the number of files in the directory. + +@return The number of files. +*/ +inline TInt TRomDir::FileCount() const + { return SortInfo()->iFileCount; } + + + + +/** +Gets the total number of files and subdirectories in the directory. + +@return The total number of files and subdirectories. +*/ +inline TInt TRomDir::EntryCount() const + { + const TRomDirSortInfo* s = SortInfo(); + return s->iSubDirCount + s->iFileCount; + } + + + + +// +// Header of ROM image files under the new scheme. (dlls & exes) +// +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagPrimary =0x80000000u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagVariant =0x40000000u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagExtension =0x20000000u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagDevice =0x10000000u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagsKernelMask =0xf0000000u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagSecondary =0x08000000u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagData =0x04000000u; // image has data and is not extension or variant + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagDataInit =0x02000000u; // image or non-EXE dependencies would require data initialisation + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagDataPresent =0x01000000u; // image or any dependencies have data + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagExeInTree =0x00800000u; // image depends on EXE + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagDll =0x00000001u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageFlagFixedAddressExe =0x00000004u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageABIMask =0x00000018u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageABI_GCC98r2 =0x00000000u; // for ARM + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageABI_EABI =0x00000008u; // for ARM + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageEptMask =0x000000e0u; // entry point type + +/** +@publishedPartner +@released +*/ +const TInt KRomImageEptShift =5; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageEpt_Eka1 =0x00000000u; + +/** +@publishedPartner +@released +*/ +const TUint32 KRomImageEpt_Eka2 =0x00000020u; + +/** +@internalTechnology +@released +*/ +const TUint KRomImageFlagUnpaged =0x00000100u; + + +/** +@internalTechnology +@released +*/ +const TUint KRomImageFlagPaged =0x00000200u; + + +/** +@internalTechnology +@released +Flag to indicate when named symbol export data present in image +*/ +const TUint KRomImageNmdExpData =0x00000400u; + +/** +@internalTechnology +@released +Flag to indicate debuggability of this image. +*/ +const TUint KRomImageDebuggable =0x00000800u; + +class TDllRefTable; + +/** +@publishedPartner +@released + +The format of the header for a ROM file image. + +The structure of a file image is based on the native image file format, +but this can be compressed in the ROM image, as the relocation information +and the .idata section are discarded once the file is fixed up. + +The Import Address Table (IAT) is also removed and each reference to +an IAT entry is converted into a reference to the associated Export Directory +entry in the corresponding DLL. + +ROM file images have the following sections: + +@code +The header (as described by this structure) +.text - code +.rdata - constant (read-only) data +.edata - the export directory +.data - initialised data that is copied to RAM when the executable runs. +The DLL reference table (a TDllRefTable structure), which is a list of DLLs +used by the executable. +@endcode + +@see TRomImageHeader::iDllRefTable +@see TDllRefTable +*/ +class TRomImageHeader + { +public: + + /** + The UID1 for the file. + + @see TUidType + */ + TUint32 iUid1; + + + /** + The UID2 for the file. + + @see TUidType + */ + TUint32 iUid2; + + + /** + The UID3 for the file. + + @see TUidType + */ + TUint32 iUid3; + + + /** + The checksum of the UIDs + */ + TUint32 iUidChecksum; + + + /** + The entrypoint of this executable, i.e. the offset within this file. + */ + TUint32 iEntryPoint; + + + /** + This executables code address. + */ + TUint32 iCodeAddress; + + + /** + This executables data address. + */ + TUint32 iDataAddress; + + + /** + The size of the code. + + This includes the size of the constant data. + */ + TInt iCodeSize; + + + /** + The size of the executable code. + + This is the value of (iCodeSize - the size of the constant data). + */ + TInt iTextSize; + + + /** + The data size. + */ + TInt iDataSize; + + + /** + The size of the .bss (the zero-filled data) + */ + TInt iBssSize; + + + /** + The minimum size of the heap. + */ + TInt iHeapSizeMin; + + + /** + The maximum size of the heap. + */ + TInt iHeapSizeMax; + + + /** + The size of the stack. + */ + TInt iStackSize; + + + /** + The address of the DLL reference table. + + @see TDllRefTable + */ + TDllRefTable* iDllRefTable; + + + /** + The number of functions exported by this executable. + */ + TInt iExportDirCount; + + + /** + The address of the export directory, which is a simple list of functions + that can be indexed by ordinal. + */ + TUint32 iExportDir; + + + /** + Security information, details of which are internal to Symbian. + */ + SSecurityInfo iS; + + + /** + The version number of the tools used to generate this file image. + */ + TVersion iToolsVersion; + + + /** + Flags field. + */ + TUint32 iFlags; + + + /** + The priority of the process. + */ + TProcessPriority iPriority; + + + /** + The virtual base address of the data and .bss, where the process expects + its data chunk to be when it runs. + */ + TUint32 iDataBssLinearBase; + + + /** + The address of the TRomEntry for the next extension file. + + This field is only used if there is more than one extension. + The first extension is found using the TRomHeader. + + @see TRomEntry + @see TRomHeader + */ + TLinAddr iNextExtension; + + + /** + A number denoting the hardware Variant. + + It is used to determine whether this executable can run + on a given system. + */ + TUint32 iHardwareVariant; + + + /** + The total data size, including space reserved for DLLs + */ + TInt iTotalDataSize; // data+bss + space reserved for DLLs + + + /** + The module version. + */ + TUint32 iModuleVersion; + + /** + The address of the Exception Descriptor if present. + 0 if no Exception descriptor + */ + TLinAddr iExceptionDescriptor; + }; + + + + +// +// Header for extension ROMs +// Equivalent to TRomHeader +// + +/** +@publishedPartner +@released + +The format of a ROM extension header. +*/ +class TExtensionRomHeader + { +public: + + /** + The extension ROM image version number. + */ + TVersion iVersion; + + + /** + The virtual address of the base of the extension ROM. + */ + TLinAddr iRomBase; + + + /** + The size of the extension ROM image. + */ + TUint32 iRomSize; + + + /** + The virtual address of the TRomRootDirList structure for + the combined kernel+extension ROM image. + + @see TRomRootDirList + */ + TLinAddr iRomRootDirectoryList; + + + /** + The date and time that the extension ROM image was built, in microseconds. + */ + TInt64 iTime; + + + /** + The extension ROM image checksum + */ + TUint iCheckSum; + + + // + /** + Copy of the kernel ROM image version number. + */ + TVersion iKernelVersion; + + + /** + Copy of the kernel ROM image build date & time. + */ + TInt64 iKernelTime; + + + /** + Copy of the kernel ROM image checksum. + */ + TUint iKernelCheckSum; + // + + + /** + The type of compression used for the image. + + This is a UID, or 0 if there is no compression. + */ + TUint32 iCompressionType; // compression type used + + + /** + The size of the image after compression. + */ + TUint32 iCompressedSize; // Size after compression + + + /** + The size of the image before compression. + */ + TUint32 iUncompressedSize; // Size before compression + + + /** + The virtual address of the TRomExceptionSearchTable structure. + + @see TRomExceptionSearchTable + */ + TLinAddr iRomExceptionSearchTable; + + + /** + Reserved for future use. + */ + TUint32 iPad[32-15]; // sizeof(TExtensionRomHeader)=128 + }; + + + + + +/** +@publishedPartner +@released + +A list of DLLs that an executable needs in order to run. + +Each DLL referenced in this list has a pointer to a TRomImageHeader structure +that describes that DLL. This allows the DLL loader to search +a dependency chain, and ensure that all required DLLs are loaded. + +@see TRomImageHeader +*/ +class TDllRefTable + { +public: + + /** + Flags field. + */ + TUint16 iFlags; + + + /** + The number of referenced DLLs in this list. + */ + TUint16 iNumberOfEntries; + + + /** + A set of pointers to the TRomImageHeader structures for each referenced DLL. + */ + TRomImageHeader* iEntry[1]; + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32shbuf_priv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32shbuf_priv.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,135 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/include/e32shbuf_priv.h +// Shareable Data Buffers + +/** + @file + @internalComponent + @prototype +*/ + +#ifndef E32SHBUF_PRIV_H +#define E32SHBUF_PRIV_H + + +#include + + +/** + Defines flags for TShPoolInfo. + + These values specify the behaviour of the pool and its buffers. + + @internalComponent + @prototype +*/ +enum TShPoolCreateFlags + { + /** + The buffers in this pool are at least the size of an MMU page, + are aligned to an MMU page, and may be mapped in and out of a process's + address space independently. + */ + EShPoolPageAlignedBuffer = 0x0001, + + /** + The buffers in this pool do not have any size or alignment restrictions beyond + that specified by the pool creator. + + The whole pool is always mapped into a process's address space. + */ + EShPoolNonPageAlignedBuffer = 0x0002, + + /** + This pool maps onto device memory, not system RAM. + */ + EShPoolPhysicalMemoryPool = 0x0004, + + /** + The physical memory backing this pool is contiguous. + */ + EShPoolContiguous = 0x0008, + + /** + Each buffer will only ever be mapped into one process's address space at a time. + + Requires EShPoolPageAlignedBuffer. + */ + EShPoolExclusiveAccess = 0x0010, + + /** + An unmapped page will be placed between each buffer. + + Requires EShPoolPageAlignedBuffer. + */ + EShPoolGuardPages = 0x0020, + + /** + Set by automatic shrinking when it is unable to shrink the pool despite there + being enough free buffers available (usually due to fragmentation). This prevents + the automatic shrinking code being continually called when it can't do anything. + */ + EShPoolSuppressShrink = 0x80000000, + }; + + +/** + Specifies client flags. + + @internalComponent + @prototype +*/ +enum TShPoolClientFlags + { + /** + Buffers will be automatically mapped into this process's address space when a handle is + created for them. Having this flag clear can be useful for a process that will function + as an intermediary, without requiring access to the data in the buffers. + */ + EShPoolAutoMapBuf = 0x1000, + + /** + Newly-allocated buffers will not be mapped into this process's address space. + */ + EShPoolNoMapBuf = 0x2000, + }; + + +/** + Specifies the type of notification. (A real enumeration, not bit flags.) + + @internalComponent + @prototype +*/ +enum TShPoolNotifyType + { + EShPoolLowSpace = 1, // notifies when free buffers drop to a certain number + EShPoolFreeSpace = 2, // notifies when free buffers rise to a certain number + }; + +/** + Structure for passing base address and pointer of buffer + + @internalComponent + @prototype +*/ +struct SShBufBaseAndSize + { + TLinAddr iBase; + TUint iSize; + }; + + +#endif // E32SHBUF_PRIV_H diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32shbufcmn.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32shbufcmn.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,176 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32/include/e32shbufcmn.h +// Shareable Data Buffers + +/** + @file + @publishedPartner + @prototype +*/ + +#ifndef E32SHBUFCMN_H +#define E32SHBUFCMN_H + +#include +#include + +/** + Defines values used to modify client behaviour when opening a pool or buffer in a new process. + + @publishedPartner + @prototype +*/ +enum TShPoolHandleFlags + { + /** + The buffers will be writeable in the process where this handle is used. + If not set, the buffers will be read-only. + */ + EShPoolWriteable = 0x0001, + + /** + The process will be able to allocate buffers from this pool. + If not set, the process will not be able to allocate buffers from this pool. + */ + EShPoolAllocate = 0x0002, + }; + + +/** + Defines flags for RShBuf::Alloc() and DShPool::Alloc(). + + @see RShBuf::Alloc() + @see DShPool::Alloc() + + @publishedPartner + @prototype +*/ +enum TShPoolAllocFlags + { + /** + The thread is willing to wait for a pool grow if no buffer is immediately available. + If this is not set, the Alloc() will return immediately if no free buffer is available, + but the pool might be able to grow to create new buffers. + */ + EShPoolAllocCanWait = 0x0001, + + /** + Do not automatically map the newly-allocated buffer into this process, if the pool is page-aligned. + (RShBuf::Alloc() only.) + */ + EShPoolAllocNoMap = 0x0002, + }; + + +/** + Defines the attributes of a pool. + + @publishedPartner + @prototype +*/ +class TShPoolInfo + { +public: + IMPORT_C TShPoolInfo(); + + /** + Specifies the size of each buffer in the pool. + */ + TUint iBufSize; + + /** + Specifies the initial number of buffers to be allocated to the pool. + */ + TUint iInitialBufs; + + /** + Specifies the maximum number of buffers the pool can grow to. + */ + TUint iMaxBufs; + + /** + This specifies when the pool grows. If zero, the pool will not grow or shrink + automatically. + + This is the proportion of free buffers left in the pool at which it should be grown. + For example, if the ratio is 0.1, the pool will be grown when the number of free + buffers drops to 10%. + + This value is expressed as a 32-bit fixed-point number, where the binary + point is defined to be between bits 7 and 8 (where the least-significant + bit is defined as bit 0). (This format is also known as a Q8, or fx24.8 + number, or alternatively as the value * 256.) For the example given of 10%, + use the value 26. It represents a value < 1 (i.e. must be < 256). Calculations + are rounded down towards zero, but if calculating how many buffers to trigger + on gives 0, the grow will be triggered when 1 buffer is free. + */ + TUint iGrowTriggerRatio; + + /** + This specifies the proportion by which to grow the pool each time it is grown. + If zero, the pool will not grow or shrink automatically. + + It is expressed as a 32-bit fx24.8 fixed-point number, in the same way as + iGrowTriggerRatio. Calculations are rounded down towards zero, but if calculating + how many buffers to grow by yields 0, then the pool will be grown by 1 buffer. + */ + TUint iGrowByRatio; + + /** + The hysteresis value to ensure that the pool does not automatically shrink + immediately after is grows. + + Automatic shrinking will only happen when there are (iGrowTriggerRatio + + iGrowByRatio) * iShrinkHysteresisRatio * (total buffers in the pool) free + buffers left in the pool. + + The amount by which the pool is shrunk depends on iGrowByRatio: it is the operational + inverse, such that the pool would shrink down to the same number of buffers if shrunk + immediately after growing (although hysteresis normally prevents this). + + For example, if iGrowByRatio is 10%, a pool of 100 buffers would grow to 110 buffers. + To shrink back to 100, a shrink ratio of 10/110 = 9% is required. That is, if the + grow-by ration is G, the shrink-by ratio S is calculated as S = 1 - 1 / (1 + G). + + iShrinkHysteresisRatio is a 32-bit fx24.8 fixed-point number in the same way as + iGrowTriggerRatio and iGrowByRatio. It represents a value > 1 (i.e. must be > 256). + + @see iGrowByRatio + */ + TUint iShrinkHysteresisRatio; + + /** + Specifies the alignment for each buffer, as a shift count (log2 bytes). + + For example, 9 means that each buffer is aligned on a 512-byte boundary. + */ + TUint iAlignment; + + /** + Specifies flags for the pool, as bit values from TShPoolCreateFlags or-ed together. + + @see TShPoolCreateFlags + */ + TUint iFlags; +private: + TInt iSpare1; // Reserved for future use + TInt iSpare2; + TInt iSpare3; + TInt iSpare4; + }; + + +#endif // E32SHBUF_H + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32std.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32std.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,5060 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32std.h +// +// + +#ifndef __E32STD_H__ +#define __E32STD_H__ + +#ifdef __KERNEL_MODE__ +#error !! Including e32std.h in kernel code !! +#endif + +#include + +/** +@publishedAll +@released +*/ +class TFunctor + { +public: + IMPORT_C virtual void operator()() =0; + }; + +/** +@publishedAll +@released + +Encapsulates a general call-back function. + +The class encapsulates: + +1. a pointer to a function which takes an argument of type TAny* and returns + a TInt. + +2. a pointer which is passed to the function every time it is called. + The pointer can point to any object. It can also be NULL. + +The callback function can be a static function of a class, +e.g. TInt X::Foo(TAny *) or it can be a function which is not a member of +any class, e.g. TInt Foo(TAny *). + +When used with the CIdle and the CPeriodic classes, the callback function +is intended to be called repeatedly; the encapsulated pointer is passed on +each call. Typically, the pointer refers to an object which records the state +of the task across each call. When used with CIdle, the callback function +should also return a true (non-zero) value if it is intended to be called +again, otherwise it should return a false (zero) value. + +@see CIdle +@see CPeriodic +*/ +class TCallBack + { +public: + inline TCallBack(); + inline TCallBack(TInt (*aFunction)(TAny* aPtr)); + inline TCallBack(TInt (*aFunction)(TAny* aPtr),TAny* aPtr); + inline TInt CallBack() const; +public: + + /** + A pointer to the callback function. + */ + TInt (*iFunction)(TAny* aPtr); + + + /** + A pointer that is passed to the callback function when + the function is called. + */ + TAny* iPtr; + }; + + + + +/** +@publishedAll +@released + +An object embedded within a class T so that objects of type T can form part +of a singly linked list. + +A link object encapsulates a pointer to the next link object in the list. + +@see TSglQue +*/ +class TSglQueLink + { +#if defined _DEBUG +public: + inline TSglQueLink() : iNext(NULL) + /** + An explicitly coded default constructor that is only defined for DEBUG builds. + + It sets the pointer to the next link object to NULL. + + @see iNext + */ + {} +#endif +private: + IMPORT_C void Enque(TSglQueLink* aLink); +public: + /** + A pointer to the next link object in the list. + */ + TSglQueLink* iNext; + friend class TSglQueBase; + }; + + + + +/** +@publishedAll +@released + +A base class that provides implementation for the link object of a doubly +linked list. + +It also encapsulates pointers both to the next and the previous link +objects in the doubly linked list. + +The class is abstract and is not intended to be instantiated. + +@see TDblQueLink +*/ +class TDblQueLinkBase + { +public: + inline TDblQueLinkBase() : iNext(NULL) + /** + Default constructor. + + It sets the pointer to the next link object to NULL. + + @see iNext + */ + {} + IMPORT_C void Enque(TDblQueLinkBase* aLink); + IMPORT_C void AddBefore(TDblQueLinkBase* aLink); +public: + /** + A pointer to the next link object in the list. + */ + TDblQueLinkBase* iNext; + + /** + A pointer to the previous link object in the list. + */ + TDblQueLinkBase* iPrev; + }; + + + + +/** +@publishedAll +@released + +An object embedded within a class T so that objects of type T can form part +of a doubly linked list. +*/ +class TDblQueLink : public TDblQueLinkBase + { +public: + IMPORT_C void Deque(); + }; + + + + +/** +@publishedAll +@released + +An object embedded within a class T so that objects of type T can form part +of an ordered doubly linked list. + +Objects are added to the doubly linked list in descending priority order. +*/ +class TPriQueLink : public TDblQueLink + { +public: + /** + The priority value. + + Objects are added to the doubly linked list in descending order of this value. + */ + TInt iPriority; + }; + + + + +/** +@publishedAll +@released + +An object embedded within a class T so that objects of type T can form part +of a delta doubly linked list. +*/ +class TDeltaQueLink : public TDblQueLinkBase + { +public: + /** + The delta value. + */ + TInt iDelta; + }; + + + + +/** +@publishedAll +@released + +An object embedded within a class T so that objects of type T can form part +of a doubly linked list sorted by tick count. +*/ +class TTickCountQueLink : public TDblQueLink + { +public: + /** + The tick count. + */ + TUint iTickCount; + }; + + + + +/** +@publishedAll +@released + +A base class that provides implementation for the singly linked list header. + +It also encapsulates the offset value of a link object. + +The class is abstract and is not intended to be instantiated. + +@see TSglQue +*/ +class TSglQueBase + { +public: + IMPORT_C TBool IsEmpty() const; + IMPORT_C void SetOffset(TInt aOffset); + IMPORT_C void Reset(); +protected: + IMPORT_C TSglQueBase(); + IMPORT_C TSglQueBase(TInt aOffset); + IMPORT_C void DoAddFirst(TAny* aPtr); + IMPORT_C void DoAddLast(TAny* aPtr); + IMPORT_C void DoRemove(TAny* aPtr); +protected: + /** + A pointer to the first element in the list. + */ + TSglQueLink* iHead; + + /** + A pointer to the last element in the list. + */ + TSglQueLink* iLast; + + /** + The offset of a component link object within elements that form the list. + */ + TInt iOffset; +private: + TSglQueBase(const TSglQueBase& aQue); + TSglQueBase &operator=(const TSglQueBase& aQue); + friend class TSglQueIterBase; + }; + + + + +/** +@publishedAll +@released + +A base class that provides implementation for the doubly linked list header. + +It also encapsulates the offset value of a link object. + +The class is abstract and is not intended to be instantiated. + +@see TDblQue +*/ +class TDblQueBase + { +public: + IMPORT_C TBool IsEmpty() const; + IMPORT_C void SetOffset(TInt aOffset); + IMPORT_C void Reset(); +protected: + IMPORT_C TDblQueBase(); + IMPORT_C TDblQueBase(TInt aOffset); + IMPORT_C void DoAddFirst(TAny* aPtr); + IMPORT_C void DoAddLast(TAny* aPtr); + IMPORT_C void DoAddPriority(TAny* aPtr); + IMPORT_C void __DbgTestEmpty() const; +protected: + /** + The head, or anchor point of the queue. + */ + TDblQueLink iHead; + + /** + The offset of a component link object within elements that form the list. + */ + TInt iOffset; +private: + TDblQueBase(const TDblQueBase& aQue); + TDblQueBase& operator=(const TDblQueBase& aQue); + friend class TDblQueIterBase; + }; + + + + +/** +@publishedAll +@released + +A base class that provides implementation for the TDeltaQue template class. + +The class is abstract and is not intended to be instantiated. + +@see TDeltaQue +*/ +class TDeltaQueBase : public TDblQueBase + { +public: + IMPORT_C TBool CountDown(); + IMPORT_C TBool CountDown(TInt aValue); + IMPORT_C TBool FirstDelta(TInt& aValue); + IMPORT_C void Reset(); +protected: + IMPORT_C TDeltaQueBase(); + IMPORT_C TDeltaQueBase(TInt aOffset); + IMPORT_C void DoAddDelta(TAny* aPtr,TInt aDelta); + IMPORT_C void DoRemove(TAny* aPtr); + IMPORT_C TAny* DoRemoveFirst(); +protected: + /** + Pointer to the delta value in the first link element. + */ + TInt* iFirstDelta; + }; + + + + +/** +@publishedAll +@released + +A templated class that provides the behaviour for managing a singly linked +list. + +It also acts as the head of the list, maintaining the pointers into the list. + +The template parameter defines the type of element that forms the singly linked +list and is the class that acts as host to the link object. + +@see TSglQueLink +*/ +template +class TSglQue : public TSglQueBase + { +public: + inline TSglQue(); + inline explicit TSglQue(TInt aOffset); + inline void AddFirst(T& aRef); + inline void AddLast(T& aRef); + inline TBool IsFirst(const T* aPtr) const; + inline TBool IsLast(const T* aPtr) const; + inline T* First() const; + inline T* Last() const; + inline void Remove(T& aRef); + }; + + + + +/** +@publishedAll +@released + +A templated class that provides the behaviour for managing a doubly linked +list. + +It also acts as the head of the list, maintaining the pointers into the list. + +The template parameter defines the type of element that forms the doubly linked +list and is the class that acts as host to the link object. + +@see TDblQueLink +*/ +template +class TDblQue : public TDblQueBase + { +public: + inline TDblQue(); + inline explicit TDblQue(TInt aOffset); + inline void AddFirst(T& aRef); + inline void AddLast(T& aRef); + inline TBool IsHead(const T* aPtr) const; + inline TBool IsFirst(const T* aPtr) const; + inline TBool IsLast(const T* aPtr) const; + inline T* First() const; + inline T* Last() const; + }; + + + + +/** +@publishedAll +@released + +A templated class that provides the behaviour for managing a doubly linked +list in which the elements are added in descending priority order. + +Priority is defined by the value of the TPriQueLink::iPriority member of +the link element. + +The template parameter defines the type of element that forms the doubly linked +list and is the class that acts as host to the link object. + +@see TPriQueLink +@see TPriQueLink::iPriority +*/ +template +class TPriQue : public TDblQueBase + { +public: + inline TPriQue(); + inline explicit TPriQue(TInt aOffset); + inline void Add(T& aRef); + inline TBool IsHead(const T* aPtr) const; + inline TBool IsFirst(const T* aPtr) const; + inline TBool IsLast(const T* aPtr) const; + inline T* First() const; + inline T* Last() const; + }; + + + + +/** +@publishedAll +@released + +A templated class that provides the behaviour for managing a doubly linked +list in which elements represent values which are increments, or deltas, on +the value represented by a preceding element. + +The list is ordered so that the head of the queue represents a nominal zero +point. + +The delta value of a new element represents its 'distance' from the nominal +zero point. The new element is added into the list, and the delta values of +adjacent elements (and of the new element, if necessary) are adjusted, so +that the sum of all deltas, up to and including the new element, is the same +as the new element's intended 'distance' from the nominal zero point. + +A common use for a list of this type is as a queue of timed events, where +the delta values represent the intervals between the events. + +The delta value is defined by the value of the TDeltaQueLink::iDelta member +of the link element. + +The template parameter defines the type of element that forms the doubly linked +list and is the class that acts as host to the link object. + +@see TDeltaQueLink +@see TDeltaQueLink::iDelta +*/ +template +class TDeltaQue : public TDeltaQueBase + { +public: + inline TDeltaQue(); + inline explicit TDeltaQue(TInt aOffset); + inline void Add(T& aRef,TInt aDelta); + inline void Remove(T& aRef); + inline T* RemoveFirst(); + }; + + + + +// Forward declaration +class TTickCountQueLink; + +/** +@internalComponent +@released + +A class that provides the behaviour for managing a doubly linked list +in which elements are added in order of the time until their tick count. + +A common use for a list of this type is as a queue of timed events, where +the tick counts are the expiry times of the events. + +The tick count is defined by the value of the TTickCountQueLink::iTickCount +member of the link element. + +@see TTickCountQueLink +@see TTickCountQueLink::iTickCount +*/ +class TTickCountQue : public TDblQueBase + { +public: + TTickCountQue(); + void Add(TTickCountQueLink& aRef); + TTickCountQueLink* First() const; + TTickCountQueLink* RemoveFirst(); + TTickCountQueLink* RemoveFirst(TUint aTickCount); + }; + + + + +/** +@publishedAll +@released + +A base class that provides implementation for the singly linked list iterator. + +It also encapsulates a pointer to the current link link list element. + +The class is abstract and is not intended to be instantiated. +*/ +class TSglQueIterBase + { +public: + IMPORT_C void SetToFirst(); +protected: + IMPORT_C TSglQueIterBase(TSglQueBase& aQue); + IMPORT_C TAny* DoPostInc(); + IMPORT_C TAny* DoCurrent(); + IMPORT_C void DoSet(TAny* aLink); +protected: + TInt iOffset; + TSglQueLink* iHead; + TSglQueLink* iNext; + }; + + + + +/** +@publishedAll +@released + +A templated class that provides the behaviour for iterating through a set of +singly linked list elements. + +The template parameter defines the type of element that forms the singly linked +list. The class defined in the template parameter contains the link object. +*/ +template +class TSglQueIter : public TSglQueIterBase + { +public: + inline TSglQueIter(TSglQueBase& aQue); + inline void Set(T& aLink); + inline operator T*(); + inline T* operator++(TInt); + }; + + + + +/** +@publishedAll +@released + +A base class that provides implementation for the doubly linked list iterator. + +It also encapsulates a pointer to the current link list element. + +The class is abstract and is not intended to be instantiated. +*/ +class TDblQueIterBase + { +public: + IMPORT_C void SetToFirst(); + IMPORT_C void SetToLast(); +protected: + IMPORT_C TDblQueIterBase(TDblQueBase& aQue); + IMPORT_C TAny* DoPostInc(); + IMPORT_C TAny* DoPostDec(); + IMPORT_C TAny* DoCurrent(); + IMPORT_C void DoSet(TAny* aLink); +protected: + /** + The offset of a component link object within elements that form the list. + */ + TInt iOffset; + + /** + Pointer to the anchor for the list. + */ + TDblQueLinkBase* iHead; + + /** + Pointer to the current element. + */ + TDblQueLinkBase* iNext; + }; + + + + +/** +@publishedAll +@released + +A templated class that provides the behaviour for iterating through a set of +doubly linked list elements. + +The template parameter defines the type of element that forms the doubly linked +list. The class defined in the template parameter contains the link object. +*/ +template +class TDblQueIter : public TDblQueIterBase + { +public: + inline TDblQueIter(TDblQueBase& aQue); + inline void Set(T& aLink); + inline operator T*(); + inline T* operator++(TInt); + inline T* operator--(TInt); + }; + + + + +/** +@publishedAll +@released + +Governs the type of comparison to be made between descriptor keys or between +text keys. + +@see TKeyArrayFix +@see TKeyArrayVar +@see TKeyArrayPak +*/ +enum TKeyCmpText + { + /** + For a Unicode build, this is the same as ECmpNormal16. + For a non-Unicode build, this is the same as ECmpNormal8. + + Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText) + allows the compiler to chose the correct variant according to the build. + */ + ECmpNormal, + + + /** + For descriptor keys, the key is assumed to be the 8 bit variant, derived + from TDesc8. A simple comparison is done between the content of the + descriptors; the data is not folded and collation rules are not applied for + the purpose of the comparison. + + For text keys, the key is assumed to be the 8 bit variant, of type TText8. + A normal comparison is done between the text data; the data is not folded + and collation rules are not applied for the purpose of the comparison. + */ + ECmpNormal8, + + + /** + For descriptor keys, the key is assumed to be the 16 bit variant, derived + from TDesc16. A simple comparison is done between the content of the + descriptors; the data is not folded and collation rules are not applied for + the purpose of the comparison. + + For text keys, the key is assumed to be the 16 bit variant, of type + TText16. A normal comparison is done between the text data; the data is + not folded and collation rules are not applied for the purpose of the + comparison. + */ + ECmpNormal16, + + + /** + For a Unicode build, this is the same as EcmpFolded16. + For a non-Unicode build, this is the same as EcmpFolded8. + + Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText) + allows the compiler to chose the correct variant according to the build. + */ + ECmpFolded, + + + /** + For descriptor keys, the key is assumed to be the 8 bit variant, + derived from TDesc8. The descriptor contents are folded for the purpose + of the comparison. + + For text keys, the key is assumed to be the 8 bit variant, of type + TText8. The text data is folded for the purpose of the comparison. + */ + ECmpFolded8, + + + /** + For descriptor keys, the key is assumed to be the 16 bit variant, + derived from TDesc16. The descriptor contents are folded for the purpose + of the comparison. + + For text keys, the key is assumed to be the 16 bit variant, of type + TText16. The text data is folded for the purpose of the comparison. + */ + ECmpFolded16, + + + /** + For a Unicode build, this is the same as EcmpCollated16. + For a non-Unicode build, this is the same as EcmpCollated8. + + Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText) + allows the compiler to chose the correct variant according to the build. + */ + ECmpCollated, + + + /** + For descriptor keys, the key is assumed to be the 8 bit variant, + derived from TDesc8. Collation rules are applied for the purpose of + the comparison. + + For text keys, the key is assumed to be the 8 bit variant, of type + TText8. Collation rules are applied for the purpose of the comparison. + */ + ECmpCollated8, + + + /** + For descriptor keys, the key is assumed to be the 16 bit variant, + derived from TDesc16. Collation rules are applied for the purpose of + the comparison. + + For text keys, the key is assumed to be the 16 bit variant, + of type TText16. Collation rules are applied for the purpose of + the comparison. + */ + ECmpCollated16 + }; + + + + +/** +@publishedAll +@released + +Governs the type of comparison to be made between numeric keys. + +@see TKeyArrayFix +@see TKeyArrayVar +@see TKeyArrayPak +*/ +enum TKeyCmpNumeric + { + /** + The key is assumed to be of type TInt8. + */ + ECmpTInt8=((ECmpCollated16+1)<<1), + + + /** + The key is assumed to be of type TInt16. + */ + ECmpTInt16, + + + /** + The key is assumed to be of type TInt32. + */ + ECmpTInt32, + + + /** + The key is assumed to be of type TInt. + */ + ECmpTInt, + + + /** + The key is assumed to be of type TUint8. + */ + ECmpTUint8, + + + /** + The key is assumed to be of type TUint16. + */ + ECmpTUint16, + + + /** + The key is assumed to be of type TUint32. + */ + ECmpTUint32, + + + /** + The key is assumed to be of type TUint. + */ + ECmpTUint, + + + /** + The key is assumed to be of type TInt64. + */ + ECmpTInt64 + }; + + + + +/** +@publishedAll +@released + +Defines the characteristics of a key used to access the elements of an array. + +The class is abstract and cannot be instantiated. A derived class must be +defined and implemented. + +The classes TKeyArrayFix, TKeyArrayVar and TKeyArrayPak, derived from TKey, +are already supplied to implement keys for the fixed length element, variable +length element and packed arrays. + +A derived class would normally be written to define the characteristics of +a key for a non standard array. + +@see TKeyArrayFix +@see TKeyArrayVar +@see TKeyArrayPak +*/ +class TKey + { +public: + inline void SetPtr(const TAny* aPtr); + IMPORT_C virtual TInt Compare(TInt aLeft,TInt aRight) const; + IMPORT_C virtual TAny* At(TInt anIndex) const; +protected: + IMPORT_C TKey(); + IMPORT_C TKey(TInt aOffset,TKeyCmpText aType); + IMPORT_C TKey(TInt aOffset,TKeyCmpText aType,TInt aLength); + IMPORT_C TKey(TInt aOffset,TKeyCmpNumeric aType); +protected: + TInt iKeyOffset; + TInt iKeyLength; + TInt iCmpType; + const TAny* iPtr; + }; + +/** +@publishedAll +@released + +Defines the basic behaviour for swapping two elements of an array. + +The class is abstract. A derived class must be defined and implemented to +use the functionality. + +A derived class can define how to swap two elements of an array. In practice, +this means providing an implementation for the virtual function Swap(). + +To support this, the derived class is also likely to need a pointer to the +array itself and suitable constructors and/or other member functions to set +such a pointer. +*/ +class TSwap + { +public: + IMPORT_C TSwap(); + IMPORT_C virtual void Swap(TInt aLeft,TInt aRight) const; + }; + + + + +/** +@publishedAll +@released + +Folds a specified character and provides functions to fold additional +characters after construction of the object. + +Folding converts the character to a form which can be used in tolerant +comparisons without control over the operations performed. Tolerant comparisons +are those which ignore character differences like case and accents. + +Note that folding is locale-independent behaviour. It is also important to +note that there can be no guarantee that folding is in any way culturally +appropriate, and should not be used for matching characters in +natural language. + +@see User::Fold +*/ +class TCharF : public TChar + { +public: + inline TCharF(TUint aChar); + inline TCharF(const TChar& aChar); + inline TCharF& operator=(TUint aChar); + inline TCharF& operator=(const TChar& aChar); + }; + + + + +/** +@publishedAll +@released + +Converts a specified character to lower case and provides functions to convert +additional characters after construction of the object. +*/ +class TCharLC : public TChar + { +public: + inline TCharLC(TUint aChar); + inline TCharLC(const TChar& aChar); + inline TCharLC& operator=(TUint aChar); + inline TCharLC& operator=(const TChar& aChar); + }; + + + + +/** +@publishedAll +@released + +Converts a specified character to upper case and provides functions to convert +additional characters after construction of the object. +*/ +class TCharUC : public TChar + { +public: + inline TCharUC(TUint aChar); + inline TCharUC(const TChar& aChar); + inline TCharUC& operator=(TUint aChar); + inline TCharUC& operator=(const TChar& aChar); + }; + + + +/** +@publishedAll +@released + +Defines the character representation of a real number type such +as a TReal or a TRealX. + +An object of this type is used by functions that convert real values to +character format, for example, the descriptor functions: +Num(), AppendNum() and Format(). + +There are three constructors for constructing a suitable object. +The data members of the class, however, are public and can be +explicitly set after construction. +*/ +class TRealFormat + { +public: + IMPORT_C TRealFormat(); + IMPORT_C TRealFormat(TInt aWidth); + IMPORT_C TRealFormat(TInt aWidth,TInt aDecimalPlaces); +public: + /** + Governs the format of the character representation of the real number. + + This is set to one of the defined format types. + + One or more of the defined format flags can subsequently be ORed into this member. + + @see KRealFormatFixed + @see KRealFormatExponent + @see KRealFormatGeneral + @see KRealFormatNoExponent + @see KRealFormatCalculator + @see KExtraSpaceForSign + @see KAllowThreeDigitExp + @see KDoNotUseTriads + @see KGeneralLimit + @see KUseSigFigs + */ + TInt iType; + + + /** + Defines the maximum number of characters required to represent the number. + */ + TInt iWidth; + + + /** + Defines either the number of characters to be used to represent the decimal + portion of the number, or the maximum number of significant digits in + the character representation of the number. + + The interpretation depends on the chosen format as defined by iType. + + @see TRealFormat::iType + */ + TInt iPlaces; + + + /** + Defines the character to be used to separate the integer portion of + a number representation from its decimal portion. + + In general, the character used for this purpose is a matter of local + convention. The TLocale::DecimalSeparator() function can supply the + desired character. + + @see TLocale + */ + TChar iPoint; + + + /** + Defines the character to be used to delimit groups of three digits in + the integer part of the number. + + In general, the character used for this purpose is a matter of local + convention. The TLocale::ThousandsSeparator() function can supply the + desired character. + + @see TLocale + */ + TChar iTriad; + + + /** + Defines the threshold number of digits above which triad separation is to + occur. A value of zero disables triad separation and no triad separation + character (i.e. the character held in iTriad) is inserted into the + resulting character representation regardless of the number of characters. + + For example, a value of 1 causes the number 1000 to be represented by the + characters "1,000" whereas a value of 4 causes the same number to be + represented by the characters "1000" (This assumes the ‘,’ triad separation + character). + + Note that no triad separation occurs if the flag KDoNotUseTriads is set in + the iType data member. + + @see TRealFormat::iTriad + @see KDoNotUseTriads + */ + TInt iTriLen; + }; + + + + +/** +@publishedAll +@released + +Defines the extraction mark used by the TLex8 class to indicate the current +lexical element being analysed. + +In practice, objects of this type are accessed through the TLexMark typedef. + +@see TLexMark +@see TLex8 +*/ +class TLexMark8 + { +public: + inline TLexMark8(); +private: + inline TLexMark8(const TUint8* aString); + const TUint8* iPtr; + friend class TLex8; + __DECLARE_TEST; + }; + + + + +class TRealX; +/** +@publishedAll +@released + +Provides general string-parsing functions suitable for numeric format +conversions and syntactical-element parsing. + +The class is the 8-bit variant for non-Unicode strings and 8-bit wide +characters. + +An instance of this class stores a string, maintaining an extraction mark +to indicate the current lexical element being analysed and a pointer to the +next character to be examined. + +Objects of this type are normally accessed through the build independent type +TLex. + +@see TLex +*/ +class TLex8 + { +public: + IMPORT_C TLex8(); + inline TLex8(const TUint8* aString); + inline TLex8(const TDesC8& aDes); + inline TLex8& operator=(const TUint8* aString); + inline TLex8& operator=(const TDesC8& aDes); + inline TBool Eos() const; + inline void Mark(TLexMark8& aMark) const; + inline void Mark(); + IMPORT_C void Inc(); + IMPORT_C void Inc(TInt aNumber); + IMPORT_C TChar Get(); + IMPORT_C TChar Peek() const; + IMPORT_C void UnGet(); + inline void UnGetToMark(); + IMPORT_C void UnGetToMark(const TLexMark8 aMark); + IMPORT_C void SkipSpace(); + inline void SkipAndMark(TInt aNumber); + IMPORT_C void SkipAndMark(TInt aNumber, TLexMark8& aMark); + inline void SkipSpaceAndMark(); + IMPORT_C void SkipSpaceAndMark(TLexMark8& aMark); + IMPORT_C void SkipCharacters(); + inline TInt TokenLength() const; + IMPORT_C TInt TokenLength(const TLexMark8 aMark) const; + IMPORT_C TPtrC8 MarkedToken() const; + IMPORT_C TPtrC8 MarkedToken(const TLexMark8 aMark) const; + IMPORT_C TPtrC8 NextToken(); + IMPORT_C TPtrC8 Remainder() const; + IMPORT_C TPtrC8 RemainderFromMark() const; + IMPORT_C TPtrC8 RemainderFromMark(const TLexMark8 aMark) const; + IMPORT_C TInt Offset() const; + inline TInt MarkedOffset() const; + IMPORT_C TInt MarkedOffset(const TLexMark8 aMark) const; + IMPORT_C TInt Val(TInt8& aVal); + IMPORT_C TInt Val(TInt16& aVal); + IMPORT_C TInt Val(TInt32& aVal); + IMPORT_C TInt Val(TInt64& aVal); + inline TInt Val(TInt& aVal); + IMPORT_C TInt Val(TUint8& aVal,TRadix aRadix); + IMPORT_C TInt Val(TUint16& aVal,TRadix aRadix); + IMPORT_C TInt Val(TUint32& aVal,TRadix aRadix); + IMPORT_C TInt Val(TInt64& aVal, TRadix aRadix); + inline TInt Val(TUint& aVal,TRadix aRadix=EDecimal); + IMPORT_C TInt BoundedVal(TInt32& aVal,TInt aLimit); + IMPORT_C TInt BoundedVal(TInt64& aVal, const TInt64& aLimit); + IMPORT_C TInt BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit); + IMPORT_C TInt BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit); + IMPORT_C TInt Val(TReal32& aVal); + IMPORT_C TInt Val(TReal32& aVal,TChar aPoint); + IMPORT_C TInt Val(TReal64& aVal); + IMPORT_C TInt Val(TReal64& aVal,TChar aPoint); + inline void Assign(const TLex8& aLex); + IMPORT_C void Assign(const TUint8* aString); + IMPORT_C void Assign(const TDesC8& aDes); + TInt Val(TRealX& aVal); + TInt Val(TRealX& aVal, TChar aPoint); + + /** @deprecated Use BoundedVal(TInt32& aVal,TInt aLimit) */ + inline TInt Val(TInt32& aVal,TInt aLimit) { return BoundedVal(aVal,aLimit); }; + + /** @deprecated Use BoundedVal(TInt64& aVal,const TInt64& aLimit) */ + inline TInt Val(TInt64& aVal,const TInt64& aLimit) { return BoundedVal(aVal,aLimit); }; + + /** @deprecated Use BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit) */ + inline TInt Val(TUint32& aVal,TRadix aRadix,TUint aLimit) { return BoundedVal(aVal,aRadix,aLimit); }; + + /** @deprecated Use BoundedVal(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) */ + inline TInt Val(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) { return BoundedVal(aVal,aRadix,aLimit); }; +private: + void Scndig(TInt& aSig,TInt& aExp,TInt64& aDl); + void ScndigAfterPoint(TInt& aSig,TInt64& aDl); + void ValidateMark(const TLexMark8 aMark) const; +private: + const TUint8* iNext; + const TUint8* iBuf; + const TUint8* iEnd; + TLexMark8 iMark; + __DECLARE_TEST; + }; + + + + +/** +@publishedAll +@released + +Defines the extraction mark used by the TLex16 class to indicate the current +lexical element being analysed. + +In practice, objects of this type are accessed through the TLexMark typedef. + +@see TLexMark +@see TLex16 +*/ +class TLexMark16 + { +public: + inline TLexMark16(); +private: + inline TLexMark16(const TUint16* aString); + const TUint16* iPtr; + friend class TLex16; + __DECLARE_TEST; + }; + + + + +/** +@publishedAll +@released + +Provides general string-parsing functions suitable for numeric format +conversions and syntactical-element parsing. + +The class is the 16-bit variant for Unicode strings and 16-bit wide +characters. + +An instance of this class stores a string, maintaining an extraction mark +to indicate the current lexical element being analysed and a pointer to the +next character to be examined. + +Objects of this type are normally accessed through the build independent type +TLex. + +@see TLex +*/ +class TLex16 + { +public: + IMPORT_C TLex16(); + inline TLex16(const TUint16* aString); + inline TLex16(const TDesC16& aDes); + inline TLex16& operator=(const TUint16* aString); + inline TLex16& operator=(const TDesC16& aDes); + inline TBool Eos() const; + inline void Mark(); + inline void Mark(TLexMark16& aMark) const; + IMPORT_C void Inc(); + IMPORT_C void Inc(TInt aNumber); + IMPORT_C TChar Get(); + IMPORT_C TChar Peek() const; + IMPORT_C void UnGet(); + inline void UnGetToMark(); + IMPORT_C void UnGetToMark(const TLexMark16 aMark); + IMPORT_C void SkipSpace(); + inline void SkipAndMark(TInt aNumber); + IMPORT_C void SkipAndMark(TInt aNumber, TLexMark16& aMark); + IMPORT_C void SkipSpaceAndMark(TLexMark16& aMark); + inline void SkipSpaceAndMark(); + IMPORT_C void SkipCharacters(); + inline TInt TokenLength() const; + IMPORT_C TInt TokenLength(const TLexMark16 aMark) const; + IMPORT_C TPtrC16 MarkedToken() const; + IMPORT_C TPtrC16 MarkedToken(const TLexMark16 aMark) const; + IMPORT_C TPtrC16 NextToken(); + IMPORT_C TPtrC16 Remainder() const; + IMPORT_C TPtrC16 RemainderFromMark() const; + IMPORT_C TPtrC16 RemainderFromMark(const TLexMark16 aMark) const; + IMPORT_C TInt Offset() const; + inline TInt MarkedOffset() const; + IMPORT_C TInt MarkedOffset(const TLexMark16 aMark) const; + IMPORT_C TInt Val(TInt8& aVal); + IMPORT_C TInt Val(TInt16& aVal); + IMPORT_C TInt Val(TInt32& aVal); + IMPORT_C TInt Val(TInt64& aVal); + inline TInt Val(TInt& aVal); + IMPORT_C TInt Val(TUint8& aVal,TRadix aRadix); + IMPORT_C TInt Val(TUint16& aVal,TRadix aRadix); + IMPORT_C TInt Val(TUint32& aVal,TRadix aRadix); + IMPORT_C TInt Val(TInt64& aVal, TRadix aRadix); +// inline TInt Val(TInt64& aVal, TRadix aRadix) {return Val(aVal,aRadix);} + inline TInt Val(TUint& aVal,TRadix aRadix=EDecimal); + IMPORT_C TInt BoundedVal(TInt32& aVal,TInt aLimit); + IMPORT_C TInt BoundedVal(TInt64& aVal, const TInt64& aLimit); + IMPORT_C TInt BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit); + IMPORT_C TInt BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit); + IMPORT_C TInt Val(TReal32& aVal); + IMPORT_C TInt Val(TReal32& aVal,TChar aPoint); + IMPORT_C TInt Val(TReal64& aVal); + IMPORT_C TInt Val(TReal64& aVal,TChar aPoint); + inline void Assign(const TLex16& aLex); + IMPORT_C void Assign(const TUint16* aString); + IMPORT_C void Assign(const TDesC16& aDes); + TInt Val(TRealX& aVal); + TInt Val(TRealX& aVal, TChar aPoint); + + /** @deprecated Use BoundedVal(TInt32& aVal,TInt aLimit) */ + inline TInt Val(TInt32& aVal,TInt aLimit) { return BoundedVal(aVal,aLimit); }; + + /** @deprecated Use BoundedVal(TInt64& aVal,const TInt64& aLimit) */ + inline TInt Val(TInt64& aVal,const TInt64& aLimit) { return BoundedVal(aVal,aLimit); }; + + /** @deprecated Use BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit) */ + inline TInt Val(TUint32& aVal,TRadix aRadix,TUint aLimit) { return BoundedVal(aVal,aRadix,aLimit); }; + + /** @deprecated Use BoundedVal(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) */ + inline TInt Val(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) { return BoundedVal(aVal,aRadix,aLimit); }; +private: + void Scndig(TInt& aSig,TInt& aExp,TInt64& aDl); + void ValidateMark(const TLexMark16 aMark) const; +private: + const TUint16* iNext; + const TUint16* iBuf; + const TUint16* iEnd; + TLexMark16 iMark; + __DECLARE_TEST; + }; + + + + +#if defined(_UNICODE) +/** +@publishedAll +@released + +Provides access to general string-parsing functions suitable for numeric format +conversions and syntactical-element parsing. + +It maps directly to either a TLex16 for a Unicode build or a TLex8 for a non-Unicode +build. + +The build independent type should always be used unless an explicit 16 bit +or 8 bit build variant is required. + +@see TLex16 +@see TLex8 +*/ +typedef TLex16 TLex; + + + + +/** +@publishedAll +@released + +Defines the extraction mark used by the TLex classes to indicate the current +lexical element being analysed. + +It maps directly to either a TLexMark16 for a Unicode build or a TLexMark8 +for a non-Unicode build. + +The build independent type should always be used unless an explicit 16 bit +or 8 bit build variant is required. +*/ +typedef TLexMark16 TLexMark; + + + + +#else + + + +/** +@publishedAll +@released + +Provides access to general string-parsing functions suitable for numeric format +conversions and syntactical-element parsing. + +It maps directly to either a TLex16 for a Unicode build or a TLex8 for a non-Unicode +build. + +The build independent type should always be used unless an explicit 16 bit +or 8 bit build variant is required. + +@see TLex16 +@see TLex8 +*/ +typedef TLex8 TLex; + + + + +/** +@publishedAll +@released + +Defines the extraction mark used by the TLex classes to indicate the current +lexical element being analysed. + +It maps directly to either a TLexMark16 for a Unicode build or a TLexMark8 +for a non-Unicode build. + +The build independent type should always be used unless an explicit 16 bit +or 8 bit build variant is required. +*/ +typedef TLexMark8 TLexMark; +#endif + + + + +/** +@publishedAll +@released + +Packages a Uid type together with a checksum. + +@see TUidType +*/ +class TCheckedUid + { +public: + IMPORT_C TCheckedUid(); + IMPORT_C TCheckedUid(const TUidType& aUidType); + IMPORT_C TCheckedUid(const TDesC8& aPtr); + IMPORT_C void Set(const TUidType& aUidType); + IMPORT_C void Set(const TDesC8& aPtr); + IMPORT_C TPtrC8 Des() const; + inline const TUidType& UidType() const; +protected: + IMPORT_C TUint Check() const; +private: + TUidType iType; + TUint iCheck; + }; + + + + +/** +@publishedAll +@released + +A date and time object in which the individual components are accessible in +human-readable form. + +The individual components are: year, month, day, hour, minute, +second and microsecond. + +These components are stored as integers and all except the year are checked for +validity when a TDateTime is constructed or assigned new values. + +This class only supports getting and setting the entire date/time or any component +of it. It does not support adding or subtracting intervals to or from a time. +For functions which manipulate times, use class TTime. + +@see TTime +*/ +class TDateTime + { +public: + inline TDateTime(); + IMPORT_C TDateTime(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute, TInt aSecond,TInt aMicroSecond); + IMPORT_C TInt Set(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute, TInt aSecond,TInt aMicroSecond); + IMPORT_C TInt SetYear(TInt aYear); + IMPORT_C TInt SetYearLeapCheck(TInt aYear); + IMPORT_C TInt SetMonth(TMonth aMonth); + IMPORT_C TInt SetDay(TInt aDay); + IMPORT_C TInt SetHour(TInt aHour); + IMPORT_C TInt SetMinute(TInt aMinute); + IMPORT_C TInt SetSecond(TInt aSecond); + IMPORT_C TInt SetMicroSecond(TInt aMicroSecond); + inline TInt Year() const; + inline TMonth Month() const; + inline TInt Day() const; + inline TInt Hour() const; + inline TInt Minute() const; + inline TInt Second() const; + inline TInt MicroSecond() const; +private: + TInt iYear; + TMonth iMonth; + TInt iDay; + TInt iHour; + TInt iMinute; + TInt iSecond; + TInt iMicroSecond; + }; + + + + +/** +@publishedAll +@released + +Represents a time interval of a millionth of a second stored as +a 64-bit integer. + +It supports the initialisation, setting and getting of an interval and provides +standard comparison operations. Objects of this class can be added to and +subtracted from TTime objects. + +@see TTime +*/ +class TTimeIntervalMicroSeconds + { +public: + inline TTimeIntervalMicroSeconds(); + inline TTimeIntervalMicroSeconds(const TInt64& aInterval); + inline TTimeIntervalMicroSeconds& operator=(const TInt64& aInterval); + inline TBool operator==(const TTimeIntervalMicroSeconds& aInterval) const; + inline TBool operator!=(const TTimeIntervalMicroSeconds& aInterval) const; + inline TBool operator>=(const TTimeIntervalMicroSeconds& aInterval) const; + inline TBool operator<=(const TTimeIntervalMicroSeconds& aInterval) const; + inline TBool operator>(const TTimeIntervalMicroSeconds& aInterval) const; + inline TBool operator<(const TTimeIntervalMicroSeconds& aInterval) const; + inline const TInt64& Int64() const; +private: + TInt64 iInterval; + }; + + + + +/** +@publishedAll +@released + +Provides a base class for all time interval classes using +a 32-bit representation. + +It supports retrieving the interval and provides various operations for +comparing intervals. Its concrete derived classes can be added to and +subtracted from a TTime. + +The comparison operators simply compare the integer representations of the +two intervals. They do not take account of different time interval units. +So, for example, when comparing for equality an interval of three hours with +an interval of three days, the result is true. + +@see TTime +*/ +class TTimeIntervalBase + { +public: + inline TBool operator==(TTimeIntervalBase aInterval) const; + inline TBool operator!=(TTimeIntervalBase aInterval) const; + inline TBool operator>=(TTimeIntervalBase aInterval) const; + inline TBool operator<=(TTimeIntervalBase aInterval) const; + inline TBool operator>(TTimeIntervalBase aInterval) const; + inline TBool operator<(TTimeIntervalBase aInterval) const; + inline TInt Int() const; +protected: + inline TTimeIntervalBase(); + inline TTimeIntervalBase(TInt aInterval); +protected: + TInt iInterval; + }; + + + + +/** +@publishedAll +@released + +Represents a microsecond time interval stored in 32 rather than 64 bits. + +Its range is +-2147483647, which is +-35 minutes, 47 seconds. Comparison and +interval retrieval functions are provided by the base class TTimeIntervalBase. +*/ +class TTimeIntervalMicroSeconds32 : public TTimeIntervalBase + { +public: + inline TTimeIntervalMicroSeconds32(); + inline TTimeIntervalMicroSeconds32(TInt aInterval); + inline TTimeIntervalMicroSeconds32& operator=(TInt aInterval); + }; + + + + +/** +@publishedAll +@released + +Represents a time interval in seconds. + +Comparison and interval retrieval functions +are provided by the base class TTimeIntervalBase. + +The range of values which it can represent is +-2147483647, which is equal to ++-24855 days (approximately 68 years). +*/ +class TTimeIntervalSeconds : public TTimeIntervalBase + { +public: + inline TTimeIntervalSeconds(); + inline TTimeIntervalSeconds(TInt aInterval); + inline TTimeIntervalSeconds& operator=(TInt aInterval); + }; + + + + +/** +@publishedAll +@released + +Represents a time interval in minutes. + +Comparison and interval retrieval functions +are provided by the base class TTimeIntervalBase. +*/ +class TTimeIntervalMinutes : public TTimeIntervalBase + { +public: + inline TTimeIntervalMinutes(); + inline TTimeIntervalMinutes(TInt aInterval); + inline TTimeIntervalMinutes& operator=(TInt aInterval); + }; + + + + +/** +@publishedAll +@released + +Represents a time interval in hours. + +Comparison and interval retrieval functions +are provided by the base class TTimeIntervalBase. +*/ +class TTimeIntervalHours : public TTimeIntervalBase + { +public: + inline TTimeIntervalHours(); + inline TTimeIntervalHours(TInt aInterval); + inline TTimeIntervalHours& operator=(TInt aInterval); + }; + + + + +/** +@publishedAll +@released + +Represents a time interval in days. + +Comparison and interval retrieval functions +are provided by the base class TTimeIntervalBase. +*/ +class TTimeIntervalDays : public TTimeIntervalBase + { +public: + inline TTimeIntervalDays(); + inline TTimeIntervalDays(TInt aInterval); + inline TTimeIntervalDays& operator=(TInt aInterval); + }; + + + + +/** +@publishedAll +@released + +Represents a time interval in months. + +Comparison and interval retrieval functions +are provided by the base class TTimeIntervalBase. +*/ +class TTimeIntervalMonths : public TTimeIntervalBase + { +public: + inline TTimeIntervalMonths(); + inline TTimeIntervalMonths(TInt aInterval); + inline TTimeIntervalMonths& operator=(TInt aInterval); + }; + + + + +/** +@publishedAll +@released + +Represents a time interval in years. + +Comparison and interval retrieval functions +are provided by the base class TTimeIntervalBase. +*/ +class TTimeIntervalYears : public TTimeIntervalBase + { +public: + inline TTimeIntervalYears(); + inline TTimeIntervalYears(TInt aInterval); + inline TTimeIntervalYears& operator=(TInt aInterval); + }; + + + +/** +@publishedAll +@released + +An enumeration one or both of whose enumerator values may be returned +by TTime::Parse(). + +@see TTime::Parse +*/ +enum { + /** + Indicates that a time is present. + + @see TTime::Parse + */ + EParseTimePresent=0x1, + /** + Indicates that a date is present. + + @see TTime::Parse + */ + EParseDatePresent=0x2 + }; + + + +class TLocale; +/** +@publishedAll +@released + +Stores and manipulates the date and time. + +It represents a date and time as a number of microseconds since midnight, +January 1st, 0 AD nominal Gregorian. BC dates are represented by negative +TTime values. A TTime object may be constructed from a TInt64, a TDateTime +a string literal, or by default, which initialises the time to an arbitrary +value. To access human-readable time information, the TTime may be converted +from a TInt64 into a TDateTime, which represents the date and time as seven +numeric fields and provides functions to extract these fields. Alternatively, +to display the time as text, the time may be formatted and placed into a +descriptor using a variety of formatting commands and which may or may not +honour the system's locale settings. The conversion between time and text may +be performed the other way around, so that a descriptor can be parsed and +converted into a TTime value. + +In addition to setting and getting the date and time and converting between +text and time, TTime provides functions to get intervals between times and +standard comparison and arithmetic operators which enable time intervals to +be added or subtracted to or from the time. + +@see TInt64 +@see TDateTime +*/ +class TTime + { +public: + inline TTime(); + inline TTime(const TInt64& aTime); + IMPORT_C TTime(const TDesC& aString); + IMPORT_C TTime(const TDateTime& aDateTime); + inline TTime& operator=(const TInt64& aTime); + IMPORT_C TTime& operator=(const TDateTime& aDateTime); + IMPORT_C void HomeTime(); + IMPORT_C void UniversalTime(); + IMPORT_C TInt Set(const TDesC& aString); + IMPORT_C TInt HomeTimeSecure(); + IMPORT_C TInt UniversalTimeSecure(); + + IMPORT_C TDateTime DateTime() const; + IMPORT_C TTimeIntervalMicroSeconds MicroSecondsFrom(TTime aTime) const; + IMPORT_C TInt SecondsFrom(TTime aTime,TTimeIntervalSeconds& aInterval) const; + IMPORT_C TInt MinutesFrom(TTime aTime,TTimeIntervalMinutes& aInterval) const; + IMPORT_C TInt HoursFrom(TTime aTime,TTimeIntervalHours& aInterval) const; + IMPORT_C TTimeIntervalDays DaysFrom(TTime aTime) const; + IMPORT_C TTimeIntervalMonths MonthsFrom(TTime aTime) const; + IMPORT_C TTimeIntervalYears YearsFrom(TTime aTime) const; + + IMPORT_C TInt DaysInMonth() const; + IMPORT_C TDay DayNoInWeek() const; + IMPORT_C TInt DayNoInMonth() const; + IMPORT_C TInt DayNoInYear() const; + IMPORT_C TInt DayNoInYear(TTime aStartDate) const; + IMPORT_C TInt WeekNoInYear() const; + IMPORT_C TInt WeekNoInYear(TTime aStartDate) const; + IMPORT_C TInt WeekNoInYear(TFirstWeekRule aRule) const; + IMPORT_C TInt WeekNoInYear(TTime aStartDate,TFirstWeekRule aRule) const; + IMPORT_C void FormatL(TDes& aDes,const TDesC& aFormat) const; + IMPORT_C void FormatL(TDes& aDes,const TDesC& aFormat,const TLocale& aLocale) const; + IMPORT_C void RoundUpToNextMinute(); + IMPORT_C TInt Parse(const TDesC& aDes,TInt aCenturyOffset=0); + + IMPORT_C TTime operator+(TTimeIntervalYears aYear) const; + IMPORT_C TTime operator+(TTimeIntervalMonths aMonth) const; + IMPORT_C TTime operator+(TTimeIntervalDays aDay) const; + IMPORT_C TTime operator+(TTimeIntervalHours aHour) const; + IMPORT_C TTime operator+(TTimeIntervalMinutes aMinute) const; + IMPORT_C TTime operator+(TTimeIntervalSeconds aSecond) const; + IMPORT_C TTime operator+(TTimeIntervalMicroSeconds aMicroSecond) const; + IMPORT_C TTime operator+(TTimeIntervalMicroSeconds32 aMicroSecond) const; + IMPORT_C TTime operator-(TTimeIntervalYears aYear) const; + IMPORT_C TTime operator-(TTimeIntervalMonths aMonth) const; + IMPORT_C TTime operator-(TTimeIntervalDays aDay) const; + IMPORT_C TTime operator-(TTimeIntervalHours aHour) const; + IMPORT_C TTime operator-(TTimeIntervalMinutes aMinute) const; + IMPORT_C TTime operator-(TTimeIntervalSeconds aSecond) const; + IMPORT_C TTime operator-(TTimeIntervalMicroSeconds aMicroSecond) const; + IMPORT_C TTime operator-(TTimeIntervalMicroSeconds32 aMicroSecond) const; + IMPORT_C TTime& operator+=(TTimeIntervalYears aYear); + IMPORT_C TTime& operator+=(TTimeIntervalMonths aMonth); + IMPORT_C TTime& operator+=(TTimeIntervalDays aDay); + IMPORT_C TTime& operator+=(TTimeIntervalHours aHour); + IMPORT_C TTime& operator+=(TTimeIntervalMinutes aMinute); + IMPORT_C TTime& operator+=(TTimeIntervalSeconds aSecond); + IMPORT_C TTime& operator+=(TTimeIntervalMicroSeconds aMicroSecond); + IMPORT_C TTime& operator+=(TTimeIntervalMicroSeconds32 aMicroSecond); + IMPORT_C TTime& operator-=(TTimeIntervalYears aYear); + IMPORT_C TTime& operator-=(TTimeIntervalMonths aMonth); + IMPORT_C TTime& operator-=(TTimeIntervalDays aDay); + IMPORT_C TTime& operator-=(TTimeIntervalHours aHour); + IMPORT_C TTime& operator-=(TTimeIntervalMinutes aMinute); + IMPORT_C TTime& operator-=(TTimeIntervalSeconds aSecond); + IMPORT_C TTime& operator-=(TTimeIntervalMicroSeconds aMicroSecond); + IMPORT_C TTime& operator-=(TTimeIntervalMicroSeconds32 aMicroSecond); + inline TBool operator==(TTime aTime) const; + inline TBool operator!=(TTime aTime) const; + inline TBool operator>=(TTime aTime) const; + inline TBool operator<=(TTime aTime) const; + inline TBool operator>(TTime aTime) const; + inline TBool operator<(TTime aTime) const; + inline const TInt64& Int64() const; +private: + static TTime Convert(const TDateTime& aDateTime); +private: + TInt64 iTime; + __DECLARE_TEST; + }; + + + + +/** +@publishedAll +@released + +A utility class whose functions may be used by the other date/time related +classes. +*/ +class Time + { +public: + IMPORT_C static TTime NullTTime(); + IMPORT_C static TTime MaxTTime(); + IMPORT_C static TTime MinTTime(); + IMPORT_C static TInt DaysInMonth(TInt aYear, TMonth aMonth); + IMPORT_C static TBool IsLeapYear(TInt aYear); + IMPORT_C static TInt LeapYearsUpTo(TInt aYear); + }; + + + + +/** +@publishedAll +@released + +Gets a copy of the current locale's full text name for a day of the week. + +After construction or after a call to Set(), the copy of the text can be accessed +and manipulated using the standard descriptor member functions provided by +the base class. + +@see KMaxDayName +*/ +class TDayName : public TBuf + { +public: + IMPORT_C TDayName(); + IMPORT_C TDayName(TDay aDay); + IMPORT_C void Set(TDay aDay); + }; + + + + +/** +@publishedAll +@released + +Gets a copy of the current locale's abbreviated text name for a day of the +week. + +After construction or after a call to Set(), the copy of the abbreviated text +can be accessed and manipulated using the standard descriptor member functions +provided by the base class. + +The abbreviated day name cannot be assumed to be one character. In English, +it is 3 characters (Mon, Tue, Wed etc.), but the length can vary from locale +to locale, with a maximum length of KMaxDayNameAbb. + +@see KMaxDayNameAbb +*/ +class TDayNameAbb : public TBuf + { +public: + IMPORT_C TDayNameAbb(); + IMPORT_C TDayNameAbb(TDay aDay); + IMPORT_C void Set(TDay aDay); + }; + + + + +/** +@publishedAll +@released + +Gets a copy of the current locale's full text name for a month. + +After construction or after a call to Set(), the copy of the text can be accessed +and manipulated using the standard descriptor member functions provided by +the base class. + +@see KMaxMonthName +*/ +class TMonthName : public TBuf + { +public: + IMPORT_C TMonthName(); + IMPORT_C TMonthName(TMonth aMonth); + IMPORT_C void Set(TMonth aMonth); + }; + + + + +/** +@publishedAll +@released + +Gets a copy of the current locale's abbreviated text name for a month. + +After construction or after a call to Set(), the copy of the abbreviated text +can be accessed and manipulated using the standard descriptor member functions +provided by the base class. + +@see KMaxMonthNameAbb +*/ +class TMonthNameAbb : public TBuf + { +public: + IMPORT_C TMonthNameAbb(); + IMPORT_C TMonthNameAbb(TMonth aMonth); + IMPORT_C void Set(TMonth aMonth); + }; + + + + +/** +@publishedAll +@released + +Gets a copy of the current locale's date suffix text for a specific day in +the month. + +The text is the set of characters which can be appended to dates of the month +(e.g. in English, st for 1st, nd for 2nd etc). + +After construction or after a call to Set(), the copy of the suffix text can +be accessed and manipulated using the standard descriptor member functions +provided by the base class. +*/ +class TDateSuffix : public TBuf + { +public: + IMPORT_C TDateSuffix(); + IMPORT_C TDateSuffix(TInt aDateSuffix); + IMPORT_C void Set(TInt aDateSuffix); + }; + + + + +/** +@publishedAll +@released + +Current locale's am/pm text + +This class retrieves a copy of the current locale's text identifying time +before and after noon. In English, this is am and pm. + +After construction or after a call to Set(), the copy of the text can be accessed +and manipulated using the standard descriptor member functions provided by +the base class. +*/ +class TAmPmName : public TBuf + { +public: + IMPORT_C TAmPmName(); + IMPORT_C TAmPmName(TAmPm aSelector); + IMPORT_C void Set(TAmPm aSelector); + }; + + + + +/** +@publishedAll +@released + +Gets a copy of the currency symbol(s) in use by the current locale. + +After construction or after a call to TCurrencySymbol::Set(), the copy of +the currency symbol(s) can be accessed and manipulated using the standard +descriptor member functions provided by the base class. +*/ +class TCurrencySymbol : public TBuf + { +public: + IMPORT_C TCurrencySymbol(); + IMPORT_C void Set(); + }; + + + + +/** +@publishedAll +@released + +Contains a format list that defines the short date format. + +An instance of this class should be passed as the second argument +to TTime::FormatL(). +The string does not include any time components. The content of the long +date format specification is taken from the system-wide settings. + +For example, in the English locale, the short date format would be something +like 14/1/2000. + +This class is used as follows: + +@code +TTime now; +now.HomeTime(); +TBuf buffer; +now.FormatL(buffer,TShortDateFormatSpec()); +@endcode + +@see KMaxShortDateFormatSpec +@see TTime::FormatL +*/ +class TShortDateFormatSpec : public TBuf // to be passed into TTime::FormatL + { +public: + IMPORT_C TShortDateFormatSpec(); + IMPORT_C void Set(); + }; + + + + +/** +@publishedAll +@released + +Contains a format list that defines the long date format. + +An instance of this class should be passed as the second argument +to TTime::FormatL(). +The string does not include any time components. The content of the long +date format specification is taken from the system-wide settings. + +For example, in the English locale, the long date format would be +something like 14th January 2000. + +This class is used as follows: + +@code +TTime now; +now.HomeTime(); +TBuf buffer; +now.FormatL(buffer,TLongDateFormatSpec()); +@endcode + +@see KMaxLongDateFormatSpec +@see TTime::FormatL +*/ +class TLongDateFormatSpec : public TBuf // to be passed into TTime::FormatL + { +public: + IMPORT_C TLongDateFormatSpec(); + IMPORT_C void Set(); + }; + + + + +/** +@publishedAll +@released + +Contains a format list that defines the time string format. + +An instance of this class should be passed as the second argument +to TTime::FormatL(). +The string does not include any time components. The content of the time format +specification is taken from the system-wide settings. + +This class is used as follows: + +@code +TTime now; +now.HomeTime(); +TBuf buffer; +now.FormatL(buffer,TTimeFormatSpec()); +@endcode + +@see KMaxTimeFormatSpec +@see TTime::FormatL +*/ +class TTimeFormatSpec : public TBuf // to be passed into TTime::FormatL + { +public: + IMPORT_C TTimeFormatSpec(); + IMPORT_C void Set(); + }; + + + + +/** +@publishedAll +@released + +Sets and gets the system's locale settings. + +Symbian OS maintains the locale information internally. On +construction, this object is initialized with the system information +for all locale items. +*/ +class TLocale + { +public: + + /** + Indicates how negative currency values are formatted. + */ + enum TNegativeCurrencyFormat + { + /** + A minus sign is inserted before the currency symbol and value. + */ + ELeadingMinusSign, + + /** + The currency value and symbol are enclosed in brackets (no minus sign + is used). + */ + EInBrackets, //this one must be non-zero for binary compatibility with the old TBool TLocale::iCurrencyNegativeInBrackets which was exposed in the binary interface because it was accessed via *inline* functions + + /** + A minus sign is inserted after the currency symbol and value. + */ + ETrailingMinusSign, + + /** + A minus sign is inserted between the currency symbol and the value. + */ + EInterveningMinusSign + }; + + /** + Flags for negative currency values formatting + */ + enum + { + /** + If this flag is set and the currency value being formatted is negative, + if there is a space between the currency symbol and the value, + that space is lost. + */ + EFlagNegativeLoseSpace = 0x00000001, + + /** + If this flag is set and the currency value being formatted is negative, + the position of the currency symbol is placed in the opposite direction + from the position set for the positive currency value. + */ + EFlagNegativeCurrencySymbolOpposite=0x00000002 + }; + /** Indicates how the device universal time is maintained */ + enum TDeviceTimeState + { + /** Universal time is maintained by the device RTC and the user selection + of the locale of the device indicating offset from GMT and daylight saving*/ + EDeviceUserTime, + + /** Universal time and offset from GMT is supplied by the mobile network + and maintained by device RTC */ + ENITZNetworkTimeSync + }; +public: + IMPORT_C TLocale(); + inline TLocale(TInt); + IMPORT_C void Refresh(); + IMPORT_C TInt Set() const; + IMPORT_C void FormatCurrency(TDes& aText, TInt aAmount); + IMPORT_C void FormatCurrency(TDes& aText, TInt64 aAmount); + IMPORT_C void FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt aAmount); + IMPORT_C void FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt64 aAmount); + + inline TInt CountryCode() const; + inline void SetCountryCode(TInt aCode); + inline TTimeIntervalSeconds UniversalTimeOffset() const; + inline TDateFormat DateFormat() const; + inline void SetDateFormat(TDateFormat aFormat); + inline TTimeFormat TimeFormat() const; + inline void SetTimeFormat(TTimeFormat aFormat); + inline TLocalePos CurrencySymbolPosition() const; + inline void SetCurrencySymbolPosition(TLocalePos aPos); + inline TBool CurrencySpaceBetween() const; + inline void SetCurrencySpaceBetween(TBool aSpace); + inline TInt CurrencyDecimalPlaces() const; + inline void SetCurrencyDecimalPlaces(TInt aPlaces); + inline TBool CurrencyNegativeInBrackets() const; // These two functions are deprecated + inline void SetCurrencyNegativeInBrackets(TBool aBool); // They are here to maintain compatibility. Use the New functions -> NegativeCurrencyFormat setter/getter. + inline TBool CurrencyTriadsAllowed() const; + inline void SetCurrencyTriadsAllowed(TBool aBool); + inline TChar ThousandsSeparator() const; + inline void SetThousandsSeparator(const TChar& aChar); + inline TChar DecimalSeparator() const; + inline void SetDecimalSeparator(const TChar& aChar); + inline TChar DateSeparator(TInt aIndex) const; + inline void SetDateSeparator(const TChar& aChar,TInt aIndex); + inline TChar TimeSeparator(TInt aIndex) const; + inline void SetTimeSeparator(const TChar& aChar,TInt aIndex); + inline TBool AmPmSpaceBetween() const; + inline void SetAmPmSpaceBetween(TBool aSpace); + inline TLocalePos AmPmSymbolPosition() const; + inline void SetAmPmSymbolPosition(TLocalePos aPos); + inline TUint DaylightSaving() const; + inline TBool QueryHomeHasDaylightSavingOn() const; + inline TDaylightSavingZone HomeDaylightSavingZone() const; + inline TUint WorkDays() const; + inline void SetWorkDays(TUint aMask); + inline TDay StartOfWeek() const; + inline void SetStartOfWeek(TDay aDay); + inline TClockFormat ClockFormat() const; + inline void SetClockFormat(TClockFormat aFormat); + inline TUnitsFormat UnitsGeneral() const; + inline void SetUnitsGeneral(TUnitsFormat aFormat); + inline TUnitsFormat UnitsDistanceShort() const; + inline void SetUnitsDistanceShort(TUnitsFormat aFormat); + inline TUnitsFormat UnitsDistanceLong() const; + inline void SetUnitsDistanceLong(TUnitsFormat aFormat); + inline TNegativeCurrencyFormat NegativeCurrencyFormat() const; + inline void SetNegativeCurrencyFormat(TNegativeCurrencyFormat aNegativeCurrencyFormat); + inline TBool NegativeLoseSpace() const; + inline void SetNegativeLoseSpace(TBool aBool); + inline TBool NegativeCurrencySymbolOpposite() const; + inline void SetNegativeCurrencySymbolOpposite(TBool aBool); + inline TLanguage LanguageDowngrade(TInt aIndex) const; // 0 <= aIndex < 3 + inline void SetLanguageDowngrade(TInt aIndex, TLanguage aLanguage); + inline TDigitType DigitType() const; + inline void SetDigitType(TDigitType aDigitType); + inline TDeviceTimeState DeviceTime() const; + inline void SetDeviceTime(TDeviceTimeState aState); + + void SetDefaults(); /**< @internalComponent */ + +private: + friend class TExtendedLocale; +private: + TInt iCountryCode; + TTimeIntervalSeconds iUniversalTimeOffset; + TDateFormat iDateFormat; + TTimeFormat iTimeFormat; + TLocalePos iCurrencySymbolPosition; + TBool iCurrencySpaceBetween; + TInt iCurrencyDecimalPlaces; + TNegativeCurrencyFormat iNegativeCurrencyFormat; // replaced TBool iCurrencyNegativeInBrackets + TBool iCurrencyTriadsAllowed; + TChar iThousandsSeparator; + TChar iDecimalSeparator; + TChar iDateSeparator[KMaxDateSeparators]; + TChar iTimeSeparator[KMaxTimeSeparators]; + TLocalePos iAmPmSymbolPosition; + TBool iAmPmSpaceBetween; + TUint iDaylightSaving; + TDaylightSavingZone iHomeDaylightSavingZone; + TUint iWorkDays; + TDay iStartOfWeek; + TClockFormat iClockFormat; + TUnitsFormat iUnitsGeneral; + TUnitsFormat iUnitsDistanceShort; + TUnitsFormat iUnitsDistanceLong; + TUint iExtraNegativeCurrencyFormatFlags; + TUint16 iLanguageDowngrade[3]; + TUint16 iSpare16; + TDigitType iDigitType; + TDeviceTimeState iDeviceTimeState; + TInt iSpare[0x1E]; + }; + +/** +@publishedAll +@released + +TLocaleAspect + +Enumeration used with TExtendedLocale::LoadLocaleAspect to select which +locale information is to be replaced from the contents of the Locale +DLL being loaded. + +ELocaleLanguageSettings - Replaces everything that should change with + language selection e.g. Month names, Day names, + etc, + +ELocaleLocaleSettings - Replaces the currently selected currency symbol, + TLocale settings, and FAT utility functions + +ELocaleTimeAndDateSettings - Replaces the current time and date display + format settings. + +ELocaleCollateSettings - Replaces the "system" preferred Charset + (because that's where the collation table + is!). The "Default" charset will remain + unchanged until after the next power + off/on cycle +*/ +enum TLocaleAspect + { + ELocaleLanguageSettings = 0x01, + ELocaleCollateSetting = 0x02, + ELocaleLocaleSettings = 0x04, + ELocaleTimeDateSettings = 0x08, + }; + +/** +@internalComponent +*/ +struct SLocaleLanguage + { + TLanguage iLanguage; + const TText* iDateSuffixTable; + const TText* iDayTable; + const TText* iDayAbbTable; + const TText* iMonthTable; + const TText* iMonthAbbTable; + const TText* iAmPmTable; + const TText16* const* iMsgTable; + }; + +/** +@internalComponent +*/ +struct SLocaleLocaleSettings + { + TText iCurrencySymbol[KMaxCurrencySymbol+1]; + TAny* iLocaleExtraSettingsDllPtr; + }; + +/** +@internalComponent +*/ +struct SLocaleTimeDateFormat + { + TText iShortDateFormatSpec[KMaxShortDateFormatSpec+1]; + TText iLongDateFormatSpec[KMaxLongDateFormatSpec+1]; + TText iTimeFormatSpec[KMaxTimeFormatSpec+1]; + TAny* iLocaleTimeDateFormatDllPtr; + }; + +struct LCharSet; + +/** +@publishedAll +@released + +Extended locale class + +This class holds a collection of locale information. It contains a TLocale internally. +It has methods to load a locale DLL and to set the system wide locale information. + +*/ +class TExtendedLocale + { +public: + + // Default constructor, create an empty instance + IMPORT_C TExtendedLocale(); + + // Initialise to (or restore from!) current system wide locale + // settings + IMPORT_C void LoadSystemSettings(); + + // Overwrite current system wide locale settings with the current + // contents of this TExtendedLocale + IMPORT_C TInt SaveSystemSettings(); + + // Load a complete set of locale data from a named Locale DLL + IMPORT_C TInt LoadLocale(const TDesC& aLocaleDllName); + + // Load an additional Locale DLL and over-ride a selected subset + // (currently ELocaleLanguageSettings to select an alternative set + // of language specific text strings, ELocaleCollateSetting to + // select a new system collation table, + // ELocaleOverRideMatchCollationTable to locally select an + // alternative collation order for matching text strings, or + // ELocaleOverRideSortCollationTable for ordering text strings) + // of settings with its contents + IMPORT_C TInt LoadLocaleAspect(TUint aAspectGroup, const TDesC& aLocaleDllName); + + // Set the currency Symbol + IMPORT_C TInt SetCurrencySymbol(const TDesC &aSymbol); + + // Get the name of the DLL holding the data for a particular set + // of Locale properties + IMPORT_C TInt GetLocaleDllName(TLocaleAspect aLocaleDataSet, TDes& aDllName); + + // Get the preferred collation method. + // Note that some Charsets may contain more than one Collation + // method (e.g "dictionary" v "phonebook" ordering) so an optional + // index parameter can be used to select between them + IMPORT_C TCollationMethod GetPreferredCollationMethod(TInt index = 0) ; + + //Get the Currency Symbol + IMPORT_C TPtrC GetCurrencySymbol(); + + //Get the Long Date Format + IMPORT_C TPtrC GetLongDateFormatSpec(); + + //Get the Short Date Format + IMPORT_C TPtrC GetShortDateFormatSpec(); + + //Get the Time Format + IMPORT_C TPtrC GetTimeFormatSpec(); + + // Retrieve a reference to the encapsulated TLocale + inline TLocale* GetLocale(); + + inline const LCharSet* GetDefaultCharSet(); + inline const LCharSet* GetPreferredCharSet(); + inline SLocaleLanguage* GetLanguageSettings(); + inline SLocaleLocaleSettings* GetLocaleExtraSettings(); + inline SLocaleTimeDateFormat* GetLocaleTimeDateFormat(); + +private: + + TInt DoLoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList); + void DoUpdateLanguageSettings(TLibraryFunction* aExportList); + void DoUpdateLocaleSettings(TLibraryFunction* aExportList); + void DoUpdateTimeDateFormat(TLibraryFunction* aExportList); + +private: + + TLocale iLocale; + SLocaleLanguage iLanguageSettings; + SLocaleLocaleSettings iLocaleExtraSettings; + SLocaleTimeDateFormat iLocaleTimeDateFormat; + const LCharSet* iDefaultCharSet; + const LCharSet* iPreferredCharSet; + }; + + + + +/** +@publishedAll +@released + +Geometric rectangle. + +The class represents a rectangle whose sides are parallel with the axes of +the co-ordinate system. + +The co-ordinates of the top-left and bottom-right corners are used to set +the dimensions of the rectangle. The bottom right co-ordinate is outside the +rectangle. Thus TRect(TPoint(2,2),TSize(4,4)) is equal +to TRect(TPoint(2,2),TPoint(6,6)), +and in both cases you get a 4x4 pixel rectangle on the screen. + +Functions are provided to initialise and manipulate the rectangle and to extract +information about it. +*/ +class TRect + { +public: + enum TUninitialized { EUninitialized }; + /** + Constructs a default rectangle. + + This initialises the co-ordinates of its top + left and bottom right corners to (0,0). + */ + TRect(TUninitialized) {} + IMPORT_C TRect(); + IMPORT_C TRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy); + IMPORT_C TRect(const TPoint& aPointA,const TPoint& aPointB); + IMPORT_C TRect(const TPoint& aPoint,const TSize& aSize); + IMPORT_C TRect(const TSize& aSize); + IMPORT_C TBool operator==(const TRect& aRect) const; + IMPORT_C TBool operator!=(const TRect& aRect) const; + IMPORT_C void SetRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy); + IMPORT_C void SetRect(const TPoint& aPointTL,const TPoint& aPointBR); + IMPORT_C void SetRect(const TPoint& aPoint,const TSize& aSize); + IMPORT_C void Move(TInt aDx,TInt aDy); + IMPORT_C void Move(const TPoint& aOffset); + IMPORT_C void Resize(TInt aDx,TInt aDy); + IMPORT_C void Resize(const TSize& aSize); + IMPORT_C void Shrink(TInt aDx,TInt aDy); + IMPORT_C void Shrink(const TSize& aSize); + IMPORT_C void Grow(TInt aDx,TInt aDy); + IMPORT_C void Grow(const TSize& aSize); + IMPORT_C void BoundingRect(const TRect& aRect); + IMPORT_C TBool IsEmpty() const; + IMPORT_C TBool Intersects(const TRect& aRect) const; + IMPORT_C void Intersection(const TRect& aRect); + IMPORT_C void Normalize(); + IMPORT_C TBool Contains(const TPoint& aPoint) const; + IMPORT_C TSize Size() const; + IMPORT_C TInt Width() const; + IMPORT_C TInt Height() const; + IMPORT_C TBool IsNormalized() const; + IMPORT_C TPoint Center() const; + IMPORT_C void SetSize(const TSize& aSize); + IMPORT_C void SetWidth(TInt aWidth); + IMPORT_C void SetHeight(TInt aHeight); +private: + void Adjust(TInt aDx,TInt aDy); +public: + /** + The x and y co-ordinates of the top left hand corner of the rectangle. + */ + TPoint iTl; + + /** + The x and y co-ordinates of the bottom right hand corner of the rectangle. + */ + TPoint iBr; + }; + + + + +/** +@publishedAll +@released + +Clipping region - abstract base class. + +This abstract base class represents a 2-dimensional area which is used by +Graphics, the graphics window server, and the text window server to define +regions of the display which need to be updated, or regions within which all +operations must occur. + +A TRegion is defined in terms of an array of TRects and the more complex the +region, the more TRects are required to represent it. + +A clipping region initially has space allocated for five rectangles. +If manipulations result in a region which requires more than this, an attempt +is made to allocate more rectangles. If this cannot be done, an error flag +is set, and all subsequent operations involving the region have no effect +(except possibly to propagate the error flag to other regions). +The CheckError() member function allows +the error flag to be tested; Clear() can be used to clear it. + +The redraw logic of application programs may use the TRegion in various ways: + +1. minimally, they pass it to the graphics context as the clipping region; when + a graphics context is activated to a window, the clipping region is set up + automatically + +2. if they wish to avoid redrawing objects which are outside the general area + of the region, they may use TRegion::BoundingRect() to return the rectangle + which bounds the clipping region, and draw only primitives that lie within + that rectangle + +3. if they wish to exercise finer control, they may extract the individual rectangles + that comprise the clipping region using Operator[](). + +Application programs may also manipulate clipping regions in order to constrain +parts of their redrawing to narrower areas of the screen than the clipping +region offered by the window server. To do this, functions that allow clipping +region manipulation may be used; for example, adding or removing rectangles +or finding the intersection or union of two regions. +*/ +class TRegion + { +public: + inline TInt Count() const; + inline const TRect* RectangleList() const; + inline TBool CheckError() const; + IMPORT_C TBool IsEmpty() const; + IMPORT_C TRect BoundingRect() const; + IMPORT_C const TRect& operator[](TInt aIndex) const; + IMPORT_C void Copy(const TRegion& aRegion); + IMPORT_C void AddRect(const TRect& aRect); + IMPORT_C void SubRect(const TRect& aRect,TRegion* aSubtractedRegion=NULL); + IMPORT_C void Offset(TInt aXoffset,TInt aYoffset); + IMPORT_C void Offset(const TPoint& aOffset); + IMPORT_C void Union(const TRegion& aRegion); + IMPORT_C void Intersection(const TRegion& aRegion,const TRegion& aRegion2); + IMPORT_C void Intersect(const TRegion& aRegion); + IMPORT_C void SubRegion(const TRegion& aRegion,TRegion* aSubtractedRegion=NULL); + IMPORT_C void ClipRect(const TRect& aRect); + IMPORT_C void Clear(); + IMPORT_C void Tidy(); + IMPORT_C TInt Sort(); + IMPORT_C TInt Sort(const TPoint& aOffset); + IMPORT_C void ForceError(); + IMPORT_C TBool IsContainedBy(const TRect& aRect) const; + IMPORT_C TBool Contains(const TPoint& aPoint) const; + IMPORT_C TBool Intersects(const TRect& aRect) const; +protected: + IMPORT_C TRect* RectangleListW(); + IMPORT_C TRegion(TInt aAllocedRects); + inline TRegion(); + TBool SetListSize(TInt aCount); + void AppendRect(const TRect& aRect); + void DeleteRect(TRect* aRect); + void AppendRegion(TRegion& aRegion); +protected: + TInt iCount; + TBool iError; + TInt iAllocedRects; +protected: + enum {ERRegionBuf=0x40000000}; + }; + + + + +/** +@publishedAll +@released + +Expandable region. + +This class provides for the construction and destruction of a TRegion, including +a granularity for expanding the region. A region;s granularity represents +the number of memory slots allocated when the object is created, and the number +of new memory slots allocated each time an RRegion is expanded beyond the +number of free slots. The default granularity is five. +*/ +class RRegion : public TRegion + { +private: + enum {EDefaultGranularity=5}; +protected: + IMPORT_C RRegion(TInt aBuf,TInt aGran); +public: + IMPORT_C RRegion(); + IMPORT_C RRegion(TInt aGran); + IMPORT_C RRegion(const RRegion& aRegion); + IMPORT_C RRegion(const TRect& aRect,TInt aGran=EDefaultGranularity); + IMPORT_C RRegion(TInt aCount,TRect* aRectangleList,TInt aGran=EDefaultGranularity); + IMPORT_C void Close(); + IMPORT_C void Destroy(); + inline TInt CheckSpare() const; +private: + TInt iGranularity; + TRect* iRectangleList; + friend class TRegion; + }; + + + + +/** +@publishedAll +@released + +Region with pre-allocated buffer. + +This class provides the functionality of an RRegion, but in addition, for +optimisation purposes, uses a buffer containing pre-allocated space for as +many rectangles as are specified in the granularity. + +When this buffer is full, cell allocation takes place as for an RRegion, and +the RRegionBuf effectively becomes an RRegion. In this case, the region does +not revert to using the buffer, even if the region were to shrink so that +the buffer could, once again, contain the region. When the region is no longer +required, call Close(), defined in the base class RRegion, to free up all +memory. +*/ +template +class RRegionBuf : public RRegion + { +public: + inline RRegionBuf(); + inline RRegionBuf(const RRegion& aRegion); + inline RRegionBuf(const RRegionBuf& aRegion); + inline RRegionBuf(const TRect& aRect); +private: + TInt8 iRectangleBuf[S*sizeof(TRect)]; + }; + + + + +/** +@publishedAll +@released + +A fixed size region. + +The region consists of a fixed number of rectangles; this number is specified +in the templated argument. The region cannot be expanded to contain more than +this number of rectangles. If an attempt is made to do so, the region's +error flag is set, and the region is cleared. + +Note that when adding a rectangle to a region, if that rectangle overlaps +an existing rectangle, the operation causes more than one rectangle to be +created. +*/ +template +class TRegionFix : public TRegion + { +public: + inline TRegionFix(); + inline TRegionFix(const TRect& aRect); + inline TRegionFix(const TRegionFix& aRegion); +private: + TInt8 iRectangleBuf[S*sizeof(TRect)]; + }; + + + + +/** +@publishedAll +@released + +Base class for searching for global kernel objects. + +This is the base class for a number of classes which are used to find specific +types of global kernel object such as semaphores, threads and mutexes; +TFindSemaphore, TFindThread and TFindMutex are typical examples of such +derived classes. + +The class implements the common behaviour, specifically, the storage of the +match pattern which is used to search for object names. + +This class is not intended to be explicitly instantiated; it has public +constructors but they are part of the class implementation and are described +for information only. +*/ +class TFindHandleBase : public TFindHandle + { +public: + IMPORT_C TFindHandleBase(); + IMPORT_C TFindHandleBase(const TDesC& aMatch); + IMPORT_C void Find(const TDesC& aMatch); +protected: + TInt NextObject(TFullName& aResult,TInt aObjectType); +private: + + /** + The full name of the last kernel side object found. + */ + TFullName iMatch; + }; + + + + +/** +@publishedAll +@released + +Finds all global semaphores whose full names match a specified pattern. + +The match pattern can be set into the TFindSemaphore object at construction; +it can also be changed at any time after construction by using the Find() +member function of the TFindHandleBase base class. + +After construction, the Next() member function can be used repeatedly to find +successive global semaphores whose full names match the current pattern. + +A successful call to Next() means that a matching global semaphore has been +found. To open a handle on this semaphore, call the RSemaphore::Open() function +and pass a reference to this TFindSemaphore. + +Pattern matching is part of descriptor behaviour. + +@see TFindHandleBase::Find +@see TFindSemaphore::Next +@see RSemaphore::Open +@see TDesC16::Match +@see TDesC8::Match +*/ +class TFindSemaphore : public TFindHandleBase + { +public: + inline TFindSemaphore(); + inline TFindSemaphore(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + + +/** +@publishedAll +@released + +Finds all global mutexes whose full names match a specified pattern. + +The match pattern can be set into the object at construction; it can also +be changed at any time after construction by using the Find() member function +of the base class. + +After construction, the Next() member function may be used repeatedly to find +successive global mutexes whose full names match the current pattern. + +A successful call to Next() means that a matching global mutex has been found. +To open a handle on this mutex, call the Open() member function of RMutex +and pass a reference to this TFindMutex object. + +Pattern matching is part of descriptors behaviour. + +@see TFindHandleBase::Find +@see TFindMutex::Next +@see RMutex::Open +@see TDesC16::Match +@see TDesC8::Match +*/ +class TFindMutex : public TFindHandleBase + { +public: + inline TFindMutex(); + inline TFindMutex(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + + +/** +@publishedAll +@released + +Searches for all global chunks by pattern matching against the names of (Kernel +side) chunk objects. + +The match pattern can be set into this object at construction; it can also +be changed at any time after construction by using TFindHandleBase::Find(). + +After construction, call TFindChunk::Next() repeatedly to find successive +chunks whose names match the current pattern. A successful call +to TFindChunk::Next() means that a matching chunk has been found. + +@see TFindHandleBase +*/ +class TFindChunk : public TFindHandleBase + { +public: + inline TFindChunk(); + inline TFindChunk(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + + + +/** +@publishedAll +@released + +Searches for threads by pattern matching against the names +of thread objects. + +The match pattern can be set into this object at construction; it can also be +changed at any time after construction by using TFindHandleBase::Find(). + +After construction, call TFindThread::Next() repeatedly to find successive +threads whose names match the current pattern. +A successful call to TFindThread::Next() means that a matching thread has +been found. To open a handle on this thread, call RThread::Open() and pass +a reference to this TFindThread. + +@see RThread +*/ +class TFindThread : public TFindHandleBase + { +public: + inline TFindThread(); + inline TFindThread(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + + +/** +@publishedAll +@released + +Searches for processes by pattern matching against the names +of process objects. + +The match pattern can be set into this object at construction; it can also be +changed at any time after construction by using TFindHandleBase::Find(). + +After construction, call TFindProcess::Next() repeatedly to find successive +processes whose names match the current pattern. +A successful call to TFindProcess::Next() means that a matching process has +been found. To open a handle on this process, call RProcess::Open() and pass +a reference to this TFindProcess. + +@see RProcess +*/ +class TFindProcess : public TFindHandleBase + { +public: + inline TFindProcess(); + inline TFindProcess(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + +/** +@publishedAll +@released + +Searches for LDD factory objects by pattern matching against the names of + LDD factory objects. + +An LDD factory object is an instance of a DLogicalDevice derived class. + +The match pattern can be set into this object at construction; it can also +be changed at any time after construction by using TFindHandleBase::Find(). + +After construction, call TFindLogicalDevice::Next() repeatedly to find successive +LDD factory objects whose names match the current pattern. A successful call to +TFindLogicalDevice::Next() means that a matching LDD factory object has been found. + +The name of an LDD factory object is set by its Install() member function as +part of the construction process. +*/ +class TFindLogicalDevice : public TFindHandleBase + { +public: + inline TFindLogicalDevice(); + inline TFindLogicalDevice(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + +/** +@publishedAll +@released + +Searches for PDD factory objects by pattern matching against the names of +PDD factory objects. + +A PDD factory object is an instance of a DPhysicalDevice derived class. + +The match pattern can be set into this object at construction; it can also be +changed at any time after construction by using TFindHandleBase::Find(). + +After construction, call TFindPhysicalDevice::Next() repeatedly to find successive +PDD factory objects whose names match the current pattern. A successful call to +TFindPhysicalDevice::Next() means that a matching PDD factory object has been found. + +The name of a PDD factory object is set by its Install() member function as part +of the construction process. +*/ +class TFindPhysicalDevice : public TFindHandleBase + { +public: + inline TFindPhysicalDevice(); + inline TFindPhysicalDevice(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + + + +/** +@publishedAll +@released + +Searches for servers by pattern matching against the names of kernel side +server objects. + +The match pattern can be set into this object at construction; it can also +be changed at any time after construction by using the TFindHandleBase::Find() +base class. + +After construction, call TFindServer::Next() repeatedly to find successive +servers whose names match the current pattern. +A successful call to TFindServer::Next() means that a matching server +has been found. +*/ +class TFindServer : public TFindHandleBase + { +public: + inline TFindServer(); + inline TFindServer(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + + +/** +@publishedAll +@released + +Searches for DLLs whose full names match a specified pattern. + +The match pattern is set at construction but can also be changed at any time +after construction by using TFindHandleBase::Find(). + +After construction, use TFindLibrary::Next() to repeatedly find successive DLLs +whose names match the current pattern. A successful call to +TFindLibrary::Next() means that a matching DLL has been found. +*/ +class TFindLibrary : public TFindHandleBase + { +public: + inline TFindLibrary(); + inline TFindLibrary(const TDesC& aMatch); + IMPORT_C TInt Next(TFullName& aResult); + }; + + + +/** +@publishedAll +@released + +User side handle to an LDD factory object, an instance of a DLogicalDevice +derived class. + +The LDD factory object is a Kernel side object which is constructed on the +Kernel heap when the logical device is opened using User::LoadLogicalDevice(). +The handle allows the User side to get information about the logical device. + +To use the device, a thread must create and use an instance of an +RBusLogicalChannel derived class. + +*/ +class RDevice : public RHandleBase + { +public: + inline TInt Open(const TFindLogicalDevice& aFind,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess); + IMPORT_C void GetCaps(TDes8& aDes) const; + IMPORT_C TBool QueryVersionSupported(const TVersion& aVer) const; + IMPORT_C TBool IsAvailable(TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo) const; + }; + +/** +@publishedAll +@released + +Asynchronous timer services. + +Five types of asynchronous request are supported by the class: + +1. Requesting an event after a specified interval + +2. Requesting an event at a specified system time + +3. Requesting a timer event on a specific second fraction + +4. Requesting an event if an interval elapses with no user activity. + +5. Requesting an event after a specified interval, to a resolution of 1ms. + +Each of these requests can be cancelled. + +The timer exists from its creation, following a call to RTimer::CreateLocal(), +until it is destroyed by a call to the Close() member function of the base +class RHandleBase. + +This class is ultimately implemented in terms of the nanokernel tick, and +therefore the granularity of the generated events is limited to the period of +this timer. This is variant specific, but is usually 1 millisecond. + +Note that the CTimer active object uses an RTimer. +*/ +class RTimer : public RHandleBase + { +public: + IMPORT_C TInt CreateLocal(); + IMPORT_C void Cancel(); + IMPORT_C void After(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval); + IMPORT_C void AfterTicks(TRequestStatus &aStatus, TInt aTicks); + IMPORT_C void At(TRequestStatus& aStatus,const TTime& aTime); + IMPORT_C void AtUTC(TRequestStatus& aStatus,const TTime& aUTCTime); + IMPORT_C void Lock(TRequestStatus& aStatus,TTimerLockSpec aLock); + IMPORT_C void Inactivity(TRequestStatus& aStatus, TTimeIntervalSeconds aSeconds); + IMPORT_C void HighRes(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval); + }; + + + + +/** +@publishedAll +@released + +A handle to a dynamically loadable DLL. + +The class is not intended for user derivation. +*/ +class RLibrary : public RHandleBase + { +public: + IMPORT_C void Close(); + IMPORT_C TInt Load(const TDesC& aFileName, const TUidType& aType); + IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath=KNullDesC); + IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType); + IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion); + IMPORT_C TInt LoadRomLibrary(const TDesC& aFileName, const TDesC& aPath); + IMPORT_C TLibraryFunction Lookup(TInt anOrdinal) const; + IMPORT_C TUidType Type() const; + IMPORT_C TFileName FileName() const; + IMPORT_C TInt GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize); + IMPORT_C TInt Init(); /**< @internalTechnology */ +public: + /** + Class representing information about an executable binary, (DLL or EXE). + @internalTechnology + */ + struct TInfo + { + TUint32 iModuleVersion; /**< Version number */ + TUidType iUids; /**< UIDs */ + TSecurityInfo iSecurityInfo; /**< Security Info */ + }; + + /** + Class representing information about an executable binary, (DLL or EXE), version 2. + @internalTechnology + */ + struct TInfoV2 : public TInfo + { + TUint8 iHardwareFloatingPoint; /**< Which hardware floating point used, from TFloatingPointType */ + enum TDebugAttributes + { + EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged. + ETraceAllowed = 1<<1 ///< Flags set if executable may be traced. + }; + TUint8 iDebugAttributes; ///< Bitmask of values from enum TDebugAttributes + TUint8 iSpare[6]; + }; + + /** + Type representing a TInfo struct packaged as a descriptor. + @internalTechnology + */ + typedef TPckgBuf TInfoBuf; + + /** + Type representing a TInfo struct packaged as a descriptor, version 2. + @internalTechnology + */ + typedef TPckgBuf TInfoBufV2; + + /** + @internalTechnology + */ + enum TRequiredImageHeaderSize + { +#ifdef __WINS__ + /** + Size of header data which should be passed to GetInfoFromHeader() + */ + KRequiredImageHeaderSize = KMaxTInt +#else + KRequiredImageHeaderSize = 9*1024 +#endif + }; + + IMPORT_C static TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf); + + /** + @internalTechnology + @deprecated Use TInfo + */ + struct SInfo + { + TUint32 iModuleVersion; + TUidType iUids; + SSecurityInfo iS; + }; + + /** + @internalTechnology + @deprecated Use TInfoBuf + */ + typedef TPckgBuf SInfoBuf; + + /** + @internalTechnology + */ + IMPORT_C static TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf); +private: + TInt InitL(); + }; + + + + +/** +@publishedAll +@released + +A handle to a critical section. + +A critical section itself is a kernel object, and is implemented using +a semaphore. The class RCriticalSection inherits privately from RSemaphore +as a matter of implementation and this is, in effect, equivalent to using +a semaphore. + +The public functions of RSemaphore are not part of the public API of this +class. + +As with all handles, they should be closed after use. This class provides +the necessary Close() function, which should be called when the handle is +no longer required. + +@see RHandleBase::Close +*/ +class RCriticalSection : private RSemaphore + { +public: + IMPORT_C RCriticalSection(); + IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess); + IMPORT_C void Close(); + IMPORT_C void Wait(); + IMPORT_C void Signal(); + inline TBool IsBlocked() const; +private: + TInt iBlocked; + }; + + + +/** +@publishedAll +@released + +A handle to a mutex. + +The mutex itself is a kernel side object. + +Handles should be closed after use. RHandleBase provides the necessary Close() +function which should be called when the handle is no longer required. + +@see RHandleBase::Close +*/ +class RMutex : public RHandleBase + { +public: + inline TInt Open(const TFindMutex& aFind,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt OpenGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess); + IMPORT_C void Wait(); + IMPORT_C void Signal(); + IMPORT_C TBool IsHeld(); + }; + + + +/** +@publishedAll +@released + +A handle to a condition variable. + +The condition variable itself is a kernel side object. + +Handles should be closed after use. RHandleBase provides the necessary Close() +function which should be called when the handle is no longer required. + +@see RHandleBase::Close +*/ +class RCondVar : public RHandleBase + { +public: + IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt OpenGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(RMessagePtr2 aMessage, TInt aParam, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Wait(RMutex& aMutex); + IMPORT_C TInt TimedWait(RMutex& aMutex, TInt aTimeout); // timeout in microseconds + IMPORT_C void Signal(); + IMPORT_C void Broadcast(); + }; + + + +class UserHeap; +class TChunkCreate; +struct TChunkCreateInfo; +/** +@publishedAll +@released + +A handle to a chunk. + +The chunk itself is a kernel side object. +*/ +class RChunk : public RHandleBase + { +public: + /** + @internalComponent + */ + enum TAttribs + { + ENormal=0x00, + EDoubleEnded=0x01, + EDisconnected=0x02, + ELocal=0x00, + EGlobal=0x10, + EData=0x00, + ECode=0x20, + }; + + /** + Set of flags used by SetRestrictions(). + + @see RChunk::SetRestrictions + */ + enum TRestrictions + { + EPreventAdjust = 0x01, // Prevent Adjust, Commit, Allocate and Decommit + }; +public: + inline TInt Open(const TFindChunk& aFind,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateLocal(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateLocalCode(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateGlobal(const TDesC& aName,TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateDoubleEndedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateDoubleEndedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateDisconnectedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt CreateDisconnectedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Create(TChunkCreateInfo& aCreateInfo); + IMPORT_C TInt SetRestrictions(TUint aFlags); + IMPORT_C TInt OpenGlobal(const TDesC& aName,TBool isReadOnly,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TBool isReadOnly,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Adjust(TInt aNewSize) const; + IMPORT_C TInt AdjustDoubleEnded(TInt aBottom, TInt aTop) const; + IMPORT_C TInt Commit(TInt anOffset, TInt aSize) const; + IMPORT_C TInt Allocate(TInt aSize) const; + IMPORT_C TInt Decommit(TInt anOffset, TInt aSize) const; + IMPORT_C TInt Unlock(TInt aOffset, TInt aSize); /**< @internalTechnology */ + IMPORT_C TInt Lock(TInt aOffset, TInt aSize); /**< @internalTechnology */ + IMPORT_C TUint8* Base() const; + IMPORT_C TInt Size() const; + IMPORT_C TInt Bottom() const; + IMPORT_C TInt Top() const; + IMPORT_C TInt MaxSize() const; + inline TBool IsReadable() const; + inline TBool IsWritable() const; +private: + friend class UserHeap; + }; + + +/** +This structure specifies the type and properties of the chunk to be created. It +is passed as a parameter to the RChunk::Create() method. + +@publishedAll +@released +*/ +struct TChunkCreateInfo + { +public : + /** + Currently supported version numbers + @internalComponent + */ + enum TChunkCreateVersions + { + EVersion0, + ESupportedVersions, + }; + + friend class RChunk; + + IMPORT_C TChunkCreateInfo(); + IMPORT_C void SetNormal(TInt aInitialSize, TInt aMaxSize); + IMPORT_C void SetCode(TInt aInitialSize, TInt aMaxSize); + IMPORT_C void SetDoubleEnded(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize); + IMPORT_C void SetDisconnected(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize); + IMPORT_C void SetOwner(TOwnerType aType); + IMPORT_C void SetGlobal(const TDesC& aName); + IMPORT_C void SetClearByte(TUint8 aClearByte); + void SetThreadHeap(TInt aInitialSize, TInt aMaxSize, const TDesC& aName); + +protected : + /** The version number of this TChunkCreateInfo. + @internalComponent + */ + TUint iVersionNumber; + /** The type of the chunk to be created. + @internalComponent + */ + TUint iType; + /** Specify if chunk is global or not. + @internalComponent + */ + TBool iGlobal; + /** The maximum size in bytes of the chunk to be created. + @internalComponent + */ + TInt iMaxSize; + /** An enumeration whose enumerators define the ownership of this chunk + handle. If not explicitly specified, EOwnerProcess is taken as default. + @internalComponent + */ + TOwnerType iOwnerType; + /** A pointer to a descriptor containing the name to be assigned to + global chunks. The length of the descriptor must be no greater than + that allowed for a TKName type. Must be NULL for local chunks. + @internalComponent + */ + const TDesC* iName; + /** The offset of the bottom of the region to commit to the chunk on + creation from the base of the chunk's reserved region. + This is only used for double ended and disconnected chunks. + @internalComponent + */ + TInt iInitialBottom; + /** The offset of the top of the region to commit to the chunk on + creation from the base of the chunk's reserved region. + This is only used for double ended and disconnected chunks. + @internalComponent + */ + TInt iInitialTop; + /** Attributes to the chunk to be created should have. + Should be set from one or more the values in TChunkCreateAttributes. + @internalComponent + */ + TUint iAttributes; + /** The byte to clear all the memory committed to the chunk to. + @internalComponent + */ + TUint8 iClearByte; + /** @internalComponent*/ + TUint8 iSpare1[3]; + /** @internalComponent*/ + TUint iSpare2; + }; + + +struct SStdEpocThreadCreateInfo; +/** +@publishedAll +@released + +A set of static functions for constructing fixed length heaps and local or +global heaps. + +@see RHeap +@see RChunk +*/ +class UserHeap + { +public: + enum TChunkHeapCreateMode {EChunkHeapSwitchTo=1, EChunkHeapDuplicate=2}; + IMPORT_C static RHeap* FixedHeap(TAny* aBase, TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue); + IMPORT_C static RHeap* ChunkHeap(const TDesC* aName, TInt aMinLength, TInt aMaxLength, TInt aGrowBy=1, TInt aAlign=0, TBool aSingleThread=EFalse); + IMPORT_C static RHeap* ChunkHeap(RChunk aChunk, TInt aMinLength, TInt aGrowBy=1, TInt aMaxLength=0, TInt aAlign=0, TBool aSingleThread=EFalse, TUint32 aMode=0); + IMPORT_C static RHeap* OffsetChunkHeap(RChunk aChunk, TInt aMinLength, TInt aOffset, TInt aGrowBy=1, TInt aMaxLength=0, TInt aAlign=0, TBool aSingleThread=EFalse, TUint32 aMode=0); + IMPORT_C static TInt SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo); + IMPORT_C static TInt CreateThreadHeap(SStdEpocThreadCreateInfo& aInfo, RHeap*& aHeap, TInt aAlign=0, TBool aSingleThread=EFalse); + }; + + + + +/** +@publishedAll +@released + +Encapsulates the Id of a kernel object. +*/ +class TObjectId + { +public: + inline TObjectId(); + inline TObjectId(TUint64 anId); + inline TUint64 Id() const; + inline operator TUint() const; + inline TBool operator==(TObjectId aId) const; + inline TBool operator!=(TObjectId aId) const; +private: + TUint64 iId; + }; + + + + +/** +@publishedAll +@released + +Encapsulates the Id of a thread. + +An object of this type is not explicitly constructed in open code, +but is returned by the Id() member function of a thread handle, +an RThread type. + +@see RThread +*/ +class TThreadId : public TObjectId + { +public: + inline TThreadId(); + inline TThreadId(TUint64 anId); + }; + + + + +class RProcess; + + +/** +@publishedAll +@released + +A handle to a thread. + +The thread itself is a kernel object. +*/ +class RThread : public RHandleBase + { +public: + inline RThread(); + IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, TInt aHeapMinSize, TInt aHeapMaxSize, TAny *aPtr, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, RAllocator* aHeap, TAny* aPtr, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(const TDesC& aFullName, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TThreadId aID, TOwnerType aType=EOwnerProcess); + IMPORT_C TThreadId Id() const; + IMPORT_C void Resume() const; + IMPORT_C void Suspend() const; + /** + @publishedAll + @deprecated Use User::RenameThread() instead + */ + inline static TInt RenameMe(const TDesC& aName); + + IMPORT_C void Kill(TInt aReason); + IMPORT_C void Terminate(TInt aReason); + IMPORT_C void Panic(const TDesC& aCategory,TInt aReason); + IMPORT_C TInt Process(RProcess& aProcess) const; + IMPORT_C TThreadPriority Priority() const; + IMPORT_C void SetPriority(TThreadPriority aPriority) const; + IMPORT_C TProcessPriority ProcessPriority() const; + IMPORT_C void SetProcessPriority(TProcessPriority aPriority) const; + IMPORT_C TInt RequestCount() const; + IMPORT_C TExitType ExitType() const; + IMPORT_C TInt ExitReason() const; + IMPORT_C TExitCategoryName ExitCategory() const; + IMPORT_C void RequestComplete(TRequestStatus*& aStatus,TInt aReason) const; + IMPORT_C void RequestSignal() const; + IMPORT_C void Logon(TRequestStatus& aStatus) const; + IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const; + IMPORT_C void HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const; + IMPORT_C void Context(TDes8& aDes) const; + IMPORT_C TInt StackInfo(TThreadStackInfo& aInfo) const; + IMPORT_C TInt GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime) const; + inline TInt Open(const TFindThread& aFind,TOwnerType aType=EOwnerProcess); + IMPORT_C void Rendezvous(TRequestStatus& aStatus) const; + IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const; + IMPORT_C static void Rendezvous(TInt aReason); + + /** + Return the Secure ID of the process to which the thread belongs. + + If an intended use of this method is to check that the Secure ID is + a given value, then the use of a TSecurityPolicy object should be + considered. E.g. Instead of something like: + + @code + RThread& thread; + TInt error = thread.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied; + @endcode + + this could be used; + + @code + RThread& thread; + static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId); + TBool pass = mySidPolicy().CheckPolicy(thread); + @endcode + + This has the benefit that the TSecurityPolicy::CheckPolicy methods are + configured by the system wide Platform Security configuration. I.e. are + capable of emitting diagnostic messages when a check fails and/or the + check can be forced to always pass. + + @see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const + @see _LIT_SECURITY_POLICY_S0 + + @return The Secure ID. + @publishedAll + @released + */ + IMPORT_C TSecureId SecureId() const; + + /** + Return the Vendor ID of the process to which the thread belongs. + + If an intended use of this method is to check that the Vendor ID is + a given value, then the use of a TSecurityPolicy object should be + considered. E.g. Instead of something like: + + @code + RThread& thread; + TInt error = thread.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied; + @endcode + + this could be used; + + @code + RThread& thread; + static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId); + TBool pass = myVidPolicy().CheckPolicy(thread); + @endcode + + This has the benefit that the TSecurityPolicy::CheckPolicy methods are + configured by the system wide Platform Security configuration. I.e. are + capable of emitting diagnostic messages when a check fails and/or the + check can be forced to always pass. + + @see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const + @see _LIT_SECURITY_POLICY_V0 + + @return The Vendor ID. + @publishedAll + @released + */ + IMPORT_C TVendorId VendorId() const; + + /** + Check if the process to which the thread belongs has a given capability + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability The capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds the capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if the process to which the thread belongs has the capability, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** + Check if the process to which the thread belongs has both of the given capabilities + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability1 The first capability to test. + @param aCapability2 The second capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds a capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if the process to which the thread belongs has both the capabilities, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** Function only temporarily supported to aid migration to process emulation... + + @publishedAll + @deprecated Use process emulation instead + */ + inline TInt Create(const TDesC& aName,TThreadFunction aFunction,TInt aStackSize,TAny* aPtr,RLibrary* aLibrary,RHeap* aHeap, TInt aHeapMinSize,TInt aHeapMaxSize,TOwnerType aType); + +private: + // Implementations of functions with diagnostics + IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const; + }; + +/** +@publishedAll +@deprecated +*/ +inline TInt RThread::Create(const TDesC& /*aName*/,TThreadFunction /*aFunction*/,TInt /*aStackSize*/,TAny* /*aPtr*/,RLibrary* /*aLibrary*/,RHeap* /*aHeap*/, TInt /*aHeapMinSize*/,TInt /*aHeapMaxSize*/,TOwnerType /*aType*/) + {return KErrNotSupported; } + + + +/** +@publishedAll +@released + +Encapsulates the Id of a process. + +An object of this type is not explicitly constructed in open code, +but is returned by the Id() member function of a process handle, +an RProcess type. + +@see RProcess +*/ +class TProcessId : public TObjectId + { +public: + inline TProcessId(); + inline TProcessId(TUint64 anId); + }; + + + + +class RSubSessionBase; + +/** +@publishedAll +@released + +A handle to a process. + +The process itself is a kernel object. +*/ +class RProcess : public RHandleBase + { +public: + inline RProcess(); + IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,const TUidType &aUidType, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TProcessId aId,TOwnerType aType=EOwnerProcess); + IMPORT_C TUidType Type() const; + IMPORT_C TProcessId Id() const; + /** + @publishedAll + @deprecated Use User::RenameProcess() instead + */ + inline static TInt RenameMe(const TDesC& aName); + + IMPORT_C void Kill(TInt aReason); + IMPORT_C void Terminate(TInt aReason); + IMPORT_C void Panic(const TDesC& aCategory,TInt aReason); + IMPORT_C void Resume(); + IMPORT_C TFileName FileName() const; + IMPORT_C TExitType ExitType() const; + IMPORT_C TInt ExitReason() const; + IMPORT_C TExitCategoryName ExitCategory() const; + IMPORT_C TProcessPriority Priority() const; + IMPORT_C void SetPriority(TProcessPriority aPriority) const; + IMPORT_C TBool JustInTime() const; + IMPORT_C void SetJustInTime(TBool aBoolean) const; + IMPORT_C void Logon(TRequestStatus& aStatus) const; + IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const; + IMPORT_C TInt GetMemoryInfo(TModuleMemoryInfo& aInfo) const; + inline TInt Open(const TFindProcess& aFind,TOwnerType aType=EOwnerProcess); + IMPORT_C void Rendezvous(TRequestStatus& aStatus) const; + IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const; + IMPORT_C static void Rendezvous(TInt aReason); + + /** + Return the Secure ID of the process. + + If an intended use of this method is to check that the Secure ID is + a given value, then the use of a TSecurityPolicy object should be + considered. E.g. Instead of something like: + + @code + RProcess& process; + TInt error = process.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied; + @endcode + + this could be used; + + @code + RProcess& process; + static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId); + TBool pass = mySidPolicy().CheckPolicy(process); + @endcode + + This has the benefit that the TSecurityPolicy::CheckPolicy methods are + configured by the system wide Platform Security configuration. I.e. are + capable of emitting diagnostic messages when a check fails and/or the + check can be forced to always pass. + + @see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const + @see _LIT_SECURITY_POLICY_S0 + + @return The Secure ID. + @publishedAll + @released + */ + IMPORT_C TSecureId SecureId() const; + + /** + Return the Vendor ID of the process. + + If an intended use of this method is to check that the Vendor ID is + a given value, then the use of a TSecurityPolicy object should be + considered. E.g. Instead of something like: + + @code + RProcess& process; + TInt error = process.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied; + @endcode + + this could be used; + + @code + RProcess& process; + static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId); + TBool pass = myVidPolicy().CheckPolicy(process); + @endcode + + This has the benefit that the TSecurityPolicy::CheckPolicy methods are + configured by the system wide Platform Security configuration. I.e. are + capable of emitting diagnostic messages when a check fails and/or the + check can be forced to always pass. + + @see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const + @see _LIT_SECURITY_POLICY_V0 + + @return The Vendor ID. + @publishedAll + @released + */ + IMPORT_C TVendorId VendorId() const; + + /** + Check if the process has a given capability + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability The capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds the capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if the process has the capability, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** + Check if the process has both of the given capabilities + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability1 The first capability to test. + @param aCapability2 The second capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds a capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if the process has both the capabilities, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const; +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const; +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const; +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + IMPORT_C TInt SetParameter(TInt aIndex, RHandleBase aHandle); + IMPORT_C TInt SetParameter(TInt aSlot, const RSubSessionBase& aSession); + IMPORT_C TInt SetParameter(TInt aSlot, const TDesC16& aDes); + IMPORT_C TInt SetParameter(TInt aSlot, const TDesC8& aDes); + IMPORT_C TInt SetParameter(TInt aSlot, TInt aData); + inline RProcess(TInt aHandle); + + /** + @deprecated Use RProcess::SecureId() instead + */ + inline TUid Identity() const { return SecureId(); } + + /** + Legacy Platform Security development and migration support + @internalAll + @deprecated No replacement + */ + enum TSecureApi { ESecureApiOff, ESecureApiOn, ESecureApiQuery }; // __SECURE_API__ remove this + + /** + Legacy Platform Security development and migration support + @internalAll + @deprecated No replacement + */ + IMPORT_C TInt SecureApi(TInt aState); // __SECURE_API__ remove this + + /** + Legacy Platform Security development and migration support + @internalAll + @deprecated No replacement + */ + enum TDataCaging { EDataCagingOff, EDataCagingOn, EDataCagingQuery}; // __DATA_CAGING__ __SECURE_API__ remove this + + /** + Legacy Platform Security development and migration support + @internalAll + @deprecated No replacement + */ + IMPORT_C TInt DataCaging(TInt aState); // __DATA_CAGING__ __SECURE_API__ remove this + + + IMPORT_C TInt CreateWithStackOverride(const TDesC& aFileName,const TDesC& aCommand, const TUidType &aUidType, TInt aMinStackSize, TOwnerType aType); + + IMPORT_C static TAny* ExeExportData(void); + +private: + // Implementations of functions with diagnostics + IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const; + IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const; + }; + + + + + + + + + +/** +@internalTechnology +*/ +class RServer2 : public RHandleBase + { +public: + IMPORT_C TInt CreateGlobal(const TDesC& aName); + IMPORT_C TInt CreateGlobal(const TDesC& aName, TInt aMode); + IMPORT_C void Receive(RMessage2& aMessage,TRequestStatus& aStatus); + IMPORT_C void Receive(RMessage2& aMessage); + IMPORT_C void Cancel(); + }; + + + + +/** +@publishedAll +@released + +Client-side handle to a session with a server. + +This is the client-side interface through which communication with the server +is channelled. + +Clients normally define and implement a derived class to provide +a richer interface. +*/ +class RSessionBase : public RHandleBase + { + friend class RSubSessionBase; +public: + /** + Indicates whether or not threads in the process are automatically attached + to the session when passed as a parameter to the Share() function. + */ + enum TAttachMode {EExplicitAttach,EAutoAttach}; +public: + /** + Creates a session that can be shared by other threads in the current + process. + + After calling this function the session object may be used by threads other + than than the one that created it. + + Note that this can only be done with servers that mark their sessions + as sharable. + + @return KErrNone, if the session is successfully shared; + KErrNoMmemory, if the attempt fails for lack of memory. + + @panic KERN-EXEC 23 The session cannot be shared. + + @see CServer2 + @see RSessionBase::ShareProtected() + @see CServer2::TServerType + */ + inline TInt ShareAuto() { return DoShare(EAutoAttach); } + + + /** + Creates a session handle that can be be passed via IPC to another process + as well as being shared by other threads in the current process. + + After calling this function the session object may be used by threads other + than than the one that created it. + + Note that this can only be done with servers that mark their sessions + as globally sharable. + + @return KErrNone, if the session is successfully shared; + KErrNoMmemory, if the attempt fails for lack of memory. + + @panic KERN-EXEC 23 The session cannot be shared. + + @see CServer2 + @see RSessionBase::ShareAuto() + @see CServer2::TServerType + */ + inline TInt ShareProtected() { return DoShare(EAutoAttach|KCreateProtectedObject); } + + + IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,const TSecurityPolicy& aServerPolicy,TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess); + IMPORT_C TInt Open(TInt aArgumentIndex, const TSecurityPolicy& aServerPolicy, TOwnerType aType=EOwnerProcess); + inline TInt SetReturnedHandle(TInt aHandleOrError); + IMPORT_C TInt SetReturnedHandle(TInt aHandleOrError,const TSecurityPolicy& aServerPolicy); +protected: + inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion); + IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots); + IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0); + inline TInt CreateSession(RServer2 aServer,const TVersion& aVersion); + IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots); + IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0); + inline static TInt SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle); + + /** + @deprecated Use CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0); + */ + inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TRequestStatus* aStatus) + { return CreateSession(aServer, aVersion, aAsyncMessageSlots, EIpcSession_Unsharable, (TSecurityPolicy*)0, aStatus); } + inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const; + inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const; + inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const; + inline TInt Send(TInt aFunction) const; + inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const; + inline TInt SendReceive(TInt aFunction) const; +private: + IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const; + IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const; + IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const; + TInt SendAsync(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus* aStatus) const; + TInt SendSync(TInt aFunction,const TIpcArgs* aArgs) const; + IMPORT_C TInt DoShare(TInt aAttachMode); + TInt DoConnect(const TVersion &aVersion,TRequestStatus* aStatus); + }; + + + + +/** +@publishedAll +@released + +Client-side handle to a sub-session. + +It represents a client-side sub-session, and has a corresponding sub-session +object on the server-side. + +Clients normally define and implement a derived class to provide a richer +interface. In particular, a derived class should: + +1. provide a function to create a new sub-session with the server; + this should call CreateSubSession(). + +2. provide a function to close the current sub-session; + this should call CloseSubSession(). + +A session must already exist with a server before a client can establish +any sub-sessions. +*/ +class RSubSessionBase + { +public: + inline TInt SubSessionHandle() const; +protected: + inline RSubSessionBase(); + IMPORT_C const RSessionBase Session() const; + inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs); + inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction); + IMPORT_C TInt CreateAutoCloseSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs); + IMPORT_C void CloseSubSession(TInt aFunction); + inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const; + inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const; + inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const; + inline TInt Send(TInt aFunction) const; + inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const; + inline TInt SendReceive(TInt aFunction) const; +private: + IMPORT_C TInt DoCreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs); + IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const; + IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const; + IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const; + TInt DoCreateSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs, TBool aAutoClose); +private: + RSessionBase iSession; + TInt iSubSessionHandle; + }; + + + + +/** +@publishedAll +@released + +Base class that provides an implementation for the templated +RRef class. + +@see RRef +*/ +class RRefBase + { +public: + IMPORT_C void Free(); +protected: + inline RRefBase(); + inline RRefBase(const RRefBase& aRef); + IMPORT_C void DoAlloc(const TAny* aPtr,TInt aSize); + IMPORT_C void DoAllocL(const TAny* aPtr,TInt aSize); + IMPORT_C void Copy(const RRefBase& aRef); +private: + IMPORT_C void operator=(const RRefBase& aRef); +protected: + TInt* iPtr; + }; + + + + +/** +@publishedAll +@released + +Contains, or packages, a copy of an instance of another class. + +The template parameter defines the type of the contained object. + +The contained object is held in allocated memory, and can be accessed +through the member selection and dereference operators. +*/ +template +class RRef : public RRefBase + { +public: + inline RRef(); + inline RRef(const RRef& anObject); + inline void operator=(const RRef& anObject); + inline T* operator->(); + inline operator T*(); + inline void Alloc(const T& anObject); + inline void Alloc(const T& anObject,TInt aSize); + inline void AllocL(const T& anObject); + inline void AllocL(const T& anObject,TInt aSize); + }; + + + + +/** +@publishedAll +@released + +A handle to a change notifier. + +The change notifier itself is a kernel object. +*/ +class RChangeNotifier : public RHandleBase + { +public: + IMPORT_C TInt Create(); + IMPORT_C TInt Logon(TRequestStatus& aStatus) const; + IMPORT_C TInt LogonCancel() const; + }; + + + + +/** +@publishedAll +@released + +Handle to a thread death notifier. + +The notifier allows threads to be notified of the death of another thread. + +The thread-death notifier itself is a kernel object. +*/ +class RUndertaker : public RHandleBase + { +public: + IMPORT_C TInt Create(); + IMPORT_C TInt Logon(TRequestStatus& aStatus,TInt& aThreadHandle) const; + IMPORT_C TInt LogonCancel() const; + }; + + + + + +class HBufC16; +/** +@publishedAll +@released + +A handle to a session with the extended notifier server that provides support +for plug-in notifiers. + +The interface allows engines or other low level components +to communicate with the UI. +*/ +class RNotifier : public RSessionBase + { +public: + IMPORT_C RNotifier(); + IMPORT_C TInt Connect(); + IMPORT_C void Close(); + IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer); + IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); + IMPORT_C TInt StartNotifier(TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); + IMPORT_C TInt CancelNotifier(TUid aNotifierUid); + IMPORT_C TInt UpdateNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); + IMPORT_C void UpdateNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); + IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); + IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse); + IMPORT_C TInt UnloadNotifiers(TUid aNotifierUid); + IMPORT_C TInt LoadNotifiers(TUid aNotifierUid); + IMPORT_C void Notify(const TDesC& aLine1,const TDesC& aLine2,const TDesC& aBut1,const TDesC& aBut2,TInt& aButtonVal,TRequestStatus& aStatus); + IMPORT_C void NotifyCancel(); + IMPORT_C TInt InfoPrint(const TDesC& aDes); +private: + TPtr8 iButtonVal; + HBufC16* iCombinedBuffer; + }; + +/** +@publishedAll +@released + +Abstract class that defines a handler to work with the TRAP mechanism. + +Symbian OS provides a trap handler and this class does not normally need to be +used or accessed directly by applications and third party code. +*/ +class TTrapHandler + { +public: + IMPORT_C TTrapHandler(); + + /** + Called when a TRAP is invoked. + */ + IMPORT_C virtual void Trap()=0; + + /** + Called when a function exits a TRAP without leaving. + */ + IMPORT_C virtual void UnTrap()=0; + + /** + Called when a function within a TRAP leaves. + + @param aValue The leave value. + */ + IMPORT_C virtual void Leave(TInt aValue)=0; + }; + + + + +struct TCollationMethod; // forward declaration + + + + +/** +@publishedAll +@released + +Contains a set of static functions which perform manipulation of +data in memory. + +The arguments passed to the functions of this class are pointers to memory +locations and length values. These functions are, therefore, not normally +used in open code but are suitable for implementing data manipulation for +other classes. Typically the interface provided by such classes is typesafe +and hides this direct memory to memory manipulation. +*/ +class Mem + { +public: + inline static TUint8* Copy(TAny* aTrg, const TAny* aSrc, TInt aLength); + inline static TUint8* Move(TAny* aTrg, const TAny* aSrc, TInt aLength); + inline static void Fill(TAny* aTrg, TInt aLength, TChar aChar); + inline static void FillZ(TAny* aTrg, TInt aLength); +#ifndef __GCC32__ + inline static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL); +#else + IMPORT_C static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL); +#endif + + IMPORT_C static TInt Compare(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL); + IMPORT_C static TInt CompareF(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL); + IMPORT_C static TInt CompareF(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL); + IMPORT_C static TInt CompareC(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL); + IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL); + IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL, + TInt aMaxLevel, const TCollationMethod* aCollationMethod); + IMPORT_C static TInt CollationMethods(); + IMPORT_C static TUint CollationMethodId(TInt aIndex); + IMPORT_C static const TCollationMethod* CollationMethodByIndex(TInt aIndex); + IMPORT_C static const TCollationMethod* CollationMethodById(TUint aId); + IMPORT_C static const TCollationMethod* GetDefaultMatchingTable(); + IMPORT_C static void Swap(TAny* aPtr1, TAny* aPtr2, TInt aLength); + IMPORT_C static void Crc(TUint16& aCrc, const TAny* aPtr, TInt aLength); + IMPORT_C static void Crc32(TUint32& aCrc, const TAny* aPtr, TInt aLength); + }; + + + + + +/** +@publishedAll +@released + +Set of static user functions. + +These functions are related to a number of System component APIs. + +The majority of the functions are related to either the current thread, or +its heap. Examples in this category include User::Exit(), which causes the +thread to terminate, and User::Alloc(), which allocates memory from the current +thread's heap. + +Some of these functions are equivalent to functions in the RThread or RHeap +classes. In these cases, the User function is a convenient way to access the +function without first having to get a handle to the current thread. + +Functions are also provided to support debugging of memory leaks. These function +calls can be written explicitly or can be generated using a corresponding +macro - the advantage of using a macro is that the function call is only +generated for debug builds. + +A final category of functions, which includes User::BinarySearch() and User::QuickSort(), +are just useful functions which have no other natural home. + +@see RThread +@see RHeap +*/ +class User : public UserHeap + { +public: + // Execution control + IMPORT_C static void InitProcess(); /**< @internalComponent */ + IMPORT_C static void Exit(TInt aReason); + IMPORT_C static void Panic(const TDesC& aCategory,TInt aReason); + IMPORT_C static void HandleException(TAny* aInfo); /**< @internalComponent */ + // Cleanup support + IMPORT_C static void Leave(TInt aReason); + IMPORT_C static void LeaveNoMemory(); + IMPORT_C static TInt LeaveIfError(TInt aReason); + IMPORT_C static TAny* LeaveIfNull(TAny* aPtr); + IMPORT_C static TTrapHandler* SetTrapHandler(TTrapHandler* aHandler); + IMPORT_C static TTrapHandler* TrapHandler(); + IMPORT_C static TTrapHandler* MarkCleanupStack(); /**< @internalComponent */ + IMPORT_C static void UnMarkCleanupStack(TTrapHandler* aHandler); /**< @internalComponent */ + IMPORT_C static void LeaveEnd(); /**< @internalComponent */ + // Infoprint + IMPORT_C static TInt InfoPrint(const TDesC& aDes); + // Asynchronous service support + IMPORT_C static void RequestComplete(TRequestStatus*& aStatus,TInt aReason); + IMPORT_C static void WaitForAnyRequest(); + IMPORT_C static void WaitForRequest(TRequestStatus& aStatus); + IMPORT_C static void WaitForRequest(TRequestStatus& aStatus1,TRequestStatus& aStatus2); + IMPORT_C static void WaitForNRequest(TRequestStatus *aStatusArray[], TInt aNum); + // User heap management + IMPORT_C static TInt AllocLen(const TAny* aCell); + IMPORT_C static TAny* Alloc(TInt aSize); + IMPORT_C static TAny* AllocL(TInt aSize); + IMPORT_C static TAny* AllocLC(TInt aSize); + IMPORT_C static TAny* AllocZ(TInt aSize); + IMPORT_C static TAny* AllocZL(TInt aSize); + IMPORT_C static TInt AllocSize(TInt& aTotalAllocSize); + IMPORT_C static TInt Available(TInt& aBiggestBlock); + IMPORT_C static TInt CountAllocCells(); + IMPORT_C static TInt CountAllocCells(TInt& aFreeCount); + IMPORT_C static void Free(TAny* aCell); + IMPORT_C static void FreeZ(TAny*& aCell); + IMPORT_C static RAllocator& Allocator(); + inline static RHeap& Heap(); + IMPORT_C static TAny* ReAlloc(TAny* aCell, TInt aSize, TInt aMode=0); + IMPORT_C static TAny* ReAllocL(TAny* aCell, TInt aSize, TInt aMode=0); + IMPORT_C static RAllocator* SwitchAllocator(RAllocator* aAllocator); + inline static RHeap* SwitchHeap(RAllocator* aHeap); + IMPORT_C static TInt CompressAllHeaps(); + // Synchronous timer services + IMPORT_C static void After(TTimeIntervalMicroSeconds32 aInterval); + IMPORT_C static TInt At(const TTime& aTime); + IMPORT_C static void AfterHighRes(TTimeIntervalMicroSeconds32 aInterval); + // Set time and deal with timezones + IMPORT_C static TInt SetHomeTime(const TTime& aTime); + IMPORT_C static TInt SetHomeTimeSecure(const TTime& aTime); + IMPORT_C static TInt SetUTCTime(const TTime& aUTCTime); + IMPORT_C static TInt SetUTCTimeSecure(const TTime& aUTCTime); + IMPORT_C static TTimeIntervalSeconds UTCOffset(); + IMPORT_C static void SetUTCOffset(TTimeIntervalSeconds aOffset); + IMPORT_C static TInt SetUTCTimeAndOffset(const TTime& aUTCTime, TTimeIntervalSeconds aOffset); + // Set locale information + IMPORT_C static TInt SetCurrencySymbol(const TDesC& aSymbol); + // Set floating point mode + IMPORT_C static TInt SetFloatingPointMode(TFloatingPointMode aMode, TFloatingPointRoundingMode aRoundingMode=EFpRoundToNearest); + // Timers + IMPORT_C static TUint TickCount(); + IMPORT_C static TUint32 NTickCount(); + IMPORT_C static TTimerLockSpec LockPeriod(); + IMPORT_C static TTimeIntervalSeconds InactivityTime(); + IMPORT_C static void ResetInactivityTime(); + IMPORT_C static TUint32 FastCounter(); + // Atomic operations + IMPORT_C static TInt LockedInc(TInt& aValue); + IMPORT_C static TInt LockedDec(TInt& aValue); + IMPORT_C static TInt SafeInc(TInt& aValue); + IMPORT_C static TInt SafeDec(TInt& aValue); + // Beep + IMPORT_C static TInt Beep(TInt aFrequency,TTimeIntervalMicroSeconds32 aDuration); + // Information + IMPORT_C static TInt IsRomAddress(TBool& aBool,TAny* aPtr); + // Algorithms + IMPORT_C static TInt BinarySearch(TInt aCount,const TKey& aKey,TInt& aPos); + IMPORT_C static TInt QuickSort(TInt aCount,const TKey& aKey,const TSwap& aSwap); + // Language-dependent character functions + IMPORT_C static TLanguage Language(); + IMPORT_C static TUint Collate(TUint aChar); + IMPORT_C static TUint Fold(TUint aChar); + IMPORT_C static TUint LowerCase(TUint aChar); + IMPORT_C static TUint UpperCase(TUint aChar); + IMPORT_C static TUint Fold(TUint aChar,TInt aFlags); + IMPORT_C static TUint TitleCase(TUint aChar); + // C-style string length + IMPORT_C static TInt StringLength(const TUint8* aString); + IMPORT_C static TInt StringLength(const TUint16* aString); + // Device management + IMPORT_C static TInt FreeLogicalDevice(const TDesC& aDeviceName); + IMPORT_C static TInt FreePhysicalDevice(const TDesC& aDriverName); + IMPORT_C static TInt LoadLogicalDevice(const TDesC& aFileName); + IMPORT_C static TInt LoadPhysicalDevice(const TDesC& aFileName); + // Version information + IMPORT_C static TBool QueryVersionSupported(const TVersion& aCurrent,const TVersion& aRequested); + IMPORT_C static TVersion Version(); + // Machine configuration + IMPORT_C static TInt SetMachineConfiguration(const TDesC8& aConfig); + IMPORT_C static TInt MachineConfiguration(TDes8& aConfig,TInt& aSize); + // Debugging support + IMPORT_C static void SetDebugMask(TUint32 aVal); + IMPORT_C static void SetDebugMask(TUint32 aVal, TUint aIndex); + IMPORT_C static void SetJustInTime(const TBool aBoolean); + IMPORT_C static void Check(); + IMPORT_C static void Invariant(); + IMPORT_C static TBool JustInTime(); + IMPORT_C static void __DbgMarkStart(TBool aKernel); + IMPORT_C static void __DbgMarkCheck(TBool aKernel, TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum); + IMPORT_C static TUint32 __DbgMarkEnd(TBool aKernel, TInt aCount); + IMPORT_C static void __DbgSetAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TInt aRate); + IMPORT_C static void __DbgSetBurstAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TUint aRate, TUint aBurst); + IMPORT_C static TUint __DbgCheckFailure(TBool aKernel); + IMPORT_C static void PanicUnexpectedLeave(); /**< @internalComponent */ + // Name Validation + IMPORT_C static TInt ValidateName(const TDesC& aName); + // Instruction Memory Barrier + IMPORT_C static void IMB_Range(TAny* aStart, TAny* aEnd); + // + IMPORT_C static TInt CommandLineLength(); + IMPORT_C static void CommandLine(TDes &aCommand); + IMPORT_C static TExceptionHandler ExceptionHandler(); + IMPORT_C static TInt SetExceptionHandler(TExceptionHandler aHandler,TUint32 aMask); + IMPORT_C static void ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask); + IMPORT_C static TInt RaiseException(TExcType aType); + IMPORT_C static TBool IsExceptionHandled(TExcType aType); + + /** + A set of values that defines the effect that terminating a thread + has, either on its owning process or on the whole system. + + A thread is said to be critical if its owning process or the entire system + terminates when the thread itself terminates. + + You pass one of these values to the functions: + - User::SetCritical() + - User::SetProcessCritical() + + The meaning of a value when passed to one function is different to + its meaning when passed the other function. See the description of each + individual value. + + @see User::SetCritical() + @see User::SetProcessCritical() + */ + enum TCritical { + + + /** + This value can be passed to both: + - User::SetCritical(), which means that the current thread + is no longer critical, i.e. termination of the current + thread will no longer cause termination of the current thread's + owning process (i.e. the current process) or a reboot of the system. + - User::SetProcessCritical(), which means that threads + subsequently created in the current thread's owning + process (i.e. the current process) will no longer cause termination of that + process or a reboot of the system. Note, however, that existing + threads are NOT affected when you call this function. + + @see User::SetCritical() + @see User::SetProcessCritical() + */ + ENotCritical, + + + /** + This value can only be passed to User::SetCritical() and + affects the current thread only. + + It means that the owning process (i.e.the current process) + terminates if: + - the current thread is terminated. + - the current thread panics. + + @see User::SetCritical() + */ + EProcessCritical, + + + /** + This value can only be passed to User::SetCritical() and + affects the current thread only. + + It means that the owning process (i.e.the current process) + terminates if the current thread terminates for any reason. + + @see User::SetCritical() + */ + EProcessPermanent, + + + /** + This value can only be passed to User::SetProcessCritical() and + affects any new threads created in the current process. + + It means that the current process terminates if: + - any new thread subsequently created in the current process is terminated. + - any new thread subsequently created in the current process panics. + . + Note, however, that existing threads in the current process + are NOT affected when you call User::SetProcessCritical() + with this value. + + @see EProcessCritical + @see User::SetProcessCritical() + */ + EAllThreadsCritical, + + + /** + This value can be passed to both: User::SetCritical() and + User::SetProcessCritical(). + + When passed to User::SetCritical(), it means that + the entire system is rebooted if: + - the current thread is terminated. + - the current thread panics. + + When passed to User::SetProcessCritical(), it means that + the entire system is rebooted if: + - any new thread subsequently created in the current process is terminated. + - any new thread subsequently created in the current process panics. + - the process itself is terminated + - the process itself panics + + Note: + -# existing threads in the current process are NOT affected when you + call User::SetProcessCritical() with this value. + -# Only a process with 'Protected Server' capability can set a + thread to system-critical. + + @see User::SetCritical() + @see User::SetProcessCritical() + */ + ESystemCritical, + + + /** + This value can be passed to both: User::SetCritical() + and User::SetProcessCritical(). + + When passed to User::SetCritical(), it means that + the entire system is rebooted if the current thread + exits for any reason. + + When passed to User::SetProcessCritical(), it means that + the entire system is rebooted if any new thread + subsequently created in the current process exits + for any reason, or if the process itself exits for any reason. + + Note: + -# existing threads in the current process are NOT affected when you + call User::SetProcessCritical() with this value. + -# Only a process with 'Protected Server' capability can set a + thread to system-permanent. + + @see User::SetCritical() + @see User::SetProcessCritical() + */ + ESystemPermanent + }; + IMPORT_C static TCritical Critical(); + IMPORT_C static TCritical Critical(RThread aThread); + IMPORT_C static TInt SetCritical(TCritical aCritical); + IMPORT_C static TCritical ProcessCritical(); + IMPORT_C static TCritical ProcessCritical(RProcess aProcess); + IMPORT_C static TInt SetProcessCritical(TCritical aCritical); + IMPORT_C static TBool PriorityControl(); + IMPORT_C static void SetPriorityControl(TBool aEnable); + + /** + A threads realtime state. + Some non-realtime behaviour can be detected by the kernel. When it does so, + action is taken depending on the thread state: + - ERealtimeStateOff - no action. + - ERealtimeStateOn - the the thread will be panicked with KERN-EXEC 61 (EIllegalFunctionForRealtimeThread). + - ERealtimeStateWarn - no action. However, if the kernel trace flag KREALTIME is enabled + then tracing will be emitted as if the thread state was ERealtimeStateOn. + @publishedPartner + @prototype + */ + enum TRealtimeState + { + ERealtimeStateOff, /**< Thread is not realtime */ + ERealtimeStateOn, /**< Thread is realtime */ + ERealtimeStateWarn /**< Thread is realtime but doesn't want this enforced */ + }; + + /** + Set the current threads realtime state. + @see TRealtimeState + @param aState The state + @return KErrNone if successful. KErrArgument if aState is invalid. + @publishedPartner + @prototype + */ + IMPORT_C static TInt SetRealtimeState(TRealtimeState aState); + + /** + Return the Secure ID of the process that created the current process. + @return The Secure ID. + @publishedAll + @released + */ + IMPORT_C static TSecureId CreatorSecureId(); + + /** + Return the Vendor ID of the process that created the current process. + @return The Vendor ID. + @publishedAll + @released + */ + IMPORT_C static TVendorId CreatorVendorId(); + + /** + Check if the process that created the current process has a given capability + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability The capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds the capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if the creator process has the capability, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline static TBool CreatorHasCapability(TCapability aCapability, const char* aDiagnostic=0); +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL); +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress); +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + /** + Check if the process that created the current process has both of the given capabilities + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + + @param aCapability1 The first capability to test. + @param aCapability2 The second capability to test. + @param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the test finds a capability is not present. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. + @return ETrue if the creator process has both the capabilities, EFalse otherwise. + @publishedAll + @released + */ +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0); +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + // Only available to NULL arguments + inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL); +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ + // For things using KSuppressPlatSecDiagnostic + inline static TBool CreatorHasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress); +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + IMPORT_C static TInt ParameterLength(TInt aSlot); + IMPORT_C static TInt GetTIntParameter(TInt aSlot, TInt& aData); + IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes8& aDes); + IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes16& aDes); + IMPORT_C static TInt RenameThread(const TDesC &aName); + IMPORT_C static TInt RenameProcess(const TDesC &aName); + /* + User::Identity() has been deprecated and is available for backward + compatibility purposes only. + + Use RProcess().SecureId() instead. + + @deprecated + */ + inline static TUid Identity() { return RProcess().SecureId(); } + + /* + User::CreatorIdentity() has been deprecated and is available for backward + compatibility purposes only. + + Use CreatorSecureId() instead. + + @deprecated + */ + static inline TUid CreatorIdentity() { return CreatorSecureId(); } + + IMPORT_C static void NotifyOnIdle(TRequestStatus& aStatus); /**< @internalTechnology */ + IMPORT_C static void CancelMiscNotifier(TRequestStatus& aStatus); /**< @internalTechnology */ +private: + // Implementations of functions with diagnostics + IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability, const char* aDiagnostic); + IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability); + IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic); + IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2); + }; + + + + +class ExecHandler; + +/** +@internalComponent +@removed +*/ +typedef void (*TTlsCleanupHandler)(TAny*); //don't use + +/** +@publishedAll +@released + +A collection of static functions involved in managing access to +thread-local storage. + +Thread-local storage is a single machine word of static writable memory. +The scope of this machine word is the thread, which means that there is one +word per thread. The word is only accessible to code running in a DLL. + +In practice, this word is almost always used to hold a pointer to allocated +memory; this makes that memory available to all DLL code running on behalf +of the same thread. + +Note that DLL code running on behalf of one thread does not see the same word when +running on behalf of another thread. + +The class in not intended for user derivation. +*/ +class Dll + { +public: + static TInt SetTls(TAny* aPtr); + static TAny* Tls(); + static void FreeTls(); + static void FileName(TFileName &aFileName); + }; + + + + +#ifndef __TOOLS__ +/** +@publishedAll +@released + +A thin wrapper class for C++ arrays allowing automatic checking of index values +to ensure that all accesses are legal. + +The class also supports the deletion of objects. + +The class is templated, based on a class type and an integer value. The class +type defines the type of object contained in the array; the integer value +defines the size (dimension) of the array. + +A wrapper object can be: + +1. embedded in objects allocated on the heap. + +2. used on the program stack. +*/ +template +class TFixedArray + { + typedef TFixedArray ThisClass; +public: + inline TFixedArray(); + inline TFixedArray(const T* aList, TInt aLength); + // + inline void Copy(const T* aList, TInt aLength); + inline void Reset(); // zero fill + inline void DeleteAll(); + // + inline TInt Count() const; + inline TInt Length() const; + // Accessors - debug range checking + inline T& operator[](TInt aIndex); + inline const T& operator[] (TInt aIndex) const; + // Accessors - always range checking + inline T& At(TInt aIndex); + inline const T& At(TInt aIndex) const; + // Provides pointers to the beginning and end of the array + inline T* Begin(); + inline T* End(); + inline const T* Begin() const; + inline const T* End() const; + // + inline TArray Array() const; +protected: + inline static TBool InRange(TInt aIndex); + inline static TInt CountFunctionR(const CBase* aThis); + inline static const TAny* AtFunctionR(const CBase* aThis,TInt aIndex); +protected: + T iRep[S]; + }; + + + + +/** +@publishedAll +@released +*/ +#define DECLARE_ROM_ARRAY( AName, AData, AType ) \ + const TFixedArray& \ + AName = *(reinterpret_cast* > (AData)) +#endif + +// Global leaving operator new +/** +@publishedAll +@released +*/ +inline TAny* operator new(TUint aSize, TLeave); +/** +@publishedAll +@released +*/ +inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize); +#if !defined(__VC32__) || defined (__MSVCDOTNET__) +/** +@publishedAll +@released +*/ +inline TAny* operator new[](TUint aSize, TLeave); +#endif + + +#ifdef __LEAVE_EQUALS_THROW__ +/** Macro to assert in all builds that code does not leave + +@param _s C++ statements to be executed which should not leave +@panic USER 194 if the code being checked does leave + +@publishedAll +@released +*/ +#define __ASSERT_ALWAYS_NO_LEAVE(_s) \ + { \ + try { \ + TTrapHandler* ____t = User::MarkCleanupStack(); \ + _s; \ + User::UnMarkCleanupStack(____t); \ + } \ + catch (XLeaveException& /*l*/) \ + { \ + User::PanicUnexpectedLeave(); \ + } \ + catch (...) \ + { \ + User::Invariant(); \ + } \ + } + +#else +/** Macro to assert in all builds that code does not leave + +@param _s C++ statements to be executed which should not leave +@panic USER 194 if the code being checked does leave + +@publishedAll +@released +*/ +#define __ASSERT_ALWAYS_NO_LEAVE(_s) \ + { \ + TInt _r; \ + TTrap _t; \ + if (_t.Trap(_r) == 0) \ + { \ + _s; \ + TTrap::UnTrap(); \ + } \ + else \ + User::PanicUnexpectedLeave(); \ + } +#endif + +/** Macro to assert in debug builds that code does not leave + +@param _s C++ statements to be executed which should not leave +@panic USER 194 if the code being checked does leave + +@publishedAll +@released +*/ +#ifdef _DEBUG +#define __ASSERT_DEBUG_NO_LEAVE(_s) __ASSERT_ALWAYS_NO_LEAVE(_s) +#else +#define __ASSERT_DEBUG_NO_LEAVE(_s) { _s; } +#endif + +/** +This is a panic handler function pointer for PREQ2104. +*/ +typedef void (*TPanicHandler)(const TDesC&,TInt); + + + +// Inline methods +#include + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32std.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32std.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,7439 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32std.inl +// +// + +// Global leaving operator new +inline TAny* operator new(TUint aSize, TLeave) + {return User::AllocL(aSize);} +inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize) + {return User::AllocL(aSize + aExtraSize);} +#if !defined(__VC32__) || defined (__MSVCDOTNET__) +inline TAny* operator new[](TUint aSize, TLeave) + {return User::AllocL(aSize);} +#endif + + + + +// class Mem +inline TUint8* Mem::Copy(TAny* aTrg, const TAny* aSrc, TInt aLength) +/** +Copies data from a source location to a target location and returns a pointer +to the end of the copied data. + +The source and target areas can overlap. + +The copy operation is optimised so that if both source and target locations +are aligned on a word boundary, the operation performs the copy on a word +by word basis. + +@param aTrg A pointer to the target location for the copy operation. +@param aSrc A pointer to the source location for the copy operation. +@param aLength The number of bytes to be copied. This value must not + be negative. + +@return A pointer to a location aLength bytes beyond aTrg (i.e. the location + aTrg+aLength). + +@panic USER 90 In debug builds only, if aLength is negative. +*/ + { return (TUint8*)memmove(aTrg, aSrc, aLength) + aLength; } + + + + +inline TUint8* Mem::Move(TAny* aTrg, const TAny* aSrc, TInt aLength) +/** +Moves a block of data from a source location to a target location and returns +a pointer to the end of the moved data. + +The source and target areas can overlap. + +Both source and target locations must be aligned on a word boundary. +The specified length must also be a multiple of 4. + +@param aTrg A pointer to the target location for the move operation. This + pointer must be word aligned. +@param aSrc A pointer to the source location for the move operation. This + pointer must be word aligned. +@param aLength The number of bytes to be copied. This value must be a multiple + of 4. + +@return A pointer to a location aLength bytes beyond aTrg (i.e. the location + aTrg+aLength). + +@panic USER 93 In debug builds only, if aTrg is not word aligned. +@panic USER 92 In debug builds only, if aSrc is not word aligned. +@panic USER 91 In debug builds only, if aLength is not a multiple of 4. +*/ + { return (TUint8*)wordmove(aTrg, aSrc, aLength) + aLength; } + + + + +inline void Mem::Fill(TAny* aTrg, TInt aLength, TChar aChar) +/** +Fills a specified block of data with a specified character, replacing +any existing content. + +The function assumes that the fill character is a non-Unicode character. + +@param aTrg A pointer to the location where filling is to start. +@param aLength The number of bytes to be filled. This value must not + be negative. +@param aChar The fill character. + +@panic USER 95 In debug builds only, if aLength is negative. +*/ + { memset(aTrg, (TInt)(aChar.operator TUint()), aLength); } + + + + +inline void Mem::FillZ(TAny* aTrg,TInt aLength) +/** +Fills a specified block of data with binary zeroes (i.e. 0x00), replacing any +existing content. + +@param aTrg A pointer to the location where filling is to start. +@param aLength The number of bytes to be filled. This value must not + be negative. + +@panic USER 95 In debug builds only, if aLength is negative. +*/ + { memclr(aTrg, aLength); } + + + +#ifndef __TOOLS2__ +#if !(defined(__GCC32__) && defined(__MARM__)) +inline TInt Mem::Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL) +/** +Compares a block of data at one specified location with a block of data at +another specified location. + +The comparison proceeds on a byte for byte basis, the result of the comparison +is based on the difference of the first bytes to disagree. + +The data at the two locations are equal if they have the same length and content. +Where the lengths are different and the shorter section of data is the same +as the first part of the longer section of data, the shorter is considered +to be less than the longer. + +@param aLeft A pointer to the first (or left) block of 8 bit data + to be compared. +@param aLeftL The length of the first (or left) block of data to be compared, + i.e. the number of bytes. +@param aRight A pointer to the second (or right) block of 8 bit data to be + compared. +@param aRightL The length of the second (or right) block of data to be compared + i.e. the number of bytes. + +@return Positive, if the first (or left) block of data is greater than the + second (or right) block of data. + Negative, if the first (or left) block of data is less than the + second (or right) block of data. + Zero, if both the first (or left) and second (or right) blocks of data + have the same length and the same content. +*/ + { return memcompare(aLeft, aLeftL, aRight, aRightL); } +#endif +#endif // __TOOLS2__ + + + +// class RHeap +inline TInt RHeap::SetBrk(TInt aBrk) + { return ((RChunk*)&iChunkHandle)->Adjust(aBrk); } + + + + +// class TChar +#ifndef __KERNEL_MODE__ +inline void TChar::SetChar(TUint aChar) + {iChar=aChar;} + + + + +inline void TChar::Fold() +/** +Converts the character to a form which can be used in tolerant comparisons +without control over the operations performed. + +Tolerant comparisons are those which ignore character differences like case +and accents. + +This function can be used when searching for a string in a text file or a +file in a directory. Folding performs the following conversions: converts +to lowercase, strips accents, converts all digits representing the values +0..9 to the ordinary digit characters '0'..'9', converts all spaces (standard, +non-break, fixed-width, ideographic, etc.) to the ordinary space character +(0x0020), converts Japanese characters in the hiragana syllabary to katakana, +and converts East Asian halfwidth and fullwidth variants to their ordinary +forms. You can choose to perform any subset of these operations by using the +other function overload. + +@see User::Fold +*/ + {iChar=User::Fold(iChar);} + + + + +inline void TChar::LowerCase() +/** +Converts the character to its lowercase form. + +Characters lacking a lowercase form are unchanged. + +@see User::LowerCase +*/ + {iChar=User::LowerCase(iChar);} + + + + +inline void TChar::UpperCase() +/** +Converts the character to its uppercase form. + +Characters lacking an uppercase form are unchanged. + +@see User::UpperCase +*/ + {iChar=User::UpperCase(iChar);} + + + + +#ifdef _UNICODE +inline void TChar::Fold(TInt aFlags) +/** +Converts the character to a form which can be used in tolerant comparisons +allowing selection of the specific fold operations to be performed. + +@param aFlags Flags which define the operations to be performed. The values + are defined in the enum beginning with EFoldCase. + +@see TChar::EFoldCase +@see User::Fold +*/ + {iChar=User::Fold(iChar,aFlags);} + + + + +inline void TChar::TitleCase() +/** +Converts the character to its titlecase form. + +The titlecase form of a character is identical to its uppercase form unless +a specific titlecase form exists. Characters lacking a titlecase form are +unchanged. +*/ + {iChar=User::TitleCase(iChar);} +#endif + + + + +inline TBool TChar::Eos() const +/** +Tests whether the character is the C/C++ end-of-string character - 0. + +@return True, if the character is 0; false, otherwise. +*/ + {return(iChar==0);} +#endif // _UNICODE + + + + +// Class TCallBack +inline TCallBack::TCallBack() +/** +Default constructor. + +Sets the function pointer to Null. +*/ + {iFunction=NULL;} + + + + +inline TCallBack::TCallBack(TInt (*aFunction)(TAny *aPtr)) + : iFunction(aFunction),iPtr(NULL) +/** +Constructs the callback object with the specified callback function. + +@param aFunction A pointer to the callback function. It takes an argument of + type TAny* and returns a TInt. + It must be either a static member of a class or a function + which is not a member of any class. +*/ + {} + + + + +inline TCallBack::TCallBack(TInt (*aFunction)(TAny *aPtr),TAny *aPtr) + : iFunction(aFunction),iPtr(aPtr) +/** +Constructs the callback object with the specified callback function and +a pointer to any object. + +@param aFunction A pointer to the callback function. It takes an argument of + type TAny* and returns a TInt. + It must be either a static member of a class or a function + which is not a member of any class. +@param aPtr A pointer which is always passed to the callback function. +*/ + {} + + + + +/** +Calls the callback function. + +@return The value returned by the callback function. The meaning of this value + depends entirely on the context in which the callback function + is called. + For example, when used with the CIdle class, a false (zero) value + indicates that the callback function should not be called again. + As another example, when used with the CPeriodic class, the return + value is ignored and is irrelevant in that context. + +@see CIdle +@see CPeriodic +*/ +inline TInt TCallBack::CallBack() const + { return (iFunction ? (*iFunction)(iPtr) : 0); } + + + + +// Class TSglQue +template +inline TSglQue::TSglQue() +/** +Constructs an empty list header and sets the offset value of the link object +to zero. + +In practice, never assume that the offset of the link object from the start +of a list element is zero, even if the link object is declared as the first +data member in the list element class. + +If this default constructor is used, then call the SetOffset() function of +the base class to ensure that the offset value is set correctly. + +@see TSglQueBase::SetOffset +*/ + {} + + + + +template +inline TSglQue::TSglQue(TInt aOffset) + : TSglQueBase(aOffset) +/** +Constructs an empty list header and sets the offset of the link object to the +specified value. + +@param aOffset The offset of the link object from the start of a list element. + The macro _FOFF can be used to calculate this value. + +@panic USER 75, if aOffset is not divisible by four. + +@see _FOFF +*/ + {} + + + + +template +inline void TSglQue::AddFirst(T &aRef) +/** +Inserts the specified list element at the front of the singly linked list. + +If the list is not empty, the specified element becomes the first in the list. +What was previously the first element becomes the second in the list. + +@param aRef The list element to be inserted at the front of the singly linked + list. +*/ + {DoAddFirst(&aRef);} + + + + +template +inline void TSglQue::AddLast(T &aRef) +/** +Inserts the specified list element at the back of the singly linked list. + +If the list is not empty, the specified element becomes the last in the list. +What was previously the last element becomes the next to last element in the +list. + +@param aRef The list element to be inserted at the back of the singly linked + list. +*/ + {DoAddLast(&aRef);} + + + + +template +inline TBool TSglQue::IsFirst(const T *aPtr) const +/** +Tests whether the specified element is the first in the singly linked list. + +@param aPtr A pointer to the element whose position in the list is to be + checked. + +@return True, if the element is the first in the list; false, otherwise. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)iHead);} + + + + +template +inline TBool TSglQue::IsLast(const T *aPtr) const +/** +Tests whether the specified element is the last in the singly linked list. + +@param aPtr A pointer to the element whose position in the list is + to be checked. + +@return True, if the element is the last in the list; false, otherwise. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)iLast);} + + + + +template +inline T *TSglQue::First() const +/** +Gets a pointer to the first list element in the singly linked list. + +@return A pointer to the first list element in the singly linked list. If + the list is empty, this pointer is not necessarily NULL and must not + be assumed to point to a valid object. +*/ + {return(PtrSub((T *)iHead,iOffset));} + + + + +template +inline T *TSglQue::Last() const +/** +Gets a pointer to the last list element in the singly linked list. + +@return A pointer to the last list element in the singly linked list. If the + list is empty, this pointer is not necessarily NULL and must not be + assumed to point to a valid object. +*/ + {return(PtrSub((T *)iLast,iOffset));} + + + + +template +inline void TSglQue::Remove(T &aRef) +/** +Removes the specified element from the singly linked list. + +The singly linked list must not be empty. + +@param aRef A list element to be removed from the singly linked list. + +@panic USER 76, if the element to be removed is not in the list +*/ + {DoRemove(&aRef);} + + + + +// Class TDblQue +template +inline TDblQue::TDblQue() +/** +Constructs an empty list header and sets the offset value of the link object +to zero. + +In practice, never assume that the offset of the link object from the start +of a list element is zero, even if the link object is declared as the first +data member in the list element class. + +If this default constructor is used, then call the SetOffset() function of +the base class to ensure that the offset value is set correctly. + +@see TDblQueBase::SetOffset() +*/ + {} + + + + +template +inline TDblQue::TDblQue(TInt aOffset) + : TDblQueBase(aOffset) +/** +Constructs an empty list header and sets the offset of the link object to the +specified value. + +@param aOffset The offset of the link object from the start of a list element. + The macro _FOFF can be used to calculate this value. + +@panic USER 78. if aOffset is not divisble by 4. + +@see _FOFF +*/ + {} + + + + +template +inline void TDblQue::AddFirst(T &aRef) +/** +Inserts the specified list element at the front of the doubly linked list. + +If the list is not empty, the specified element becomes the first in the list. +What was previously the first element becomes the second in the list. + +@param aRef The list element to be inserted at the front of the doubly linked + list. +*/ + {DoAddFirst(&aRef);} + + + + +template +inline void TDblQue::AddLast(T &aRef) +/** +Inserts the specified list element at the back of the doubly linked list. + +If the list is not empty, the specified element becomes the last in the list. +What was previously the last element becomes the next to last element in the +list. + +@param aRef The list element to be inserted at the back of the doubly linked + list. +*/ + {DoAddLast(&aRef);} + + + + +template +inline TBool TDblQue::IsHead(const T *aPtr) const +/** +Tests whether the end of a list has been reached. + +A doubly linked list is circular; in following the chain of elements in a +list (e.g. using the iterator operator++ or operator--), the chain eventually +reaches the end of the list and aPtr corresponds to the header (although it +will not point to a valid T object). + +@param aPtr The pointer value to be checked. + +@return True, if the end of the list has been reached. False, if the end of + the list has not been reached; aPtr points to an element in the list. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)&iHead);} + + + + +template +inline TBool TDblQue::IsFirst(const T *aPtr) const +/** +Tests whether the specified element is the first in the doubly linked list. + +@param aPtr A pointer to the element whose position in the list is to be checked. + +@return True, if the element is the first in the list; false, otherwise. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)iHead.iNext);} + + + + +template +inline TBool TDblQue::IsLast(const T *aPtr) const +/** +Tests whether the specified element is the last in the doubly linked list. + +@param aPtr A pointer to the element whose position in the list is to be checked. + +@return True, if the element is the last in the list; false, otherwise. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)iHead.iPrev);} + + + + +template +inline T *TDblQue::First() const +/** +Gets a pointer to the first list element in the doubly linked list. + +@return A pointer to the first list element in the doubly linked list. If + the list is empty, this pointer is not necessarily NULL and must not + be assumed to point to a valid object. +*/ + { +#if defined (_DEBUG) + __DbgTestEmpty(); +#endif + return(PtrSub((T *)iHead.iNext,iOffset)); + } + + + + +template +inline T *TDblQue::Last() const +/** +Gets a pointer to the last list element in the doubly linked list. + +@return A pointer to the last list element in the doubly linked list. If the + list is empty, this pointer is not necessarily NULL and must not be assumed + to point to a valid object. +*/ + { +#if defined (_DEBUG) + __DbgTestEmpty(); +#endif + return(PtrSub((T *)iHead.iPrev,iOffset)); + } + + + + +// Class TPriQue +template +inline TPriQue::TPriQue() +/** +Default constructor. + +Constructs an empty list header and sets the offset value of the link +object to zero. + +In practice, never assume that the offset of the link object from the start +of a list element is zero, even if the link object is declared as the first +data member in the list element class. + +If this default constructor is used, then call the SetOffset() function of +the base class to ensure that the offset value is set correctly. + +@see TDblQueBase::SetOffset +*/ + {} + + + + +template +inline TPriQue::TPriQue(TInt aOffset) + : TDblQueBase(aOffset) +/** +Constructs an empty list header and sets the offset of the link object +to the specified value. + +@param aOffset The offset of the link object from the start of a list element. + The macro _FOFF can be used to calculate this value. + +@panic USER 78 if aOffset is not divisible by four. +*/ + {} + + + + +template +inline void TPriQue::Add(T &aRef) +/** +Inserts the specified list element in descending priority order. + +If there is an existing list element with the same priority, then the new +element is added after the existing element. + +@param aRef The list element to be inserted. +*/ + {DoAddPriority(&aRef);} + + + + +template +inline TBool TPriQue::IsHead(const T *aPtr) const +/** +Tests whether the end of a list has been reached. + +A doubly linked list is circular; in following the chain of elements in a list +(e.g. using the iterator operator++ or operator--), the chain eventually +reaches the end of the list and aPtr corresponds to the header (although it +will not point to a valid T object). + +@param aPtr The pointer value to be checked. + +@return True, if the end of the list has been reached. False, if the end of the + list has not been reached; aPtr points to an element in the list. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)&iHead);} + + + + +template +inline TBool TPriQue::IsFirst(const T *aPtr) const +/** +Tests whether the specified element is the first in the linked list. + +@param aPtr A pointer to the element whose position in the list is to + be checked. + +@return True, if the element is the first in the list; false, otherwise. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)iHead.iNext);} + + + + +template +inline TBool TPriQue::IsLast(const T *aPtr) const +/** +Tests whether the specified element is the last in the linked list. + +@param aPtr A pointer to the element whose position in the list is to + be checked. + +@return True, if the element is the last in the list; false, otherwise. +*/ + {return(PtrAdd(aPtr,iOffset)==(T *)iHead.iPrev);} + + + + +template +inline T *TPriQue::First() const +/** +Gets a pointer to the first list element in the linked list. + +@return A pointer to the first list element in the linked list. + If the list is empty, this pointer is not necessarily NULL and must + not be assumed to point to a valid object. +*/ + {return(PtrSub((T *)iHead.iNext,iOffset));} + + + + +template +inline T *TPriQue::Last() const +/** +Gets a pointer to the last list element in the linked list. + +@return A pointer to the last list element in the linked list. + If the list is empty, this pointer is not necessarily NULL and must + not be assumed to point to a valid object. +*/ + {return(PtrSub((T *)iHead.iPrev,iOffset));} + + + + +// Class TDeltaQue +template +inline TDeltaQue::TDeltaQue() +/** +Constructs an empty list header and sets the offset value of the link object +to zero. + +In practice, never assume that the offset of the link object from the start +of a list element is zero, even if the link object is declared as the first +data member in the list element class. + +If this default constructor is used, then call the TDblQueBase::SetOffset() +function in the base class to ensure that the offset value is set correctly. + +TDeltaQueBase::iFirstDelta is set to NULL. + +@see TDblQueBase::SetOffset +*/ + {} + + + + +template +inline TDeltaQue::TDeltaQue(TInt aOffset) + : TDeltaQueBase(aOffset) +/** +Constructs an empty list header and sets the offset of the link object to the +specified value. + +TDeltaQueBase::iFirstDelta is set to NULL. + +@param aOffset The offset of the link object from the start of a list element. + The macro _FOFF can be used to calculate this value. + +@panic USER 78, if aOffset is not divisible by four. + +@see _FOFF +*/ + {} + + + + +template +inline void TDeltaQue::Add(T &aRef,TInt aDelta) +/** +Adds the specified list element, having the specified 'distance' from the +nominal zero point, into the list. + +The element is added into the list, the adjacent delta values adjusted, and +a suitable delta value assigned to the new element, so that the new element +is at the specified 'distance' from the nominal zero point. + +@param aRef The list element to be inserted. +@param aDelta The 'distance' from the nominal zero point. +*/ + {DoAddDelta(&aRef,aDelta);} + + + + +template +inline void TDeltaQue::Remove(T &aRef) +/** +Removes the specified list element from the linked list. + +The delta value of the element following the removed element is adjusted +so that its 'distance' from the nominal zero point remains the same. + +@param aRef The list element to be removed. +*/ + {DoRemove(&aRef);} + + + + +template +inline T *TDeltaQue::RemoveFirst() +/** +Removes the first list element from the linked list if its delta value is zero +or negative. + +@return A pointer to the element removed from the linked list. This is NULL, + if the first element has a positive delta value. +*/ + {return((T *) DoRemoveFirst());} + + + + +// Class TSglQueIter +template +inline TSglQueIter::TSglQueIter(TSglQueBase &aQue) + : TSglQueIterBase(aQue) +/** +Constructs the iterator for the specified singly linked list. + +The iterator can be constructed whether or not the list contains any elements. + +If the list does contain elements, the iterator pointer is set to the first one. + +If the list has no elements, the iterator pointer is not set and the conversion +operator T*() and the post increment operator ++ subsequently return NULL. +Once elements have been added to the list, use either the +TSglQueIter::Set() function or the TSglQueIterBase::SetToFirst() function to set the +iterator pointer. + +@param aQue A reference to a singly linked list header. + +@see TSglQueIter::Set +@see TSglQueIterBase::SetToFirst +*/ + {} + + + + +template +inline void TSglQueIter::Set(T &aLink) +/** +Sets the iterator to point to a specific element in the list. + +This function can be used to alter the pointer at any time during the iterator's +existence. The referenced element must be in the list, otherwise the result +is undefined. + +@param aLink A reference to the element from where iteration is to continue. +*/ + {DoSet(&aLink);} + + + + +template +inline TSglQueIter::operator T *() +/** +Gets a pointer to the iterator’s current element. + +The operator is normally used implicitly; e.g. some member functions of the +list header class TSglQue require a pointer to an element (of type class T) +as a parameter, but in practice an iterator is often passed instead. +This operator performs the necessary conversion. +*/ + {return((T *)DoCurrent());} + + + + +template +inline T *TSglQueIter::operator++(TInt) +/** +Gets a pointer to the iterator's current element and then sets the iterator +to point to the next element. + +Repeated use of this operator allows successive elements to be accessed. + +@return A pointer to the current list element, if the iterator points to an + element. NULL, if the iterator does not point to an element; i.e. the + iterator pointer has reached the end of the list. +*/ + {return((T *)DoPostInc());} + + + + +// Class TDblQueIter +template +inline TDblQueIter::TDblQueIter(TDblQueBase &aQue) + : TDblQueIterBase(aQue) +/** +Constructs the iterator for the specified doubly linked list + +The iterator can be constructed whether or not the list contains any elements. + +If the list does contain elements, the iterator pointer is set to the first one. + +If the list has no elements, the iterator pointer is not set and the conversion +operator T*(), the post increment operator++() and the post decrement operator +--() subsequently return NULL. Once elements have been added to the list, use +either the TDblQueIter::Set() function, the TDblQueIterBase::SetToFirst() +function or the TDblQueIterBase::SetToLast() function to set the iterator +pointer. + +@param aQue A reference to a doubly linked list header. + +@see TDblQueIter::Set +@see TDblQueIterBase::SetToFirst +@see TDblQueIterBase::SetToLast +*/ + {} + + + + +template +inline void TDblQueIter::Set(T &aLink) +/** +Sets the iterator to point to a specific element in the list. + +This function can be used to alter the pointer at any time during +the iterator's existence. The referenced element must be in the list, +otherwise the result is undefined. + +@param aLink A reference to the element from where iteration is to continue. +*/ + {DoSet(&aLink);} + + + + +template +inline TDblQueIter::operator T *() +/** +Gets a pointer to the iterator’s current element. + +The operator is normally used implicitly; e.g. some member functions of the +list header class TDblQue require a pointer to an element (of type class T) +as a parameter but in practice, an iterator is often passed instead. +This operator performs the necessary conversion. + +@return A pointer to the current element, if the iterator points to an element + in the list. NULL, if the iterator does not point to an element; + i.e. the iterator pointer has previously reached the end of the list + (see operator++) or the start of the list (see operator--) or + the list is empty. +*/ + {return((T *) DoCurrent());} + + + + +template +inline T *TDblQueIter::operator++(TInt) +/** +Gets a pointer to the iterator's current element and then sets the iterator +to point to the next element. + +Repeated use of this operator allows successive +elements to be accessed in the forwards direction. + +@return A pointer to the current list element, if the iterator points to an + element. NULL, if the iterator does not point to an element; + i.e. the iterator pointer has reached the end of the list. +*/ + {return((T *) DoPostInc());} + + + + +template +inline T *TDblQueIter::operator--(TInt) +/** +Gets a pointer to the iterator's current element and then sets the iterator +to point to the previous element. + +Repeated use of this operator allows successive +elements to be accessed in the backwards direction. + +@return A pointer to the current element, if the iterator points to an element. + NULL, if the iterator does not point to an element; i.e. the iterator + pointer has reached the beginning of the list. +*/ + {return((T *) DoPostDec());} + + + + +// Class TKey +inline void TKey::SetPtr(const TAny *aPtr) +/** +Sets the pointer to a sample element whose key is to be used for comparison. + +The element can be in an existing array or it can be located anywhere in +addressable memory. + +The At() member function supplied by a derived class must return a pointer +to this sample element's key when passed an index value of KIndexPtr. + +SetPtr() must be called before calling User::BinarySearch() because this algorithm +uses the key of this sample element as the basis for searching the array. + +@param aPtr A pointer to a sample element. +*/ + {iPtr=aPtr;} + + + + +// Class TCharF +inline TCharF::TCharF(TUint aChar) + : TChar(User::Fold(aChar)) +/** +Constructs this 'fold character' object and initialises it with the specified +value. + +@param aChar The initialisation value. +*/ + {} + + + + +inline TCharF::TCharF(const TChar& aChar) + : TChar(User::Fold(aChar)) +/** +Constructs this 'fold character' object and initialises it with the value of +the TChar object aChar. + +@param aChar The character object to use as the initialisation value. +*/ + {} + + + + +inline TCharF& TCharF::operator=(TUint aChar) +/** +Assigns an unsigned integer value to the 'fold character' object. + +@param aChar The value to assign. + +@return A reference to this 'fold character' object. +*/ + {SetChar(User::Fold(aChar));return(*this);} + + + + +inline TCharF& TCharF::operator=(const TChar& aChar) +/** +Assigns the specified character object to this 'fold character' object. + +@param aChar The character object to assign. + +@return A reference to this 'fold character' object. +*/ + {SetChar(User::Fold(aChar));return(*this);} + + + + +// Class TCharLC +inline TCharLC::TCharLC(TUint aChar) + : TChar(User::LowerCase(aChar)) +/** +Constructs this 'character to lower case' object and initialises it with the +specified value. + +@param aChar The initialisation value. + +*/ + {} + + + + +inline TCharLC::TCharLC(const TChar& aChar) + : TChar(User::LowerCase(aChar)) +/** +Constructs this 'character to lower case' object and initialises it with the +value of the TChar object aChar. + +@param aChar The character object to use as the initialisation value. +*/ + {} + + + + +inline TCharLC& TCharLC::operator=(TUint aChar) +/** +Assigns an unsigned integer value to the 'character to lower case' object. + +@param aChar The value to assign. + +@return A reference to this 'character to lower case' object. +*/ + {SetChar(User::LowerCase(aChar));return(*this);} + + + + +inline TCharLC& TCharLC::operator=(const TChar& aChar) +/** +Assigns the specified character object to this 'character to lower case' +object. + +@param aChar The character object to assign. + +@return A reference to this 'character to lower case' object. +*/ + {SetChar(User::LowerCase(aChar));return(*this);} + + + + +// Class TCharUC +inline TCharUC::TCharUC(TUint aChar) + : TChar(User::UpperCase(aChar)) +/** +Constructs this 'character to upper case' object and initialises it with the +specified value. + +@param aChar The initialisation value. +*/ + {} + + + + +inline TCharUC::TCharUC(const TChar& aChar) + : TChar(User::UpperCase(aChar)) +/** +Constructs this 'character to upper case' object and initialises it with the +value of the TChar object aChar. + +@param aChar The character object to use as the initialisation value. +*/ + {} + + + + +inline TCharUC& TCharUC::operator=(TUint aChar) +/** +Assigns an unsigned integer value to the 'character to upper case' object. + +@param aChar The value to assign. + +@return A reference to this 'character to upper case' object. +*/ + {SetChar(User::UpperCase(aChar));return(*this);} + + + + +inline TCharUC& TCharUC::operator=(const TChar& aChar) +/** +Assigns the specified character object to this 'character to upper case' +object. + +@param aChar The character object to assign. + +@return A reference to this 'character to upper case' object. +*/ + {SetChar(User::UpperCase(aChar));return(*this);} + + + + +// Class TDateTime +inline TDateTime::TDateTime() + : iYear(1980), + iMonth(EJanuary), + iDay(1), + iHour(0), + iMinute(0), + iSecond(0), + iMicroSecond(0) +/** +Constructs an uninitialised TDateTime object. +*/ + {} + + + + +inline TInt TDateTime::Year() const +/** +Gets the year component of the date/time. + +A negative value indicates a BC date. + +@return The year +*/ + {return(iYear);} + + + + +inline TMonth TDateTime::Month() const +/** +Gets the month component of the date/time. + +@return The month. EJanuary to EDecember. Offset from zero, so add one before + displaying the month number. +*/ + {return(iMonth);} + + + + +inline TInt TDateTime::Day() const +/** +Gets the day component of the date/time. + +@return The day. Offset from zero, so add one before displaying the day number. +*/ + {return(iDay);} + + + + +inline TInt TDateTime::Hour() const +/** +Gets the hour component of the date/time. + +@return The hour. +*/ + {return(iHour);} + + + + +inline TInt TDateTime::Minute() const +/** +Gets the minute component of the date/time. + +@return The minute. +*/ + {return(iMinute);} + + + + +inline TInt TDateTime::Second() const +/** +Gets the second component of the date/time. + +@return The second. +*/ + {return(iSecond);} + + + + +inline TInt TDateTime::MicroSecond() const +/** +Gets the microsecond component of the date/time. + +@return The microsecond. +*/ + {return(iMicroSecond);} + +// Class TTimeIntervalMicroSeconds + + + + +inline TTimeIntervalMicroSeconds::TTimeIntervalMicroSeconds() +/** +Default constructor. + +Constructs an uninitialised object. +*/ + {} + + + + +inline TTimeIntervalMicroSeconds::TTimeIntervalMicroSeconds(const TInt64& aInterval) + : iInterval(aInterval) +/** +Constructs the object with the specified 64-bit interval value. + +@param aInterval The 64-bit interval value with which the object is to be + initialised. +*/ + {} + + + + +inline TTimeIntervalMicroSeconds& TTimeIntervalMicroSeconds::operator=(const TInt64& aInterval) +/** +Assigns a 64-bit integer value to this object. + +@param aInterval The 64-bit integer interval value to be assigned. + +@return A reference to this object. +*/ + {iInterval=aInterval;return(*this);} + + + + +inline TBool TTimeIntervalMicroSeconds::operator==(const TTimeIntervalMicroSeconds& aInterval) const +/** +Tests whether this TTimeIntervalMicroSeconds object is equal to the +specified TTimeIntervalMicroSeconds object. + +@param aInterval The time interval to be compared with this time interval. + +@return True if the two time intervals are equal. False otherwise. +*/ + {return(iInterval==aInterval.iInterval);} + + + + +inline TBool TTimeIntervalMicroSeconds::operator!=(const TTimeIntervalMicroSeconds& aInterval) const +/** +Tests whether this TTimeIntervalMicroSeconds object is not equal to the +specified TTimeIntervalMicroSeconds object. + +@param aInterval The time interval to be compared with this time interval. + +@return True if the two time intervals are not equal. False otherwise. +*/ + {return(iInterval!=aInterval.iInterval);} + + + + +inline TBool TTimeIntervalMicroSeconds::operator>=(const TTimeIntervalMicroSeconds& aInterval) const +/** +Tests whether this TTimeIntervalMicroSeconds object is greater than or equal to the +specified TTimeIntervalMicroSeconds object. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is greater than or equal to the specified + time interval. False otherwise. +*/ + {return(iInterval>=aInterval.iInterval);} + + + + +inline TBool TTimeIntervalMicroSeconds::operator<=(const TTimeIntervalMicroSeconds& aInterval) const +/** +Tests whether this TTimeIntervalMicroSeconds object is less than or equal to the +specified TTimeIntervalMicroSeconds object. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is less than or equal to the specified + time interval. False otherwise. +*/ + {return(iInterval<=aInterval.iInterval);} + + + + +inline TBool TTimeIntervalMicroSeconds::operator>(const TTimeIntervalMicroSeconds& aInterval) const +/** +Tests whether this TTimeIntervalMicroSeconds object is greater than the +specified TTimeIntervalMicroSeconds object. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is greater than the specified + time interval. False otherwise. +*/ + {return(iInterval>aInterval.iInterval);} + + + + +inline TBool TTimeIntervalMicroSeconds::operator<(const TTimeIntervalMicroSeconds& aInterval) const +/** +Tests whether this TTimeIntervalMicroSeconds object is less than the +specified TTimeIntervalMicroSeconds object. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is less than the specified + time interval. False otherwise. +*/ + {return(iInterval=(TTimeIntervalBase aInterval) const +/** +Tests whether this time interval is greater than or equal to the +specified time interval. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is greater than or equal to the specified + time interval. False otherwise. +*/ + {return(iInterval>=aInterval.iInterval);} + + + + +inline TBool TTimeIntervalBase::operator<=(TTimeIntervalBase aInterval) const +/** +Tests whether this time interval is less than or equal to the +specified time interval. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is less than or equal to the specified + time interval. False otherwise. +*/ + {return(iInterval<=aInterval.iInterval);} + + + + +inline TBool TTimeIntervalBase::operator>(TTimeIntervalBase aInterval) const +/** +Tests whether this time interval is greater than the specified time interval. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is greater than the specified + time interval. False otherwise. +*/ + {return(iInterval>aInterval.iInterval);} + + + + +inline TBool TTimeIntervalBase::operator<(TTimeIntervalBase aInterval) const +/** +Tests whether this time interval is less than the specified time interval. + +@param aInterval The time interval to be compared with this time interval. + +@return True if this time interval is less than the specified + time interval. False otherwise. +*/ + {return(iInterval=(TTime aTime) const +/** +Tests whether this date/time is later than or the same as the +specified date/time. + +@param aTime The date/time to be compared with this date/time. + +@return True if this date/time is later than or the same as the + specified date/time. False otherwise. +*/ + {return(iTime>=aTime.iTime);} + + + + +inline TBool TTime::operator<=(TTime aTime) const +/** +Tests whether this date/time is earlier than or the same as the +specified date/time. + +@param aTime The date/time to be compared with this date/time. + +@return True if this date/time is earlier than or the same as the + specified date/time. False otherwise. +*/ + {return(iTime<=aTime.iTime);} + + + + +inline TBool TTime::operator>(TTime aTime) const +/** +Tests whether this date/time is later than the specified date/time. + +@param aTime The date/time to be compared with this date/time. + +@return True if this date/time is later than the specified date/time. + False otherwise. +*/ + {return(iTime>aTime.iTime);} + + + + +inline TBool TTime::operator<(TTime aTime) const +/** +Tests whether this date/time is earlier than the specified date/time. + +@param aTime The date/time to be compared with this date/time. + +@return True if this date/time is earlier than the specified date/time. + False otherwise. +*/ + {return(iTime=0 && aIndex=0 && aIndex(iLanguageDowngrade[aIndex]); + } + + + + +inline void TLocale::SetLanguageDowngrade(TInt aIndex, TLanguage aLanguage) +/** +Sets a language in the customisable part of the language downgrade path. + +@param aIndex An index into the customisable part of the path at which to + add the language, a value between zero and two. +@param aLanguage The language to add. ELangNone is considered to be the last + language in the path, no more will be searched, so can be used + to specify that no language downgrade is required. + +@see BaflUtils::NearestLanguageFile +@see BaflUtils::GetDowngradePath +*/ + { + __ASSERT_DEBUG(0 <= aIndex && aIndex < 3, User::Invariant()); + iLanguageDowngrade[aIndex] = static_cast(aLanguage); + } + + + + +/** +Gets the number mode stored in the locale. + +@return The number mode for the locale. +*/ +inline TDigitType TLocale::DigitType() const + { return iDigitType; } + + + + +/** +Sets the number mode for the locale. + +@param aDigitType The number mode to be set. +*/ +inline void TLocale::SetDigitType(TDigitType aDigitType) + { iDigitType=aDigitType; } + + + + +/** +Sets the device time state. + +@param aState The device time state. + +@deprecated Use the timezone server to coordinate automatic time adjustment. +*/ +inline void TLocale::SetDeviceTime(TDeviceTimeState aState) + { + iDeviceTimeState=aState; + } + + +/** +Gets the device time state. + +@return The device time state. + +@deprecated Use the timezone server to coordinate automatic time adjustment. +*/ +inline TLocale::TDeviceTimeState TLocale::DeviceTime() const + { + return iDeviceTimeState; + } + + +/** +Get the pointer to the TLocale object contained in this extended locale. + +@return Pointer to the TLocale object. +*/ +inline TLocale* TExtendedLocale::GetLocale() + { return &iLocale; } + +inline const LCharSet* TExtendedLocale::GetDefaultCharSet() + { return iDefaultCharSet; } + +inline const LCharSet* TExtendedLocale::GetPreferredCharSet() + { return iPreferredCharSet; } + +inline SLocaleLanguage* TExtendedLocale::GetLanguageSettings() + {return &iLanguageSettings;} + +inline SLocaleLocaleSettings* TExtendedLocale::GetLocaleExtraSettings() + { return &iLocaleExtraSettings; }; + +inline SLocaleTimeDateFormat* TExtendedLocale::GetLocaleTimeDateFormat() + { return &iLocaleTimeDateFormat; } + + +// Class TFindSemaphore +inline TFindSemaphore::TFindSemaphore() + : TFindHandleBase() +/** +Constructs the object with a default match pattern. + +The default match pattern, as implemented by the base class, is the single +character "*". + +A new match pattern can be set after construction by calling the Find() member +function of the TFindHandleBase base class. + +@see TFindHandleBase::Find +*/ + {} + + + + +inline TFindSemaphore::TFindSemaphore(const TDesC &aMatch) + : TFindHandleBase(aMatch) +/** +Constructs this object with the specified match pattern. + +A new match pattern can be set after construction by +calling TFindHandleBase::Find(). + +Note that after construction, the object contains a copy of the supplied +match pattern; the source descriptor can, therefore, be safely discarded. + +@param aMatch A reference to the descriptor containing the match pattern. + +@see TFindHandleBase::Find +*/ + {} + + + + +// Class TFindMutex +inline TFindMutex::TFindMutex() + : TFindHandleBase() +/** +Constructs this object with a default match pattern. + +The default match pattern, as implemented by the base class, is the single +character "*". + +A new match pattern can be set after construction by calling the Find() member +function of the TFindHandleBase base class. + +@see TFindHandleBase::Find +*/ + {} + + + + +inline TFindMutex::TFindMutex(const TDesC &aMatch) + : TFindHandleBase(aMatch) +/** +Constructs this object with the specified match pattern. + +A new match pattern can be set after construction by calling the Find() member +function of the TFindHandleBase base class. + +After construction, the object contains a copy of the supplied match pattern; +the source descriptor can, therefore, be safely discarded. + +@param aMatch The match pattern. + +@see TFindHandleBase::Find +*/ + {} + + + + +// Class TFindChunk +inline TFindChunk::TFindChunk() + : TFindHandleBase() +/** +Constructs this object with a default match pattern. + +The default match pattern, as implemented by the base class, is +the single character "*". + +A new match pattern can be set after construction by +calling TFindHandleBase::Find(). + +@see TFindHandleBase +*/ + {} + + + + +inline TFindChunk::TFindChunk(const TDesC &aMatch) + : TFindHandleBase(aMatch) +/** +Constructs the object with the specified match pattern. + +A new match pattern can be set after construction by +calling TFindHandleBase::Find(). + +@param aMatch The match pattern. + +@see TFindHandleBase +*/ + {} + + + + +// Class TFindThread +inline TFindThread::TFindThread() + : TFindHandleBase() +/** +Constructs this object with a default match pattern. + +The default match pattern, as implemented by the base class, +is the single character *. + +A new match pattern can be set after construction +by calling TFindHandleBase::Find(). + +@see TFindHandleBase::Find +*/ + {} + + + + +inline TFindThread::TFindThread(const TDesC &aMatch) + : TFindHandleBase(aMatch) +/** +Constructs this object with the specified match pattern. + +A new match pattern can be set after construction +by calling the TFindHandleBase::Find(). + +@see TFindHandleBase::Find +*/ + {} + + + + +// Class TFindProcess +inline TFindProcess::TFindProcess() + : TFindHandleBase() +/** +Constructs this object with a default match pattern. + +The default match pattern, as implemented by the base class, +is the single character *. + +A new match pattern can be set after construction +by calling TFindHandleBase::Find(). + +@see TFindHandleBase::Find +*/ + {} + + + + +inline TFindProcess::TFindProcess(const TDesC &aMatch) + : TFindHandleBase(aMatch) +/** +Constructs this object with the specified match pattern. + +A new match pattern can be set after construction +by calling the TFindHandleBase::Find(). + +@see TFindHandleBase::Find +*/ + {} + + + + +// Class TFindLogicalDevice +/** +Constructs the LDD factory object with a default match pattern. + +The default match pattern, as implemented by the base class, is the single +character "*". + +A new match pattern can be set after construction by calling the Find() member +function of the TFindHandleBase base class. + +@see TFindHandleBase::Find +*/ +inline TFindLogicalDevice::TFindLogicalDevice() + : TFindHandleBase() + {} + +/** +Constructs the LDD factory object with a specified match pattern. + +A new match pattern can be set after construction by calling +TFindHandleBase::Find(). + +@param aMatch The match pattern. + +@see TFindHandleBase::Find +*/ +inline TFindLogicalDevice::TFindLogicalDevice(const TDesC &aMatch) + : TFindHandleBase(aMatch) + {} + +// Class TFindPhysicalDevice +/** +Constructs the PDD factory object with a default match pattern. + +The default match pattern, as implemented by the base class, is the single +character "*". + +A new match pattern can be set after construction by calling the Find() member +function of the TFindHandleBase base class. + +@see TFindHandleBase::Find +*/ +inline TFindPhysicalDevice::TFindPhysicalDevice() + : TFindHandleBase() + {} + +/** +Constructs the PDD factory object with a specified match pattern. + +A new match pattern can be set after construction by calling +TFindHandleBase::Find(). + +@param aMatch The match pattern. + +@see TFindHandleBase::Find +*/ +inline TFindPhysicalDevice::TFindPhysicalDevice(const TDesC &aMatch) + : TFindHandleBase(aMatch) + {} + + + + + +// Class TFindServer +inline TFindServer::TFindServer() + : TFindHandleBase() +/** +Constructs the object with a default match pattern. + +The default match pattern, as implemented by the base class, is the single +character "*". + +A new match pattern can be set after construction by calling the Find() member +function of the TFindHandleBase base class. + +@see TFindHandleBase::Find +*/ + {} + + + + +inline TFindServer::TFindServer(const TDesC &aMatch) + : TFindHandleBase(aMatch) +/** +Constructs the object with a specified match pattern. + +A new match pattern can be set after construction by calling +TFindHandleBase::Find(). + +@param aMatch The match pattern. + +@see TFindHandleBase::Find +*/ + {} + + + + +// Class TFindLibrary +inline TFindLibrary::TFindLibrary() + : TFindHandleBase() +/** +Constructs this object with a default match pattern. + +The default match pattern is the single character ‘*’ and is implemented by +the base class TFindHandleBase. +*/ + {} + + + + +inline TFindLibrary::TFindLibrary(const TDesC &aMatch) + : TFindHandleBase(aMatch) +/** +Constructs this object with the specified match pattern. + +@param aMatch The descriptor containing the match pattern. +*/ + {} + + + + +// Class RDevice +/** +Opens a handle to an LDD factory object found using a TFindLogicalDevice object. + +A TFindLogicalDevice object is used to find all LDD factory objects whose full names match +a specified pattern. + +@param aFind A reference to the object which is used to find the LDD factory object. +@param aType An enumeration whose enumerators define the ownership of this + LDD factory object handle. If not explicitly specified, EOwnerProcess is + taken as default. + +@return KErrNone if successful, otherwise one of the other system wide error + codes. +*/ +inline TInt RDevice::Open(const TFindLogicalDevice& aFind,TOwnerType aType) + {return(RHandleBase::Open(aFind,aType));} + + + + +// Class RCriticalSection +inline TBool RCriticalSection::IsBlocked() const +/** +Tests whether the critical section is occupied by another thread. + +@return True, if the critical section is occupied by another thread. False, + otherwise. +*/ + {return(iBlocked!=1);} + + + + +// Class RMutex +inline TInt RMutex::Open(const TFindMutex& aFind,TOwnerType aType) +/** +Opens a handle to the global mutex found using a TFindMutex object. + +A TFindMutex object is used to find all global mutexes whose full names match +a specified pattern. + +By default, any thread in the process can use this instance of RMutex to access +the mutex. However, specifying EOwnerThread as the second parameter to this +function, means that only the opening thread can use this instance of RMutex +to access the mutex; any other thread in this process that wants to access +the mutex must either duplicate the handle or use OpenGlobal() again. + +@param aFind A reference to the object which is used to find the mutex. +@param aType An enumeration whose enumerators define the ownership of this + mutex handle. If not explicitly specified, EOwnerProcess is + taken as default. + +@return KErrNone if successful, otherwise one of the other system wide error + codes. +*/ + {return(RHandleBase::Open(aFind,aType));} + + + + +// Class RChunk +inline TInt RChunk::Open(const TFindChunk& aFind,TOwnerType aType) +/** +Opens a handle to the global chunk found using a TFindChunk object. + +A TFindChunk object is used to find all chunks whose full names match +a specified pattern. + +By default, ownership of this chunk handle is vested in the current process, +but can be vested in the current thread by passing EOwnerThread as the second +parameter to this function. + +@param aFind A reference to the TFindChunk object used to find the chunk. +@param aType An enumeration whose enumerators define the ownership of this + chunk handle. If not explicitly specified, EOwnerProcess is + taken as default. + +@return KErrNone if successful, otherwise another of the system error codes. +*/ + {return(RHandleBase::Open(aFind,aType));} + + + + +inline TBool RChunk::IsReadable() const +/** +Tests whether the chunk is mapped into its process address space. + +@return True, if the chunk is readable; false, otherwise. +*/ + {return (Attributes()&RHandleBase::EDirectReadAccess); } + + + + +inline TBool RChunk::IsWritable() const +/** +Tests whether the chunk mapped into its process address space and is writable. + +@return True, if the chunk is writable; false, otherwise. +*/ + {return (Attributes()&RHandleBase::EDirectWriteAccess); } + + + + +// Class TObjectId +inline TObjectId::TObjectId() +/** +Default constructor. +*/ + {} + + + + +inline TObjectId::TObjectId(TUint64 aId) + : iId(aId) +/** +Constructor taking an unsigned integer value. + +@param aId The value of the object id. +*/ + {} + + + + +inline TUint64 TObjectId::Id() const +/** +Return the ID as a 64 bit integer +*/ + { return iId; } + + + + +inline TObjectId::operator TUint() const +/** +Conversion operator invoked by the compiler when a TObjectId type is passed +to a function that is prototyped to take a TUint type. + +@see TUint +*/ + { return TUint(iId); } + + + + +inline TBool TObjectId::operator==(TObjectId aId) const +/** +Tests whether this thread Id is equal to the specified Id. + +@param aId The thread Id to be compared with this thread Id. + +@return True, if the thread Ids are equal; false otherwise. +*/ + {return iId==aId.iId;} + + + + +inline TBool TObjectId::operator!=(TObjectId aId) const +/** +Tests whether this thread Id is unequal to the specified thread Id. + +@param aId The thread Id to be compared with this thread Id. + +@return True, if the thread Ids are unequal; false otherwise. +*/ + {return iId!=aId.iId;} + + + + +// Class TThreadId +inline TThreadId::TThreadId() + : TObjectId() +/** +Default constructor. +*/ + {} + + + + +inline TThreadId::TThreadId(TUint64 aId) + : TObjectId(aId) +/** +Constructor taking an unsigned integer value. + +@param aId The value of the thread id. +*/ + {} + + + + +// Class RThread +inline RThread::RThread() + : RHandleBase(KCurrentThreadHandle) +/** +Default constructor. + +The constructor exists to initialise private data within this handle; it does +not create the thread object. + +Specifically, it sets the handle-number to the value KCurrentThreadHandle. +In effect, the constructor creates a default thread handle. +*/ + {} + + + + +inline TInt RThread::Open(const TFindThread& aFind,TOwnerType aType) +/** +Opens a handle to the thread found by pattern matching a name. + +A TFindThread object is used to find all threads whose full names match a +specified pattern. + +By default, ownership of this thread handle is vested in the current process, +but can be vested in the current thread by passing EOwnerThread as the second +parameter to this function. + +@param aFind A reference to the TFindThread object used to find the thread. +@param aType An enumeration whose enumerators define the ownership of this + thread handle. If not explicitly specified, EOwnerProcess is + taken as default. + +@return KErrNone if successful, otherwise one of the other system-wide error codes. +*/ + {return(RHandleBase::Open(aFind,aType));} + + + + +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +inline TBool RThread::HasCapability(TCapability aCapability, const char* aDiagnostic) const + { + return DoHasCapability(aCapability, aDiagnostic); + } + +inline TBool RThread::HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const + { + return DoHasCapability(aCapability1, aCapability2, aDiagnostic); + } + +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +// Only available to NULL arguments +inline TBool RThread::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoHasCapability(aCapability); + } + +inline TBool RThread::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoHasCapability(aCapability1, aCapability2); + } + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +// For things using KSuppressPlatSecDiagnostic +inline TBool RThread::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue); + } + +inline TBool RThread::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue); + } + +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +// Class TProcessId +inline TProcessId::TProcessId() + : TObjectId() +/** +Default constructor. +*/ + {} + + + + +inline TProcessId::TProcessId(TUint64 aId) + : TObjectId(aId) +/** +Constructor taking an unsigned integer value. + +@param aId The value of the process id. +*/ + {} + + + + +// Class RProcess +inline RProcess::RProcess() + : RHandleBase(KCurrentProcessHandle) +/** +Default constructor. + +The constructor exists to initialise private data within this handle; it does +not create the process object. + +Specifically, it sets the handle-number to the value KCurrentProcessHandle. +In effect, the constructor creates a default process handle. +*/ + {} + + + + +inline RProcess::RProcess(TInt aHandle) + : RHandleBase(aHandle) +/** +Constructor taking a handle number. + +@param aHandle The handle number to be used to construct this RProcess handle. +*/ + {} + + + + +inline TInt RProcess::Open(const TFindProcess& aFind,TOwnerType aType) +/** +Opens a handle to the process found by pattern matching a name. + +A TFindProcess object is used to find all processes whose full names match +a specified pattern. + +By default, ownership of this process handle is vested in the current process, +but can be vested in the current thread by passing EOwnerThread as the second +parameter to this function. + +@param aFind A reference to the TFindProcess object used to find the process. +@param aType An enumeration whose enumerators define the ownership of this + process handle. If not explicitly specified, EOwnerProcess is taken + as default. + +@return KErrNone if successful, otherwise one of the other system-wide error codes. +*/ + {return(RHandleBase::Open(aFind,aType));} + + + + +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +inline TBool RProcess::HasCapability(TCapability aCapability, const char* aDiagnostic) const + { + return DoHasCapability(aCapability, aDiagnostic); + } + +inline TBool RProcess::HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const + { + return DoHasCapability(aCapability1, aCapability2, aDiagnostic); + } + +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +// Only available to NULL arguments +inline TBool RProcess::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoHasCapability(aCapability); + } + +inline TBool RProcess::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoHasCapability(aCapability1, aCapability2); + } + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +// For things using KSuppressPlatSecDiagnostic +inline TBool RProcess::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue); + } + +inline TBool RProcess::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue); + } + +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + + + + +// Class RSessionBase + + +/** +Creates a session with a server, specifying no message slots. + +It should be called as part of session initialisation in the derived class. + +Message slots are not pre-allocated for the session but are taken from +a system-wide pool allowing up to 255 asynchronous messages to be outstanding. +This raises a risk of failure due to lack of memory and, therefore, this mode +of operation is not viable for sessions that make guarantees about the failure +modes of asynchonous services. + +@param aServer The name of the server with which a session is to + be established. +@param aVersion The lowest version of the server with which this client + is compatible + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ +inline TInt RSessionBase::CreateSession(const TDesC& aServer,const TVersion& aVersion) + {return CreateSession(aServer,aVersion,-1,EIpcSession_Unsharable,NULL,0);} + + + + +/** +Creates a session with a server, specifying no message slots. + +It should be called as part of session initialisation in the derived class. + +Message slots are not pre-allocated for the session but are taken from +a system-wide pool allowing up to 255 asynchronous messages to be outstanding. +This raises a risk of failure due to lack of memory and, therefore, this mode +of operation is not viable for sessions that make guarantees about the failure +modes of asynchonous services. + +@param aServer A handle to a server with which a session is to be established. +@param aVersion The lowest version of the server with which this client + is compatible + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ +inline TInt RSessionBase::CreateSession(RServer2 aServer,const TVersion& aVersion) + {return CreateSession(aServer,aVersion,-1,EIpcSession_Unsharable,NULL,0);} + + + + +/** +Issues a blind request to the server with the specified function number, +and arguments. + +A blind request is one where the server does not issue a response +to the client. + +@param aFunction The function number identifying the request. +@param aArgs A set of up to 4 arguments and their types to be passed + to the server. + +@return KErrNone, if the send operation is successful; + KErrServerTerminated, if the server no longer present; + KErrServerBusy, if there are no message slots available; + KErrNoMemory, if there is insufficient memory available. + +@panic USER 72 if the function number is negative. +*/ +inline TInt RSessionBase::Send(TInt aFunction,const TIpcArgs& aArgs) const + {return DoSend(aFunction,&aArgs);} + + + + +/** +Issues an asynchronous request to the server with the specified function +number and arguments. + +The completion status of the request is returned via the request +status object, aStatus. + +@param aFunction The function number identifying the request. +@param aArgs A set of up to 4 arguments and their types to be passed + to the server. +@param aStatus The request status object used to contain the completion status + of the request. + +@panic USER 72 if the function number is negative. +*/ +inline void RSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const + {DoSendReceive(aFunction,&aArgs,aStatus);} + + + + +/** +Issues a synchronous request to the server with the specified function number +and arguments. + +@param aFunction The function number identifying the request. +@param aArgs A set of up to 4 arguments and their types to be passed + to the server. + +@return KErrNone, if the send operation is successful; + KErrServerTerminated, if the server no longer present; + KErrServerBusy, if there are no message slots available; + KErrNoMemory, if there is insufficient memory available. + +@panic USER 72 if the function number is negative. +*/ +inline TInt RSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const + {return DoSendReceive(aFunction,&aArgs);} + + + + +/** +Issues a blind request to the server with the specified function number, +but with no arguments. + +A blind request is one where the server does not issue a response +to the client. + +@param aFunction The function number identifying the request. + +@return KErrNone, if the send operation is successful; + KErrServerTerminated, if the server no longer present; + KErrServerBusy, if there are no message slots available; + KErrNoMemory, if there is insufficient memory available. + +@panic USER 72 if the function number is negative. +*/ +inline TInt RSessionBase::Send(TInt aFunction) const + {return DoSend(aFunction,NULL);} + + + + +/** +Issues an asynchronous request to the server with the specified function +number, but with no arguments. + +The completion status of the request is returned via the request +status object, aStatus. + +@param aFunction The function number identifying the request. +@param aStatus The request status object used to contain the completion + status of the request. + +@panic USER 72 if the function number is negative. +*/ +inline void RSessionBase::SendReceive(TInt aFunction,TRequestStatus& aStatus) const + { DoSendReceive(aFunction,NULL,aStatus);} + + + + +/** +Sets the handle-number of this handle to the specified +value. + +The function can take a (zero or positive) handle-number, +or a (negative) error number. + +If aHandleOrError represents a handle-number, then the handle-number of this handle +is set to that value. +If aHandleOrError represents an error number, then the handle-number of this handle is set to zero +and the negative value is returned. + +@param aHandleOrError A handle-number, if zero or positive; an error value, if negative. + +@return KErrNone, if aHandle is a handle-number; the value of aHandleOrError, otherwise. +*/ +inline TInt RSessionBase::SetReturnedHandle(TInt aHandleOrError) + { return RHandleBase::SetReturnedHandle(aHandleOrError);} + + + + +inline TInt RSessionBase::SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle) + { return RHandleBase::SetReturnedHandle(aHandleOrError,aHandle);} +/** +Issues a synchronous request to the server with the specified function number, +but with no arguments. + +@param aFunction The function number identifying the request. + +@return KErrNone, if the send operation is successful; + KErrServerTerminated, if the server no longer present; + KErrServerBusy, if there are no message slots available; + KErrNoMemory, if there is insufficient memory available. + +@panic USER 72 if the function number is negative. +*/ +inline TInt RSessionBase::SendReceive(TInt aFunction) const + {return DoSendReceive(aFunction,NULL);} + + + + +// Class RSubSessionBase +inline RSubSessionBase::RSubSessionBase() + : iSubSessionHandle(0) +/** +Default constructor +*/ + {} + + + + +inline TInt RSubSessionBase::SubSessionHandle() const +/** +Gets the sub-session handle number. + +This number is automatically passed to the server when making requests and is +used to identify the appropriate server-side sub-session. + +@return The sub-session handle number. +*/ + {return iSubSessionHandle;} + + + + +/** +Creates a new sub-session within an existing session. + +@param aSession The session to which this sub-session will belong. +@param aFunction The opcode specifying the requested service; the server should interpret this as a request to create a sub-session. +@param aArgs The message arguments. + +@return KErrNone if successful, otherwise one of the system-wide error codes. +*/ +inline TInt RSubSessionBase::CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs) + { return DoCreateSubSession(aSession,aFunction,&aArgs); } + + + + +/** +Creates a new sub-session within an existing session. + +This variant sends no message arguments to the server. + +@param aSession The session to which this sub-session will belong. +@param aFunction The opcode specifying the requested service; the server should interpret this as a request to create a sub-session. + +@return KErrNone if successful, otherwise one of the system-wide error codes. +*/ +inline TInt RSubSessionBase::CreateSubSession(const RSessionBase& aSession,TInt aFunction) + { return DoCreateSubSession(aSession,aFunction,NULL); } + + + + +/** +Sends a blind message to the server - no reply is expected. + +A set of message arguments is passed that can be used to specify client +addresses, which the server can use to read from and write to the client +address space. + +Note that this function can fail if there are no available message-slots, either +in the system wide pool (if this is being used), or in the session reserved pool +(if this is being used). If the client request is synchronous, then always use +the synchronous variant of SendReceive(); this is guaranteed to reach the server. + +@param aFunction The opcode specifying the requested service. +@param aArgs The message arguments. + +@return KErrNone if successful, otherwise one of the system-wide error codes. +*/ +inline TInt RSubSessionBase::Send(TInt aFunction,const TIpcArgs& aArgs) const + {return DoSend(aFunction,&aArgs);} + + + + +/** +Sends a message to the server and waits asynchronously for the reply. + +An opcode specifies the service required. +A set of message arguments is passed that can be used to specify client addresses, +which the server can use to read from and write to the client address space. + +Note that this function can fail if there are no available message-slots, +either in the system wide pool (if this is being used), or in the session +reserved pool (if this is being used). If the client request is synchronous, +then always use the synchronous variant of SendReceive(); +this is guaranteed to reach the server. + +@param aFunction The opcode specifying the requested service. +@param aArgs The message arguments. +@param aStatus A request status which indicates the completion status of the asynchronous request. +*/ +inline void RSubSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const + {DoSendReceive(aFunction,&aArgs,aStatus);} + + + + +/** +Sends a message to the server and waits synchronously for a reply. + +An opcode specifies the service required. +A set of message arguments is passed that can be used to specify client addresses, +which the server can use to read from and write to the client address space. + +Note that this function will only fail if the server itself fails or environmental +errors occur in the server. All requests made using this function are guaranteed to +reach the server. This means that all synchronous client requests (typically those +that return void) should be routed through this synchronous variant of SendReceive(). + +@param aFunction The opcode specifying the requested service. +@param aArgs The message arguments. + +@return KErrNone if successful, otherwise one of the system-wide error codes. +*/ +inline TInt RSubSessionBase::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const + {return DoSendReceive(aFunction,&aArgs);} + + + + +/** +Sends a blind message to the server - no reply is expected. + +This variant sends no message arguments to the server. + +@param aFunction The opcode specifying the requested service. + +@return KErrNone if successful, otherwise one of the system-wide error codes. +*/ +inline TInt RSubSessionBase::Send(TInt aFunction) const + {return DoSend(aFunction,NULL);} + + + + +/** +Sends a message to the server and waits asynchronously for the reply. + +An opcode specifies the service required. +This variant sends no message arguments to the server. + +@param aFunction The opcode specifying the requested service. +@param aStatus A request status which indicates the completion status of the asynchronous request. +*/ +inline void RSubSessionBase::SendReceive(TInt aFunction,TRequestStatus& aStatus) const + { DoSendReceive(aFunction,NULL,aStatus);} + + + + +/** +Sends a message to the server and waits synchronously for a reply. + +An opcode specifies the service required. +This variant sends no message arguments to the server. + +@param aFunction The opcode specifying the requested service. + +@return KErrNone if successful, otherwise one of the system-wide error codes. +*/ +inline TInt RSubSessionBase::SendReceive(TInt aFunction) const + {return DoSendReceive(aFunction,NULL);} + + + + +// Class RRefBase + +/** +Default constructor. +*/ +inline RRefBase::RRefBase() + : iPtr(NULL) + {} + + + +/** +Copy constructor. + +@param aRef A reference to the object to be copied. +*/ +inline RRefBase::RRefBase(const RRefBase &aRef) + {Copy(aRef);} + + + + +// Class RRef + + +/** +Default constructor. +*/ +template +inline RRef::RRef() + {} + + + +/** +Copy constructor. + +The constructor frees any existing contained object, and takes ownership of +the object owned by anObject. + +@param anObject A reference to another 'reference' object. + On return from this constructor, anObject may be safely + orphaned if it lives on the program stack. +*/ +template +inline RRef::RRef(const RRef &anObject) + {Copy(anObject);} + + + + +/** +Assignment operator. + +The constructor frees any existing contained object, and takes ownership of +the object owned by anObject. + +@param anObject A reference to another 'reference' object. + On return from this constructor, anObject may be safely + orphaned if it lives on the program stack. +*/ +template +inline void RRef::operator=(const RRef &anObject) + {Copy(anObject);} + + + + +/** +Gets a pointer to the contained object. + +@return A pointer to the contained object +*/ +template +inline T *RRef::operator->() + {return((T *)iPtr);} + + + + +/** +Gets a pointer to the contained object. + +@return A pointer to the contained object +*/ +template +inline RRef::operator T*() + {return((T *)iPtr);} + + + + +/** +Creates a copy of the specified object, which is to be contained by +this reference object. + +The amount of memory set aside to contain the object is defined by the size +of the object + +@param anObject The object to be packaged up by this reference object. +*/ +template +void RRef::Alloc(const T &anObject) + {DoAlloc(&anObject,sizeof(T));} + + + + +/** +Creates a copy of the specified object, which is to be contained by +this reference object. + +The amount of memory set aside to contain the object is defined by aSize. + +@param anObject The object to be packaged up by this reference object. +@param aSize The amount of memory to be set aside to contain the object. + You must make sure that this is big enough. +*/ +template +void RRef::Alloc(const T &anObject,TInt aSize) + {DoAlloc(&anObject,aSize);} + + + + +/** +Creates a copy of the specified object, which is to be contained by +this reference object, and leaves on failure. + +The amount of memory set aside to contain the object is defined by the size +of the object + +@param anObject The object to be packaged up by this reference object. +*/ +template +void RRef::AllocL(const T &anObject) + {DoAllocL(&anObject,sizeof(T));} + + + + +/** +Creates a copy of the specified object, which is to be contained by +this reference object, and leaves on failure. + +The amount of memory set aside to contain the object is defined by aSize. + +@param anObject The object to be packaged up by this reference object. +@param aSize The amount of memory to be set aside to contain the object. + You must make sure that this is big enough. +*/ +template +void RRef::AllocL(const T &anObject,TInt aSize) + {DoAllocL(&anObject,aSize);} + + + + +// Class TRegion +inline TBool TRegion::CheckError() const +/** +Tests whether the region's error flag is set. + +The error flag may be set: + +1. when an attempt to allocate more memory for the region fails + +2. if an attempt is made to expand a fixed size region beyond its allocated + size + +3. if ForceError() has been called. + +Use Clear() to unset the error flag, clear the region and free all allocated +memory. + +@return True, if the error flag is set; false, otherwise. + +@see TRegion::ForceError +@see TRegion::Clear +*/ + {return(iError);} + + + + +inline TInt TRegion::Count() const +/** +Gets the number of rectangles in this region. + +@return The number of rectangles. +*/ + {return(iCount);} + + + + +inline const TRect *TRegion::RectangleList() const +/** +Gets a pointer to the array of rectangles defining this region. + +@return Pointer to the array of rectangles. Note that array is a standard + C++ array, i.e. a concatenated set of TRect objects. Use Count() to + get the number of rectangles. + +@see TRegion::Count +*/ + {return(((TRegion *)this)->RectangleListW());} + + + + +inline TRegion::TRegion() + {} + + + + +// Class RRegion +inline TInt RRegion::CheckSpare() const +/** +Gets the number of free memory slots in the region. + +This is the number of slots which have been allocated, minus the number in +use. + +@return The number of free memory slots in the region. +*/ + {return(iAllocedRects-iCount);} + + + + +// Class TRegionFix +template +inline TRegionFix::TRegionFix() : TRegion(-S) +/** +Constructs a default fixed size region. +*/ + {} + + + + +template +inline TRegionFix::TRegionFix(const TRect &aRect) : TRegion(-S) +/** +Constructs a fixed size region with a TRect. + +@param aRect Rectangle to be added to the newly constructed region. +*/ + {AddRect(aRect);} + + + + +template +inline TRegionFix::TRegionFix(const TRegionFix &aRegion) +/** +Copy constructor. + +@param aRegion The TRegionFix object to be copied. +*/ + {*this=aRegion;} + + + + +template +inline RRegionBuf::RRegionBuf() : RRegion(-S&(~ERRegionBuf),S) +/** +Constructs a default object. + +The granularity is the value of the template parameter. +*/ + {} + + + +template +inline RRegionBuf::RRegionBuf(const RRegion &aRegion) +/** +Constructs this object from the specified RRegion. + +@param aRegion The region to assign to this RRegionBuf. +*/ + {*this=aRegion;} + + + + +template +inline RRegionBuf::RRegionBuf(const TRect &aRect) : RRegion(-S&(~ERRegionBuf),S) +/** +Constructs an RRegionBuf with a TRect. + +Its granularity is initialised to the value contained in the template argument. +The resulting region consists of the specified single rectangle. + +@param aRect The single rectangle with which to initialise the region. +*/ + {AddRect(aRect);} + + + + +template +inline RRegionBuf::RRegionBuf(const RRegionBuf &aRegion) +/** +Copy constructs from an existing RRegionBuf object. + +@param aRegion The RRegionBuf to be copied. +*/ + {*this=aRegion;} + + + + +// enum TTimerLockSpec +inline TTimerLockSpec &operator++(TTimerLockSpec &aLock) + { + return aLock=((aLock==ETwelveOClock) ? EOneOClock : (TTimerLockSpec)((TInt)aLock+1)); + } +inline TTimerLockSpec operator++(TTimerLockSpec &aLock, TInt) + { + TTimerLockSpec l=aLock; + aLock=((aLock==ETwelveOClock) ? EOneOClock : (TTimerLockSpec)((TInt)aLock+1)); + return l; + } + + + + +// Class TCheckedUid +inline const TUidType& TCheckedUid::UidType() const +/** +Gets the Uid type contained in this object. + +@return The Uid type. +*/ + {return(iType);} + + + + +// Array deletion support, uses CBase deletion (virtual d'tor) for all C-classes +template +/** @internalComponent +*/ +void _DeleteArray(T** aBegin,T** aEnd) + {for (;;) if (aBegin +/** @internalComponent +*/ +struct _ArrayUtil + { + static inline void Delete(T* aBegin,T* aEnd,CBase*) + {::_DeleteArray((CBase**)aBegin,(CBase**)aEnd);} + static inline void Delete(T* aBegin,T* aEnd,TAny*) + {::_DeleteArray(aBegin,aEnd);} + static inline void Delete(T* aArray,TInt aCount) + {Delete(aArray,aArray+aCount,*aArray);} + }; + + + + +#ifndef __TOOLS__ +// Template class TFixedArray +IMPORT_C void PanicTFixedArray(); + + + + +template +inline TFixedArray::TFixedArray() +/** +Default constructor. + +Constructs an uninitialised C++ array. +*/ + {} + + + + +template +inline void TFixedArray::Copy(const T* aList,TInt aLength) +/** +Copies the specified set of contiguous objects into the C++ array. + +The copy operation starts at the beginning of the array, replacing +any existing data. + +@param aList A pointer to a set of contiguous objects. +@param aLength The number of contiguous objects to be copied. This value must + not be negative and must not be greater than the size of the + array as defined by the integer template parameter. + +@panic USER 133, in a debug build only, if aLength is negative or is greater + than the size of the array as defined by the integer template parameter. +*/ + {__ASSERT_DEBUG(TUint(aLength)<=TUint(S),PanicTFixedArray());Mem::Copy(iRep,aList,aLength*sizeof(T));} + + + + +template +inline TFixedArray::TFixedArray(const T* aList,TInt aLength) +/** +Constructs a C++ array initialised with the specified objects. + +@param aList A pointer to a set of contiguous objects. +@param aLength The number of contiguous objects to be copied. This value must + not be negative and must not be greater than the size of the + array as defined by the integer template parameter. + +@panic USER 133, in a debug build only, if aLength is negative or is greater + than the size of the array as defined by the integer template parameter. +*/ + {Copy(aList,aLength);} + + + + +template +inline void TFixedArray::Reset() +/** +Fills every element of the array with binary zeroes. +*/ + {Mem::FillZ(iRep,sizeof(iRep));} + + + + +template +inline TInt TFixedArray::Count() const +/** +Gets the size of the array. + +For any instance of this class, the array size +is fixed and has the same value as the integer template parameter. + +@return The size of the array. +*/ + {return S;} + + + + +template +inline TInt TFixedArray::Length() const +/** +Gets the size of an array element, in bytes. + +@return The size of an array element, in bytes. +*/ + {return sizeof(T);} + + + + +template +inline TBool TFixedArray::InRange(TInt aIndex) + {return TUint(aIndex) +inline T& TFixedArray::operator[](TInt aIndex) +/** +Gets a reference to the specified element within the C++ array. + +@param aIndex The position of the element within the array. This is an offset value; + a zero value refers to the first element in the array. This value must be + greater than or equal to zero and less than the size of the array. + +@return A reference to an element of the array. + +@panic USER 133, in a debug build only, if aIndex is negative or greater than or equal to the size + of the array as defined by the integer template parameter. +*/ + {__ASSERT_DEBUG(InRange(aIndex),PanicTFixedArray());return iRep[aIndex];} + + + + +template +inline const T& TFixedArray::operator[](TInt aIndex) const +/** +Gets a const reference to the specified element within the C++ array. + +@param aIndex The position of the element within the array. This is an offset value; + a zero value refers to the first element in the array. This value must be + greater than or equal to zero and less than the size of the array. + +@return A const reference to an element of the array; the element cannot be + changed through this reference. + +@panic USER 133, in a debug build only, if aIndex is negative or greater than or equal to the size + of the array as defined by the integer template parameter. +*/ + {return CONST_CAST(ThisClass&,*this)[aIndex];} + + + + +template +inline T& TFixedArray::At(TInt aIndex) +/** +Gets a reference to the specified element within the C++ array. + +@param aIndex The position of the element within the array. This is an offset value; + a zero value refers to the first element in the array. This value must be + greater than or equal to zero and less than the size of the array. + +@return A reference to an element of the array. + +@panic USER 133, if aIndex is negative or greater than or equal to the size + of the array as defined by the integer template parameter. +*/ + {__ASSERT_ALWAYS(InRange(aIndex),PanicTFixedArray());return iRep[aIndex];} + + + + +template +inline const T& TFixedArray::At(TInt aIndex) const +/** +Gets a const reference to the specified element within the C++ array. + +@param aIndex The position of the element within the array. This is an offset value; + a zero value refers to the first element in the array. This value must be + greater than or equal to zero and less than the size of the array. + +@return A const reference to an element of the array; the element cannot be + changed through this reference. + +@panic USER 133, in a debug build only, if aIndex is negative or greater than or equal to the size + of the array as defined by the integer template parameter. +*/ + {return CONST_CAST(ThisClass&,*this).At(aIndex);} + + + + +template +inline T* TFixedArray::Begin() +/** +Gets a pointer to the first element of the array. + +@return A pointer to the first element of the array. +*/ + {return &iRep[0];} + + + + +template +inline T* TFixedArray::End() +/** +Gets a pointer to the first byte following the end of the array. + +@return A pointer to the first byte following the end of the array. +*/ + {return &iRep[S];} + + + + +template +inline const T* TFixedArray::Begin() const +/** +Gets a pointer to the first element of the array. + +@return A pointer to a const element of the array. +*/ + {return &iRep[0];} + + + + +template +inline const T* TFixedArray::End() const +/** +Gets a pointer to the first byte following the end of the array. + +@return A pointer to the const first byte following the end of the array. +*/ + {return &iRep[S];} + + + + +template +inline TInt TFixedArray::CountFunctionR(const CBase*) + {return S;} + + + + +template +inline const TAny* TFixedArray::AtFunctionR(const CBase* aThis,TInt aIndex) + {return &REINTERPRET_CAST(const ThisClass&,*aThis)[aIndex];} + + + + +template +inline TArray TFixedArray::Array() const +/** +Creates and returns a generic array for this C++ array. + +@return A generic array for this C++ array. +*/ + {return TArray(CountFunctionR,AtFunctionR,REINTERPRET_CAST(const CBase*,this));} + + + + +template +inline void TFixedArray::DeleteAll() +/** +Invokes the delete operator on every member of the array. + +The function can only be used for arrays of pointers to CBase derived objects. + +If the array is to be used after a call to this function, it is good practice +to call TFixedArray::Reset() to set all array elements to +NULL. +*/ + {_ArrayUtil::Delete(iRep,S);} +#endif + + + + +// class User + +inline RHeap* User::SwitchHeap(RAllocator* aHeap) +/** +Changes the current thread's heap. + +@param aHeap A pointer to the new heap handle. + +@return A pointer to the old heap handle. +*/ + { return (RHeap*)SwitchAllocator(aHeap); } + + + + +inline RHeap& User::Heap() +/** +Gets a reference to the handle to the current thread's heap. + +@return A reference to the handle to the current thread's heap. +*/ + { return (RHeap&)Allocator(); } + + + + +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +inline TBool User::CreatorHasCapability(TCapability aCapability, const char* aDiagnostic) + { + return DoCreatorHasCapability(aCapability, aDiagnostic); + } + +inline TBool User::CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) + { + return DoCreatorHasCapability(aCapability1, aCapability2, aDiagnostic); + } + +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +// Only available to NULL arguments +inline TBool User::CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/) + { + return DoCreatorHasCapability(aCapability); + } + +inline TBool User::CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/) + { + return DoCreatorHasCapability(aCapability1, aCapability2); + } + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +// For things using KSuppressPlatSecDiagnostic +inline TBool User::CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) + { + return DoCreatorHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue); + } + +inline TBool User::CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) + { + return DoCreatorHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue); + } + +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +/** Sets this TSecurityInfo to the security attributes of this process. */ +inline void TSecurityInfo::SetToCurrentInfo() + { new (this) TSecurityInfo(RProcess()); } + +/** Constructs a TSecurityInfo using the security attributes of aProcess */ +inline void TSecurityInfo::Set(RProcess aProcess) + { new (this) TSecurityInfo(aProcess); } + +/** Constructs a TSecurityInfo using the security attributes of the process +owning aThread +*/ +inline void TSecurityInfo::Set(RThread aThread) + { new (this) TSecurityInfo(aThread); } + +/** Constructs a TSecurityInfo using the security attributes of the process +which sent the message aMsgPtr */ +inline void TSecurityInfo::Set(RMessagePtr2 aMsgPtr) + { new (this) TSecurityInfo(aMsgPtr); } + +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The RProcess object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const + { + return DoCheckPolicy(aProcess, aDiagnostic); + } + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const + { + return DoCheckPolicy(aThread, aDiagnostic); + } + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const + { + return DoCheckPolicy(aMsgPtr, aDiagnostic); + } + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs + it finds to be missing. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object + +@internalComponent +*/ +inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const + { + return DoCheckPolicy(aMsgPtr, aMissing, aDiagnostic); + } + +/** Checks this policy against the platform security attributes of this process' creator. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of this process' creator, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic) const + { + return DoCheckPolicyCreator(aDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const + { + return (&(*this))->CheckPolicy(aProcess, aDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const + { + return (&(*this))->CheckPolicy(aThread, aDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const + { + return (&(*this))->CheckPolicy(aMsgPtr, aDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) +@internalComponent +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const + { + return (&(*this))->CheckPolicy(aMsgPtr, aMissing, aDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic) const + { + return (&(*this))->CheckPolicyCreator(aDiagnostic); + } + +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +/** Checks this policy against the platform security attributes of aProcess. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aProcess The RProcess object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aProcess, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoCheckPolicy(aProcess); + } + +/** Checks this policy against the platform security attributes of the process +owning aThread. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aThread The thread whose owning process' platform security attributes +are to be checked against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security parameters of the owning process of aThread, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoCheckPolicy(aThread); + } + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoCheckPolicy(aMsgPtr); + } + +/** Checks this policy against the platform security attributes of the process which sent +the given message. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aMsgPtr The RMessagePtr2 object to check against this TSecurityPolicy. +@param aMissing A TSecurityInfo object which this method fills with any capabilities or IDs + it finds to be missing. +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of aMsg, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object + +@internalComponent +*/ +inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoCheckPolicy(aMsgPtr, aMissing); + } + +/** Checks this policy against the platform security attributes of this process' creator. + + When a check fails the action taken is determined by the system wide Platform Security + configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted. + If PlatSecEnforcement is OFF, then this function will return ETrue even though the + check failed. + +@param aDiagnostic A string that will be emitted along with any diagnostic message + that may be issued if the policy check fails. + This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro + which enables it to be easily removed from the system. +@return ETrue if all the requirements of this TSecurityPolicy are met by the +platform security attributes of this process' creator, EFalse otherwise. +@panic USER 190 if 'this' is an invalid SSecurityInfo object +*/ +inline TBool TSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoCheckPolicyCreator(); + } + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +inline TBool TSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoCheckPolicy(aProcess, KSuppressPlatSecDiagnosticMagicValue); + } + +inline TBool TSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoCheckPolicy(aThread, KSuppressPlatSecDiagnosticMagicValue); + } + +inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoCheckPolicy(aMsgPtr, KSuppressPlatSecDiagnosticMagicValue); + } + +inline TBool TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoCheckPolicy(aMsgPtr, aMissing, KSuppressPlatSecDiagnosticMagicValue); + } + +inline TBool TSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoCheckPolicyCreator(KSuppressPlatSecDiagnosticMagicValue); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +/** +@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/) const + { + return (&(*this))->CheckPolicy(aProcess); + } + +/** +@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/) const + { + return (&(*this))->CheckPolicy(aThread); + } + +/** +@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/) const + { + return (&(*this))->CheckPolicy(aMsgPtr); + } + +/** +@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) +@internalComponent +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/) const + { + return (&(*this))->CheckPolicy(aMsgPtr, aMissing); + } + +/** +@see TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/) const + { + return (&(*this))->CheckPolicyCreator(); + } + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +/** +@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RProcess aProcess, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return (&(*this))->CheckPolicy(aProcess, KSuppressPlatSecDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RThread aThread, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return (&(*this))->CheckPolicy(aThread, KSuppressPlatSecDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return (&(*this))->CheckPolicy(aMsgPtr, KSuppressPlatSecDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) +@internalComponent +*/ +inline TBool TStaticSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return (&(*this))->CheckPolicy(aMsgPtr, aMissing, KSuppressPlatSecDiagnostic); + } + +/** +@see TSecurityPolicy::CheckPolicyCreator(const char* aDiagnostic) +*/ +inline TBool TStaticSecurityPolicy::CheckPolicyCreator(OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return (&(*this))->CheckPolicyCreator(KSuppressPlatSecDiagnostic); + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +#endif //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + + + +#ifndef __KERNEL_MODE__ + +/** +Appends an object pointer onto the array. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be appended. +*/ +template +inline void RPointerArray::AppendL(const T* anEntry) + { User::LeaveIfError(Append(anEntry));} + + +/** +Inserts an object pointer into the array at the specified position. + +The function leaves with one of the system wide error codes, if +the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be inserted. +@param aPos The position within the array where the object pointer is to be + inserted. The position is relative to zero, i.e. zero implies + that a pointer is inserted at the beginning of the array. + +@panic USER 131, if aPos is negative, or is greater than the number of object + pointers currently in the array. +*/ +template +inline void RPointerArray::InsertL(const T* anEntry, TInt aPos) + { User::LeaveIfError(Insert(anEntry,aPos)); } + + +/** +Finds the first object pointer in the array which matches the specified object +pointer, using a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@return The index of the first matching object pointer within the array. +@leave KErrNotFound, if no matching object pointer can be found. +*/ +template +inline TInt RPointerArray::FindL(const T* anEntry) const + { return User::LeaveIfError(Find(anEntry));} + + +/** +Finds the first object pointer in the array whose object matches the specified +object, using a sequential search and a matching algorithm. + +The algorithm for determining whether two class T objects match is provided +by a function supplied by the caller. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anIdentity A package encapsulating the function which determines whether + two class T objects match. + +@return The index of the first matching object pointer within the array. +@leave KErrNotFound, if no suitable object pointer can be found. +*/ +template +inline TInt RPointerArray::FindL(const T* anEntry, TIdentityRelation anIdentity) const + { return User::LeaveIfError(Find(anEntry, anIdentity));} + + +/** +Finds the last object pointer in the array which matches the specified object +pointer, using a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@return The index of the last matching object pointer within the array. +@leave KErrNotFound, if no matching object pointer can be found. +*/ +template +inline TInt RPointerArray::FindReverseL(const T* anEntry) const + { return User::LeaveIfError(FindReverse(anEntry));} + + +/** +Finds the last object pointer in the array whose object matches the specified +object, using a sequential search and a matching algorithm. + +The algorithm for determining whether two class T objects match is provided +by a function supplied by the caller. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anIdentity A package encapsulating the function which determines whether + two class T objects match. + +@return The index of the last matching object pointer within the array. +@leave KErrNotFound, if no suitable object pointer can be found. +*/ +template +inline TInt RPointerArray::FindReverseL(const T* anEntry, TIdentityRelation anIdentity) const + { return User::LeaveIfError(FindReverse(anEntry, anIdentity));} + + +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +The function assumes that object pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. + +@return The index of the matching object pointer within the array +@leave KErrNotFound, if no suitable object pointer can be found. +*/ +template +inline TInt RPointerArray::FindInAddressOrderL(const T* anEntry) const + { return User::LeaveIfError(FindInAddressOrder(anEntry));} + + +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an algorithm +supplied by the caller and packaged as a TLinearOrder. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return The index of the matching object pointer within the array. + +@leave KErrNotFound, if no suitable object pointer can be found. +*/ +template +inline TInt RPointerArray::FindInOrderL(const T* anEntry, TLinearOrder anOrder) const + { return User::LeaveIfError(FindInOrder(anEntry, anOrder));} + + +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +The function assumes that object pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anIndex A reference to a TInt into which the + function puts an index value: If the function does not leave, + this is the index of the matching object pointer within the + array. If the function leaves with KErrNotFound, this is the + index of the first object pointer within the array which + logically follows after anEntry. + +@leave KErrNotFound, if no suitable object pointer can be found. +*/ +template +inline void RPointerArray::FindInAddressOrderL(const T* anEntry, TInt& anIndex) const + { User::LeaveIfError(FindInAddressOrder(anEntry, anIndex)); } + + +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an +algorithm supplied by the caller and packaged as a TLinearOrder. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anIndex A TInt supplied by the caller. On return, contains an + index value: + If the function does not leave, this is the index of the + matching object pointer within the array. + If the function leaves with KErrNotFound, this is the index of + the first object pointer in the array whose object is bigger + than the entry being searched for - if no objects pointed to in + the array are bigger, then the index value is the same as the + total number of object pointers in the array. + +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@leave KErrNotFound, if no suitable object pointer can be found. +*/ +template +inline void RPointerArray::FindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder anOrder) const + { User::LeaveIfError(FindInOrder(anEntry, anIndex, anOrder)); } + + +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that object pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return If there is a matching element, the array index of a matching element - what + the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows the + last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline TInt RPointerArray::SpecificFindInAddressOrderL(const T* anEntry, TInt aMode) const + { return User::LeaveIfError(SpecificFindInAddressOrder(anEntry, aMode));} + + +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +In the case that there is more than one matching element finds the first, last +or any match as specified by the value of aMode. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an algorithm +supplied by the caller and packaged as a TLinearOrder type. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@return If there is a matching element, the array index of a matching + element - what the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of the array, then + the index value is the same as the total number of elements in the array. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline TInt RPointerArray::SpecificFindInOrderL(const T* anEntry, TLinearOrder anOrder, TInt aMode) const + { return User::LeaveIfError(SpecificFindInOrder(anEntry, anOrder, aMode));} + + +/** +Finds the object pointer in the array that matches the specified object +pointer, using a binary search technique. + +Where there is more than one matching element, it finds the first, the last or +any matching element as specified by the value of aMode. + +The function assumes that object pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an index + value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is the index + of the first element in the array that is bigger than the element being + searched for - if no elements in the array are bigger, then the index + value is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to depends + on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@param aMode Specifies whether to find the first match, the last match or any match, as defined by + one of the TArrayFindMode enum values. + +@leave KErrNotFound, if no suitable object pointer can be found. + +@see TArrayFindMode +*/ +template +inline void RPointerArray::SpecificFindInAddressOrderL(const T* anEntry, TInt& anIndex, TInt aMode) const + { User::LeaveIfError(SpecificFindInAddressOrder(anEntry, anIndex, aMode)); } + + +/** +Finds the object pointer in the array whose object matches the specified +object, using a binary search technique and an ordering algorithm. + +Where there is more than one matching element, it finds the first, the last or any +matching element as specified by the value of aMode. + +The function assumes that existing object pointers in the array are ordered +so that the objects themselves are in object order as determined by an +algorithm supplied by the caller and packaged as a TLinearOrder. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an index + value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is + the index of the first element in the array that is bigger than + the element being searched for - if no elements in the array are bigger, + then the index value is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to depends + on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. + +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or any match, as defined by + one of the TArrayFindModeenum values. + +@leave KErrNotFound, if no suitable object pointer can be found. + +@see TArrayFindMode +*/ +template +inline void RPointerArray::SpecificFindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const + { User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, anOrder, aMode)); } + + +/** +Inserts an object pointer into the array in address order. + +No duplicate entries are permitted. +The function assumes that existing object pointers within the array are in +address order. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be inserted. +*/ +template +inline void RPointerArray::InsertInAddressOrderL(const T* anEntry) + { User::LeaveIfError(InsertInAddressOrder(anEntry)); } + + +/** +Inserts an object pointer into the array so that the object itself is in object +order. + +The algorithm for determining the order of two class T objects is provided +by a function supplied by the caller. + +No duplicate entries are permitted. + +The function assumes that the array is ordered so that the referenced objects +are in object order. + +The function leaves with one of the system wide error codes, if the operation fails. + +Note that the array remains unchanged following an attempt to insert a duplicate +entry. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +*/ +template +inline void RPointerArray::InsertInOrderL(const T* anEntry, TLinearOrder anOrder) + { User::LeaveIfError(InsertInOrder(anEntry, anOrder)); } + + +/** +Inserts an object pointer into the array in address order, allowing duplicates. + +If the new object pointer is a duplicate of an existing object pointer in +the array, then the new pointer is inserted after the existing one. If more +than one duplicate object pointer already exists in the array, then any new +duplicate pointer is inserted after the last one. + +The function assumes that existing object pointers within the array are in +address order. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be inserted. +*/ +template +inline void RPointerArray::InsertInAddressOrderAllowRepeatsL(const T* anEntry) + { User::LeaveIfError(InsertInAddressOrderAllowRepeats(anEntry)); } + + +/** +Inserts an object pointer into the array so that the object itself is in object +order, allowing duplicates + +The algorithm for determining the order of two class T objects is provided +by a function supplied by the caller. + +If the specified object is a duplicate of an existing object, then the new +pointer is inserted after the pointer to the existing object. If more than +one duplicate object already exists, then the new pointer is inserted after +the pointer to the last one. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The object pointer to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +*/ +template +inline void RPointerArray::InsertInOrderAllowRepeatsL(const T* anEntry, TLinearOrder anOrder) + { User::LeaveIfError(InsertInOrderAllowRepeats(anEntry, anOrder)); } + + + +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of object pointers specified. Adding new object pointers to the array +does not result in a re-allocation of memory until the the total number of +pointers exceeds the specified count. + +@param aCount The number of object pointers for which space should be reserved +@leave KErrNoMemory If the requested amount of memory could not be allocated +*/ +template +inline void RPointerArray::ReserveL(TInt aCount) + { User::LeaveIfError(RPointerArrayBase::DoReserve(aCount)); } + + + +// Specialization for RPointerArray + +/** +Appends an pointer onto the array. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be appended. +*/ +inline void RPointerArray::AppendL(const TAny* anEntry) + { User::LeaveIfError(Append(anEntry));} + + +/** +Inserts an pointer into the array at the specified position. + +The function leaves with one of the system wide error codes, if +the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be inserted. +@param aPos The position within the array where the pointer is to be + inserted. The position is relative to zero, i.e. zero implies + that a pointer is inserted at the beginning of the array. + +@panic USER 131, if aPos is negative, or is greater than the number of object + pointers currently in the array. +*/ +inline void RPointerArray::InsertL(const TAny* anEntry, TInt aPos) + { User::LeaveIfError(Insert(anEntry,aPos)); } + + +/** +Finds the first pointer in the array which matches the specified pointer, using +a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be found. +@return The index of the first matching pointer within the array. +@leave KErrNotFound, if no matching pointer can be found. +*/ +inline TInt RPointerArray::FindL(const TAny* anEntry) const + { return User::LeaveIfError(Find(anEntry));} + + +/** +Finds the last pointer in the array which matches the specified pointer, using +a sequential search. + +Matching is based on the comparison of pointers. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be found. +@return The index of the last matching pointer within the array. +@leave KErrNotFound, if no matching pointer can be found. +*/ +inline TInt RPointerArray::FindReverseL(const TAny* anEntry) const + { return User::LeaveIfError(FindReverse(anEntry));} + + +/** +Finds the pointer in the array that matches the specified pointer, using a +binary search technique. + +The function assumes that pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be found. + +@return The index of the matching pointer within the array +@leave KErrNotFound, if no suitable pointer can be found. +*/ +inline TInt RPointerArray::FindInAddressOrderL(const TAny* anEntry) const + { return User::LeaveIfError(FindInAddressOrder(anEntry));} + + +/** +Finds the pointer in the array that matches the specified pointer, using a +binary search technique. + +The function assumes that pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be found. +@param anIndex A reference to a TInt into which the + function puts an index value: If the function does not leave, + this is the index of the matching pointer within the array. If the + function leaves with KErrNotFound, this is the index of the last + pointer within the array which logically precedes + anEntry. + +@leave KErrNotFound, if no suitable pointer can be found. +*/ +inline void RPointerArray::FindInAddressOrderL(const TAny* anEntry, TInt& anIndex) const + { User::LeaveIfError(FindInAddressOrder(anEntry, anIndex)); } + + +/** +Finds the pointer in the array that matches the specified pointer, using a +binary search technique. + +Where there is more than one matching element, it finds the first, the last +or any matching element as specified by the value of aMode. + +The function assumes that pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be found. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return If there is a matching element, the array index of a matching element - what + the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows the + last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +inline TInt RPointerArray::SpecificFindInAddressOrderL(const TAny* anEntry, TInt aMode) const + { return User::LeaveIfError(SpecificFindInAddressOrder(anEntry, aMode));} + + +/** +Finds the pointer in the array that matches the specified pointer, using a +binary search technique. + +Where there is more than one matching element, it finds the first, the last or +any matching element as specified by the value of aMode. + +The function assumes that pointers in the array are in address order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an index + value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is the index + of the first element in the array that is bigger than the element being + searched for - if no elements in the array are bigger, then the index + value is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to depends + on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@param aMode Specifies whether to find the first match, the last match or any match, as defined by + one of the TArrayFindMode enum values. + +@leave KErrNotFound, if no suitable pointer can be found. + +@see TArrayFindMode +*/ +inline void RPointerArray::SpecificFindInAddressOrderL(const TAny* anEntry, TInt& anIndex, TInt aMode) const + { User::LeaveIfError(SpecificFindInAddressOrder(anEntry, anIndex, aMode)); } + + +/** +Inserts an pointer into the array in address order. + +No duplicate entries are permitted. The function assumes that existing pointers +within the array are in address order. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be inserted. +*/ +inline void RPointerArray::InsertInAddressOrderL(const TAny* anEntry) + { User::LeaveIfError(InsertInAddressOrder(anEntry)); } + + +/** +Inserts an pointer into the array in address order, allowing duplicates. + +If the new pointer is a duplicate of an existing pointer in the array, then the +new pointer is inserted after the existing one. If more than one duplicate +pointer already exists in the array, then any new duplicate pointer is inserted +after the last one. + +The function assumes that existing pointers within the array are in address +order. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The pointer to be inserted. +*/ +inline void RPointerArray::InsertInAddressOrderAllowRepeatsL(const TAny* anEntry) + { User::LeaveIfError(InsertInAddressOrderAllowRepeats(anEntry)); } + + +/** +Apends an object onto the array. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to the object of type class T to be appended. +*/ +template +inline void RArray::AppendL(const T& anEntry) + { User::LeaveIfError(Append(anEntry));} + + +/** +Inserts an object into the array at a specified position. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The class T object to be inserted. +@param aPos The position within the array where the object is to + be inserted. The position is relative to zero, i.e. zero + implies that an object is inserted at the beginning of + the array. + +@panic USER 131, if aPos is negative or is greater than the number of objects + currently in the array. +*/ +template +inline void RArray::InsertL(const T& anEntry, TInt aPos) + { User::LeaveIfError(Insert(anEntry, aPos));} + + +/** +Finds the first object in the array which matches the specified object using +a sequential search. + +Matching is based on the comparison of a TInt value at the key offset position +within the objects. + +For classes which define their own equality operator (==), the alternative method +FindL(const T& anEntry, TIdentityRelation anIdentity) is recommended. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the first matching object within the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline TInt RArray::FindL(const T& anEntry) const + { return User::LeaveIfError(Find(anEntry));} + + +/** +Finds the first object in the array which matches the specified object using +a sequential search and a matching algorithm. + +The algorithm for determining whether two class T type objects match is provided +by a function supplied by the caller. + +Such a function need not be supplied if an equality operator (==) is defined for class T. +In this case, default construction of anIdentity provides matching. + +See Find(const T& anEntry, TIdentityRelation anIdentity) for more details. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used + for matching. +@param anIdentity A package encapsulating the function which determines whether + two class T type objects match. + +@return The index of the first matching object within the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline TInt RArray::FindL(const T& anEntry, TIdentityRelation anIdentity) const + { return User::LeaveIfError(Find(anEntry, anIdentity));} + + +/** +Finds the last object in the array which matches the specified object using +a sequential search. + +Matching is based on the comparison of a TInt value at the key offset position +within the objects. + +For classes which define their own equality operator (==), the alternative method +FindReverseL(const T& anEntry, TIdentityRelation anIdentity) is recommended. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the last matching object within the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline TInt RArray::FindReverseL(const T& anEntry) const + { return User::LeaveIfError(FindReverse(anEntry));} + + +/** +Finds the last object in the array which matches the specified object using +a sequential search and a matching algorithm. + +The algorithm for determining whether two class T type objects match is provided +by a function supplied by the caller. + +Such a function need not be supplied if an equality operator (==) is defined for class T. +In this case, default construction of anIdentity provides matching. + +See Find(const T& anEntry, TIdentityRelation anIdentity) for more details. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of objects in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used + for matching. +@param anIdentity A package encapsulating the function which determines whether + two class T type objects match. + +@return The index of the last matching object within the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline TInt RArray::FindReverseL(const T& anEntry, TIdentityRelation anIdentity) const + { return User::LeaveIfError(FindReverse(anEntry, anIdentity));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in signed +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the matching object within the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline TInt RArray::FindInSignedKeyOrderL(const T& anEntry) const + { return User::LeaveIfError(FindInSignedKeyOrder(anEntry));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in unsigned +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. + +@return The index of the matching object within the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline TInt RArray::FindInUnsignedKeyOrderL(const T& anEntry) const + { return User::LeaveIfError(FindInUnsignedKeyOrder(anEntry));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique and an ordering algorithm. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@return The index of the matching object within the array. +@leave KErrNotFound if no matching object can be found. +*/ +template +inline TInt RArray::FindInOrderL(const T& anEntry, TLinearOrder anOrder) const +{ return User::LeaveIfError(FindInOrder(anEntry, anOrder));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in signed +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex On return contains an index value of the matching object within the array. + If the function leaves with KErrNotFound,this is the index of the + first element in the array whose key is bigger than the key of the + element being sought. If there are no elements in the array with + a bigger key, then the index value is the same as the total + number of elements in the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline void RArray::FindInSignedKeyOrderL(const T& anEntry, TInt& anIndex) const + { User::LeaveIfError(FindInSignedKeyOrder(anEntry, anIndex));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The function assumes that existing objects within the array are in unsigned +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex On return contains an index value of the matching object within the array. + If the function leaves with KErrNotFound, this is the index of the + first element in the array whose key is bigger than the key of the + element being sought. If there are no elements in the array with + a bigger key, then the index value is the same as the total + number of elements in the array. +@leave KErrNotFound, if no matching object can be found. +*/ +template +inline void RArray::FindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex) const + { User::LeaveIfError(FindInUnsignedKeyOrder(anEntry, anIndex));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique and an ordering algorithm. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex On return contains the index value of the matching object within the array + If the function leaves with KErrNotFound, this is the index of + the first element in the array that is bigger than the element + being searched for - if no elements in the array are bigger, + then the index value is the same as the total number of elements + in the array. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. + +@leave KErrNotFound if no matching object can be found. +*/ +template +inline void RArray::FindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder anOrder) const + { User::LeaveIfError(FindInOrder(anEntry, anIndex, anOrder));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by a signed 32-bit word +(the key) embedded in each array element. In the case that there is more than +one matching element, finds the first, last or any match as specified. + +The function assumes that existing objects within the array are in signed +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return The array index of a matching element - what the index refers to + depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of + the array, then the index value is the same as the total number of elements in the array. +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline TInt RArray::SpecificFindInSignedKeyOrderL(const T& anEntry, TInt aMode) const +{ return User::LeaveIfError(SpecificFindInSignedKeyOrder(anEntry, aMode));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by an unsigned 32-bit word +(the key) embedded in each array element. In the case that there is more than +one matching element, finds the first, last or any match as specified. + +The function assumes that existing objects within the array are in unsigned +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param aMode Specifies whether to find the first match, the last match or any + match, as defined by one of the TArrayFindMode enum values. + +@return The array index of a matching element - what the index refers to + depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline TInt RArray::SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt aMode) const + { return User::LeaveIfError(SpecificFindInUnsignedKeyOrder(anEntry, aMode));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique and an ordering algorithm. + +Where there is more than one matching element, it finds the first, the last or +any matching element as specified by the value of aMode. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder type. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@return The array index of a matching element - what the index refers to + depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline TInt RArray::SpecificFindInOrderL(const T& anEntry, TLinearOrder anOrder, TInt aMode) const +{ return User::LeaveIfError(SpecificFindInOrder(anEntry, anOrder, aMode));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by a signed 32-bit word +(the key) embedded in each array element. In the case that there is more than +one matching element, finds the first, last or any match as specified. + +The function assumes that existing objects within the array are in signed +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex A TInt type supplied by the caller. On return, it contains an + index value depending on whether a match is found and on the + value of aMode. If there is no matching element in the array, + then this is the index of the first element in the array that + is bigger than the element being searched for - if no elements + in the array are bigger, then the index value is the same as + the total number of elements in the array. + If there is a matching element, then what the index refers to + depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements + in the array. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline void RArray::SpecificFindInSignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const + { User::LeaveIfError(SpecificFindInSignedKeyOrder(anEntry, anIndex, aMode));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique. + +The element ordering is determined by an unsigned 32-bit word +(the key) embedded in each array element. In the case that there is more than +one matching element, finds the first, last or any match as specified. + +The function assumes that existing objects within the array are in unsigned +key order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex A TInt type supplied by the caller. On return, it contains an + index value depending on whether a match is found and on the + value of aMode. If there is no matching element in the array, + then this is the index of the first element in the array that + is bigger than the element being searched for - if no elements + in the array are bigger, then the index value is the same as + the total number of elements in the array. If there is a matching + element, then what the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline void RArray::SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const + { User::LeaveIfError(SpecificFindInUnsignedKeyOrder(anEntry, anIndex, aMode));} + + +/** +Finds the object in the array which matches the specified object using a binary +search technique and a specified ordering algorithm. + +Where there is more than one matching element, it finds the first, the last or +any matching element as specified by the value of aMode. + +The function assumes that existing objects within the array are in object +order as determined by an algorithm supplied by the caller and packaged as +a TLinearOrder type. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to an object of type class T to be used for matching. +@param anIndex A TInt type supplied by the caller. On return, it contains an + index value depending on whether a match is found and on the value + of aMode. If there is no matching element in the array, then this is + the index of the first element in the array that is bigger than the + element being searched for - if no elements in the array are bigger, + then the index value is the same as the total number of elements + in the array. If there is a matching element, then what the index + refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +@param aMode Specifies whether to find the first match, the last match or any match, + as defined by one of the TArrayFindMode enum values. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +template +inline void RArray::SpecificFindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder anOrder, TInt aMode) const + { User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, anOrder, aMode));} + + +/** +Inserts an object into the array in ascending signed key order. + +The order of two class T type objects is based on comparing a TInt value +located at the key offset position within the class T object. + +No duplicate entries are permitted. + +The function leaves with one of the system wide error codes, if the operation fails. + +Note that the array remains unchanged following an attempt to insert a duplicate entry. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to the object of type class T to be inserted. +*/ +template +inline void RArray::InsertInSignedKeyOrderL(const T& anEntry) + { User::LeaveIfError(InsertInSignedKeyOrder(anEntry));} + + +/** +Inserts an object into the array in ascending unsigned key order, not allowing +duplicate entries. + +The order of two class T type objects is based on comparing a TUint value +located at the key offset position within the class T object. + +The function leaves with one of the system wide error codes, if the operation fails. + +Note that the array remains unchanged following an attempt to insert a duplicate entry. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to the object of type class T to be inserted. +*/ +template +inline void RArray::InsertInUnsignedKeyOrderL(const T& anEntry) + { User::LeaveIfError(InsertInUnsignedKeyOrder(anEntry));} + + +/** +Inserts an object of into the array in object order. + +The algorithm for determining the order of two class T type objects is provided +by a function supplied by the caller. + +No duplicate entries are permitted. + +The function assumes that existing objects within the array are in object +order. + +The function leaves with one of the system wide error codes, if the operation fails. + +Note that the array remains unchanged following an attempt to insert a duplicate entry. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to the object of type class T to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +*/ +template +inline void RArray::InsertInOrderL(const T& anEntry, TLinearOrder anOrder) + { User::LeaveIfError(InsertInOrder(anEntry, anOrder));} + + +/** +Inserts an object into the array in ascending signed key order, +allowing duplicates. + +The order of two class T type objects is based on comparing a TInt value +located at the key offset position within the class T object. + +If anEntry is a duplicate of an existing object in the array, then the new +object is inserted after the existing object. If more than one duplicate object +already exists in the array, then any new duplicate object is inserted after +the last one. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to the object of type class T to be inserted. +*/ +template +inline void RArray::InsertInSignedKeyOrderAllowRepeatsL(const T& anEntry) + { User::LeaveIfError(InsertInSignedKeyOrderAllowRepeats(anEntry));} + + +/** +Inserts an object into the array in ascending unsigned key order, allowing +duplicates. + +The order of two class T type objects is based on comparing a TUint value +located at the key offset position within the class T object. + +If anEntry is a duplicate of an existing object in the array, then the new +object is inserted after the existing object. If more than one duplicate object +already exists in the array, then any new duplicate object is inserted after +the last one. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to the object of type class T to be inserted. +*/ +template +inline void RArray::InsertInUnsignedKeyOrderAllowRepeatsL(const T& anEntry) + { User::LeaveIfError(InsertInUnsignedKeyOrderAllowRepeats(anEntry));} + + +/** +Inserts an object into the array in object order, allowing duplicates. + +The algorithm for determining the order of two class T type objects is provided +by a function supplied by the caller. + +If anEntry is a duplicate of an existing object in the array, then the new +object is inserted after the existing object. If more than one duplicate object +already exists in the array, then anEntry is inserted after the last one. + +The function assumes that existing objects within the array are in object +order. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry A reference to the object of type class T to be inserted. +@param anOrder A package encapsulating the function which determines the order + of two class T objects. +*/ +template +inline void RArray::InsertInOrderAllowRepeatsL(const T& anEntry, TLinearOrder anOrder) + { User::LeaveIfError(InsertInOrderAllowRepeats(anEntry, anOrder));} + + + +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of objects specified. Adding new objects to the array +does not result in a re-allocation of memory until the the total number of +objects exceeds the specified count. + +@param aCount The number of objects for which space should be reserved +@leave KErrNoMemory If the requested amount of memory could not be allocated +*/ +template +inline void RArray::ReserveL(TInt aCount) + { User::LeaveIfError(RArrayBase::DoReserve(aCount)); } + + + + +/** +Appends a signed integer onto the array. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be appended. +*/ +inline void RArray::AppendL(TInt anEntry) + { User::LeaveIfError(Append(anEntry));} + + +/** +Inserts a signed integer into the array at the specified position. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be inserted. +@param aPos The position within the array where the signed integer is to be + inserted. The position is relative to zero, i.e. zero implies + that an entry is inserted at the beginning of the array. + +@panic USER 131, if aPos is negative, or is greater than the number of entries + currently in the array. +*/ +inline void RArray::InsertL(TInt anEntry, TInt aPos) + { User::LeaveIfError(Insert(anEntry, aPos));} + + +/** +Finds the first signed integer in the array which matches the specified signed +integer using a sequential search. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of entries in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be found. + +@return The index of the first matching signed integer within the array. +@leave KErrNotFound, if no matching entry can be found. +*/ +inline TInt RArray::FindL(TInt anEntry) const + { return User::LeaveIfError(Find(anEntry));} + + +/** +Finds the last signed integer in the array which matches the specified signed +integer using a sequential search. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of entries in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be found. + +@return The index of the last matching signed integer within the array. +@leave KErrNotFound, if no matching entry can be found. +*/ +inline TInt RArray::FindReverseL(TInt anEntry) const + { return User::LeaveIfError(FindReverse(anEntry));} + + +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +The function assumes that the array is in signed integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be found. + +@return The index of the matching signed integer within the array. +@leave KErrNotFound, if no match can be found. +*/ +inline TInt RArray::FindInOrderL(TInt anEntry) const + { return User::LeaveIfError(FindInOrder(anEntry));} + + +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +The function assumes that the array is in signed integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be found. +@param anIndex A reference to a signed integer into which the + function puts an index value: If the function returns , + this is the index of the matching signed integer within the + array. If the function leaves with KErrNotFound, this is the + index of the first signed integer within the array that is + bigger than the signed integer being searched for - if no + signed integers within the array are bigger, then the index + value is the same as the total number of signed integers + within the array. +@leave KErrNotFound if no match can be found. +*/ +inline void RArray::FindInOrderL(TInt anEntry, TInt& anIndex) const + { User::LeaveIfError(FindInOrder(anEntry, anIndex));} + + +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +Where there is more than one matching element, it finds the first, last or any +matching element as specified by the value of aMode. + +The function assumes that the array is in signed integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be found. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return The array index of a matching element - what the index refers to + depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +inline TInt RArray::SpecificFindInOrderL(TInt anEntry, TInt aMode) const + { return User::LeaveIfError(SpecificFindInOrder(anEntry, aMode));} + + +/** +Finds the signed integer in the array that matches the specified signed integer +using a binary search technique. + +Where there is more than one matching element, it finds the first, last or any +matching element as specified by the value of aMode. + +The function assumes that the array is in signed integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an + index value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is + the index of the first element in the array that is bigger + than the element being searched for - if no elements in the + array are bigger, then the index value is the same as the total + number of elements in the array. If there is a matching element, + then what the index refers to depends on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@param aMode Specifies whether to find the first match, the last match or any match, as defined + by one of the TArrayFindMode enum values. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +inline void RArray::SpecificFindInOrderL(TInt anEntry, TInt& anIndex, TInt aMode) const + { User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, aMode));} + + +/** +Inserts a signed integer into the array in signed integer order. + +No duplicate entries are permitted. + +The function assumes that existing entries within the array are in signed +integer order. + +The function leaves with one of the system wide error codes, if the operation fails. + +Note that the array remains unchanged following an attempt to insert a duplicate entry. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be inserted. +*/ +inline void RArray::InsertInOrderL(TInt anEntry) + { User::LeaveIfError(InsertInOrder(anEntry));} + + +/** +Inserts a signed integer into the array in signed integer order, +allowing duplicates. + +If anEntry is a duplicate of an existing entry in the array, then the new +signed integer is inserted after the existing one. If more than one duplicate +entry already exists in the array, then any new duplicate signed integer is +inserted after the last one. + +The function assumes that existing entries within the array are in signed +integer order. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The signed integer to be inserted. +*/ +inline void RArray::InsertInOrderAllowRepeatsL(TInt anEntry) + { User::LeaveIfError(InsertInOrderAllowRepeats(anEntry));} + + + +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of integers specified. Adding new integers to the array +does not result in a re-allocation of memory until the the total number of +integers exceeds the specified count. + +@param aCount The number of integers for which space should be reserved +@leave KErrNoMemory If the requested amount of memory could not be allocated +*/ +inline void RArray::ReserveL(TInt aCount) + { User::LeaveIfError(RPointerArrayBase::DoReserve(aCount)); } + + + + +/** +Appends an unsigned integer onto the array. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be appended. +*/ +inline void RArray::AppendL(TUint anEntry) + { User::LeaveIfError(Append(anEntry));} + + +/** +Inserts an unsigned integer into the array at the specified position. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be inserted. +@param aPos The position within the array where the unsigned integer is to + be inserted. The position is relative to zero, i.e. zero + implies that an entry is inserted at the beginning of + the array. + +@panic USER 131, if aPos is negative, or is greater than the number of entries + currently in the array. +*/ +inline void RArray::InsertL(TUint anEntry, TInt aPos) + { User::LeaveIfError(Insert(anEntry, aPos));} + + +/** +Finds the first unsigned integer in the array which matches the specified +value, using a sequential search. + +The find operation always starts at the low index end of the array. There +is no assumption about the order of entries in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be found. +@return The index of the first matching unsigned integer within the array. +@leave KErrNotFound, if no matching entry can be found. +*/ +inline TInt RArray::FindL(TUint anEntry) const + { return User::LeaveIfError(Find(anEntry));} + + +/** +Finds the last unsigned integer in the array which matches the specified +value, using a sequential search. + +The find operation always starts at the high index end of the array. There +is no assumption about the order of entries in the array. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be found. +@return The index of the last matching unsigned integer within the array. +@leave KErrNotFound, if no matching entry can be found. +*/ +inline TInt RArray::FindReverseL(TUint anEntry) const + { return User::LeaveIfError(FindReverse(anEntry));} + + +/** +Finds the unsigned integer in the array which matches the specified value, +using a binary search technique. + +The functions assume that existing entries within the array are in unsigned +integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be found. + +@return The index of the matching unsigned integer within the array; +@leave KErrNotFound, if no matching entry can be found. +*/ +inline TInt RArray::FindInOrderL(TUint anEntry) const + { return User::LeaveIfError(FindInOrder(anEntry));} + + +/** +Finds the unsigned integer in the array which matches the specified value, +using a binary search technique. + +If the index cannot be found, the function returns the index of the last +unsigned integer within the array which logically precedes anEntry. +The functions assume that existing entries within the array are in unsigned +integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be found. +@param anIndex A TInt supplied by the caller. On return, contains an index + value of the matching unsigned integer within the array. + If the function leaves with KErrNotFound, this is the index of the + first unsigned integer within the array that is bigger than the + unsigned integer being searched for - if no unsigned integers within + the array are bigger, then the index value is the same as the + total number of unsigned integers within the array. + +@leave KErrNotFound, if no matching entry can be found. +*/ +inline void RArray::FindInOrderL(TUint anEntry, TInt& anIndex) const + { User::LeaveIfError(FindInOrder(anEntry, anIndex));} + + +/** +Finds the unsigned integer in the array that matches the specified unsigned integer +using a binary search technique. + +In the case that there is more than one matching element, finds the first, last or any +match as specified. + +The function assumes that the array is in unsigned integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be found. +@param aMode Specifies whether to find the first match, the last match or + any match, as defined by one of the TArrayFindMode enum values. + +@return The array index of a matching element - what the index refers to depends + on the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element + of the array, then the index value is the same as the total number of elements in the array. + +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +inline TInt RArray::SpecificFindInOrderL(TUint anEntry, TInt aMode) const + { return User::LeaveIfError(SpecificFindInOrder(anEntry, aMode));} + + +/** +Finds the unsigned integer in the array that matches the specified unsigned integer +using a binary search technique. + +Where there is more than one matching element, it finds the first, last or +any matching element as specified by the value of aMode. + +The function assumes that the array is in unsigned integer order. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be found. +@param anIndex A TInt type supplied by the caller. On return, it contains an index + value depending on whether a match is found and on the value of aMode. + If there is no matching element in the array, then this is the + index of the first element in the array that is bigger than the element + being searched for - if no elements in the array are bigger, then + the index value is the same as the total number of elements in the array. + If there is a matching element, then what the index refers to depends on + the value of aMode: + if this is EArrayFindMode_First, then the index refers to the first matching element; + if this is EArrayFindMode_Any, then the index can refer to any of the matching elements; + if this is EArrayFindMode_Last, then the index refers to first element that follows + the last matching element - if the last matching element is also the last element of the array, + then the index value is the same as the total number of elements in the array. + +@param aMode Specifies whether to find the first match, the last match or any match, as defined by + one of the TArrayFindMode enum values. +@leave KErrNotFound if no matching entry exists. + +@see TArrayFindMode +*/ +inline void RArray::SpecificFindInOrderL(TUint anEntry, TInt& anIndex, TInt aMode) const + { User::LeaveIfError(SpecificFindInOrder(anEntry, anIndex, aMode));} + + +/** +Inserts an unsigned integer into the array in unsigned integer order. + +No duplicate entries are permitted. + +The function assumes that existing entries within the array are in unsigned +integer order. + +The function leaves with one of the system wide error codes, if the operation fails. + +Note that the array remains unchanged following an attempt to insert a duplicate entry. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be inserted. +*/ +inline void RArray::InsertInOrderL(TUint anEntry) + { User::LeaveIfError(InsertInOrder(anEntry));} + + +/** +Inserts an unsigned integer into the array in unsigned integer order, allowing +duplicates. + +If the new integer is a duplicate of an existing entry in the array, then +the new unsigned integer is inserted after the existing one. If more than +one duplicate entry already exists in the array, then any new duplicate +unsigned integer is inserted after the last one. + +The function assumes that existing entries within the array are in unsigned +integer order. + +The function leaves with one of the system wide error codes, if the operation fails. + +NOTE: This function is NOT AVAILABLE to code running on the kernel side. + +@param anEntry The unsigned integer to be inserted. +*/ +inline void RArray::InsertInOrderAllowRepeatsL(TUint anEntry) + { User::LeaveIfError(InsertInOrderAllowRepeats(anEntry));} + + + +/** +Reserves space for the specified number of elements. + +After a call to this function, the memory allocated to the array is sufficient +to hold the number of integers specified. Adding new integers to the array +does not result in a re-allocation of memory until the the total number of +integers exceeds the specified count. + +@param aCount The number of integers for which space should be reserved +@leave KErrNoMemory If the requested amount of memory could not be allocated +*/ +inline void RArray::ReserveL(TInt aCount) + { User::LeaveIfError(RPointerArrayBase::DoReserve(aCount)); } + + + + +/** +Sets the priority of the client's process. + +@param aPriority The priority value. +*/ +inline void RMessagePtr2::SetProcessPriorityL(TProcessPriority aPriority) const + { User::LeaveIfError(SetProcessPriority(aPriority));} + + +/** +Opens a handle on the client thread. + +@param aClient On successful return, the handle to the client thread. +@param aOwnerType An enumeration whose enumerators define the ownership of + the handle. If not explicitly specified, + EOwnerProcess is taken as default. +*/ +inline void RMessagePtr2::ClientL(RThread& aClient, TOwnerType aOwnerType) const + { User::LeaveIfError(Client(aClient, aOwnerType));} + + +#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +inline TBool RMessagePtr2::HasCapability(TCapability aCapability, const char* aDiagnostic) const + { + return DoHasCapability(aCapability, aDiagnostic); + } + +inline void RMessagePtr2::HasCapabilityL(TCapability aCapability, const char* aDiagnosticMessage) const + { + if (!HasCapability(aCapability, aDiagnosticMessage)) + { + User::Leave(KErrPermissionDenied); + } + } + +inline TBool RMessagePtr2::HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const + { + return DoHasCapability(aCapability1, aCapability2, aDiagnostic); + } + +inline void RMessagePtr2::HasCapabilityL(TCapability aCapability1, TCapability aCapability2, const char* aDiagnosticMessage) const + { + if (!HasCapability(aCapability1, aCapability2, aDiagnosticMessage)) + { + User::Leave(KErrPermissionDenied); + } + } + +#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +// Only available to NULL arguments +inline TBool RMessagePtr2::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoHasCapability(aCapability); + } + +inline void RMessagePtr2::HasCapabilityL(TCapability aCapability, OnlyCreateWithNull /*aDiagnosticMessage*/) const + { + if (!DoHasCapability(aCapability)) + { + User::Leave(KErrPermissionDenied); + } + } + +inline TBool RMessagePtr2::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/) const + { + return DoHasCapability(aCapability1, aCapability2); + } + +inline void RMessagePtr2::HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnosticMessage*/) const + { + if (!DoHasCapability(aCapability1, aCapability2)) + { + User::Leave(KErrPermissionDenied); + } + } + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +// For things using KSuppressPlatSecDiagnostic +inline TBool RMessagePtr2::HasCapability(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue); + } + +inline void RMessagePtr2::HasCapabilityL(TCapability aCapability, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + if (!DoHasCapability(aCapability, KSuppressPlatSecDiagnosticMagicValue)) + { + User::Leave(KErrPermissionDenied); + } + } + +inline TBool RMessagePtr2::HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + return DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue); + } + +inline void RMessagePtr2::HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull /*aDiagnostic*/, OnlyCreateWithNull /*aSuppress*/) const + { + if (!DoHasCapability(aCapability1, aCapability2, KSuppressPlatSecDiagnosticMagicValue)) + { + User::Leave(KErrPermissionDenied); + } + } +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ + +inline TInt RThread::RenameMe(const TDesC& aName) + { return User::RenameThread(aName); } +inline TInt RProcess::RenameMe(const TDesC& aName) + { return User::RenameProcess(aName); } + +#endif // !__KERNEL_MODE__ + +#ifdef __SUPPORT_CPP_EXCEPTIONS__ +// The standard header file defines the following guard macro for EDG and CW, VC++, GCC respectively. +// The guard below is ugly. It will surely come back and bite us unless we resolve the whole issue of standard headers +// when we move to supporting Standard C++. + +// The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target. +// In this case, we wish to avoid defining uncaught_exception below since it clashes with the StdC++ specification +#if !defined(_EXCEPTION) && !defined(_EXCEPTION_) && !defined(__EXCEPTION__) && !defined(__SYMBIAN_STDCPP_SUPPORT__) + +#if defined(__VC32__) && !defined(_CRTIMP_PURE) + + // Declare MS EH runtime functions + bool __uncaught_exception(void); + +#if _MSC_VER >= 1200 + __declspec(noreturn) void terminate(void); + __declspec(noreturn) void unexpected(void); +#else + void terminate(void); + void unexpected(void); +#endif + + typedef void (*terminate_handler)(); + terminate_handler set_terminate(terminate_handler h) throw(); + typedef void (*unexpected_handler)(); + unexpected_handler set_unexpected(unexpected_handler h) throw(); + +namespace std { +#ifdef __MSVCDOTNET__ + inline bool uncaught_exception(void) { return ::__uncaught_exception(); } +#else // !__MSVCDOTNET__ + // MS KB242192: BUG: uncaught_exception() Always Returns False + inline bool uncaught_exception(void) { return false; } +#endif //__MSVCDOTNET__ + inline void terminate(void) { ::terminate(); } + inline void unexpected(void) { ::unexpected(); } + inline terminate_handler set_terminate(terminate_handler h) throw() { return ::set_terminate(h); } + inline unexpected_handler set_unexpected(unexpected_handler h) throw() { return ::set_unexpected(h); } +} + +#endif // extract from MSVC headers + +#ifdef __CW32__ + + extern "C" bool __uncaught_exception(void); + +namespace std { +#if __MWERKS__ > 0x3200 + inline bool uncaught_exception(void) { return ::__uncaught_exception(); } +#else + // no uncaught_exception() implementation on CW 2.4.7 + inline bool uncaught_exception(void) { return false; } +#endif +} + +#endif // extract from CW headers + +#endif // header guard + +#endif //__SUPPORT_CPP_EXCEPTIONS__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32std_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32std_private.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,142 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32std_private.h +// +// + +/** + @file + @internalTechnology + @released +*/ + +#ifndef __E32STD_PRIVATE_H__ +#define __E32STD_PRIVATE_H__ + +#ifdef __KERNEL_MODE__ +#error !! Including e32std.h in kernel code !! +#endif + +#include +#include + +/** +@internalComponent +*/ +const TUint KLocaleLanguageKey = 0x10208903; + +/** +@internalComponent +*/ +const TUint KLocaleDataKey = 0x10208904; + +/** +@internalComponent +*/ +const TUint KLocaleDataExtraKey = 0x10208905; + +/** +@internalComponent +*/ +const TUint KLocaleTimeDateFormatKey = 0x10208907; + +/** +@internalComponent +*/ +const TUint KLocaleDefaultCharSetKey = 0x10208908; + +/** +@internalComponent +*/ +const TUint KLocalePreferredCharSetKey = 0x10208909; + +/** +@internalComponent +*/ +enum TLocaleFunctions + { + FnDummy, + FnAmPmTable, + FnCharSet, + FnCollTable, + FnCurrencySymbol, + FnDateSuffixTable, + FnDayAbbTable, + FnDayTable, + FnFoldTable, + FnLanguage, + FnLocaleData, + FnLowerTable, + FnMonthAbbTable, + FnMonthTable, + FnMsgTable, + FnTypeTable, + FnUniCode, + FnUpperTable, + FnShortDateFormatSpec, + FnLongDateFormatSpec, + FnTimeFormatSpec, + FnFatUtilityFunctions + }; + +/** +@internalAll +*/ +const TInt KMediaPasswordNotifyUid(0x10004c00); + +/** +@internalAll +*/ +enum TMediaPswdNotifyExitMode {EMPEMUnlock, EMPEMCancel, EMPEMUnlockAndStore}; + + +/** +@internalAll +*/ +struct TMediaPswdNotifyBase + { + enum TCardType {ECTMmcPassword} iCT; + TVersion iVersion; + }; + +/** +@internalAll +*/ +struct TMediaPswdSendNotifyInfoV1 : public TMediaPswdNotifyBase + { + // empty. + }; + +/** +@internalAll +*/ +struct TMediaPswdSendNotifyInfoV1Debug : public TMediaPswdSendNotifyInfoV1 + { + TInt iSleepPeriod; // us, -ve means maximum range + TMediaPswdNotifyExitMode iEM; + TText8 iPW[KMaxMediaPassword]; + }; + +/** +@internalAll +*/ +struct TMediaPswdReplyNotifyInfoV1 : public TMediaPswdNotifyBase + { + TText8 iPW[KMaxMediaPassword]; + TMediaPswdNotifyExitMode iEM; + }; + + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32svr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32svr.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,84 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32svr.h +// +// + +#ifndef __E32SVR_H__ +#define __E32SVR_H__ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** +@internalComponent +@removed +*/ +enum TBlockType {EBlocked,EUnBlocked,ERelease}; + +/** +A collection of static functions that are intended for internal use only, +except for AddEvent. +@see UserSvr::AddEvent() +@publishedPartner +@released +*/ +class UserSvr + { +public: + IMPORT_C static void CaptureEventHook(); /**< @internalAll */ + IMPORT_C static void ReleaseEventHook(); /**< @internalAll */ + IMPORT_C static void RequestEvent(TRawEventBuf &anEvent,TRequestStatus &aStatus); /**< @internalAll */ + IMPORT_C static void RequestEventCancel(); /**< @internalAll */ + IMPORT_C static TInt AddEvent(const TRawEvent& anEvent); + IMPORT_C static void ScreenInfo(TDes8& anInfo); /**< @internalAll */ + IMPORT_C static TInt DllSetTls(TInt aHandle, TAny *aPtr); /**<@internalAll */ + IMPORT_C static TInt DllSetTls(TInt aHandle, TInt aDllUid, TAny *aPtr); /**< @internalComponent */ + IMPORT_C static TAny *DllTls(TInt aHandle); /**< @internalAll */ + IMPORT_C static TAny *DllTls(TInt aHandle, TInt aDllUid); /**< @internalComponent */ + IMPORT_C static void DllFreeTls(TInt aHandle); /**< @internalAll */ + IMPORT_C static void DllFileName(TInt aHandle, TDes &aFileName); /**< @internalAll */ + IMPORT_C static void FsRegisterThread(); /**< @internalAll */ + IMPORT_C static void RegisterTrustedChunk(TInt aHandle);/**< @internalComponent */ + IMPORT_C static void WsRegisterThread(); /**< @internalAll */ + IMPORT_C static TBool TestBootSequence(); /**< @internalAll */ + IMPORT_C static void WsRegisterSwitchOnScreenHandling(TBool aState); /**< @internalAll */ + IMPORT_C static void WsSwitchOnScreen(); /**< @internalAll */ + IMPORT_C static TInt ChangeLocale(const TDesC& aLocaleDllName); /**< @internalAll */ + IMPORT_C static TInt ResetMachine(TMachineStartupType aType); /**< @internalAll */ + IMPORT_C static void UnlockRamDrive(); /**< @internalAll */ + IMPORT_C static void LockRamDrive(); /**< @internalAll */ + IMPORT_C static TUint32 RomRootDirectoryAddress(); /**< @internalAll */ + IMPORT_C static TInt ExecuteInSupervisorMode(TSupervisorFunction aFunction, TAny* aParameter); /**< @internalAll */ + IMPORT_C static TUint32 RomHeaderAddress(); /**< @internalAll */ + IMPORT_C static TUint32 DebugMask(); /**< @internalAll */ //Return the kernel debug mask 0 + IMPORT_C static TUint32 DebugMask(TUint aIndex); /**<@internalAll */ // Return the kernel debug mask + IMPORT_C static TInt HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2); /**<@internalAll */ + IMPORT_C static TInt HalFunction(TInt aGroup, TInt aFunction, TAny* a1, TAny* a2, TInt aDeviceNumber); /**<@internalAll */ + IMPORT_C static TInt HalGet(TInt,TAny*); /**<@internalAll */ // redundant - only here for BC + IMPORT_C static TInt HalSet(TInt,TAny*); /**<@internalAll */ // redundant - only here for BC + IMPORT_C static TInt SetMemoryThresholds(TInt aLowThreshold, TInt aGoodThreshold); /**<@internalAll */ + IMPORT_C static TBool IpcV1Available(); /**<@internalAll */ + IMPORT_C static TLinAddr ExceptionDescriptor(TLinAddr aCodeAddress); /**< @internalTechnology */ + IMPORT_C static TInt LocalePropertiesSetDefaults(); /**< @internalTechnology */ + }; + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32test.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32test.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,369 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32test.h +// +// + +/** + @file e32test.h + @publishedAll + @released +*/ + +#ifndef __E32TEST_H__ +#define __E32TEST_H__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/** +Test console. + +The class creates a console window to which test results can be logged +through the various overloads of the operator(). +*/ +class RTest + { +public: + IMPORT_C RTest(const TDesC &aTitle,TInt aThrowaway,const TText* anOtherThrowaway); + IMPORT_C RTest(const TDesC &aTitle,TInt aThrowaway); + IMPORT_C RTest(const TDesC &aTitle); + IMPORT_C void Close(); + IMPORT_C void Title(); + IMPORT_C void Start(const TDesC &aHeading); + IMPORT_C void Next(const TDesC &aHeading); + IMPORT_C void End(); + IMPORT_C void operator()(TInt aResult,TInt aLineNum,const TText* aFileName); + IMPORT_C void operator()(TInt aResult,TInt aLineNum); + IMPORT_C void operator()(TInt aResult); + IMPORT_C void Panic(TInt anError,TRefByValue aFmt,...); + IMPORT_C void Panic(TRefByValue aFmt,...); + IMPORT_C void Printf(TRefByValue aFmt,...); + IMPORT_C TKeyCode Getch(); + inline static const TAny* String(TInt aSel,const TText8 *aBuf1,const TText16 *aBuf2); + inline CConsoleBase* Console() const; + inline void SetConsole(CConsoleBase* aConsole); + inline TBool Logged() const; + inline void SetLogged(TBool aToLog); + inline void HandleError(TInt aError, TInt aLine, const TText* aFileName); + inline void HandleNull(TInt aLine, const TText* aFileName); + inline void HandleNotEqual(TInt aExpected, TInt aActual, TInt aLine, const TText* aFileName); + inline void HandleFailedCompare(TInt aLeft, const TText* aComp, TInt aRight, TInt aLine, const TText* aFileName); + inline void HandleValue(TInt aValue, TInt aLine, const TText* aFileName); + + IMPORT_C static TInt CloseHandleAndWaitForDestruction(RHandleBase& aH); /**< @internalTechnology */ + +protected: + void CheckConsoleCreated(); + void DisplayLevel(); + inline void Push(); + inline void Pop(); +private: + enum {EMaxStack=0x100,EMaxBuffer=0x100}; +private: + TInt iTest; + TInt iCheck; + TInt iLevel; + TBool iLogging; + CConsoleBase *iConsole; + TBuf<0x40> iTitle; + TInt iStack[EMaxStack]; + TText iBuf[EMaxBuffer]; + }; + + + + +/** +Gets the console. + +@return A pointer to the console object. +*/ +inline CConsoleBase* RTest::Console() const + { return(iConsole); } + + + + +/** +Utility function that returns a pointer to the specified TText8* argument +or the TText16* argument depending on the value of the aSel argument. + +@param aSel An integer containing the size of a TText8 type or TText16 type. +@param aBuf1 A pointer to 8-bit text. +@param aBuf2 A pointer to 16-bit text. + +@return A pointer to aBuf1, if the value of aSel is the size of a TText8 type, + otherwise a pointer to aBuf2. +*/ +inline const TAny *RTest::String(TInt aSel,const TText8 *aBuf1,const TText16 *aBuf2) + { return(aSel == sizeof(TText8) ? (TAny *)aBuf1 : (TAny *)aBuf2); } + + + +/** +@internalComponent +*/ +inline void RTest::Push() + { iStack[iLevel++] = iTest; iTest = 0; } + + + +/** +@internalComponent +*/ +inline void RTest::Pop() + { iTest = iStack[--iLevel]; } + + + + +/** +Sets the console. + +@param aConsole A pointer to the console object to be used. +*/ +inline void RTest::SetConsole(CConsoleBase* aConsole) + { iConsole = aConsole; } + + + + +/** +Tests whether the logging flag is set. + +If the logging flag is set, console output is also written to +the debug output as represented by a RDebug object. + +@return True, if the logging flag is set, false otherwise. +*/ +inline TBool RTest::Logged() const + { return(iLogging); } + + + + +/** +Sets the logging flag. + +If the logging flag is set, console output is also written to +the debug output as represented by a RDebug object. + +@param aToLog ETrue, if the logging flag is to be set, EFalse, otherwise. +*/ +inline void RTest::SetLogged(TBool aToLog) + { iLogging = aToLog; } + + + + +// test equivalent of _L +/** +@internalComponent +*/ +#define _TL(a) (S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a) + +// the next two, slightly confusing, macros are necessary in order +// to enable proper string merging with certain compilers. + +/** +@internalComponent +*/ +#define __test(x,l,f) test(x,l,_S(f)) + +/** +@internalComponent +*/ +#define test(x) __test(x,__LINE__,__FILE__) + + +#ifdef __E32TEST_EXTENSION__ + +/** +@internalComponent +*/ +#define __S(f) _S(f) + +/** +@internalComponent + +Panics and displays an appropriate error message if x is less then zero (Indicating an error code). +*/ +#define test_NotNegative(x) { TInt _r = (x); if (_r < 0) test.HandleError(_r, __LINE__,__S(__FILE__)); } + +/** +@internalComponent + +Panics and displays an appropriate error message if x is not equal to KErrNone. +*/ +#define test_KErrNone(x) { TInt _r = (x); if (_r !=KErrNone) test.HandleError(_r, __LINE__,__S(__FILE__)); } + +/** +@internalComponent + +Panics and displays an appropriate error message if the trapped statement/block x leaves. +*/ +#define test_TRAP(x) { TRAPD(_r, x); if (_r != KErrNone) test.HandleError(_r, __LINE__,__S(__FILE__)); } + +/** +@internalComponent + +Panics and displays an appropriate error message if x is not equal to NULL. +*/ +#define test_NotNull(x) { TAny* _a = (TAny*)(x); if (_a == NULL) test.HandleNull(__LINE__,__S(__FILE__)); } +/** +@internalComponent + +Panics and displays an appropriate error message if e (expected) is not equal to a (actual). +*/ +#define test_Equal(e, a) { TInt _e = TInt(e); TInt _a = TInt(a); if (_e != _a) test.HandleNotEqual(_e, _a, __LINE__,__S(__FILE__)); } + +/** +@internalComponent + +Panics and displays an appropriate error message if the comparison specified with operator b, between a and c, is EFalse. +*/ +#define test_Compare(a,b,c) {TInt _a = TInt(a); TInt _c = TInt(c); if (!(_a b _c)) test.HandleFailedCompare(_a, __S(#b), _c, __LINE__,__S(__FILE__)); } + + +/** +@internalComponent + +Panics and displays an appropriate error message displaying v, if the expression e is false. +*/ +#define test_Value(v, e) if (!(e)) test.HandleValue(v, __LINE__,__S(__FILE__)); + +/** +@internalComponent + +If expression e is false, statement s is executed then a Panic is raised. +*/ +#define test_Assert(e,s) if(!(e)) {s; test.operator()(EFalse, __LINE__,__S(__FILE__)); } + + + +#endif + + +/** +Prints a failure message, including an error code at the console and raises a panic. + + +@param aError The error code to be printed in the failure massage. +@param aLineNum A line number that is printed in the failure message. +@param aFileName A file name that is printed in the failure message. + +@panic USER 84 Always. +*/ +inline void RTest::HandleError(TInt aError, TInt aLine, const TText* aFileName) + { + RDebug::Printf("RTEST: Error %d at line %d", aError,aLine); + Printf(_L("RTEST: Error %d\n"), aError); + operator()(EFalse, aLine, aFileName); + } +/** +Prints a failure message indicating null was encountered, at the console and raises a panic. + +@param aLineNum A line number that is printed in the failure message. +@param aFileName A file name that is printed in the failure message. + +@panic USER 84 Always. +*/ + +inline void RTest::HandleNull(TInt aLine, const TText* aFileName) + { + RDebug::Printf("RTEST: Null value at line %d", aLine); + Printf(_L("RTEST: Null value\n")); + operator()(EFalse, aLine, aFileName); + } + + +/** +Prints a failure message indicating that two value (also printed) where not equal, at the console and raises a panic. + +@param aExpected The value that is to be printed as expected. +@param aActual The value that is to be printed as being actually received. +@param aLineNum A line number that is printed in the failure message. +@param aFileName A file name that is printed in the failure message. + +@panic USER 84 Always. +*/ + +inline void RTest::HandleNotEqual(TInt aExpected, TInt aActual, TInt aLine, const TText* aFileName) + { + RDebug::Printf("RTEST: Expected 0x%x (%d) but got 0x%x (%d) at line %d", aExpected,aExpected,aActual,aActual,aLine); + Printf(_L("RTEST: Expected 0x%x (%d) but got 0x%x (%d)\n"), aExpected,aExpected,aActual,aActual); + operator()(EFalse, aLine, aFileName); + } + + +/** +Prints a failure message indicating that a comparison between two values (also printed) resulted in EFalse, +at the console and raises a panic. + +@param aLeft The left value of the comparison. +@param aComp A string representing the comparison operator. +@param aRight The right value of the comparison. +@param aLineNum A line number that is printed in the failure message. +@param aFileName A file name that is printed in the failure message. + +@panic USER 84 Always. +*/ +inline void RTest::HandleFailedCompare(TInt aLeft, const TText* aComp, TInt aRight, TInt aLine, const TText* aFileName) + { + RDebug::Printf("RTEST: (0x%x (%d) %s 0x%x (%d)) == EFalse at line %d", aLeft,aLeft,aComp,aRight,aRight,aLine); + Printf(_L("RTEST: (0x%x (%d) %s 0x%x (%d)) == EFalse\n"), aLeft,aLeft,aComp, aRight,aRight); + operator()(EFalse, aLine, aFileName); + } + + +/** +Prints a failure message indicating that aValue was not an expected value, at the console and raises a panic. + +@param aValue The value that is to be printed as not being an expected value. +@param aLineNum A line number that is printed in the failure message. +@param aFileName A file name that is printed in the failure message. + +@panic USER 84 Always. +*/ +inline void RTest::HandleValue(TInt aValue, TInt aLine, const TText* aFileName) + { + Printf(_L("RTEST: %d (0x%x) was not an expected value.\n"), aValue, aValue); + operator()(EFalse, aLine, aFileName); + } + + +/** +@internalTechnology +*/ +_LIT(KLitCloseAndWait,"Close&Wait"); + +/** +@internalTechnology +*/ +#define CLOSE_AND_WAIT(h) ((void)(RTest::CloseHandleAndWaitForDestruction(h) && (User::Panic(KLitCloseAndWait,__LINE__),1))) + + + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/e32ver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/e32ver.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,42 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\e32ver.h +// +// + +/** + @file + @internalComponent +*/ + +#ifndef __E32VER_H__ +#define __E32VER_H__ + +const TInt KE32MajorVersionNumber=2; +const TInt KE32MinorVersionNumber=0; +const TInt KE32BuildVersionNumber=1997; + +const TInt KMachineConfigurationMajorVersionNumber=1; +const TInt KMachineConfigurationMinorVersionNumber=0; +const TInt KMachineConfigurationBuildVersionNumber=110; + +const TInt KMediaDriverInterfaceMajorVersionNumber=2; +const TInt KMediaDriverInterfaceMinorVersionNumber=0; +const TInt KMediaDriverInterfaceBuildVersionNumber=141; + +const TInt KNotifierMajorVersionNumber=1; +const TInt KNotifierMinorVersionNumber=0; +const TInt KNotifierBuildVersionNumber=110; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/partitions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/partitions.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,197 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\partitions.h +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef __PARTITIONS_H__ +#define __PARTITIONS_H__ +#include + +const TUint KPartitionTypeEmpty=0x00; +const TUint KPartitionTypeFAT12=0x01; +const TUint KPartitionTypeXENIXroot=0x02; +const TUint KPartitionTypeXENIXusr=0x03; +const TUint KPartitionTypeFAT16small=0x04; +const TUint KPartitionTypeExtended=0x05; +const TUint KPartitionTypeFAT16=0x06; +const TUint KPartitionTypeNTFS=0x07; +const TUint KPartitionTypeAIX=0x08; +const TUint KPartitionTypeAIXboot=0x09; +const TUint KPartitionTypeOS2BootManager=0x0a; +const TUint KPartitionTypeWin95FAT32=0x0b; +const TUint KPartitionTypeWin95FAT32LBA=0x0c; +const TUint KPartitionTypeWin95FAT16LBA=0x0e; +const TUint KPartitionTypeWin95ExtdLBA=0x0f; +const TUint KPartitionTypeOPUS=0x10; +const TUint KPartitionTypeHiddenFAT12=0x11; +const TUint KPartitionTypeCompaqDiag=0x12; +const TUint KPartitionTypeHiddenFAT16small=0x14; +const TUint KPartitionTypeHiddenFAT16=0x16; +const TUint KPartitionTypeHiddenNTFS=0x17; +const TUint KPartitionTypeASTSmartSleep=0x18; +const TUint KPartitionTypeHiddenWin95FAT32=0x1b; +const TUint KPartitionTypeHiddenWin95FAT32LBA=0x1c; +const TUint KPartitionTypeHiddenWin95FAT16LBA=0x1e; +const TUint KPartitionTypeNECDOS=0x24; +const TUint KPartitionTypePlan9=0x39; +const TUint KPartitionTypePartitionMagic=0x3c; +const TUint KPartitionTypeVenix80286=0x40; +const TUint KPartitionTypePPCPRePBoot=0x41; +const TUint KPartitionTypeSFS=0x42; +const TUint KPartitionTypeQNX4x=0x4d; +const TUint KPartitionTypeQNX4x_2=0x4e; +const TUint KPartitionTypeQNX4x_3=0x4f; +const TUint KPartitionTypeOnTrackDM=0x50; +const TUint KPartitionTypeOnTrackDM6Aux=0x51; +const TUint KPartitionTypeCPM=0x52; +const TUint KPartitionTypeOnTrackDM6Aux_2=0x53; +const TUint KPartitionTypeOnTrackDM6=0x54; +const TUint KPartitionTypeEZDrive=0x55; +const TUint KPartitionTypeGoldenBow=0x56; +const TUint KPartitionTypePriamEdisk=0x5c; +const TUint KPartitionTypeSpeedStor=0x61; +const TUint KPartitionTypeGNU_HURD=0x63; +const TUint KPartitionTypeNovellNetware=0x64; +const TUint KPartitionTypeNovellNetware_2=0x65; +const TUint KPartitionTypeDiskSecure=0x70; +const TUint KPartitionTypePCIX=0x75; +const TUint KPartitionTypeOldMinix=0x80; +const TUint KPartitionTypeMinixOldLinux=0x81; +const TUint KPartitionTypeLinuxSwap=0x82; +const TUint KPartitionTypeLinux=0x83; +const TUint KPartitionTypeOS2Hidden=0x84; +const TUint KPartitionTypeLinuxExtended=0x85; +const TUint KPartitionTypeNTFSvolset=0x86; +const TUint KPartitionTypeNTFSvolset_2=0x87; +const TUint KPartitionTypeLinuxLVM=0x8e; +const TUint KPartitionTypeAmoeba=0x93; +const TUint KPartitionTypeAmoebaBBT=0x94; +const TUint KPartitionTypeBSD_OS=0x9f; +const TUint KPartitionTypeIBMThinkpad=0xa0; +const TUint KPartitionTypeFreeBSD=0xa5; +const TUint KPartitionTypeOpenBSD=0xa6; +const TUint KPartitionTypeNeXTSTEP=0xa7; +const TUint KPartitionTypeNetBSD=0xa9; +const TUint KPartitionTypeBSDIfs=0xb7; +const TUint KPartitionTypeBSDIswap=0xb8; +const TUint KPartitionTypeBootWizardHidden=0xbb; +const TUint KPartitionTypeDRDOS=0xc1; +const TUint KPartitionTypeDRDOS_2=0xc4; +const TUint KPartitionTypeDRDOS_3=0xc6; +const TUint KPartitionTypeSyrinx=0xc7; +const TUint KPartitionTypeNonFSData=0xda; +const TUint KPartitionTypeCPM_CTOS=0xdb; +const TUint KPartitionTypeDellUtility=0xde; +const TUint KPartitionTypeBootIt=0xdf; +const TUint KPartitionTypeDOSaccess=0xe1; +const TUint KPartitionTypeDOS_RO=0xe3; +const TUint KPartitionTypeSymbianCrashLog=0xf0; +const TUint KPartitionTypeSpeedStor_2=0xf1; +const TUint KPartitionTypeDOSsecondary=0xf2; +const TUint KPartitionTypeSpeedStor_3=0xf4; +const TUint KPartitionTypeRofs=0xfa; // HACK +const TUint KPartitionTypeIso9660=0xfb; // hack +const TUint KPartitionTypeEneaLFFS=0xfc; // hack +const TUint KPartitionTypeLinuxRaidAuto=0xfd; +const TUint KPartitionTypeLANStep=0xfe; +const TUint KPartitionTypeBBT=0xff; + +inline TBool PartitionIsFAT(TUint a) + { + return ( + a==KPartitionTypeFAT12 || + a==KPartitionTypeFAT16small || + a==KPartitionTypeFAT16 || + a==KPartitionTypeFAT16 || + a==KPartitionTypeWin95FAT16LBA || + a==KPartitionTypeHiddenFAT12 || + a==KPartitionTypeHiddenFAT16small || + a==KPartitionTypeHiddenFAT16 || + a==KPartitionTypeHiddenWin95FAT16LBA + ); + } + +inline TBool PartitionIsFAT32(TUint a) + { + return ( + a==KPartitionTypeWin95FAT32 || + a==KPartitionTypeWin95FAT32LBA || + a==KPartitionTypeHiddenWin95FAT32 || + a==KPartitionTypeHiddenWin95FAT32LBA + ); + } + +inline TBool PartitionIsNTFS(TUint a) + { + return ( + a==KPartitionTypeNTFS || + a==KPartitionTypeHiddenNTFS + ); + } + +// +// Entry in MBR partition table +// +const TUint KBootIndicatorBootable=0x80; + +class TMBRPartitionEntry + { +public: + TBool IsValidPartition() + { return (iNumSectors>0 && iPartitionType!=KPartitionTypeEmpty); } + TBool IsValidDosPartition() + { return (iNumSectors>0 && PartitionIsFAT(iPartitionType)); } + TBool IsDefaultBootPartition() + { return(iX86BootIndicator==KBootIndicatorBootable && (IsValidDosPartition() || IsValidFAT32Partition())); } + TBool IsValidFAT32Partition() + { return (iNumSectors>0 && PartitionIsFAT32(iPartitionType)); } +public: + TUint8 iX86BootIndicator; + TUint8 iStartHead; + TUint8 iStartSector; + TUint8 iStartCylinder; + TUint8 iPartitionType; + TUint8 iEndHead; + TUint8 iEndSector; + TUint8 iEndCylinder; + TUint32 iFirstSector; + TUint32 iNumSectors; + }; + +// +// Defines for Master boot record +// +const TUint KMBRFirstPartitionOffset=0x1BE; +const TUint KMBRSignatureOffset=0x1FE; +const TUint KMBRSignature=0xAA55; +const TInt KMBRMaxPrimaryPartitions=4; + +class TMasterBootRecord + { +public: + TUint8 iBootCode[KMBRFirstPartitionOffset]; + TMBRPartitionEntry iPartitionEntry[KMBRMaxPrimaryPartitions]; + TUint16 iSignature; + }; + + + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/u32exec.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/u32exec.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,208 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\u32exec.h +// +// + +/** + @file + @internalComponent +*/ + +#ifndef __U32EXEC_H__ +#define __U32EXEC_H__ +#include +#include + +#ifdef __KERNEL_MODE__ +#define EXEC_INT64 Int64 +#define EXEC_TIME TTimeK +#else +#define EXEC_INT64 TInt64 +#define EXEC_TIME TInt64 +#endif + +#define __EXECDECL__ __NAKED__ + +#if defined(__WINS__) + +// Executive call macros for WINS + +#define EXECUTIVE_FAST 0x00800000 +#define EXECUTIVE_SLOW 0x00000000 + +#define __DISPATCH(func) \ + __asm lea edx, [esp + 0x4] \ + __asm mov ecx, (func) \ + __asm jmp [TheDispatcher] + +#define FAST_EXEC0(n) __DISPATCH((n)|EXECUTIVE_FAST) +#define FAST_EXEC1(n) __DISPATCH((n)|EXECUTIVE_FAST) +#define SLOW_EXEC0(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC1(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC2(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC3(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC4(n) __DISPATCH((n)|EXECUTIVE_SLOW) + +#define KFAST_EXEC0(n) __DISPATCH((n)|EXECUTIVE_FAST) +#define KFAST_EXEC1(n) __DISPATCH((n)|EXECUTIVE_FAST) +#define KSLOW_EXEC0(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC1(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC2(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC3(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC4(n) __DISPATCH((n)|EXECUTIVE_SLOW) + +#elif defined(__CPU_X86) + +// Executive call macros for X86 +#ifdef __GCC32__ +#define FAST_EXEC0(n) asm("mov eax, %0": :"i"(n)); \ + asm("int 0x20 \n ret") +#define FAST_EXEC1(n) asm("mov eax, %0": :"i"(n)); \ + asm("mov ecx, [esp+4] \n int 0x20 \n ret") +#define SLOW_EXEC0(n) asm("mov eax, %0": :"i"(n)); \ + asm("int 0x21 \n ret") +#define SLOW_EXEC1(n) asm("mov eax, %0": :"i"(n)); \ + asm("mov ecx, [esp+4] \n int 0x21 \n ret") +#define SLOW_EXEC2(n) asm("mov eax, %0": :"i"(n)); \ + asm("mov ecx, [esp+4] \n mov edx, [esp+8] \n int 0x21 \n ret") +#define SLOW_EXEC3(n) asm("mov eax, %0": :"i"(n)); \ + asm("push ebx \n" \ + "mov ecx, [esp+8] \n" \ + "mov edx, [esp+12]\n" \ + "mov ebx, [esp+16]\n" \ + "int 0x21 \n" \ + "pop ebx \n" \ + "ret") + +#define SLOW_EXEC4(n) asm("mov eax, %0": :"i"(n)); \ + asm("push ebx \n" \ + "push esi \n" \ + "mov ecx, [esp+12]\n" \ + "mov edx, [esp+16]\n" \ + "mov ebx, [esp+20]\n" \ + "mov esi, [esp+24]\n" \ + "int 0x21 \n" \ + "pop esi \n" \ + "pop ebx \n" \ + "ret") +#else +#define FAST_EXEC0(n) _asm mov eax, n _asm int 20h _asm ret +#define FAST_EXEC1(n) _asm mov eax, n _asm mov ecx, [esp+4] _asm int 20h _asm ret + +#define SLOW_EXEC0(n) _asm mov eax, n _asm int 21h _asm ret +#define SLOW_EXEC1(n) _asm mov eax, n _asm mov ecx, [esp+4] _asm int 21h _asm ret +#define SLOW_EXEC2(n) _asm mov eax, n _asm mov ecx, [esp+4] _asm mov edx, [esp+8] _asm int 21h _asm ret + +#define SLOW_EXEC3(n) _asm mov eax, n \ + _asm push ebx \ + _asm mov ecx, [esp+8] \ + _asm mov edx, [esp+12] \ + _asm mov ebx, [esp+16] \ + _asm int 21h \ + _asm pop ebx \ + _asm ret + +#define SLOW_EXEC4(n) _asm mov eax, n \ + _asm push ebx \ + _asm push esi \ + _asm mov ecx, [esp+12] \ + _asm mov edx, [esp+16] \ + _asm mov ebx, [esp+20] \ + _asm mov esi, [esp+24] \ + _asm int 21h \ + _asm pop esi \ + _asm pop ebx \ + _asm ret +#endif + +#define KFAST_EXEC0(n) FAST_EXEC0(n) +#define KFAST_EXEC1(n) FAST_EXEC1(n) +#define KSLOW_EXEC0(n) SLOW_EXEC0(n) +#define KSLOW_EXEC1(n) SLOW_EXEC1(n) +#define KSLOW_EXEC2(n) SLOW_EXEC2(n) +#define KSLOW_EXEC3(n) SLOW_EXEC3(n) +#define KSLOW_EXEC4(n) SLOW_EXEC4(n) + +#elif defined(__CPU_ARM) + +// Executive call macros for ARM + +#define EXECUTIVE_FAST 0x00800000 +#define EXECUTIVE_SLOW 0x00000000 + +#define __DISPATCH(n) \ + asm("swi %a0" : : "i" (n)); \ + __JUMP(,lr); + +#define FAST_EXEC0(n) __DISPATCH((n)|EXECUTIVE_FAST) +#define FAST_EXEC1(n) __DISPATCH((n)|EXECUTIVE_FAST) +#define SLOW_EXEC0(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC1(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC2(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC3(n) __DISPATCH((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC4(n) __DISPATCH((n)|EXECUTIVE_SLOW) + +#define __KDISPATCH(n) \ + asm("stmfd sp!, {ip,lr} "); \ + asm("swi %a0" : : "i" (n)); \ + __POPRET("ip,"); + +#define KFAST_EXEC0(n) __KDISPATCH((n)|EXECUTIVE_FAST) +#define KFAST_EXEC1(n) __KDISPATCH((n)|EXECUTIVE_FAST) +#define KSLOW_EXEC0(n) __KDISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC1(n) __KDISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC2(n) __KDISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC3(n) __KDISPATCH((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC4(n) __KDISPATCH((n)|EXECUTIVE_SLOW) + +#define __DISPATCH_NR(n) \ + asm("swi %a0" : : "i" (n)); + +#define FAST_EXEC0_NR(n) __DISPATCH_NR((n)|EXECUTIVE_FAST) +#define FAST_EXEC1_NR(n) __DISPATCH_NR((n)|EXECUTIVE_FAST) +#define SLOW_EXEC0_NR(n) __DISPATCH_NR((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC1_NR(n) __DISPATCH_NR((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC2_NR(n) __DISPATCH_NR((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC3_NR(n) __DISPATCH_NR((n)|EXECUTIVE_SLOW) +#define SLOW_EXEC4_NR(n) __DISPATCH_NR((n)|EXECUTIVE_SLOW) + +#define __KDISPATCH_NR(n) \ + asm("swi %a0" : : "i" (n)); + +#define KFAST_EXEC0_NR(n) __KDISPATCH_NR((n)|EXECUTIVE_FAST) +#define KFAST_EXEC1_NR(n) __KDISPATCH_NR((n)|EXECUTIVE_FAST) +#define KSLOW_EXEC0_NR(n) __KDISPATCH_NR((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC1_NR(n) __KDISPATCH_NR((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC2_NR(n) __KDISPATCH_NR((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC3_NR(n) __KDISPATCH_NR((n)|EXECUTIVE_SLOW) +#define KSLOW_EXEC4_NR(n) __KDISPATCH_NR((n)|EXECUTIVE_SLOW) + +#else +#error Unknown CPU +#endif + +#ifdef __LEAVE_EQUALS_THROW__ +// Hide TTrap to catch unwary uses of the old cleanup +// mechanism at compile time +class TTrap; +#endif //__LEAVE_EQUALS_THROW__ + +#include +#ifndef __TOOLS2__ +#include +#endif +#include + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/u32hal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/u32hal.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2969 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\u32hal.h +// +// + +#ifndef __U32HAL_H__ +#define __U32HAL_H__ + +#include + +// +// Classes used for in functions +// + +/** +Used for TVariantInfoV01::iLedCapabilities +@publishedPartner +@released +*/ +const TUint KLedMaskRed1=0x00000001; + +/** +Used for TVariantInfoV01::iLedCapabilities +@publishedPartner +@released +*/ +const TUint KLedMaskGreen1=0x00000002; + +/** +Used for TVariantInfoV01::iLedCapabilities +@publishedPartner +@released +*/ +const TUint KLedMaskYellow1=0x00000004; + +/** +Used for TSupplyInfoV1.iFlags +@publishedPartner +@deprecated Unused by Symbian code +*/ +const TUint KSupplyFlagSoundWarning=0x00000001; + +/** +Used for TSupplyInfoV1.iFlags +@publishedPartner +@deprecated Unused by Symbian code +*/ +const TUint KSupplyFlagBacklightWarning=0x00000002; + +/** +Used for TSupplyInfoV1.iFlags +@publishedPartner +@deprecated Unused by Symbian code +*/ +const TUint KSupplyFlagTimeChanged=0x80000000; + +/** +@internalComponent +@deprecated Unused by Symbian code +*/ +class TClearSetMask + { +public: + TUint iClearMask; + TUint iSetMask; + }; + +/** +@internalTechnology +@deprecated Unused by Symbian code +*/ +enum TSupplyStatus + { + EZero,EVeryLow,ELow,EGood + }; + +/** +@internalTechnology +@deprecated Unused by Symbian code +*/ +class TSupplyInfoV1 + { +public: + SInt64 iMainBatteryInsertionTime; + TSupplyStatus iMainBatteryStatus; + SInt64 iMainBatteryInUseMicroSeconds; + TInt iCurrentConsumptionMilliAmps; + TInt iMainBatteryConsumedMilliAmpSeconds; + TInt iMainBatteryMilliVolts; + TInt iMainBatteryMaxMilliVolts; + TSupplyStatus iBackupBatteryStatus; + TInt iBackupBatteryMilliVolts; + TInt iBackupBatteryMaxMilliVolts; + TBool iExternalPowerPresent; + SInt64 iExternalPowerInUseMicroSeconds; + TUint iFlags; + }; + +/** +@internalTechnology +@deprecated Unused by Symbian code +*/ +typedef TPckgBuf TSupplyInfoV1Buf; + +/** +@publishedPartner +@deprecated Unused by Symbian code +*/ +class TMouseProperties + { +public: + TUint8 iSpeed; + TUint8 iAcceleration; + }; + +/** +@internalTechnology Used by Symbian base ports +@deprecated Unused by Symbian code +*/ +class TSoundInfoV1 + { +public: + TBool iKeyClickEnabled; + TBool iKeyClickLoud; + TBool iKeyClickOverridden; + TBool iPointerClickEnabled; + TBool iPointerClickLoud; + TBool iBeepEnabled; + TBool iBeepLoud; + TBool iSoundDriverEnabled; + TBool iSoundDriverLoud; + TBool iSoundEnabled; + }; + +/** +@internalTechnology +@deprecated Unused by Symbian code +*/ +typedef TPckgBuf TSoundInfoV1Buf; + +/** +@internalTechnology Used by Symbian base ports +*/ +class TOnOffInfoV1 + { +public: + TBool iPointerSwitchesOn; + TBool iCaseOpenSwitchesOn; + TBool iCaseCloseSwitchesOff; + }; + +/** +@internalTechnology +@deprecated Unused by Symbian code +*/ +typedef TPckgBuf TOnOffInfoV1Buf; + +/** +@internalTechnology +@removed Unused by Symbian code +*/ +enum TUserMediaFunction {EUserMediaRemount,EUserMediaNotifyChange}; + + + + +// +// Hal function enumerations +// + +/** +@publishedPartner +@released + +Defines the set of HAL groups. + +Each HAL group has an associated HAL handler. Note that the +HAL handlers for EHalGroupKernel and EHalGroupEmulator are internal +to Symbian OS. + +See the Base Porting Guide documentation in the developer library for +more information on HAL groups. +*/ +enum THalFunctionGroup + { + /** + @internalComponent + + The HAL group associated with kernel related information; for example + the reason for the most recent system boot. + + The function-ids associated with this HAL group are defined by the set + of TKernelHalFunction enum values. + */ + EHalGroupKernel=0, + + + /** + The HAL group associated with Variant specific hardware. + + This HAL handler is implemented by the Variant, specifically by + the base port's implementation of Asic::VariantHal(). + + The function-ids associated with this HAL group are defined by the set + of TVariantHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TVariantHalFunction + @see Asic::VariantHal() + */ + EHalGroupVariant=1, + + + /** + The HAL group associated with the media driver. + + It is used internally by the media driver LDD. + + The function-ids associated with this HAL group are defined by the set + of TMediaHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TMediaHalFunction + */ + EHalGroupMedia=2, + + + /** + The HAL group associated with power handling. + + This HAL handler is implemented by the power model. + + The function-ids associated with this HAL group are defined by the set + of TPowerHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TPowerHalFunction + */ + EHalGroupPower=3, + + + /** + The HAL group associated with the main screen display. + + This HAL handler is implemented by the screen (i.e. LCD or video driver). + + The function-ids associated with this HAL group are defined by the set + of TDisplayHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TDisplayHalFunction + */ + EHalGroupDisplay=4, + + + /** + The HAL group associated with the digitiser (i.e. pen or stylus). + + This HAL handler is implemented by the digitiser. + + The function-ids associated with this HAL group are defined by the set + of TDigitiserHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TDigitiserHalFunction + */ + EHalGroupDigitiser=5, + + + /** + The HAL group associated with a sound driver. + + This group is provided by Symbian OS for backwards compatibility with + the Psion Series 5MX devices. + + The function-ids associated with this HAL group are defined by the set + of TSoundHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TSoundHalFunction + */ + EHalGroupSound=6, + + + /** + The HAL group associated with a mouse-type device. + + In Symbian OS, the the only example of a mouse device is in the emulator, + and this is a port of Symbian OS maintained by Symbian. + + The function-ids associated with this HAL group are defined by the set + of TMouseHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TMouseHalFunction + */ + EHalGroupMouse=7, + + + /** + @internalComponent + + The HAL group associated with the emulator. + + The function-ids associated with this HAL group are defined by the set + of TEmulatorHalFunction enum values. + */ + EHalGroupEmulator=8, + + + /** + The HAL group associated with the keyboard. + + This HAL handler is implemented by the keyboard driver. + + The function-ids associated with this HAL group are defined by the set + of TKeyboardHalFunction enum values. See the individual function-ids for + the associated capabilities. + + @see TKeyboardHalFunction + */ + EHalGroupKeyboard=9, + + /* + The HAL group associated with the virtual memory system. + + The function-ids associated with this HAL group are defined by the set + of TVMHalFunction enum values. + + @see TVMHalFunction + */ + EHalGroupVM=10, + + /* + The HAL group associated with the RAM Zone configuration. + + The function-ids associated with this HAL group are defined by the set + of TRamHalFunction enum values. + + @see TRamHalFunction + */ + EHalGroupRam=11, + + /** + Reserved for platform specific use. + */ + EHalGroupPlatformSpecific1=29, + + /** + Reserved for platform specific use. + */ + EHalGroupPlatformSpecific2=30 + }; + + + + +/** +@internalComponent +*/ +enum TKernelHalFunction + { + EKernelHalMemoryInfo, + EKernelHalRomInfo, + EKernelHalStartupReason, + EKernelHalFaultReason, + EKernelHalExceptionId, + EKernelHalExceptionInfo, + EKernelHalCpuInfo, + EKernelHalPageSizeInBytes, + EKernelHalTickPeriod, + EKernelHalMemModelInfo, + EKernelHalFastCounterFrequency, + EKernelHalNTickPeriod, + EKernelHalHardwareFloatingPoint, + EKernelHalGetNonsecureClockOffset, + EKernelHalSetNonsecureClockOffset, + EKernelHalSmpSupported, + EKernelHalNumLogicalCpus, + EKernelHalSupervisorBarrier, + EKernelHalFloatingPointSystemId, + EKernelHalLockThreadToCpu, + EKernelHalConfigFlags, + }; + + + + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupVariant +HAL group. + +Each enum value represents a specific characteristic of the Variant, +and is passed as the second parameter to +the HAL handler function dealing with this group. + +@see EHalGroupVariant +*/ +enum TVariantHalFunction + { + /** + Gets Variant specifc information. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TVariantInfoV01 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + + @see TVariantInfoV01 + @see TPckgBuf + */ + EVariantHalVariantInfo, + + + /** + Sets the debug port number. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value containing the debug port number. + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalDebugPortSet, + + + /** + Gets the debug port number. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the debug port value + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalDebugPortGet, + + + /** + Sets the current state of each LED. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TUint value containing the bitmask that + describes the state of the LEDs. For each bit in the mask, 0 = OFF, 1 = ON. + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalLedMaskSet, + + + /** + Gets the current state of each LED. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TUint value into which the HAL handler puts the bitmask that + describes the state of the LEDs. For each bit in the mask, 0 = OFF, 1 = ON. + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalLedMaskGet, + + + /** + Gets the current state of any Variant specific switches. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TUint value into which the HAL handler puts the bits that + describe the state of the switches. The meaning of the switches is entirely + hardware dependent. + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalSwitches, + + + /** + Restarts the system. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TUint value containing the bits defining the custom restart reasons + that can be passed to Kern::Restart(). + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + + @capability PowerMgmt + + @see Kern::Restart() + */ + EVariantHalCustomRestart, + + + /** + Gets the reason for the system restart. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the handler will put a value + representing the restart reason. + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in the file + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalCustomRestartReason, + + + /** + Gets the current state of the case. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TUint value into which the HAL handler puts a value representing the case state. + Possible values are 0 for closed, and 1 for open. + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalCaseState, + + + /** + Gets the number of screens on this platform. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to TInt that will contain the number of screens + + - TAny* a2 : NULL. + + */ + EVariantHalCurrentNumberOfScreens, + + /** + Sets the startup reason for the system restart. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TUint value containing the bits defining the startup mode + that will be passed to Kern::Restart(). + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + + @capability WriteDeviceData + + @see Kern::Restart() + */ + EVariantHalPersistStartupMode, + + /** + Gets the startup mode after a system restart. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt that will hold the returned value + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in the file + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalGetPersistedStartupMode, + + /** + Returns the maximum number of values that can be used to store the startup reason required for a custom restart. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt that will hold the returned value + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalGetMaximumCustomRestartReasons, + + /** + Returns the maximum number of values that can be used to store the startup mode required for a transition to + a EPwRestart power state. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt that will hold the returned value + + - TAny* a2 : NULL. + + An example of this function can be found in the Variant template; + see the function: + @code + Template::VariantHal() + @endcode + in + @code + ...\template\template_variant\specific\variant.cpp + @endcode + */ + EVariantHalGetMaximumRestartStartupModes, + }; + + + + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupMedia +HAL group. + +Each enum value represents a specific characteristic of the media driver, +and is passed as the second parameter to +the HAL handler function dealing with this group. + +@see EHalGroupMedia +*/ +enum TMediaHalFunction + { + /** + Gets drive information. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TDriveInfoV1 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + - TAny* a2 : NULL. + + Note that the HAL handler is implemented by Symbian OS + + @see TDriveInfoV1 + @see TPckgBuf + */ + EMediaHalDriveInfo, + + /** + @internalTechnology + @test + */ + EMediaHalGetROMConcurrencyInfo, + + /** + @internalTechnology + @test + */ + EMediaHalGetCodeConcurrencyInfo, + + /** + @internalTechnology + @test + */ + EMediaHalResetConcurrencyInfo, + + /** + @internalTechnology + @test + */ + EMediaHalGetROMPagingBenchmark, + + /** + @internalTechnology + @test + */ + EMediaHalGetCodePagingBenchmark, + + /** + @internalTechnology + @test + */ + EMediaHalResetPagingBenchmark + }; + + + + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupPower +HAL group. + +Each enum value represents a specific aspect of power handling on the device. + +@see EHalGroupPower +*/ +enum TPowerHalFunction + { + + /** + This is used internally by Symbian + */ + EPowerHalOnOffInfo, + + + /** + This is not currently used. + */ + EPowerHalSupplyInfo, + + + /** + This is not currently used. + + @capability PowerMgmt + */ + EPowerHalSetAutoSwitchOffBehavior, + + + /** + This is not currently used. + */ + EPowerHalAutoSwitchOffBehavior, + + + /** + This is not currently used. + + @capability PowerMgmt + */ + EPowerHalSetAutoSwitchOffTime, + + + /** + This is not currently used. + */ + EPowerHalAutoSwitchOffTime, + + + /** + This is not currently used. + + @capability PowerMgmt + */ + EPowerHalResetAutoSwitchOffTimer, + + + /** + Switches the device off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : NULL. + + - TAny* a2 : NULL. + + @capability PowerMgmt + */ + EPowerHalSwitchOff, + + + /** + Sets whether touching the screen with a pen or stylus will cause + the device to switch on. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (if touching the screen + is to cause a power on), or EFalse (if touching the screen is not to cause + a power on). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + EPowerHalSetPointerSwitchesOn, + + + /** + Tests whether touching the screen with a pen or stylus will cause + the device to switch on. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (if touching + the screen will cause a power on), or EFalse (if touching the screen will + not cause a power on). + + - TAny* a2 : NULL. + */ + EPowerHalPointerSwitchesOn, + + + /** + Sets whether the opening of a 'device case' will cause + the device to switch on. + + Note that the meaning attached to a 'device case' depends on the hardware. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (if opening + the case is to cause a power on), or EFalse (if opening + the case is not to cause a power on). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + EPowerHalSetCaseOpenSwitchesOn, + + + /** + Tests whether the opening of a 'device case' will cause + the device to switch on. + + Note that the meaning attached to a 'device case' depends on the hardware. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (if opening + the case will cause a power on), or EFalse (if opening + the case will not cause a power on). + + - TAny* a2 : NULL. + */ + EPowerHalCaseOpenSwitchesOn, + + + /** + Sets whether the closing of a 'device case' will cause + the device to switch off. + + Note that the meaning attached to a 'device case' depends on the hardware. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (if closing + the case is to cause a power off), or EFalse (if closing + the case is not to cause a power off). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + EPowerHalSetCaseCloseSwitchesOff, + + + /** + Tests whether the closing of a 'device case' will cause + the device to switch off. + + Note that the meaning attached to a 'device case' depends on the hardware. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (if closing + the case will cause a power off), or EFalse (if closing + the case will not cause a power off). + + - TAny* a2 : NULL. + */ + EPowerHalCaseCloseSwitchesOff, + + + /** + This is not currently used. + + @capability PowerMgmt + */ + EPowerHalSetBatteryType, + + + /** + This is not currently used. + */ + EPowerHalBatteryType, + + + /** + This is not currently used. + + @capability PowerMgmt + */ + EPowerHalSetBatteryCapacity, + + + /** + This is not currently used. + */ + EPowerHalBatteryCapacity, + + + /** + This is not currently used. + */ + EPowerHalAutoSwitchOffType, + + + /** + This is used internally by Symbian. + */ + EPowerHalTestBootSequence, + + + /** + Tests whether a backup power supply is present or not. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (if backup + power is present), or EFalse (if backup power is not present). + + - TAny* a2 : NULL. + */ + EPowerHalBackupPresent, + + + /** + Tests whether accessory power is present or not. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (if accessory + power is present), or EFalse (if accessory power is not present). + + - TAny* a2 : NULL. + */ + EPowerHalAcessoryPowerPresent, + }; + + + + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupDisplay +HAL group. + +Each enum value represents a specific characteristic of the hardware display, +i.e. the screen or the LCD, and is passed as the second parameter to +the HAL handler function dealing with this group. + +@see EHalGroupDisplay +*/ +enum TDisplayHalFunction + { + + /** + Gets the screen display properties. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TScreenInfoV01 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + - TAny* a2 : NULL. + + For example: + @code + ... + case EDisplayHalScreenInfo: + TPckgBuf vPckg; + // Fill details + Kern::InfoCopy(*(TDes8*)a1,vPckg); + ... + @endcode + + @see TScreenInfoV01 + @see TPckgBuf + */ + EDisplayHalScreenInfo, + + + /** + Registers whether it is the Window Server's responsibility to turn + the screen display on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a TBool value that needs to be set to ETrue or EFalse. + + - TAny* a2 : NULL. + + For example: + @code + ... + case EDisplayHalWsRegisterSwitchOnScreenHandling: + iWsSwitchOnScreen=(TBool)a1; + ... + @endcode + + @see TBool + */ + EDisplayHalWsRegisterSwitchOnScreenHandling, + + + /** + Requests that the Window Server turn the screen display on. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : NULL + + - TAny* a2 : NULL + */ + EDisplayHalWsSwitchOnScreen, + + + /** + Gets the maximum screen display contrast value. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the maximum + display contrast value. + + - TAny* a2 : NULL + */ + EDisplayHalMaxDisplayContrast, + + + /** + Sets the screen display contrast value. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value containing the display contrast value. + Typically, this needs to lie within a range that is valid for the device. + + - TAny* a2 : NULL + + @capability WriteDeviceData + */ + EDisplayHalSetDisplayContrast, + + + /** + Gets the screen display's current contrast value. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the + display contrast value. + + - TAny* a2 : NULL + */ + EDisplayHalDisplayContrast, + + + /** + Sets the backlight behaviour. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : Not specified; depends on the manufacturer's implementation. + + - TAny* a2 : Not specified; depends on the manufacturer's implementation. + + @capability WriteDeviceData + */ + EDisplayHalSetBacklightBehavior, + + + /** + Gets information about the backlight behaviour. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : Not specified; depends on the manufacturer's implementation. + + - TAny* a2 : Not specified; depends on the manufacturer's implementation. + */ + EDisplayHalBacklightBehavior, + + + /** + Sets the backlight timeout value, i.e. the length of time that the backlight + will stay on. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : Not specified; depends on the manufacturer's implementation. + + - TAny* a2 : Not specified; depends on the manufacturer's implementation. + + @capability WriteDeviceData + */ + EDisplayHalSetBacklightOnTime, + + + /** + Gets information about the backlight timeout value, i.e. the length + of time that the backlight will stay on. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : Not specified; depends on the manufacturer's implementation. + + - TAny* a2 : Not specified; depends on the manufacturer's implementation. + */ + EDisplayHalBacklightOnTime, + + + /** + Sets the backlight on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue or EFalse. + + - TAny* a2 : NULL + + @capability WriteDeviceData + */ + EDisplayHalSetBacklightOn, + + + /** + Gets the current state of the backlight. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler + puts ETrue (for On) or EFalse (for Off). + + - TAny* a2 : NULL + */ + EDisplayHalBacklightOn, + + + /** + Gets the screen display's maximum brightness value. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the + maximum brightness value. + + - TAny* a2 : NULL + */ + EDisplayHalMaxDisplayBrightness, + + + /** + Sets the screen display's brightness value. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value containing the brightness value. + Typically, this needs to lie within a range that is valid for the device. + + - TAny* a2 : NULL + + @capability WriteDeviceData + */ + EDisplayHalSetDisplayBrightness, + + + /** + Gets the screen display's current brightness value. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the + brightness value. + + - TAny* a2 : NULL + */ + EDisplayHalDisplayBrightness, +// + + /** + Gets the number of available display modes. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the + number of display modes value. + + - TAny* a2 : NULL + */ + EDisplayHalModeCount, + + + /** + Sets the display mode. + + This will normally update the information maintained by the screen driver + in the form of a TScreenInfoV01 struct. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value containing a number representing the display mode. + Typically, this needs to lie within a range that is valid for the device. + For example, the value usually needs to be positive, and be less than + the number of display modes. + + - TAny* a2 : NULL + + @capability MultimediaDD + + @see TScreenInfoV01 + */ + EDisplayHalSetMode, + + + /** + Gets the current screen display mode. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the + the current display mode value. + + - TAny* a2 : NULL + */ + EDisplayHalMode, + + + /** + Sets a colour value for the specified palette entry. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value that identifies the palette entry. The value + occupies the junior 8 bits of the integer. The senior 24 bits are all 0. + + - TAny* a2 : A TInt value containing the colour value; it represents + a standard Symbian OS RGB colour value, and occupies the junior 24 bits + of the integer. The senior 8 bits are not defined. + + @capability MultimediaDD + */ + EDisplayHalSetPaletteEntry, + + + /** + Gets the colour value for the specified palette entry. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value that identifies the palette entry. The value + is expected to occupy the junior 8 bits of the integer. The senior 24 bits + are not defined. + + - TAny* a2 : On return from the HAL function, a TInt value containing + the colour value. The value occupies the junior 24 bits of the integer. + The senior 8 bits are not defined. + */ + EDisplayHalPaletteEntry, + + + /** + Sets the screen display on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (for On), + or EFalse (for Off). + + - TAny* a2 : NULL. + + @capability PowerMgmt + */ + EDisplayHalSetState, + + + /** + Gets the state of the screen display, i.e. whether the display is on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (for On), + or EFalse (for Off). + + - TAny* a2 : NULL. + */ + EDisplayHalState, + + + /** + Gets the maximum number of colours that the screen display supports. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the maximum + number of colours. + + - TAny* a2 : NULL + */ + EDisplayHalColors, + + + /** + Gets information about the current display mode. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TVideoInfoV01 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + - TAny* a2 : NULL. + + @see TVideoInfoV01 + @see TPckgBuf + */ + EDisplayHalCurrentModeInfo, + + + /** + Gets information about the specified display mode. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value containing the number of the display mode for which + information is to be fetched. + + - TAny* a2 : This is a pointer to a package buffer (TPckgBuf) containing a + TVideoInfoV01 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + @see TVideoInfoV01 + @see TPckgBuf + */ + EDisplayHalSpecifiedModeInfo, + +// EDisplaySwitchOffScreen, + + + /** + Fills/copies an area of the screen display with a rectangle of a specified colour. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + SRectOpInfo structure. The structure contains the information that + is needed for the operation. + + - TAny* a1 : NULL. + + @see SRectOpInfo + @see TPckgBuf + */ + EDisplayHalBlockFill, + + + /** + Fills/copies an area of the screen display with a rectangle of a specified colour. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + SRectOpInfo structure. The structure contains the information that + is needed for the operation. + + - TAny* a1 : NULL. + + @see SRectOpInfo + @see TPckgBuf + */ + EDisplayHalBlockCopy, + + + /** + Tests whether the screen display is secure. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (for secure mode), + or EFalse (for non-secure mode). + + - TAny* a2 : NULL. + */ + EDisplayHalSecure, + + + /** + Sets the screen display into secure or non-secure mode. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (for secure mode), + or EFalse (for non-secure mode). + + - TAny* a2 : NULL. + + @capability MultimediaDD + */ + EDisplayHalSetSecure, + + + /** + Gets the address of the DSA buffer + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the address + + - TAny* a2 : NULL + */ + EDisplayHalGetDisplayMemoryAddress, + /** + Gets a handle to the DSA buffer memory + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the handle value + + - TAny* a2 : NULL + */ + EDisplayHalGetDisplayMemoryHandle, + }; + + + + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupDigitiser +HAL group. + +Each enum value represents a specific characteristic of the digitiser, +and is passed as the second parameter to the HAL handler function +dealing with this group. + +@see EHalGroupDigitiser +*/ +enum TDigitiserHalFunction + { + + /** + Sets the calibration data (i.e. the values of the digitiser to + screen constants) for the digitiser device. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A pointer to a TDigitizerCalibration object. + + - TAny* a2 : NULL + + @see TDigitizerCalibration + + @capability WriteDeviceData + */ + EDigitiserHalSetXYInputCalibration, + + + /** + Gets the calibration data (i.e. the values of the digitiser to + screen constants) for the digitiser device. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A pointer to a TDigitizerCalibration object; the HAL function + needs to fill the members of this structure with + the appropriate information. + + - TAny* a2 : NULL + + @see TDigitizerCalibration + */ + EDigitiserHalCalibrationPoints, + + + /** + Saves the calibration data (i.e. the values of the digitiser to + screen constants) for the digitiser device in a persistent memory area so + that they can be restored after a power cycle. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : NULL. + + - TAny* a2 : NULL + */ + EDigitiserHalSaveXYInputCalibration, + + + /** + Restores the calibration data (i.e. the values of the digitiser to + screen constants) for the digitiser device from a persistent memory area so + that they can be restored after a power cycle. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : NULL. + + - TAny* a2 : NULL + + @capability WriteDeviceData + */ + EDigitiserHalRestoreXYInputCalibration, + + + /** + Gets digitiser information as defined by the content of + a TDigitiserInfoV01 (or TDigitiserInfoV02) struct. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TDigitiserInfoV01 (or TDigitiserInfoV02) structure. The HAL function needs + to fill the members of this structure with the appropriate information. + + - TAny* a2 : NULL + + @see TPckgBuf + @see TDigitiserInfoV01 + */ + EDigitiserHalXYInfo, + + + /** + Tests whether the digitiser is on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool value that needs to be set to ETrue (On), or EFalse (Off). + + - TAny* a2 : NULL + */ + EDigitiserHalXYState, + + + /** + Sets the digitiser either on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (On), or EFalse (Off). + + - TAny* a2 : NULL + + @capability PowerMgmt + */ + EDigitiserHalSetXYState, + + /** + Checks whether the pointing device supports 3rd dimension. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool value that needs to be set to ETrue (3D supported), or EFalse (3D not supported). + + - TAny* a2 : NULL + */ + EDigitiserHal3DPointer, + + /** + Sets the detection range above the screen. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value that is the detection range in units of distance above the screen. + + - TAny* a2 : NULL + */ + EDigitiserHalSetZRange, + + /** + @prototype + + Sets the number of pointers it supports on the digitiser. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value that sets the number of pointer to be supported by the digitiser driver + + - TAny* a2 : NULL + */ + EDigitiserHalSetNumberOfPointers, + + /** + @prototype + + Gets digitiser information as defined by the content of + a TDigitiserInfoV02 struct. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TDigitiserInfoV02 structure. The HAL function needs + to fill the members of this structure with the appropriate information. + + - TAny* a2 : NULL + + @see TPckgBuf + @see TDigitiserInfoV02 + */ + EDigitiserHal3DInfo + + }; + + + + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupSound +HAL group. + +Each enum value represents a specific characteristic of the sound driver, +and is passed as the second parameter to the HAL handler function +dealing with this group. + +Note that a sound driver in Symbian OS is only maintained for backwards +compatibility with the Psion Series 5MX devices. + +@see EHalGroupSound +*/ +enum TSoundHalFunction + { + /** + Gets sound driver information. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TSoundInfoV1 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + - TAny* a2 : NULL. + + @see TSoundInfoV1 + @see TPckgBuf + */ + ESoundHalSoundInfo, + + + /** + Sets whether a click is to be sounded on a key press. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (click is to be sounded), + or EFalse (click is not to be sounded). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetKeyClickEnabled, + + + /** + Sets whether a click that is to be sounded on a key press, is loud or not. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (click is to be loud), + or EFalse (click is not to be loud). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetKeyClickLoud, + + + /** + Sets whether a click is to be sounded when a pointing device touches + the screen. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (click is to be sounded), + or EFalse (click is not to be sounded). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetPointerClickEnabled, + + + /** + Sets whether a click that is to be sounded when a pointing device touches + the screen, is loud or not. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (click is to be loud), + or EFalse (click is not to be loud). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetPointerClickLoud, + + + /** + Sets whether the beep sound is enabled. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (beep is enabled), + or EFalse (beep is not enabled). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetBeepEnabled, + + + /** + Sets whether the beep sound is to be loud. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (beep is loud), + or EFalse (beep is not loud). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetBeepLoud, + + + /** + Sets whether the sound driver is enabled. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (driver is enabled), + or EFalse (driver is not enabled). + + - TAny* a2 : NULL. + + @capability PowerMgmt + */ + ESoundHalSetSoundDriverEnabled, + + + /** + Sets whether the sound driver is to generate loud sounds. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (driver is to generate loud sounds), + or EFalse (driver is not to generate loud sounds). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetSoundDriverLoud, + + + /** + Sets whether sound generation is enabled. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (sound generation is enabled), + or EFalse (sound generation is not enabled). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetSoundEnabled, + + + /** + Sets whether generation of key clicks is to be overridden. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (key clicks to be overridden), + or EFalse (key clicks not to be overridden). + + - TAny* a2 : NULL. + + @capability WriteDeviceData + */ + ESoundHalSetKeyClickOverridden, + + + /** + Tests whether the generation of key clicks is overridden. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (key clicks are overridden), + or EFalse (key clicks are not overridden). + + - TAny* a2 : NULL. + */ + ESoundHalKeyClickOverridden, + + + /** + Tests whether a click that is to be sounded on a key press, is loud or not. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (click is loud), + or EFalse (click is not loud). + + - TAny* a2 : NULL. + */ + ESoundHalKeyClickLoud, + + + /** + Tests whether a click is to be sounded on a key press. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (click is sounded), + or EFalse (click is not sounded). + + - TAny* a2 : NULL. + */ + ESoundHalKeyClickEnabled, + + + /** + Tests whether a click that is to be sounded when a pointing device touches + the screen, is loud or not. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (click is loud), + or EFalse (click is not loud). + + - TAny* a2 : NULL. + */ + ESoundHalPointerClickLoud, + + + /** + Tests whether a click is to be sounded when a pointing device touches + the screen. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which teh HAL handler puts ETrue (click is to be sounded), + or EFalse (click is not to be sounded). + + - TAny* a2 : NULL. + */ + ESoundHalPointerClickEnabled, + + + /** + Generates a key click sound. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : NULL. + + - TAny* a2 : NULL. + */ + ESoundHalKeyClick, + + + /** + Generates a pointer click sound. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : NULL. + + - TAny* a2 : NULL. + */ + ESoundHalPointerClick, + + + /** + Generates a beep sound. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : NULL. + + - TAny* a2 : NULL. + */ + ESoundHalBeep, + + + /** + Gets the maximum volume of the key click. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the maximum volume value. + + - TAny* a2 : NULL. + */ + ESoundHalKeyClickVolumeMax, + + + /** + Gets the maximum volume of the pointer click. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the maximum volume value. + + - TAny* a2 : NULL. + */ + ESoundHalPointerClickVolumeMax, + }; + + + + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupMouse +HAL group. + +Each enum value represents a specific characteristic of the mouse device, +and is passed as the second parameter to the HAL handler function +dealing with this group. + +@see EHalGroupMouse +*/ +enum TMouseHalFunction + { + + + /** + Tests whether a mouse device is visible. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler + puts ETrue (for visible) or EFalse (for not-visible). + + - TAny* a2 : NULL + */ + EMouseHalMouseState, + + + /** + Sets the state of the mouse device, i.e. whether it is visible or invisible. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool that needs to be set to ETrue (for visible) + or EFalse (for not-visible). + + - TAny* a2 : NULL + + @capability MultimediaDD + */ + EMouseHalSetMouseState, + + + /** + Gets the mouse speed, i.e. how fast the mouse pointer moves. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the speed value. + This is expected to be a value in the range 0 to 255. + + - TAny* a2 : NULL + */ + EMouseHalMouseSpeed, + + + /** + Sets the mouse speed, i.e. how fast the mouse pointer moves. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value containing the speed value to be set + This is expected to be a value in the range 0 to 255. + + - TAny* a2 : NULL + + @capability MultimediaDD + */ + EMouseHalSetMouseSpeed, + + + /** + Gets the mouse acceleration, i.e. how much the mouse pointer accelerates + as the user moves it faster. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value into which the HAL handler puts the acceleration value. + This is expected to be a value in the range 0 to 255. + + - TAny* a2 : NULL + */ + EMouseHalMouseAcceleration, + + + /** + Sets the mouse acceleration, i.e. how much the mouse pointer accelerates + as the user moves it faster. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TInt value containing the acceleration value to be set + This is expected to be a value in the range 0 to 255. + + - TAny* a2 : NULL + + @capability MultimediaDD + */ + EMouseHalSetMouseAcceleration, + + + /** + Gets the state of the mouse buttons. + + This is not currently supported. + */ + EMouseHalMouseButtonState, + + + /** + Gets information about the mouse display characteristics. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TMouseInfoV01 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + - TAny* a2 : NULL. + + @see TMouseInfoV01 + @see TPckgBuf + */ + EMouseHalMouseInfo, + }; + +/** +@internalComponent +*/ +enum TEmulatorHalFunction + { + EEmulatorHalStringProperty, + EEmulatorHalIntProperty, + EEmulatorHalBoolProperty, + EEmulatorHalMapFilename, + EEmulatorHalColorDepth, + EEmulatorHalSetFlip, + EEmulatorHalCPUSpeed, + EEmulatorHalNumberOfScreens, + EEmulatorHalSetDisplayChannel, + }; + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupKeyboard +HAL group. + +Each enum value represents a specific characteristic of the keyboard, +and is passed as the second parameter to the HAL handler function +dealing with this group. + +@see EHalGroupKeyboard +*/ +enum TKeyboardHalFunction + { + + /** + Tests whether the keyboard is on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : A TBool into which the HAL handler puts ETrue (for On), + or EFalse (for Off). + + - TAny* a2 : NULL + */ + EKeyboardHalKeyboardState, + + + /** + Sets the keyboard either on or off. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 :A TBool that needs to be set to ETrue (On), or EFalse (Off). + + - TAny* a2 : NULL + + @capability PowerMgmt + */ + EKeyboardHalSetKeyboardState, + + + /** + Gets information about the keyboard. + + Requirements of the HAL function handler's 2nd, 3rd and 4th parameters: + + - TInt aFunction : This enum value. + + - TAny* a1 : This is a pointer to a package buffer (TPckgBuf) containing a + TKeyboardInfoV01 structure. The HAL function needs to fill the members of + this structure with the appropriate information. + + - TAny* a2 : NULL. + + @see TKeyboardInfoV01 + @see TPckgBuf + */ + EKeyboardHalKeyboardInfo, + }; + +/** +@publishedPartner +@released + +The set of function-ids that are associated with the EHalGroupVM +HAL group. + +@see EHalGroupVM +*/ +enum TVMHalFunction + { + /** + Evict the contents of the virtual memory cache and reduce it to its minimum size. + + @capability WriteDeviceData + @test + */ + EVMHalFlushCache, + + /** + Change the minimum and maximum RAM sizes used for the virtual memory cache. + These values may be silently restricted to platforn specific limits. + If required, GetCacheSize can be used to verify sizes actually applied to the system. + + If there is not enough memory to set the specified cache size then KErrNoMemory is + returned, however the cache size may still have been modified in an attempt to + service the request. + + This hal function expects two TUint arguments. + The first argument (a1) is the minimum size for cache in bytes. + The second argument (a2) is the maximum size for cache in bytes; using zero for + this value will restore cache sizes to the initial values used after boot. + + The return value from the function is one of: + KErrNone, if successful; + KErrNoMemory if the is not enough memory; + KErrArgument if a1>a2; + otherwise one of the other system wide error codes. + + Example usage: + @code + TUint minRam = 128*1024; // 128k + TUint maxRam = KMaxTUint; // unlimited + TInt r = UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minRam,(TAny*)maxRam)); + if(r!=KErrNone) + anErrorOccured(); + @endcode + + @capability WriteDeviceData + @test + */ + EVMHalSetCacheSize, + + /** + Get the sizes for the virtual memory cache. + The first argument (a1) is a pointer to a #SVMCacheInfo object. + The second argument (a2) must be zero. + @test + */ + EVMHalGetCacheSize, + + /** + Get paging event information. + The first argument (a1) is a pointer to a descriptor whose contents will be filled + with a #SVMEventInfo object. + The second argument (a2) must be zero. + @test + */ + EVMHalGetEventInfo, + + /** + Reset the counters obtained with EVMHalGetEventInfo. + @test + */ + EVMHalResetEventInfo, + + /** + @internalTechnology + @test + */ + EVMHalGetOriginalRomPages, + + /** + @internalTechnology + @test + */ + EVMPageState, + + /** + @internalTechnology + @test + */ + EVMHalGetConcurrencyInfo, + + /** + @internalTechnology + @test + */ + EVMHalResetConcurrencyInfo, + + /** + @internalTechnology + @test + */ + EVMHalGetPagingBenchmark, + + /** + @internalTechnology + @test + */ + EVMHalResetPagingBenchmark, + + }; + + +/** +Paging event information. +@publishedPartner +@test +*/ +struct SVMEventInfo + { + /** + The total number of page faults which have occurred. + */ + TUint64 iPageFaultCount; + + /** + The total number of page faults which resulted in reading a page + from storage media. + */ + TUint64 iPageInReadCount; + + // do not add new members to this struct. + // instead, derive a new SVMEventInfoV2 class from this and add new members to that. + }; + + +/** +VM cache information. +@publishedPartner +@test +*/ +struct SVMCacheInfo + { + /** + The minimum size of virtual memory cache, in bytes. + */ + TUint32 iMinSize; + + /** + The maximum size of virtual memory cache, in bytes. + */ + TUint32 iMaxSize; + + /** + The current size of virtual memory cache, in bytes. + This may be larger than iMaxSize. + */ + TUint32 iCurrentSize; + + /** + The current size of the freeable memory in the virtual memory cache, in bytes. + */ + TUint32 iMaxFreeSize; + + // do not add new members to this struct, this is a compatability break + }; + + +/** +Enumeration defining the bitmask returned from a call to the demnd paging HAL function +EDemandPagingGetPageState. + +@internalComponent +@test +*/ +enum TDemandPagingPageState + { + // Values common to both moving and multiple memory models + EPageStateInRom = 1<<16, + EPageStateInRamCode = 1<<17, + EPageStatePaged = 1<<18, + EPageStatePageTablePresent = 1<<19, + EPageStatePtePresent = 1<<20, + EPageStatePteValid = 1<<21, + // Values specific to multiple memory model + EPageStateCodeChunkPresent = 1<<22, + EPageStatePhysAddrPresent = 1<<23 + }; + + +/** +Information about concurrency in the demand paging system. + +@internalComponent +@test +*/ +struct SPagingConcurrencyInfo + { + /** + The maximum observed number of threads waiting to page in. + */ + TInt iMaxWaitingCount; + + /** + The maximum observed number of threads paging in. + */ + TInt iMaxPagingCount; + }; + + +/** +Enumeration of demand paging benchmarks. + +@internalComponent +@test +*/ +enum TPagingBenchmark + { + EPagingBmReadRomPage, + EPagingBmReadCodePage, + EPagingBmDecompress, + EPagingBmSetCodePageFree, + EPagingBmSetCodePageOld, + EPagingBmReadMedia, + EPagingBmFixupCodePage, + + EMaxPagingBm + }; + + +/** +Benchmark information for a specific operation. All times are in terms of the system's fast timer. + +@internalComponent +@test +*/ +struct SPagingBenchmarkInfo + { + /** + Number of times the operation has been executed. + */ + TInt iCount; + + /** + Total time elapsed while executing the operation. + */ + TInt64 iTotalTime; + + /** + Maximum time recorded for a single execution. + */ + TInt iMaxTime; + + /** + Minimum time recorded for a single execution. + */ + TInt iMinTime; + }; + +/** +Information about concurrency of ROM demand paging requests in the media subsystem. + +@internalComponent +@test +*/ +struct SMediaROMPagingConcurrencyInfo + { + /** + The maximum number of pending page in requests in the main queue any time during this session. + */ + TUint8 iMaxReqsInPending; + + /** + The maximum number of pending page in requests in the deferred queue any time during this session. + */ + TUint8 iMaxReqsInDeferred; + + /** + The maximum number of deferrals of any single page in request during this session. + */ + TUint8 iMaxDeferrals; + + /** + The total number of times the page in DFC run with an empty main queue during this session. + */ + TUint8 iTotalRunDry; + + /** + The total number of page in requests first-time deferred during this session. + */ + TUint iTotalFirstTimeDeferrals; + + /** + The total number of page in requests re-deferred during this session (deferred again after being picked out of deferred queue). + */ + TUint iTotalReDeferrals; + + /** + The total number of page in requests serviced from main queue when completing an asynchronous request. + */ + TUint iTotalSynchServicedFromMainQ; + + /** + The total number of page in requests deferred after being picked out of main queue when completing an asynchronous request. + */ + TUint iTotalSynchDeferredFromMainQ; + + /** + The total number of page in requests issued whilst processing other page in requests. + */ + TUint iTotalConcurrentReqs; + + /** + The total number of page in requests issued with at least one queue not empty. + */ + TUint iTotalReqIssuedNonEmptyQ; + + /** + The total number of times the main queue was emptied when completing an asynchronous request during this session. + */ + TUint iTotalSynchEmptiedMainQ; + + /** + The total number of times the page in DFC was cancelled because the main queue was synchronously emptied. + */ + TUint iTotalDryRunsAvoided; + }; + +/** +Information about concurrency of Code demand paging requests in the media subsystem. + +@internalComponent +@test +*/ +struct SMediaCodePagingConcurrencyInfo + { + /** + The maximum number of pending page in requests in the main queue any time during this session. + */ + TUint8 iMaxReqsInPending; + + /** + The maximum number of pending page in requests in the deferred queue any time during this session. + */ + TUint8 iMaxReqsInDeferred; + + /** + The maximum number of deferrals of any single page in request during this session. + */ + TUint8 iMaxDeferrals; + + /** + Spare field + */ + TUint8 iSpare; + + /** + The total number of page in requests first-time deferred during this session. + */ + TUint iTotalFirstTimeDeferrals; + + /** + The total number of page in requests re-deferred during this session (deferred again after being picked out of deferred queue). + */ + TUint iTotalReDeferrals; + + /** + The total number of page in requests serviced from main queue when completing an asynchronous request. + */ + TUint iTotalSynchServicedFromMainQ; + + /** + The total number of page in requests deferred after being picked out of main queue when completing an asynchronous request. + */ + TUint iTotalSynchDeferredFromMainQ; + + /** + The total number of page in requests issued whilst processing other page in requests. + */ + TUint iTotalConcurrentReqs; + + /** + The total number of page in requests issued with at least one queue not empty. + */ + TUint iTotalReqIssuedNonEmptyQ; + }; + + +/** +@internalComponent + +The set of function-ids that are associated with the EHalGroupRam +HAL group. + +@see EHalGroupRam +@test +*/ +enum TRamHalFunction + { + /** + Retrieve the number of RAM Zones configured for this variant. + + The first argument (a1) is a TUint in which to store the zone count. + The second argument (a2) must be zero. + @test + */ + ERamHalGetZoneCount, + + /** + Retrieve configuration information about a zone. + + The first argument (a1) is a TUint indicating the index of the zone into the zone array. + The second argument (a2) is a pointer to a struct SRamZoneConfig in which to store the data. + @test + */ + ERamHalGetZoneConfig, + + /** + Retrieve utilisation information about a zone. + + The first argument (a1) is a TUint indicating the index of the zone into the zone array. + The second argument (a2) is a pointer to a struct SRamZoneUtilisation in which to store the data. + @test + */ + ERamHalGetZoneUtilisation, + + }; + +/** +Ram zone configuration information. +@internalComponent +@test +*/ +struct SRamZoneConfig + { + /** + ID number of the RAM zone + */ + TUint iZoneId; + + /** + The index of the RAM zone in the RAM zone array + */ + TUint8 iZoneIndex; + + /** + Physical base address of the RAM zone + */ + TUint32 iPhysBase; + + /** + Physical end address of the RAM zone + */ + TUint32 iPhysEnd; + + /** + The total number of pages that are in the RAM zone + */ + TUint32 iPhysPages; + + /** + Preference value for the RAM zone, lower preference RAM zones are used first + */ + TUint8 iPref; + + /** + Zone flags - specify whether the RAM zone should be reserved for contiguous buffer or h/w etc + */ + TUint iFlags; + + }; + +/** +Ram zone utilisation information. +@internalComponent +@test +*/ +struct SRamZoneUtilisation + { + /** + ID number of the RAM zone + */ + TUint iZoneId; + + /** + The index of the RAM zone in the zone array + */ + TUint8 iZoneIndex; + + /** + The total number of pages that are in the RAM zone + */ + TUint32 iPhysPages; + + /** + The number of pages free in the RAM zone + */ + TUint32 iFreePages; + + /** + The number of 'unknown' (reserved at startup or holes in the zone) pages allocated in the RAM zone + */ + TUint32 iAllocUnknown; + + /** + The number of fixed pages allocated in the RAM zone + */ + TUint32 iAllocFixed; + + /** + The number of movable pages allocated in the RAM zone + */ + TUint32 iAllocMovable; + + /** + The number of discardable pages allocated in the RAM zone + */ + TUint32 iAllocDiscardable; + + /** + The number of other pages allocated in the RAM zone + */ + TUint32 iAllocOther; + + }; +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/u32property.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/u32property.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,36 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// \e32\include\u32property.h +// +// + +#ifndef __U32PROPERTY_H__ +#define __U32PROPERTY_H__ + +#include + +/** +@internalComponent +*/ +class TPropertyInfo + { +public: + TUint iAttr; + TUint16 iSize; + RProperty::TType iType; + TSecurityPolicy iReadPolicy; + TSecurityPolicy iWritePolicy; + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/u32std.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/u32std.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,771 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\u32std.h +// +// + +/** + @file + @internalComponent + @released +*/ + +#ifndef __U32STD_H__ +#define __U32STD_H__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef __MARM__ +#define EKA2_ENTRY_POINT_VERSION_IDENTIFIER \ + asm("tst pc, #%a0" : : "i" ((TInt)0) ) +#endif + +struct TUnicodeDataSet; // forward declaration +struct TCollationDataSet; // forward declaration + +/* +The LCharSet structure is used in Unicode builds to supply locale-specific +character attribute and collation data. + +The structure is defined in both builds to avoid having to have a dummy ExecHandler::GetLocaleCharSet function +with a different signature in the 8-bit build. +*/ +struct LCharSet + { + const TUnicodeDataSet* iCharDataSet; // if non-null, character data overriding standard Unicode data + const TCollationDataSet* iCollationDataSet; // if non-null, locale-specific collation data + }; + +extern const LCharSet* GetLocaleCharSet(); + +/** @internalTechnology */ +const TInt KNumLocaleExports = 22; + +// +// The bits in the type table (non-Unicode build only) +// +#ifndef _UNICODE + +/** @internalTechnology */ +const TUint __U=0x01; // Uppercase letter + +/** @internalTechnology */ +const TUint __L=0x02; // Lowercase letter + +/** @internalTechnology */ +const TUint __D=0x04; // Decimal digit + +/** @internalTechnology */ +const TUint __S=0x08; // Space + +/** @internalTechnology */ +const TUint __P=0x10; // Punctuation + +/** @internalTechnology */ +const TUint __C=0x20; // Control character + +/** @internalTechnology */ +const TUint __X=0x40; // Hex digit + +/** @internalTechnology */ +const TUint __B=0x80; // A blank character + +#endif + +// +// Time set mode parameters for setting system time and offset +// +enum TTimeSetMode + { + ETimeSetTime = 1, // set the time to the value given, else leave it unchanged + ETimeSetOffset = 2, // set the offset to the value given, else leave it unchanged + ETimeSetAllowTimeReversal = 4, // allow time to go backwards + ETimeSetNoTimeUpdate = 8, // Don't restart second queue or notify changes - not valid with ESetTime, used early in boot only + ETimeSetLocalTime = 16, // Set time in local time, instead of UTC + ETimeSetSecure = 32, // use when setting the secure hardware clock + }; + +// +enum TMatchType {EMatchNormal,EMatchFolded,EMatchCollated}; + +// +// Constants for descriptor implementation code +// +enum TDesType {EBufC,EPtrC,EPtr,EBuf,EBufCPtr}; +const TUint KMaskDesLength=0xfffffff; +const TInt KShiftDesType=28; + +// +// Constants for iFlags in DProcess and DThread +// +const TUint KThreadFlagProcessCritical = 0x00000001; // thread panic panics process +const TUint KThreadFlagProcessPermanent = 0x00000002; // thread exit of any kind causes process to exit (=main) +const TUint KThreadFlagSystemCritical = 0x00000004; // thread panic reboots entire system +const TUint KThreadFlagSystemPermanent = 0x00000008; // thread exit of any kind reboots entire system +const TUint KThreadFlagOriginal = 0x00000010; +const TUint KThreadFlagLastChance = 0x00000020; +const TUint KThreadFlagRealtime = 0x00000040; // thread will be panicked when using some non-realtime functions +const TUint KThreadFlagRealtimeTest = 0x00000080; // non-realtime functions only warn rather than panic +const TUint KProcessFlagPriorityControl = 0x40000000; +const TUint KProcessFlagJustInTime = 0x80000000; +const TUint KProcessFlagSystemCritical = KThreadFlagSystemCritical; // process panic reboots entire system +const TUint KProcessFlagSystemPermanent = KThreadFlagSystemPermanent; // process exit of any kind reboots entire system +// +const TUint KThreadHandle=0x40000000; +// +struct SPtrC8 {TInt length;const TUint8 *ptr;}; +struct SBufC8 {TInt length;TUint8 buf[1];}; +struct SPtr8 {TInt length;TInt maxLength;TUint8 *ptr;}; +struct SBuf8 {TInt length;TInt maxLength;TUint8 buf[1];}; +struct SBufCPtr8 {TInt length;TInt maxLength;SBufC8 *ptr;}; + +struct SPtrC16 {TInt length;const TUint16 *ptr;}; +struct SBufC16 {TInt length;TUint16 buf[1];}; +struct SPtr16 {TInt length;TInt maxLength;TUint16 *ptr;}; +struct SBuf16 {TInt length;TInt maxLength;TUint16 buf[1];}; +struct SBufCPtr16 {TInt length;TInt maxLength;SBufC16 *ptr;}; + +// +// Flags used for IPC copy functions +// +const TInt KChunkShiftBy0=0; +const TInt KChunkShiftBy1=KMinTInt; +const TInt KIpcDirRead=0; +const TInt KIpcDirWrite=0x10000000; + +class TChunkCreate + { +public: + enum TChunkCreateAtt + { + ENormal=0x00, + EDoubleEnded=0x01, + EDisconnected=0x02, + EMappingMask=0x0f, + ELocal=0x00, + EGlobal=0x10, + EData=0x00, + ECode=0x20, + + EChunkCreateAttMask = EMappingMask | EGlobal | ECode, + }; +public: + TUint iAtt; + TBool iForceFixed; + TInt iInitialBottom; + TInt iInitialTop; + TInt iMaxSize; + TUint8 iClearByte; + }; + +enum TChunkRestrictions + { + // Keep this in sync with definitions in RChunk + EChunkPreventAdjust = 0x01, // Disallow Adjust, Commit, Allocate and Decommit + }; + +class TChannelDoCreate + { +public: + TVersion iVer; + const TDesC *iName; + const TDesC *iPhysicalDevice; + const TDesC8 *iInfo; + }; + +class TCreateSession + { +public: + TVersion iVer; + TInt iMessageSlots; + }; + +enum TObjectType + { + EThread=0, + EProcess, + EChunk, + ELibrary, + ESemaphore, + EMutex, + ETimer, + EServer, + ESession, + ELogicalDevice, + EPhysicalDevice, + ELogicalChannel, + EChangeNotifier, + EUndertaker, + EMsgQueue, + EPropertyRef, + ECondVar, + EShPool, + EShBuf, + ENumObjectTypes, // number of DObject-derived types + EObjectTypeAny=-1, + + EIpcMessageD=0x20, // lookup IPC message handle, allow disconnect + EIpcMessage=0x21, // lookup IPC message handle, don't allow disconnect + EIpcClient=0x22, // lookup IPC message client, don't allow disconnect + }; + +class TObjectOpenInfo + { +public: + TObjectType iObjType; + TBool isReadOnly; + }; + +class TChannelCreateInfo + { +public: + TVersion iVersion; + TInt iUnit; + const TDesC* iPhysicalDevice; + const TDesC8* iInfo; + }; + +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +class TChannelCreateInfo8 + { +public: + TVersion iVersion; + TInt iUnit; + const TDesC8* iPhysicalDevice; + const TDesC8* iInfo; + }; +#else +typedef TChannelCreateInfo TChannelCreateInfo8; +#endif + +const TInt KMaxThreadCreateInfo = 256; +struct SThreadCreateInfo + { + TAny* iHandle; + TInt iType; + TThreadFunction iFunction; + TAny* iPtr; + TAny* iSupervisorStack; + TInt iSupervisorStackSize; + TAny* iUserStack; + TInt iUserStackSize; + TInt iInitialThreadPriority; + TPtrC iName; + TInt iTotalSize; // Size including any extras (must be a multiple of 8 bytes) + }; + +enum EThreadCreationFlags + { + ETraceHeapAllocs = 1, + EMonitorHeapMemory = 2, + }; + +struct SStdEpocThreadCreateInfo : public SThreadCreateInfo + { + RAllocator* iAllocator; + TInt iHeapInitialSize; + TInt iHeapMaxSize; + TUint iFlags; + }; + +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +struct SThreadCreateInfo8 + { + TAny* iHandle; + TInt iType; + TThreadFunction iFunction; + TAny* iPtr; + TAny* iSupervisorStack; + TInt iSupervisorStackSize; + TAny* iUserStack; + TInt iUserStackSize; + TInt iInitialThreadPriority; + TPtrC8 iName; + TInt iTotalSize; // size including any extras + }; + +struct SStdEpocThreadCreateInfo8 : public SThreadCreateInfo8 + { + RAllocator* iAllocator; + TInt iHeapInitialSize; + TInt iHeapMaxSize; + TInt iPadding; // Make structure size a multiple of 8 bytes + }; +#else +typedef SThreadCreateInfo SThreadCreateInfo8; +typedef SStdEpocThreadCreateInfo SStdEpocThreadCreateInfo8; +#endif + +struct SIpcCopyInfo + { + TUint8* iLocalPtr; + TInt iLocalLen; + TInt iFlags; + }; + +enum TChunkAdjust + { + EChunkAdjust=0, + EChunkAdjustDoubleEnded=1, + EChunkCommit=2, + EChunkDecommit=3, + EChunkAllocate=4, + EChunkUnlock=5, + EChunkLock=6 + }; + +enum TMemModelAttributes + { + EMemModelTypeMask=0xf, // bottom 4 bits give type of memory model + EMemModelTypeDirect=0, // direct memory model on hardware + EMemModelTypeMoving=1, // moving memory model on hardware + EMemModelTypeMultiple=2, // multiple memory model on hardware + EMemModelTypeEmul=3, // emulation using single host process + EMemModelTypeFlexible=4, // flexible memory model on hardware + + EMemModelAttrRomPaging=0x10, // Demand paging of XIP ROM + EMemModelAttrCodePaging=0x20, // Demand paging of RAM loaded code + EMemModelAttrDataPaging=0x40, // Demand paging of all RAM + EMemModelAttrPagingMask=0xf0, // Mask for demand paging attributes + + EMemModelAttrNonExProt=(TInt)0x80000000,// accesses to nonexistent addresses are trapped + EMemModelAttrKernProt=0x40000000, // accesses to kernel memory from user mode are trapped + EMemModelAttrWriteProt=0x20000000, // addresses can be marked as read-only; writes to these are trapped + EMemModelAttrVA=0x10000000, // system supports virtual addresses + EMemModelAttrProcessProt=0x08000000, // accesses to other processes' memory are trapped + EMemModelAttrSameVA=0x04000000, // different processes map the same virtual address to different physical addresses + EMemModelAttrSupportFixed=0x02000000, // 'fixed' processes are supported + EMemModelAttrSvKernProt=0x01000000, // unexpected accesses to kernel memory within an executive call are trapped + EMemModelAttrIPCKernProt=0x00800000, // accesses to kernel memory via IPC are trapped + EMemModelAttrIPCFullProt=0x00400000, // accesses via IPC have same protection as user mode + EMemModelAttrRamCodeProt=0x00200000, // RAM-loaded code is only visible to processes which have loaded it + }; + +/** @test */ +enum TKernelHeapDebugFunction {EDbgMarkStart,EDbgMarkCheck,EDbgMarkEnd,EDbgSetAllocFail,EDbgSetBurstAllocFail,EDbgCheckFailure}; + +/** @test */ +class TKernelHeapMarkCheckInfo + { +public: + TBool iCountAll; + const TDesC8* iFileName; + TInt iLineNum; + }; +// +class TTrapHandler; +class CActiveScheduler; +class TLocale; + +// +// +// +// Handler below is used by test prints to trucate rather than panic the caller. +// +#if defined(_UNICODE) && !defined(__KERNEL_MODE__) +NONSHARABLE_CLASS(TestOverflowTruncate) : public TDes16Overflow + { +public: + virtual void Overflow(TDes16 &aDes); + }; +#else +NONSHARABLE_CLASS(TestOverflowTruncate) : public TDes8Overflow + { +public: + virtual void Overflow(TDes8 &aDes); + }; +#endif +// + +/******************************************** + * Thread local storage entry + ********************************************/ +struct STls + { + TInt iHandle; + TInt iDllUid; + TAny* iPtr; + }; + +const TInt KDllUid_Default = 0; // for ROM DLLs and direct calls to UserSvr::DllTls +const TInt KDllUid_Special = -1; // used on emulator to instruct the kernel to get the DLL UID from the module handle + +/******************************************** + * Entry point call values + ********************************************/ +const TInt KModuleEntryReasonProcessInit =0; // Process start +const TInt KModuleEntryReasonThreadInit =1; // Start new thread +const TInt KModuleEntryReasonProcessAttach =2; // Process attach (init static data) +const TInt KModuleEntryReasonProcessDetach =3; // Process detach (destroy static data) +const TInt KModuleEntryReasonException =4; // Handle exception +const TInt KModuleEntryReasonVariantInit0 =-3; // Call variant static constructors + +/** @publishedPartner + @released +*/ +const TInt KModuleEntryReasonExtensionInit0 =-2; // Extension early initialisation check + +/** @publishedPartner + @released +*/ +const TInt KModuleEntryReasonExtensionInit1 =-1; // Extension initialisation + +/** + Flags returned by Exec::KernelConfigFlags() +*/ +enum TKernelConfigFlags + { + EKernelConfigIpcV1Available = 1<<0, + EKernelConfigPlatSecEnforcement = 1<<1, + EKernelConfigPlatSecDiagnostics = 1<<2, + EKernelConfigPlatSecProcessIsolation = 1<<3, + EKernelConfigPlatSecEnforceSysBin = 1<<4, + + EKernelConfigPagingPolicyMask = 3<<5, + EKernelConfigPagingPolicyNoPaging = 0<<5, + EKernelConfigPagingPolicyAlwaysPage = 1<<5, + EKernelConfigPagingPolicyDefaultUnpaged = 2<<5, + EKernelConfigPagingPolicyDefaultPaged = 3<<5, + + EKernelConfigPlatSecLocked = 1<<7, // Primarily used by __PLATSEC_UNLOCKED__ (q.v.) test code + + EKernelConfigCrazyScheduling = 1<<8, // Enables thread priority/timeslice craziness + + EKernelConfigDisableAPs = 1u<<30, + + EKernelConfigTest = 1u<<31, // Only used by test code for __PLATSEC_UNLOCKED__ + }; + +/** + If __PLATSEC_UNLOCKED__ is not defined, these flags must always + be considered to be set. See KernelConfigFlags() in kern_priv.h. + + @see KernelConfigFlags() + + @internalTechnology +*/ +#ifdef __PLATSEC_UNLOCKED__ +#define __PLATSEC_FORCED_FLAGS__ 0 +#else +#define __PLATSEC_FORCED_FLAGS__ (EKernelConfigPlatSecEnforcement|EKernelConfigPlatSecProcessIsolation|EKernelConfigPlatSecEnforceSysBin) +#endif + +/** +@internalTechnology +*/ +enum TGlobalUserData + { + ELocaleDefaultCharSet, + ELocalePreferredCharSet, + EMaxGlobalUserData + }; + +typedef void (*TGlobalDestructorFunc)(void); + +// This must not conflict with any possible valid TLS keys +const TInt KGlobalDestructorTlsKey = -1; + +GLREF_C void ExitCurrentThread(TExitType, TInt, const TDesC8*); + +#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__ +/** +@internalTechnology +*/ +class TPlatSecDiagnostic + { +public: + enum TType + { + ELoaderCapabilityViolation1, + ELoaderCapabilityViolation2, + EThreadCapabilityCheckFail, + EProcessCapabilityCheckFail, + EKernelSecureIdCheckFail, + EKernelObjectPolicyCheckFail, + EHandleCapabilityCheckFail, + ECreatorCapabilityCheckFail, + EMessageCapabilityCheckFail, + EKernelProcessIsolationFail, + EKernelProcessIsolationIPCFail, + ECreatorPolicyCheckFail, + }; +public: + inline TPlatSecDiagnostic(); + inline TPlatSecDiagnostic(TType aType); + inline TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2, const SCapabilitySet& aCaps); + inline TPlatSecDiagnostic(TType aType, TInt aInt1, const SSecurityInfo& aCaps); + inline TPlatSecDiagnostic(TType aType, TInt aInt, const TDesC8& aString, const SCapabilitySet& aCaps); + inline TPlatSecDiagnostic(TType aType, const TDesC8& aString1, const TDesC8& aString2, const SCapabilitySet& aCaps); + inline TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2); + inline TPlatSecDiagnostic(TType aType, TInt aInt1); + inline const TDesC8* String1(); + inline const TDesC8* String2(); +public: + TType iType; + TInt iArg1; + TInt iArg2; + const char* iContextText; + TInt iContextTextLength; + SSecurityInfo iSecurityInfo; + }; + +inline TPlatSecDiagnostic::TPlatSecDiagnostic() + {} + +inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType) + : iType(aType) + {} + +inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType,TInt aInt1) + : iType(aType), iArg1(aInt1) + {} + +inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2, const SCapabilitySet& aCaps) + : iType(aType), iArg1(aInt1), iArg2(aInt2), iContextText(0) + { + iSecurityInfo.iSecureId = 0; + iSecurityInfo.iVendorId = 0; + iSecurityInfo.iCaps = aCaps; + }; +inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt1, const SSecurityInfo& aInfo) + : iType(aType), iArg1(aInt1), iArg2(ECapability_None), iContextText(0), iSecurityInfo(aInfo) + { + }; + +inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt, const TDesC8& aString, const SCapabilitySet& aCaps) + : iType(aType), iArg1(aInt), iArg2((TInt)&aString), iContextText(0) + { + iSecurityInfo.iSecureId = 0; + iSecurityInfo.iVendorId = 0; + iSecurityInfo.iCaps = aCaps; + }; + +inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, const TDesC8& aString1, const TDesC8& aString2, const SCapabilitySet& aCaps) + : iType(aType), iArg1((TInt)&aString1), iArg2((TInt)&aString2), iContextText(0) + { + iSecurityInfo.iSecureId = 0; + iSecurityInfo.iVendorId = 0; + iSecurityInfo.iCaps = aCaps; + }; + +inline TPlatSecDiagnostic::TPlatSecDiagnostic(TType aType, TInt aInt1, TInt aInt2) + : iType(aType), iArg1(aInt1), iArg2(aInt2) + { + iSecurityInfo.iSecureId = 0; + iSecurityInfo.iVendorId = 0; + iSecurityInfo.iCaps[0] = 0; + iSecurityInfo.iCaps[1] = 0; + }; + +inline const TDesC8* TPlatSecDiagnostic::String1() + { return (const TDesC8*)iArg1; } + +inline const TDesC8* TPlatSecDiagnostic::String2() + { return (const TDesC8*)iArg2; } + +inline TInt PlatSec::LoaderCapabilityViolation(const TDesC8& aImporterName, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::ELoaderCapabilityViolation2,aImporterName,aFileName,aMissingCaps); + return EmitDiagnostic(d, NULL); + } + +#ifdef __KERNEL_MODE__ + +inline TInt PlatSec::CapabilityCheckFail(const DProcess* aViolatingProcess, TCapability aCapability, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EProcessCapabilityCheckFail,(TInt)aViolatingProcess,(TInt)aCapability); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::CapabilityCheckFail(const DThread* aViolatingThread, TCapability aCapability, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EThreadCapabilityCheckFail,(TInt)aViolatingThread,(TInt)aCapability); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::SecureIdCheckFail(const DProcess* aViolatingProcess, TSecureId aSid, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelSecureIdCheckFail,(TInt)aViolatingProcess,(TInt)aSid); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::PolicyCheckFail(const DProcess* aProcess, const SSecurityInfo& aMissingSecurityInfo, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelObjectPolicyCheckFail,(TInt)aProcess,(const SSecurityInfo&)aMissingSecurityInfo); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::PolicyCheckFail(const DThread* aThread, const SSecurityInfo& aMissingSecurityInfo, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelObjectPolicyCheckFail,(TInt)aThread,(const SSecurityInfo&)aMissingSecurityInfo); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::ProcessIsolationFail(const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelProcessIsolationFail); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::ProcessIsolationIPCFail(RMessageK* aMessage, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EKernelProcessIsolationIPCFail,(TInt)aMessage); + return EmitDiagnostic(d,aContextText); + } + +#else // !__KERNEL_MODE__ + +inline TInt PlatSec::LoaderCapabilityViolation(RProcess aLoadingProcess, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::ELoaderCapabilityViolation1,aLoadingProcess.Handle(),aFileName,aMissingCaps); + return EmitDiagnostic(d, NULL); + } + +inline TInt PlatSec::CreatorCapabilityCheckFail(TCapability aCapability, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::ECreatorCapabilityCheckFail,(TInt)0,aCapability); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::ECreatorCapabilityCheckFail,(TInt)0,ECapability_None,(const SCapabilitySet&)aMissingCaps); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::CapabilityCheckFail(TInt aHandle, TCapability aCapability, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EHandleCapabilityCheckFail,aHandle,aCapability); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EHandleCapabilityCheckFail,aHandle,ECapability_None,(const SCapabilitySet&)aMissingCaps); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissingSecurityInfo, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EHandleCapabilityCheckFail,aHandle,(const SSecurityInfo&)aMissingSecurityInfo); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EMessageCapabilityCheckFail,(TInt)aMessage.Handle(),aCapability); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EMessageCapabilityCheckFail,(TInt)aMessage.Handle(),ECapability_None,(const SCapabilitySet&)aMissingCaps); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissing, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::EMessageCapabilityCheckFail,(TInt)aMessage.Handle(),(const SSecurityInfo&)aMissing); + return EmitDiagnostic(d,aContextText); + } + +inline TInt PlatSec::CreatorPolicyCheckFail(const SSecurityInfo& aMissing, const char* aContextText) + { + TPlatSecDiagnostic d(TPlatSecDiagnostic::ECreatorPolicyCheckFail,(TInt)0,(const SSecurityInfo&)aMissing); + return EmitDiagnostic(d,aContextText); + } + +#endif //__KERNEL_MODE__ +#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__ + +const TInt KTlsArrayGranularity=2; + +#ifdef __CPU_HAS_CP15_THREAD_ID_REG + +#ifndef __TOOLS2__ +#define __USERSIDE_THREAD_DATA__ +#endif // __TOOLS2__ + +class TLocalThreadData + { +public: + void Close(); +#ifndef __KERNEL_MODE__ + TAny* DllTls(TInt aHandle, TInt aDllUid); + TInt DllSetTls(TInt aHandle, TInt aDllUid, TAny* aPtr); + void DllFreeTls(TInt aHandle); +#endif +public: +#ifndef __TOOLS2__ + RAllocator* iHeap; ///< The thread's current heap +#endif // __TOOLS2__ + CActiveScheduler* iScheduler; ///< The thread's current active scheduler + TTrapHandler* iTrapHandler; ///< The thread's current trap handler +private: + RAllocator* iTlsHeap; ///< The heap that the DLL TLS data is stored on + RArray iTls; ///< DLL TLS data + }; + +const TInt KLocalThreadDataSize = _ALIGN_UP(sizeof(TLocalThreadData), 8); + +#endif + +#ifdef __WINS__ + +enum TWin32RuntimeReason + { + // Same values as passed to DllMain + EWin32RuntimeProcessAttach = 1, + EWin32RuntimeThreadAttach = 2, + EWin32RuntimeThreadDetach = 3, + EWin32RuntimeProcessDetach = 4, + }; + +typedef TBool (*TWin32RuntimeHook)(TWin32RuntimeReason); + +#endif + +struct SAtomicOpInfo64 + { + TAny* iA; + TAny* iQ; + TUint64 i1; + TUint64 i2; + TUint64 i3; + }; + +struct SAtomicOpInfo32 + { + TAny* iA; + union + { + TAny* iQ; + TUint32 i0; + }; + TUint32 i1; + TUint32 i2; + }; + +#endif //__U32STD_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/unicode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/unicode.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,168 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\include\unicode.h +// The TUnicode class contains a Unicode value. It is provided for convenience in implementing the +// character attribute retrieval functions. It also contains: +// structures used to store and search the tables of character information: +// when modifying these, please remember that they form part of tables that must be initialised as aggregates, +// so they cannot have constructors, non-public members, base classes or virtual functions. I have used 'struct' +// rather than class to make that clear. +// default constructor that sets the stored Unicode value to 0xFFFF - an invalid character +// constructors and conversion functions for converting between integers and TUnicode objects +// functions to retrieve the categories and attributes +// The categories are explained in 'unicode_fields.txt', which is a key to the fields of the data file +// 'unidata2.txt'; these files are supplied on the CD-ROM that comes with the book 'The Unicode Standard, +// Version 2.0'. +// Because the category constants must be available to users they are defined not here but in the TChar +// class in e32std.h. +// +// + +/** + @file + @internalTechnology +*/ + + +#ifndef __UNICODE_H__ +#define __UNICODE_H__ 1 + +#include + +/* +A structure to contain the raw data about a Unicode character: +it must not have a constructor because an array of these in unitable.cpp is initialised as an aggregate. +*/ +struct TUnicodeData + { + // bit values for iFlags + enum + { + EHasLowerCase = 1, // adding the case offset gives the lower case form + EHasUpperCase = 2, // subtracting the case offset gives the upper case form + EHasTitleCase = 4, // a title case form exists that is distinct from the upper case form + EMirrored = 8, // this character is replaced by a mirror-image in right-to-left text + ENumericFlags = 0x70, // one of these flags is set if this number has a numeric value + ENonNumeric = 0x00, // this character has no numeric value + ESmallNumeric = 0x10, // numeric in the range 0..255 (see iDigitOffset) + EFiveHundred = 0x20, // numeric with the value 500 + EOneThousand = 0x30, // numeric with the value 1000 + EFiveThousand = 0x40, // numeric with the value 5000 + ETenThousand = 0x50, // numeric with the value 10000 + EHundredThousand = 0x60, // numeric with the value 100000 + EFraction = 0x70 // numeric with a fractional value + }; + + TUint8 iCategory; // general category + TUint8 iBdCategory; // bidirectional category + TUint8 iCombiningClass; // combining class + TInt8 iDigitOffset; // if this character has a small numeric value, the difference between the low + // 8 bits of the character code and the numeric value + TInt16 iCaseOffset; // offset to other case; subtract to get upper case, add to get lower + // case (this makes it more likely that characters + // differing only by case have the same data, making the table smaller) + TUint8 iFlags; // flags: does this character have a lower case form, etc. + }; + +/* +A structure for a range of Unicode characters with the same raw data; must not have a +constructor because an array of these in unitable.cpp is initialised as an aggregate. +*/ +struct TUnicodeDataRange + { + TUint16 iRangeStart; // Unicode value of the start of the range of characters + TInt16 iIndex; // index into an array of character information structures (-1 means data no available) + }; + +/* +A structure to hold a set of overriding character data +*/ +struct TUnicodeDataSet + { + const TUnicodeData *iData; // array of character data structures + const TUnicodeDataRange *iRange; // array of ranges referring to elements of iData + TInt iRanges; // number of elements in the array of ranges + }; + +// A structure to hold the standard character data +struct TStandardUnicodeDataSet + { + const TUint16* iIndex1; // first trie index: 4096 elements indexed by high 12 bits of Unicode value + const TUint16* iIndex2; // second trie index, indexed by values in iIndex1 + const TUnicodeData *iData; // array of character data structures, indexed by values in iIndex2, offset + // by low 4 bits of Unicode value + }; + +/* +A class to hold a Unicode character and provide functions for characterisation (e.g., is this character lowercase?) +composition (e.g., create a character from a base character and an accent), and decomposition +(e.g., remove the accent from this character if there is one). +*/ +class TUnicode + { + public: + + // Constructors + TUnicode() { iCode = 0xFFFF; } + TUnicode(TUint c) : iCode(c) {} + operator TUint() const { return iCode; } + + // Attribute retrieval (functions used by the ExecHandler class, etc., in ekern.dll take IMPORT_C) + void GetInfo(TChar::TCharInfo& aInfo,const TUnicodeDataSet *aOverridingDataSet) const; + IMPORT_C TChar::TCategory GetCategory(const TUnicodeDataSet *aOverridingDataSet) const; + TChar::TBdCategory GetBdCategory(const TUnicodeDataSet *aOverridingDataSet) const; + TInt GetCombiningClass(const TUnicodeDataSet *aOverridingDataSet) const; + IMPORT_C TUint GetLowerCase(const TUnicodeDataSet *aOverridingDataSet) const; + IMPORT_C TUint GetUpperCase(const TUnicodeDataSet *aOverridingDataSet) const; + TUint GetTitleCase(const TUnicodeDataSet *aOverridingDataSet) const; + TBool IsMirrored(const TUnicodeDataSet *aOverridingDataSet) const; + TInt GetNumericValue(const TUnicodeDataSet *aOverridingDataSet) const; + TChar::TCjkWidth GetCjkWidth() const; + IMPORT_C TUint Fold(TInt aFlags,const TUnicodeDataSet *aOverridingDataSet) const; + + // Utilities + static TInt Compare(const TUint16 *aString1,TInt aLength1,const TUint16 *aString2,TInt aLength2); + + private: + const TUnicodeData& GetData(const TUnicodeDataSet *aOverridingDataSet) const; + const TUnicodeData *GetDataFromDataSet(const TUnicodeDataSet& aDataSet) const; + TUint GetLowerCase(const TUnicodeData& aData) const; + TUint GetUpperCase(const TUnicodeData& aData) const; + TUint GetTitleCase(const TUnicodeData& aData) const; + TInt GetNumericValue(const TUnicodeData& aData) const; + + TUint iCode; // not TUint16 because values in the extended range from 0x10000 to 0xFFFFF may be used. + + public: +#ifndef __KERNEL_MODE__ + static const TUint16 FoldTable[256]; // fold table (strip accents, fold case) for the range 0..255 + static const TUint16 CjkWidthFoldTable[256];// width fold table (convert from width variants) for range 0xFF00..0xFFFF +#else + static const TUint16* FoldTable; + static const TUint16* CjkWidthFoldTable; +#endif + }; + +// Declarations for tables held in unitable.cpp and used by unicode.cpp. +#ifndef __KERNEL_MODE__ +extern const TStandardUnicodeDataSet TheStandardUnicodeDataSet; +extern const TUint16 TheUnicodeCompositionBuffer[]; +extern const TInt TheUnicodeCompositions; +#else +extern const TStandardUnicodeDataSet* pStandardUnicodeDataSet; +extern const TUint16* TheUnicodeCompositionBuffer; +extern TInt TheUnicodeCompositions; +#endif + +#endif // __UNICODE_H__ diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/videodriver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/videodriver.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,78 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef __VIDEODRIVER_H__ +#define __VIDEODRIVER_H__ + +#include + +struct SRectOpInfo + { + TInt iX; + TInt iY; + TInt iWidth; + TInt iHeight; + TInt iSrcX; + TInt iSrcY; + TUint32 iColor; + }; + + +/** +Encapsulates information about the screen display mode. + +An object of this type is passed, via a TPckgBuf, to the HAL handler +that deals with the HAL group,function-id pair: +- EHalGroupDisplay, EDisplayHalCurrentModeInfo; +- EHalGroupDisplay, EDisplayHalSpecifiedModeInfo; + +@see EDisplayHalCurrentModeInfo +@see EDisplayHalSpecifiedModeInfo +@see TDisplayHalFunction +@see EHalGroupDisplay +@see TPckgBuf +*/ +class TVideoInfoV01 + { +public: + TSize iSizeInPixels; /**< The visible width/height of the display in pixels. */ + TSize iSizeInTwips; /**< The visible width/height of the display in twips. */ + TBool iIsMono; /**< True if display is monochrome; false otherwise. */ + TBool iIsPalettized; /**< True if display is palettized (in current display mode); false otherwise. */ + TInt iBitsPerPixel; /**< The number of bits in one pixel. */ + TInt iVideoAddress; /**< The virtual address of screen memory. */ + TInt iOffsetToFirstPixel; /**< Number of bytes from iVideoAddress for the first displayed pixel. */ + TInt iOffsetBetweenLines; /**< Number of bytes between start of one line and start of next. */ + TBool iIsPixelOrderRGB; /**< The orientation of sub pixels on the screen; True if RBG, False if BGR. */ + TBool iIsPixelOrderLandscape; /**< True if display pixels are landscape. */ + TInt iDisplayMode; /**< The current display mode. */ + }; + + +/** +Package buffer for a TVideoInfoV01 object. + +@see TVideoInfoV01 +*/ +typedef TPckgBuf TVideoInfoV01Buf; + + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32/include/x86hlp_gcc.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32/include/x86hlp_gcc.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,455 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32\common\x86\x86hlp_gcc.inl +// If there are no exports then GCC 3.4.x does not generate a .reloc +// section, without which rombuild can't relocate the .code section +// to its ROM address. Your ROM then goes boom early in the boot sequence. +// This unused export forces the PE to be generated with a .reloc section. +// +// + +EXPORT_C void __ignore_this_export() + { + } + +static void DivisionByZero() + { + asm("int 0"); + } + +extern "C" { + +void __NAKED__ _alloca() +{ + // GCC passes the param in eax and expects no return value + asm("pop ecx"); + asm("sub esp, eax"); + asm("push ecx"); + asm("ret"); +} + +void __NAKED__ _allmul() +// +// Multiply two 64 bit integers returning a 64 bit result +// On entry: +// [esp+4], [esp+8] = arg 1 +// [esp+12], [esp+16] = arg 1 +// Return result in edx:eax +// Remove arguments from stack +// + { + asm("mov eax, [esp+4]"); // eax = low1 + asm("mul dword ptr [esp+16]"); // edx:eax = low1*high2 + asm("mov ecx, eax"); // keep low 32 bits of product + asm("mov eax, [esp+8]"); // eax = high1 + asm("mul dword ptr [esp+12]"); // edx:eax = high1*low2 + asm("add ecx, eax"); // accumulate low 32 bits of product + asm("mov eax, [esp+4]"); // eax = low1 + asm("mul dword ptr [esp+12]"); // edx:eax = low1*low2 + asm("add edx, ecx"); // add cross terms to high 32 bits + asm("ret"); + } + +void __NAKED__ udiv64_divby0() + { + asm("int 0"); // division by zero exception + asm("ret"); + } + +__NAKED__ /*LOCAL_C*/ void UDiv64() + { + // unsigned divide edx:eax by edi:esi + // quotient in ebx:eax, remainder in edi:edx + // ecx, ebp, esi also modified + asm("test edi, edi"); + asm("jnz short UDiv64a"); // branch if divisor >= 2^32 + asm("test esi, esi"); + asm("jz %a0": : "i"(&DivisionByZero)); // if divisor=0, branch to error routine + asm("mov ebx, eax"); // ebx=dividend low + asm("mov eax, edx"); // eax=dividend high + asm("xor edx, edx"); // edx=0 + asm("div esi"); // quotient high now in eax + asm("xchg eax, ebx"); // quotient high in ebx, dividend low in eax + asm("div esi"); // quotient now in ebx:eax, remainder in edi:edx + asm("ret"); + asm("UDiv64e:"); + asm("xor eax, eax"); // set result to 0xFFFFFFFF + asm("dec eax"); + asm("jmp short UDiv64f"); + asm("UDiv64a:"); + asm("js short UDiv64b"); // skip if divisor msb set + asm("bsr ecx, edi"); // ecx=bit number of divisor msb - 32 + asm("inc cl"); + asm("push edi"); // save divisor high + asm("push esi"); // save divisor low + asm("shrd esi, edi, cl"); // shift divisor right so that msb is bit 31 + asm("mov ebx, edx"); // dividend into ebx:ebp + asm("mov ebp, eax"); + asm("shrd eax, edx, cl"); // shift dividend right same number of bits + asm("shr edx, cl"); + asm("cmp edx, esi"); // check if approx quotient will be 2^32 + asm("jae short UDiv64e"); // if so, true result must be 0xFFFFFFFF + asm("div esi"); // approximate quotient now in eax + asm("UDiv64f:"); + asm("mov ecx, eax"); // into ecx + asm("mul edi"); // multiply approx. quotient by divisor high + asm("mov esi, eax"); // ls dword into esi, ms into edi + asm("mov edi, edx"); + asm("mov eax, ecx"); // approx. quotient into eax + asm("mul dword ptr [esp]"); // multiply approx. quotient by divisor low + asm("add edx, esi"); // edi:edx:eax now equals approx. quotient * divisor + asm("adc edi, 0"); + asm("xor esi, esi"); + asm("sub ebp, eax"); // subtract dividend - approx. quotient *divisor + asm("sbb ebx, edx"); + asm("sbb esi, edi"); + asm("jnc short UDiv64c"); // if no borrow, result OK + asm("dec ecx"); // else result is one too big + asm("add ebp, [esp]"); // and add divisor to get correct remainder + asm("adc ebx, [esp+4]"); + asm("UDiv64c:"); + asm("mov eax, ecx"); // result into ebx:eax, remainder into edi:edx + asm("mov edi, ebx"); + asm("mov edx, ebp"); + asm("xor ebx, ebx"); + asm("add esp, 8"); // remove temporary values from stack + asm("ret"); + asm("UDiv64b:"); + asm("mov ebx, 1"); + asm("sub eax, esi"); // subtract divisor from dividend + asm("sbb edx, edi"); + asm("jnc short UDiv64d"); // if no borrow, result=1, remainder in edx:eax + asm("add eax, esi"); // else add back + asm("adc edx, edi"); + asm("dec ebx"); // and decrement quotient + asm("UDiv64d:"); + asm("mov edi, edx"); // remainder into edi:edx + asm("mov edx, eax"); + asm("mov eax, ebx"); // result in ebx:eax + asm("xor ebx, ebx"); + asm("ret"); + } + +__NAKED__ void _aulldvrm() +// +// Divide two 64 bit unsigned integers, returning a 64 bit result +// and a 64 bit remainder +// +// On entry: +// [esp+4], [esp+8] = dividend +// [esp+12], [esp+16] = divisor +// +// Return (dividend / divisor) in edx:eax +// Return (dividend % divisor) in ebx:ecx +// +// Remove arguments from stack +// + { + asm("push ebp"); + asm("push edi"); + asm("push esi"); + asm("mov eax, [esp+16]"); + asm("mov edx, [esp+20]"); + asm("mov esi, [esp+24]"); + asm("mov edi, [esp+28]"); + asm("call %a0": : "i"(&UDiv64)); + asm("mov ecx, edx"); + asm("mov edx, ebx"); + asm("mov ebx, edi"); + asm("pop esi"); + asm("pop edi"); + asm("pop ebp"); + asm("ret"); + } + +__NAKED__ void _alldvrm() +// +// Divide two 64 bit signed integers, returning a 64 bit result +// and a 64 bit remainder +// +// On entry: +// [esp+4], [esp+8] = dividend +// [esp+12], [esp+16] = divisor +// +// Return (dividend / divisor) in edx:eax +// Return (dividend % divisor) in ebx:ecx +// +// Remove arguments from stack +// + { + asm("push ebp"); + asm("push edi"); + asm("push esi"); + asm("mov eax, [esp+16]"); + asm("mov edx, [esp+20]"); + asm("mov esi, [esp+24]"); + asm("mov edi, [esp+28]"); + asm("test edx, edx"); + asm("jns alldrvm_dividend_nonnegative"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + asm("alldrvm_dividend_nonnegative:"); + asm("test edi, edi"); + asm("jns alldrvm_divisor_nonnegative"); + asm("neg edi"); + asm("neg esi"); + asm("sbb edi, 0"); + asm("alldrvm_divisor_nonnegative:"); + asm("call %a0": : "i"(&UDiv64)); + asm("mov ebp, [esp+20]"); + asm("mov ecx, edx"); + asm("xor ebp, [esp+28]"); + asm("mov edx, ebx"); + asm("mov ebx, edi"); + asm("jns alldrvm_quotient_nonnegative"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + asm("alldrvm_quotient_nonnegative:"); + asm("cmp dword ptr [esp+20], 0"); + asm("jns alldrvm_rem_nonnegative"); + asm("neg ebx"); + asm("neg ecx"); + asm("sbb ebx, 0"); + asm("alldrvm_rem_nonnegative:"); + asm("pop esi"); + asm("pop edi"); + asm("pop ebp"); + asm("ret"); + } + +//__NAKED__ void _aulldiv() +__NAKED__ void __udivdi3 () +// +// Divide two 64 bit unsigned integers returning a 64 bit result +// On entry: +// [esp+4], [esp+8] = dividend +// [esp+12], [esp+16] = divisor +// Return result in edx:eax +// Remove arguments from stack +// + { + asm("push ebp"); + asm("push edi"); + asm("push esi"); + asm("push ebx"); + asm("mov eax, [esp+20]"); + asm("mov edx, [esp+24]"); + asm("mov esi, [esp+28]"); + asm("mov edi, [esp+32]"); + asm("call %a0": : "i"(&UDiv64)); + asm("mov edx, ebx"); + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("pop ebp"); + asm("ret"); + } + + +__NAKED__ void __divdi3() + +// +// Divide two 64 bit signed integers returning a 64 bit result +// On entry: +// [esp+4], [esp+8] = dividend +// [esp+12], [esp+16] = divisor +// Return result in edx:eax +// Remove arguments from stack +// + { + asm("push ebp"); + asm("push edi"); + asm("push esi"); + asm("push ebx"); + asm("mov eax, [esp+20]"); + asm("mov edx, [esp+24]"); + asm("mov esi, [esp+28]"); + asm("mov edi, [esp+32]"); + asm("test edx, edx"); + asm("jns divdi_dividend_nonnegative"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + asm("divdi_dividend_nonnegative:"); + asm("test edi, edi"); + asm("jns divdi_divisor_nonnegative"); + asm("neg edi"); + asm("neg esi"); + asm("sbb edi, 0"); + asm("divdi_divisor_nonnegative:"); + asm("call %a0": : "i"(&UDiv64)); + asm("mov ecx, [esp+24]"); + asm("mov edx, ebx"); + asm("xor ecx, [esp+32]"); + asm("jns divdi_quotient_nonnegative"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + asm("divdi_quotient_nonnegative:"); + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("pop ebp"); + asm("ret"); + } + +__NAKED__ void __umoddi3() +// +// Divide two 64 bit unsigned integers and return 64 bit remainder +// On entry: +// [esp+4], [esp+8] = dividend +// [esp+12], [esp+16] = divisor +// Return result in edx:eax +// Remove arguments from stack +// + { + asm("push ebp"); + asm("push edi"); + asm("push esi"); + asm("push ebx"); + asm("mov eax, [esp+20]"); + asm("mov edx, [esp+24]"); + asm("mov esi, [esp+28]"); + asm("mov edi, [esp+32]"); + asm("call %a0": : "i"(&UDiv64)); + asm("mov eax, edx"); + asm("mov edx, edi"); + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("pop ebp"); + asm("ret"); + } + +__NAKED__ void __moddi3() +// +// Divide two 64 bit signed integers and return 64 bit remainder +// On entry: +// [esp+4], [esp+8] = dividend +// [esp+12], [esp+16] = divisor +// Return result in edx:eax +// Remove arguments from stack +// + { + asm("push ebp"); + asm("push edi"); + asm("push esi"); + asm("push ebx"); + asm("mov eax, [esp+20]"); + asm("mov edx, [esp+24]"); + asm("mov esi, [esp+28]"); + asm("mov edi, [esp+32]"); + asm("test edx, edx"); + asm("jns dividend_nonnegative"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + asm("dividend_nonnegative:"); + asm("test edi, edi"); + asm("jns divisor_nonnegative"); + asm("neg edi"); + asm("neg esi"); + asm("sbb edi, 0"); + asm("divisor_nonnegative:"); + asm("call %a0": : "i"(&UDiv64)); + asm("mov eax, edx"); + asm("mov edx, edi"); + asm("cmp dword ptr [esp+24], 0"); + asm("jns rem_nonnegative"); + asm("neg edx"); + asm("neg eax"); + asm("sbb edx, 0"); + asm("rem_nonnegative:"); + asm("pop ebx"); + asm("pop esi"); + asm("pop edi"); + asm("pop ebp"); + asm("ret"); + } + +__NAKED__ void _allshr() +// +// Arithmetic shift right EDX:EAX by CL +// + { + asm("cmp cl, 64"); + asm("jae asr_count_ge_64"); + asm("cmp cl, 32"); + asm("jae asr_count_ge_32"); + asm("shrd eax, edx, cl"); + asm("sar edx, cl"); + asm("ret"); + asm("asr_count_ge_32:"); + asm("sub cl, 32"); + asm("mov eax, edx"); + asm("cdq"); + asm("sar eax, cl"); + asm("ret"); + asm("asr_count_ge_64:"); + asm("sar edx, 32"); + asm("mov eax, edx"); + asm("ret"); + } + +__NAKED__ void _allshl() +// +// shift left EDX:EAX by CL +// + { + asm("cmp cl, 64"); + asm("jae lsl_count_ge_64"); + asm("cmp cl, 32"); + asm("jae lsl_count_ge_32"); + asm("shld edx, eax, cl"); + asm("shl eax, cl"); + asm("ret"); + asm("lsl_count_ge_32:"); + asm("sub cl, 32"); + asm("mov edx, eax"); + asm("xor eax, eax"); + asm("shl edx, cl"); + asm("ret"); + asm("lsl_count_ge_64:"); + asm("xor edx, edx"); + asm("xor eax, eax"); + asm("ret"); + } + +__NAKED__ void _aullshr() +// +// Logical shift right EDX:EAX by CL +// + { + asm("cmp cl, 64"); + asm("jae lsr_count_ge_64"); + asm("cmp cl, 32"); + asm("jae lsr_count_ge_32"); + asm("shrd eax, edx, cl"); + asm("shr edx, cl"); + asm("ret"); + asm("lsr_count_ge_32:"); + asm("sub cl, 32"); + asm("mov eax, edx"); + asm("xor edx, edx"); + asm("shr eax, cl"); + asm("ret"); + asm("lsr_count_ge_64:"); + asm("xor edx, edx"); + asm("xor eax, eax"); + asm("ret"); + } + +} diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/T_FoldPerf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/T_FoldPerf.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,712 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +static RTest TheTest(_L("T_FoldPerf")); + +#define ARRAY_SIZE(ar) (sizeof(ar) / (sizeof(ar[0]))) + +const TText16 KText16[] = {'1', 'f', 'A', 0x01D5, 'k', '5', 'g', 'U', 'W', 'q', 'a', + 0x095E, 0x01D5, 'a', 'B', 'c', 'd', 'E', 'F', 0}; +//0x095E - DEVANAGARI LETTER FA +//decomposed to: 0x092B 0x093C +//0x01D5 - LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +//decomposed to: 0x0075 0x0308 0x0304 + +_LIT16(KPlainText, "abcdefghijklmnopqrst"); + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0108 +@SYMTestCaseDesc FindF - performance test +@SYMTestPriority High +@SYMTestActions FindF - performance test +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +static void FindF_PerformanceTest() + { + TheTest.Next(_L("FindF test")); + + TBufC16 text(KText16); + + TBufC16<3> searchStr1(_L16("gUw")); + + const TText16 searchText2[] = {0x01D5, 'A', 'b', 0}; + TBufC16 searchStr2(searchText2); + + const TText16 searchText3[] = {0x0075, 0x0308, 0x0304, 'A', 'b', 0}; + TBufC16 searchStr3(searchText3); + + const TText16 searchText4[] = {0x095E, 'd', 'A', 'b', 0}; + TBufC16 searchStr4(searchText4); + + const TText16 searchText5[] = {0x095E, 0x0055, 0x0308, 0x0304, 'A', 'b', 'C', 0}; + TBufC16 searchStr5(searchText5); + + TBufC16<4> searchStr6(_L16("CDEF")); + + TUint timeStart = User::TickCount(); + for(TInt i=0;i<10000;++i) + { + TInt res = text.FindF(searchStr1); + TheTest(res == 6);//searchStr1 starts at position 6 + + res = text.FindF(searchStr2); + TheTest(res == 12); + + res = text.FindF(searchStr3); + TheTest(res == 12); + + res = text.FindF(searchStr4); + TheTest(res == KErrNotFound); + + res = text.FindF(searchStr5); + TheTest(res == 11); + + res = text.FindF(searchStr6); + TheTest(res == 15); + } + TUint timeEnd = User::TickCount(); + TheTest.Printf(_L("Time = %d ticks\n"), timeEnd - timeStart); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0109 +@SYMTestCaseDesc MatchF - performance test +@SYMTestPriority High +@SYMTestActions MatchF - performance test +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +static void MatchF_PerformanceTest() + { + TheTest.Next(_L("MatchF test")); + + TBufC16 text(KText16); + + TBufC16<11> searchStr1(_L16("*fa??5*W*a*")); + + const TText16 searchText2[] = {'*', 0x01D5, 'A', '?', 'C', '*', 0}; + TBufC16 searchStr2(searchText2); + + const TText16 searchText3[] = {'*', 0x0075, 0x0308, 0x0304, '*', 'e', 'F', 0}; + TBufC16 searchStr3(searchText3); + + const TText16 searchText4[] = {'1', '*', 'A', 'b', '*', 0}; + TBufC16 searchStr4(searchText4); + + TBufC16<11> searchStr5(_L16("*fa?z5*W*a*")); + + TBufC16<5> searchStr6(_L16("a?v?T")); + + TUint timeStart = User::TickCount(); + for(TInt i=0;i<10000;++i) + { + TInt res = text.MatchF(searchStr1); + TheTest(res == 1); + + res = text.MatchF(searchStr2); + TheTest(res == 12); + + res = text.MatchF(searchStr3); + TheTest(res == 3); + + res = text.MatchF(searchStr4); + TheTest(res == 0); + + res = text.MatchF(searchStr5); + TheTest(res == KErrNotFound); + + res = text.MatchF(searchStr6); + TheTest(res == KErrNotFound); + } + TUint timeEnd = User::TickCount(); + TheTest.Printf(_L("Time = %d ticks\n"), timeEnd - timeStart); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0110 +@SYMTestCaseDesc CompareF - performance test +@SYMTestPriority High +@SYMTestActions CompareF - performance test +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +static void CompareF_PerformanceTest() + { + TheTest.Next(_L("CompareF test")); + + TBufC16 text(KText16); + + const TText16 text1[] = {'1', 'F', 'A', 0x01D5, 'k', '5', 'G', 'U', 'W', 'Q', 'A', + 0x095E, 0x01D5, 'a', 'B', 'C', 'd', 'E', 'F', 0}; + TBufC16 str1(text1); + + TBufC16<19> str2(_L16("1234567890123456789")); + + TBufC16<19> str3(_L16("1fA4G6789r1d34z6789")); + + TUint timeStart = User::TickCount(); + TInt i; + for(i=0;i<10000;++i) + { + TInt res = text.CompareF(str1); + TheTest(res == 0); + + res = text.CompareF(str2); + TheTest(res != 0); + + res = text.CompareF(str3); + TheTest(res != 0); + } + TUint timeEnd = User::TickCount(); + TheTest.Printf(_L("1. Time = %d ticks\n"), timeEnd - timeStart); + + TBufC16<20> str4(_L16("abc3456hijklmnopqrst")); + timeStart = User::TickCount(); + for(i=0;i<10000;++i) + { + TInt res = str4.CompareF(KPlainText); + TheTest(res != 0); + } + timeEnd = User::TickCount(); + TheTest.Printf(_L("2. Time = %d ticks\n"), timeEnd - timeStart); + + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0114 +@SYMTestCaseDesc FindF(), CompareF(), MatchF() on plain (no combining characters) text +@SYMTestPriority High +@SYMTestActions Performance test +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +static void PlainTextPerformanceTest() + { + TheTest.Next(_L("Plain text - performance test")); + + TInt res; + TInt i; + + TBufC16<20> str1(_L16("abcdefghijklmnopqrst")); + TBufC16<20> str2(_L16("abcDefghIjklmNOpqrsT")); + TBufC16<20> str3(_L16("abcDefghIjKlmNOp2rsT")); + + TUint timeStart = User::TickCount(); + for(i=0;i<10000;++i) + { + res = KPlainText().CompareF(str1); + TheTest(res == 0); + res = KPlainText().CompareF(str2); + TheTest(res == 0); + res = KPlainText().CompareF(str3); + TheTest(res != 0); + } + TUint timeEnd = User::TickCount(); + TheTest.Printf(_L("CompareF() Time = %d ticks\n"), timeEnd - timeStart); + + TBufC16<20> str4(_L16("gHiJk")); + TBufC16<20> str5(_L16("Opqr")); + TBufC16<20> str6(_L16("2rsT")); + + timeStart = User::TickCount(); + for(i=0;i<10000;++i) + { + res = KPlainText().FindF(str4); + TheTest(res == 6); + res = KPlainText().FindF(str5); + TheTest(res == 14); + res = KPlainText().FindF(str6); + TheTest(res == KErrNotFound); + } + timeEnd = User::TickCount(); + TheTest.Printf(_L("FindF() Time = %d ticks\n"), timeEnd - timeStart); + + TBufC16<20> str7(_L16("*gHiJk*op??sT")); + TBufC16<20> str8(_L16("aBC*rst")); + TBufC16<20> str9(_L16("ab?D*2rsT")); + + timeStart = User::TickCount(); + for(i=0;i<10000;++i) + { + res = KPlainText().MatchF(str7); + TheTest(res == 6); + res = KPlainText().MatchF(str8); + TheTest(res == 0); + res = KPlainText().MatchF(str9); + TheTest(res == KErrNotFound); + } + timeEnd = User::TickCount(); + TheTest.Printf(_L("MatchF() Time = %d ticks\n"), timeEnd - timeStart); + + TBufC16<21> str10(_L16("abcdefghijklmnopqrst")); + TBufC16<20> str11(_L16("*xyz*")); + TBufC16<20> str12(_L16("xyz")); + + timeStart = User::TickCount(); + for(i=0;i<10000;++i) + { + res = str10.FindF(str12); + TheTest(res == KErrNotFound); + } + timeEnd = User::TickCount(); + TheTest.Printf(_L("Nonmatching string. FindF() Time = %d ticks\n"), timeEnd - timeStart); + + timeStart = User::TickCount(); + for(i=0;i<10000;++i) + { + res = str10.MatchF(str11); + TheTest(res == KErrNotFound); + res = str10.MatchF(str12); + TheTest(res == KErrNotFound); + } + timeEnd = User::TickCount(); + TheTest.Printf(_L("Nonmatching string. MatchF() Time = %d ticks\n"), timeEnd - timeStart); + } + +static void RunComparison_PerformanceTest(TInt aNumberOfTimes, TDesC& aOriginalText, TDesC& aToCompareText, TBool aCase, TInt aValue = 0) + { + TUint timeStart; + TUint timeEnd; + TInt res = 0; + TInt i; + + // CompareF() case... + timeStart = User::TickCount(); + + for(i=0; i oriAsciiLargeText(_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno")); + TBufC16<5> oriAsciiSmallText(_L("ABCDE")); + + TBufC16<50> matchAsciiLargeText(_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno")); + TBufC16<5> matchAsciiSmallText(_L("ABCDE")); + + TBufC16<50> nonMatchAsciiLargeTextLast(_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnX")); + TBufC16<50> nonMatchAsciiLargeTextFirst(_L("XBCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno")); + + TBufC16<5> nonMatchAsciiSmallTextLast(_L("ABCDX")); + TBufC16<5> nonMatchAsciiSmallTextFirst(_L("XBCDE")); + + // (8-bit) Ascii Set of variables + + TBufC8<50> oriAsciiLargeText8(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno")); + TBufC8<5> oriAsciiSmallText8(_L8("ABCDE")); + + TBufC8<50> matchAsciiLargeText8(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno")); + TBufC8<5> matchAsciiSmallText8(_L8("ABCDE")); + + TBufC8<50> nonMatchAsciiLargeTextLast8(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnX")); + TBufC8<50> nonMatchAsciiLargeTextFirst8(_L8("XBCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmno")); + + TBufC8<5> nonMatchAsciiSmallTextLast8(_L8("ABCDX")); + TBufC8<5> nonMatchAsciiSmallTextFirst8(_L8("XBCDE")); + + // (16-bit) Unicode Set of variables + + TBufC16 oriUnicodeLargeText(largeUnicodeText16); + TBufC16 oriUnicodeSmallText(smallUnicodeText16); + + TBufC16 matchUnicodeLargeText(largeUnicodeText16); + TBufC16 matchUnicodeSmallText(smallUnicodeText16); + + TBufC16 nonMatchUnicodeLargeTextLast(largeErrUnicodeTextLast16); + TBufC16 nonMatchUnicodeLargeTextFirst(largeErrUnicodeTextFirst16); + + TBufC16 nonMatchUnicodeSmallTextLast(smallErrUnicodeTextLast16); + TBufC16 nonMatchUnicodeSmallTextFirst(smallErrUnicodeTextFirst16); + + // (16-bit) Unicode/Ascii Set of variables + + TBufC16 oriMixedLargeText(largeMixedText16); + TBufC16 oriMixedSmallText(smallMixedText16); + + TBufC16 matchMixedLargeText(largeMixedText16); + TBufC16 matchMixedSmallText(smallMixedText16); + + TBufC16 nonMatchMixedLargeTextLast(largeErrMixedTextLast16); + TBufC16 nonMatchMixedLargeTextFirst(largeErrMixedTextFirst16); + + TBufC16 nonMatchMixedSmallTextLast(smallErrMixedTextLast16); + TBufC16 nonMatchMixedSmallTextFirst(smallErrMixedTextFirst16); + + // Run performance tests... + + TheTest.Printf(_L("\n====== (8-bit) Ascii Performance tests ======")); + + // Matching (8-bit) Ascii + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Ascii Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, matchAsciiLargeText8, ETrue); + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Ascii Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, matchAsciiSmallText8, ETrue); + + // Non Matching (8-bit) Ascii + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiLargeTextLast8, EFalse, -9); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiLargeTextFirst8, EFalse, -23); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiSmallTextLast8, EFalse, -19); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiSmallTextFirst8, EFalse, -23); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiSmallTextLast8, EFalse, -19); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, nonMatchAsciiSmallTextFirst8, EFalse, -23); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiLargeTextLast8, EFalse, -45); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, nonMatchAsciiLargeTextFirst8, EFalse, -23); + + // Mismatching length (8-bit) Ascii + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Length Mismatch / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText8, oriAsciiLargeText8, EFalse, -45); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Length Mismatch / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText8, oriAsciiSmallText8, EFalse, 45); + + TheTest.Printf(_L("\n====== (16-bit) Ascii Performance tests ======")); + + // Matching (16-bit) Ascii + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Ascii Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, matchAsciiLargeText, ETrue); + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Ascii Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, matchAsciiSmallText, ETrue); + + // Non Matching (16-bit) Ascii + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiLargeTextLast, EFalse, -9); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiLargeTextFirst, EFalse, -23); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiSmallTextLast, EFalse, -19); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiSmallTextFirst, EFalse, -23); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Last Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiSmallTextLast, EFalse, -19); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / First Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, nonMatchAsciiSmallTextFirst, EFalse, -23); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Last Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiLargeTextLast, EFalse, -1); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / First Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, nonMatchAsciiLargeTextFirst, EFalse, -23); + + // Mismatching length (16-bit) Ascii + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Ascii Text / Length Mismatch / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiSmallText, oriAsciiLargeText, EFalse, -1); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Ascii Text / Length Mismatch / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriAsciiLargeText, oriAsciiSmallText, EFalse, 1); + + TheTest.Printf(_L("\n====== (16-bit) Unicode Performance tests ======")); + + // Matching (16-bit) Unicode + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Unicode Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, matchUnicodeLargeText, ETrue); + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Unicode Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, matchUnicodeSmallText, ETrue); + + // Non Matching (16-bit) Unicode + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / Last Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeLargeTextLast, EFalse, -3); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / First Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeLargeTextFirst, EFalse, -3); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / Last Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeSmallTextLast, EFalse, -3); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / First Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeSmallTextFirst, EFalse, -3); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / Last Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeSmallTextLast, EFalse, -3); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / First Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, nonMatchUnicodeSmallTextFirst, EFalse, -3); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / Last Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeLargeTextLast, EFalse, -1); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / First Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, nonMatchUnicodeLargeTextFirst, EFalse, -3); + + // Mismatching length (16-bit) Unicode + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Unicode Text / Length Mismatch / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeSmallText, oriUnicodeLargeText, EFalse, -1); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Unicode Text / Length Mismatch / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriUnicodeLargeText, oriUnicodeSmallText, EFalse, 1); + + TheTest.Printf(_L("\n====== (16-bit) Mixed Performance tests ======")); + + // Matching (16-bit) Mixed + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Large Mixed Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, matchMixedLargeText, ETrue); + + TheTest.Printf(_L("\nComparing Performance Times For: \nMatching Small Mixed Text\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, matchMixedSmallText, ETrue); + + // Non Matching (16-bit) Mixed + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / Last Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedLargeTextLast, EFalse, -655); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / First Char Diff / Large Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedLargeTextFirst, EFalse, -675); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / Last Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedSmallTextLast, EFalse, -655); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / First Char Diff / Small Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedSmallTextFirst, EFalse, -675); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / Last Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedSmallTextLast, EFalse, -655); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / First Char Diff / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, nonMatchMixedSmallTextFirst, EFalse, -675); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / Last Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedLargeTextLast, EFalse, -1); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / First Char Diff / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, nonMatchMixedLargeTextFirst, EFalse, -675); + + // Mismatching length (16-bit) Mixed + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Small Mixed Text / Length Mismatch / Small Vs Large\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedSmallText, oriMixedLargeText, EFalse, -1); + + TheTest.Printf(_L("\nComparing Performance Times For: \nNON Matching Large Mixed Text / Length Mismatch / Large Vs Small\n")); + RunComparison_PerformanceTest(numberOfTimes, oriMixedLargeText, oriMixedSmallText, EFalse, 1); + } + + + +TInt E32Main() + { + TheTest.Title(); + + TheTest.Start(_L("Folding - performance tests")); + + ::FindF_PerformanceTest(); + ::MatchF_PerformanceTest(); + ::CompareF_PerformanceTest(); + ::PlainTextPerformanceTest(); + ::CompareVsCompareF_PerformanceTest(); + + TheTest.End(); + TheTest.Close(); + + return KErrNone; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/UnicodeData.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/UnicodeData.txt Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,10621 @@ +0000;;Cc;0;BN;;;;;N;NULL;;;; +0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;;Cc;0;BN;;;;;N;BELL;;;; +0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;;Cc;0;S;;;;;N;HORIZONTAL TABULATION;;;; +000A;;Cc;0;B;;;;;N;LINE FEED;;;; +000B;;Cc;0;S;;;;;N;VERTICAL TABULATION;;;; +000C;;Cc;0;WS;;;;;N;FORM FEED;;;; +000D;;Cc;0;B;;;;;N;CARRIAGE RETURN;;;; +000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;;Cc;0;BN;;;;;N;CANCEL;;;; +0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;;Cc;0;B;;;;;N;FILE SEPARATOR;;;; +001D;;Cc;0;B;;;;;N;GROUP SEPARATOR;;;; +001E;;Cc;0;B;;;;;N;RECORD SEPARATOR;;;; +001F;;Cc;0;S;;;;;N;UNIT SEPARATOR;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;;Cc;0;BN;;;;;N;DELETE;;;; +0080;;Cc;0;BN;;;;;N;;;;; +0081;;Cc;0;BN;;;;;N;;;;; +0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;;Cc;0;BN;;;;;N;;;;; +0085;;Cc;0;B;;;;;N;NEXT LINE;;;; +0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;;Cc;0;BN;;;;;N;PARTIAL LINE DOWN;;;; +008C;;Cc;0;BN;;;;;N;PARTIAL LINE UP;;;; +008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;;Cc;0;BN;;;;;N;;;;; +009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;So;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Ll;0;L; 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN; 0032;2;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN; 0033;3;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN; 0031;1;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L; 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;; +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;; +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;;; +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6; +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9; +01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC; +01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3; +01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;; +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;; +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;; +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;; +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;; +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;; +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;; +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;; +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;; +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;; +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;; +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;; +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;; +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;; +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Sk;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Sk;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Sk;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;; +02C8;MODIFIER LETTER VERTICAL LINE;Sk;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Sk;0;ON;;;;;N;;Mandarin Chinese first tone;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Sk;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Sk;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;; +02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;Tonos;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;; +037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;; +0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;; +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03A3;;03A3 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;; +05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Me;0;NSM;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;tsek tar;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;; +0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;; +10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; +10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; +10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; +10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; +10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; +10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; +10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; +10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; +10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; +10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; +10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; +10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; +10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; +10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; +10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; +10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; +10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; +10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; +10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; +10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; +10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; +10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; +10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; +10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; +10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; +10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; +10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; +10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; +10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; +10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; +10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; +10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; +10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; +10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; +10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; +10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; +10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; +10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; +10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; +13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; +13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; +13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; +13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; +13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; +13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; +13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; +13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; +13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; +13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; +13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; +13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; +13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; +13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; +13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; +13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; +13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; +13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; +13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; +13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; +13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; +13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; +13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; +13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; +13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; +13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; +13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; +13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; +13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; +13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; +13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; +13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; +13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; +13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; +13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; +13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; +13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; +13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; +13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; +13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; +13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; +13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; +13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; +13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; +13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; +13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; +13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; +13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; +13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; +13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; +13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; +13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; +13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; +13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; +13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; +13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; +13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; +13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; +13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; +13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; +13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; +13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; +13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; +13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; +13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; +13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; +13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; +13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; +13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; +13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; +13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; +13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; +13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; +13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; +13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; +13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; +13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; +13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; +13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; +13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; +13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; +13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; +13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; +13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;No;0;L;;;;17;N;;golden number 17;;; +16EF;RUNIC TVIMADUR SYMBOL;No;0;L;;;;18;N;;golden number 18;;; +16F0;RUNIC BELGTHOR SYMBOL;No;0;L;;;;19;N;;golden number 19;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mc;0;L;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mc;0;L;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Po;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Po;0;L;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Cf;0;BN;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Cf;0;BN;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Cf;0;BN;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;WS; 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN; 0030;0;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2074;SUPERSCRIPT FOUR;No;0;EN; 0034;4;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN; 0035;5;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN; 0036;6;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;7;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;8;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN; 0039;9;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ET; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN; 0030;0;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN; 0031;1;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN; 0032;2;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN; 0033;3;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN; 0034;4;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN; 0035;5;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN; 0036;6;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN; 0037;7;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN; 0038;8;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN; 0039;9;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ET; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;; +2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;EN; 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;EN; 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;EN; 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;EN; 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;EN; 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;EN; 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;EN; 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;EN; 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;EN; 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;EN; 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;EN; 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;EN; 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;EN; 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;EN; 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;EN; 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;EN; 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;EN; 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;EN; 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;EN; 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;EN; 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;EN; 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;EN; 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;EN; 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;EN; 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;EN; 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;EN; 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;EN; 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;EN; 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;EN; 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;EN; 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN; 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;EN; 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN; 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN; 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN; 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN; 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN; 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN; 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN; 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;EN; 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;EN; 0030;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;Kaeriten;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;Kaeriten;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;Kaeriten;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;Kaeriten;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;Kaeriten;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;Kaeriten;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;Kaeriten;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;Kaeriten;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;Kaeriten;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;Kaeriten;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;Kaeriten;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; +3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; +3400;;Lo;0;L;;;;;N;;;;; +4DB5;;Lo;0;L;;;;;N;;;;; +4E00;;Lo;0;L;;;;;N;;;;; +9FA5;;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +AC00;;Lo;0;L;;;;;N;;;;; +D7A3;;Lo;0;L;;;;;N;;;;; +D800;;Cs;0;L;;;;;N;;;;; +DB7F;;Cs;0;L;;;;;N;;;;; +DB80;;Cs;0;L;;;;;N;;;;; +DBFF;;Cs;0;L;;;;;N;;;;; +DC00;;Cs;0;L;;;;;N;;;;; +DFFF;;Cs;0;L;;;;;N;;;;; +E000;;Co;0;L;;;;;N;;;;; +F8FF;;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;96FB;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ET; 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;N;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;N;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET; 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;ES; 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;N;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;N;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON; 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +F0000;;Co;0;L;;;;;N;;;;; +FFFFD;;Co;0;L;;;;;N;;;;; +100000;;Co;0;L;;;;;N;;;;; +10FFFD;;Co;0;L;;;;;N;;;;; diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_bflat.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_bflat.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,173 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_bflat.cpp +// Overview: +// Test all aspects of the CBufFlat class. +// API Information: +// CBufFlat. +// Details: +// - Test all the operations of the class and see if methods are implemented -- +// including NewL, Reset, Size, Set Reserve, InsertL, Delete, Ptr, Read, Write and Compress. +// - Test CBufFlat constructor is as expected. +// - Insert data into the flat storage dynamic buffer and verify that InsertL method +// is as expected. +// - Delete all data in buffer using Reset() method and check size is zero. +// - Test Ptr, Free, Size, Backptr and SetReserveL methods work as expected. +// - Insert data into the buffer, delete some data from the beginning, middle, end and +// check for data is as expected. +// - Verify the data in the buffer before and after Compress and Read methods is as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +LOCAL_D RTest test(_L("T_BFLAT")); + +class TestCBufFlat + { +public: + void Test1(); // Tests all operations of the class. + void Test2(); // Test public methods of class. + }; + +class TestCBufSeg + { +public: + void Test1(); // Test all operations of the class. + }; + +GLDEF_C void TestCBufFlat::Test1() +// +// Tests all operations of the class. +// + { + TText* tp; + test.Start(_L("Test all operations of CBufFlat")); + CBufFlat* bf=(CBufFlat*)CBufFlat::NewL(100); + bf->Reset(); + bf->Size(); + bf->SetReserveL(50); // Panics if 50 < iSize + bf->InsertL(0,TPtrC8((TText8*)"Hello World")); + bf->Delete(0,5); + tp=(TText*)bf->Ptr(3).Ptr(); + tp=(TText*)bf->BackPtr(3).Ptr(); + bf->Read(2,tp,2); + bf->Write(2,tp,2); + bf->Compress(); + test.End(); + } + +GLDEF_C void TestCBufFlat::Test2() +// +// Test all the methods of the class +// + { + + test.Start(_L("Test constructor of CBufFlat")); + CBufFlat* bf1=(CBufFlat*)CBufFlat::NewL(20); + test(bf1->Size()==0); + test(bf1->Ptr(0).Length()==0); + + test.Next(_L("Insert, Reset, Ptr, Free, Size")); + TBuf8<0x40> tb1=(TText8*)"Hello World"; + TBuf8<0x40> tb2=(TText8*)"This string is greater than twenty characters long"; + TBuf8<0x40> tb3; + bf1->InsertL(0,tb1); // Insert - no expand + test(bf1->Ptr(0)==tb1); + test(bf1->Size()==tb1.Size()); + test(bf1->Ptr(0).Length()==tb1.Size()); + bf1->InsertL(bf1->Size(),tb2); // Insert and expand + test(bf1->Size()==(tb1.Size()+tb2.Size())); + test(bf1->Ptr(0).Left(tb1.Length())==tb1); + test(bf1->Ptr(tb1.Length())==tb2); + bf1->InsertL(bf1->Size(),tb3); // Insert a null string + test(bf1->Size()==(tb1.Size()+tb2.Size())); + test(bf1->Ptr(0).Left(tb1.Length())==tb1); + test(bf1->Ptr(tb1.Length())==tb2); + bf1->Reset(); // Reset + test(bf1->Size()==0); + bf1->InsertL(0,tb1); // Insert into a string + bf1->InsertL(5,tb1); + bf1->Delete(16,bf1->Size()-16); + test(bf1->Ptr(0)==TPtrC8((TText8*)"HelloHello World")); +// + test.Next(_L("SetReserve")); + bf1->SetReserveL(50); // SetReserve > 0 + test(bf1->Size()==16); + test(bf1->Ptr(0).Length()==16); + bf1->Reset(); + bf1->SetReserveL(0); // SetReserve = 0 + test(bf1->Size()==0); + test(bf1->Ptr(0).Length()==0); +// + test.Next(_L("Delete, BackPtr")); + bf1->InsertL(0,tb1); + bf1->Delete(6,1); // Delete Middle + test(bf1->Ptr(0)==TPtrC8((TText8*)"Hello orld")); + test(bf1->Size()==10); + bf1->Delete(9,1); // Delete End + test(bf1->Ptr(bf1->Size()).Length()==0); + bf1->InsertL(bf1->Size(),tb3); + test(bf1->Ptr(0)==TPtrC8((TText8*)"Hello orl")); + bf1->Delete(0,2); // Delete Start / BackPtr + test(bf1->BackPtr(5)==TPtrC8((TText8*)"llo o")); + test(bf1->Size()==7); +// + test.Next(_L("Write, Compress")); + bf1->Write(1,tb1,5); + test(bf1->Ptr(0)==TPtrC8((TText8*)"lHellol")); + test(bf1->Size()==7); + bf1->Compress(); // Compress + test(bf1->Size()==7); + + test.Next(_L("Read")); + bf1->Read(4,tb1,bf1->Size()-4); + test(tb1.Size()==3); + test(tb1==TPtrC8((TText8*)"lol")); +// + test.End(); + } + +LOCAL_C void test_CBufFlat() +// +// Test the BufFlat class. +// + { + TestCBufFlat b; + + test.Start(_L("All operations")); + b.Test1(); + test.Next(_L("All methods")); + b.Test2(); +// + test.End(); + } + +GLDEF_C TInt E32Main() +// +// Test the ADT Varray types. +// + { + test.Title(); + test.Start(_L("class CBufFlat")); + test_CBufFlat(); + test.End(); + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_bseg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_bseg.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,468 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_bseg.cpp +// Overview: +// Test all aspects of the CBufSeg class. +// API Information: +// CBufSeg. +// Details: +// - Create a segmented dynamic buffer of specified size. +// - Test all operations of CBufSeg class and see if methods are implemented -- +// including NewL, Reset, Size, InsertL, Delete, Ptr, BackPtr, Read, Write and Compress. +// - Test CBufSeg constructor is as expected. +// - Insert data into the segmented dynamic buffer and verify that InsertL method +// is as expected using the Read and Write methods. +// - Delete all data using Reset method and check size is zero. +// - Test InsertL, Read, Write and Length methods. +// - Test Ptr, Free, Size, Backptr and SetReserveL methods are as expected. +// - Check self consistancy of segment lengths, and check contents of segmented +// buffer using Ptr() and BackPtr(). +// - Verify the size of the of the test buffers are correct. +// - Insert data into the buffer, delete some data from the beginning, middle and end +// then check for results as expected. +// - Verify the data in the buffer before and after Compress method is as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +class TBufSegLink : public TDblQueLink + { +public: + inline TBufSegLink() : iLen(0) {} + inline TBufSegLink* Next() const {return((TBufSegLink*)iNext);} + inline TBufSegLink* Prev() const {return((TBufSegLink*)iPrev);} +public: + TInt iLen; + }; + +class TestCBufSeg + { +public: + TestCBufSeg() : iDummy(0) {}; + void Test1(); // Test all operations of the class. + void Test2(); // Inherited Methods + void Test3(); // Insert + void Test4(); // Delete + void Test5(); // Compress + void Test6L(); // borderlines +protected: + TInt iDummy; + static const TInt SegLen; + void CheckSeg(const CBufSeg*); + void CheckContents1(CBufSeg* const); + void CheckContents2(CBufSeg* const); + }; + +const TInt TestCBufSeg::SegLen=64; + +LOCAL_D RTest test(_L("T_BSEG")); + +class CSpy : public CBufBase + { +public: + ~CSpy(); +protected: + CSpy(TInt anExpandSize); +public: + TDblQue iQue; + TBufSegLink* iSeg; + TInt iBase; + TInt iOffset; + }; + +GLDEF_C void TestCBufSeg::CheckSeg(const CBufSeg* bf) +// +// Check Self consistancy of segment lengths +// + { + + if (bf->Size()==0) + return; + TInt sum=0; + TBufSegLink* p1=((CSpy*)bf)->iQue.First(); + while (!((CSpy*)bf)->iQue.IsHead(p1)) + { + test(p1->iLen<=bf->Size()); + sum+=p1->iLen; + p1=p1->Next(); + } + test(sum==bf->Size()); + sum=0; + p1=((CSpy*)bf)->iQue.Last(); + while (!((CSpy*)bf)->iQue.IsHead(p1)) + { + test(p1->iLen<=bf->Size()); + sum+=p1->iLen; + p1=p1->Prev(); + } + test(sum==bf->Size()); + } + +GLDEF_C void TestCBufSeg::CheckContents1(CBufSeg* const bf) +// +// Check contents of segmented buffer using Ptr() +// + { + + TInt sum=0; + TInt nbytes=bf->Size(); + for (TInt pos=0;posPtr(pos); + TInt len=p.Length(); + TInt8* pT=(TInt8*)p.Ptr(); + for (TInt i=0;iSize(); + for(TInt pos=nbytes;pos>0;) + { + TPtr8 p=bf->BackPtr(pos); + TInt len=p.Length(); + TInt8* pT=(TInt8*)p.Ptr(); + for (TInt i=0;iReset(); + bf->Size(); + bf->InsertL(0,TPtrC8((TText8*)"Hello World")); + bf->Delete(0,5); + TText8* tp=(TText8*)bf->Ptr(3).Ptr(); + tp=(TText8*)bf->BackPtr(3).Ptr(); + TBuf8<0x20> txt; + bf->Read(2,txt,2); + bf->Write(2,txt,2); + bf->Compress(); + delete bf; + test.End(); + } + +GLDEF_C void TestCBufSeg::Test2() +// +// Test all inherited methods +// + { + + TBuf8<0x40> tb1=(TText8*)"Hello World"; + TBuf8<0x40> tb2=(TText8*)"String number two"; + TBuf8<0x40> tb3; + test.Start(_L("Free,Size,Read,Write,Reset")); + CBufSeg* bf=(CBufSeg*)CBufSeg::NewL(SegLen); + test(bf->Size()==0); + bf->InsertL(0,tb1); + test(bf->Size()==tb1.Length()); + bf->Read(6,tb3,5); + test(tb3==tb1.Right(5)); + bf->Write(1,tb2,6); + bf->Read(0,tb3,bf->Size()); + test(tb3==TPtrC8((TText8*)"HStringorld")); + bf->Reset(); + test(bf->Size()==0); + while (bf->Size()<400) + { + bf->InsertL(bf->Size(),tb1); + bf->InsertL(bf->Size(),tb2); + } + TInt i=0; + while (i<400) + { + bf->Read(i,tb3,tb1.Size()); + test(tb3==tb1); + i+=tb1.Length(); + bf->Read(i,tb3,tb2.Size()); + test(tb3==tb2); + i+=tb2.Length(); + } + i=0; + while (i<400) + { + bf->Write(i,tb2); + i+=tb2.Length(); + bf->Write(i,tb1); + i+=tb1.Length(); + } + i=0; + while (i<400) + { + bf->Read(i,tb3,tb2.Size()); + test(tb3==tb2); + i+=tb2.Length(); + bf->Read(i,tb3,tb1.Size()); + test(tb3==tb1); + i+=tb1.Length(); + } + delete bf; + test.End(); + } + +GLDEF_C void TestCBufSeg::Test3() +// +// Test input methods +// + { + + TInt8 bb[1000]; + TInt nbytes; + test.Start(_L("InsertL")); + CBufSeg* bf1=(CBufSeg*)CBufSeg::NewL(SegLen); + CBufSeg* bf2=(CBufSeg*)CBufSeg::NewL(SegLen); + CBufSeg* bf3=(CBufSeg*)CBufSeg::NewL(SegLen); + nbytes=0; + TInt k; + for(TInt j=0;j<20;j++) + { + for(TInt i=0;i<10*j;i+=2) + { + k=i%128; + bb[i]=(TInt8)k; + bb[i+1]=(TInt8)-k; + } + bf1->InsertL(bf1->Size()/3*2,&bb[0],10*j); + CheckSeg(bf1); + CheckContents1(bf1); + CheckContents2(bf1); + bf2->InsertL(bf2->Size(),&bb[0],10*j); + CheckSeg(bf2); + CheckContents1(bf2); + CheckContents2(bf2); + bf3->InsertL(0,&bb[0],10*j); + CheckSeg(bf3); + CheckContents1(bf3); + CheckContents2(bf3); + nbytes+=10*j; + } + test(nbytes==bf1->Size()); + test(nbytes==bf2->Size()); + test(nbytes==bf3->Size()); + delete bf1; + delete bf2; + delete bf3; + test.End(); + } + +GLDEF_C void TestCBufSeg::Test4() +// +// Delete +// + { + TInt8 bb[1000]; + + test.Start(_L("Delete")); + CBufSeg* bf1=(CBufSeg*)CBufSeg::NewL(SegLen); + CBufSeg* bf2=(CBufSeg*)CBufSeg::NewL(SegLen); + CBufSeg* bf3=(CBufSeg*)CBufSeg::NewL(SegLen); + TInt nbytes=0; + TInt k; + for(TInt j=0;j<20;j++) + { + for(TInt i=0;i<10*j;i+=2) + { + k=i%128; + bb[i]=(TInt8)k; + bb[i+1]=(TInt8)-k; + } + bf1->InsertL(bf1->Size()/3*2,&bb[0],10*j); + bf2->InsertL(bf2->Size(),&bb[0],10*j); + bf3->InsertL(0,&bb[0],10*j); + nbytes+=10*j; + } + TInt len=34; + TInt aLength; + while (nbytes>len) + { + for (TInt pos=0;posnbytes-pos) + len=nbytes-pos; + bf1->Delete(pos,len); + CheckSeg(bf1); + CheckContents1(bf1); + CheckContents2(bf1); + aLength=bf2->Ptr(0).Length(); + aLength=((aLength>len) ? aLength : len); + bf2->Delete(aLength-len,len); + CheckSeg(bf2); + CheckContents1(bf2); + CheckContents2(bf2); + bf3->Delete(0,len); + CheckSeg(bf3); + CheckContents1(bf3); + CheckContents2(bf3); + nbytes-=len; + test(nbytes==bf1->Size()); + test(nbytes==bf2->Size()); + test(nbytes==bf3->Size()); + } + } + delete bf1; + delete bf2; + delete bf3; + test.End(); + } + +GLDEF_C void TestCBufSeg::Test5() +// +// Compress +// + { + TInt8 bb[1000]; + + test.Start(_L("Compress")); + CBufSeg* bf1=(CBufSeg*)CBufSeg::NewL(SegLen); + CBufSeg* bf2=(CBufSeg*)CBufSeg::NewL(SegLen); + CBufSeg* bf3=(CBufSeg*)CBufSeg::NewL(SegLen); + TInt nbytes=0; + TInt k; + for(TInt j=0;j<20;j++) + { + for(TInt i=0;i<10*j;i+=2) + { + k=i%128; + bb[i]=(TInt8)k; + bb[i+1]=(TInt8)-k; + } + bf1->InsertL(bf1->Size()/3*2,&bb[0],10*j); + bf2->InsertL(bf2->Size(),&bb[0],10*j); + bf3->InsertL(0,&bb[0],10*j); + nbytes+=10*j; + } + TInt len=34; + TInt aLength; + while (nbytes>len) + { + for (TInt pos=0;posnbytes-pos) + len=nbytes-pos; + bf1->Delete(pos,len); + bf1->Compress(); + CheckSeg(bf1); + CheckContents1(bf1); + CheckContents2(bf1); + aLength=bf2->Ptr(0).Length(); + aLength=((aLength>len)? aLength : len); + bf2->Delete(aLength-len,len); + bf2->Compress(); + CheckSeg(bf2); + CheckContents1(bf2); + CheckContents2(bf2); + bf3->Delete(0,len); + bf3->Compress(); + CheckSeg(bf3); + CheckContents1(bf3); + CheckContents2(bf3); + nbytes-=len; + test(nbytes==bf1->Size()); + test(nbytes==bf2->Size()); + test(nbytes==bf3->Size()); + } + } + delete bf1; + delete bf2; + delete bf3; + test.End(); + } + +void TestCBufSeg::Test6L() + { + test.Start(_L("Test compress frees empty cells")); + __UHEAP_MARK; + TUint8 alphabet[27] = "abcdefghijklmnopqrstuvwxyz"; + CBufSeg* buf = CBufSeg::NewL(10); + CleanupStack::PushL(buf); + buf->InsertL(0, alphabet, 16); // "abcdefghij" ++ "klmnop" + buf->Delete(5, 5); // "abcde" ++ "klmnop" + buf->Delete(10, 1); // "abcde" ++ "klmno" + buf->Compress(); // "abcdefklmno". i.e. empty cell should be freed. + CleanupStack::PopAndDestroy(buf); + __UHEAP_MARKEND; + test.End(); + } + +LOCAL_C void test_CBufSeg() +// +// Test the BufSeg class +// + { + + TestCBufSeg b; + test.Start(_L("All operations")); + b.Test1(); + test.Next(_L("Inherited Methods")); + b.Test2(); + test.Next(_L("Insert")); + b.Test3(); + test.Next(_L("Delete")); + b.Test4(); + test.Next(_L("Compress")); + b.Test5(); + test.Next(_L("Bordeline cases")); + TRAPD(r,b.Test6L()); + test(r==KErrNone); + // + test.End(); + } + +GLDEF_C TInt E32Main() +// +// Test the ADT segmented varray. +// + { + + test.Title(); + __UHEAP_MARK; +// +// Install a trap handler +// + CTrapCleanup* trapHandler=CTrapCleanup::New(); + test(trapHandler!=NULL); +// CleanupStack::NextLevel(); + test.Start(_L("class CBufSeg")); + test_CBufSeg(); + delete trapHandler; + __UHEAP_MARKEND; + test.End(); + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_buf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_buf.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1942 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_buf.cpp +// Overview: +// Test methods of the TBuf16, TBuf8, TBuf template class. +// API Information: +// TBuf16, TBuf8, TBuf. +// Details : +// - Create some 16 bit modifiable descriptors, 8 bit modifiable descriptors +// of fixed length, Build-independent modifiable descriptors, initialize +// with different strings and check for +// - Comparison operators, +// - Property access methods, +// - Fill & swap methods, +// - Conversion methods, +// - Comparison methods, +// - Pattern Matching methods, +// - Pattern Locating methods, +// - Copying methods, +// - Find, FindC, FindF methods, +// - Repeat, Trim, TrimLeft, TrimRight, Insert, Delete, Left, +// Right, Mid methods, +// - Formatting methods, +// - Replace methods are as expected. +// - Construct some descriptors with buffer length, string and buffer reference and +// verify that they are created successfully. +// - Test assignment operators and comparison operators for different descriptors. +// - Initialize some descriptors and check descriptors' maximum length, length and +// size are as expected. +// - Check Fill and Swap methods are as expected. +// - Test Fold, Collate, LowerCase, UpperCase methods are as expected. +// - Test Comparison methods are as expected. +// - Test pattern matching for simple string, wild cards with collated comparison. Verify that the +// return value is KErrNotFound when pattern doesn't match. +// - Check Locating methods by searching character in forward and backward direction and +// verify the return value is KErrNotFound when unavailable character is searched. +// - Check copying strings and converting those into lower and upper case strings are +// as expected. +// - Check Find methods by searching string and verify the return value is KErrNotFound when +// unavailable string is searched. +// - Check Repeat, Trim, Insert and Delete methods are as expected. +// - Check the formatting operations are as expected. +// - Check integer to decimal character representation is as expected. +// - Check integer to character representation with different number system is as expected. +// - Check string formatting with variable parameter list is as expected +// - Check Replace method by replacing string at different places in a string is as expected. +// - Check the conversion of real numbers, extended precision real numbers into string +// format is as expected. +// - Check Format and FormatList methods are as expected. +// - Check Format of TReal is as expected. +// - Check the non-leaving and leaving descriptors overflow handlers are as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include +#include +#include +#include + +#ifdef __TOOLS2__ +EXPORT_C TInt HAL::Set(HAL::TAttribute aAttribute, TInt aValue) + { + return KErrNone; + } + +EXPORT_C TInt UserSvr::ChangeLocale(const TDesC& aLocaleDllName) + { + if (aLocaleDllName.Length() == 0) + return KErrNone; + return KErrNotFound; + } +#endif + +#ifdef __VC32__ + // Solve compilation problem caused by non-English locale + #pragma setlocale("english") +#endif + +LOCAL_D RTest test(_L("T_BUF")); + +#pragma warning(disable: 4127) // disabling warning "conditional expression is constant" +#pragma warning(disable: 4310) // disabling warning "cast truncates constant value" + +#undef _TL +#define _TL(a) DESTEMPLATE((S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a)) +#undef _TS +#define _TS(a) ((const S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a)) + +template +class TestTBuf + { +public: + TestTBuf(TInt aLength); // Test class constructor. + void Test1(); // Tests all functions of the class. + void Test2(); // Tests all constructors. + void Test3(); // Tests all assignment operators + void Test4(); // Tests all comparison operators + void Test5(); // Tests all property access + void Test6(); // Tests all fill and swap + void Test7(); // Tests all conversion + void Test8(); // Tests all comparison + void Test9(); // Tests all matching + void Test10(); // Tests all locating + void Test11(); // Tests all Copying + void Test12(); // Tests all finding + void Test13(); // Tests all basic like ops + void Test14(); // Tests all formating + void Test15(); // Tests all replacing + void test_TBuf(); // Test all classes +protected: + void Test1List(T* a,T* b,...); + void Test14_ReorderedParameterFormatting(TInt aDummyParameter, ...); +private: + TInt iMaxBufLength; + }; + +void TestEq(const TDesC8& a, const TDesC8& b, TInt aLine) + { + if (a!=b) + { + TBuf<256> buf; + test.Printf(_L("LINE %d:\n"),aLine); + buf.Copy(a); + test.Printf(_L("a=%S\n"),&buf); + buf.Copy(b); + test.Printf(_L("b=%S\n"),&buf); + test(0); + } + } + +void TestEq(const TDesC16& a, const TDesC16& b, TInt aLine) + { + if (a!=b) + { + test.Printf(_L("LINE %d:\n"),aLine); + test.Printf(_L("a=%S\n"),&a); + test.Printf(_L("b=%S\n"),&b); + test(0); + } + } + +#define TESTEQ(a,b) TestEq((a),(b),__LINE__) + +template +GLDEF_C TestTBuf::TestTBuf(TInt aLength) +// Constructor. + : iMaxBufLength(aLength) + {} + +template +GLDEF_C void TestTBuf::Test1List(T* a,T* b,...) +// Test the format with list functions. + { + VA_LIST list; + VA_START(list,b); + a->Format(*b,list); + VA_START(list,b); + a->AppendFormat(*b,list); + VA_START(list,b); + a->Format(_TL("%d"),list); + VA_START(list,b); + a->AppendFormat(_TL("%d"),list); + } + +template +GLDEF_C void TestTBuf::Test1() +// Tests all functions of the class. + { + test.Start(_L("Constructors")); + T a; + T b; + T c(_TL("AB")); + T d(c); + +// To avoid unused warning + a.Length(); + b.Length(); + c.Length(); + d.Length(); + + test.Next(_L("Copy operators")); + a=_TL("DE"); + b=c; + a+=_TL("DE"); + b+=c; + + test.Next(_L("Comparison operators")); + TInt t=(ab); + t=(a>_TL("AB")); + t=(_TL("AB")>a); + t=(a>=b); + t=(a>=_TL("AB")); + t=(_TL("AB")>=a); + t=(a==b); + t=(a==_TL("AB")); + t=(_TL("AB")==a); + t=(a!=_TL("AB")); + t=(_TL("AB")!=a); + + test.Next(_L("Property access")); + a[0]='A'; + a.Ptr(); + TInt i=a.MaxLength()-a.Length(); + i=a.Size(); + a.Zero(); + a.SetLength(2); + + test.Next(_L("Fill & swap")); + a.Fill(' '); + a.Fill(' ',iMaxBufLength); + a.FillZ(); + a.FillZ(iMaxBufLength); + a.Swap(b); + + test.Next(_L("Conversion")); + a.Fold(); + a.Collate(); + a.LowerCase(); + a.UpperCase(); + a.Capitalize(); + + test.Next(_L("Comparison")); + a.Compare(b); + a.Compare(_TL("AB")); + a.CompareF(b); + a.CompareF(_TL("AB")); + a.CompareC(b); + a.CompareC(_TL("AB")); + + test.Next(_L("Matching")); + a.Match(b); + a.Match(_TL("AB")); + a.MatchF(b); + a.MatchF(_TL("AB")); + + T buf(_TL("abcdef")); + TInt res = buf.MatchF(_TL("abc*def")); + test(res == 0); + + a.MatchC(b); + a.MatchC(_TL("AB")); + + test.Next(_L("Locating")); + a.Locate('A'); + a.LocateF('A'); + a.LocateReverse('A'); + a.LocateReverseF('A'); + + test.Next(_L("Copying")); + a.Copy(b); + a.Copy(_TL("AB")); +// a.Copy(_TL("AB"),1); + a.CopyF(b); + a.CopyF(_TL("AB")); + a.CopyC(b); + a.CopyC(_TL("AB")); + a.CopyLC(b); + a.CopyLC(_TL("AB")); + a.CopyUC(b); + a.CopyUC(_TL("AB")); + a.CopyCP(b); + a.CopyCP(_TL("AB")); + + test.Next(_L("Finding")); + a.Find(b); + a.Find(_TL("AB")); + a.FindF(b); + a.FindF(_TL("AB")); + a.FindC(b); + a.FindC(_TL("AB")); + + test.Next(_L("Basic like ops")); + a.Repeat(b); + a.Repeat(_TL("AB")); + a.TrimLeft(); + a.TrimRight(); + a.Trim(); + b=_TL("AA"); + a.Insert(0,b); + a.Delete(0,2); + b = a.Left(1); + b = a.Right(1); + b = a.Mid(0,1); + + test.Next(_L("Formating")); + a.Justify(_TL("AB"),10,ELeft,' '); + a.Justify(b,10,ELeft,' '); + b.Fill('A',2); + a.Zero(); + a.AppendJustify(_TL("AB"),10,ELeft,' '); + a.AppendJustify(b,10,ELeft,' '); + TInt v1=10; + a.Num(v1); + a.AppendNum(v1); + TInt v2=10; + a.Num((TUint)v2,EHex); + a.AppendNum((TUint)v2,EHex); + a.NumUC((TUint)v2,EHex); + a.AppendNumUC((TUint)v2,EHex); + TReal v3=10.0; + TRealFormat ff; + ff.iType=KRealFormatFixed; + ff.iWidth=10; + ff.iPlaces=2; + ff.iPoint='.'; + ff.iTriad=','; + ff.iTriLen=3; + a.Num(v3,ff); + a.AppendNum(v3,ff); + a.Format(_TL("%d"),12); + a.AppendFormat(_TL("%d"),12); + b=_TL("%d"); + a.Format(b,12); + a.AppendFormat(b,12); + Test1List(&a,&b,12); + + test.Next(_L("Replacing")); + a=_TL("AAC"); + b=_TL("B"); + a.Replace(1,1,b); + test.End(); + } + +template +GLDEF_C void TestTBuf::Test2() +// Tests all constructors. + { + test.Start(_L("Default")); + T a; + test(a.MaxLength()==iMaxBufLength); + test(a.Length()==0); + + test.Next(_L("By length")); + T b(iMaxBufLength>>1); + test(b.MaxLength()==iMaxBufLength); + test(b.Length()==(iMaxBufLength>>1)); + + test.Next(_L("By string")); + T c(_TL("AB")); + test(c.MaxLength()==iMaxBufLength); + test(c.Length()==2); + test(c[0]=='A'); + test(c[1]=='B'); + + test.Next(_L("By buffer reference")); + T d(c); + test(d.MaxLength()==iMaxBufLength); + test(d.Length()==2); + test(d[0]=='A'); + test(d[1]=='B'); + test.End(); + } + +template +GLDEF_C void TestTBuf::Test3() +// Tests all assignment operators + { + test.Start(_L("By String")); + T a; + a=_TL("AB"); + a+=_TL("CD"); + test(a.Length()==4); + test(a==_TL("ABCD")); + + test.Next(_L("By buffer")); + T b; + b=a; + b+=a; + test(b.Length()==8); + test(b==_TL("ABCDABCD")); +// + test.End(); + } + +template +GLDEF_C void TestTBuf::Test4() +// Test all comparison operators + { + test.Start(_L("By NULL string")); + T a; + test(a==_TL("")); // NULL strings + test(!(a!=_TL(""))); + test(a<=_TL("")); + test(a>=_TL("")); + test(!(a<_TL(""))); + test(!(a>_TL(""))); + test(_TL("")==a); + test(!(_TL("")!=a)); + test(_TL("")<=a); + test(_TL("")>=a); + test(!(_TL("")a)); + + test.Next(_L("By string or buffer")); + a=_TL("abc"); + test(a==_TL("abc")); // == + test(!(a==_TL("xyz"))); + test(!(a==_TL("aa"))); + test(_TL("abc")==a); + test(!(_TL("xyz")==a)); + test(!(_TL("aa")==a)); + test(a!=_TL("xyz")); // != + test(!(a!=_TL("abc"))); + test(a!=_TL("aa")); + test(_TL("xyz")!=a); + test(!(_TL("abc")!=a)); + test(_TL("aa")!=a); + test(a<_TL("x")); // < + test(!(a<_TL("abc"))); + test(!(a<_TL("aa"))); + test(_TL("aa")_TL("aa")); // > + test(!(a>_TL("abc"))); + test(!(a>_TL("xyz"))); + test(_TL("xyz")>a); + test(!(_TL("abc")>a)); + test(!(_TL("aa")>a)); + test(a>=_TL("abc")); // >= + test(!(a>=_TL("xyz"))); + test(a>=_TL("aa")); + test(_TL("abc")>=a); + test(!(_TL("aaa")>=a)); + test(_TL("xyz")>=a); + test(a<=_TL("abc")); // <= + test(!(a<=_TL("aa"))); + test(a<=_TL("xyz")); + test(_TL("abc")<=a); + test(!(_TL("xyz")<=a)); + test(_TL("aa")<=a); + + test.Next(_L("By special characters")); + a=_TL("!@#$%^&*()"); + test(a==_TL("!@#$%^&*()")); + test.End(); + } + +template +GLDEF_C void TestTBuf::Test5() +// Test all property access + { + test.Start(_L("Length and Size")); + T a; + TInt maxLength=a.MaxLength(); + TInt i; + for (i=0;i +GLDEF_C void TestTBuf::Test6() +// Fill and Swap + { + test.Start(_L("Fill and Swap")); + T a,b; + TChar chr; + TInt j; + TInt maxLength=a.MaxLength(); + for (TInt i=0;i +GLDEF_C void TestTBuf::Test7() +// Conversion operators + { + test.Start(_L("Fold, collate ...")); + T a; + T b; + a=_TL("abc AbC"); + b=_TL("ABC ABC"); + a.Fold(); + b.Fold(); + test(a==b); + a=_TL("abc AbC"); + b=_TL("ABC ABC"); + a.Collate(); + b.Collate(); + test(a==b); + a.LowerCase(); + test(a==_TL("abc abc")); + a.Capitalize(); + test(a==_TL("Abc abc")); + a.UpperCase(); + test(a==_TL("ABC ABC")); + test.End(); + } + +template +GLDEF_C void TestTBuf::Test8() +// Comparison + { + test.Start(_L("By string")); + T a; + a=_TL("abc AbC"); + test(a.Compare(_TL("abc AbC"))==0); + test(a.CompareF(_TL("ABC aBc"))==0); + test(a.Compare(_TL("xyz"))!=0); + test(a.CompareC(_TL("xyz"))!=0); + test(a.CompareF(_TL("xyz"))!=0); + + test.Next(_L("By buffer")); + T b; + T c; + a=_TL("abc AbC"); + b=_TL("abc AbC"); + c=_TL("xyz"); + test(a.Compare(b)==0); + test(a.Compare(c)!=0); + b=_TL("ABC aBc"); + test(a.CompareC(c)!=0); + test(a.CompareF(b)==0); + test(a.CompareF(c)!=0); + + test.End(); + } + +template +GLDEF_C void TestTBuf::Test9() +// Matching (need to test explicit result as error KErrNotFound = KMaxTUint +// and so registers as TRUE. (test parameter is TUint) ) + { + test.Start(_L("By string")); + T a; + a=_TL("abc AbC"); + test(a.Match(_TL("abc AbC"))==0); + test(a.MatchC(_TL("ABC aBc"))==0); + test(a.MatchF(_TL("ABC aBc"))==0); + test(a.Match(_TL("xyz"))==KErrNotFound); + test(a.MatchC(_TL("xyz"))==KErrNotFound); + test(a.MatchF(_TL("xyz"))==KErrNotFound); + + test.Next(_L("By buffer")); + T b; + T c; + a=_TL("abc AbC"); + b=_TL("abc AbC"); + c=_TL("xyz"); + test(a.Match(b)==0); + test(a.Match(c)==KErrNotFound); + b=_TL("ABC aBc"); + test(a.MatchC(b)==0); + test(a.MatchC(c)==KErrNotFound); + test(a.MatchF(b)==0); + test(a.MatchF(c)==KErrNotFound); + + test.Next(_L("Wildcards")); + a=_TL("abcxyz"); + test(a.Match(_TL("abc*"))==0); + test(a.Match(_TL("abw*"))==KErrNotFound); + a=_TL("abcdefg"); + test(a.Match(_TL("a*fg"))==0); + test(a.Match(_TL("a*f"))==KErrNotFound); + test(a.Match(_TL("abc*fgh"))==KErrNotFound); + a=_TL("abcdef"); + test(a.Match(_TL("abc?ef"))==0); + test(a.Match(_TL("abc?xf"))==KErrNotFound); + + a=_TL("a(01)"); + test(a.Match(_TL("*(01)"))==1); + test(a.Match(_TL("?(01)"))==0); + test(a.Match(_TL("?(*)"))==0); + test(a.Match(_TL("?(**)"))==0); + + test(a.Match(_TL("?(\?\?)"))==0); + test(a.Match(_TL("*(*)"))>=0); + test(a.Match(_TL("*(0?)"))>=0); + test(a.Match(_TL("a(\?\?)"))==0); + test(a.Match(_TL("*(\?\?)"))>=0); + + test.Next(_L("wild cards with collated comparison")); + a = _TL("abcdefghijkl"); + test(a.MatchC(_TL("abc*")) == 0); + test(a.MatchC(_TL("abc")) == KErrNotFound); + test(a.MatchC(_TL("xyz")) == KErrNotFound); + test(a.MatchC(_TL("*def")) == KErrNotFound); + test(a.MatchC(_TL("*def*")) == 3); + test(a.MatchC(_TL("*d?f*")) == 3); + test(a.MatchC(_TL("a*kl")) == 0); + test(a.MatchC(_TL("*e*?l")) == 4); + test(a.MatchC(_TL("abc*dEf*")) == 0); + + + T candidate; + T search; + + candidate = _TL(""); + search = _TL("**"); + test(candidate.MatchC(search) == 0); + + candidate = _TL(""); + search = _TL("*"); + test(candidate.MatchC(search) == 0); + + candidate = _TL("abcd"); + search = _TL("*abc*cd"); + test(candidate.MatchC(search) == KErrNotFound); + + if (sizeof(S) == 2) + { + test.Next(_L("Unicode MatchC and FindC treat base+accent as equal to composed character")); + TPtrC p = _L("te\x302te"); + test(p.MatchC(_L("t\xeate")) == 0); + test(p.FindC(_L("t\xeate")) == 0); + } + + test.End(); + } + +template +GLDEF_C void TestTBuf::Test10() +// Locating + { + T a; + TChar b; + + test.Start(_L("First Char")); + b='a'; + a=_TL("axaxa"); + test(a.Locate(b)==0); + test(a.LocateF(b)==0); + test(a.LocateReverse(b)==4); + test(a.LocateReverseF(b)==4); + + test.Next(_L("Middle Char")); + a=_TL("xaxa"); + test(a.Locate(b)==1); + test(a.LocateF(b)==1); + a=_TL("axax"); + test(a.LocateReverse(b)==2); + test(a.LocateReverseF(b)==2); + + test.Next(_L("Last Char")); + a=_TL("xxa"); + test(a.Locate(b)==2); + test(a.LocateF(b)==2); + a=_TL("axx"); + test(a.LocateReverse(b)==0); + test(a.LocateReverseF(b)==0); + + test.Next(_L("Test for failure of locate")); + a=_TL("xxx"); + test(a.Locate(b)==KErrNotFound); + test(a.LocateF(b)==KErrNotFound); + test(a.LocateReverse(b)==KErrNotFound); + test(a.LocateReverseF(b)==KErrNotFound); + + test.End(); + } + +template +GLDEF_C void TestTBuf::Test11() +// Copying + { + T a, b; + + test.Start(_L("By String")); + a.Copy(_TL("abc")); + test(a.Length()==3); + test(a==_TL("abc")); + a.CopyF(_TL("abc")); + test(a.Length()==3); + b.CopyF(_TL("ABC")); + test(a==b); + a.CopyLC(_TL("AbC")); + test(a==_TL("abc")); + test(a.Length()==3); + a.CopyC(_TL("abc")); + b.CopyC(_TL("ABC")); + test(a==b); + test(a.Length()==3); + a.CopyCP(_TL("abc")); + test(a==_TL("Abc")); + test(a.Length()==3); + a.CopyUC(_TL("aBc")); + test(a==_TL("ABC")); + test(a.Length()==3); +// a.Copy(_TL("abc"),3); +// test(a==_TL("abc")); +// test(a.Length()==3); +// a.Copy(_TL("abcd"),3); +// test(a==_TL("abc")); +// test(a.Length()==3); + + test.Next(_L("By buffer")); + b=_TL("abc"); + a.Copy(b); + test(a==_TL("abc")); + test(a.Length()==3); + a=_TL(""); + a.CopyF(b); + b.CopyF(_TL("ABC")); + test(a==b); + test(a.Length()==3); + a=_TL(""); + b=_TL("AbC"); + a.CopyLC(b); + test(a==_TL("abc")); + test(a.Length()==3); + a=_TL(""); + b=_TL("abC"); + a.CopyC(b); + b.CopyC(_TL("ABC")); + test(a==b); + test(a.Length()==3); + a=_TL(""); + b=_TL("abC"); + a.CopyCP(b); + test(a==_TL("Abc")); + test(a.Length()==3); + a=_TL(""); + b=_TL("aBc"); + a.CopyUC(b); + test(a.Length()==3); + test(a==_TL("ABC")); + + test.End(); + } + + +template +GLDEF_C void TestTBuf::Test12() +// Finding + { + test.Start(_L("By String")); + T a,b; + a=_TL("abccef"); + test(a.Find(_TL(""))==0); + test(a.Find(_TL("abc"))==0); + test(a.Find(_TL("cce"))==2); + test(a.Find(_TL("cef"))==3); + test(a.Find(_TL("efg"))==KErrNotFound); + test(a.Find(_TL("xxx"))==KErrNotFound); + test(a.FindF(_TL(""))==0); + test(a.FindF(_TL("AbC"))==0); + test(a.FindF(_TL("CcE"))==2); + test(a.FindF(_TL("CeF"))==3); + test(a.FindF(_TL("efg"))==KErrNotFound); + test(a.FindF(_TL("xxx"))==KErrNotFound); + test(a.FindC(_TL(""))==0); + test(a.FindC(_TL("aBc"))==0); + test(a.FindC(_TL("cce"))==2); + test(a.FindC(_TL("cEf"))==3); + test(a.FindC(_TL("efg"))==KErrNotFound); + test(a.FindC(_TL("xxx"))==KErrNotFound); + + test.Next(_L("By buffer")); + test(a.Find(b)==0); + test(a.FindF(b)==0); + test(a.FindC(b)==0); + b=_TL("xxx"); + test(a.Find(b)==KErrNotFound); + test(a.FindF(b)==KErrNotFound); + test(a.FindC(b)==KErrNotFound); + b=_TL("efg"); + test(a.Find(b)==KErrNotFound); + test(a.FindF(b)==KErrNotFound); + test(a.FindC(b)==KErrNotFound); + b=_TL("abc"); + test(a.Find(b)==0); + b=_TL("cce"); + test(a.Find(b)==2); + b=_TL("cef"); + test(a.Find(b)==3); + b=_TL("AbC"); + test(a.FindF(b)==0); + b=_TL("CcE"); + test(a.FindF(b)==2); + b=_TL("CeF"); + test(a.FindF(b)==3); + b=_TL("aBc"); + test(a.FindC(b)==0); + b=_TL("cCe"); + test(a.FindC(b)==2); + b=_TL("cEf"); + test(a.FindC(b)==3); + + test.End(); + } + +template +GLDEF_C void TestTBuf::Test13() +// Basic like ops + { + test.Start(_L("Repeat, trim, insert and delete")); + T a,b; + TInt max=a.MaxLength(); + b=_TL("abc"); + a.Repeat(_TL("abc")); + test(a==_TL("")); + a.Repeat(b); + test(a==_TL("")); + for (TInt j=1;j +GLDEF_C void TestTBuf::Test14() +// Formating operations + { + test.Start(_L("Justify")); + T a,b,d; + TInt aWidth; + TChar c; + a=_TL("wxyz"); + b=_TL("abc"); + d=_TL("linearisation"); + const S* pD=_TS("299792458"); + c='x'; + aWidth=KDefaultJustifyWidth; // Left justified, Default width + a.Justify(b,aWidth,ELeft,c); + test(a==b); + test(a.Length()==3); + a.AppendJustify(b,aWidth,ELeft,c); + test(a==_TL("abcabc")); + test(a.Length()==6); + aWidth=1; // Width < String length + a.Justify(b,aWidth,ELeft,c); + test(a==_TL("a")); + test(a.Length()==1); + a.AppendJustify(b,aWidth,ELeft,c); + test(a==_TL("aa")); + test(a.Length()==2); + aWidth=5; // Width > String length + a.Justify(b,aWidth,ELeft,c); + test(a==_TL("abcxx")); + test(a.Length()==5); + a.AppendJustify(b,aWidth,ELeft,c); + test(a==_TL("abcxxabcxx")); + test(a.Length()==10); + + aWidth=KDefaultJustifyWidth; // Right justified, Default width + a.Justify(b,aWidth,ERight,c); + test(a==b); + test(a.Length()==3); + a.AppendJustify(b,aWidth,ERight,c); + test(a==_TL("abcabc")); + test(a.Length()==6); + aWidth=1; // Right justified, Width < String length + a.Justify(b,aWidth,ERight,c); + test(a==_TL("a")); + test(a.Length()==1); + a.AppendJustify(b,aWidth,ERight,c); + test(a==_TL("aa")); + test(a.Length()==2); + aWidth=5; // Right justified, width > String length + a.Justify(b,aWidth,ERight,c); + test(a==_TL("xxabc")); + test(a.Length()==5); + a.AppendJustify(b,aWidth,ERight,c); + test(a==_TL("xxabcxxabc")); + test(a.Length()==10); + + aWidth=KDefaultJustifyWidth; // Center justified, Default width + a.Justify(b,aWidth,ECenter,c); + test(a==b); + test(a.Length()==3); + a.AppendJustify(b,aWidth,ECenter,c); + test(a==_TL("abcabc")); + test(a.Length()==6); + aWidth=1; // Centre justified, width < String length + a.Justify(b,aWidth,ECenter,c); + test(a==_TL("a")); + test(a.Length()==1); + a.AppendJustify(b,aWidth,ECenter,c); + test(a==_TL("aa")); + test(a.Length()==2); + aWidth=5; // Centre justified, width > String length + a.Justify(b,aWidth,ECenter,c); + test(a==_TL("xabcx")); + test(a.Length()==5); + a.AppendJustify(b,aWidth,ECenter,c); + test(a==_TL("xabcxxabcx")); + test(a.Length()==10); + + test.Next(_L("Num")); + TInt j=-2147483647-1; + a.Num(j); + test(a==_TL("-2147483648")); + test(a.Length()==11); + TUint i=2147483648u; + a.Num(i); + test(a==_TL("2147483648")); + test(a.Length()==10); + if (a.MaxLength()>31) + { + a.Num(i,EBinary); + test(a==_TL("10000000000000000000000000000000")); + test(a.Length()==32); + a=_TL(""); + a.NumUC(i,EBinary); + test(a==_TL("10000000000000000000000000000000")); + test(a.Length()==32); + } + i=31; + a.Num(i,EBinary); + test(a==_TL("11111")); + test(a.Length()==5); + a=_TL(""); + a.NumUC(i,EBinary); + test(a==_TL("11111")); + test(a.Length()==5); + i=2147483648u; + a.Num(i,EOctal); + test(a==_TL("20000000000")); + test(a.Length()==11); + a=_TL(""); + a.NumUC(i,EOctal); + test(a==_TL("20000000000")); + test(a.Length()==11); + a.Num(i,EDecimal); + test(a==_TL("2147483648")); + test(a.Length()==10); + a=_TL(""); + a.NumUC(i,EDecimal); + test(a==_TL("2147483648")); + test(a.Length()==10); + a.Num(i,EHex); + test(a==_TL("80000000")); + test(a.Length()==8); + a=_TL(""); + a.NumUC(i,EHex); + test(a==_TL("80000000")); + test(a.Length()==8); + i=0; + a.Num(i); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL("abc"); + a.Num(i,EBinary); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL("abc"); + a.NumUC(i,EBinary); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL("abc"); + a.Num(i,EOctal); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL(""); + a.NumUC(i,EOctal); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL("abc"); + a.Num(i,EDecimal); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL(""); + a.NumUC(i,EDecimal); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL("abc"); + a.Num(i,EHex); + test(a==_TL("0")); + test(a.Length()==1); + a=_TL(""); + a.NumUC(i,EHex); + test(a==_TL("0")); + test(a.Length()==1); +// TInt i=a.Num(6.2,format); NOT IMPLEMENTED + a.AppendNum(j); + test(a==_TL("0-2147483648")); + test(a.Length()==12); + a=_TL("abc"); + i=4294967295u; + a.AppendNum(i); + test(a==_TL("abc4294967295")); + test(a.Length()==13); + j=2147483647; + a=_TL("abc"); + a.AppendNum(j); + test(a==_TL("abc2147483647")); + test(a.Length()==13); + a=_TL("a"); + i=180150000; + if (a.MaxLength()>28) + { + a.AppendNum(i,EBinary); + test(a==_TL("a1010101111001101111011110000")); + test(a.Length()==29); + } + a=_TL("a"); + a.AppendNum(15,EBinary); + test(a==_TL("a1111")); + test(a.Length()==5); + a=_TL("a"); + a.AppendNum(i,EDecimal); + test(a==_TL("a180150000")); + test(a.Length()==10); + a=_TL("a"); + a.AppendNum(i,EOctal); + test(a==_TL("a1257157360")); + test(a.Length()==11); + a=_TL("a"); + a.AppendNumUC(i,EHex); + test(a==_TL("aABCDEF0")); + test(a.Length()==8); +// i=a.AppendNum(6.32, format); NOT IMPLEMENTED + + test.Next(_L("Format")); + a=_TL(""); + b=_TL("cde"); + a.Format(_TL("%S"),&b); + test(a==b); + test(a.Length()==3); + DESTEMPLATE xyz=_TL("xyzwpq"); + a.Format(_TL("%S"),&xyz); + test(a==_TL("xyzwpq")); + test(a.Length()==6); + DESTEMPLATE cde=_TL("cde"); + a.Format(_TL("ab %-x5S"),&cde); + test(a==_TL("ab cdexx")); + test(a.Length()==8); + a.Format(_TL("ab %=x5S"),&cde); + test(a==_TL("ab xcdex")); + test(a.Length()==8); + a.Format(_TL("ab %+x5S"),&cde); + test(a==_TL("ab xxcde")); + test(a.Length()==8); + a.Format(_TL("ab %5S"),&cde); + test(a==_TL("ab cde")); + test(a.Length()==8); + a.Format(_TL("ab %-**S"),'x',5,&cde); + test(a==_TL("ab cdexx")); + test(a.Length()==8); + a.Format(_TL("ab %*S"),5,&cde); + test(a==_TL("ab cde")); + test(a.Length()==8); + a=_TL("xyz"); + a.Format(_TL("ab %-x5S"),&b); + test(a==_TL("ab cdexx")); + test(a.Length()==8); + a=_TL("xyz"); + a.Format(_TL("ab %-**S"),'x',5,&b); + test(a==_TL("ab cdexx")); + test(a.Length()==8); + a=_TL("xyz"); + a.Format(_TL("ab %*S"),5,&b); + test(a==_TL("ab cde")); + test(a.Length()==8); + + DESTEMPLATE fred=_TL("fred"); + a.Format(_TL("%+0*S"),10,&fred); + test(a==_TL("000000fred")); + test(a.Length()==10); + a.Format(_TL("%-0*S"),7,&fred); + test(a==_TL("fred000")); + test(a.Length()==7); + a.Format(_TL("%0*S"),11,&fred); + test(a==_TL("0000000fred")); + test(a.Length()==11); + a.Format(_TL("c=%s"),pD); + TESTEQ(a,_TL("c=299792458")); + a.Format(_TL("c=%10.6s"),pD); + test(a==_TL("c= 299792")); + a.Format(_TL("c=%*.*s"),5,4,pD); + test(a==_TL("c= 2997")); + a.Format(_TL("%S"),&d); + test(a==_TL("linearisation")); + a.Format(_TL("%10.6S"),&d); + test(a==_TL(" linear")); + a.Format(_TL("%*.*S"),5,4,&d); + test(a==_TL(" line")); + a.Format(_TL("%*.*Sed"),10,8,&d); + test(a==_TL(" linearised")); + a.Format(_TL("%*.*S"),14,20,&d); + test(a==_TL(" linearisation")); + + a.Format(_TL("ab %-,5b"),7); + test(a==_TL("ab 111,,")); + test(a.Length()==8); + a.Format(_TL("ab %=,5O"),31); + test(a==_TL("ab ,37,,")); + test(a.Length()==8); + a.Format(_TL("ab %+xlx"),TInt64(171)); + test(a==_TL("ab ab")); + test(a.Length()==5); + a.Format(_TL("ab %+xlX %+xlx"),TInt64(171),TInt64(171)); + TESTEQ(a,_TL("ab AB ab")); + test(a.Length()==8); + a.Format(_TL("ab %lu"),MAKE_TINT64((TUint)(KMinTInt),0)); + test(a==_TL("ab 9223372036854775808")); + test(a.Length()==22); + a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMinTInt),1)); + test(a==_TL("ab -9223372036854775807")); + test(a.Length()==23); + a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMinTInt),0)); + test(a==_TL("ab -9223372036854775808")); + test(a.Length()==23); + a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint)); + test(a==_TL("ab 9223372036854775807")); + test(a.Length()==22); + a.Format(_TL("ab %ld"),MAKE_TINT64(KMaxTUint,KMaxTUint)); + test(a==_TL("ab -1")); + test(a.Length()==5); + a.Format(_TL("ab %lu"),MAKE_TINT64(KMaxTUint,KMaxTUint)); + test(a==_TL("ab 18446744073709551615")); + test(a.Length()==23); + a.Format(_TL("ab %ld"),TInt64(0)); + test(a==_TL("ab 0")); + test(a.Length()==4); + a.Format(_TL("ab %lb"),TInt64(0)); + test(a==_TL("ab 0")); + test(a.Length()==4); + a.Format(_TL("ab %lx"),TInt64(0)); + test(a==_TL("ab 0")); + test(a.Length()==4); + a.Format(_TL("ab %lo"),TInt64(0)); + test(a==_TL("ab 0")); + test(a.Length()==4); + a.Format(_TL("ab %lu"),TInt64(0)); + test(a==_TL("ab 0")); + test(a.Length()==4); + a.Format(_TL("ab %lb"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint)); + test(a==_TL("ab 111111111111111111111111111111111111111111111111111111111111111")); + test(a.Length()==66); + a.Format(_TL("ab %lb"),MAKE_TINT64(KMaxTUint,KMaxTUint)); + test(a==_TL("ab 1111111111111111111111111111111111111111111111111111111111111111")); + test(a.Length()==67); + a.Format(_TL("ab %lx"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint)); + test(a==_TL("ab 7fffffffffffffff")); + test(a.Length()==19); + a.Format(_TL("ab %lx"),MAKE_TINT64(KMaxTUint,KMaxTUint)); + test(a==_TL("ab ffffffffffffffff")); + test(a.Length()==19); + a.Format(_TL("ab %lo"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint)); + test(a==_TL("ab 777777777777777777777")); + test(a.Length()==24); + // tests which excercise any 8 byte alignment requirement on 64bit integers + a.Format(_TL("%li%S"),MAKE_TINT64(1,2),&fred); + test(a==_TL("4294967298fred")); + a.Format(_TL("%S%li%S"),&fred,MAKE_TINT64(1,2),&fred); + test(a==_TL("fred4294967298fred")); + a.Format(_TL("%lu%S"),MAKE_TINT64(1,2),&fred); + test(a==_TL("4294967298fred")); + a.Format(_TL("%S%lu%S"),&fred,MAKE_TINT64(1,2),&fred); + test(a==_TL("fred4294967298fred")); + + a.Format(_TL("ab %U"),233); + test(a==_TL("ab 233")); + test(a.Length()==6); + a.Format(_TL("ab %*d"),5,-131); + test(a==_TL("ab -131")); + test(a.Length()==8); + a.Format(_TL("ab%c"),'x'); + test(a==_TL("abx")); + test(a.Length()==3); + a.Format(_TL("%W"),-131); + test(*(TInt32*)a.Ptr()==-131); + a.Format(_TL("%M"),-131); + test(*(TInt32*)a.Ptr()==2113929215); + a.Format(_TL("%w"),-131); + test(*(TInt16*)a.Ptr()==-131); + a.Format(_TL("%m"),-131); + test(*(TInt16*)a.Ptr()==32255); + a=_TL("xyz"); + a.AppendFormat(_TL("ab %+xlx"),TInt64(171)); + test(a==_TL("xyzab ab")); + test(a.Length()==8); + a=_TL("xyz"); + a.AppendFormat(_TL("ab %5S"),&b); + test(a==_TL("xyzab cde")); + test(a.Length()==11); + a=_TL("xyz"); + a.AppendFormat(_TL("%W"),-131); +// test(*(TInt32*)(a.Ptr()+3)==-131); // Alignment-safe version: + TInt val; + Mem::Copy(&val,&a[3],4); + test(val==-131); + a=_TL("xyz"); +// a.Append(_TL("abc"),3); +// test(a==_TL("xyzabc")); + + a.Format(_TL("")); + test(a==_TL("")); + a.Format(_TL(""),9,5); + test(a==_TL("")); + a.Format(_TL("qwerty")); + test(a==_TL("qwerty")); + a.Format(_TL("qwerty"),9,5); + test(a==_TL("qwerty")); + a.Format(_TL("%$1$d%$2$d"),9,5); + test(a==_TL("95")); + test(a.Length()==2); + a.Format(_TL("%$2$d%$1$d"),9,5); + test(a==_TL("59")); + test(a.Length()==2); + b=_TL("eb"); + a.Format(_TL("%$1$S%$2$d"),&b,205); + test(a==_TL("eb205")); + test(a.Length()==5); + a.Format(_TL("%$2$d%$1$S"),&b,205); + test(a==_TL("205eb")); + test(a.Length()==5); + b=_TL("ebdb"); + +// Cannot do this on GCC (X86) because of "Cannot pass objects of non-POD type through '...'. Call will abort at runtime". +#if !(defined(__GCC32__) && defined(__X86__)) + const TAny* const zeroTerminatedString=(sizeof(S)==2)? (const TAny*)_S16(":-)E"): (const TAny*)_S8(":-)E"); + const TInt dummyParameter=0; + Test14_ReorderedParameterFormatting(dummyParameter, 0x20ac, 11, 3, 13.89543, zeroTerminatedString, '!', TInt64(199), 2, &b, 6, 30005, TRealX(0.125), 0x8bdd); +#endif + + test.Next(_L("Print some numbers")); + TInt64 TI64 = MAKE_TINT64(0x101010u,0x10101010u); + test.Printf(_L(" %%ld: %ld\n"),TI64); + test.Printf(_L(" %%lu: %lu\n"),TI64); + test.Printf(_L(" %%lx: %lx\n"),TI64); + test.Printf(_L(" %%lb: %lb\n"),TI64); + test.Printf(_L(" %%lo: %lo\n\n"),TI64); + TI64 = UI64LIT(0xabcdef12345678); + test.Printf(_L(" %%ld: %ld\n"),TI64); + test.Printf(_L(" %%lu: %lu\n"),TI64); + test.Printf(_L(" %%lx: %lx\n"),TI64); + test.Printf(_L(" %%lb: %lb\n"),TI64); + test.Printf(_L(" %%lo: %lo\n\n"),TI64); + TI64 = UI64LIT(0x7fffffffffffffff); + test.Printf(_L(" %%ld: %ld\n"),TI64); + test.Printf(_L(" %%lu: %lu\n"),TI64); + test.Printf(_L(" %%lx: %lx\n"),TI64); + test.Printf(_L(" %%lb: %lb\n"),TI64); + test.Printf(_L(" %%lo: %lo\n\n"),TI64); + TI64 = UI64LIT(0x8000000000000000); + test.Printf(_L(" %%ld: %ld\n"),TI64); + test.Printf(_L(" %%lu: %lu\n"),TI64); + test.Printf(_L(" %%lx: %lx\n"),TI64); + test.Printf(_L(" %%lb: %lb\n"),TI64); + test.Printf(_L(" %%lo: %lo\n\n"),TI64); + TI64 = UI64LIT(0xffffffffffffffff); + test.Printf(_L(" %%ld: %ld\n"),TI64); + test.Printf(_L(" %%lu: %lu\n"),TI64); + test.Printf(_L(" %%lx: %lx\n"),TI64); + test.Printf(_L(" %%lb: %lb\n"),TI64); + test.Printf(_L(" %%lo: %lo\n\n"),TI64); + + test.Next(_L("Regression tests")); + a.Format(_TL("[%-A4p]")); + test(a==_TL("[AAAA]")); + + test.End(); + } + +template +GLDEF_C void TestTBuf::Test14_ReorderedParameterFormatting(TInt aDummyParameter, ...) + { + VA_LIST parameterList; + T generated; + T expected; + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%-**.*fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%.3Fyyyyyyy%c"), parameterList); + test(generated.Length()==61); + expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeeeebrrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Left(generated.Length()-1)==expected); + test(generated[generated.Length()-1]==(S)0x8bdd); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%$1$-**.*fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%$6$.3Fyyyyyyy%c"), parameterList); + test(generated.Length()==61); + expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeeeebrrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Left(generated.Length()-1)==expected); + test(generated[generated.Length()-1]==(S)0x8bdd); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%$6$.3Fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%$1$-**.*fyyyyyyy%c"), parameterList); + test(generated.Length()==61); + expected.Format(_TL("\t0.125qq:-)www!!199eeeeebrrrrr007535tttttt13.895%c%c%c%c%cyyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Left(generated.Length()-1)==expected); + test(generated[generated.Length()-1]==(S)0x8bdd); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%-**.*fqq%.3swww%$5$0*xeeee%.*Srrrrr%$3$+*5Ldtttttt%.3Fyyyyyyy%c"), parameterList); + test(generated.Length()==61); + expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www007535eeeeebrrrrr!!199tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Left(generated.Length()-1)==expected); + test(generated[generated.Length()-1]==(S)0x8bdd); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%-**.*fqq%$4$.*Swww%+*5Ldeeee%$2$.3srrrrr%0*xtttttt%.3Fyyyyyyy%c"), parameterList); + test(generated.Length()==61); + expected.Format(_TL("\t13.895%c%c%c%c%cqqebwww!!199eeee:-)rrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Left(generated.Length()-1)==expected); + test(generated[generated.Length()-1]==(S)0x8bdd); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%-**.*fqq%.3swww%+*5Ldeeee%$7$crrrrr%0*xtttttt%.3Fyyyyyyy%$4$.*S"), parameterList); + test(generated.Length()==61); + expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeee"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Left(29)==expected); + test(generated[29]==(S)0x8bdd); + test(generated.Mid(29+1)==_TL("rrrrr007535tttttt0.125yyyyyyyeb")); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%$4$.*Sqq%.3swww%+*5Ldeeee%$6$.3Frrrrr%0*xtttttt%$1$-**.*fyyyyyyy%c"), parameterList); + test(generated.Length()==61); + expected.Format(_TL("\tebqq:-)www!!199eeee0.125rrrrr007535tttttt13.895%c%c%c%c%cyyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Left(generated.Length()-1)==expected); + test(generated[generated.Length()-1]==(S)0x8bdd); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%$7$cqq%$6$.3Fwww%$5$0*xeeee%.*Srrrrr%$3$+*5Ldtttttt%$2$.3syyyyyyy%$1$-**.*f"), parameterList); + test(generated.Length()==61); + test(generated.Left(1)==_TL("\t")); + test(generated[1]==(S)0x8bdd); + expected.Format(_TL("qq0.125www007535eeeeebrrrrr!!199tttttt:-)yyyyyyy13.895%c%c%c%c%c"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Mid(2)==expected); + + VA_START(parameterList, aDummyParameter); + generated.FormatList(_TL("\t%$7$cqq%$6$.3Fwww%$5$0*xeeee%$4$.*Srrrrr%$3$+*5Ldtttttt%$2$.3syyyyyyy%$1$-**.*f"), parameterList); + test(generated.Length()==61); + test(generated.Left(1)==_TL("\t")); + test(generated[1]==(S)0x8bdd); + expected.Format(_TL("qq0.125www007535eeeeebrrrrr!!199tttttt:-)yyyyyyy13.895%c%c%c%c%c"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac); + test(generated.Mid(2)==expected); + } + +template +GLDEF_C void TestTBuf::Test15() +// Replacing + { + test.Start(_L("Replace")); + T a,b; + test(a.MaxLength()>=9); + a=_TL("abccccc"); + b=_TL("def"); + a.Replace(3,4,b); // Replace with smaller in middle (insert and delete) + test(a==_TL("abcdef")); + a.Replace(1,1,b); // Replace with larger in middle (insert and delete) + test(a==_TL("adefcdef")); + a.Replace(0,8,_TL("")); // Replace complete string (delete) + test(a==_TL("")); + a.Replace(0,0,b); // Replace at beginning (insert) + test(a==b); + a.Replace(3,0,_TL("xyz")); // Replace at end (append) + test(a==_TL("defxyz")); + a.Replace(0,0,_TL("")); // Replace nothing at beginning (do nothing) + test(a==_TL("defxyz")); + a.Replace(6,0,_TL("")); // Replace nothing at end (do nothing) + test(a==_TL("defxyz")); + //a.Replace(6,1,_TL("")); // this will panic - no char after end to replace + //a.Replace(0,7,_TL("")); // this will panic - aint 7 chars to replace + test.End(); + } + +template +GLDEF_C void TestTBuf::test_TBuf() +// Test the TBuf class. + { + test.Start(_L("All operations")); + Test1(); + test.Next(_L("Constructors")); + Test2(); + test.Next(_L("Additional tests")); + Test3(); + test.Next(_L("Comparison operators")); + Test4(); + test.Next(_L("Property access")); + Test5(); + test.Next(_L("Fill and swap")); + Test6(); + test.Next(_L("Conversion operators")); + Test7(); + test.Next(_L("Comparison")); + Test8(); + test.Next(_L("Matching")); + Test9(); + test.Next(_L("Locating")); + Test10(); + test.Next(_L("Copying")); + Test11(); + test.Next(_L("Finding")); + Test12(); + test.Next(_L("Basic like ops")); + Test13(); + test.Next(_L("Formating")); + Test14(); + test.Next(_L("Replacing")); + Test15(); + test.End(); + } + +LOCAL_C void testFormat() + { + TBuf<0x100> aa; + aa.Format(_L("x%- 5fx"), 6.2345678); + test(aa==_L("x6.234568x")); + aa.Format(_L("x%+ 5fx"), 6.2345678); + test(aa==_L("x6.234568x")); + aa.Format(_L("x% 5fx"), 6.2345678); + test(aa==_L("x6.234568x")); + aa.Format(_L("x%= 5fx"), 6.2345678); + test(aa==_L("x6.234568x")); + aa.Format(_L("x%- 10fx"), 6.2345); + test(aa==_L("x6.234500 x")); + aa.Format(_L("x%+ 10fx"), 6.2345); + test(aa==_L("x 6.234500x")); + aa.Format(_L("x% 10fx"), 6.2345); + test(aa==_L("x 6.234500x")); + aa.Format(_L("x%= 10fx"), 6.2345); + test(aa==_L("x 6.234500 x")); + aa.Format(_L("x%10fx"), 12345352342.545); + test(aa==_L("x12,345,352,342.545000x")); + aa.Format(_L("x%20.9fx"), 1.0123456789); + test(aa==_L("x 1.012345679x")); + aa.Format(_L("x%5.1fx"), 1.99); + test(aa==_L("x 2.0x")); + +// Cannot do these on GCC (X86) because of "Cannot pass objects of non-POD type through '...'. Call will abort at runtime". +#if !(defined(__GCC32__) && defined(__X86__)) + aa.Format(_L("x%- 5Fx"), TRealX(6.2345678)); + test(aa==_L("x6.234568x")); + aa.Format(_L("x%+ 5Fx"), TRealX(6.2345678)); + test(aa==_L("x6.234568x")); + aa.Format(_L("x% 5Fx"), TRealX(6.2345678)); + test(aa==_L("x6.234568x")); + aa.Format(_L("x%= 5Fx"), TRealX(6.2345678)); + test(aa==_L("x6.234568x")); + aa.Format(_L("x%- 10Fx"), TRealX(6.2345)); + test(aa==_L("x6.234500 x")); + aa.Format(_L("x%+ 10Fx"), TRealX(6.2345)); + test(aa==_L("x 6.234500x")); + aa.Format(_L("x% 10Fx"), TRealX(6.2345)); + test(aa==_L("x 6.234500x")); + aa.Format(_L("x%+010Fx"), TRealX(6.2345)); + test(aa==_L("x006.234500x")); + aa.Format(_L("x%+10Fx"), TRealX(6.2345)); + test(aa==_L("x 6.234500x")); + aa.Format(_L("x%10Fx"), TRealX(6.2345)); + test(aa==_L("x 6.234500x")); + aa.Format(_L("x%010Fx"), TRealX(6.2345)); + test(aa==_L("x006.234500x")); + aa.Format(_L("x%= 10Fx"), TRealX(6.2345)); + test(aa==_L("x 6.234500 x")); + aa.Format(_L("x%10Fx"), TRealX(12345352342.545)); + test(aa==_L("x12,345,352,342.545000x")); + aa.Format(_L("x%20.9Fx"), TRealX(1.0123456789)); + test(aa==_L("x 1.012345679x")); + aa.Format(_L("x%5.1Fx"), TRealX(1.99)); + test(aa==_L("x 2.0x")); +#endif + + aa.Format(_L("x%- 5ex"), 6.2345678); + test(aa==_L("x6.234568E+00x")); + aa.Format(_L("x%+ 5ex"), 6.2345678); + test(aa==_L("x6.234568E+00x")); + aa.Format(_L("x% 5ex"), 6.2345678); + test(aa==_L("x6.234568E+00x")); + aa.Format(_L("x%= 5ex"), 6.2345678); + test(aa==_L("x6.234568E+00x")); + aa.Format(_L("x%- 14ex"), 6.2345); + test(aa==_L("x6.234500E+00 x")); + aa.Format(_L("x%+ 14ex"), 6.2345); + test(aa==_L("x 6.234500E+00x")); + aa.Format(_L("x% 14ex"), 6.2345); + test(aa==_L("x 6.234500E+00x")); + aa.Format(_L("x%= 14ex"), 6.2345); + test(aa==_L("x 6.234500E+00 x")); + aa.Format(_L("x%10ex"), 12345352342.545); + test(aa==_L("x1.234535E+10x")); + aa.Format(_L("x%20.9ex"), 1.0123456789); + test(aa==_L("x 1.012345679E+00x")); + aa.Format(_L("x%5.1ex"), 1.99); + test(aa==_L("x2.0E+00x")); + } + + +class TO8 : public TDes8Overflow + { +public: + virtual void Overflow(TDes8 &aDes); + }; + +void TO8::Overflow(TDes8 &aDes) + { + aDes=_L8("OVERFLOW"); + } + +class TO8L : public TDes8Overflow + { +public: + virtual void Overflow(TDes8 &aDes); + }; + +void TO8L::Overflow(TDes8 &/*aDes*/) + { + User::Leave(KErrOverflow); + } + +class TO16 : public TDes16Overflow + { +public: + virtual void Overflow(TDes16 &aDes); + }; + +void TO16::Overflow(TDes16 &aDes) + { + aDes=_L16("OVERFLOW"); + } + +class TO16L : public TDes16Overflow + { +public: + virtual void Overflow(TDes16 &aDes); + }; + +void TO16L::Overflow(TDes16 &/*aDes*/) + { + User::Leave(KErrOverflow); + } + +void append8(TDes8 &aBuf, TDes8Overflow *aHandler, TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + aBuf.AppendFormatList(aFmt, list, aHandler); + } + +void append16(TDes16 &aBuf, TDes16Overflow *aHandler, TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + aBuf.AppendFormatList(aFmt, list, aHandler); + } + +void testOverflow() + { + test.Start(_L("Test no overflow")); + TBuf8<16> buf=_L8("A "); + append8(buf, NULL, _L8("Descriptor")); + test(buf==_L8("A Descriptor")); + + test.Printf(_L("Use a non-leaving overflow handler\n")); + test.Next(_L("Force overflow with no conversions")); + TO8 overflow; + append8(buf, &overflow, _L8("12345678901234567")); + test(buf==_L8("OVERFLOW")); + + test.Next(_L("Force overflow with decimal conversion")); + buf=_L8("A Descriptor"); + append8(buf, &overflow, _L8("%d"), 12345678); + test(buf==_L8("OVERFLOW")); + + test.Printf(_L("Use a leaving overflow handler\n")); + test.Next(_L("AppendFormatList with no overflow")); + buf=_L8("A Descriptor"); + TO8L overflowLeave; + TRAPD(r, append8(buf, &overflowLeave, _L8("ONE"))); + test(r==KErrNone); + test(buf==_L8("A DescriptorONE")); + test.Next(_L("Force overflow with hexadecimal conversion")); + buf=_L8("A Descriptor"); + TRAP(r, append8(buf, &overflowLeave, _L8("%08x"), 0)); + test(r==KErrOverflow); + { + test.Printf(_L("Repeat tests with TBuf16\n")); + test.Next(_L("Test no overflow")); + TBuf16<16> buf=_L16("A "); + append16(buf, NULL, _L16("Descriptor")); + test(buf==_L16("A Descriptor")); + + test.Printf(_L("Use a non-leaving overflow handler\n")); + test.Next(_L("Force overflow with no conversions")); + TO16 overflow; + append16(buf, &overflow, _L16("12345678901234567")); + test(buf==_L16("OVERFLOW")); + + test.Next(_L("Force overflow with decimal conversion")); + buf=_L16("A Descriptor"); + append16(buf, &overflow, _L16("%d"), 12345678); + test(buf==_L16("OVERFLOW")); + + test.Printf(_L("Use a leaving overflow handler\n")); + test.Next(_L("AppendFormatList with no overflow")); + buf=_L16("A Descriptor"); + TO16L overflowLeave; + TRAPD(r, append16(buf, &overflowLeave, _L16("ONE"))); + test(r==KErrNone); + test(buf==_L16("A DescriptorONE")); + test.Next(_L("Force overflow with hexadecimal conversion")); + buf=_L16("A Descriptor"); + TRAP(r, append16(buf, &overflowLeave, _L16("%08x"), 0)); + test(r==KErrOverflow); + } + test.End(); + } + +void testIgnoreOverflow() + { + test.Start(_L("Test no overflow")); + TBuf8<16> buf=_L8("A "); + append8(buf, NULL, _L8("Descriptor")); + test(buf==_L8("A Descriptor")); + + test.Printf(_L("Use a non-leaving overflow handler\n")); + test.Next(_L("Force overflow with no conversions")); + TDes8IgnoreOverflow overflow; + append8(buf, &overflow, _L8("12345678901234567")); + test(buf==_L8("A Descriptor1234")); + + test.Next(_L("Force overflow with decimal conversion")); + buf=_L8("A Descriptor"); + append8(buf, &overflow, _L8("%d"), 123456789); + test(buf==_L8("A Descriptor")); + + //test.Printf(_L("Repeat tests with TBuf16\n")); + test.Next(_L("Test no overflow")); + TBuf16<17> buf2=_L16("A "); + append16(buf2, NULL, _L16("Descriptor")); + test(buf2==_L16("A Descriptor")); + + test.Printf(_L("Use a non-leaving overflow handler\n")); + test.Next(_L("Force overflow with no conversions")); + TDes16IgnoreOverflow overflow2; + append16(buf2, &overflow2, _L16("12345678901234567")); + test(buf2==_L16("A Descriptor12345")); + + test.Next(_L("Force overflow with decimal conversion")); + buf2=_L16("A Descriptor"); + append16(buf2, &overflow2, _L16("%d"), 123456789); + test(buf2==_L16("A Descriptor")); + + test.End(); + } + +void testAppendFormatIgnoreOverflow() + { + test.Start(_L("Test no overflow")); + TBuf8<16> buf; + buf.AppendFormat(_L8("A Descriptor")); + test(buf==_L8("A Descriptor")); + + test.Next(_L("Force overflow with no conversions")); + TDes8IgnoreOverflow overflow; + buf.AppendFormat(_L8("123456789012345679"),&overflow); + test(buf==_L8("A Descriptor1234")); + + test.Next(_L("Force overflow with decimal conversion")); + buf = _L8("Symbian OS"); + buf.AppendFormat(_L8("%d"), &overflow, 1234567); + test(buf==_L8("Symbian OS")); + + test.Next(_L("Test no overflow")); + TBuf16<16> buf2; + buf2.AppendFormat(_L16("A Descriptor")); + test(buf2==_L16("A Descriptor")); + + test.Next(_L("Force overflow with no conversions")); + TDes16IgnoreOverflow overflow2; + buf2.AppendFormat(_L16("123456789012345679"),&overflow2); + test(buf2==_L16("A Descriptor1234")); + + test.Next(_L("Force overflow with decimal conversion")); + buf2 = _L16("Symbian OS"); + buf2.AppendFormat(_L16("%d"), &overflow2, 1234567); + test(buf2==_L16("Symbian OS")); + + test.End(); + + + } + +// INC061330 AV28Crit: NTT - TInt TDesC16.FindC -method is giving strange output values +// This test should pass with "ELangPrcChinese" locale. +void INC061330() + { + TLanguage defaultLang = User::Language(); + + TInt err = HAL::Set(HAL::ELanguageIndex, ELangPrcChinese); + test(err == KErrNone); + + TBuf<50> libraryName; + + libraryName.Format(_L("ELOCL.%02d"), ELangPrcChinese); + + //Reset the locale + err=UserSvr::ChangeLocale(KNullDesC); + test(err==KErrNone); + + //Now change to chinese locale + err = UserSvr::ChangeLocale(libraryName); + if(err==KErrNotFound) + { + test.Printf(_L("TEST CASE NOT RUN BECAUSE ELangPrcChinese LOCALE NOT FOUND!\n")); + HAL::Set(HAL::ELanguageIndex, defaultLang); + return; + } + test(err == KErrNone); + + TLanguage lang = User::Language(); + test(lang == ELangPrcChinese); + + TInt pos; + _LIT(KBuf, "hello"); + + pos = KBuf().FindC(_L("a")); + test(pos == KErrNotFound); + + pos = KBuf().FindC(_L("zzz")); + test(pos == KErrNotFound); + + pos = KBuf().FindC(_L(".")); + test(pos == KErrNotFound); + + pos = KBuf().FindC(_L(":")); + test(pos == KErrNotFound); + + pos = KBuf().FindC(_L("hela")); + test(pos == KErrNotFound); + + //Reset the locale + err=UserSvr::ChangeLocale(KNullDesC); + test(err==KErrNone); + + //Now revert to the original default english locale + libraryName.Format(_L("ELOCL.%02d"), defaultLang); + test(err == KErrNone); + err = UserSvr::ChangeLocale(libraryName); + test(err == KErrNone); + + lang = User::Language(); + test(lang == defaultLang); + } +#ifndef _DEBUG +#pragma warning( disable : 4702) //Unreachable code +#pragma warning( disable : 4710) //Function not expanded +#endif +GLDEF_C TInt E32Main() +// Test the TBuf type. + { + test.Title(); + + test.Start(_L("class TBuf16<0x50>")); + TestTBuf,TText16,TPtrC16> c(0x50); + c.test_TBuf(); + + test.Next(_L("class TBuf8<0x50>")); + TestTBuf,TText8,TPtrC8> b(0x50); + b.test_TBuf(); + + test.Next(_L("class TBuf<0x50>")); + TestTBuf,TText,TPtrC> a(0x50); + a.test_TBuf(); + + test.Next(_L("TReal formating")); + testFormat(); + + test.Next(_L("Test overflow handler")); + testOverflow(); + + test.Next(_L("Test ignore overflow handler")); + testIgnoreOverflow(); + + test.Next(_L("Test Format ignore overflow handler")); + testAppendFormatIgnoreOverflow(); + + test.Next(_L("INC061330")); + INC061330(); + + test.End(); + + return(KErrNone); + } + +//#pragma warning( default : 4702) +//#pragma warning( default : 4710) + + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_char.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_char.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1537 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_char.cpp +// Overview: +// Test TChar, TCharF, TChaLC and TCharUC character classes. +// API Information: +// TChar, TCharF, TChaLC, TCharUC. +// Details: +// - For different characters +// - Verify character's standard category information +// - CR1080 verification of standard category information for additional Indic characters +// - Verify character's bi-directional Unicode character category. +// - Check if character is printable. +// - Check if character is a graphical character. +// - Verify for Chinese, Japanese, Korean (CJK) notional width. +// - Verify that it is upper case, lower case form. +// - Verify character's title case. +// - Verify mirrored property of character. +// - Verify integer numeric property of character. +// - Verify character can be decomposed. +// - For different unicode strings, verify unicode collation +// - Compare data of two descriptors using the different collation methods and +// check results are as expected. +// - Call the methods in the TChar, TCharF, TCharUC and TCharUC +// - For TChar, TCharF, TChaLC, TCharUC +// - Check the constructor and operators are as expected. +// - Check folded character is same when it is converted to folded uppercase. +// - Check folded and uppercase character is same when it is converted to +// uppercase letter stripped of accents. +// - Convert lowercase, uppercase characters to it's lowercase form, check the conversion +// is as expected, and lowercase characters are unchanged. +// - Convert lowercase, uppercase characters to it's uppercase form, check the conversion +// is as expected, and uppercase characters are unchanged. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include + +#ifdef __VC32__ + // Solve compilation problem caused by non-English locale + #pragma setlocale("english") +#endif + +LOCAL_D RTest test(_L("T_CHAR")); + +enum + { + Ydieresis=0x178, + nobreakspace=160, + exclamdown, + cent, + sterling, + currency, + yen, + brokenbar, + section, + dieresis, + copyright, + ordfeminine, + leftdoubleanglequote, + logicalnot, + softhyphen, + registered, + macron, + degree, + plusminus, + twosuperior, + threesuperior, + acute, + micro, + pilcrow, + dotaccent, + cedilla, + onesuperior, + ordmasculine, + rightdoubleanglequote, + onequarter, + onehalf, + threequarters, + questiondown, + Agrave, + Aacute, + Acircumflex, + Atilde, + Adieresis, + Aring, + AE, + Ccedilla, + Egrave, + Eacute, + Ecircumflex, + Edieresis, + Igrave, + Iacute, + Icircumflex, + Idieresis, + Eth, + Ntilde, + Ograve, + Oacute, + Ocircumflex, + Otilde, + Odieresis, + multiplication, + Oslash, + Ugrave, + Uacute, + Ucircumflex, + Udieresis, + Yacute, + Thorn, + germanbls, + agrave, + aacute, + acircumflex, + atilde, + adieresis, + aring, + ae, + ccedilla, + egrave, + eacute, + ecircumflex, + edieresis, + igrave, + iacute, + icircumflex, + idieresis, + eth, + ntilde, + ograve, + oacute, + ocircumflex, + otilde, + odieresis, + division, + oslash, + ugrave, + uacute, + ucircumflex, + udieresis, + yacute, + thorn, + ydieresis, + Dzcaron = 0x01C5, + Lj = 0x01C8, + Udearesismacron = 0x01D5, + Adotabove = 0x01E0, + AEmacron = 0x01E2, + aringacute = 0x01FB, + scommabelow = 0x0219, + Otildemacron = 0x022C, + Cstroke = 0x023B, + doubleprime = 0x02BA, + lowleftarrow = 0x02FF, + candrabindu = 0x0310, + doublerightwardsarrowbelow = 0x0362, + latinsmalla = 0x0363 + }; + +struct TCharDump + { + TUint iChar; + }; + +/*EXPORT_C*/ void TChar::__DbgTest(void* pTCharDump) const + { + ((TCharDump*)pTCharDump)->iChar=iChar; + } + +typedef enum {eTChar, eTCharF, eTCharC, eTCharLC, eTCharUC} TCharTypes; + +template +class TestTChar + { +public: + void Test1(); + void Test2(TCharTypes); + void Test3(TCharTypes); + void Test4(TCharTypes); + }; + +template +GLDEF_C void TestTChar::Test1() +// Test that the methods are in the DLL + { + test.Start(_L("Test methods are in DLL - TChar")); + TChar a('X'); + TUint TU=0; + TChar b(TU); + TChar c(b); + + c=TU; + c=a; + c-=TU; + c+=TU; + c-TU; + c+TU; + c=(TUint)(a); + + a.Fold(); + a.LowerCase(); + a.UpperCase(); + a.Eos(); + a.IsLower(); + a.IsUpper(); + a.IsAlpha(); + a.IsDigit(); + a.IsAlphaDigit(); + a.IsHexDigit(); + a.IsSpace(); + a.IsPunctuation(); + a.IsGraph(); + a.IsPrint(); +// a.SetChar(TU); protected + + test.Next(_L("Test methods are in DLL - TCharF")); + TCharF d(TU); + TCharF e(a); + e=d; + e=TU; + e=a; + + test.Next(_L("Test methods are in DLL - TCharLC")); + TCharLC h(TU); + TCharLC i(a); + h=i; + h=TU; + h=a; + + test.Next(_L("Test methods are in DLL - TCharUC")); + TCharUC j(TU); + TCharUC k(a); + k=j; + k=TU; + k=a; + test.End(); + } + + +//********************************* +// Test the constructors +//********************************* +template +GLDEF_C void TestTChar::Test2(TCharTypes CharType) + { + test.Start(_L("Test constructors")); + TCharDump dump; + TCharType b('x'); + b.__DbgTest(&dump); + switch(CharType) + { + case eTChar: + case eTCharLC: + test(dump.iChar=='x'); + break; + case eTCharUC: + test(dump.iChar=='X'); + break; + case eTCharF: + case eTCharC: + test(dump.iChar == 'x'); + } + test.End(); + } + + +//********************************* +// Test the operators +//********************************* +template +GLDEF_C void TestTChar::Test3(TCharTypes CharType) + { + test.Start(_L("Test the operators")); + test.Next(_L("=")); + TCharDump dump; + TUint TUx='x', TUX='X'; + TChar TCy='y', TCY='Y'; + TCharType aChar('m'); + + aChar=TUx; + aChar.__DbgTest(&dump); + switch(CharType) + { + case eTChar: + case eTCharLC: test(dump.iChar=='x'); break; + case eTCharUC: test(dump.iChar=='X'); break; + case eTCharF: + case eTCharC: + test(dump.iChar == 'x'); + } + + aChar=TUX; + aChar.__DbgTest(&dump); + switch(CharType) + { + case eTCharLC: test(dump.iChar=='x'); break; + case eTChar: + case eTCharUC: test(dump.iChar=='X'); break; + case eTCharF: + case eTCharC: + test(dump.iChar == 'x'); + } + + aChar=TCy; + aChar.__DbgTest(&dump); + switch(CharType) + { + case eTChar: + case eTCharLC: test(dump.iChar=='y'); break; + case eTCharUC: test(dump.iChar=='Y'); break; + case eTCharF: + case eTCharC: + test(dump.iChar == 'y'); + } + + aChar=TCY; + aChar.__DbgTest(&dump); + switch(CharType) + { + case eTCharLC: test(dump.iChar=='y'); break; + case eTChar: + case eTCharUC: test(dump.iChar=='Y'); break; + case eTCharF: + case eTCharC: + test(dump.iChar == 'y'); + } + + + test.Next(_L("-=, +=, -, + and cast")); + TCharType x(10); + x-=5; + x.__DbgTest(&dump); + test(dump.iChar==5); + + x+=5; + x.__DbgTest(&dump); + test(dump.iChar==10); + + test((x-(TUint)5)==5); + x.__DbgTest(&dump); + test(dump.iChar==10); + + test((x+(TUint)5)==15); + x.__DbgTest(&dump); + test(dump.iChar==10); + + TChar z('a'); + TUint w=z; + test(w==97); + + test.End(); + } + + +////////////////////////////////////////////// +// Test Fold, Fold(TChar::EFoldAccents), Collate, LowerCase, UpperCase +//////////////////////////////////////////// +template +GLDEF_C void TestTChar::Test4(TCharTypes CharType) + { + test.Start(_L("Fold(), Fold(TChar::EFoldAccents), Collate(), LowerCase() UpperCase() & Eos()")); + TCharDump dump1, dump2; + TCharType c(0); + + // Is the folded version the same as the folded uppercase version? + test.Next(_L("Fold() 0-127")); + TUint i; + for(i=0; i<=127; i++) + { + c = i; + c.Fold(); + c.__DbgTest(&dump1); + c.UpperCase(); + c.Fold(); + c.__DbgTest(&dump2); + test(dump1.iChar == dump2.iChar); + } + + // Is the folded and uppercased version the same as an uppercase letter stripped of accents? + test.Next(_L("Fold() >127")); + for(i=128; i<=255; i++) + { + c=i; + c.Fold(); + c.UpperCase(); + c.__DbgTest(&dump1); + if(CharType==eTChar) + { + switch(i) + { + case ccedilla: + case Ccedilla: + test(dump1.iChar=='C'); + break; + + case udieresis: + case ucircumflex: + case ugrave: + case uacute: + case Udieresis: + case Ucircumflex: + case Ugrave: + case Uacute: + test(dump1.iChar=='U'); + break; + + case ydieresis: + case yacute: + case Yacute: + test(dump1.iChar=='Y'); + break; + + case ecircumflex: + case edieresis: + case egrave: + case eacute: + case Ecircumflex: + case Edieresis: + case Egrave: + case Eacute: + test(dump1.iChar=='E'); + break; + + case acircumflex: + case adieresis: + case agrave: + case aacute: + case Acircumflex: + case Adieresis: + case Agrave: + case Aacute: + case atilde: + case Atilde: + case aring: + case Aring: + test(dump1.iChar=='A'); + break; + + case idieresis: + case icircumflex: + case iacute: + case igrave: + case Idieresis: + case Icircumflex: + case Iacute: + case Igrave: + test(dump1.iChar=='I'); + break; + + case ocircumflex: + case odieresis: + case ograve: + case oacute: + case otilde: + case Ocircumflex: + case Odieresis: + case Ograve: + case Oacute: + case Otilde: + test(dump1.iChar=='O'); + break; + + case ntilde: + case Ntilde: + test(dump1.iChar=='N'); break; + + case oslash: + case Oslash: + + test(dump1.iChar==Oslash); break; + + case ae: + case AE: + test(dump1.iChar==AE); break; + + case eth: + case Eth: + test(dump1.iChar==Eth); break; + + case thorn: + case Thorn: + test(dump1.iChar==Thorn); + break; + + case nobreakspace: + test(dump1.iChar == ' '); + break; + + case micro: + test(dump1.iChar == 0x039C); + break; + + default: + test(dump1.iChar==i); + } + } + } + + // In the following test section We test Fold(TChar::EFoldAccents) - This code tests this function for all the + // set of unicode characters located between 0x0080 and 0x00FF which are already tested for Fold(). + // I added to this test 13 unicode character located between 0x01C5 and 0x0363. + + test.Next(_L("Fold(TChar::EFoldAccents) >127")); + for(i=128; i<=255; i++) + { + c=i; + c.Fold(TChar::EFoldAccents); + c.__DbgTest(&dump1); + if(CharType==eTChar) + { + switch(i) + { + case ccedilla: + test(dump1.iChar=='c'); + break; + + case Ccedilla: + test(dump1.iChar=='C'); + break; + + case acircumflex: + case adieresis: + case agrave: + case aacute: + case atilde: + case aring: + case aringacute: + test(dump1.iChar=='a'); + break; + + case Acircumflex: + case Adieresis: + case Agrave: + case Aacute: + case Atilde: + case Aring: + test(dump1.iChar=='A'); + break; + + case udieresis: + case ucircumflex: + case ugrave: + case uacute: + test(dump1.iChar=='u'); + break; + + case Udieresis: + case Ucircumflex: + case Ugrave: + case Uacute: + test(dump1.iChar=='U'); + break; + + case ydieresis: + case yacute: + test(dump1.iChar=='y'); + break; + + case Yacute: + test(dump1.iChar=='Y'); + break; + + case ecircumflex: + case edieresis: + case egrave: + case eacute: + test(dump1.iChar=='e'); + break; + + case Ecircumflex: + case Edieresis: + case Egrave: + case Eacute: + test(dump1.iChar=='E'); + break; + + case idieresis: + case icircumflex: + case iacute: + case igrave: + test(dump1.iChar=='i'); + break; + + case Idieresis: + case Icircumflex: + case Iacute: + case Igrave: + test(dump1.iChar=='I'); + break; + + case ocircumflex: + case odieresis: + case ograve: + case oacute: + case otilde: + test(dump1.iChar=='o'); + break; + + case Ocircumflex: + case Odieresis: + case Ograve: + case Oacute: + case Otilde: + test(dump1.iChar=='O'); + break; + + case ntilde: test(dump1.iChar=='n'); break; + + case Ntilde: test(dump1.iChar=='N'); break; + + case oslash: test(dump1.iChar==oslash); break; + case Oslash: test(dump1.iChar==Oslash); break; + + case ae: test(dump1.iChar==ae); break; + case AE: test(dump1.iChar==AE); break; + + case eth: test(dump1.iChar==eth); break; + case Eth: test(dump1.iChar==Eth); break; + + case thorn: test(dump1.iChar==thorn);break; + case Thorn: test(dump1.iChar==Thorn);break; + + case micro: + test(dump1.iChar == 0x00B5); + break; + + default: + test(dump1.iChar==i); + } + } + } + + TUint specialCasesTable [] = + { + 0x01C5, // Dzcaron + 0x01C8, // Lj + 0x01D5,// Udearesismacron + 0x01E0,// Adotabove + 0x01E2,// AEmacron + 0x0219, // scommabelow + 0x022C,// Otildemacron + 0x023B,// Cstroke + 0x02BA, // doubleprime + 0x02FF,// lowleftarrow + 0x0310, // candrabindu + 0x0362, // doublerightwardsarrowbelow + 0x0363 // latinsmalla + }; + + for (i=0;i<=12; i++) + { + c=specialCasesTable[i]; + c.Fold(TChar::EFoldAccents); + c.__DbgTest(&dump1); + if(CharType==eTChar) + { + switch(specialCasesTable[i]) + { + case Dzcaron : test(dump1.iChar==Dzcaron); break; + case Lj : test(dump1.iChar==Lj); break; + case Udearesismacron : test(dump1.iChar=='U'); break; + case Adotabove : test(dump1.iChar=='A'); break; + case AEmacron : test(dump1.iChar==AE); break; + case scommabelow : test(dump1.iChar=='s'); break; + case Otildemacron : test(dump1.iChar=='O'); break; + case Cstroke : test(dump1.iChar==Cstroke); break; + case doubleprime : test(dump1.iChar==doubleprime); break; + case lowleftarrow : test(dump1.iChar==lowleftarrow); break; + case candrabindu : test(dump1.iChar==candrabindu); break; + case doublerightwardsarrowbelow : test(dump1.iChar==doublerightwardsarrowbelow); break; + case latinsmalla : test(dump1.iChar==latinsmalla); break; + default : test(dump1.iChar==specialCasesTable[i]); + } + } + } + + test.Next(_L("LowerCase() 0-127")); + for(i=0;i<=127; i++) + { + c=i; + if(c.IsUpper()) + { + c.__DbgTest(&dump1); + c.LowerCase(); + c.__DbgTest(&dump2); + test(dump1.iChar==dump2.iChar-32); + } + else + { + c.__DbgTest(&dump1); + c.LowerCase(); + c.__DbgTest(&dump2); + test(dump1.iChar==dump2.iChar); + } + } + + + test.Next(_L("LowerCase() >127")); + for(i=128; i<=255; i++) + { + c=i; + c.LowerCase(); + c.__DbgTest(&dump1); + if(CharType==eTChar) + { + switch(i) + { + case Acircumflex: test(dump1.iChar==acircumflex); break; + case Adieresis: test(dump1.iChar==adieresis); break; + case Agrave: test(dump1.iChar==agrave); break; + case Aacute: test(dump1.iChar==aacute); break; + case Atilde: test(dump1.iChar==atilde); break; + case Aring: test(dump1.iChar==aring); break; + case AE: test(dump1.iChar==ae); break; + case Ccedilla: test(dump1.iChar==ccedilla); break; + case Ecircumflex: test(dump1.iChar==ecircumflex); break; + case Edieresis: test(dump1.iChar==edieresis); break; + case Egrave: test(dump1.iChar==egrave); break; + case Eacute: test(dump1.iChar==eacute); break; + case Eth: test(dump1.iChar==eth); break; + case Icircumflex: test(dump1.iChar==icircumflex); break; + case Idieresis: test(dump1.iChar==idieresis); break; + case Igrave: test(dump1.iChar==igrave); break; + case Iacute: test(dump1.iChar==iacute); break; + case Ntilde: test(dump1.iChar==ntilde); break; + case Oslash: test(dump1.iChar==oslash); break; + case Ocircumflex: test(dump1.iChar==ocircumflex); break; + case Odieresis: test(dump1.iChar==odieresis); break; + case Ograve: test(dump1.iChar==ograve); break; + case Oacute: test(dump1.iChar==oacute); break; + case Otilde: test(dump1.iChar==otilde); break; + case Thorn: test(dump1.iChar==thorn); break; + case Ucircumflex: test(dump1.iChar==ucircumflex); break; + case Udieresis: test(dump1.iChar==udieresis); break; + case Ugrave: test(dump1.iChar==ugrave); break; + case Uacute: test(dump1.iChar==uacute); break; + case Yacute: test(dump1.iChar==yacute); break; + default: test(dump1.iChar==i); + } + } + } + + + test.Next(_L("UpperCase() 0-127")); + for(i=0;i<=127; i++) + { + c=i; + if(c.IsLower()) + { + c.__DbgTest(&dump1); + c.UpperCase(); + c.__DbgTest(&dump2); + test(dump1.iChar==dump2.iChar+32); + } + else + { + c.__DbgTest(&dump1); + c.UpperCase(); + c.__DbgTest(&dump2); + test(dump1.iChar==dump2.iChar); + } + } + + + test.Next(_L("UpperCase() >127")); + for(i=128; i<=255; i++) + { + c=i; + c.UpperCase(); + c.__DbgTest(&dump1); + if(CharType==eTChar) + { + switch(i) + { + case acircumflex: test(dump1.iChar==Acircumflex); break; + case adieresis: test(dump1.iChar==Adieresis); break; + case agrave: test(dump1.iChar==Agrave); break; + case aacute: test(dump1.iChar==Aacute); break; + case atilde: test(dump1.iChar==Atilde); break; + case aring: test(dump1.iChar==Aring); break; + case ae: test(dump1.iChar==AE); break; + case ccedilla: test(dump1.iChar==Ccedilla); break; + case ecircumflex: test(dump1.iChar==Ecircumflex); break; + case edieresis: test(dump1.iChar==Edieresis); break; + case egrave: test(dump1.iChar==Egrave); break; + case eacute: test(dump1.iChar==Eacute); break; + case eth: test(dump1.iChar==Eth); break; + case icircumflex: test(dump1.iChar==Icircumflex); break; + case idieresis: test(dump1.iChar==Idieresis); break; + case igrave: test(dump1.iChar==Igrave); break; + case iacute: test(dump1.iChar==Iacute); break; + case ntilde: test(dump1.iChar==Ntilde); break; + case oslash: test(dump1.iChar==Oslash); break; + case ocircumflex: test(dump1.iChar==Ocircumflex); break; + case odieresis: test(dump1.iChar==Odieresis); break; + case ograve: test(dump1.iChar==Ograve); break; + case oacute: test(dump1.iChar==Oacute); break; + case otilde: test(dump1.iChar==Otilde); break; + case thorn: test(dump1.iChar==Thorn); break; + case ucircumflex: test(dump1.iChar==Ucircumflex); break; + case udieresis: test(dump1.iChar==Udieresis); break; + case ugrave: test(dump1.iChar==Ugrave); break; + case uacute: test(dump1.iChar==Uacute); break; + case yacute: test(dump1.iChar==Yacute); break; + case ydieresis: test(dump1.iChar==Ydieresis); break; + case micro: test(dump1.iChar==0x039C); break; + default: test(dump1.iChar==i); + } + } + } + + test.Next(_L("Eos()")); + c=0; + test(c.Eos()==TRUE); + for(i=1;i<=255;i++) + { + c=i; + test(c.Eos()==FALSE); + } + test.End(); + } + + +//********************************* +// Test the Isxxx functions +//********************************* +// +// Deleted as it can no longer use the C library +// +/* +template +GLDEF_C void TestTChar::Test5(TCharTypes CharType) + { + test.Start(_L("Isxxxxx()")); + test.End(); + } +*/ + +#ifndef _DEBUG +#pragma warning (disable :4710) //Function not expanded +#pragma warning (disable :4700) //Local variable used without being initialized +#endif + +/* +Put all the information about a character into a string. This can then be compared with +a previously verified string to test the character classification functions. + +To keep the string short, only non-default information is appended, except for the first +attribute, the category. + +The format is: + +1. The two-letter Unicode category code: e.g., Lu for an uppercase letter, Nd for a digit, etc. +2. If the bidirectional category is not TChar::ELeftToRight, ' b=' then the one or two-letter code. +3. If the combining class is not 0, ' c=' then the combining class number in decimal. +4. If the uppercase form is different from the character code, ' u=' then the uppercase form in hex. +5. If the titlecase form is different from the character code, ' t=' then the titlecase form in hex. +6. If the lowercase form is different from the character code, ' l=' then the lowercase form in hex. +** REMOVED ** 7. If the folded form is different from the character code, ' f=' then the folded form in hex. +8. If the character has the mirrored property, ' m'. +9. If the character has a numeric value, ' n=' then the numeric value in decimal, or -2 for fractions. +10. If the CJK width is not neutral, ' w=' then 1 for halfwidth, 2 for fullwidth, 3 for narrow, 4 for wide +11. If there is a canonical decomposition, ' d=' then the characters of the decomposition in hex, comma-separated. +*/ +void char_info_to_string(TDes16& info,TUint16 x) + { + TChar c(x); + + TChar::TCharInfo ci; + c.GetInfo(ci); + + TBuf<16> cat; + switch (ci.iCategory) + { + case TChar::ELuCategory: cat = _L("Lu"); break; + case TChar::ELlCategory: cat = _L("Ll"); break; + case TChar::ELtCategory: cat = _L("Lt"); break; + case TChar::ELoCategory: cat = _L("Lo"); break; + case TChar::ELmCategory: cat = _L("Lm"); break; + case TChar::EMnCategory: cat = _L("Mn"); break; + case TChar::EMcCategory: cat = _L("Mc"); break; + case TChar::ENdCategory: cat = _L("Nd"); break; + case TChar::ENlCategory: cat = _L("Nl"); break; + case TChar::ENoCategory: cat = _L("No"); break; + case TChar::EPdCategory: cat = _L("Pd"); break; + case TChar::EPsCategory: cat = _L("Ps"); break; + case TChar::EPeCategory: cat = _L("Pe"); break; + case TChar::EPoCategory: cat = _L("Po"); break; + case TChar::EPiCategory: cat = _L("Pi"); break; + case TChar::EPfCategory: cat = _L("Pf"); break; + case TChar::ESmCategory: cat = _L("Sm"); break; + case TChar::EScCategory: cat = _L("Sc"); break; + case TChar::ESoCategory: cat = _L("So"); break; + case TChar::EZsCategory: cat = _L("Zs"); break; + case TChar::EZlCategory: cat = _L("Zl"); break; + case TChar::EZpCategory: cat = _L("Zp"); break; + case TChar::ECcCategory: cat = _L("Cc"); break; + case TChar::ECoCategory: cat = _L("Co"); break; + case TChar::ECnCategory: cat = _L("Cn"); break; + default: User::Panic(_L("bad char category"),0); break; + } + info.Append(cat); + + TBuf<16> bdcat; + switch (ci.iBdCategory) + { + case TChar::ELeftToRight: bdcat=_L("L"); break; + case TChar::ELeftToRightEmbedding: bdcat=_L("LRE"); break; + case TChar::ELeftToRightOverride: bdcat=_L("LRO"); break; + case TChar::ERightToLeft: bdcat=_L("R"); break; + case TChar::ERightToLeftArabic: bdcat=_L("AL"); break; + case TChar::ERightToLeftEmbedding: bdcat=_L("RLE"); break; + case TChar::ERightToLeftOverride: bdcat=_L("RLO"); break; + case TChar::EPopDirectionalFormat: bdcat=_L("PDF"); break; + case TChar::EEuropeanNumber: bdcat=_L("EN"); break; + case TChar::EEuropeanNumberSeparator: bdcat=_L("ES"); break; + case TChar::EEuropeanNumberTerminator: bdcat=_L("ET"); break; + case TChar::EArabicNumber: bdcat=_L("AN"); break; + case TChar::ECommonNumberSeparator: bdcat=_L("CS"); break; + case TChar::ENonSpacingMark: bdcat=_L("NSM"); break; + case TChar::EBoundaryNeutral: bdcat=_L("BN"); break; + case TChar::EParagraphSeparator: bdcat=_L("B"); break; + case TChar::ESegmentSeparator: bdcat=_L("S"); break; + case TChar::EWhitespace: bdcat=_L("WS"); break; + case TChar::EOtherNeutral: bdcat=_L("ON"); break; + default: User::Panic(_L("bad bd category"),0); break; + } + if (ci.iBdCategory != TChar::ELeftToRight) + { + info.Append(_L(" b=")); + info.Append(bdcat); + } + + if (ci.iCombiningClass != 0) + { + info.Append(_L(" c=")); + info.AppendNum(ci.iCombiningClass); + } + + if (ci.iUpperCase != x) + { + info.Append(_L(" u=")); + info.AppendNum(ci.iUpperCase,EHex); + } + + if (ci.iTitleCase != x) + { + info.Append(_L(" t=")); + info.AppendNum(ci.iTitleCase,EHex); + } + + if (ci.iLowerCase != x) + { + info.Append(_L(" l=")); + info.AppendNum(ci.iLowerCase,EHex); + } + + if (ci.iMirrored) + info.Append(_L(" m")); + + if (ci.iNumericValue != -1) + { + info.Append(_L(" n=")); + info.AppendNum(ci.iNumericValue); + } + + switch (c.GetCjkWidth()) + { + case TChar::EHalfWidth: info.Append(_L(" w=1")); break; + case TChar::EFullWidth: info.Append(_L(" w=2")); break; + case TChar::ENarrow: info.Append(_L(" w=3")); break; + case TChar::EWide: info.Append(_L(" w=4")); break; + default: break; + } + + TPtrC16 d; + if (c.Decompose(d)) + { + info.Append(_L(" d=")); + for (int i = 0; i < d.Length(); i++) + { + info.AppendNum((TUint)d[i],EHex); + if (i < d.Length() - 1) + info.Append(','); + } + } + + if (!c.IsPrint()) + info.Append(_L(" np")); + if (!c.IsGraph()) + info.Append(_L(" ng")); + } + +void test_unicode_char(TUint16 c,const TDesC& desired_info,const TDesC& name) + { + test.Next(name); + TBuf<128> info; + char_info_to_string(info,c); +// test.Printf(_L("code=0x%x desired='%S' actual='%S'\n"),c,&desired_info,&info); +// if (info != desired_info) +// test.Printf(_L(" (mismatch!)\n")); + test(info == desired_info); + } + +void test_unicode_chars() + { + test_unicode_char(0x0000,_L("Cc b=BN np ng"),_L("NULL")); + test_unicode_char(0x000A,_L("Cc b=B np ng"),_L("linefeed")); + test_unicode_char(0x0020,_L("Zs b=WS w=3 ng"),_L("space")); + test_unicode_char(0x0028,_L("Ps b=ON m w=3"),_L("(")); + test_unicode_char(0x0038,_L("Nd b=EN n=8 w=3"),_L("8")); + test_unicode_char(0x0040,_L("Po b=ON w=3"),_L("@")); + test_unicode_char(0x0062,_L("Ll u=42 w=3"),_L("b")); + test_unicode_char(0x0042,_L("Lu l=62 w=3"),_L("B")); + test_unicode_char(0x0067,_L("Ll u=47 w=3"),_L("g")); + test_unicode_char(0x0047,_L("Lu l=67 w=3"),_L("G")); + test_unicode_char(0x0077,_L("Ll u=57 w=3"),_L("w")); + test_unicode_char(0x0057,_L("Lu l=77 w=3"),_L("W")); + test_unicode_char(0x00A0,_L("Zs b=CS ng"),_L("non-break space")); + test_unicode_char(0x00BC,_L("No b=ON n=-2"),_L("1/4")); + test_unicode_char(0x00DD,_L("Lu l=fd d=59,301"),_L("Y acute")); + test_unicode_char(0x00FF,_L("Ll u=178 d=79,308"),_L("y umlaut")); + test_unicode_char(0x0178,_L("Lu l=ff d=59,308"),_L("Y umlaut")); + test_unicode_char(0x01C4,_L("Lu t=1c5 l=1c6"),_L("DZ caron")); + test_unicode_char(0x01C5,_L("Lt u=1c4 l=1c6"),_L("Dz caron")); + test_unicode_char(0x01C6,_L("Ll u=1c4 t=1c5"),_L("dz caron")); + test_unicode_char(0x022A,_L("Lu l=22b d=4f,308,304"),_L("O with diaeresis and macron")); + test_unicode_char(0x0267,_L("Ll"),_L("latin small letter heng with hook")); + test_unicode_char(0x02b0,_L("Lm"),_L("modifier letter small h")); + test_unicode_char(0x030a,_L("Mn b=NSM c=230"),_L("combining ring above")); + test_unicode_char(0x03a8,_L("Lu l=3c8"),_L("Greek Psi")); + test_unicode_char(0x03c8,_L("Ll u=3a8"),_L("Greek psi")); + test_unicode_char(0x0401,_L("Lu l=451 d=415,308"),_L("Cyrillic IO")); + test_unicode_char(0x0451,_L("Ll u=401 d=435,308"),_L("Cyrillic io")); + test_unicode_char(0x04e0,_L("Lu l=4e1"),_L("Cyrillic Abkhasian Dze")); + test_unicode_char(0x04e1,_L("Ll u=4e0"),_L("Cyrillic Abkhasian dze")); + test_unicode_char(0x05A8,_L("Mn b=NSM c=230"),_L("Hebrew accent qadma")); + test_unicode_char(0x05D2,_L("Lo b=R"),_L("Hebrew letter gimel")); + test_unicode_char(0x05F0,_L("Lo b=R"),_L("Hebrew ligature Yiddish double vav")); + test_unicode_char(0x0627,_L("Lo b=AL"),_L("Arabic letter alef")); + test_unicode_char(0x0660,_L("Nd b=AN n=0"),_L("Arabic-Indic digit 0")); + test_unicode_char(0x0669,_L("Nd b=AN n=9"),_L("Arabic-Indic digit 9")); + test_unicode_char(0x06F4,_L("Nd b=EN n=4"),_L("Extended Arabic-Indic digit 4")); + test_unicode_char(0x0B9C,_L("Lo"),_L("Tamil letter ja")); + test_unicode_char(0x0BCD,_L("Mn b=NSM c=9"),_L("Tamil sign virama")); + test_unicode_char(0x0BF0,_L("No n=10"),_L("Tamil number 10")); + test_unicode_char(0x0BF1,_L("No n=100"),_L("Tamil number 100")); + test_unicode_char(0x0BF2,_L("No n=1000"),_L("Tamil number 1000")); + test_unicode_char(0x0E3F,_L("Sc b=ET"),_L("Thai currency symbol baht")); + test_unicode_char(0x0ED5,_L("Nd n=5"),_L("Lao digit 5")); + test_unicode_char(0x104E,_L("Po"),_L("Myanmar symbol aforementioned")); + test_unicode_char(0x124B,_L("Lo"),_L("Ethiopic syllable QWAA")); + test_unicode_char(0x137C,_L("No n=10000"),_L("Ethiopic number 10000")); + test_unicode_char(0x217F,_L("Nl u=216f n=1000"),_L("small Roman numeral 1000")); + test_unicode_char(0x2180,_L("Nl n=1000"),_L("Roman numeral 1000 CD")); + test_unicode_char(0x2181,_L("Nl n=5000"),_L("Roman numeral 5000")); + test_unicode_char(0x2182,_L("Nl n=10000"),_L("Roman numeral 10000")); + test_unicode_char(0x2208,_L("Sm b=ON m"),_L("element of")); + test_unicode_char(0x2248,_L("Sm b=ON m"),_L("almost equal to")); + test_unicode_char(0x3000,_L("Zs b=WS w=4 ng"),_L("ideographic space")); + test_unicode_char(0x3030,_L("Pd b=ON w=4"),_L("wavy dash")); + test_unicode_char(0x305F,_L("Lo w=4"),_L("Hiragana ta")); + test_unicode_char(0x3060,_L("Lo w=4 d=305f,3099"),_L("Hiragana da")); + test_unicode_char(0x3099,_L("Mn b=NSM c=8 w=4"),_L("combining Katakana-Hiragana voiced sound mark")); + test_unicode_char(0x30B3,_L("Lo w=4"),_L("Katakana ko")); + test_unicode_char(0x30B4,_L("Lo w=4 d=30b3,3099"),_L("Katakana go")); + test_unicode_char(0x51FF,_L("Lo w=4"),_L("CJK ideograph 51FF")); + test_unicode_char(0x52FF,_L("Lo w=4"),_L("CJK ideograph 52FF")); + test_unicode_char(0xCEFF,_L("Lo w=4"),_L("Hangul syllable CEFF")); + test_unicode_char(0xFF17,_L("Nd b=EN n=7 w=2"),_L("fullwidth digit 7")); + test_unicode_char(0xFF33,_L("Lu l=ff53 w=2"),_L("fullwidth S")); + test_unicode_char(0xFF53,_L("Ll u=ff33 w=2"),_L("fullwidth s")); + test_unicode_char(0xFF85,_L("Lo w=1"),_L("halfwidth Katakana na")); + test_unicode_char(0xFFE1,_L("Sc b=ET w=2"),_L("fullwidth pound sign")); + test_unicode_char(0xE000, _L("Co"), _L("End user private use character")); + test_unicode_char(0xE3FF, _L("Co"), _L("End user private use character")); + test_unicode_char(0xE400, _L("Co"), _L("Corporate private use character")); + test_unicode_char(0xF6DA, _L("Co np ng"), _L("Corporate private use character - Java string marker")); + test_unicode_char(0xF6DB, _L("Co"), _L("Corporate private use character - Replacement character")); + test_unicode_char(0xF6DC, _L("Co np ng"), _L("Corporate private use character - switch to next")); + test_unicode_char(0xF6DD, _L("Co np ng"), _L("Corporate private use character - switch to previous")); + test_unicode_char(0xF6DB, _L("Co"), _L("Corporate private use character - Latin superscript y")); + test_unicode_char(0xF6FF, _L("Co"), _L("Corporate private use character - Alarm bell")); + test_unicode_char(0xF700, _L("Co np ng"), _L("Corporate private use character - Key code")); + test_unicode_char(0xF8FF, _L("Co np ng"), _L("Corporate private use character - Key code")); + + // CR1080 - Testing additional Indic Chars + // Test properties of new Indic characters added in CR1080, and also the properties of + // existing characters immediately preceding and proceding the new characters, to test + // for any regression. + test_unicode_char(0x0903, _L("Mc"), _L("DEVANAGARI SIGN VISARGA")); // Existing + test_unicode_char(0x0904, _L("Lo"), _L("DEVANAGARI LETTER SHORT A")); // New + test_unicode_char(0x0905, _L("Lo"), _L("DEVANAGARI LETTER A")); // Existing + + test_unicode_char(0x0970, _L("Po"), _L("DEVANAGARI ABBREVIATION SIGN")); // Existing + test_unicode_char(0x097B, _L("Lo"), _L("DEVANAGARI LETTER GGA")); // New + test_unicode_char(0x097C, _L("Lo"), _L("DEVANAGARI LETTER JJA")); // New + test_unicode_char(0x097D, _L("Lo"), _L("DEVANAGARI LETTER GLOTTAL STOP")); // New + test_unicode_char(0x097E, _L("Lo"), _L("DEVANAGARI LETTER DDDA")); // New + test_unicode_char(0x097F, _L("Lo"), _L("DEVANAGARI LETTER BBA")); // New + test_unicode_char(0x0981, _L("Mn b=NSM"), _L("BENGALI SIGN CANDRABINDU")); // Existing + + test_unicode_char(0x09BC, _L("Mn b=NSM c=7"), _L("BENGALI SIGN NUKTA")); // Existing + test_unicode_char(0x09BD, _L("Lo"), _L("BENGALI SIGN AVAGRAHA")); // New + test_unicode_char(0x09BE, _L("Mc"), _L("BENGALI VOWEL SIGN AA")); // Existing + + test_unicode_char(0x09CD, _L("Mn b=NSM c=9"), _L("BENGALI SIGN VIRAMA")); // Existing + test_unicode_char(0x09CE, _L("Lo"), _L("BENGALI LETTER KHANDA TA")); // New + test_unicode_char(0x09D7, _L("Mc"), _L("BENGALI AU LENGTH MARK")); // Existing + + test_unicode_char(0x09FA, _L("So"), _L("BENGALI ISSHAR")); // Existing + test_unicode_char(0x0A01, _L("Mn b=NSM"), _L("GURMUKHI SIGN ADAK BINDI")); // New + test_unicode_char(0x0A02, _L("Mn b=NSM"), _L("GURMUKHI SIGN BINDI")); // Existing + test_unicode_char(0x0A03, _L("Mc"), _L("GURMUKHI SIGN VISARGA")); // New + test_unicode_char(0x0A05, _L("Lo"), _L("GURMUKHI LETTER A")); // Existing + + test_unicode_char(0x0A8B, _L("Lo"), _L("GUJARATI LETTER VOCALIC R")); // Existing + test_unicode_char(0x0A8C, _L("Lo"), _L("GUJARATI LETTER VOCALIC L")); // New + test_unicode_char(0x0A8D, _L("Lo"), _L("GUJARATI VOWEL CANDRA E")); // Existing + + test_unicode_char(0x0AE0, _L("Lo"), _L("GUJARATI LETTER VOCALIC RR")); // Existing + test_unicode_char(0x0AE1, _L("Lo"), _L("GUJARATI LETTER VOCALIC LL")); // New + test_unicode_char(0x0AE2, _L("Mn b=NSM"), _L("GUJARATI VOWEL SIGN VOCALIC L")); // New + test_unicode_char(0x0AE3, _L("Mn b=NSM"), _L("GUJARATI VOWEL SIGN VOCALIC LL")); // New + test_unicode_char(0x0AE6, _L("Nd n=0"), _L("GUJARATI DIGIT ZERO")); // Existing + + test_unicode_char(0x0AEF, _L("Nd n=9"), _L("GUJARATI DIGIT NINE")); // Existing + test_unicode_char(0x0AF1, _L("Sc b=ET"), _L("GUJARATI RUPEE SIGN")); // New + test_unicode_char(0x0B01, _L("Mn b=NSM"), _L("ORIYA SIGN CANDRABINDU")); // Existing + + test_unicode_char(0x0B33, _L("Lo"), _L("ORIYA LETTER LLA")); // Existing + test_unicode_char(0x0B35, _L("Lo"), _L("ORIYA LETTER VA")); // New + test_unicode_char(0x0B36, _L("Lo"), _L("ORIYA LETTER SHA")); // Existing + + test_unicode_char(0x0B70, _L("So"), _L("ORIYA ISSHAR")); // Existing + test_unicode_char(0x0B71, _L("Lo"), _L("ORIYA LETTER WA")); // New + test_unicode_char(0x0B82, _L("Mn b=NSM"), _L("TAMIL SIGN ANUSVARA")); // Existing + + test_unicode_char(0x0BB5, _L("Lo"), _L("TAMIL LETTER VA")); // Existing + test_unicode_char(0x0BB6, _L("Lo"), _L("TAMIL LETTER SHA")); // New + test_unicode_char(0x0BB7, _L("Lo"), _L("TAMIL LETTER SSA")); // Existing + + test_unicode_char(0x0BD7, _L("Mc"), _L("TAMIL AU LENGTH MARK")); // Existing + test_unicode_char(0x0BE6, _L("Nd n=0"), _L("TAMIL DIGIT ZERO")); // New + test_unicode_char(0x0BE7, _L("Nd n=1"), _L("TAMIL DIGIT ZERO")); // Existing + + test_unicode_char(0x0BF2, _L("No n=1000"), _L("TAMIL NUMBER ONE THOUSAND"));// Existing + test_unicode_char(0x0BF3, _L("So b=ON"), _L("TAMIL DAY SIGN")); // New + test_unicode_char(0x0BF4, _L("So b=ON"), _L("TAMIL MONTH SIGN")); // New + test_unicode_char(0x0BF5, _L("So b=ON"), _L("TAMIL YEAR SIGN")); // New + test_unicode_char(0x0BF6, _L("So b=ON"), _L("TAMIL DEBIT SIGN")); // New + test_unicode_char(0x0BF7, _L("So b=ON"), _L("TAMIL CREDIT SIGN")); // New + test_unicode_char(0x0BF8, _L("So b=ON"), _L("TAMIL AS ABOVE SIGN")); // New + test_unicode_char(0x0BF9, _L("Sc b=ET"), _L("TAMIL RUPEE SIGN")); // New + test_unicode_char(0x0BFA, _L("So b=ON"), _L("TAMIL NUMBER SIGN")); // New + test_unicode_char(0x0C01, _L("Mc"), _L("TELUGU SIGN CANDRABINDU")); // Existing + + test_unicode_char(0x0CB9, _L("Lo"), _L("KANNADA LETTER HA")); // Existing + test_unicode_char(0x0CBC, _L("Mn b=NSM c=7"), _L("KANNADA SIGN NUKTA")); // New + test_unicode_char(0x0CBD, _L("Lo"), _L("KANNADA SIGN AVAGRAHA")); // New + test_unicode_char(0x0CBE, _L("Mc"), _L("KANNADA VOWEL SIGN AA")); // Existing + + test_unicode_char(0x0CE1, _L("Lo"), _L("KANNADA LETTER VOCALIC LL")); // Existing + test_unicode_char(0x0CE2, _L("Mn b=NSM"), _L("KANNADA VOWEL SIGN VOCALIC L")); // New + test_unicode_char(0x0CE3, _L("Mn b=NSM"), _L("KANNADA VOWEL SIGN VOCALIC LL")); // New + test_unicode_char(0x0CE6, _L("Nd n=0"), _L("KANNADA DIGIT ZERO")); // Existing + + test_unicode_char(0x0CEF, _L("Nd n=9"), _L("KANNADA DIGIT NINE")); // Existing + test_unicode_char(0x0CF1, _L("So b=ON"), _L("KANNADA SIGN JIHVAMULIYA")); // New + test_unicode_char(0x0CF2, _L("So b=ON"), _L("KANNADA SIGN UPADHMANIYA")); // New + test_unicode_char(0x0D02, _L("Mc"), _L("MALAYALAM SIGN ANUSVARA")); // Existing + + test_unicode_char(0x0B83, _L("Lo"), _L("TAMIL SIGN VISARGA")); // Modified + test_unicode_char(0x0CBF, _L("Mn"), _L("KANNADA VOWEL SIGN I")); // Modified + test_unicode_char(0x0CC6, _L("Mn"), _L("KANNADA VOWEL SIGN E")); // Modified + } + +void test_unicode_collation(const TDesC& x,const TDesC& y,TInt desired_order, + TInt level = 3,const TCollationMethod* method = NULL) + { + TInt order = x.CompareC(y,level,method); + + // Normalise order to -1, 0 or 1. + if (order < 0) + order = -1; + else if (order > 0) + order = 1; + + test(order == desired_order); + } + +static const TUint32 TheSwedishKey[] = + { + 0x8f60109,0x8f70109,0x8f80109,0x8f60121,0x8f70121,0x8f80121,0x8dd0109,0x8dd0121, + 0x8c50121,0x8c50109, + }; + +static const TUint32 TheSwedishIndex[] = + { + 0x570008,0x770009, + }; + +static const TUint16 TheSwedishStringElement[] = + { + 0x2,0x61,0x30a,0x2,0x61,0x308,0x2,0x6f, + 0x308,0x2,0x41,0x30a,0x2,0x41,0x308,0x2, + 0x4f,0x308,0x2,0x75,0x308,0x2,0x55,0x308, + }; + +static const TUint32 TheSwedishStringIndex[] = + { + 0xc0004,0x90003,0xf0005,0x150007,0x30001,0x0,0x60002,0x120006, + }; + +static const TCollationKeyTable TheSwedishTable = + { TheSwedishKey, TheSwedishIndex, 2, TheSwedishStringElement, TheSwedishStringIndex, 8 }; + +static const TCollationMethod TheSwedishMethod = + { 0, NULL, &TheSwedishTable, 0 }; + +static const TCollationMethod TheSwapCaseMethod = + { 0, NULL, NULL, TCollationMethod::ESwapCase }; + +static const TCollationMethod TheFoldCaseMethod = + { 0, NULL, NULL, TCollationMethod::EFoldCase }; + +static const TUint32 TheKanaKey[] = + { + 0xc949,0xca09,0x2010f,0x20113,0x4010b,0x4010f,0x5010b,0x5010f, + 0x8010b,0x8010f,0xa010f,0xa014b,0xc010b,0xc010f,0xe010b,0xe010f, + 0xe013f,0x10010b,0x10010f,0x12010b,0x12010f,0x14c90b,0x14c90f,0x16ca0b, + 0x16ca0f,0x17010b,0x18030f,0x1a060b,0x1a060f,0x1c160f,0x1e0d0b,0x1e0d0f, + 0x20290f,0x22020b,0x22020f,0x24010d,0x28010d,0x2c010d,0x2e010d,0x30010d, + 0x32010d,0x34010d,0x36010b,0x36010f,0x38010f,0x3a010f,0x3c0109,0x3c010d, + 0x3e0109,0x3e010d,0x40010d,0x400109,0x42010d,0x440109,0x44010d,0x46010d, + 0x48010d,0x4a010f,0x4c010f,0x4e010b,0x4f010b,0x50010b,0x50010f,0x52010b, + 0x52010f,0x54010b,0x56010b,0x58010b,0x58010f,0x5a010b,0x5a010f,0x5c010b, + 0x5c010f,0x5e010b,0x5e010f,0x60010b,0x62010b,0x64010b,0x66010b,0x68010f, + 0x68010b,0x6a010f,0x6a010b,0x6c010b,0x6e010b,0x6f010b,0x70010b,0x72010b, + 0x72010f,0x74010b,0x74010f,0x76010f,0x78010f,0x7a010f,0x7c010b,0x7c010f, + 0x80010b,0x80010f,0x82010b,0x82010f,0x84010f,0x86010f,0x88010f,0x8a010f, + 0x8c010b,0x8e010f,0x90010f,0x92010f,0x94010d,0x960109,0x96010d,0x980109, + 0x98010d,0x9a010d,0x9c0109,0x9c010d,0x9e010b,0x9e010f,0x100010b,0x100010f, + 0x102010b,0x102010f,0x104010b,0x104010f,0x106010b,0x106010f,0x107010f,0x108010f, + 0x109010f,0x10a010f,0x10b010f,0x10c010f,0x10d010f,0x10e010f,0x10f010f,0x110010f, + 0x111010f,0x112010f,0x113010f,0x114010f,0x115010f,0x116010f,0x117010f,0x118010f, + 0x119010f,0x11a010f,0x11b010f,0x11c010f,0x11d010f,0x11e010f,0x11f010f,0x120010f, + 0x121010f,0x122010f,0x123010f,0x124010f,0x125010f,0x126010f,0x127010f,0x128010f, + 0x129010f,0x12a010f,0x12b010f,0x12c010f,0x12d010f,0x12e010f,0x12f010f,0x130010f, + 0x131010f,0x132010f,0x133010f,0x134010f,0x135010f,0x136010f,0x137010f,0x138010f, + 0x139010f,0x13b010f,0x13c010d,0x13d010d,0x13e010f,0x13f010f,0x140010f,0x141010f, + 0x142010f,0x143010d,0x144010d,0x145010d,0x146010d,0x147010d,0x148010d,0x149010d, + 0x14a010d,0x14b010d,0x14c010d,0x14d010d,0x14e010d,0x14f010d,0x150010d,0x151010d, + 0x152010d,0x153010d,0x154010d,0x155010d,0x156010d,0x157010d,0x158010d,0x159010d, + 0x15a010d,0x15b010d,0x15c010d,0x15d010d,0x15e010d,0x15f010d,0x160010f,0x161010f, + 0x162010f,0x163010f,0x164010f,0x165010f,0x166010f,0x167010f,0x168010f,0x169010f, + 0x16a010f,0x16b010f,0x16c010f,0x16d010f,0x16e010f,0x16f010f,0x170010f,0x171010f, + 0x172010f,0x174010f,0x175010f,0x176010f,0x177010f,0x178010f,0x179010f,0x17a010d, + 0x17b010d,0x17c010d,0x17d0119,0x17e0119,0x17f0119,0x1800119,0x1810119,0x182010d, + 0x183010d,0x184010d,0x185010d,0x186010d,0x187010d,0x189010f,0x18a010f,0x18b010f, + 0x18c010f,0x18d0111,0x18e0111,0x18f0111,0x1900111,0x1910111,0x1920111,0x1930111, + 0x1940111,0x1950111,0x1960111,0x197010f,0x198010f,0x199010b,0x199010f,0x6c50109, + 0x6c60109,0x6c70109,0x6c80109,0x6c90109,0x6ca0109,0x6cb0109,0x6cc0109,0x6cd0109, + 0x6ce0109,0x6cf0109,0x6cf010d,0x6cf0121,0x6cf0125,0x6e30109,0x6e3010d,0x6e30121, + 0x6e30125,0x6fb0109,0x6fb010d,0x6fb0121,0x6fb0125,0x7070109,0x707010d,0x7070121, + 0x7070125,0x72f0109,0x72f010d,0x72f0121,0x72f0125,0x75b0109,0x75b010d,0x75b0121, + 0x75b0125,0x7630109,0x763010d,0x7630121,0x7630125,0x7830109,0x783010d,0x7830121, + 0x7830125,0x79d0109,0x79d010d,0x79d0121,0x79d0125,0x7b10109,0x7b1010d,0x7b10121, + 0x7b10125,0x7c10109,0x7c1010d,0x7c10121,0x7c10125,0x7cd0109,0x7cd010d,0x7cd0121, + 0x7cd0125,0x7f50109,0x7f5010d,0x7f50121,0x7f50125,0x7fd0109,0x7fd010d,0x7fd0121, + 0x7fd0125,0x8150109,0x815010d,0x8150121,0x8150125,0x82d0109,0x82d010d,0x82d0121, + 0x82d0125,0x8390109,0x839010d,0x8390121,0x8390125,0x8450109,0x845010d,0x8450121, + 0x8450125,0x86d0109,0x86d010d,0x86d0121,0x86d0125,0x8890109,0x889010d,0x8890121, + 0x8890125,0x8ad0109,0x8ad010d,0x8ad0121,0x8ad0125,0x8c50109,0x8c5010d,0x8c50121, + 0x8c50125,0x8d10109,0x8d1010d,0x8d10121,0x8d10125,0x8d90109,0x8d9010d,0x8d90121, + 0x8d90125,0x8dd0109,0x8dd010d,0x8dd0121,0x8dd0125,0x8e90109,0x8e9010d,0x8e90121, + 0x8e90125,0x10200139,0x10200135,0x10200149,0x10200141,0x10200145,0x1020013d,0x10260139, + 0x10260135,0x10260149,0x10260141,0x10260145,0x1026013d,0x102c0139,0x102c0135,0x102c0149, + 0x102c0141,0x102c0145,0x102c013d,0x10330139,0x10330135,0x10330149,0x10330141,0x10330145, + 0x1033013d,0x10390139,0x10390135,0x10390149,0x10390141,0x10390145,0x1039013d,0x103f0135, + 0x103f0145,0x103f013d,0x10440135,0x10440145,0x1044013d,0x10490135,0x10490145,0x1049013d, + 0x104e0135,0x104e0145,0x104e013d,0x10530135,0x10530145,0x1053013d,0x10580135,0x10580145, + 0x1058013d,0x105d0135,0x105d0145,0x105d013d,0x10620135,0x10620145,0x1062013d,0x10670135, + 0x10670145,0x1067013d,0x106c0135,0x106c0145,0x106c013d,0x10710135,0x10710145,0x1071013d, + 0x10760135,0x10760145,0x1076013d,0x107b0139,0x107b0135,0x107b0149,0x107b0141,0x107b0145, + 0x107b013d,0x10830135,0x10830145,0x1083013d,0x10880135,0x10880145,0x1088013d,0x108d0135, + 0x108d0145,0x108d013d,0x10900135,0x10900145,0x1090013d,0x10930135,0x10930145,0x1093013d, + 0x10960135,0x10960145,0x1096013d,0x10990135,0x10990145,0x1099013d,0x109c0135,0x109c0145, + 0x109c013d,0x10a30135,0x10a30145,0x10a3013d,0x10aa0135,0x10aa0145,0x10aa013d,0x10b10135, + 0x10b10145,0x10b1013d,0x10b80135,0x10b80145,0x10b8013d,0x10bf0135,0x10bf0145,0x10bf013d, + 0x10c20135,0x10c20145,0x10c2013d,0x10c50135,0x10c50145,0x10c5013d,0x10c80135,0x10c80145, + 0x10c8013d,0x10cb0135,0x10cb0145,0x10cb013d,0x10ce0139,0x10ce0135,0x10ce0149,0x10ce0141, + 0x10ce0145,0x10ce013d,0x10d40139,0x10d40135,0x10d40149,0x10d40141,0x10d40145,0x10d4013d, + 0x10da0139,0x10da0135,0x10da0149,0x10da0141,0x10da0145,0x10da013d,0x10e00135,0x10e00145, + 0x10e0013d,0x10e30135,0x10e30145,0x10e3013d,0x10e60135,0x10e60145,0x10e6013d,0x10e90135, + 0x10e90145,0x10e9013d,0x10ec0135,0x10ec0145,0x10ec013d,0x10ef0139,0x10ef0135,0x10ef0149, + 0x10ef0145,0x10ef013d,0x10f40135,0x10f40145,0x10f60135,0x10f60145,0x10f80135,0x10f80145, + 0x10f8013d,0x10fb0135,0x10fb0145,0x10fb013d, + }; + +static const TUint32 TheKanaIndex[] = + { + 0x210013,0x22010d,0x230076,0x24006f,0x250074,0x260078,0x270019,0x28003d, + 0x29003f,0x2a007a,0x2b0057,0x2c0006,0x2d0059,0x2e0008,0x2f002e,0x30010f, + 0x310110,0x320111,0x330112,0x340113,0x350114,0x360115,0x370116,0x380117, + 0x390118,0x3a000c,0x3b000e,0x3c0060,0x3d005e,0x3e0062,0x3f0011,0x40007c, + 0x41011b,0x42011f,0x430123,0x440127,0x45012b,0x46012f,0x470133,0x480137, + 0x49013b,0x4a013f,0x4b0143,0x4c0147,0x4d014b,0x4e014f,0x4f0153,0x500157, + 0x51015b,0x52015f,0x530163,0x540167,0x55016b,0x56016f,0x570173,0x580177, + 0x59017b,0x5a017f,0x5b0043,0x5c0030,0x5d0045,0x5e001e,0x5f0021,0x60001b, + 0x610119,0x62011d,0x630121,0x640125,0x650129,0x66012d,0x670131,0x680135, + 0x690139,0x6a013d,0x6b0141,0x6c0145,0x6d0149,0x6e014d,0x6f0151,0x700155, + 0x710159,0x72015d,0x730161,0x740165,0x750169,0x76016d,0x770171,0x780175, + 0x790179,0x7a017d,0x7b0047,0x7c0035,0x7d0049,0x7e0033,0xa20071,0xa30072, + 0xa5006d,0xa7007e,0xa8001d,0xb00069,0xb1005b,0xb4001a,0xb600b7,0xd7005c, + 0xf7005d,0x2010002d,0x2015002c,0x20180039,0x2019003a,0x201c003b,0x201d003c,0x202000b5, + 0x202100b6,0x20250038,0x20260037,0x203000b1,0x2032006a,0x2033006b,0x203b008c,0x2103006c, + 0x211600ef,0x212100f1,0x216000cc,0x216100cd,0x216200ce,0x216300cf,0x216400d0,0x216500d1, + 0x216600d2,0x216700d3,0x216800d4,0x216900d5,0x21700101,0x21710102,0x21720103,0x21730104, + 0x21740105,0x21750106,0x21760107,0x21770108,0x21780109,0x2179010a,0x2190008f,0x21910090, + 0x2192008e,0x21930091,0x21d2009e,0x21d4009f,0x220000a0,0x220200a5,0x220300a1,0x220700a6, + 0x22080093,0x220b0094,0x221100fe,0x2212005a,0x221a00ab,0x221d00ad,0x221e0066,0x221f00ff, + 0x222000a2,0x22250034,0x2227009b,0x2228009c,0x2229009a,0x222a0099,0x222b00af,0x222c00b0, + 0x222e00fd,0x22340066,0x223500ae,0x223d00ac,0x225200a8,0x226100a7,0x22660064,0x22670065, + 0x226a00a9,0x226b00aa,0x22820097,0x22830098,0x22860095,0x22870096,0x22a500a3,0x22bf0100, + 0x231200a4,0x246000b9,0x246100ba,0x246200bb,0x246300bc,0x246400bd,0x246500be,0x246600bf, + 0x246700c0,0x246800c1,0x246900c2,0x246a00c3,0x246b00c3,0x246c00c4,0x246d00c5,0x246e00c6, + 0x246f00c7,0x247000c8,0x247100c9,0x247200ca,0x247300cb,0x25a00087,0x25a10086,0x25b20089, + 0x25b30088,0x25bc008b,0x25bd008a,0x25c60085,0x25c70084,0x25cb0081,0x25ce0083,0x25cf0082, + 0x25ef00b8,0x26050080,0x2606007f,0x26400068,0x26420067,0x266a00b4,0x266d00b3,0x266f00b2, + 0x30010003,0x30020005,0x30030025,0x30050027,0x30060028,0x30070029,0x3008004b,0x3009004c, + 0x300a004d,0x300b004e,0x300c004f,0x300d0051,0x300e0053,0x300f0054,0x30100055,0x30110056, + 0x3012008d,0x30130092,0x30140041,0x30150042,0x301c0032,0x301d00ed,0x301f00ee,0x30410181, + 0x30420182,0x30430187,0x30440188,0x3045018d,0x3046018e,0x30470193,0x30480194,0x30490199, + 0x304a019a,0x304b019f,0x304d01a2,0x304f01a5,0x305101a8,0x305301ab,0x305501ae,0x305701b1, + 0x305901b4,0x305b01b7,0x305d01ba,0x305f01bd,0x306101c0,0x306301c3,0x306401c4,0x306601c9, + 0x306801cc,0x306a01cf,0x306b01d2,0x306c01d5,0x306d01d8,0x306e01db,0x306f01de,0x307201e1, + 0x307501e4,0x307801e7,0x307b01ea,0x307e01ed,0x307f01f0,0x308001f3,0x308101f6,0x308201f9, + 0x308301fc,0x308401fd,0x30850202,0x30860203,0x30870208,0x30880209,0x3089020e,0x308a0211, + 0x308b0214,0x308c0217,0x308d021a,0x308e021d,0x308f021e,0x30900222,0x30910224,0x30920226, + 0x30930229,0x30990000,0x309a0001,0x309b0016,0x309c0018,0x309d0024,0x30a10183,0x30a20185, + 0x30a30189,0x30a4018b,0x30a5018f,0x30a60191,0x30a70195,0x30a80197,0x30a9019b,0x30aa019d, + 0x30ab01a0,0x30ad01a3,0x30af01a6,0x30b101a9,0x30b301ac,0x30b501af,0x30b701b2,0x30b901b5, + 0x30bb01b8,0x30bd01bb,0x30bf01be,0x30c101c1,0x30c301c5,0x30c401c7,0x30c601ca,0x30c801cd, + 0x30ca01d0,0x30cb01d3,0x30cc01d6,0x30cd01d9,0x30ce01dc,0x30cf01df,0x30d201e2,0x30d501e5, + 0x30d801e8,0x30db01eb,0x30de01ee,0x30df01f1,0x30e001f4,0x30e101f7,0x30e201fa,0x30e301fe, + 0x30e40200,0x30e50204,0x30e60206,0x30e7020a,0x30e8020c,0x30e9020f,0x30ea0212,0x30eb0215, + 0x30ec0218,0x30ed021b,0x30ee021f,0x30ef0220,0x30f00223,0x30f10225,0x30f20227,0x30f3022a, + 0x30fb000a,0x30fc002b,0x30fd0023,0x323100f7,0x323200f8,0x323900f9,0x32a400f2,0x32a500f3, + 0x32a600f4,0x32a700f5,0x32a800f6,0x330300dc,0x330d00e0,0x331400d7,0x331800da,0x332200d8, + 0x332300e2,0x332600e1,0x332700db,0x332b00e3,0x333600dd,0x333b00e5,0x334900d6,0x334a00e4, + 0x334d00d9,0x335100de,0x335700df,0x337b00ec,0x337c00fc,0x337d00fb,0x337e00fa,0x338f00e9, + 0x339c00e6,0x339d00e7,0x339e00e8,0x33a100eb,0x33c400ea,0x33cd00f0,0x4edd0026,0xfe540010, + 0xff010014,0xff02010e,0xff030077,0xff040070,0xff050075,0xff060079,0xff07010c,0xff08003e, + 0xff090040,0xff0a007b,0xff0b0058,0xff0c0007,0xff0d005a,0xff0e0009,0xff0f002f,0xff1a000d, + 0xff1b000f,0xff1c0061,0xff1d005f,0xff1e0063,0xff1f0012,0xff20007d,0xff21011c,0xff220120, + 0xff230124,0xff240128,0xff25012c,0xff260130,0xff270134,0xff280138,0xff29013c,0xff2a0140, + 0xff2b0144,0xff2c0148,0xff2d014c,0xff2e0150,0xff2f0154,0xff300158,0xff31015c,0xff320160, + 0xff330164,0xff340168,0xff35016c,0xff360170,0xff370174,0xff380178,0xff39017c,0xff3a0180, + 0xff3b0044,0xff3c0031,0xff3d0046,0xff3e001f,0xff3f0022,0xff40001c,0xff41011a,0xff42011e, + 0xff430122,0xff440126,0xff45012a,0xff46012e,0xff470132,0xff480136,0xff49013a,0xff4a013e, + 0xff4b0142,0xff4c0146,0xff4d014a,0xff4e014e,0xff4f0152,0xff500156,0xff51015a,0xff52015e, + 0xff530162,0xff540166,0xff55016a,0xff56016e,0xff570172,0xff580176,0xff59017a,0xff5a017e, + 0xff5b0048,0xff5c0036,0xff5d004a,0xff5e0032,0xff610004,0xff620050,0xff630052,0xff640002, + 0xff65000b,0xff660228,0xff670184,0xff68018a,0xff690190,0xff6a0196,0xff6b019c,0xff6c01ff, + 0xff6d0205,0xff6e020b,0xff6f01c6,0xff70002a,0xff710186,0xff72018c,0xff730192,0xff740198, + 0xff75019e,0xff7601a1,0xff7701a4,0xff7801a7,0xff7901aa,0xff7a01ad,0xff7b01b0,0xff7c01b3, + 0xff7d01b6,0xff7e01b9,0xff7f01bc,0xff8001bf,0xff8101c2,0xff8201c8,0xff8301cb,0xff8401ce, + 0xff8501d1,0xff8601d4,0xff8701d7,0xff8801da,0xff8901dd,0xff8a01e0,0xff8b01e3,0xff8c01e6, + 0xff8d01e9,0xff8e01ec,0xff8f01ef,0xff9001f2,0xff9101f5,0xff9201f8,0xff9301fb,0xff940201, + 0xff950207,0xff96020d,0xff970210,0xff980213,0xff990216,0xff9a0219,0xff9b021c,0xff9c0221, + 0xff9d022b,0xff9e0015,0xff9f0017,0xffe00071,0xffe10073,0xffe2009d,0xffe30020,0xffe4010b, + 0xffe5006e, + }; + +/* +Collation keys for the Hiragana and Katakana syllabaries, built by +running coltab on \loce32\japanese\source\japanese_basekeys.txt after deleting all CJK characters. +*/ +static const TCollationKeyTable TheKanaTable = + { TheKanaKey, TheKanaIndex, 561, NULL, NULL, 0 }; + +static const TCollationMethod TheKanaMethod = + { 0, NULL, &TheKanaTable, 0 }; + +static const TCollationMethod TheSwapKanaMethod = + { 0, NULL, &TheKanaTable, TCollationMethod::ESwapKana }; + +static const TUint32 TheQazKey[] = + { + 0x6d00121,0x6e40121, + }; + +static const TUint32 TheQazIndex[] = + { + 0 + }; + +static const TUint16 TheQazStringElement[] = + { + 0x2,0x53,0x45,0x3,0x53,0x45,0x58, + }; + +static const TUint32 TheQazStringIndex[] = + { + 0x0,0x30001, + }; + +static const TCollationKeyTable TheQazTable = + { TheQazKey, TheQazIndex, 0, TheQazStringElement, TheQazStringIndex, 2 }; + +// A bizarre collation method that sorts 'SE' between A and B and 'SEX' between B and C +static const TCollationMethod TheQazMethod = + { 0, NULL, &TheQazTable, 0 }; + +// A collation method to sort accents starting at the end of the string, as in France +static const TCollationMethod TheAccentsBackwardsMethod = + { 0, NULL, NULL, TCollationMethod::EAccentsBackwards }; + +void test_unicode_collations() + { + /* + Note: the curious method of getting values greater than 255 into the strings is needed + because GCC doesn't handle the \x notation properly: it zeroes the high byte, so + L"\x2011" puts the value 0x0011, not 0x2011, into the string. + */ + TBuf<32> x, y; + + test.Next(_L("collation")); + test_unicode_collation(_L("SEZ"),_L("BZ"),-1,3,&TheQazMethod); // test 2-character combination 'SE' + test_unicode_collation(_L("SEXY"),_L("CY"),-1,3,&TheQazMethod); // test 3-character combination 'SEX' + test_unicode_collation(_L("Graham"),_L("Graham"),0); // equality + test_unicode_collation(_L("something"),_L(""),1); // something after nothing + test_unicode_collation(_L("inform"),_L("information"),-1); // prefixes come first + test_unicode_collation(_L("unicode"),_L("consortium"),1); // standard alphabetic ordering: lowercase + test_unicode_collation(_L("AARON"),_L("AARDVARK"),1); // standard alphabetic ordering: uppercase + test_unicode_collation(_L("AARON"),_L("AARDVARK"),1,0); // alphabetic ordering is significant at level 0 + test_unicode_collation(_L("hello"),_L("Hello"),-1,3); // lowercase before uppercase + test_unicode_collation(_L("hello"),_L("Hello"),-1,3,&TheSwapKanaMethod);// swapping kana ordering doesn't affect case + test_unicode_collation(_L("hello"),_L("Hello"),1,3,&TheSwapCaseMethod); // uppercase before lowercase if ESwapCase used + test_unicode_collation(_L("hello"),_L("Hello"),0,2,&TheFoldCaseMethod); // uppercase = lowercase if EFoldCase used at level 2 + test_unicode_collation(_L("hello"),_L("Hello"),-1,2); // case is significant at level 2 + test_unicode_collation(_L("hello"),_L("Hello"),0,1); // ignore case at level 1 + test_unicode_collation(_L("hello"),_L("[H E L L O !]"),0,1);// ignore punctuation and case at level 1 + test_unicode_collation(_L("1234"),_L("abc"),-1); // digits before letters + x = _L("week day"); x[4] = 0x2011; // (week-day with non-breaking hyphen) + test_unicode_collation(x,_L("weekend"),-1); // ignore punctuation if letters differ; d < e + test_unicode_collation(x,_L("week-day"),1); // compare punctuation if otherwise equal + test_unicode_collation(x,_L("week-day"),0,2); // ignore difference between hyphens at level 2 + test_unicode_collation(x,_L("Week-day"),-1); // case difference outweighs punctuation ordering + y = _L("a ngstro m"); y[1] = 0x30a; y[8] = 0x308; // (angstrom with piece accents) + test_unicode_collation(_L("\xe5ngstr\xf6m"),y,0); // base+accent = precomposed (angstrom) + test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1); // unaccented before accented... + test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1,1); // accents are significant at level 1 + test_unicode_collation(_L("Liege"),_L("li\xe8ge"),-1); // accentuation outweighs case + test_unicode_collation(_L("Liege"),_L("li\xe8ge"),0,0); // ignore accents and case at level 0 + test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),-1); // a-ring before z by default + test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),1,3,&TheSwedishMethod); // a-ring after z in Sweden + test_unicode_collation(_L("Antidisestablishmentarian"),_L("antidisestablishmentariac"),1); + // long strings that don't have identical prefixes + x = _L("\x304b\x306a"); y = _L("\x30ab\x30ca"); // 'kana' in Hiragana and Katakana + test_unicode_collation(x,y,-1,3,&TheKanaMethod); // Hiragana before Katakana + test_unicode_collation(x,y,1,3,&TheSwapKanaMethod); // Katakana before Hiragana if ESwapKana used + x = _L("p\xe9"L"ch\xe9"); y = _L("p\xea"L"che"); // x = peche, y = peche + test_unicode_collation(x,y,-1,3); // normal order; accents compared from start + test_unicode_collation(x,y,1,3,&TheAccentsBackwardsMethod); // reverse order; accents compared from end + test_unicode_collation(_L("aaAA"),_L("aAaA"),0,3,&TheFoldCaseMethod); // case folding should work even at level 3 + test_unicode_collation(_L("\x2113"),_L("L"),1,3,&TheFoldCaseMethod); // script l and L should not be equal; + // script l before L because L folds to lower case, + // which sorts after secondary key type for script l + test_unicode_collation(_L("\x3c2"),_L("\x3c3"),-1,3); // Greek final and non-final sigma + test_unicode_collation(_L("\x3c2"),_L("\x3c3"),0,3,&TheFoldCaseMethod); // Greek final and non-final sigma + test_unicode_collation(_L("\xee0"),_L("\x4e00"),1,3); // undefined character after CJK character not in table + test_unicode_collation(_L("\xee0"),_L("\xef0"),-1,3); // undefined characters must differ + test_unicode_collation(_L("\xee0\xee1"),_L("\xef0"),-1,3); // undefined characters in Unicode order, not string length + test_unicode_collation(_L("\xd800\xdc00"),_L("\xceff"),1,3); // character U+10000 (using surrogates) + // after Hangul character not in table + } + +GLDEF_C TInt E32Main(void) + { + + test.Title(); + test.Start(_L("TCHAR TESTING")); + + test_unicode_chars(); + test_unicode_collations(); + + test.Next(_L("TChar")); + TestTChar t; + t.Test1(); + t.Test2(eTChar); + t.Test3(eTChar); + t.Test4(eTChar); + + test.Next(_L("TCharF")); + TestTChar f; + f.Test2(eTCharF); + f.Test3(eTCharF); + f.Test4(eTCharF); + + test.Next(_L("TCharLC")); + TestTChar lc; + lc.Test2(eTCharLC); + lc.Test3(eTCharLC); + lc.Test4(eTCharLC); + + test.Next(_L("TCharUC")); + TestTChar uc; + uc.Test2(eTCharUC); + uc.Test3(eTCharUC); + uc.Test4(eTCharUC); + + test.End(); + return(KErrNone); + } + +#pragma warning ( default :4700) +#pragma warning ( default :4710) diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_circ.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_circ.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,292 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_circ.cpp +// Overview: +// Test methods of CCirBuffer and CCirBuf template class. +// API Information: +// CCirBuffer, CCirBuf. +// Details: +// - Create a circular buffer, add integers to the circular buffer and check that +// they are added as specified. +// - Verify Remove and Add work as expected. +// - Check that all the added objects are removed. +// - Create a circular buffer, add concrete data type object one, many at a time to the +// circular buffer and check that they are added as specified. +// - Remove the concrete data type object one, many at a time from the circular buffer +// and check that they are removed as expected. +// - Check that all the added objects are removed. +// - Create a circular buffer, add 8-bit unsigned character object one, many at a time +// to the circular buffer and check that they are added as specified. +// - Remove multiple 8-bit unsigned character objects from the circular buffer and +// check the added and removed objects are same. +// - Create a circular buffer of unsigned integers, add single, multiple objects to the +// buffer and check that they are added as specified. +// - Remove multiple objects from the circular buffer and check the added and removed +// objects are same. +// - Create a circular buffer, add multiple signed integer objects to it, remove +// the objects and verify that the added objects are removed. +// - Create a circular buffer, add integers to the circular buffer and check that +// they are added as specified. +// - Verify Remove works as expected. +// - Test whether the heap has been corrupted by all the tests. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +class VTester + { +public: + VTester(){a=b=c=d=0;} + VTester(TInt anInt){a=b=c=d=anInt;} + VTester& operator=(TInt anInt){a=b=c=d=anInt;return *this;} + TBool operator==(const VTester& aVal) const{if (a==aVal.a && b==aVal.b && c==aVal.c && d==aVal.d) return 1; else return 0;} + TBool operator==(const TInt& aVal) const{if (a==aVal && b==aVal && c==aVal && d==aVal) return 1; else return 0;} +public: + TInt a; + TInt b; + TInt c; + TInt d; + }; + +LOCAL_D RTest test(_L("T_CIRC")); +LOCAL_D TText8* theCharArray=(TText8*)"abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!\xA3$%^&*()\0"; + +LOCAL_C void TestInt() +// +// Test with unsigned integers +// + { + + CCirBuf* cbInt=new CCirBuf; + TRAPD(ret,cbInt->SetLengthL(5)); + test(ret==KErrNone); + TInt one(1); + TInt two(2); + TInt three(3); + TInt four(4); + TInt five(5); + TInt six(6); + TInt dummy; + TInt numbers[]={7,8,9,10,11,12,13,14,15}; + TInt* numBuf=new TInt[10]; + test(numBuf!=NULL); + test(cbInt->Add(&one)==1); + test(cbInt->Add(&two)==1); + test(cbInt->Add(&three)==1); + test(cbInt->Add(&four)==1); + test(cbInt->Add(&five)==1); + one=two=three=four=0; + test(cbInt->Add(&six)==0); + test(cbInt->Remove(&one)==1); + test(cbInt->Add(&six)==1); + test(cbInt->Add(&dummy)==0); + test(cbInt->Remove(&two)==1); + test(cbInt->Remove(&three)==1); + test(cbInt->Remove(&four)==1); + test(one==1); + test(two==2); + test(three==3); + test(four==4); + test(cbInt->Add(numbers,6)==3); + test(cbInt->Add(numbers,3)==0); + test(cbInt->Remove(numBuf,7)==5); + test(cbInt->Remove(numBuf,5)==0); + for(TInt j(0);j<5;j++) + test(numBuf[j]==j+5); + delete [] numBuf; + delete cbInt; + } + +LOCAL_C void TestClass() +// +// Test with objects +// + { + + CCirBuf* cbInt=new CCirBuf; + TRAPD(ret,cbInt->SetLengthL(5)); + test(ret==KErrNone); + VTester one(1); + VTester two(2); + VTester three(3); + VTester four(4); + VTester five(5); + VTester six(6); + VTester dummy(0xffff); + VTester numbers[]={7,8,9,10,11,12,13,14,15}; + VTester* numBuf=new VTester[10]; + test(numBuf!=NULL); + test(cbInt->Add(&one)==1); + test(cbInt->Add(&two)==1); + test(cbInt->Add(&three)==1); + test(cbInt->Add(&four)==1); + test(cbInt->Add(&five)==1); + one=two=three=four=0; + test(cbInt->Add(&six)==0); + test(cbInt->Remove(&one)==1); + test(cbInt->Add(&six)==1); + test(cbInt->Add(&dummy)==0); + test(cbInt->Remove(&two)==1); + test(cbInt->Remove(&three)==1); + test(cbInt->Remove(&four)==1); + test(one==1); + test(two==2); + test(three==3); + test(four==4); + test(cbInt->Add(numbers,6)==3); + test(cbInt->Add(numbers,3)==0); + test(cbInt->Remove(numBuf,7)==5); + test(cbInt->Remove(numBuf,5)==0); + for(TInt j(0);j<5;j++) + test(numBuf[j]==j+5); + delete [] numBuf; + delete cbInt; + } + +LOCAL_C void TestText() +// +// Test with text +// + { + + TInt i,j; + TInt arraySize=User::StringLength(theCharArray); + TText8* buf=new TText8[arraySize+1]; + Mem::FillZ(buf,arraySize); + CCirBuf* cbInt=new CCirBuf; + TRAPD(ret,cbInt->SetLengthL(arraySize+11)); + test(ret==KErrNone); + for (i=0;i<10;i++) + { + test(cbInt->Add(theCharArray,arraySize)==arraySize); + test(cbInt->Add(theCharArray+i)==1); + test(cbInt->Remove(buf,arraySize)==arraySize); + } + TRAP(ret,cbInt->SetLengthL(arraySize*60)); + test(ret==KErrNone); + for (j=0;j<10;j++) + { + for (i=0;i<9;i++) + test(cbInt->Add(theCharArray,arraySize)==arraySize); + for (i=0;iAdd(theCharArray+i)==1); + for (i=0;i<5;i++) + { + Mem::FillZ(buf,arraySize); + test(cbInt->Remove(buf,arraySize)==arraySize); + test(Mem::Compare(buf,arraySize,theCharArray,arraySize)==KErrNone); + } + } + delete [] buf; + delete cbInt; + } + +void TestBuf() +// +// Test with buffers +// + { + + TInt i,j; + TInt arraySize=User::StringLength(theCharArray); + TText8* buf=new TText8[arraySize+1]; + Mem::FillZ(buf,arraySize); + CCirBuffer* cbInt=new CCirBuffer; + TRAPD(ret,cbInt->SetLengthL(arraySize+11)); + test(ret==KErrNone); + for (i=0;i<10;i++) + { + test(cbInt->Add(theCharArray,arraySize)==arraySize); + test(cbInt->Add(theCharArray+i)==1); + test(cbInt->Remove(buf,arraySize)==arraySize); + } + TRAP(ret,cbInt->SetLengthL(arraySize*60)); + test(ret==KErrNone); + for (j=0;j<10;j++) + { + for (i=0;i<9;i++) + test(cbInt->Add(theCharArray,arraySize)==arraySize); + for (i=0;iAdd(theCharArray+i)==1); + for (i=0;i<5;i++) + { + Mem::FillZ(buf,arraySize); + test(cbInt->Remove(buf,arraySize)==arraySize); + test(Mem::Compare(buf,arraySize,theCharArray,arraySize)==KErrNone); + } + } + delete [] buf; + delete cbInt; + } + +LOCAL_C void TestRemove() +// +// Show remove bug (fixed in rel 050) +// +{ + + CCirBuf* cbInt=new CCirBuf; TRAPD(ret,cbInt->SetLengthL(5)); + test(ret==KErrNone); + TInt numbers[]={1,2,3,4,5}; + TInt* result=new TInt[5]; + + test(cbInt->Add(numbers,5)==5); + test(cbInt->Remove(result,2)==2); + test(result[0]==1); + test(result[1]==2); + test(cbInt->Remove(result,3)==3); + test(result[0]==3); + test(result[1]==4); + test(result[2]==5); + + delete [] result; + delete cbInt; + } + + +TInt E32Main() +// +// Test CCirBuf +// + { + + test.Title(); + __UHEAP_MARK; +// + test.Start(_L("Testing with built in Type")); + TestInt(); +// + test.Next(_L("Testing with concrete data type")); + TestClass(); +// + test.Next(_L("Testing with text")); + TestText(); +// + test.Next(_L("Testing character buffer")); + TestBuf(); +// + test.Next(_L("Testing Remove")); + TestRemove(); + + __UHEAP_MARKEND; + test.End(); + return(KErrNone); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_collate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_collate.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2446 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_collate.cpp +// Overview: +// Test Unicode collations. +// API Information: +// CompareC, TCollationMethod, TCollationKeyTable. +// Details: +// - Check the collation for characters, accents, different cases and standard +// alphabetical ordering is as expected. +// - Check collation using standard collation method, overriding the collation tables, +// collation keys is as expected. +// - Check collation for simplified Chinese characters is as expected. +// - Check collation and compare the Chinese ideological characters to other +// characters which are not included in the Chinese collation table are as expected. +// - Check collation and compare Chinese to English alphabets. +// - Check collation and compare Chinese to Hiragana characters. +// - Check collation and compare Chinese to Katakana characters. +// - Check collation and compare Hiragana to a Katakana characters. +// - Check collation and compare full width and half width digits and letters. +// - Set the current collation key table to standard table, collation keys to default keys, +// constants to specified values, compare data and check it is as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include "../../e32/euser/unicode/collateimp.h" +#include + +#ifdef __VC32__ + // Solve compilation problem caused by non-English locale + #pragma setlocale("english") +#endif + +LOCAL_D RTest test(_L("T_COLLATE")); + + +#ifndef _DEBUG +#pragma warning (disable :4710) //Function not expanded +#pragma warning (disable :4700) //Local variable used without being initialized +#endif + +///***************** copied from locale euser source code *********************** +#ifndef __TOOLS2__ +static const TCollationMethod TheCollationMethod[] = + { + { + KUidBasicCollationMethod, // this is the standard unlocalised method + NULL, // null means use the standard table + NULL, // there's no override table + 0 // the flags are standard + } + }; +static const TCollationDataSet TheCollationDataSet = + { + TheCollationMethod, + 1 + }; +const LCharSet TheCharSet = + { + NULL, + &TheCollationDataSet + }; +const LCharSet* GetLocaleCharSet() + { + return &TheCharSet; + } +#endif +///******************************************************************************* + + + + +void test_unicode_collation(const TDesC& x,const TDesC& y,TInt desired_order, + TInt level = 3,const TCollationMethod* method = NULL) + { + TInt order = x.CompareC(y,level,method); + + // Normalise order to -1, 0 or 1. + if (order < 0) + order = -1; + else if (order > 0) + order = 1; + + test(order == desired_order); + } + +static const TUint32 TheSwedishKey[] = + { + 0x8f60109,0x8f70109,0x8f80109,0x8f60121,0x8f70121,0x8f80121,0x8dd0109,0x8dd0121, + 0x8c50121,0x8c50109, + }; + +static const TUint32 TheSwedishIndex[] = + { + 0x570008,0x770009, + }; + +static const TUint16 TheSwedishStringElement[] = + { + 0x2,0x61,0x30a,0x2,0x61,0x308,0x2,0x6f, + 0x308,0x2,0x41,0x30a,0x2,0x41,0x308,0x2, + 0x4f,0x308,0x2,0x75,0x308,0x2,0x55,0x308, + }; + +static const TUint32 TheSwedishStringIndex[] = + { + 0xc0004,0x90003,0xf0005,0x150007,0x30001,0x0,0x60002,0x120006, + }; + +static const TCollationKeyTable TheSwedishTable = + { TheSwedishKey, TheSwedishIndex, 2, TheSwedishStringElement, TheSwedishStringIndex, 8 }; + +static const TCollationMethod TheSwedishMethod = + { 0, NULL, &TheSwedishTable, 0 }; + +static const TCollationMethod TheSwapCaseMethod = + { 0, NULL, NULL, TCollationMethod::ESwapCase }; + +static const TUint32 TheKanaKey[] = + { + 0x102c013c,0xc949,0x103f013c,0xc949,0x1044013c,0xc949,0x1049013c,0xc949, + 0x104e013c,0xc949,0x1053013c,0xc949,0x1058013c,0xc949,0x105d013c,0xc949, + 0x1062013c,0xc949,0x1067013c,0xc949,0x106c013c,0xc949,0x1071013c,0xc949, + 0x1076013c,0xc949,0x107b013c,0xc949,0x1083013c,0xc949,0x1088013c,0xc949, + 0x109c013c,0xc949,0x10a3013c,0xc949,0x10aa013c,0xc949,0x10b1013c,0xc949, + 0x10b8013c,0xc949,0x109c013c,0xca49,0x10a3013c,0xca49,0x10aa013c,0xca49, + 0x10b1013c,0xca49,0x10b8013c,0xca49,0x10200134,0x10200135,0x10260134,0x10260135, + 0x102c0134,0x102c0135,0x10330134,0x10330135,0x10390134,0x10390135,0x103f0134,0x10200135, + 0x10440134,0x10260135,0x10490134,0x102c0135,0x104e0134,0x10330135,0x10530134,0x10390135, + 0x103f0134,0xc948,0x10200135,0x10440134,0xc948,0x10260135,0x10490134,0xc948, + 0x102c0135,0x104e0134,0xc948,0x10330135,0x10530134,0xc948,0x10390135,0x10580134, + 0x10200135,0x105d0134,0x10260135,0x10620134,0x102c0135,0x10670134,0x10330135,0x106c0134, + 0x10390135,0x10580134,0xc948,0x10200135,0x105d0134,0xc948,0x10260135,0x10620134, + 0xc948,0x102c0135,0x10670134,0xc948,0x10330135,0x106c0134,0xc948,0x10390135, + 0x10710134,0x10200135,0x10760134,0x10260135,0x107b0134,0x102c0135,0x10830134,0x10330135, + 0x10880134,0x10390135,0x10710134,0xc948,0x10200135,0x10760134,0xc948,0x10260135, + 0x107b0134,0xc948,0x102c0135,0x10830134,0xc948,0x10330135,0x10880134,0xc948, + 0x10390135,0x108d0134,0x10200135,0x10900134,0x10260135,0x10930134,0x102c0135,0x10960134, + 0x10330135,0x10990134,0x10390135,0x109c0134,0x10200135,0x10a30134,0x10260135,0x10aa0134, + 0x102c0135,0x10b10134,0x10330135,0x10b80134,0x10390135,0x109c0134,0xc948,0x10200135, + 0x10a30134,0xc948,0x10260135,0x10aa0134,0xc948,0x102c0135,0x10b10134,0xc948, + 0x10330135,0x10b80134,0xc948,0x10390135,0x109c0134,0xca08,0x10200135,0x10a30134, + 0xca08,0x10260135,0x10aa0134,0xca08,0x102c0135,0x10b10134,0xca08,0x10330135, + 0x10b80134,0xca08,0x10390135,0x10bf0134,0x10200135,0x10c20134,0x10260135,0x10c50134, + 0x102c0135,0x10c80134,0x10330135,0x10cb0134,0x10390135,0x10ce0134,0x10200135,0x10d40134, + 0x102c0135,0x10da0134,0x10390135,0x10e00134,0x10200135,0x10e30134,0x10260135,0x10e60134, + 0x102c0135,0x10e90134,0x10330135,0x10ec0134,0x10390135,0x10ef0134,0x10200135,0x103f0144, + 0x10200145,0x10440144,0x10260145,0x10490144,0x102c0145,0x104e0144,0x10330145,0x10530144, + 0x10390145,0x103f0144,0xc948,0x10200145,0x10440144,0xc948,0x10260145,0x10490144, + 0xc948,0x102c0145,0x104e0144,0xc948,0x10330145,0x10530144,0xc948,0x10390145, + 0x10580144,0x10200145,0x105d0144,0x10260145,0x10620144,0x102c0145,0x10670144,0x10330145, + 0x106c0144,0x10390145,0x10580144,0xc948,0x10200145,0x105d0144,0xc948,0x10260145, + 0x10620144,0xc948,0x102c0145,0x10670144,0xc948,0x10330145,0x106c0144,0xc948, + 0x10390145,0x10710144,0x10200145,0x10760144,0x10260145,0x107b0144,0x102c0145,0x10830144, + 0x10330145,0x10880144,0x10390145,0x10710144,0xc948,0x10200145,0x10760144,0xc948, + 0x10260145,0x107b0144,0xc948,0x102c0145,0x10830144,0xc948,0x10330145,0x10880144, + 0xc948,0x10390145,0x108d0144,0x10200145,0x10900144,0x10260145,0x10930144,0x102c0145, + 0x10960144,0x10330145,0x10990144,0x10390145,0x109c0144,0x10200145,0x10a30144,0x10260145, + 0x10aa0144,0x102c0145,0x10b10144,0x10330145,0x10b80144,0x10390145,0x109c0144,0xc948, + 0x10200145,0x10a30144,0xc948,0x10260145,0x10aa0144,0xc948,0x102c0145,0x10b10144, + 0xc948,0x10330145,0x10b80144,0xc948,0x10390145,0x109c0144,0xca08,0x10200145, + 0x10a30144,0xca08,0x10260145,0x10aa0144,0xca08,0x102c0145,0x10b10144,0xca08, + 0x10330145,0x10b80144,0xca08,0x10390145,0x10bf0144,0x10200145,0x10c20144,0x10260145, + 0x10c50144,0x102c0145,0x10c80144,0x10330145,0x10cb0144,0x10390145,0x10ce0144,0x10200145, + 0x10d40144,0x102c0145,0x10da0144,0x10390145,0x10e00144,0x10200145,0x10e30144,0x10260145, + 0x10e60144,0x102c0145,0x10e90144,0x10330145,0x10ec0144,0x10390145,0x10ef0144,0x10200145, + 0x10f40144,0x10260145,0x10f60144,0x10330145,0x10f80144,0x10390145,0x10ef0144,0xc948, + 0x10200145,0x10f40144,0xc948,0x10260145,0x102c0144,0xc948,0x102c0145,0x10f60144, + 0xc948,0x10330145,0x10f80144,0xc948,0x10390145,0x103f013c,0x1020013d,0x1044013c, + 0x1026013d,0x1049013c,0x102c013d,0x104e013c,0x1033013d,0x1053013c,0x1039013d,0x103f013c, + 0xc948,0x1020013d,0x1044013c,0xc948,0x1026013d,0x1049013c,0xc948,0x102c013d, + 0x104e013c,0xc948,0x1033013d,0x1053013c,0xc948,0x1039013d,0x1058013c,0x1020013d, + 0x105d013c,0x1026013d,0x1062013c,0x102c013d,0x1067013c,0x1033013d,0x106c013c,0x1039013d, + 0x1058013c,0xc948,0x1020013d,0x105d013c,0xc948,0x1026013d,0x1062013c,0xc948, + 0x102c013d,0x1067013c,0xc948,0x1033013d,0x106c013c,0xc948,0x1039013d,0x1071013c, + 0x1020013d,0x1076013c,0x1026013d,0x107b013c,0x102c013d,0x1083013c,0x1033013d,0x1088013c, + 0x1039013d,0x1071013c,0xc948,0x1020013d,0x1076013c,0xc948,0x1026013d,0x107b013c, + 0xc948,0x102c013d,0x1083013c,0xc948,0x1033013d,0x1088013c,0xc948,0x1039013d, + 0x108d013c,0x1020013d,0x1090013c,0x1026013d,0x1093013c,0x102c013d,0x1096013c,0x1033013d, + 0x1099013c,0x1039013d,0x109c013c,0x1020013d,0x10a3013c,0x1026013d,0x10aa013c,0x102c013d, + 0x10b1013c,0x1033013d,0x10b8013c,0x1039013d,0x109c013c,0xc948,0x1020013d,0x10a3013c, + 0xc948,0x1026013d,0x10aa013c,0xc948,0x102c013d,0x10b1013c,0xc948,0x1033013d, + 0x10b8013c,0xc948,0x1039013d,0x109c013c,0xca48,0x1020013d,0x10a3013c,0xca48, + 0x1026013d,0x10aa013c,0xca48,0x102c013d,0x10b1013c,0xca48,0x1033013d,0x10b8013c, + 0xca48,0x1039013d,0x10bf013c,0x1020013d,0x10c2013c,0x1026013d,0x10c5013c,0x102c013d, + 0x10c8013c,0x1033013d,0x10cb013c,0x1039013d,0x10ce013c,0x1020013d,0x10d4013c,0x102c013d, + 0x10da013c,0x1039013d,0x10e0013c,0x1020013d,0x10e3013c,0x1026013d,0x10e6013c,0x102c013d, + 0x10e9013c,0x1033013d,0x10ec013c,0x1039013d,0x10ef013c,0x1020013d,0x10ef013c,0xc948, + 0x1020013d,0xca09,0x2010f,0x20113,0x4010b,0x4010f,0x5010b,0x5010f, + 0x8010b,0x8010f,0xa010f,0xa014b,0xc010b,0xc010f,0xe010b,0xe010f, + 0xe013f,0x10010b,0x10010f,0x12010b,0x12010f,0x14c90b,0x14c90f,0x16ca0b, + 0x16ca0f,0x17010b,0x18030f,0x1a060b,0x1a060f,0x1c160f,0x1e0d0b,0x1e0d0f, + 0x20290f,0x22020b,0x22020f,0x24010d,0x28010d,0x2c010d,0x2e010d,0x30010d, + 0x32010d,0x34010d,0x36010b,0x36010f,0x38010f,0x3a010f,0x3c0109,0x3c010d, + 0x3e0109,0x3e010d,0x40010d,0x400109,0x42010d,0x440109,0x44010d,0x46010d, + 0x48010d,0x4a010f,0x4c010f,0x4e010b,0x4f010b,0x50010b,0x50010f,0x52010b, + 0x52010f,0x54010b,0x56010b,0x58010b,0x58010f,0x5a010b,0x5a010f,0x5c010b, + 0x5c010f,0x5e010b,0x5e010f,0x60010b,0x62010b,0x64010b,0x66010b,0x68010f, + 0x68010b,0x6a010f,0x6a010b,0x6c010b,0x6e010b,0x6f010b,0x70010b,0x72010b, + 0x72010f,0x74010b,0x74010f,0x76010f,0x78010f,0x7a010f,0x7c010b,0x7c010f, + 0x80010b,0x80010f,0x82010b,0x82010f,0x84010f,0x86010f,0x88010f,0x8a010f, + 0x8c010b,0x8e010f,0x90010f,0x92010f,0x94010d,0x960109,0x96010d,0x980109, + 0x98010d,0x9a010d,0x9c0109,0x9c010d,0x9e010b,0x9e010f,0x100010b,0x100010f, + 0x102010b,0x102010f,0x104010b,0x104010f,0x106010b,0x106010f,0x107010f,0x108010f, + 0x109010f,0x10a010f,0x10b010f,0x10c010f,0x10d010f,0x10e010f,0x10f010f,0x110010f, + 0x111010f,0x112010f,0x113010f,0x114010f,0x115010f,0x116010f,0x117010f,0x118010f, + 0x119010f,0x11a010f,0x11b010f,0x11c010f,0x11d010f,0x11e010f,0x11f010f,0x120010f, + 0x121010f,0x122010f,0x123010f,0x124010f,0x125010f,0x126010f,0x127010f,0x128010f, + 0x129010f,0x12a010f,0x12b010f,0x12c010f,0x12d010f,0x12e010f,0x12f010f,0x130010f, + 0x131010f,0x132010f,0x133010f,0x134010f,0x135010f,0x136010f,0x137010f,0x138010f, + 0x139010f,0x13b010f,0x13c010d,0x13d010d,0x13e010f,0x13f010f,0x140010f,0x141010f, + 0x142010f,0x143010d,0x144010d,0x145010d,0x146010d,0x147010d,0x148010d,0x149010d, + 0x14a010d,0x14b010d,0x14c010d,0x14d010d,0x14e010d,0x14f010d,0x150010d,0x151010d, + 0x152010d,0x153010d,0x154010d,0x155010d,0x156010d,0x157010d,0x158010d,0x159010d, + 0x15a010d,0x15b010d,0x15c010d,0x15d010d,0x15e010d,0x15f010d,0x160010f,0x161010f, + 0x162010f,0x163010f,0x164010f,0x165010f,0x166010f,0x167010f,0x168010f,0x169010f, + 0x16a010f,0x16b010f,0x16c010f,0x16d010f,0x16e010f,0x16f010f,0x170010f,0x171010f, + 0x172010f,0x174010f,0x175010f,0x176010f,0x177010f,0x178010f,0x179010f,0x17a010d, + 0x17b010d,0x17c010d,0x17d0119,0x17e0119,0x17f0119,0x1800119,0x1810119,0x182010d, + 0x183010d,0x184010d,0x185010d,0x186010d,0x187010d,0x189010f,0x18a010f,0x18b010f, + 0x18c010f,0x18d0111,0x18e0111,0x18f0111,0x1900111,0x1910111,0x1920111,0x1930111, + 0x1940111,0x1950111,0x1960111,0x197010f,0x198010f,0x199010b,0x199010f,0x6c50109, + 0x6c60109,0x6c70109,0x6c80109,0x6c90109,0x6ca0109,0x6cb0109,0x6cc0109,0x6cd0109, + 0x6ce0109,0x6cf0109,0x6cf010d,0x6cf0121,0x6cf0125,0x6e30109,0x6e3010d,0x6e30121, + 0x6e30125,0x6fb0109,0x6fb010d,0x6fb0121,0x6fb0125,0x7070109,0x707010d,0x7070121, + 0x7070125,0x72f0109,0x72f010d,0x72f0121,0x72f0125,0x75b0109,0x75b010d,0x75b0121, + 0x75b0125,0x7630109,0x763010d,0x7630121,0x7630125,0x7830109,0x783010d,0x7830121, + 0x7830125,0x79d0109,0x79d010d,0x79d0121,0x79d0125,0x7b10109,0x7b1010d,0x7b10121, + 0x7b10125,0x7c10109,0x7c1010d,0x7c10121,0x7c10125,0x7cd0109,0x7cd010d,0x7cd0121, + 0x7cd0125,0x7f50109,0x7f5010d,0x7f50121,0x7f50125,0x7fd0109,0x7fd010d,0x7fd0121, + 0x7fd0125,0x8150109,0x815010d,0x8150121,0x8150125,0x82d0109,0x82d010d,0x82d0121, + 0x82d0125,0x8390109,0x839010d,0x8390121,0x8390125,0x8450109,0x845010d,0x8450121, + 0x8450125,0x86d0109,0x86d010d,0x86d0121,0x86d0125,0x8890109,0x889010d,0x8890121, + 0x8890125,0x8ad0109,0x8ad010d,0x8ad0121,0x8ad0125,0x8c50109,0x8c5010d,0x8c50121, + 0x8c50125,0x8d10109,0x8d1010d,0x8d10121,0x8d10125,0x8d90109,0x8d9010d,0x8d90121, + 0x8d90125,0x8dd0109,0x8dd010d,0x8dd0121,0x8dd0125,0x8e90109,0x8e9010d,0x8e90121, + 0x8e90125,0x10200139,0x10200149,0x10200141,0x10260139,0x10260149,0x10260141,0x102c0139, + 0x102c0149,0x102c0141,0x10330139,0x10330149,0x10330141,0x10390139,0x10390149,0x10390141, + 0x103f0135,0x103f0145,0x103f013d,0x10440135,0x10440145,0x1044013d,0x10490135,0x10490145, + 0x1049013d,0x104e0135,0x104e0145,0x104e013d,0x10530135,0x10530145,0x1053013d,0x10580135, + 0x10580145,0x1058013d,0x105d0135,0x105d0145,0x105d013d,0x10620135,0x10620145,0x1062013d, + 0x10670135,0x10670145,0x1067013d,0x106c0135,0x106c0145,0x106c013d,0x10710135,0x10710145, + 0x1071013d,0x10760135,0x10760145,0x1076013d,0x107b0139,0x107b0135,0x107b0149,0x107b0141, + 0x107b0145,0x107b013d,0x10830135,0x10830145,0x1083013d,0x10880135,0x10880145,0x1088013d, + 0x108d0135,0x108d0145,0x108d013d,0x10900135,0x10900145,0x1090013d,0x10930135,0x10930145, + 0x1093013d,0x10960135,0x10960145,0x1096013d,0x10990135,0x10990145,0x1099013d,0x109c0135, + 0x109c0145,0x109c013d,0x10a30135,0x10a30145,0x10a3013d,0x10aa0135,0x10aa0145,0x10aa013d, + 0x10b10135,0x10b10145,0x10b1013d,0x10b80135,0x10b80145,0x10b8013d,0x10bf0135,0x10bf0145, + 0x10bf013d,0x10c20135,0x10c20145,0x10c2013d,0x10c50135,0x10c50145,0x10c5013d,0x10c80135, + 0x10c80145,0x10c8013d,0x10cb0135,0x10cb0145,0x10cb013d,0x10ce0139,0x10ce0135,0x10ce0149, + 0x10ce0141,0x10ce0145,0x10ce013d,0x10d40139,0x10d40135,0x10d40149,0x10d40141,0x10d40145, + 0x10d4013d,0x10da0139,0x10da0135,0x10da0149,0x10da0141,0x10da0145,0x10da013d,0x10e00135, + 0x10e00145,0x10e0013d,0x10e30135,0x10e30145,0x10e3013d,0x10e60135,0x10e60145,0x10e6013d, + 0x10e90135,0x10e90145,0x10e9013d,0x10ec0135,0x10ec0145,0x10ec013d,0x10ef0139,0x10ef0135, + 0x10ef0149,0x10ef0145,0x10ef013d,0x10f40135,0x10f40145,0x10f60135,0x10f60145,0x10f80135, + 0x10f80145,0x10f8013d,0x10fb0135,0x10fb0145, + }; + +static const TUint32 TheKanaIndex[] = + { + 0x210233,0x22032d,0x230296,0x24028f,0x250294,0x260298,0x270239,0x28025d, + 0x29025f,0x2a029a,0x2b0277,0x2c0226,0x2d0279,0x2e0228,0x2f024e,0x30032f, + 0x310330,0x320331,0x330332,0x340333,0x350334,0x360335,0x370336,0x380337, + 0x390338,0x3a022c,0x3b022e,0x3c0280,0x3d027e,0x3e0282,0x3f0231,0x40029c, + 0x41033b,0x42033f,0x430343,0x440347,0x45034b,0x46034f,0x470353,0x480357, + 0x49035b,0x4a035f,0x4b0363,0x4c0367,0x4d036b,0x4e036f,0x4f0373,0x500377, + 0x51037b,0x52037f,0x530383,0x540387,0x55038b,0x56038f,0x570393,0x580397, + 0x59039b,0x5a039f,0x5b0263,0x5c0250,0x5d0265,0x5e023e,0x5f0241,0x60023b, + 0x610339,0x62033d,0x630341,0x640345,0x650349,0x66034d,0x670351,0x680355, + 0x690359,0x6a035d,0x6b0361,0x6c0365,0x6d0369,0x6e036d,0x6f0371,0x700375, + 0x710379,0x72037d,0x730381,0x740385,0x750389,0x76038d,0x770391,0x780395, + 0x790399,0x7a039d,0x7b0267,0x7c0255,0x7d0269,0x7e0253,0xa20291,0xa30292, + 0xa5028d,0xa7029e,0xa8023d,0xb00289,0xb1027b,0xb4023a,0xb602d7,0xd7027c, + 0xf7027d,0x2010024d,0x2015024c,0x20180259,0x2019025a,0x201c025b,0x201d025c,0x202002d5, + 0x202102d6,0x20250258,0x20260257,0x203002d1,0x2032028a,0x2033028b,0x203b02ac,0x2103028c, + 0x2116030f,0x21210311,0x216002ec,0x216102ed,0x216202ee,0x216302ef,0x216402f0,0x216502f1, + 0x216602f2,0x216702f3,0x216802f4,0x216902f5,0x21700321,0x21710322,0x21720323,0x21730324, + 0x21740325,0x21750326,0x21760327,0x21770328,0x21780329,0x2179032a,0x219002af,0x219102b0, + 0x219202ae,0x219302b1,0x21d202be,0x21d402bf,0x220002c0,0x220202c5,0x220302c1,0x220702c6, + 0x220802b3,0x220b02b4,0x2211031e,0x2212027a,0x221a02cb,0x221d02cd,0x221e0286,0x221f031f, + 0x222002c2,0x22250254,0x222702bb,0x222802bc,0x222902ba,0x222a02b9,0x222b02cf,0x222c02d0, + 0x222e031d,0x22340286,0x223502ce,0x223d02cc,0x225202c8,0x226102c7,0x22660284,0x22670285, + 0x226a02c9,0x226b02ca,0x228202b7,0x228302b8,0x228602b5,0x228702b6,0x22a502c3,0x22bf0320, + 0x231202c4,0x246002d9,0x246102da,0x246202db,0x246302dc,0x246402dd,0x246502de,0x246602df, + 0x246702e0,0x246802e1,0x246902e2,0x246a02e3,0x246b02e3,0x246c02e4,0x246d02e5,0x246e02e6, + 0x246f02e7,0x247002e8,0x247102e9,0x247202ea,0x247302eb,0x25a002a7,0x25a102a6,0x25b202a9, + 0x25b302a8,0x25bc02ab,0x25bd02aa,0x25c602a5,0x25c702a4,0x25cb02a1,0x25ce02a3,0x25cf02a2, + 0x25ef02d8,0x260502a0,0x2606029f,0x26400288,0x26420287,0x266a02d4,0x266d02d3,0x266f02d2, + 0x30010223,0x30020225,0x30030245,0x30050247,0x30060248,0x30070249,0x3008026b,0x3009026c, + 0x300a026d,0x300b026e,0x300c026f,0x300d0271,0x300e0273,0x300f0274,0x30100275,0x30110276, + 0x301202ad,0x301302b2,0x30140261,0x30150262,0x301c0252,0x301d030d,0x301f030e,0x304103a1, + 0x304200d6,0x304303a4,0x304400ce,0x304503a7,0x304600d0,0x304703aa,0x304800d2,0x304903ad, + 0x304a00d4,0x304b03b0,0x304d03b3,0x304f03b6,0x305103b9,0x305303bc,0x305503bf,0x305703c2, + 0x305903c5,0x305b03c8,0x305d03cb,0x305f03ce,0x306103d1,0x306303d4,0x306403d5,0x306603da, + 0x306803dd,0x306a03e0,0x306b03e3,0x306c03e6,0x306d03e9,0x306e03ec,0x306f03ef,0x307203f2, + 0x307503f5,0x307803f8,0x307b03fb,0x307e03fe,0x307f0401,0x30800404,0x30810407,0x3082040a, + 0x3083040d,0x3084040e,0x30850413,0x30860414,0x30870419,0x3088041a,0x3089041f,0x308a0422, + 0x308b0425,0x308c0428,0x308d042b,0x308e042e,0x308f042f,0x30900433,0x30910435,0x30920437, + 0x3093043a,0x30990029,0x309a0221,0x309b0236,0x309c0238,0x309d0244,0x30a103a2,0x30a20178, + 0x30a303a5,0x30a4017b,0x30a503a8,0x30a6017e,0x30a703ab,0x30a80181,0x30a903ae,0x30aa0184, + 0x30ab03b1,0x30ad03b4,0x30af03b7,0x30b103ba,0x30b303bd,0x30b503c0,0x30b703c3,0x30b903c6, + 0x30bb03c9,0x30bd03cc,0x30bf03cf,0x30c103d2,0x30c303d6,0x30c403d8,0x30c603db,0x30c803de, + 0x30ca03e1,0x30cb03e4,0x30cc03e7,0x30cd03ea,0x30ce03ed,0x30cf03f0,0x30d203f3,0x30d503f6, + 0x30d803f9,0x30db03fc,0x30de03ff,0x30df0402,0x30e00405,0x30e10408,0x30e2040b,0x30e3040f, + 0x30e40411,0x30e50415,0x30e60417,0x30e7041b,0x30e8041d,0x30e90420,0x30ea0423,0x30eb0426, + 0x30ec0429,0x30ed042c,0x30ee0430,0x30ef0431,0x30f00434,0x30f10436,0x30f20438,0x30f3043b, + 0x30fb022a,0x30fc024b,0x30fd0243,0x32310317,0x32320318,0x32390319,0x32a40312,0x32a50313, + 0x32a60314,0x32a70315,0x32a80316,0x330302fc,0x330d0300,0x331402f7,0x331802fa,0x332202f8, + 0x33230302,0x33260301,0x332702fb,0x332b0303,0x333602fd,0x333b0305,0x334902f6,0x334a0304, + 0x334d02f9,0x335102fe,0x335702ff,0x337b030c,0x337c031c,0x337d031b,0x337e031a,0x338f0309, + 0x339c0306,0x339d0307,0x339e0308,0x33a1030b,0x33c4030a,0x33cd0310,0x4edd0246,0xfe540230, + 0xff010234,0xff02032e,0xff030297,0xff040290,0xff050295,0xff060299,0xff07032c,0xff08025e, + 0xff090260,0xff0a029b,0xff0b0278,0xff0c0227,0xff0d027a,0xff0e0229,0xff0f024f,0xff1a022d, + 0xff1b022f,0xff1c0281,0xff1d027f,0xff1e0283,0xff1f0232,0xff20029d,0xff21033c,0xff220340, + 0xff230344,0xff240348,0xff25034c,0xff260350,0xff270354,0xff280358,0xff29035c,0xff2a0360, + 0xff2b0364,0xff2c0368,0xff2d036c,0xff2e0370,0xff2f0374,0xff300378,0xff31037c,0xff320380, + 0xff330384,0xff340388,0xff35038c,0xff360390,0xff370394,0xff380398,0xff39039c,0xff3a03a0, + 0xff3b0264,0xff3c0251,0xff3d0266,0xff3e023f,0xff3f0242,0xff40023c,0xff41033a,0xff42033e, + 0xff430342,0xff440346,0xff45034a,0xff46034e,0xff470352,0xff480356,0xff49035a,0xff4a035e, + 0xff4b0362,0xff4c0366,0xff4d036a,0xff4e036e,0xff4f0372,0xff500376,0xff51037a,0xff52037e, + 0xff530382,0xff540386,0xff55038a,0xff56038e,0xff570392,0xff580396,0xff59039a,0xff5a039e, + 0xff5b0268,0xff5c0256,0xff5d026a,0xff5e0252,0xff610224,0xff620270,0xff630272,0xff640222, + 0xff65022b,0xff660439,0xff6703a3,0xff6803a6,0xff6903a9,0xff6a03ac,0xff6b03af,0xff6c0410, + 0xff6d0416,0xff6e041c,0xff6f03d7,0xff70024a,0xff710220,0xff720215,0xff730217,0xff740219, + 0xff75021b,0xff7603b2,0xff7703b5,0xff7803b8,0xff7903bb,0xff7a03be,0xff7b03c1,0xff7c03c4, + 0xff7d03c7,0xff7e03ca,0xff7f03cd,0xff8003d0,0xff8103d3,0xff8203d9,0xff8303dc,0xff8403df, + 0xff8503e2,0xff8603e5,0xff8703e8,0xff8803eb,0xff8903ee,0xff8a03f1,0xff8b03f4,0xff8c03f7, + 0xff8d03fa,0xff8e03fd,0xff8f0400,0xff900403,0xff910406,0xff920409,0xff93040c,0xff940412, + 0xff950418,0xff96041e,0xff970421,0xff980424,0xff990427,0xff9a042a,0xff9b042d,0xff9c0432, + 0xff9e0235,0xff9f0237,0xffe00291,0xffe10293,0xffe202bd,0xffe30240,0xffe4032b,0xffe5028e, + }; + +static const TUint16 TheKanaStringElement[] = + { + 0x2,0xff73,0xff9e,0x2,0xff76,0xff9e,0x2,0xff77, + 0xff9e,0x2,0xff78,0xff9e,0x2,0xff79,0xff9e,0x2, + 0xff7a,0xff9e,0x2,0xff7b,0xff9e,0x2,0xff7c,0xff9e, + 0x2,0xff7d,0xff9e,0x2,0xff7e,0xff9e,0x2,0xff7f, + 0xff9e,0x2,0xff80,0xff9e,0x2,0xff81,0xff9e,0x2, + 0xff82,0xff9e,0x2,0xff83,0xff9e,0x2,0xff84,0xff9e, + 0x2,0xff8a,0xff9e,0x2,0xff8b,0xff9e,0x2,0xff8c, + 0xff9e,0x2,0xff8d,0xff9e,0x2,0xff8e,0xff9e,0x2, + 0xff8a,0xff9f,0x2,0xff8b,0xff9f,0x2,0xff8c,0xff9f, + 0x2,0xff8d,0xff9f,0x2,0xff8e,0xff9f,0x2,0x3042, + 0x30fc,0x2,0x3044,0x30fc,0x2,0x3046,0x30fc,0x2, + 0x3048,0x30fc,0x2,0x304a,0x30fc,0x2,0x304b,0x30fc, + 0x2,0x304d,0x30fc,0x2,0x304f,0x30fc,0x2,0x3051, + 0x30fc,0x2,0x3053,0x30fc,0x3,0x304b,0x3099,0x30fc, + 0x3,0x304d,0x3099,0x30fc,0x3,0x304f,0x3099,0x30fc, + 0x3,0x3051,0x3099,0x30fc,0x3,0x3053,0x3099,0x30fc, + 0x2,0x3055,0x30fc,0x2,0x3057,0x30fc,0x2,0x3059, + 0x30fc,0x2,0x305b,0x30fc,0x2,0x305d,0x30fc,0x3, + 0x3055,0x3099,0x30fc,0x3,0x3057,0x3099,0x30fc,0x3, + 0x3059,0x3099,0x30fc,0x3,0x305b,0x3099,0x30fc,0x3, + 0x305d,0x3099,0x30fc,0x2,0x305f,0x30fc,0x2,0x3061, + 0x30fc,0x2,0x3064,0x30fc,0x2,0x3066,0x30fc,0x2, + 0x3068,0x30fc,0x3,0x305f,0x3099,0x30fc,0x3,0x3061, + 0x3099,0x30fc,0x3,0x3064,0x3099,0x30fc,0x3,0x3066, + 0x3099,0x30fc,0x3,0x3068,0x3099,0x30fc,0x2,0x306a, + 0x30fc,0x2,0x306b,0x30fc,0x2,0x306c,0x30fc,0x2, + 0x306d,0x30fc,0x2,0x306e,0x30fc,0x2,0x306f,0x30fc, + 0x2,0x3072,0x30fc,0x2,0x3075,0x30fc,0x2,0x3078, + 0x30fc,0x2,0x307b,0x30fc,0x3,0x306f,0x3099,0x30fc, + 0x3,0x3072,0x3099,0x30fc,0x3,0x3075,0x3099,0x30fc, + 0x3,0x3078,0x3099,0x30fc,0x3,0x307b,0x3099,0x30fc, + 0x3,0x306f,0x309a,0x30fc,0x3,0x3072,0x309a,0x30fc, + 0x3,0x3075,0x309a,0x30fc,0x3,0x3078,0x309a,0x30fc, + 0x3,0x307b,0x309a,0x30fc,0x2,0x307e,0x30fc,0x2, + 0x307f,0x30fc,0x2,0x3080,0x30fc,0x2,0x3081,0x30fc, + 0x2,0x3082,0x30fc,0x2,0x3084,0x30fc,0x2,0x3086, + 0x30fc,0x2,0x3088,0x30fc,0x2,0x3089,0x30fc,0x2, + 0x308a,0x30fc,0x2,0x308b,0x30fc,0x2,0x308c,0x30fc, + 0x2,0x308d,0x30fc,0x2,0x308f,0x30fc,0x2,0x30ab, + 0x30fc,0x2,0x30ad,0x30fc,0x2,0x30af,0x30fc,0x2, + 0x30b1,0x30fc,0x2,0x30b3,0x30fc,0x3,0x30ab,0x3099, + 0x30fc,0x3,0x30ad,0x3099,0x30fc,0x3,0x30af,0x3099, + 0x30fc,0x3,0x30b1,0x3099,0x30fc,0x3,0x30b3,0x3099, + 0x30fc,0x2,0x30b5,0x30fc,0x2,0x30b7,0x30fc,0x2, + 0x30b9,0x30fc,0x2,0x30bb,0x30fc,0x2,0x30bd,0x30fc, + 0x3,0x30b5,0x3099,0x30fc,0x3,0x30b7,0x3099,0x30fc, + 0x3,0x30b9,0x3099,0x30fc,0x3,0x30bb,0x3099,0x30fc, + 0x3,0x30bd,0x3099,0x30fc,0x2,0x30bf,0x30fc,0x2, + 0x30c1,0x30fc,0x2,0x30c4,0x30fc,0x2,0x30c6,0x30fc, + 0x2,0x30c8,0x30fc,0x3,0x30bf,0x3099,0x30fc,0x3, + 0x30c1,0x3099,0x30fc,0x3,0x30c4,0x3099,0x30fc,0x3, + 0x30c6,0x3099,0x30fc,0x3,0x30c8,0x3099,0x30fc,0x2, + 0x30ca,0x30fc,0x2,0x30cb,0x30fc,0x2,0x30cc,0x30fc, + 0x2,0x30cd,0x30fc,0x2,0x30ce,0x30fc,0x2,0x30cf, + 0x30fc,0x2,0x30d2,0x30fc,0x2,0x30d5,0x30fc,0x2, + 0x30d8,0x30fc,0x2,0x30db,0x30fc,0x3,0x30cf,0x3099, + 0x30fc,0x3,0x30d2,0x3099,0x30fc,0x3,0x30d5,0x3099, + 0x30fc,0x3,0x30d8,0x3099,0x30fc,0x3,0x30db,0x3099, + 0x30fc,0x3,0x30cf,0x309a,0x30fc,0x3,0x30d2,0x309a, + 0x30fc,0x3,0x30d5,0x309a,0x30fc,0x3,0x30d8,0x309a, + 0x30fc,0x3,0x30db,0x309a,0x30fc,0x2,0x30de,0x30fc, + 0x2,0x30df,0x30fc,0x2,0x30e0,0x30fc,0x2,0x30e1, + 0x30fc,0x2,0x30e2,0x30fc,0x2,0x30e4,0x30fc,0x2, + 0x30e6,0x30fc,0x2,0x30e8,0x30fc,0x2,0x30e9,0x30fc, + 0x2,0x30ea,0x30fc,0x2,0x30eb,0x30fc,0x2,0x30ec, + 0x30fc,0x2,0x30ed,0x30fc,0x2,0x30ef,0x30fc,0x2, + 0x30f0,0x30fc,0x2,0x30f1,0x30fc,0x2,0x30f2,0x30fc, + 0x3,0x30ef,0x3099,0x30fc,0x3,0x30f0,0x3099,0x30fc, + 0x3,0x30ef,0x3099,0x30fc,0x3,0x30f1,0x3099,0x30fc, + 0x3,0x30f2,0x3099,0x30fc,0x2,0xff76,0xff70,0x2, + 0xff77,0xff70,0x2,0xff78,0xff70,0x2,0xff79,0xff70, + 0x2,0xff7a,0xff70,0x3,0xff76,0xff9e,0xff70,0x3, + 0xff77,0xff9e,0xff70,0x3,0xff78,0xff9e,0xff70,0x3, + 0xff79,0xff9e,0xff70,0x3,0xff7a,0xff9e,0xff70,0x2, + 0xff7b,0xff70,0x2,0xff7c,0xff70,0x2,0xff7d,0xff70, + 0x2,0xff7e,0xff70,0x2,0xff7f,0xff70,0x3,0xff7b, + 0xff9e,0xff70,0x3,0xff7c,0xff9e,0xff70,0x3,0xff7d, + 0xff9e,0xff70,0x3,0xff7e,0xff9e,0xff70,0x3,0xff7f, + 0xff9e,0xff70,0x2,0xff80,0xff70,0x2,0xff81,0xff70, + 0x2,0xff82,0xff70,0x2,0xff83,0xff70,0x2,0xff84, + 0xff70,0x3,0xff80,0xff9e,0xff70,0x3,0xff81,0xff9e, + 0xff70,0x3,0xff82,0xff9e,0xff70,0x3,0xff83,0xff9e, + 0xff70,0x3,0xff84,0xff9e,0xff70,0x2,0xff85,0xff70, + 0x2,0xff86,0xff70,0x2,0xff87,0xff70,0x2,0xff88, + 0xff70,0x2,0xff89,0xff70,0x2,0xff8a,0xff70,0x2, + 0xff8b,0xff70,0x2,0xff8c,0xff70,0x2,0xff8d,0xff70, + 0x2,0xff8e,0xff70,0x3,0xff8a,0xff9e,0xff70,0x3, + 0xff8b,0xff9e,0xff70,0x3,0xff8c,0xff9e,0xff70,0x3, + 0xff8d,0xff9e,0xff70,0x3,0xff8e,0xff9e,0xff70,0x3, + 0xff8a,0xff9f,0xff70,0x3,0xff8b,0xff9f,0xff70,0x3, + 0xff8c,0xff9f,0xff70,0x3,0xff8d,0xff9f,0xff70,0x3, + 0xff8e,0xff9f,0xff70,0x2,0xff8f,0xff70,0x2,0xff90, + 0xff70,0x2,0xff91,0xff70,0x2,0xff92,0xff70,0x2, + 0xff93,0xff70,0x2,0xff94,0xff70,0x2,0xff95,0xff70, + 0x2,0xff96,0xff70,0x2,0xff97,0xff70,0x2,0xff98, + 0xff70,0x2,0xff99,0xff70,0x2,0xff9a,0xff70,0x2, + 0xff9b,0xff70,0x2,0xff9c,0xff70,0x3,0xff9c,0xff9e, + 0xff70, + }; + +static const TUint32 TheKanaStringIndex[] = + { + 0x4e0034,0x510036,0x540038,0x57003a,0x5a003c,0x6c0048,0x5d003e,0x70004b, + 0x600040,0x74004e,0x630042,0x780051,0x660044,0x7c0054,0x690046,0x8f0061, + 0x800057,0x930064,0x830059,0x970067,0x86005b,0x9b006a,0x89005d,0x9f006d, + 0x8c005f,0xb2007a,0xa30070,0xb6007d,0xa60072,0xba0080,0xa90074,0xbe0083, + 0xac0076,0xc20086,0xaf0078,0xc60089,0xc9008b,0xcc008d,0xcf008f,0xd20091, + 0xe4009d,0xf800ac,0xd50093,0xe800a0,0xfc00af,0xd80095,0xec00a3,0x10000b2, + 0xdb0097,0xf000a6,0x10400b5,0xde0099,0xf400a9,0x10800b8,0xe1009b,0x10c00bb, + 0x10f00bd,0x11200bf,0x11500c1,0x11800c3,0x11b00c5,0x11e00c7,0x12100c9,0x12400cb, + 0x12700cd,0x12a00cf,0x12d00d1,0x13000d3,0x13300d5,0x14500e1,0x13600d7,0x14900e4, + 0x13900d9,0x14d00e7,0x13c00db,0x15100ea,0x13f00dd,0x15500ed,0x14200df,0x16800fa, + 0x15900f0,0x16c00fd,0x15c00f2,0x1700100,0x15f00f4,0x1740103,0x16200f6,0x1780106, + 0x16500f8,0x18b0113,0x17c0109,0x18f0116,0x17f010b,0x1930119,0x182010d,0x197011c, + 0x185010f,0x19b011f,0x1880111,0x19f0122,0x1a20124,0x1a50126,0x1a80128,0x1ab012a, + 0x1bd0136,0x1d10145,0x1ae012c,0x1c10139,0x1d50148,0x1b1012e,0x1c5013c,0x1d9014b, + 0x1b40130,0x1c9013f,0x1dd014e,0x1b70132,0x1cd0142,0x1e10151,0x1ba0134,0x1e50154, + 0x1e80156,0x1eb0158,0x1ee015a,0x1f1015c,0x1f4015e,0x1f70160,0x1fa0162,0x1fd0164, + 0x2000166,0x2030168,0x206016a,0x209016c,0x2180176,0x220017c,0x20c016e,0x21c0179, + 0x20f0170,0x224017f,0x2120172,0x2280182,0x2150174,0x0,0x22c0185,0x30002, + 0x23b018f,0x22f0187,0x60004,0x23f0192,0x2320189,0x90006,0x2430195,0x235018b, + 0xc0008,0x2470198,0x238018d,0xf000a,0x24b019b,0x24f019e,0x12000c,0x25e01a8, + 0x25201a0,0x15000e,0x26201ab,0x25501a2,0x180010,0x26601ae,0x25801a4,0x1b0012, + 0x26a01b1,0x25b01a6,0x1e0014,0x26e01b4,0x27201b7,0x210016,0x28101c1,0x27501b9, + 0x240018,0x28501c4,0x27801bb,0x27001a,0x28901c7,0x27b01bd,0x2a001c,0x28d01ca, + 0x27e01bf,0x2d001e,0x29101cd,0x29501d0,0x29801d2,0x29b01d4,0x29e01d6,0x2a101d8, + 0x2a401da,0x300020,0x2b301e4,0x3f002a,0x2c701f3,0x2a701dc,0x330022,0x2b701e7, + 0x42002c,0x2cb01f6,0x2aa01de,0x360024,0x2bb01ea,0x45002e,0x2cf01f9,0x2ad01e0, + 0x390026,0x2bf01ed,0x480030,0x2d301fc,0x2b001e2,0x3c0028,0x2c301f0,0x4b0032, + 0x2d701ff,0x2db0202,0x2de0204,0x2e10206,0x2e40208,0x2e7020a,0x2ea020c,0x2ed020e, + 0x2f00210,0x2f30212,0x2f60214,0x2f90216,0x2fc0218,0x2ff021a,0x302021c,0x305021e, + }; + +static const TCollationKeyTable TheKanaTable = + { TheKanaKey, TheKanaIndex, 560, TheKanaStringElement, TheKanaStringIndex, 232 }; + + +static const TCollationMethod TheKanaMethod = + { 0, NULL, &TheKanaTable, 0 }; + +static const TCollationMethod TheSwapKanaMethod = + { 0, NULL, &TheKanaTable, TCollationMethod::ESwapKana }; + +// Simplified Chinese. The data is extracted from loce32\Is_unic_template_chinese_simplified.cpp +static const TUint32 TheChineseKey[] = + { + 0x4e01001d,0x4e02001d,0x4e03001d,0x4e04001d,0x4e05001d,0x4e06001d,0x4e07001d,0x4e08001d, + 0x4e09001d,0x4e0a001d,0x4e0b001d,0x4e0c001d,0x4e0d001d,0x4e0e001d,0x4e0f001d,0x4e10001d, + 0x4e11001d,0x4e12001d,0x4e13001d,0x4e14001d,0x4e15001d,0x4e16001d,0x4e17001d,0x4e18001d, + 0x4e19001d,0x4e1a001d,0x4e1b001d,0x4e1c001d,0x4e1d001d,0x4e1e001d,0x4e1f001d,0x4e20001d, + 0x4e21001d,0x4e22001d,0x4e23001d,0x4e24001d,0x4e25001d,0x4e26001d,0x4e27001d,0x4e28001d, + 0x4e29001d,0x4e2a001d,0x4e2b001d,0x4e2c001d,0x4e2d001d,0x4e2e001d,0x4e2f001d,0x4e30001d, + 0x4e31001d,0x4e32001d,0x4e33001d,0x4e34001d,0x4e35001d,0x4e36001d,0x4e37001d,0x4e38001d, + 0x4e39001d,0x4e3a001d,0x4e3b001d,0x4e3c001d,0x4e3d001d,0x4e3e001d,0x4e3f001d,0x4e40001d, + 0x4e41001d,0x4e42001d,0x4e43001d,0x4e44001d,0x4e45001d,0x4e46001d,0x4e47001d,0x4e48001d, + 0x4e49001d,0x4e4a001d,0x4e4b001d,0x4e4c001d,0x4e4d001d,0x4e4e001d,0x4e4f001d,0x4e50001d, + 0x4e51001d,0x4e52001d,0x4e53001d,0x4e54001d,0x4e55001d,0x4e56001d,0x4e57001d,0x4e58001d, + 0x4e59001d,0x4e5a001d,0x4e5b001d,0x4e5c001d,0x4e5d001d,0x4e5e001d,0x4e5f001d,0x4e60001d, + 0x4e61001d,0x4e62001d,0x4e63001d,0x4e64001d,0x4e65001d,0x4e66001d,0x4e67001d,0x4e68001d, + 0x4e69001d,0x4e6a001d,0x4e6b001d,0x4e6c001d,0x4e6d001d,0x4e6e001d,0x4e6f001d,0x4e70001d, + 0x4e71001d,0x4e72001d,0x4e73001d,0x4e74001d,0x4e75001d,0x4e76001d,0x4e77001d,0x4e78001d, + 0x4e79001d,0x4e7a001d,0x4e7b001d,0x4e7c001d,0x4e7d001d,0x4e7e001d,0x4e7f001d,0x4e80001d, + 0x4e81001d,0x4e82001d,0x4e83001d,0x4e84001d,0x4e85001d,0x4e86001d,0x4e87001d,0x4e88001d, + 0x4e89001d,0x4e8a001d,0x4e8b001d,0x4e8c001d,0x4e8d001d,0x4e8e001d,0x4e8f001d,0x4e90001d, + 0x4e91001d,0x4e92001d,0x4e93001d,0x4e94001d,0x4e95001d,0x4e96001d,0x4e97001d,0x4e98001d, + 0x4e99001d,0x4e9a001d,0x4e9b001d,0x4e9c001d,0x4e9d001d,0x4e9e001d,0x4e9f001d,0x4ea0001d, + 0x4ea1001d,0x4ea2001d,0x4ea3001d,0x4ea4001d,0x4ea5001d,0x4ea6001d,0x4ea7001d,0x4ea8001d, + 0x4ea9001d,0x4eaa001d,0x4eab001d,0x4eac001d,0x4ead001d,0x4eae001d,0x4eaf001d,0x4eb0001d, + 0x4eb1001d,0x4eb2001d,0x4eb3001d,0x4eb4001d,0x4eb5001d,0x4eb6001d,0x4eb7001d,0x4eb8001d, + 0x4eb9001d,0x4eba001d,0x4ebb001d,0x4ebc001d,0x4ebd001d,0x4ebe001d,0x4ebf001d,0x4ec0001d, + 0x4ec1001d,0x4ec2001d,0x4ec3001d,0x4ec4001d,0x4ec5001d,0x4ec6001d,0x4ec7001d,0x4ec8001d, + 0x4ec9001d,0x4eca001d,0x4ecb001d,0x4ecc001d,0x4ecd001d,0x4ece001d,0x4ecf001d,0x4ed0001d, + 0x4ed1001d,0x4ed2001d,0x4ed3001d,0x4ed4001d,0x4ed5001d,0x4ed6001d,0x4ed7001d,0x4ed8001d, + 0x4ed9001d,0x4eda001d,0x4edb001d,0x4edc001d,0x4edd001d,0x4ede001d,0x4edf001d,0x4ee0001d, + 0x4ee1001d,0x4ee2001d,0x4ee3001d,0x4ee4001d,0x4ee5001d,0x4ee6001d,0x4ee7001d,0x4ee8001d, + 0x4ee9001d,0x4eea001d,0x4eeb001d,0x4eec001d,0x4eed001d,0x4eee001d,0x4eef001d,0x4ef0001d, + 0x4ef1001d,0x4ef2001d,0x4ef3001d,0x4ef4001d,0x4ef5001d,0x4ef6001d,0x4ef7001d,0x4ef8001d, + 0x4ef9001d,0x4efa001d,0x4efb001d,0x4efc001d,0x4efd001d,0x4efe001d,0x4eff001d,0x4f00001d, + 0x4f01001d,0x4f02001d,0x4f03001d,0x4f04001d,0x4f05001d,0x4f06001d,0x4f07001d,0x4f08001d, + 0x4f09001d,0x4f0a001d,0x4f0b001d,0x4f0c001d,0x4f0d001d,0x4f0e001d,0x4f0f001d,0x4f10001d, + 0x4f11001d,0x4f12001d,0x4f13001d,0x4f14001d,0x4f15001d,0x4f16001d,0x4f17001d,0x4f18001d, + 0x4f19001d,0x4f1a001d,0x4f1b001d,0x4f1c001d,0x4f1d001d,0x4f1e001d,0x4f1f001d,0x4f20001d, + 0x4f21001d,0x4f22001d,0x4f23001d,0x4f24001d,0x4f25001d,0x4f26001d,0x4f27001d,0x4f28001d, + 0x4f29001d,0x4f2a001d,0x4f2b001d,0x4f2c001d,0x4f2d001d,0x4f2e001d,0x4f2f001d,0x4f30001d, + 0x4f31001d,0x4f32001d,0x4f33001d,0x4f34001d,0x4f35001d,0x4f36001d,0x4f37001d,0x4f38001d, + 0x4f39001d,0x4f3a001d,0x4f3b001d,0x4f3c001d,0x4f3d001d,0x4f3e001d,0x4f3f001d,0x4f40001d, + 0x4f41001d,0x4f42001d,0x4f43001d,0x4f44001d,0x4f45001d,0x4f46001d,0x4f47001d,0x4f48001d, + 0x4f49001d,0x4f4a001d,0x4f4b001d,0x4f4c001d,0x4f4d001d,0x4f4e001d,0x4f4f001d,0x4f50001d, + 0x4f51001d,0x4f52001d,0x4f53001d,0x4f54001d,0x4f55001d,0x4f56001d,0x4f57001d,0x4f58001d, + 0x4f59001d,0x4f5a001d,0x4f5b001d,0x4f5c001d,0x4f5d001d,0x4f5e001d,0x4f5f001d,0x4f60001d, + 0x4f61001d,0x4f62001d,0x4f63001d,0x4f64001d,0x4f65001d,0x4f66001d,0x4f67001d,0x4f68001d, + 0x4f69001d,0x4f6a001d,0x4f6b001d,0x4f6c001d,0x4f6d001d,0x4f6e001d,0x4f6f001d,0x4f70001d, + 0x4f71001d,0x4f72001d,0x4f73001d,0x4f74001d,0x4f75001d,0x4f76001d,0x4f77001d,0x4f78001d, + 0x4f79001d,0x4f7a001d,0x4f7b001d,0x4f7c001d,0x4f7d001d,0x4f7e001d,0x4f7f001d,0x4f80001d, + 0x4f81001d,0x4f82001d,0x4f83001d,0x4f84001d,0x4f85001d,0x4f86001d,0x4f87001d,0x4f88001d, + 0x4f89001d,0x4f8a001d,0x4f8b001d,0x4f8c001d,0x4f8d001d,0x4f8e001d,0x4f8f001d,0x4f90001d, + 0x4f91001d,0x4f92001d,0x4f93001d,0x4f94001d,0x4f95001d,0x4f96001d,0x4f97001d,0x4f98001d, + 0x4f99001d,0x4f9a001d,0x4f9b001d,0x4f9c001d,0x4f9d001d,0x4f9e001d,0x4f9f001d,0x4fa0001d, + 0x4fa1001d,0x4fa2001d,0x4fa3001d,0x4fa4001d,0x4fa5001d,0x4fa6001d,0x4fa7001d,0x4fa8001d, + 0x4fa9001d,0x4faa001d,0x4fab001d,0x4fac001d,0x4fad001d,0x4fae001d,0x4faf001d,0x4fb0001d, + 0x4fb1001d,0x4fb2001d,0x4fb3001d,0x4fb4001d,0x4fb5001d,0x4fb6001d,0x4fb7001d,0x4fb8001d, + 0x4fb9001d,0x4fba001d,0x4fbb001d,0x4fbc001d,0x4fbd001d,0x4fbe001d,0x4fbf001d,0x4fc0001d, + 0x4fc1001d,0x4fc2001d,0x4fc3001d,0x4fc4001d,0x4fc5001d,0x4fc6001d,0x4fc7001d,0x4fc8001d, + 0x4fc9001d,0x4fca001d,0x4fcb001d,0x4fcc001d,0x4fcd001d,0x4fce001d,0x4fcf001d,0x4fd0001d, + 0x4fd1001d,0x4fd2001d,0x4fd3001d,0x4fd4001d,0x4fd5001d,0x4fd6001d,0x4fd7001d,0x4fd8001d, + 0x4fd9001d,0x4fda001d,0x4fdb001d,0x4fdc001d,0x4fdd001d,0x4fde001d,0x4fdf001d,0x4fe0001d, + 0x4fe1001d,0x4fe2001d,0x4fe3001d,0x4fe4001d,0x4fe5001d,0x4fe6001d,0x4fe7001d,0x4fe8001d, + 0x4fe9001d,0x4fea001d,0x4feb001d,0x4fec001d,0x4fed001d,0x4fee001d,0x4fef001d,0x4ff0001d, + 0x4ff1001d,0x4ff2001d,0x4ff3001d,0x4ff4001d,0x4ff5001d,0x4ff6001d,0x4ff7001d,0x4ff8001d, + 0x4ff9001d,0x4ffa001d,0x4ffb001d,0x4ffc001d,0x4ffd001d,0x4ffe001d,0x4fff001d,0x5000001d, + 0x5001001d,0x5002001d,0x5003001d,0x5004001d,0x5005001d,0x5006001d,0x5007001d,0x5008001d, + 0x5009001d,0x500a001d,0x500b001d,0x500c001d,0x500d001d,0x500e001d,0x500f001d,0x5010001d, + 0x5011001d,0x5012001d,0x5013001d,0x5014001d,0x5015001d,0x5016001d,0x5017001d,0x5018001d, + 0x5019001d,0x501a001d,0x501b001d,0x501c001d,0x501d001d,0x501e001d,0x501f001d,0x5020001d, + 0x5021001d,0x5022001d,0x5023001d,0x5024001d,0x5025001d,0x5026001d,0x5027001d,0x5028001d, + 0x5029001d,0x502a001d,0x502b001d,0x502c001d,0x502d001d,0x502e001d,0x502f001d,0x5030001d, + 0x5031001d,0x5032001d,0x5033001d,0x5034001d,0x5035001d,0x5036001d,0x5037001d,0x5038001d, + 0x5039001d,0x503a001d,0x503b001d,0x503c001d,0x503d001d,0x503e001d,0x503f001d,0x5040001d, + 0x5041001d,0x5042001d,0x5043001d,0x5044001d,0x5045001d,0x5046001d,0x5047001d,0x5048001d, + 0x5049001d,0x504a001d,0x504b001d,0x504c001d,0x504d001d,0x504e001d,0x504f001d,0x5050001d, + 0x5051001d,0x5052001d,0x5053001d,0x5054001d,0x5055001d,0x5056001d,0x5057001d,0x5058001d, + 0x5059001d,0x505a001d,0x505b001d,0x505c001d,0x505d001d,0x505e001d,0x505f001d,0x5060001d, + 0x5061001d,0x5062001d,0x5063001d,0x5064001d,0x5065001d,0x5066001d,0x5067001d,0x5068001d, + 0x5069001d,0x506a001d,0x506b001d,0x506c001d,0x506d001d,0x506e001d,0x506f001d,0x5070001d, + 0x5071001d,0x5072001d,0x5073001d,0x5074001d,0x5075001d,0x5076001d,0x5077001d,0x5078001d, + 0x5079001d,0x507a001d,0x507b001d,0x507c001d,0x507d001d,0x507e001d,0x507f001d,0x5080001d, + 0x5081001d,0x5082001d,0x5083001d,0x5084001d,0x5085001d,0x5086001d,0x5087001d,0x5088001d, + 0x5089001d,0x508a001d,0x508b001d,0x508c001d,0x508d001d,0x508e001d,0x508f001d,0x5090001d, + 0x5091001d,0x5092001d,0x5093001d,0x5094001d,0x5095001d,0x5096001d,0x5097001d,0x5098001d, + 0x5099001d,0x509a001d,0x509b001d,0x509c001d,0x509d001d,0x509e001d,0x509f001d,0x50a0001d, + 0x50a1001d,0x50a2001d,0x50a3001d,0x50a4001d,0x50a5001d,0x50a6001d,0x50a7001d,0x50a8001d, + 0x50a9001d,0x50aa001d,0x50ab001d,0x50ac001d,0x50ad001d,0x50ae001d,0x50af001d,0x50b0001d, + 0x50b1001d,0x50b2001d,0x50b3001d,0x50b4001d,0x50b5001d,0x50b6001d,0x50b7001d,0x50b8001d, + 0x50b9001d,0x50ba001d,0x50bb001d,0x50bc001d,0x50bd001d,0x50be001d,0x50bf001d,0x50c0001d, + 0x50c1001d,0x50c2001d,0x50c3001d,0x50c4001d,0x50c5001d,0x50c6001d,0x50c7001d,0x50c8001d, + 0x50c9001d,0x50ca001d,0x50cb001d,0x50cc001d,0x50cd001d,0x50ce001d,0x50cf001d,0x50d0001d, + 0x50d1001d,0x50d2001d,0x50d3001d,0x50d4001d,0x50d5001d,0x50d6001d,0x50d7001d,0x50d8001d, + 0x50d9001d,0x50da001d,0x50db001d,0x50dc001d,0x50dd001d,0x50de001d,0x50df001d,0x50e0001d, + 0x50e1001d,0x50e2001d,0x50e3001d,0x50e4001d,0x50e5001d,0x50e6001d,0x50e7001d,0x50e8001d, + 0x50e9001d,0x50ea001d,0x50eb001d,0x50ec001d,0x50ed001d,0x50ee001d,0x50ef001d,0x50f0001d, + 0x50f1001d,0x50f2001d,0x50f3001d,0x50f4001d,0x50f5001d,0x50f6001d,0x50f7001d,0x50f8001d, + 0x50f9001d,0x50fa001d,0x50fb001d,0x50fc001d,0x50fd001d,0x50fe001d,0x50ff001d,0x5100001d, + 0x5101001d,0x5102001d,0x5103001d,0x5104001d,0x5105001d,0x5106001d,0x5107001d,0x5108001d, + 0x5109001d,0x510a001d,0x510b001d,0x510c001d,0x510d001d,0x510e001d,0x510f001d,0x5110001d, + 0x5111001d,0x5112001d,0x5113001d,0x5114001d,0x5115001d,0x5116001d,0x5117001d,0x5118001d, + 0x5119001d,0x511a001d,0x511b001d,0x511c001d,0x511d001d,0x511e001d,0x511f001d,0x5120001d, + 0x5121001d,0x5122001d,0x5123001d,0x5124001d,0x5125001d,0x5126001d,0x5127001d,0x5128001d, + 0x5129001d,0x512a001d,0x512b001d,0x512c001d,0x512d001d,0x512e001d,0x512f001d,0x5130001d, + 0x5131001d,0x5132001d,0x5133001d,0x5134001d,0x5135001d,0x5136001d,0x5137001d,0x5138001d, + 0x5139001d,0x513a001d,0x513b001d,0x513c001d,0x513d001d,0x513e001d,0x513f001d,0x5140001d, + 0x5141001d,0x5142001d,0x5143001d,0x5144001d,0x5145001d,0x5146001d,0x5147001d,0x5148001d, + 0x5149001d,0x514a001d,0x514b001d,0x514c001d,0x514d001d,0x514e001d,0x514f001d,0x5150001d, + 0x5151001d,0x5152001d,0x5153001d,0x5154001d,0x5155001d,0x5156001d,0x5157001d,0x5158001d, + 0x5159001d,0x515a001d,0x515b001d,0x515c001d,0x515d001d,0x515e001d,0x515f001d,0x5160001d, + 0x5161001d,0x5162001d,0x5163001d,0x5164001d,0x5165001d,0x5166001d,0x5167001d,0x5168001d, + 0x5169001d,0x516a001d,0x516b001d,0x516c001d,0x516d001d,0x516e001d,0x516f001d,0x5170001d, + 0x5171001d,0x5172001d,0x5173001d,0x5174001d,0x5175001d,0x5176001d,0x5177001d,0x5178001d, + 0x5179001d,0x517a001d,0x517b001d,0x517c001d,0x517d001d,0x517e001d,0x517f001d,0x5180001d, + 0x5181001d,0x5182001d,0x5183001d,0x5184001d,0x5185001d,0x5186001d,0x5187001d,0x5188001d, + 0x5189001d,0x518a001d,0x518b001d,0x518c001d,0x518d001d,0x518e001d,0x518f001d,0x5190001d, + 0x5191001d,0x5192001d,0x5193001d,0x5194001d,0x5195001d,0x5196001d,0x5197001d,0x5198001d, + 0x5199001d,0x519a001d,0x519b001d,0x519c001d,0x519d001d,0x519e001d,0x519f001d,0x51a0001d, + 0x51a1001d,0x51a2001d,0x51a3001d,0x51a4001d,0x51a5001d,0x51a6001d,0x51a7001d,0x51a8001d, + 0x51a9001d,0x51aa001d,0x51ab001d,0x51ac001d,0x51ad001d,0x51ae001d,0x51af001d,0x51b0001d, + 0x51b1001d,0x51b2001d,0x51b3001d,0x51b4001d,0x51b5001d,0x51b6001d,0x51b7001d,0x51b8001d, + 0x51b9001d,0x51ba001d,0x51bb001d,0x51bc001d,0x51bd001d,0x51be001d,0x51bf001d,0x51c0001d, + 0x51c1001d,0x51c2001d,0x51c3001d,0x51c4001d,0x51c5001d,0x51c6001d,0x51c7001d,0x51c8001d, + 0x51c9001d,0x51ca001d,0x51cb001d,0x51cc001d,0x51cd001d,0x51ce001d,0x51cf001d,0x51d0001d, + 0x51d1001d,0x51d2001d,0x51d3001d,0x51d4001d,0x51d5001d,0x51d6001d,0x51d7001d,0x51d8001d, + 0x51d9001d,0x51da001d,0x51db001d,0x51dc001d,0x51dd001d,0x51de001d,0x51df001d,0x51e0001d, + 0x51e1001d,0x51e2001d,0x51e3001d,0x51e4001d,0x51e5001d,0x51e6001d,0x51e7001d,0x51e8001d, + 0x51e9001d,0x51ea001d,0x51eb001d,0x51ec001d,0x51ed001d,0x51ee001d,0x51ef001d,0x51f0001d, + 0x51f1001d,0x51f2001d,0x51f3001d,0x51f4001d,0x51f5001d,0x51f6001d,0x51f7001d,0x51f8001d, + 0x51f9001d,0x51fa001d,0x51fb001d,0x51fc001d,0x51fd001d,0x51fe001d,0x51ff001d,0x5200001d, + 0x5201001d,0x5202001d,0x5203001d,0x5204001d,0x5205001d,0x5206001d,0x5207001d,0x5208001d, + 0x5209001d,0x520a001d,0x520b001d,0x520c001d,0x520d001d,0x520e001d,0x520f001d,0x5210001d, + 0x5211001d,0x5212001d,0x5213001d,0x5214001d,0x5215001d,0x5216001d,0x5217001d,0x5218001d, + 0x5219001d,0x521a001d,0x521b001d,0x521c001d,0x521d001d,0x521e001d,0x521f001d,0x5220001d, + 0x5221001d,0x5222001d,0x5223001d,0x5224001d,0x5225001d,0x5226001d,0x5227001d,0x5228001d, + 0x5229001d,0x522a001d,0x522b001d,0x522c001d,0x522d001d,0x522e001d,0x522f001d,0x5230001d, + 0x5231001d,0x5232001d,0x5233001d,0x5234001d,0x5235001d,0x5236001d,0x5237001d,0x5238001d, + 0x5239001d,0x523a001d,0x523b001d,0x523c001d,0x523d001d,0x523e001d,0x523f001d,0x5240001d, + 0x5241001d,0x5242001d,0x5243001d,0x5244001d,0x5245001d,0x5246001d,0x5247001d,0x5248001d, + 0x5249001d,0x524a001d,0x524b001d,0x524c001d,0x524d001d,0x524e001d,0x524f001d,0x5250001d, + 0x5251001d,0x5252001d,0x5253001d,0x5254001d,0x5255001d,0x5256001d,0x5257001d,0x5258001d, + 0x5259001d,0x525a001d,0x525b001d,0x525c001d,0x525d001d,0x525e001d,0x525f001d,0x5260001d, + 0x5261001d,0x5262001d,0x5263001d,0x5264001d,0x5265001d,0x5266001d,0x5267001d,0x5268001d, + 0x5269001d,0x526a001d,0x526b001d,0x526c001d,0x526d001d,0x526e001d,0x526f001d,0x5270001d, + 0x5271001d,0x5272001d,0x5273001d,0x5274001d,0x5275001d,0x5276001d,0x5277001d,0x5278001d, + 0x5279001d,0x527a001d,0x527b001d,0x527c001d,0x527d001d,0x527e001d,0x527f001d,0x5280001d, + 0x5281001d,0x5282001d,0x5283001d,0x5284001d,0x5285001d,0x5286001d,0x5287001d,0x5288001d, + 0x5289001d,0x528a001d,0x528b001d,0x528c001d,0x528d001d,0x528e001d,0x528f001d,0x5290001d, + 0x5291001d,0x5292001d,0x5293001d,0x5294001d,0x5295001d,0x5296001d,0x5297001d,0x5298001d, + 0x5299001d,0x529a001d,0x529b001d,0x529c001d,0x529d001d,0x529e001d,0x529f001d,0x52a0001d, + 0x52a1001d,0x52a2001d,0x52a3001d,0x52a4001d,0x52a5001d,0x52a6001d,0x52a7001d,0x52a8001d, + 0x52a9001d,0x52aa001d,0x52ab001d,0x52ac001d,0x52ad001d,0x52ae001d,0x52af001d,0x52b0001d, + 0x52b1001d,0x52b2001d,0x52b3001d,0x52b4001d,0x52b5001d,0x52b6001d,0x52b7001d,0x52b8001d, + 0x52b9001d,0x52ba001d,0x52bb001d,0x52bc001d,0x52bd001d,0x52be001d,0x52bf001d,0x52c0001d, + 0x52c1001d,0x52c2001d,0x52c3001d,0x52c4001d,0x52c5001d,0x52c6001d,0x52c7001d,0x52c8001d, + 0x52c9001d,0x52ca001d,0x52cb001d,0x52cc001d,0x52cd001d,0x52ce001d,0x52cf001d,0x52d0001d, + 0x52d1001d,0x52d2001d,0x52d3001d,0x52d4001d,0x52d5001d,0x52d6001d,0x52d7001d,0x52d8001d, + 0x52d9001d,0x52da001d,0x52db001d,0x52dc001d,0x52dd001d,0x52de001d,0x52df001d,0x52e0001d, + 0x52e1001d,0x52e2001d,0x52e3001d,0x52e4001d,0x52e5001d,0x52e6001d,0x52e7001d,0x52e8001d, + 0x52e9001d,0x52ea001d,0x52eb001d,0x52ec001d,0x52ed001d,0x52ee001d,0x52ef001d,0x52f0001d, + 0x52f1001d,0x52f2001d,0x52f3001d,0x52f4001d,0x52f5001d,0x52f6001d,0x52f7001d,0x52f8001d, + 0x52f9001d,0x52fa001d,0x52fb001d,0x52fc001d,0x52fd001d,0x52fe001d,0x52ff001d,0x5300001d, + 0x5301001d,0x5302001d,0x5303001d,0x5304001d,0x5305001d,0x5306001d,0x5307001d,0x5308001d, + 0x5309001d,0x530a001d,0x530b001d,0x530c001d,0x530d001d,0x530e001d,0x530f001d,0x5310001d, + 0x5311001d,0x5312001d,0x5313001d,0x5314001d,0x5315001d,0x5316001d,0x5317001d,0x5318001d, + 0x5319001d,0x531a001d,0x531b001d,0x531c001d,0x531d001d,0x531e001d,0x531f001d,0x5320001d, + 0x5321001d,0x5322001d,0x5323001d,0x5324001d,0x5325001d,0x5326001d,0x5327001d,0x5328001d, + 0x5329001d,0x532a001d,0x532b001d,0x532c001d,0x532d001d,0x532e001d,0x532f001d,0x5330001d, + 0x5331001d,0x5332001d,0x5333001d,0x5334001d,0x5335001d,0x5336001d,0x5337001d,0x5338001d, + 0x5339001d,0x533a001d,0x533b001d,0x533c001d,0x533d001d,0x533e001d,0x533f001d,0x5340001d, + 0x5341001d,0x5342001d,0x5343001d,0x5344001d,0x5345001d,0x5346001d,0x5347001d,0x5348001d, + 0x5349001d,0x534a001d,0x534b001d,0x534c001d,0x534d001d,0x534e001d,0x534f001d,0x5350001d, + 0x5351001d,0x5352001d,0x5353001d,0x5354001d,0x5355001d,0x5356001d,0x5357001d,0x5358001d, + 0x5359001d,0x535a001d,0x535b001d,0x535c001d,0x535d001d,0x535e001d,0x535f001d,0x5360001d, + 0x5361001d,0x5362001d,0x5363001d,0x5364001d,0x5365001d,0x5366001d,0x5367001d,0x5368001d, + 0x5369001d,0x536a001d,0x536b001d,0x536c001d,0x536d001d,0x536e001d,0x536f001d,0x5370001d, + 0x5371001d,0x5372001d,0x5373001d,0x5374001d,0x5375001d,0x5376001d,0x5377001d,0x5378001d, + 0x5379001d,0x537a001d,0x537b001d,0x537c001d,0x537d001d,0x537e001d,0x537f001d,0x5380001d, + 0x5381001d,0x5382001d,0x5383001d,0x5384001d,0x5385001d,0x5386001d,0x5387001d,0x5388001d, + 0x5389001d,0x538a001d,0x538b001d,0x538c001d,0x538d001d,0x538e001d,0x538f001d,0x5390001d, + 0x5391001d,0x5392001d,0x5393001d,0x5394001d,0x5395001d,0x5396001d,0x5397001d,0x5398001d, + 0x5399001d,0x539a001d,0x539b001d,0x539c001d,0x539d001d,0x539e001d,0x539f001d,0x53a0001d, + 0x53a1001d,0x53a2001d,0x53a3001d,0x53a4001d,0x53a5001d,0x53a6001d,0x53a7001d,0x53a8001d, + 0x53a9001d,0x53aa001d,0x53ab001d,0x53ac001d,0x53ad001d,0x53ae001d,0x53af001d,0x53b0001d, + 0x53b1001d,0x53b2001d,0x53b3001d,0x53b4001d,0x53b5001d,0x53b6001d,0x53b7001d,0x53b8001d, + 0x53b9001d,0x53ba001d,0x53bb001d,0x53bc001d,0x53bd001d,0x53be001d,0x53bf001d,0x53c0001d, + 0x53c1001d,0x53c2001d,0x53c3001d,0x53c4001d,0x53c5001d,0x53c6001d,0x53c7001d,0x53c8001d, + 0x53c9001d,0x53ca001d,0x53cb001d,0x53cc001d,0x53cd001d,0x53ce001d,0x53cf001d,0x53d0001d, + 0x53d1001d,0x53d2001d,0x53d3001d,0x53d4001d,0x53d5001d,0x53d6001d,0x53d7001d,0x53d8001d, + 0x53d9001d,0x53da001d,0x53db001d,0x53dc001d,0x53dd001d,0x53de001d,0x53df001d,0x53e0001d, + 0x53e1001d,0x53e2001d,0x53e3001d,0x53e4001d,0x53e5001d,0x53e6001d,0x53e7001d,0x53e8001d, + 0x53e9001d,0x53ea001d,0x53eb001d,0x53ec001d,0x53ed001d,0x53ee001d,0x53ef001d,0x53f0001d, + 0x53f1001d,0x53f2001d,0x53f3001d,0x53f4001d,0x53f5001d,0x53f6001d,0x53f7001d,0x53f8001d, + 0x53f9001d,0x53fa001d,0x53fb001d,0x53fc001d,0x53fd001d,0x53fe001d,0x53ff001d,0x5400001d, + 0x5401001d,0x5402001d,0x5403001d,0x5404001d,0x5405001d,0x5406001d,0x5407001d,0x5408001d, + 0x5409001d,0x540a001d,0x540b001d,0x540c001d,0x540d001d,0x540e001d,0x540f001d,0x5410001d, + 0x5411001d,0x5412001d,0x5413001d,0x5414001d,0x5415001d,0x5416001d,0x5417001d,0x5418001d, + 0x5419001d,0x541a001d,0x541b001d,0x541c001d,0x541d001d,0x541e001d,0x541f001d,0x5420001d, + 0x5421001d,0x5422001d,0x5423001d,0x5424001d,0x5425001d,0x5426001d,0x5427001d,0x5428001d, + 0x5429001d,0x542a001d,0x542b001d,0x542c001d,0x542d001d,0x542e001d,0x542f001d,0x5430001d, + 0x5431001d,0x5432001d,0x5433001d,0x5434001d,0x5435001d,0x5436001d,0x5437001d,0x5438001d, + 0x5439001d,0x543a001d,0x543b001d,0x543c001d,0x543d001d,0x543e001d,0x543f001d,0x5440001d, + 0x5441001d,0x5442001d,0x5443001d,0x5444001d,0x5445001d,0x5446001d,0x5447001d,0x5448001d, + 0x5449001d,0x544a001d,0x544b001d,0x544c001d,0x544d001d,0x544e001d,0x544f001d,0x5450001d, + 0x5451001d,0x5452001d,0x5453001d,0x5454001d,0x5455001d,0x5456001d,0x5457001d,0x5458001d, + 0x5459001d,0x545a001d,0x545b001d,0x545c001d,0x545d001d,0x545e001d,0x545f001d,0x5460001d, + 0x5461001d,0x5462001d,0x5463001d,0x5464001d,0x5465001d,0x5466001d,0x5467001d,0x5468001d, + 0x5469001d,0x546a001d,0x546b001d,0x546c001d,0x546d001d,0x546e001d,0x546f001d,0x5470001d, + 0x5471001d,0x5472001d,0x5473001d,0x5474001d,0x5475001d,0x5476001d,0x5477001d,0x5478001d, + 0x5479001d,0x547a001d,0x547b001d,0x547c001d,0x547d001d,0x547e001d,0x547f001d,0x5480001d, + 0x5481001d,0x5482001d,0x5483001d,0x5484001d,0x5485001d,0x5486001d,0x5487001d,0x5488001d, + 0x5489001d,0x548a001d,0x548b001d,0x548c001d,0x548d001d,0x548e001d,0x548f001d,0x5490001d, + 0x5491001d,0x5492001d,0x5493001d,0x5494001d,0x5495001d,0x5496001d,0x5497001d,0x5498001d, + 0x5499001d,0x549a001d,0x549b001d,0x549c001d,0x549d001d,0x549e001d,0x549f001d,0x54a0001d, + 0x54a1001d,0x54a2001d,0x54a3001d,0x54a4001d,0x54a5001d,0x54a6001d,0x54a7001d,0x54a8001d, + 0x54a9001d,0x54aa001d,0x54ab001d,0x54ac001d,0x54ad001d,0x54ae001d,0x54af001d,0x54b0001d, + 0x54b1001d,0x54b2001d,0x54b3001d,0x54b4001d,0x54b5001d,0x54b6001d,0x54b7001d,0x54b8001d, + 0x54b9001d,0x54ba001d,0x54bb001d,0x54bc001d,0x54bd001d,0x54be001d,0x54bf001d,0x54c0001d, + 0x54c1001d,0x54c2001d,0x54c3001d,0x54c4001d,0x54c5001d,0x54c6001d,0x54c7001d,0x54c8001d, + 0x54c9001d,0x54ca001d,0x54cb001d,0x54cc001d,0x54cd001d,0x54ce001d,0x54cf001d,0x54d0001d, + 0x54d1001d,0x54d2001d,0x54d3001d,0x54d4001d,0x54d5001d,0x54d6001d,0x54d7001d,0x54d8001d, + 0x54d9001d,0x54da001d,0x54db001d,0x54dc001d,0x54dd001d,0x54de001d,0x54df001d,0x54e0001d, + 0x54e1001d,0x54e2001d,0x54e3001d,0x54e4001d,0x54e5001d,0x54e6001d,0x54e7001d,0x54e8001d, + 0x54e9001d,0x54ea001d,0x54eb001d,0x54ec001d,0x54ed001d,0x54ee001d,0x54ef001d,0x54f0001d, + 0x54f1001d,0x54f2001d,0x54f3001d,0x54f4001d,0x54f5001d,0x54f6001d,0x54f7001d,0x54f8001d, + 0x54f9001d,0x54fa001d,0x54fb001d,0x54fc001d,0x54fd001d,0x54fe001d,0x54ff001d,0x5500001d, + 0x5501001d,0x5502001d,0x5503001d,0x5504001d,0x5505001d,0x5506001d,0x5507001d,0x5508001d, + 0x5509001d,0x550a001d,0x550b001d,0x550c001d,0x550d001d,0x550e001d,0x550f001d,0x5510001d, + 0x5511001d,0x5512001d,0x5513001d,0x5514001d,0x5515001d,0x5516001d,0x5517001d,0x5518001d, + 0x5519001d,0x551a001d,0x551b001d,0x551c001d,0x551d001d,0x551e001d,0x551f001d,0x5520001d, + 0x5521001d,0x5522001d,0x5523001d,0x5524001d,0x5525001d,0x5526001d,0x5527001d,0x5528001d, + 0x5529001d,0x552a001d,0x552b001d,0x552c001d,0x552d001d,0x552e001d,0x552f001d,0x5530001d, + 0x5531001d,0x5532001d,0x5533001d,0x5534001d,0x5535001d,0x5536001d,0x5537001d,0x5538001d, + 0x5539001d,0x553a001d,0x553b001d,0x553c001d,0x553d001d,0x553e001d,0x553f001d,0x5540001d, + 0x5541001d,0x5542001d,0x5543001d,0x5544001d,0x5545001d,0x5546001d,0x5547001d,0x5548001d, + 0x5549001d,0x554a001d,0x554b001d,0x554c001d,0x554d001d,0x554e001d,0x554f001d,0x5550001d, + 0x5551001d,0x5552001d,0x5553001d,0x5554001d,0x5555001d,0x5556001d,0x5557001d,0x5558001d, + 0x5559001d,0x555a001d,0x555b001d,0x555c001d,0x555d001d,0x555e001d,0x555f001d,0x5560001d, + 0x5561001d,0x5562001d,0x5563001d,0x5564001d,0x5565001d,0x5566001d,0x5567001d,0x5568001d, + 0x5569001d,0x556a001d,0x556b001d,0x556c001d,0x556d001d,0x556e001d,0x556f001d,0x5570001d, + 0x5571001d,0x5572001d,0x5573001d,0x5574001d,0x5575001d,0x5576001d,0x5577001d,0x5578001d, + 0x5579001d,0x557a001d,0x557b001d,0x557c001d,0x557d001d,0x557e001d,0x557f001d,0x5580001d, + 0x5581001d,0x5582001d,0x5583001d,0x5584001d,0x5585001d,0x5586001d,0x5587001d,0x5588001d, + 0x5589001d,0x558a001d,0x558b001d,0x558c001d,0x558d001d,0x558e001d,0x558f001d,0x5590001d, + 0x5591001d,0x5592001d,0x5593001d,0x5594001d,0x5595001d,0x5596001d,0x5597001d,0x5598001d, + 0x5599001d,0x559a001d,0x559b001d,0x559c001d,0x559d001d,0x559e001d,0x559f001d,0x55a0001d, + 0x55a1001d,0x55a2001d,0x55a3001d,0x55a4001d,0x55a5001d,0x55a6001d,0x55a7001d,0x55a8001d, + 0x55a9001d,0x55aa001d,0x55ab001d,0x55ac001d,0x55ad001d,0x55ae001d,0x55af001d,0x55b0001d, + 0x55b1001d,0x55b2001d,0x55b3001d,0x55b4001d,0x55b5001d,0x55b6001d,0x55b7001d,0x55b8001d, + 0x55b9001d,0x55ba001d,0x55bb001d,0x55bc001d,0x55bd001d,0x55be001d,0x55bf001d,0x55c0001d, + 0x55c1001d,0x55c2001d,0x55c3001d,0x55c4001d,0x55c5001d,0x55c6001d,0x55c7001d,0x55c8001d, + 0x55c9001d,0x55ca001d,0x55cb001d,0x55cc001d,0x55cd001d,0x55ce001d,0x55cf001d,0x55d0001d, + 0x55d1001d,0x55d2001d,0x55d3001d,0x55d4001d,0x55d5001d,0x55d6001d,0x55d7001d,0x55d8001d, + 0x55d9001d,0x55da001d,0x55db001d,0x55dc001d,0x55dd001d,0x55de001d,0x55df001d,0x55e0001d, + 0x55e1001d,0x55e2001d,0x55e3001d,0x55e4001d,0x55e5001d,0x55e6001d,0x55e7001d,0x55e8001d, + 0x55e9001d,0x55ea001d,0x55eb001d,0x55ec001d,0x55ed001d,0x55ee001d,0x55ef001d,0x55f0001d, + 0x55f1001d,0x55f2001d,0x55f3001d,0x55f4001d,0x55f5001d,0x55f6001d,0x55f7001d,0x55f8001d, + 0x55f9001d,0x55fa001d,0x55fb001d,0x55fc001d,0x55fd001d,0x55fe001d,0x55ff001d,0x5600001d, + 0x5601001d,0x5602001d,0x5603001d,0x5604001d,0x5605001d,0x5606001d,0x5607001d,0x5608001d, + 0x5609001d,0x560a001d,0x560b001d,0x560c001d,0x560d001d,0x560e001d,0x560f001d,0x5610001d, + 0x5611001d,0x5612001d,0x5613001d,0x5614001d,0x5615001d,0x5616001d,0x5617001d,0x5618001d, + 0x5619001d,0x561a001d,0x561b001d,0x561c001d,0x561d001d,0x561e001d,0x561f001d,0x5620001d, + 0x5621001d,0x5622001d,0x5623001d,0x5624001d,0x5625001d,0x5626001d,0x5627001d,0x5628001d, + 0x5629001d,0x562a001d,0x562b001d,0x562c001d,0x562d001d,0x562e001d,0x562f001d,0x5630001d, + 0x5631001d,0x5632001d,0x5633001d,0x5634001d,0x5635001d,0x5636001d,0x5637001d,0x5638001d, + 0x5639001d,0x563a001d,0x563b001d,0x563c001d,0x563d001d,0x563e001d,0x563f001d,0x5640001d, + 0x5641001d,0x5642001d,0x5643001d,0x5644001d,0x5645001d,0x5646001d,0x5647001d,0x5648001d, + 0x5649001d,0x564a001d,0x564b001d,0x564c001d,0x564d001d,0x564e001d,0x564f001d,0x5650001d, + 0x5651001d,0x5652001d,0x5653001d,0x5654001d,0x5655001d,0x5656001d,0x5657001d,0x5658001d, + 0x5659001d,0x565a001d,0x565b001d,0x565c001d,0x565d001d,0x565e001d,0x565f001d,0x5660001d, + 0x5661001d,0x5662001d,0x5663001d,0x5664001d,0x5665001d,0x5666001d,0x5667001d,0x5668001d, + 0x5669001d,0x566a001d,0x566b001d,0x566c001d,0x566d001d,0x566e001d,0x566f001d,0x5670001d, + 0x5671001d,0x5672001d,0x5673001d,0x5674001d,0x5675001d,0x5676001d,0x5677001d,0x5678001d, + 0x5679001d,0x567a001d,0x567b001d,0x567c001d,0x567d001d,0x567e001d,0x567f001d,0x5680001d, + 0x5681001d,0x5682001d,0x5683001d,0x5684001d,0x5685001d,0x5686001d,0x5687001d,0x5688001d, + 0x5689001d,0x568a001d,0x568b001d,0x568c001d,0x568d001d,0x568e001d,0x568f001d,0x5690001d, + 0x5691001d,0x5692001d,0x5693001d,0x5694001d,0x5695001d,0x5696001d,0x5697001d,0x5698001d, + 0x5699001d,0x569a001d,0x569b001d,0x569c001d,0x569d001d,0x569e001d,0x569f001d,0x56a0001d, + 0x56a1001d,0x56a2001d,0x56a3001d,0x56a4001d,0x56a5001d,0x56a6001d,0x56a7001d,0x56a8001d, + 0x56a9001d,0x56aa001d,0x56ab001d,0x56ac001d,0x56ad001d,0x56ae001d,0x56af001d,0x56b0001d, + 0x56b1001d,0x56b2001d,0x56b3001d,0x56b4001d,0x56b5001d,0x56b6001d,0x56b7001d,0x56b8001d, + 0x56b9001d,0x56ba001d,0x56bb001d,0x56bc001d,0x56bd001d,0x56be001d,0x56bf001d,0x56c0001d, + 0x56c1001d,0x56c2001d,0x56c3001d,0x56c4001d,0x56c5001d,0x56c6001d,0x56c7001d,0x56c8001d, + 0x56c9001d,0x56ca001d,0x56cb001d,0x56cc001d,0x56cd001d,0x56ce001d,0x56cf001d,0x56d0001d, + 0x56d1001d,0x56d2001d,0x56d3001d,0x56d4001d,0x56d5001d,0x56d6001d,0x56d7001d,0x56d8001d, + 0x56d9001d,0x56da001d,0x56db001d,0x56dc001d,0x56dd001d,0x56de001d,0x56df001d,0x56e0001d, + 0x56e1001d,0x56e2001d,0x56e3001d,0x56e4001d,0x56e5001d,0x56e6001d,0x56e7001d,0x56e8001d, + 0x56e9001d,0x56ea001d,0x56eb001d,0x56ec001d,0x56ed001d,0x56ee001d,0x56ef001d,0x56f0001d, + 0x56f1001d,0x56f2001d,0x56f3001d,0x56f4001d,0x56f5001d,0x56f6001d,0x56f7001d,0x56f8001d, + 0x56f9001d,0x56fa001d,0x56fb001d,0x56fc001d,0x56fd001d,0x56fe001d,0x56ff001d,0x5700001d, + 0x5701001d,0x5702001d,0x5703001d,0x5704001d,0x5705001d,0x5706001d,0x5707001d,0x5708001d, + 0x5709001d,0x570a001d,0x570b001d,0x570c001d,0x570d001d,0x570e001d,0x570f001d,0x5710001d, + 0x5711001d,0x5712001d,0x5713001d,0x5714001d,0x5715001d,0x5716001d,0x5717001d,0x5718001d, + 0x5719001d,0x571a001d,0x571b001d,0x571c001d,0x571d001d,0x571e001d,0x571f001d,0x5720001d, + 0x5721001d,0x5722001d,0x5723001d,0x5724001d,0x5725001d,0x5726001d,0x5727001d,0x5728001d, + 0x5729001d,0x572a001d,0x572b001d,0x572c001d,0x572d001d,0x572e001d,0x572f001d,0x5730001d, + 0x5731001d,0x5732001d,0x5733001d,0x5734001d,0x5735001d,0x5736001d,0x5737001d,0x5738001d, + 0x5739001d,0x573a001d,0x573b001d,0x573c001d,0x573d001d,0x573e001d,0x573f001d,0x5740001d, + 0x5741001d,0x5742001d,0x5743001d,0x5744001d,0x5745001d,0x5746001d,0x5747001d,0x5748001d, + 0x5749001d,0x574a001d,0x574b001d,0x574c001d,0x574d001d,0x574e001d,0x574f001d,0x5750001d, + 0x5751001d,0x5752001d,0x5753001d,0x5754001d,0x5755001d,0x5756001d,0x5757001d,0x5758001d, + 0x5759001d,0x575a001d,0x575b001d,0x575c001d,0x575d001d,0x575e001d,0x575f001d,0x5760001d, + 0x5761001d,0x5762001d,0x5763001d,0x5764001d,0x5765001d,0x5766001d,0x5767001d,0x5768001d, + 0x5769001d,0x576a001d,0x576b001d,0x576c001d,0x576d001d,0x576e001d,0x576f001d,0x5770001d, + 0x5771001d,0x5772001d,0x5773001d,0x5774001d,0x5775001d,0x5776001d,0x5777001d,0x5778001d, + 0x5779001d,0x577a001d,0x577b001d,0x577c001d,0x577d001d,0x577e001d,0x577f001d,0x5780001d, + 0x5781001d,0x5782001d,0x5783001d,0x5784001d,0x5785001d,0x5786001d,0x5787001d,0x5788001d, + 0x5789001d,0x578a001d,0x578b001d,0x578c001d,0x578d001d,0x578e001d,0x578f001d,0x5790001d, + 0x5791001d,0x5792001d,0x5793001d,0x5794001d,0x5795001d,0x5796001d,0x5797001d,0x5798001d, + 0x5799001d,0x579a001d,0x579b001d,0x579c001d,0x579d001d,0x579e001d,0x579f001d,0x57a0001d, + 0x57a1001d,0x57a2001d,0x57a3001d,0x57a4001d,0x57a5001d,0x57a6001d,0x57a7001d,0x57a8001d, + 0x57a9001d,0x57aa001d,0x57ab001d,0x57ac001d,0x57ad001d,0x57ae001d,0x57af001d,0x57b0001d, + 0x57b1001d,0x57b2001d,0x57b3001d,0x57b4001d,0x57b5001d,0x57b6001d,0x57b7001d,0x57b8001d, + 0x57b9001d,0x57ba001d,0x57bb001d,0x57bc001d,0x57bd001d,0x57be001d,0x57bf001d,0x57c0001d, + 0x57c1001d,0x57c2001d,0x57c3001d,0x57c4001d,0x57c5001d,0x57c6001d,0x57c7001d,0x57c8001d, + 0x57c9001d,0x57ca001d,0x57cb001d,0x57cc001d,0x57cd001d,0x57ce001d,0x57cf001d,0x57d0001d, + 0x57d1001d,0x57d2001d,0x57d3001d,0x57d4001d,0x57d5001d,0x57d6001d,0x57d7001d,0x57d8001d, + 0x57d9001d,0x57da001d,0x57db001d,0x57dc001d,0x57dd001d,0x57de001d,0x57df001d,0x57e0001d, + 0x57e1001d,0x57e2001d,0x57e3001d,0x57e4001d,0x57e5001d,0x57e6001d,0x57e7001d,0x57e8001d, + 0x57e9001d,0x57ea001d,0x57eb001d,0x57ec001d,0x57ed001d,0x57ee001d,0x57ef001d,0x57f0001d, + 0x57f1001d,0x57f2001d,0x57f3001d,0x57f4001d,0x57f5001d,0x57f6001d,0x57f7001d,0x57f8001d, + 0x57f9001d,0x57fa001d,0x57fb001d,0x57fc001d,0x57fd001d,0x57fe001d,0x57ff001d,0x5800001d, + 0x5801001d,0x5802001d,0x5803001d,0x5804001d,0x5805001d,0x5806001d,0x5807001d,0x5808001d, + 0x5809001d,0x580a001d,0x580b001d,0x580c001d,0x580d001d,0x580e001d,0x580f001d,0x5810001d, + 0x5811001d,0x5812001d,0x5813001d,0x5814001d,0x5815001d,0x5816001d,0x5817001d,0x5818001d, + 0x5819001d,0x581a001d,0x581b001d,0x581c001d,0x581d001d,0x581e001d,0x581f001d,0x5820001d, + 0x5821001d,0x5822001d,0x5823001d,0x5824001d,0x5825001d,0x5826001d,0x5827001d,0x5828001d, + 0x5829001d,0x582a001d,0x582b001d,0x582c001d,0x582d001d,0x582e001d,0x582f001d,0x5830001d, + 0x5831001d,0x5832001d,0x5833001d,0x5834001d,0x5835001d,0x5836001d,0x5837001d,0x5838001d, + 0x5839001d,0x583a001d,0x583b001d,0x583c001d,0x583d001d,0x583e001d,0x583f001d,0x5840001d, + 0x5841001d,0x5842001d,0x5843001d,0x5844001d,0x5845001d,0x5846001d,0x5847001d,0x5848001d, + 0x5849001d,0x584a001d,0x584b001d,0x584c001d,0x584d001d,0x584e001d,0x584f001d,0x5850001d, + 0x5851001d,0x5852001d,0x5853001d,0x5854001d,0x5855001d,0x5856001d,0x5857001d,0x5858001d, + 0x5859001d,0x585a001d,0x585b001d,0x585c001d,0x585d001d,0x585e001d,0x585f001d,0x5860001d, + 0x5861001d,0x5862001d,0x5863001d,0x5864001d,0x5865001d,0x5866001d,0x5867001d,0x5868001d, + 0x5869001d,0x586a001d,0x586b001d,0x586c001d,0x586d001d,0x586e001d,0x586f001d,0x5870001d, + 0x5871001d,0x5872001d,0x5873001d,0x5874001d,0x5875001d,0x5876001d,0x5877001d,0x5878001d, + 0x5879001d,0x587a001d,0x587b001d,0x587c001d,0x587d001d,0x587e001d,0x587f001d,0x5880001d, + 0x5881001d,0x5882001d,0x5883001d,0x5884001d,0x5885001d,0x5886001d,0x5887001d,0x5888001d, + 0x5889001d,0x588a001d,0x588b001d,0x588c001d,0x588d001d,0x588e001d,0x588f001d,0x5890001d, + 0x5891001d,0x5892001d,0x5893001d,0x5894001d,0x5895001d,0x5896001d,0x5897001d,0x5898001d, + 0x5899001d,0x589a001d,0x589b001d,0x589c001d,0x589d001d,0x589e001d,0x589f001d,0x58a0001d, + 0x58a1001d,0x58a2001d,0x58a3001d,0x58a4001d,0x58a5001d,0x58a6001d,0x58a7001d,0x58a8001d, + 0x58a9001d,0x58aa001d,0x58ab001d,0x58ac001d,0x58ad001d,0x58ae001d,0x58af001d,0x58b0001d, + 0x58b1001d,0x58b2001d,0x58b3001d,0x58b4001d,0x58b5001d,0x58b6001d,0x58b7001d,0x58b8001d, + 0x58b9001d,0x58ba001d,0x58bb001d,0x58bc001d,0x58bd001d,0x58be001d,0x58bf001d,0x58c0001d, + 0x58c1001d,0x58c2001d,0x58c3001d,0x58c4001d,0x58c5001d,0x58c6001d,0x58c7001d,0x58c8001d, + 0x58c9001d,0x58ca001d,0x58cb001d,0x58cc001d,0x58cd001d,0x58ce001d,0x58cf001d,0x58d0001d, + 0x58d1001d,0x58d2001d,0x58d3001d,0x58d4001d,0x58d5001d,0x58d6001d,0x58d7001d,0x58d8001d, + 0x58d9001d,0x58da001d,0x58db001d,0x58dc001d,0x58dd001d,0x58de001d,0x58df001d,0x58e0001d, + 0x58e1001d,0x58e2001d,0x58e3001d,0x58e4001d,0x58e5001d,0x58e6001d,0x58e7001d,0x58e8001d, + 0x58e9001d,0x58ea001d,0x58eb001d,0x58ec001d,0x58ed001d,0x58ee001d,0x58ef001d,0x58f0001d, + 0x58f1001d,0x58f2001d,0x58f3001d,0x58f4001d,0x58f5001d,0x58f6001d,0x58f7001d,0x58f8001d, + 0x58f9001d,0x58fa001d,0x58fb001d,0x58fc001d,0x58fd001d,0x58fe001d,0x58ff001d,0x5900001d, + 0x5901001d,0x5902001d,0x5903001d,0x5904001d,0x5905001d,0x5906001d,0x5907001d,0x5908001d, + 0x5909001d,0x590a001d,0x590b001d,0x590c001d,0x590d001d,0x590e001d,0x590f001d,0x5910001d, + 0x5911001d,0x5912001d,0x5913001d,0x5914001d,0x5915001d,0x5916001d,0x5917001d,0x5918001d, + 0x5919001d,0x591a001d,0x591b001d,0x591c001d,0x591d001d,0x591e001d,0x591f001d,0x5920001d, + 0x5921001d,0x5922001d,0x5923001d,0x5924001d,0x5925001d,0x5926001d,0x5927001d,0x5928001d, + 0x5929001d,0x592a001d,0x592b001d,0x592c001d,0x592d001d,0x592e001d,0x592f001d,0x5930001d, + 0x5931001d,0x5932001d,0x5933001d,0x5934001d,0x5935001d,0x5936001d,0x5937001d,0x5938001d, + 0x5939001d,0x593a001d,0x593b001d,0x593c001d,0x593d001d,0x593e001d,0x593f001d,0x5940001d, + 0x5941001d,0x5942001d,0x5943001d,0x5944001d,0x5945001d,0x5946001d,0x5947001d,0x5948001d, + 0x5949001d,0x594a001d,0x594b001d,0x594c001d,0x594d001d,0x594e001d,0x594f001d,0x5950001d, + 0x5951001d,0x5952001d,0x5953001d,0x5954001d,0x5955001d,0x5956001d,0x5957001d,0x5958001d, + 0x5959001d,0x595a001d,0x595b001d,0x595c001d,0x595d001d,0x595e001d,0x595f001d,0x5960001d, + 0x5961001d,0x5962001d,0x5963001d,0x5964001d,0x5965001d,0x5966001d,0x5967001d,0x5968001d, + 0x5969001d,0x596a001d,0x596b001d,0x596c001d,0x596d001d,0x596e001d,0x596f001d,0x5970001d, + 0x5971001d,0x5972001d,0x5973001d,0x5974001d,0x5975001d,0x5976001d,0x5977001d,0x5978001d, + 0x5979001d,0x597a001d,0x597b001d,0x597c001d,0x597d001d,0x597e001d,0x597f001d,0x5980001d, + 0x5981001d,0x5982001d,0x5983001d,0x5984001d,0x5985001d,0x5986001d,0x5987001d,0x5988001d, + 0x5989001d,0x598a001d,0x598b001d,0x598c001d,0x598d001d,0x598e001d,0x598f001d,0x5990001d, + 0x5991001d,0x5992001d,0x5993001d,0x5994001d,0x5995001d,0x5996001d,0x5997001d,0x5998001d, + 0x5999001d,0x599a001d,0x599b001d,0x599c001d,0x599d001d,0x599e001d,0x599f001d,0x59a0001d, + 0x59a1001d,0x59a2001d,0x59a3001d,0x59a4001d,0x59a5001d,0x59a6001d,0x59a7001d,0x59a8001d, + 0x59a9001d,0x59aa001d,0x59ab001d,0x59ac001d,0x59ad001d,0x59ae001d,0x59af001d,0x59b0001d, + 0x59b1001d,0x59b2001d,0x59b3001d,0x59b4001d,0x59b5001d,0x59b6001d,0x59b7001d,0x59b8001d, + 0x59b9001d,0x59ba001d,0x59bb001d,0x59bc001d,0x59bd001d,0x59be001d,0x59bf001d,0x59c0001d, + 0x59c1001d,0x59c2001d,0x59c3001d,0x59c4001d,0x59c5001d,0x59c6001d,0x59c7001d,0x59c8001d, + 0x59c9001d,0x59ca001d,0x59cb001d,0x59cc001d,0x59cd001d,0x59ce001d,0x59cf001d,0x59d0001d, + 0x59d1001d,0x59d2001d,0x59d3001d,0x59d4001d,0x59d5001d,0x59d6001d,0x59d7001d,0x59d8001d, + 0x59d9001d,0x59da001d,0x59db001d,0x59dc001d,0x59dd001d,0x59de001d,0x59df001d,0x59e0001d, + 0x59e1001d,0x59e2001d,0x59e3001d,0x59e4001d,0x59e5001d,0x59e6001d,0x59e7001d,0x59e8001d, + 0x59e9001d,0x59ea001d,0x59eb001d,0x59ec001d,0x59ed001d,0x59ee001d,0x59ef001d,0x59f0001d, + 0x59f1001d,0x59f2001d,0x59f3001d,0x59f4001d,0x59f5001d,0x59f6001d,0x59f7001d,0x59f8001d, + 0x59f9001d,0x59fa001d,0x59fb001d,0x59fc001d,0x59fd001d,0x59fe001d,0x59ff001d,0x5a00001d, + 0x5a01001d,0x5a02001d,0x5a03001d,0x5a04001d,0x5a05001d,0x5a06001d,0x5a07001d,0x5a08001d, + 0x5a09001d,0x5a0a001d,0x5a0b001d,0x5a0c001d,0x5a0d001d,0x5a0e001d,0x5a0f001d,0x5a10001d, + 0x5a11001d,0x5a12001d,0x5a13001d,0x5a14001d,0x5a15001d,0x5a16001d,0x5a17001d,0x5a18001d, + 0x5a19001d,0x5a1a001d,0x5a1b001d,0x5a1c001d,0x5a1d001d,0x5a1e001d,0x5a1f001d,0x5a20001d, + 0x5a21001d,0x5a22001d,0x5a23001d,0x5a24001d,0x5a25001d,0x5a26001d,0x5a27001d,0x5a28001d, + 0x5a29001d,0x5a2a001d,0x5a2b001d,0x5a2c001d,0x5a2d001d,0x5a2e001d,0x5a2f001d,0x5a30001d, + 0x5a31001d,0x5a32001d,0x5a33001d,0x5a34001d,0x5a35001d,0x5a36001d,0x5a37001d,0x5a38001d, + 0x5a39001d,0x5a3a001d,0x5a3b001d,0x5a3c001d,0x5a3d001d,0x5a3e001d,0x5a3f001d,0x5a40001d, + 0x5a41001d,0x5a42001d,0x5a43001d,0x5a44001d,0x5a45001d,0x5a46001d,0x5a47001d,0x5a48001d, + 0x5a49001d,0x5a4a001d,0x5a4b001d,0x5a4c001d,0x5a4d001d,0x5a4e001d,0x5a4f001d,0x5a50001d, + 0x5a51001d,0x5a52001d,0x5a53001d,0x5a54001d,0x5a55001d,0x5a56001d,0x5a57001d,0x5a58001d, + 0x5a59001d,0x5a5a001d,0x5a5b001d,0x5a5c001d,0x5a5d001d,0x5a5e001d,0x5a5f001d,0x5a60001d, + 0x5a61001d,0x5a62001d,0x5a63001d,0x5a64001d,0x5a65001d,0x5a66001d,0x5a67001d,0x5a68001d, + 0x5a69001d,0x5a6a001d,0x5a6b001d,0x5a6c001d,0x5a6d001d,0x5a6e001d,0x5a6f001d,0x5a70001d, + 0x5a71001d,0x5a72001d,0x5a73001d,0x5a74001d,0x5a75001d,0x5a76001d,0x5a77001d,0x5a78001d, + 0x5a79001d,0x5a7a001d,0x5a7b001d,0x5a7c001d,0x5a7d001d,0x5a7e001d,0x5a7f001d,0x5a80001d, + 0x5a81001d,0x5a82001d,0x5a83001d,0x5a84001d,0x5a85001d,0x5a86001d,0x5a87001d,0x5a88001d, + 0x5a89001d,0x5a8a001d,0x5a8b001d,0x5a8c001d,0x5a8d001d,0x5a8e001d,0x5a8f001d,0x5a90001d, + 0x5a91001d,0x5a92001d,0x5a93001d,0x5a94001d,0x5a95001d,0x5a96001d,0x5a97001d,0x5a98001d, + 0x5a99001d,0x5a9a001d,0x5a9b001d,0x5a9c001d,0x5a9d001d,0x5a9e001d,0x5a9f001d,0x5aa0001d, + 0x5aa1001d,0x5aa2001d,0x5aa3001d,0x5aa4001d,0x5aa5001d,0x5aa6001d,0x5aa7001d,0x5aa8001d, + 0x5aa9001d,0x5aaa001d,0x5aab001d,0x5aac001d,0x5aad001d,0x5aae001d,0x5aaf001d,0x5ab0001d, + 0x5ab1001d,0x5ab2001d,0x5ab3001d,0x5ab4001d,0x5ab5001d,0x5ab6001d,0x5ab7001d,0x5ab8001d, + 0x5ab9001d,0x5aba001d,0x5abb001d,0x5abc001d,0x5abd001d,0x5abe001d,0x5abf001d,0x5ac0001d, + 0x5ac1001d,0x5ac2001d,0x5ac3001d,0x5ac4001d,0x5ac5001d,0x5ac6001d,0x5ac7001d,0x5ac8001d, + 0x5ac9001d,0x5aca001d,0x5acb001d,0x5acc001d,0x5acd001d,0x5ace001d,0x5acf001d,0x5ad0001d, + 0x5ad1001d,0x5ad2001d,0x5ad3001d,0x5ad4001d,0x5ad5001d,0x5ad6001d,0x5ad7001d,0x5ad8001d, + 0x5ad9001d,0x5ada001d,0x5adb001d,0x5adc001d,0x5add001d,0x5ade001d,0x5adf001d,0x5ae0001d, + 0x5ae1001d,0x5ae2001d,0x5ae3001d,0x5ae4001d,0x5ae5001d,0x5ae6001d,0x5ae7001d,0x5ae8001d, + 0x5ae9001d,0x5aea001d,0x5aeb001d,0x5aec001d,0x5aed001d,0x5aee001d,0x5aef001d,0x5af0001d, + 0x5af1001d,0x5af2001d,0x5af3001d,0x5af4001d,0x5af5001d,0x5af6001d,0x5af7001d,0x5af8001d, + 0x5af9001d,0x5afa001d,0x5afb001d,0x5afc001d,0x5afd001d,0x5afe001d,0x5aff001d,0x5b00001d, + 0x5b01001d,0x5b02001d,0x5b03001d,0x5b04001d,0x5b05001d,0x5b06001d,0x5b07001d,0x5b08001d, + 0x5b09001d,0x5b0a001d,0x5b0b001d,0x5b0c001d,0x5b0d001d,0x5b0e001d,0x5b0f001d,0x5b10001d, + 0x5b11001d,0x5b12001d,0x5b13001d,0x5b14001d,0x5b15001d,0x5b16001d,0x5b17001d,0x5b18001d, + 0x5b19001d,0x5b1a001d,0x5b1b001d,0x5b1c001d,0x5b1d001d,0x5b1e001d,0x5b1f001d,0x5b20001d, + 0x5b21001d,0x5b22001d,0x5b23001d,0x5b24001d,0x5b25001d,0x5b26001d,0x5b27001d,0x5b28001d, + 0x5b29001d,0x5b2a001d,0x5b2b001d,0x5b2c001d,0x5b2d001d,0x5b2e001d,0x5b2f001d,0x5b30001d, + 0x5b31001d,0x5b32001d,0x5b33001d,0x5b34001d,0x5b35001d,0x5b36001d,0x5b37001d,0x5b38001d, + 0x5b39001d,0x5b3a001d,0x5b3b001d,0x5b3c001d,0x5b3d001d,0x5b3e001d,0x5b3f001d,0x5b40001d, + 0x5b41001d,0x5b42001d,0x5b43001d,0x5b44001d,0x5b45001d,0x5b46001d,0x5b47001d,0x5b48001d, + 0x5b49001d,0x5b4a001d,0x5b4b001d,0x5b4c001d,0x5b4d001d,0x5b4e001d,0x5b4f001d,0x5b50001d, + 0x5b51001d,0x5b52001d,0x5b53001d,0x5b54001d,0x5b55001d,0x5b56001d,0x5b57001d,0x5b58001d, + 0x5b59001d,0x5b5a001d,0x5b5b001d,0x5b5c001d,0x5b5d001d,0x5b5e001d,0x5b5f001d,0x5b60001d, + 0x5b61001d,0x5b62001d,0x5b63001d,0x5b64001d,0x5b65001d,0x5b66001d,0x5b67001d,0x5b68001d, + 0x5b69001d,0x5b6a001d,0x5b6b001d,0x5b6c001d,0x5b6d001d,0x5b6e001d,0x5b6f001d,0x5b70001d, + 0x5b71001d,0x5b72001d,0x5b73001d,0x5b74001d,0x5b75001d,0x5b76001d,0x5b77001d,0x5b78001d, + 0x5b79001d,0x5b7a001d,0x5b7b001d,0x5b7c001d,0x5b7d001d,0x5b7e001d,0x5b7f001d,0x5b80001d, + 0x5b81001d,0x5b82001d,0x5b83001d,0x5b84001d,0x5b85001d,0x5b86001d,0x5b87001d,0x5b88001d, + 0x5b89001d,0x5b8a001d,0x5b8b001d,0x5b8c001d,0x5b8d001d,0x5b8e001d,0x5b8f001d,0x5b90001d, + 0x5b91001d,0x5b92001d,0x5b93001d,0x5b94001d,0x5b95001d,0x5b96001d,0x5b97001d,0x5b98001d, + 0x5b99001d,0x5b9a001d,0x5b9b001d,0x5b9c001d,0x5b9d001d,0x5b9e001d,0x5b9f001d,0x5ba0001d, + 0x5ba1001d,0x5ba2001d,0x5ba3001d,0x5ba4001d,0x5ba5001d,0x5ba6001d,0x5ba7001d,0x5ba8001d, + 0x5ba9001d,0x5baa001d,0x5bab001d,0x5bac001d,0x5bad001d,0x5bae001d,0x5baf001d,0x5bb0001d, + 0x5bb1001d,0x5bb2001d,0x5bb3001d,0x5bb4001d,0x5bb5001d,0x5bb6001d,0x5bb7001d,0x5bb8001d, + 0x5bb9001d,0x5bba001d,0x5bbb001d,0x5bbc001d,0x5bbd001d,0x5bbe001d,0x5bbf001d,0x5bc0001d, + 0x5bc1001d,0x5bc2001d,0x5bc3001d,0x5bc4001d,0x5bc5001d,0x5bc6001d,0x5bc7001d,0x5bc8001d, + 0x5bc9001d,0x5bca001d,0x5bcb001d,0x5bcc001d,0x5bcd001d,0x5bce001d,0x5bcf001d,0x5bd0001d, + 0x5bd1001d,0x5bd2001d,0x5bd3001d,0x5bd4001d,0x5bd5001d,0x5bd6001d,0x5bd7001d,0x5bd8001d, + 0x5bd9001d,0x5bda001d,0x5bdb001d,0x5bdc001d,0x5bdd001d,0x5bde001d,0x5bdf001d,0x5be0001d, + 0x5be1001d,0x5be2001d,0x5be3001d,0x5be4001d,0x5be5001d,0x5be6001d,0x5be7001d,0x5be8001d, + 0x5be9001d,0x5bea001d,0x5beb001d,0x5bec001d,0x5bed001d,0x5bee001d,0x5bef001d,0x5bf0001d, + 0x5bf1001d,0x5bf2001d,0x5bf3001d,0x5bf4001d,0x5bf5001d,0x5bf6001d,0x5bf7001d,0x5bf8001d, + 0x5bf9001d,0x5bfa001d,0x5bfb001d,0x5bfc001d,0x5bfd001d,0x5bfe001d,0x5bff001d,0x5c00001d, + 0x5c01001d,0x5c02001d,0x5c03001d,0x5c04001d,0x5c05001d,0x5c06001d,0x5c07001d,0x5c08001d, + 0x5c09001d,0x5c0a001d,0x5c0b001d,0x5c0c001d,0x5c0d001d,0x5c0e001d,0x5c0f001d,0x5c10001d, + 0x5c11001d,0x5c12001d,0x5c13001d,0x5c14001d,0x5c15001d,0x5c16001d,0x5c17001d,0x5c18001d, + 0x5c19001d,0x5c1a001d,0x5c1b001d,0x5c1c001d,0x5c1d001d,0x5c1e001d,0x5c1f001d,0x5c20001d, + 0x5c21001d,0x5c22001d,0x5c23001d,0x5c24001d,0x5c25001d,0x5c26001d,0x5c27001d,0x5c28001d, + 0x5c29001d,0x5c2a001d,0x5c2b001d,0x5c2c001d,0x5c2d001d,0x5c2e001d,0x5c2f001d,0x5c30001d, + 0x5c31001d,0x5c32001d,0x5c33001d,0x5c34001d,0x5c35001d,0x5c36001d,0x5c37001d,0x5c38001d, + 0x5c39001d,0x5c3a001d,0x5c3b001d,0x5c3c001d,0x5c3d001d,0x5c3e001d,0x5c3f001d,0x5c40001d, + 0x5c41001d,0x5c42001d,0x5c43001d,0x5c44001d,0x5c45001d,0x5c46001d,0x5c47001d,0x5c48001d, + 0x5c49001d,0x5c4a001d,0x5c4b001d,0x5c4c001d,0x5c4d001d,0x5c4e001d,0x5c4f001d,0x5c50001d, + 0x5c51001d,0x5c52001d,0x5c53001d,0x5c54001d,0x5c55001d,0x5c56001d,0x5c57001d,0x5c58001d, + 0x5c59001d,0x5c5a001d,0x5c5b001d,0x5c5c001d,0x5c5d001d,0x5c5e001d,0x5c5f001d,0x5c60001d, + 0x5c61001d,0x5c62001d,0x5c63001d,0x5c64001d,0x5c65001d,0x5c66001d,0x5c67001d,0x5c68001d, + 0x5c69001d,0x5c6a001d,0x5c6b001d,0x5c6c001d,0x5c6d001d,0x5c6e001d,0x5c6f001d,0x5c70001d, + 0x5c71001d,0x5c72001d,0x5c73001d,0x5c74001d,0x5c75001d,0x5c76001d,0x5c77001d,0x5c78001d, + 0x5c79001d,0x5c7a001d,0x5c7b001d,0x5c7c001d,0x5c7d001d,0x5c7e001d,0x5c7f001d,0x5c80001d, + 0x5c81001d,0x5c82001d,0x5c83001d,0x5c84001d,0x5c85001d,0x5c86001d,0x5c87001d,0x5c88001d, + 0x5c89001d,0x5c8a001d,0x5c8b001d,0x5c8c001d,0x5c8d001d,0x5c8e001d,0x5c8f001d,0x5c90001d, + 0x5c91001d,0x5c92001d,0x5c93001d,0x5c94001d,0x5c95001d,0x5c96001d,0x5c97001d,0x5c98001d, + 0x5c99001d,0x5c9a001d,0x5c9b001d,0x5c9c001d,0x5c9d001d,0x5c9e001d,0x5c9f001d,0x5ca0001d, + 0x5ca1001d,0x5ca2001d,0x5ca3001d,0x5ca4001d,0x5ca5001d,0x5ca6001d,0x5ca7001d,0x5ca8001d, + 0x5ca9001d,0x5caa001d,0x5cab001d,0x5cac001d,0x5cad001d,0x5cae001d,0x5caf001d,0x5cb0001d, + 0x5cb1001d,0x5cb2001d,0x5cb3001d,0x5cb4001d,0x5cb5001d,0x5cb6001d,0x5cb7001d,0x5cb8001d, + 0x5cb9001d,0x5cba001d,0x5cbb001d,0x5cbc001d,0x5cbd001d,0x5cbe001d,0x5cbf001d,0x5cc0001d, + 0x5cc1001d,0x5cc2001d,0x5cc3001d,0x5cc4001d,0x5cc5001d,0x5cc6001d,0x5cc7001d,0x5cc8001d, + 0x5cc9001d,0x5cca001d,0x5ccb001d,0x5ccc001d,0x5ccd001d,0x5cce001d,0x5ccf001d,0x5cd0001d, + 0x5cd1001d,0x5cd2001d,0x5cd3001d,0x5cd4001d,0x5cd5001d,0x5cd6001d,0x5cd7001d,0x5cd8001d, + 0x5cd9001d,0x5cda001d,0x5cdb001d,0x5cdc001d,0x5cdd001d,0x5cde001d,0x5cdf001d,0x5ce0001d, + 0x5ce1001d,0x5ce2001d,0x5ce3001d,0x5ce4001d,0x5ce5001d,0x5ce6001d,0x5ce7001d,0x5ce8001d, + 0x5ce9001d,0x5cea001d,0x5ceb001d,0x5cec001d,0x5ced001d,0x5cee001d,0x5cef001d,0x5cf0001d, + 0x5cf1001d,0x5cf2001d,0x5cf3001d,0x5cf4001d,0x5cf5001d,0x5cf6001d,0x5cf7001d,0x5cf8001d, + 0x5cf9001d,0x5cfa001d,0x5cfb001d,0x5cfc001d,0x5cfd001d,0x5cfe001d,0x5cff001d,0x5d00001d, + 0x5d01001d,0x5d02001d,0x5d03001d,0x5d04001d,0x5d05001d,0x5d06001d,0x5d07001d,0x5d08001d, + 0x5d09001d,0x5d0a001d,0x5d0b001d,0x5d0c001d,0x5d0d001d,0x5d0e001d,0x5d0f001d,0x5d10001d, + 0x5d11001d,0x5d12001d,0x5d13001d,0x5d14001d,0x5d15001d,0x5d16001d,0x5d17001d,0x5d18001d, + 0x5d19001d,0x5d1a001d,0x5d1b001d,0x5d1c001d,0x5d1d001d,0x5d1e001d,0x5d1f001d,0x5d20001d, + 0x5d21001d,0x5d22001d,0x5d23001d,0x5d24001d,0x5d25001d,0x5d26001d,0x5d27001d,0x5d28001d, + 0x5d29001d,0x5d2a001d,0x5d2b001d,0x5d2c001d,0x5d2d001d,0x5d2e001d,0x5d2f001d,0x5d30001d, + 0x5d31001d,0x5d32001d,0x5d33001d,0x5d34001d,0x5d35001d,0x5d36001d,0x5d37001d,0x5d38001d, + 0x5d39001d,0x5d3a001d,0x5d3b001d,0x5d3c001d,0x5d3d001d,0x5d3e001d,0x5d3f001d,0x5d40001d, + 0x5d41001d,0x5d42001d,0x5d43001d,0x5d44001d,0x5d45001d,0x5d46001d,0x5d47001d,0x5d48001d, + 0x5d49001d,0x5d4a001d,0x5d4b001d,0x5d4c001d,0x5d4d001d,0x5d4e001d,0x5d4f001d,0x5d50001d, + 0x5d51001d,0x5d52001d,0x5d53001d,0x5d54001d,0x5d55001d,0x5d56001d,0x5d57001d,0x5d58001d, + 0x5d59001d,0x5d5a001d,0x5d5b001d,0x5d5c001d,0x5d5d001d,0x5d5e001d,0x5d5f001d,0x5d60001d, + 0x5d61001d,0x5d62001d,0x5d63001d,0x5d64001d,0x5d65001d,0x5d66001d,0x5d67001d,0x5d68001d, + 0x5d69001d,0x5d6a001d,0x5d6b001d,0x5d6c001d,0x5d6d001d,0x5d6e001d,0x5d6f001d,0x5d70001d, + 0x5d71001d,0x5d72001d,0x5d73001d,0x5d74001d,0x5d75001d,0x5d76001d,0x5d77001d,0x5d78001d, + 0x5d79001d,0x5d7a001d,0x5d7b001d,0x5d7c001d,0x5d7d001d,0x5d7e001d,0x5d7f001d,0x5d80001d, + 0x5d81001d,0x5d82001d,0x5d83001d,0x5d84001d,0x5d85001d,0x5d86001d,0x5d87001d,0x5d88001d, + 0x5d89001d,0x5d8a001d,0x5d8b001d,0x5d8c001d,0x5d8d001d,0x5d8e001d,0x5d8f001d,0x5d90001d, + 0x5d91001d,0x5d92001d,0x5d93001d,0x5d94001d,0x5d95001d,0x5d96001d,0x5d97001d,0x5d98001d, + 0x5d99001d,0x5d9a001d,0x5d9b001d,0x5d9c001d,0x5d9d001d,0x5d9e001d,0x5d9f001d,0x5da0001d, + 0x5da1001d,0x5da2001d,0x5da3001d,0x5da4001d,0x5da5001d,0x5da6001d,0x5da7001d,0x5da8001d, + 0x5da9001d,0x5daa001d,0x5dab001d,0x5dac001d,0x5dad001d,0x5dae001d,0x5daf001d,0x5db0001d, + 0x5db1001d,0x5db2001d,0x5db3001d,0x5db4001d,0x5db5001d,0x5db6001d,0x5db7001d,0x5db8001d, + 0x5db9001d,0x5dba001d,0x5dbb001d,0x5dbc001d,0x5dbd001d,0x5dbe001d,0x5dbf001d,0x5dc0001d, + 0x5dc1001d,0x5dc2001d,0x5dc3001d,0x5dc4001d,0x5dc5001d,0x5dc6001d,0x5dc7001d,0x5dc8001d, + 0x5dc9001d,0x5dca001d,0x5dcb001d,0x5dcc001d,0x5dcd001d,0x5dce001d,0x5dcf001d,0x5dd0001d, + 0x5dd1001d,0x5dd2001d,0x5dd3001d,0x5dd4001d,0x5dd5001d,0x5dd6001d,0x5dd7001d,0x5dd8001d, + 0x5dd9001d,0x5dda001d,0x5ddb001d,0x5ddc001d,0x5ddd001d,0x5dde001d,0x5ddf001d,0x5de0001d, + 0x5de1001d,0x5de2001d,0x5de3001d,0x5de4001d,0x5de5001d,0x5de6001d,0x5de7001d,0x5de8001d, + 0x5de9001d,0x5dea001d,0x5deb001d,0x5dec001d,0x5ded001d,0x5dee001d,0x5def001d,0x5df0001d, + 0x5df1001d,0x5df2001d,0x5df3001d,0x5df4001d,0x5df5001d,0x5df6001d,0x5df7001d,0x5df8001d, + 0x5df9001d,0x5dfa001d,0x5dfb001d,0x5dfc001d,0x5dfd001d,0x5dfe001d,0x5dff001d,0x5e00001d, + 0x5e01001d,0x5e02001d,0x5e03001d,0x5e04001d,0x5e05001d,0x5e06001d,0x5e07001d,0x5e08001d, + 0x5e09001d,0x5e0a001d,0x5e0b001d,0x5e0c001d,0x5e0d001d,0x5e0e001d,0x5e0f001d,0x5e10001d, + 0x5e11001d,0x5e12001d,0x5e13001d,0x5e14001d,0x5e15001d,0x5e16001d,0x5e17001d,0x5e18001d, + 0x5e19001d,0x5e1a001d,0x5e1b001d,0x5e1c001d,0x5e1d001d,0x5e1e001d,0x5e1f001d,0x5e20001d, + 0x5e21001d,0x5e22001d,0x5e23001d,0x5e24001d,0x5e25001d,0x5e26001d,0x5e27001d,0x5e28001d, + 0x5e29001d,0x5e2a001d,0x5e2b001d,0x5e2c001d,0x5e2d001d,0x5e2e001d,0x5e2f001d,0x5e30001d, + 0x5e31001d,0x5e32001d,0x5e33001d,0x5e34001d,0x5e35001d,0x5e36001d,0x5e37001d,0x5e38001d, + 0x5e39001d,0x5e3a001d,0x5e3b001d,0x5e3c001d,0x5e3d001d,0x5e3e001d,0x5e3f001d,0x5e40001d, + 0x5e41001d,0x5e42001d,0x5e43001d,0x5e44001d,0x5e45001d,0x5e46001d,0x5e47001d,0x5e48001d, + 0x5e49001d,0x5e4a001d,0x5e4b001d,0x5e4c001d,0x5e4d001d,0x5e4e001d,0x5e4f001d,0x5e50001d, + 0x5e51001d,0x5e52001d,0x5e53001d,0x5e54001d,0x5e55001d,0x5e56001d,0x5e57001d,0x5e58001d, + 0x5e59001d,0x5e5a001d,0x5e5b001d,0x5e5c001d,0x5e5d001d,0x5e5e001d,0x5e5f001d,0x5e60001d, + 0x5e61001d,0x5e62001d,0x5e63001d,0x5e64001d,0x5e65001d,0x5e66001d,0x5e67001d,0x5e68001d, + 0x5e69001d,0x5e6a001d,0x5e6b001d,0x5e6c001d,0x5e6d001d,0x5e6e001d,0x5e6f001d,0x5e70001d, + 0x5e71001d,0x5e72001d,0x5e73001d,0x5e74001d,0x5e75001d,0x5e76001d,0x5e77001d,0x5e78001d, + 0x5e79001d,0x5e7a001d,0x5e7b001d,0x5e7c001d,0x5e7d001d,0x5e7e001d,0x5e7f001d,0x5e80001d, + 0x5e81001d,0x5e82001d,0x5e83001d,0x5e84001d,0x5e85001d,0x5e86001d,0x5e87001d,0x5e88001d, + 0x5e89001d,0x5e8a001d,0x5e8b001d,0x5e8c001d,0x5e8d001d,0x5e8e001d,0x5e8f001d,0x5e90001d, + 0x5e91001d,0x5e92001d,0x5e93001d,0x5e94001d,0x5e95001d,0x5e96001d,0x5e97001d,0x5e98001d, + 0x5e99001d,0x5e9a001d,0x5e9b001d,0x5e9c001d,0x5e9d001d,0x5e9e001d,0x5e9f001d,0x5ea0001d, + 0x5ea1001d,0x5ea2001d,0x5ea3001d,0x5ea4001d,0x5ea5001d,0x5ea6001d,0x5ea7001d,0x5ea8001d, + 0x5ea9001d,0x5eaa001d,0x5eab001d,0x5eac001d,0x5ead001d,0x5eae001d,0x5eaf001d,0x5eb0001d, + 0x5eb1001d,0x5eb2001d,0x5eb3001d,0x5eb4001d,0x5eb5001d,0x5eb6001d,0x5eb7001d,0x5eb8001d, + 0x5eb9001d,0x5eba001d,0x5ebb001d,0x5ebc001d,0x5ebd001d,0x5ebe001d,0x5ebf001d,0x5ec0001d, + 0x5ec1001d,0x5ec2001d,0x5ec3001d,0x5ec4001d,0x5ec5001d,0x5ec6001d,0x5ec7001d,0x5ec8001d, + 0x5ec9001d,0x5eca001d,0x5ecb001d,0x5ecc001d,0x5ecd001d,0x5ece001d,0x5ecf001d,0x5ed0001d, + 0x5ed1001d,0x5ed2001d,0x5ed3001d,0x5ed4001d,0x5ed5001d,0x5ed6001d,0x5ed7001d,0x5ed8001d, + 0x5ed9001d,0x5eda001d,0x5edb001d,0x5edc001d,0x5edd001d,0x5ede001d,0x5edf001d,0x5ee0001d, + 0x5ee1001d,0x5ee2001d,0x5ee3001d,0x5ee4001d,0x5ee5001d,0x5ee6001d,0x5ee7001d,0x5ee8001d, + 0x5ee9001d,0x5eea001d,0x5eeb001d,0x5eec001d,0x5eed001d,0x5eee001d,0x5eef001d,0x5ef0001d, + 0x5ef1001d,0x5ef2001d,0x5ef3001d,0x5ef4001d,0x5ef5001d,0x5ef6001d,0x5ef7001d,0x5ef8001d, + 0x5ef9001d,0x5efa001d,0x5efb001d,0x5efc001d,0x5efd001d,0x5efe001d,0x5eff001d,0x5f00001d, + 0x5f01001d,0x5f02001d,0x5f03001d,0x5f04001d,0x5f05001d,0x5f06001d,0x5f07001d,0x5f08001d, + 0x5f09001d,0x5f0a001d,0x5f0b001d,0x5f0c001d,0x5f0d001d,0x5f0e001d,0x5f0f001d,0x5f10001d, + 0x5f11001d,0x5f12001d,0x5f13001d,0x5f14001d,0x5f15001d,0x5f16001d,0x5f17001d,0x5f18001d, + 0x5f19001d,0x5f1a001d,0x5f1b001d,0x5f1c001d,0x5f1d001d,0x5f1e001d,0x5f1f001d,0x5f20001d, + 0x5f21001d,0x5f22001d,0x5f23001d,0x5f24001d,0x5f25001d,0x5f26001d,0x5f27001d,0x5f28001d, + 0x5f29001d,0x5f2a001d,0x5f2b001d,0x5f2c001d,0x5f2d001d,0x5f2e001d,0x5f2f001d,0x5f30001d, + 0x5f31001d,0x5f32001d,0x5f33001d,0x5f34001d,0x5f35001d,0x5f36001d,0x5f37001d,0x5f38001d, + 0x5f39001d,0x5f3a001d,0x5f3b001d,0x5f3c001d,0x5f3d001d,0x5f3e001d,0x5f3f001d,0x5f40001d, + 0x5f41001d,0x5f42001d,0x5f43001d,0x5f44001d,0x5f45001d,0x5f46001d,0x5f47001d,0x5f48001d, + 0x5f49001d,0x5f4a001d,0x5f4b001d,0x5f4c001d,0x5f4d001d,0x5f4e001d,0x5f4f001d,0x5f50001d, + 0x5f51001d,0x5f52001d,0x5f53001d,0x5f54001d,0x5f55001d,0x5f56001d,0x5f57001d,0x5f58001d, + 0x5f59001d,0x5f5a001d,0x5f5b001d,0x5f5c001d,0x5f5d001d,0x5f5e001d,0x5f5f001d,0x5f60001d, + 0x5f61001d,0x5f62001d,0x5f63001d,0x5f64001d,0x5f65001d,0x5f66001d,0x5f67001d,0x5f68001d, + 0x5f69001d,0x5f6a001d,0x5f6b001d,0x5f6c001d,0x5f6d001d,0x5f6e001d,0x5f6f001d,0x5f70001d, + 0x5f71001d,0x5f72001d,0x5f73001d,0x5f74001d,0x5f75001d,0x5f76001d,0x5f77001d,0x5f78001d, + 0x5f79001d,0x5f7a001d,0x5f7b001d,0x5f7c001d,0x5f7d001d,0x5f7e001d,0x5f7f001d,0x5f80001d, + 0x5f81001d,0x5f82001d,0x5f83001d,0x5f84001d,0x5f85001d,0x5f86001d,0x5f87001d,0x5f88001d, + 0x5f89001d,0x5f8a001d,0x5f8b001d,0x5f8c001d,0x5f8d001d,0x5f8e001d,0x5f8f001d,0x5f90001d, + 0x5f91001d,0x5f92001d,0x5f93001d,0x5f94001d,0x5f95001d,0x5f96001d,0x5f97001d,0x5f98001d, + 0x5f99001d,0x5f9a001d,0x5f9b001d,0x5f9c001d,0x5f9d001d,0x5f9e001d,0x5f9f001d,0x5fa0001d, + 0x5fa1001d,0x5fa2001d,0x5fa3001d,0x5fa4001d,0x5fa5001d,0x5fa6001d,0x5fa7001d,0x5fa8001d, + 0x5fa9001d,0x5faa001d,0x5fab001d,0x5fac001d,0x5fad001d,0x5fae001d,0x5faf001d,0x5fb0001d, + 0x5fb1001d,0x5fb2001d,0x5fb3001d,0x5fb4001d,0x5fb5001d,0x5fb6001d,0x5fb7001d,0x5fb8001d, + 0x5fb9001d,0x5fba001d,0x5fbb001d,0x5fbc001d,0x5fbd001d,0x5fbe001d,0x5fbf001d,0x5fc0001d, + 0x5fc1001d,0x5fc2001d,0x5fc3001d,0x5fc4001d,0x5fc5001d,0x5fc6001d,0x5fc7001d,0x5fc8001d, + 0x5fc9001d,0x5fca001d,0x5fcb001d,0x5fcc001d,0x5fcd001d,0x5fce001d,0x5fcf001d,0x5fd0001d, + 0x5fd1001d,0x5fd2001d,0x5fd3001d,0x5fd4001d,0x5fd5001d,0x5fd6001d,0x5fd7001d,0x5fd8001d, + 0x5fd9001d,0x5fda001d,0x5fdb001d,0x5fdc001d,0x5fdd001d,0x5fde001d,0x5fdf001d,0x5fe0001d, + 0x5fe1001d,0x5fe2001d,0x5fe3001d,0x5fe4001d,0x5fe5001d,0x5fe6001d,0x5fe7001d,0x5fe8001d, + 0x5fe9001d,0x5fea001d,0x5feb001d,0x5fec001d,0x5fed001d,0x5fee001d,0x5fef001d,0x5ff0001d, + 0x5ff1001d,0x5ff2001d,0x5ff3001d,0x5ff4001d,0x5ff5001d,0x5ff6001d,0x5ff7001d,0x5ff8001d, + 0x5ff9001d,0x5ffa001d,0x5ffb001d,0x5ffc001d,0x5ffd001d,0x5ffe001d,0x5fff001d,0x6000001d, + 0x6001001d,0x6002001d,0x6003001d,0x6004001d,0x6005001d,0x6006001d,0x6007001d,0x6008001d, + 0x6009001d,0x600a001d,0x600b001d,0x600c001d,0x600d001d,0x600e001d,0x600f001d,0x6010001d, + 0x6011001d,0x6012001d,0x6013001d,0x6014001d,0x6015001d,0x6016001d,0x6017001d,0x6018001d, + 0x6019001d,0x601a001d,0x601b001d,0x601c001d,0x601d001d,0x601e001d,0x601f001d,0x6020001d, + 0x6021001d,0x6022001d,0x6023001d,0x6024001d,0x6025001d,0x6026001d,0x6027001d,0x6028001d, + 0x6029001d,0x602a001d,0x602b001d,0x602c001d,0x602d001d,0x602e001d,0x602f001d,0x6030001d, + 0x6031001d,0x6032001d,0x6033001d,0x6034001d,0x6035001d,0x6036001d,0x6037001d,0x6038001d, + 0x6039001d,0x603a001d,0x603b001d,0x603c001d,0x603d001d,0x603e001d,0x603f001d,0x6040001d, + 0x6041001d,0x6042001d,0x6043001d,0x6044001d,0x6045001d,0x6046001d,0x6047001d,0x6048001d, + 0x6049001d,0x604a001d,0x604b001d,0x604c001d,0x604d001d,0x604e001d,0x604f001d,0x6050001d, + 0x6051001d,0x6052001d,0x6053001d,0x6054001d,0x6055001d,0x6056001d,0x6057001d,0x6058001d, + 0x6059001d,0x605a001d,0x605b001d,0x605c001d,0x605d001d,0x605e001d,0x605f001d,0x6060001d, + 0x6061001d,0x6062001d,0x6063001d,0x6064001d,0x6065001d,0x6066001d,0x6067001d,0x6068001d, + 0x6069001d,0x606a001d,0x606b001d,0x606c001d,0x606d001d,0x606e001d,0x606f001d,0x6070001d, + 0x6071001d,0x6072001d,0x6073001d,0x6074001d,0x6075001d,0x6076001d,0x6077001d,0x6078001d, + 0x6079001d,0x607a001d,0x607b001d,0x607c001d,0x607d001d,0x607e001d,0x607f001d,0x6080001d, + 0x6081001d,0x6082001d,0x6083001d,0x6084001d,0x6085001d,0x6086001d,0x6087001d,0x6088001d, + 0x6089001d,0x608a001d,0x608b001d,0x608c001d,0x608d001d,0x608e001d,0x608f001d,0x6090001d, + 0x6091001d,0x6092001d,0x6093001d,0x6094001d,0x6095001d,0x6096001d,0x6097001d,0x6098001d, + 0x6099001d,0x609a001d,0x609b001d,0x609c001d,0x609d001d,0x609e001d,0x609f001d,0x60a0001d, + 0x60a1001d,0x60a2001d,0x60a3001d,0x60a4001d,0x60a5001d,0x60a6001d,0x60a7001d,0x60a8001d, + 0x60a9001d,0x60aa001d,0x60ab001d,0x60ac001d,0x60ad001d,0x60ae001d,0x60af001d,0x60b0001d, + 0x60b1001d,0x60b2001d,0x60b3001d,0x60b4001d,0x60b5001d,0x60b6001d,0x60b7001d,0x60b8001d, + 0x60b9001d,0x60ba001d,0x60bb001d,0x60bc001d,0x60bd001d,0x60be001d,0x60bf001d,0x60c0001d, + 0x60c1001d,0x60c2001d,0x60c3001d,0x60c4001d,0x60c5001d,0x60c6001d,0x60c7001d,0x60c8001d, + 0x60c9001d,0x60ca001d,0x60cb001d,0x60cc001d,0x60cd001d,0x60ce001d,0x60cf001d,0x60d0001d, + 0x60d1001d,0x60d2001d,0x60d3001d,0x60d4001d,0x60d5001d,0x60d6001d,0x60d7001d,0x60d8001d, + 0x60d9001d,0x60da001d,0x60db001d,0x60dc001d,0x60dd001d,0x60de001d,0x60df001d,0x60e0001d, + 0x60e1001d,0x60e2001d,0x60e3001d,0x60e4001d,0x60e5001d,0x60e6001d,0x60e7001d,0x60e8001d, + 0x60e9001d,0x60ea001d,0x60eb001d,0x60ec001d,0x60ed001d,0x60ee001d,0x60ef001d,0x60f0001d, + 0x60f1001d,0x60f2001d,0x60f3001d,0x60f4001d,0x60f5001d,0x60f6001d,0x60f7001d,0x60f8001d, + 0x60f9001d,0x60fa001d,0x60fb001d,0x60fc001d,0x60fd001d,0x60fe001d,0x60ff001d,0x6100001d, + 0x6101001d,0x6102001d,0x6103001d,0x6104001d,0x6105001d,0x6106001d,0x6107001d,0x6108001d, + 0x6109001d,0x610a001d,0x610b001d,0x610c001d,0x610d001d,0x610e001d,0x610f001d,0x6110001d, + 0x6111001d,0x6112001d,0x6113001d,0x6114001d,0x6115001d,0x6116001d,0x6117001d,0x6118001d, + 0x6119001d,0x611a001d,0x611b001d,0x611c001d,0x611d001d,0x611e001d,0x611f001d,0x6120001d, + 0x6121001d,0x6122001d,0x6123001d,0x6124001d,0x6125001d,0x6126001d,0x6127001d,0x6128001d, + 0x6129001d,0x612a001d,0x612b001d,0x612c001d,0x612d001d,0x612e001d,0x612f001d,0x6130001d, + 0x6131001d,0x6132001d,0x6133001d,0x6134001d,0x6135001d,0x6136001d,0x6137001d,0x6138001d, + 0x6139001d,0x613a001d,0x613b001d,0x613c001d,0x613d001d,0x613e001d,0x613f001d,0x6140001d, + 0x6141001d,0x6142001d,0x6143001d,0x6144001d,0x6145001d,0x6146001d,0x6147001d,0x6148001d, + 0x6149001d,0x614a001d,0x614b001d,0x614c001d,0x614d001d,0x614e001d,0x614f001d,0x6150001d, + 0x6151001d,0x6152001d,0x6153001d,0x6154001d,0x6155001d,0x6156001d,0x6157001d,0x6158001d, + 0x6159001d,0x615a001d,0x615b001d,0x615c001d,0x615d001d,0x615e001d,0x615f001d,0x6160001d, + 0x6161001d,0x6162001d,0x6163001d,0x6164001d,0x6165001d,0x6166001d,0x6167001d,0x6168001d, + 0x6169001d,0x616a001d,0x616b001d,0x616c001d,0x616d001d,0x616e001d,0x616f001d,0x6170001d, + 0x6171001d,0x6172001d,0x6173001d,0x6174001d,0x6175001d,0x6176001d,0x6177001d,0x6178001d, + 0x6179001d,0x617a001d,0x617b001d,0x617c001d,0x617d001d,0x617e001d,0x617f001d,0x6180001d, + 0x6181001d,0x6182001d,0x6183001d,0x6184001d,0x6185001d,0x6186001d,0x6187001d,0x6188001d, + 0x6189001d,0x618a001d,0x618b001d,0x618c001d,0x618d001d,0x618e001d,0x618f001d,0x6190001d, + 0x6191001d,0x6192001d,0x6193001d,0x6194001d,0x6195001d,0x6196001d,0x6197001d,0x6198001d, + 0x6199001d,0x619a001d,0x619b001d,0x619c001d,0x619d001d,0x619e001d,0x619f001d,0x61a0001d, + 0x61a1001d,0x61a2001d,0x61a3001d,0x61a4001d,0x61a5001d,0x61a6001d,0x61a7001d,0x61a8001d, + 0x61a9001d,0x61aa001d,0x61ab001d,0x61ac001d,0x61ad001d,0x61ae001d,0x61af001d,0x61b0001d, + 0x61b1001d,0x61b2001d,0x61b3001d,0x61b4001d,0x61b5001d,0x61b6001d,0x61b7001d,0x61b8001d, + 0x61b9001d,0x61ba001d,0x61bb001d,0x61bc001d,0x61bd001d,0x61be001d,0x61bf001d,0x61c0001d, + 0x61c1001d,0x61c2001d,0x61c3001d,0x61c4001d,0x61c5001d,0x61c6001d,0x61c7001d,0x61c8001d, + 0x61c9001d,0x61ca001d,0x61cb001d,0x61cc001d,0x61cd001d,0x61ce001d,0x61cf001d,0x61d0001d, + 0x61d1001d,0x61d2001d,0x61d3001d,0x61d4001d,0x61d5001d,0x61d6001d,0x61d7001d,0x61d8001d, + 0x61d9001d,0x61da001d,0x61db001d,0x61dc001d,0x61dd001d,0x61de001d,0x61df001d,0x61e0001d, + 0x61e1001d,0x61e2001d,0x61e3001d,0x61e4001d,0x61e5001d,0x61e6001d,0x61e7001d,0x61e8001d, + 0x61e9001d,0x61ea001d,0x61eb001d,0x61ec001d,0x61ed001d,0x61ee001d,0x61ef001d,0x61f0001d, + 0x61f1001d,0x61f2001d,0x61f3001d,0x61f4001d,0x61f5001d,0x61f6001d,0x61f7001d,0x61f8001d, + 0x61f9001d,0x61fa001d,0x61fb001d,0x61fc001d,0x61fd001d,0x61fe001d,0x61ff001d,0x6200001d, + 0x6201001d,0x6202001d,0x6203001d,0x6204001d,0x6205001d,0x6206001d,0x6207001d,0x6208001d, + 0x6209001d,0x620a001d,0x620b001d,0x620c001d,0x620d001d,0x620e001d,0x620f001d,0x6210001d, + 0x6211001d,0x6212001d,0x6213001d,0x6214001d,0x6215001d,0x6216001d,0x6217001d,0x6218001d, + 0x6219001d,0x621a001d,0x621b001d,0x621c001d,0x621d001d,0x621e001d,0x621f001d,0x6220001d, + 0x6221001d,0x6222001d,0x6223001d,0x6224001d,0x6225001d,0x6226001d,0x6227001d,0x6228001d, + 0x6229001d,0x622a001d,0x622b001d,0x622c001d,0x622d001d,0x622e001d,0x622f001d,0x6230001d, + 0x6231001d,0x6232001d,0x6233001d,0x6234001d,0x6235001d,0x6236001d,0x6237001d,0x6238001d, + 0x6239001d,0x623a001d,0x623b001d,0x623c001d,0x623d001d,0x623e001d,0x623f001d,0x6240001d, + 0x6241001d,0x6242001d,0x6243001d,0x6244001d,0x6245001d,0x6246001d,0x6247001d,0x6248001d, + 0x6249001d,0x624a001d,0x624b001d,0x624c001d,0x624d001d,0x624e001d,0x624f001d,0x6250001d, + 0x6251001d,0x6252001d,0x6253001d,0x6254001d,0x6255001d,0x6256001d,0x6257001d,0x6258001d, + 0x6259001d,0x625a001d,0x625b001d,0x625c001d,0x625d001d,0x625e001d,0x625f001d,0x6260001d, + 0x6261001d,0x6262001d,0x6263001d,0x6264001d,0x6265001d,0x6266001d,0x6267001d,0x6268001d, + 0x6269001d,0x626a001d,0x626b001d,0x626c001d,0x626d001d,0x626e001d,0x626f001d,0x6270001d, + 0x6271001d,0x6272001d,0x6273001d,0x6274001d,0x6275001d,0x6276001d,0x6277001d,0x6278001d, + 0x6279001d,0x627a001d,0x627b001d,0x627c001d,0x627d001d,0x627e001d,0x627f001d,0x6280001d, + 0x6281001d,0x6282001d,0x6283001d,0x6284001d,0x6285001d,0x6286001d,0x6287001d,0x6288001d, + 0x6289001d,0x628a001d,0x628b001d,0x628c001d,0x628d001d,0x628e001d,0x628f001d,0x6290001d, + 0x6291001d,0x6292001d,0x6293001d,0x6294001d,0x6295001d,0x6296001d,0x6297001d,0x6298001d, + 0x6299001d,0x629a001d,0x629b001d,0x629c001d,0x629d001d,0x629e001d,0x629f001d,0x62a0001d, + 0x62a1001d,0x62a2001d,0x62a3001d,0x62a4001d,0x62a5001d,0x62a6001d,0x62a7001d,0x62a8001d, + 0x62a9001d,0x62aa001d,0x62ab001d,0x62ac001d,0x62ad001d,0x62ae001d,0x62af001d,0x62b0001d, + 0x62b1001d,0x62b2001d,0x62b3001d,0x62b4001d,0x62b5001d,0x62b6001d,0x62b7001d,0x62b8001d, + 0x62b9001d,0x62ba001d,0x62bb001d,0x62bc001d,0x62bd001d,0x62be001d,0x62bf001d,0x62c0001d, + 0x62c1001d,0x62c2001d,0x62c3001d,0x62c4001d,0x62c5001d,0x62c6001d,0x62c7001d,0x62c8001d, + 0x62c9001d,0x62ca001d,0x62cb001d,0x62cc001d,0x62cd001d,0x62ce001d,0x62cf001d,0x62d0001d, + 0x62d1001d,0x62d2001d,0x62d3001d,0x62d4001d,0x62d5001d,0x62d6001d,0x62d7001d,0x62d8001d, + 0x62d9001d,0x62da001d,0x62db001d,0x62dc001d,0x62dd001d,0x62de001d,0x62df001d,0x62e0001d, + 0x62e1001d,0x62e2001d,0x62e3001d,0x62e4001d,0x62e5001d,0x62e6001d,0x62e7001d,0x62e8001d, + 0x62e9001d,0x62ea001d,0x62eb001d,0x62ec001d,0x62ed001d,0x62ee001d,0x62ef001d,0x62f0001d, + 0x62f1001d,0x62f2001d,0x62f3001d,0x62f4001d,0x62f5001d,0x62f6001d,0x62f7001d,0x62f8001d, + 0x62f9001d,0x62fa001d,0x62fb001d,0x62fc001d,0x62fd001d,0x62fe001d,0x62ff001d,0x6300001d, + 0x6301001d,0x6302001d,0x6303001d,0x6304001d,0x6305001d,0x6306001d,0x6307001d,0x6308001d, + 0x6309001d,0x630a001d,0x630b001d,0x630c001d,0x630d001d,0x630e001d,0x630f001d,0x6310001d, + 0x6311001d,0x6312001d,0x6313001d,0x6314001d,0x6315001d,0x6316001d,0x6317001d,0x6318001d, + 0x6319001d,0x631a001d,0x631b001d,0x631c001d,0x631d001d,0x631e001d,0x631f001d,0x6320001d, + 0x6321001d,0x6322001d,0x6323001d,0x6324001d,0x6325001d,0x6326001d,0x6327001d,0x6328001d, + 0x6329001d,0x632a001d,0x632b001d,0x632c001d,0x632d001d,0x632e001d,0x632f001d,0x6330001d, + 0x6331001d,0x6332001d,0x6333001d,0x6334001d,0x6335001d,0x6336001d,0x6337001d,0x6338001d, + 0x6339001d,0x633a001d,0x633b001d,0x633c001d,0x633d001d,0x633e001d,0x633f001d,0x6340001d, + 0x6341001d,0x6342001d,0x6343001d,0x6344001d,0x6345001d,0x6346001d,0x6347001d,0x6348001d, + 0x6349001d,0x634a001d,0x634b001d,0x634c001d,0x634d001d,0x634e001d,0x634f001d,0x6350001d, + 0x6351001d,0x6352001d,0x6353001d,0x6354001d,0x6355001d,0x6356001d,0x6357001d,0x6358001d, + 0x6359001d,0x635a001d,0x635b001d,0x635c001d,0x635d001d,0x635e001d,0x635f001d,0x6360001d, + 0x6361001d,0x6362001d,0x6363001d,0x6364001d,0x6365001d,0x6366001d,0x6367001d,0x6368001d, + 0x6369001d,0x636a001d,0x636b001d,0x636c001d,0x636d001d,0x636e001d,0x636f001d,0x6370001d, + 0x6371001d,0x6372001d,0x6373001d,0x6374001d,0x6375001d,0x6376001d,0x6377001d,0x6378001d, + 0x6379001d,0x637a001d,0x637b001d,0x637c001d,0x637d001d,0x637e001d,0x637f001d,0x6380001d, + 0x6381001d,0x6382001d,0x6383001d,0x6384001d,0x6385001d,0x6386001d,0x6387001d,0x6388001d, + 0x6389001d,0x638a001d,0x638b001d,0x638c001d,0x638d001d,0x638e001d,0x638f001d,0x6390001d, + 0x6391001d,0x6392001d,0x6393001d,0x6394001d,0x6395001d,0x6396001d,0x6397001d,0x6398001d, + 0x6399001d,0x639a001d,0x639b001d,0x639c001d,0x639d001d,0x639e001d,0x639f001d,0x63a0001d, + 0x63a1001d,0x63a2001d,0x63a3001d,0x63a4001d,0x63a5001d,0x63a6001d,0x63a7001d,0x63a8001d, + 0x63a9001d,0x63aa001d,0x63ab001d,0x63ac001d,0x63ad001d,0x63ae001d,0x63af001d,0x63b0001d, + 0x63b1001d,0x63b2001d,0x63b3001d,0x63b4001d,0x63b5001d,0x63b6001d,0x63b7001d,0x63b8001d, + 0x63b9001d,0x63ba001d,0x63bb001d,0x63bc001d,0x63bd001d,0x63be001d,0x63bf001d,0x63c0001d, + 0x63c1001d,0x63c2001d,0x63c3001d,0x63c4001d,0x63c5001d,0x63c6001d,0x63c7001d,0x63c8001d, + 0x63c9001d,0x63ca001d,0x63cb001d,0x63cc001d,0x63cd001d,0x63ce001d,0x63cf001d,0x63d0001d, + 0x63d1001d,0x63d2001d,0x63d3001d,0x63d4001d,0x63d5001d,0x63d6001d,0x63d7001d,0x63d8001d, + 0x63d9001d,0x63da001d,0x63db001d,0x63dc001d,0x63dd001d,0x63de001d,0x63df001d,0x63e0001d, + 0x63e1001d,0x63e2001d,0x63e3001d,0x63e4001d,0x63e5001d,0x63e6001d,0x63e7001d,0x63e8001d, + 0x63e9001d,0x63ea001d,0x63eb001d,0x63ec001d,0x63ed001d,0x63ee001d,0x63ef001d,0x63f0001d, + 0x63f1001d,0x63f2001d,0x63f3001d,0x63f4001d,0x63f5001d,0x63f6001d,0x63f7001d,0x63f8001d, + 0x63f9001d,0x63fa001d,0x63fb001d,0x63fc001d,0x63fd001d,0x63fe001d,0x63ff001d,0x6400001d, + 0x6401001d,0x6402001d,0x6403001d,0x6404001d,0x6405001d,0x6406001d,0x6407001d,0x6408001d, + 0x6409001d,0x640a001d,0x640b001d,0x640c001d,0x640d001d,0x640e001d,0x640f001d,0x6410001d, + 0x6411001d,0x6412001d,0x6413001d,0x6414001d,0x6415001d,0x6416001d,0x6417001d,0x6418001d, + 0x6419001d,0x641a001d,0x641b001d,0x641c001d,0x641d001d,0x641e001d,0x641f001d,0x6420001d, + 0x6421001d,0x6422001d,0x6423001d,0x6424001d,0x6425001d,0x6426001d,0x6427001d,0x6428001d, + 0x6429001d,0x642a001d,0x642b001d,0x642c001d,0x642d001d,0x642e001d,0x642f001d,0x6430001d, + 0x6431001d,0x6432001d,0x6433001d,0x6434001d,0x6435001d,0x6436001d,0x6437001d,0x6438001d, + 0x6439001d,0x643a001d,0x643b001d,0x643c001d,0x643d001d,0x643e001d,0x643f001d,0x6440001d, + 0x6441001d,0x6442001d,0x6443001d,0x6444001d,0x6445001d,0x6446001d,0x6447001d,0x6448001d, + 0x6449001d,0x644a001d,0x644b001d,0x644c001d,0x644d001d,0x644e001d,0x644f001d,0x6450001d, + 0x6451001d,0x6452001d,0x6453001d,0x6454001d,0x6455001d,0x6456001d,0x6457001d,0x6458001d, + 0x6459001d,0x645a001d,0x645b001d,0x645c001d,0x645d001d,0x645e001d,0x645f001d,0x6460001d, + 0x6461001d,0x6462001d,0x6463001d,0x6464001d,0x6465001d,0x6466001d,0x6467001d,0x6468001d, + 0x6469001d,0x646a001d,0x646b001d,0x646c001d,0x646d001d,0x646e001d,0x646f001d,0x6470001d, + 0x6471001d,0x6472001d,0x6473001d,0x6474001d,0x6475001d,0x6476001d,0x6477001d,0x6478001d, + 0x6479001d,0x647a001d,0x647b001d,0x647c001d,0x647d001d,0x647e001d,0x647f001d,0x6480001d, + 0x6481001d,0x6482001d,0x6483001d,0x6484001d,0x6485001d,0x6486001d,0x6487001d,0x6488001d, + 0x6489001d,0x648a001d,0x648b001d,0x648c001d,0x648d001d,0x648e001d,0x648f001d,0x6490001d, + 0x6491001d,0x6492001d,0x6493001d,0x6494001d,0x6495001d,0x6496001d,0x6497001d,0x6498001d, + 0x6499001d,0x649a001d,0x649b001d,0x649c001d,0x649d001d,0x649e001d,0x649f001d,0x64a0001d, + 0x64a1001d,0x64a2001d,0x64a3001d,0x64a4001d,0x64a5001d,0x64a6001d,0x64a7001d,0x64a8001d, + 0x64a9001d,0x64aa001d,0x64ab001d,0x64ac001d,0x64ad001d,0x64ae001d,0x64af001d,0x64b0001d, + 0x64b1001d,0x64b2001d,0x64b3001d,0x64b4001d,0x64b5001d,0x64b6001d,0x64b7001d,0x64b8001d, + 0x64b9001d,0x64ba001d,0x64bb001d,0x64bc001d,0x64bd001d,0x64be001d,0x64bf001d,0x64c0001d, + 0x64c1001d,0x64c2001d,0x64c3001d,0x64c4001d,0x64c5001d,0x64c6001d,0x64c7001d,0x64c8001d, + 0x64c9001d,0x64ca001d,0x64cb001d,0x64cc001d,0x64cd001d,0x64ce001d,0x64cf001d,0x64d0001d, + 0x64d1001d,0x64d2001d,0x64d3001d,0x64d4001d,0x64d5001d,0x64d6001d,0x64d7001d,0x64d8001d, + 0x64d9001d,0x64da001d,0x64db001d,0x64dc001d,0x64dd001d,0x64de001d,0x64df001d,0x64e0001d, + 0x64e1001d,0x64e2001d,0x64e3001d,0x64e4001d,0x64e5001d,0x64e6001d,0x64e7001d,0x64e8001d, + 0x64e9001d,0x64ea001d,0x64eb001d,0x64ec001d,0x64ed001d,0x64ee001d,0x64ef001d,0x64f0001d, + 0x64f1001d,0x64f2001d,0x64f3001d,0x64f4001d,0x64f5001d,0x64f6001d,0x64f7001d,0x64f8001d, + 0x64f9001d,0x64fa001d,0x64fb001d,0x64fc001d,0x64fd001d,0x64fe001d,0x64ff001d,0x6500001d, + 0x6501001d,0x6502001d,0x6503001d,0x6504001d,0x6505001d,0x6506001d,0x6507001d,0x6508001d, + 0x6509001d,0x650a001d,0x650b001d,0x650c001d,0x650d001d,0x650e001d,0x650f001d,0x6510001d, + 0x6511001d,0x6512001d,0x6513001d,0x6514001d,0x6515001d,0x6516001d,0x6517001d,0x6518001d, + 0x6519001d,0x651a001d,0x651b001d,0x651c001d,0x651d001d,0x651e001d,0x651f001d,0x6520001d, + 0x6521001d,0x6522001d,0x6523001d,0x6524001d,0x6525001d,0x6526001d,0x6527001d,0x6528001d, + 0x6529001d,0x652a001d,0x652b001d,0x652c001d,0x652d001d,0x652e001d,0x652f001d,0x6530001d, + 0x6531001d,0x6532001d,0x6533001d,0x6534001d,0x6535001d,0x6536001d,0x6537001d,0x6538001d, + 0x6539001d,0x653a001d,0x653b001d,0x653c001d,0x653d001d,0x653e001d,0x653f001d,0x6540001d, + 0x6541001d,0x6542001d,0x6543001d,0x6544001d,0x6545001d,0x6546001d,0x6547001d,0x6548001d, + 0x6549001d,0x654a001d,0x654b001d,0x654c001d,0x654d001d,0x654e001d,0x654f001d,0x6550001d, + 0x6551001d,0x6552001d,0x6553001d,0x6554001d,0x6555001d,0x6556001d,0x6557001d,0x6558001d, + 0x6559001d,0x655a001d,0x655b001d,0x655c001d,0x655d001d,0x655e001d,0x655f001d,0x6560001d, + 0x6561001d,0x6562001d,0x6563001d,0x6564001d,0x6565001d,0x6566001d,0x6567001d,0x6568001d, + 0x6569001d,0x656a001d,0x656b001d,0x656c001d,0x656d001d,0x656e001d,0x656f001d,0x6570001d, + 0x6571001d,0x6572001d,0x6573001d,0x6574001d,0x6575001d,0x6576001d,0x6577001d,0x6578001d, + 0x6579001d,0x657a001d,0x657b001d,0x657c001d,0x657d001d,0x657e001d,0x657f001d,0x6580001d, + 0x6581001d,0x6582001d,0x6583001d,0x6584001d,0x6585001d,0x6586001d,0x6587001d,0x6588001d, + 0x6589001d,0x658a001d,0x658b001d,0x658c001d,0x658d001d,0x658e001d,0x658f001d,0x6590001d, + 0x6591001d,0x6592001d,0x6593001d,0x6594001d,0x6595001d,0x6596001d,0x6597001d,0x6598001d, + 0x6599001d,0x659a001d,0x659b001d,0x659c001d,0x659d001d,0x659e001d,0x659f001d,0x65a0001d, + 0x65a1001d,0x65a2001d,0x65a3001d,0x65a4001d,0x65a5001d,0x65a6001d,0x65a7001d,0x65a8001d, + 0x65a9001d,0x65aa001d,0x65ab001d,0x65ac001d,0x65ad001d,0x65ae001d,0x65af001d,0x65b0001d, + 0x65b1001d,0x65b2001d,0x65b3001d,0x65b4001d,0x65b5001d,0x65b6001d,0x65b7001d,0x65b8001d, + 0x65b9001d,0x65ba001d,0x65bb001d,0x65bc001d,0x65bd001d,0x65be001d,0x65bf001d,0x65c0001d, + 0x65c1001d,0x65c2001d,0x65c3001d,0x65c4001d,0x65c5001d,0x65c6001d,0x65c7001d,0x65c8001d, + 0x65c9001d,0x65ca001d,0x65cb001d,0x65cc001d,0x65cd001d,0x65ce001d,0x65cf001d,0x65d0001d, + 0x65d1001d,0x65d2001d,0x65d3001d,0x65d4001d,0x65d5001d,0x65d6001d,0x65d7001d,0x65d8001d, + 0x65d9001d,0x65da001d,0x65db001d,0x65dc001d,0x65dd001d,0x65de001d,0x65df001d,0x65e0001d, + 0x65e1001d,0x65e2001d,0x65e3001d,0x65e4001d,0x65e5001d,0x65e6001d,0x65e7001d,0x65e8001d, + 0x65e9001d,0x65ea001d,0x65eb001d,0x65ec001d,0x65ed001d,0x65ee001d,0x65ef001d,0x65f0001d, + 0x65f1001d,0x65f2001d,0x65f3001d,0x65f4001d,0x65f5001d,0x65f6001d,0x65f7001d,0x65f8001d, + 0x65f9001d,0x65fa001d,0x65fb001d,0x65fc001d,0x65fd001d,0x65fe001d,0x65ff001d,0x6600001d, + 0x6601001d,0x6602001d,0x6603001d,0x6604001d,0x6605001d,0x6606001d,0x6607001d,0x6608001d, + 0x6609001d,0x660a001d,0x660b001d,0x660c001d,0x660d001d,0x660e001d,0x660f001d,0x6610001d, + 0x6611001d,0x6612001d,0x6613001d,0x6614001d,0x6615001d,0x6616001d,0x6617001d,0x6618001d, + 0x6619001d,0x661a001d,0x661b001d,0x661c001d,0x661d001d,0x661e001d,0x661f001d,0x6620001d, + 0x6621001d,0x6622001d,0x6623001d,0x6624001d,0x6625001d,0x6626001d,0x6627001d,0x6628001d, + 0x6629001d,0x662a001d,0x662b001d,0x662c001d,0x662d001d,0x662e001d,0x662f001d,0x6630001d, + 0x6631001d,0x6632001d,0x6633001d,0x6634001d,0x6635001d,0x6636001d,0x6637001d,0x6638001d, + 0x6639001d,0x663a001d,0x663b001d,0x663c001d,0x663d001d,0x663e001d,0x663f001d,0x6640001d, + 0x6641001d,0x6642001d,0x6643001d,0x6644001d,0x6645001d,0x6646001d,0x6647001d,0x6648001d, + 0x6649001d,0x664a001d,0x664b001d,0x664c001d,0x664d001d,0x664e001d,0x664f001d,0x6650001d, + 0x6651001d,0x6652001d,0x6653001d,0x6654001d,0x6655001d,0x6656001d,0x6657001d,0x6658001d, + 0x6659001d,0x665a001d,0x665b001d,0x665c001d,0x665d001d,0x665e001d,0x665f001d,0x6660001d, + 0x6661001d,0x6662001d,0x6663001d,0x6664001d,0x6665001d,0x6666001d,0x6667001d,0x6668001d, + 0x6669001d,0x666a001d,0x666b001d,0x666c001d,0x666d001d,0x666e001d,0x666f001d,0x6670001d, + 0x6671001d,0x6672001d,0x6673001d,0x6674001d,0x6675001d,0x6676001d,0x6677001d,0x6678001d, + 0x6679001d,0x667a001d,0x667b001d,0x667c001d,0x667d001d,0x667e001d,0x667f001d,0x6680001d, + 0x6681001d,0x6682001d,0x6683001d,0x6684001d,0x6685001d,0x6686001d,0x6687001d,0x6688001d, + 0x6689001d,0x668a001d,0x668b001d,0x668c001d,0x668d001d,0x668e001d,0x668f001d,0x6690001d, + 0x6691001d,0x6692001d,0x6693001d,0x6694001d,0x6695001d,0x6696001d,0x6697001d,0x6698001d, + 0x6699001d,0x669a001d,0x669b001d,0x669c001d,0x669d001d,0x669e001d,0x669f001d,0x66a0001d, + 0x66a1001d,0x66a2001d,0x66a3001d,0x66a4001d,0x66a5001d,0x66a6001d,0x66a7001d,0x66a8001d, + 0x66a9001d,0x66aa001d,0x66ab001d,0x66ac001d,0x66ad001d,0x66ae001d,0x66af001d,0x66b0001d, + 0x66b1001d,0x66b2001d,0x66b3001d,0x66b4001d,0x66b5001d,0x66b6001d,0x66b7001d,0x66b8001d, + 0x66b9001d,0x66ba001d,0x66bb001d,0x66bc001d,0x66bd001d,0x66be001d,0x66bf001d,0x66c0001d, + 0x66c1001d,0x66c2001d,0x66c3001d,0x66c4001d,0x66c5001d,0x66c6001d,0x66c7001d,0x66c8001d, + 0x66c9001d,0x66ca001d,0x66cb001d,0x66cc001d,0x66cd001d,0x66ce001d,0x66cf001d,0x66d0001d, + 0x66d1001d,0x66d2001d,0x66d3001d,0x66d4001d,0x66d5001d,0x66d6001d,0x66d7001d,0x66d8001d, + 0x66d9001d,0x66da001d,0x66db001d,0x66dc001d,0x66dd001d,0x66de001d,0x66df001d,0x66e0001d, + 0x66e1001d,0x66e2001d,0x66e3001d,0x66e4001d,0x66e5001d,0x66e6001d,0x66e7001d,0x66e8001d, + 0x66e9001d,0x66ea001d,0x66eb001d,0x66ec001d,0x66ed001d,0x66ee001d,0x66ef001d,0x66f0001d, + 0x66f1001d,0x66f2001d,0x66f3001d,0x66f4001d,0x66f5001d,0x66f6001d,0x66f7001d,0x66f8001d, + 0x66f9001d,0x66fa001d,0x66fb001d,0x66fc001d,0x66fd001d,0x66fe001d,0x66ff001d,0x6700001d, + 0x6701001d,0x6702001d,0x6703001d,0x6704001d,0x6705001d,0x6706001d,0x6707001d,0x6708001d, + 0x6709001d,0x670a001d,0x670b001d,0x670c001d,0x670d001d,0x670e001d,0x670f001d,0x6710001d, + 0x6711001d,0x6712001d,0x6713001d,0x6714001d,0x6715001d,0x6716001d,0x6717001d,0x6718001d, + 0x6719001d,0x671a001d,0x671b001d,0x671c001d,0x671d001d,0x671e001d,0x671f001d,0x6720001d, + 0x6721001d,0x6722001d,0x6723001d,0x6724001d,0x6725001d,0x6726001d,0x6727001d,0x6728001d, + 0x6729001d,0x672a001d,0x672b001d,0x672c001d,0x672d001d,0x672e001d,0x672f001d,0x6730001d, + 0x6731001d,0x6732001d,0x6733001d,0x6734001d,0x6735001d,0x6736001d,0x6737001d,0x6738001d, + 0x6739001d,0x673a001d,0x673b001d,0x673c001d,0x673d001d,0x673e001d,0x673f001d,0x6740001d, + 0x6741001d,0x6742001d,0x6743001d,0x6744001d,0x6745001d,0x6746001d,0x6747001d,0x6748001d, + 0x6749001d,0x674a001d,0x674b001d,0x674c001d,0x674d001d,0x674e001d,0x674f001d,0x6750001d, + 0x6751001d,0x6752001d,0x6753001d,0x6754001d,0x6755001d,0x6756001d,0x6757001d,0x6758001d, + 0x6759001d,0x675a001d,0x675b001d,0x675c001d,0x675d001d,0x675e001d,0x675f001d,0x6760001d, + 0x6761001d,0x6762001d,0x6763001d,0x6764001d,0x6765001d,0x6766001d,0x6767001d,0x6768001d, + 0x6769001d,0x676a001d,0x676b001d,0x676c001d,0x676d001d,0x676e001d,0x676f001d,0x6770001d, + 0x6771001d,0x6772001d,0x6773001d,0x6774001d,0x6775001d,0x6776001d,0x6777001d,0x6778001d, + 0x6779001d,0x677a001d,0x677b001d,0x677c001d,0x677d001d,0x677e001d,0x677f001d,0x6780001d, + 0x6781001d,0x6782001d,0x6783001d,0x6784001d,0x6785001d,0x6786001d,0x6787001d,0x6788001d, + 0x6789001d,0x678a001d,0x678b001d,0x678c001d,0x678d001d,0x678e001d,0x678f001d,0x6790001d, + 0x6791001d,0x6792001d,0x6793001d,0x6794001d,0x6795001d,0x6796001d,0x6797001d,0x6798001d, + 0x6799001d,0x679a001d,0x679b001d,0x679c001d,0x679d001d,0x679e001d,0x679f001d,0x67a0001d, + 0x67a1001d,0x67a2001d,0x67a3001d,0x67a4001d,0x67a5001d,0x67a6001d,0x67a7001d,0x67a8001d, + 0x67a9001d,0x67aa001d,0x67ab001d,0x67ac001d,0x67ad001d,0x67ae001d,0x67af001d,0x67b0001d, + 0x67b1001d,0x67b2001d,0x67b3001d,0x67b4001d,0x67b5001d,0x67b6001d,0x67b7001d,0x67b8001d, + 0x67b9001d,0x67ba001d,0x67bb001d,0x67bc001d,0x67bd001d,0x67be001d,0x67bf001d,0x67c0001d, + 0x67c1001d,0x67c2001d,0x67c3001d,0x67c4001d,0x67c5001d,0x67c6001d,0x67c7001d,0x67c8001d, + 0x67c9001d,0x67ca001d,0x67cb001d,0x67cc001d,0x67cd001d,0x67ce001d,0x67cf001d,0x67d0001d, + 0x67d1001d,0x67d2001d,0x67d3001d,0x67d4001d,0x67d5001d,0x67d6001d,0x67d7001d,0x67d8001d, + 0x67d9001d,0x67da001d,0x67db001d,0x67dc001d,0x67dd001d,0x67de001d,0x67df001d,0x67e0001d, + 0x67e1001d,0x67e2001d,0x67e3001d,0x67e4001d,0x67e5001d,0x67e6001d,0x67e7001d,0x67e8001d, + 0x67e9001d,0x67ea001d,0x67eb001d,0x67ec001d,0x67ed001d,0x67ee001d,0x67ef001d,0x67f0001d, + 0x67f1001d,0x67f2001d,0x67f3001d,0x67f4001d,0x67f5001d,0x67f6001d,0x67f7001d,0x67f8001d, + 0x67f9001d,0x67fa001d,0x67fb001d,0x67fc001d,0x67fd001d,0x67fe001d,0x67ff001d,0x6800001d, + 0x6801001d,0x6802001d,0x6803001d,0x6804001d,0x6805001d,0x6806001d,0x6807001d,0x6808001d, + 0x6809001d,0x680a001d,0x680b001d,0x680c001d,0x680d001d,0x680e001d,0x680f001d,0x6810001d, + 0x6811001d,0x6812001d,0x6813001d,0x6814001d,0x6815001d,0x6816001d,0x6817001d,0x6818001d, + 0x6819001d,0x681a001d,0x681b001d,0x681c001d,0x681d001d,0x681e001d,0x681f001d,0x6820001d, + 0x6821001d,0x6822001d,0x6823001d,0x6824001d,0x6825001d,0x6826001d,0x6827001d,0x6828001d, + 0x6829001d,0x682a001d,0x682b001d,0x682c001d,0x682d001d,0x682e001d,0x682f001d,0x6830001d, + 0x6831001d,0x6832001d,0x6833001d,0x6834001d,0x6835001d,0x6836001d,0x6837001d,0x6838001d, + 0x6839001d,0x683a001d,0x683b001d,0x683c001d,0x683d001d,0x683e001d,0x683f001d,0x6840001d, + 0x6841001d,0x6842001d,0x6843001d,0x6844001d,0x6845001d,0x6846001d,0x6847001d,0x6848001d, + 0x6849001d,0x684a001d,0x684b001d,0x684c001d,0x684d001d,0x684e001d,0x684f001d,0x6850001d, + 0x6851001d,0x6852001d,0x6853001d,0x6854001d,0x6855001d,0x6856001d,0x6857001d,0x6858001d, + 0x6859001d,0x685a001d,0x685b001d,0x685c001d,0x685d001d,0x685e001d,0x685f001d,0x6860001d, + 0x6861001d,0x6862001d,0x6863001d,0x6864001d,0x6865001d,0x6866001d,0x6867001d,0x6868001d, + 0x6869001d,0x686a001d,0x686b001d,0x21e010f,0x234010f,0x269010f,0x2c4010d,0x26a010f, + 0x268010f,0x22d010f,0x23e010f,0x23f010f,0x263010f,0x369010f,0x214010f,0x20c010f, + 0x226010f,0x265010f,0x6c5010d,0x6c6010d,0x6c7010d,0x6c8010d,0x6c9010d,0x6ca010d, + 0x6cb010d,0x6cc010d,0x6cd010d,0x6ce010d,0x21c010f,0x21a010f,0x36d010f,0x36e010f, + 0x36f010f,0x221010f,0x262010f,0x6cf0125,0x6e30125,0x6f70125,0x7030125,0x71f0125, + 0x74b0125,0x7530125,0x7730125,0x78d0125,0x7a10125,0x7b10125,0x7bd0125,0x7e50125, + 0x7ed0125,0x8050125,0x81d0125,0x8290125,0x8350125,0x85d0125,0x8750125,0x88d0125, + 0x8a50125,0x8b10125,0x8b90125,0x8bd0125,0x8c90125,0x240010f,0x241010f,0x2091d0f, + 0x209020f,0x209160f,0x6cf010d,0x6e3010d,0x6f7010d,0x703010d,0x71f010d,0x74b010d, + 0x753010d,0x773010d,0x78d010d,0x7a1010d,0x7b1010d,0x7bd010d,0x7e5010d,0x7ed010d, + 0x805010d,0x81d010d,0x829010d,0x835010d,0x85d010d,0x875010d,0x88d010d,0x8a5010d, + 0x8b1010d,0x8b9010d,0x8bd010d,0x8c9010d,0x242010f,0x371010f,0x243010f,0x374010f, + 0x228010b,0x219010b,0x22e010b,0x22f010b,0x235010b, + }; + +static const TUint32 TheChineseIndex[] = + { + 0x20181aca,0x20191acb,0x201c1acc,0x30011ac9,0x30021ac8,0x4e0016ba,0x4e0103eb,0x4e030f2d, + 0x4e0713de,0x4e0818d0,0x4e0910e0,0x4e0a113a,0x4e0b14db,0x4e0c0f3c,0x4e0d0176,0x4e0e17d4, + 0x4e100575,0x4e110284,0x4e1319d8,0x4e140fd3,0x4e150ea7,0x4e1611b0,0x4e181014,0x4e190143, + 0x4e1a16ad,0x4e1b02ea,0x4e1c03ff,0x4e1d122e,0x4e1e0232,0x4e2203fd,0x4e240b87,0x4e25163c, + 0x4e2710e8,0x4e28067b,0x4e2a05cd,0x4e2b160f,0x4e2c0e65,0x4e2d197e,0x4e3004fe,0x4e3202af, + 0x4e340bb1,0x4e3619bb,0x4e3813c9,0x4e390348,0x4e3a13fb,0x4e3b19bc,0x4e3d0b3f,0x4e3e098c, + 0x4e3f0ee9,0x4e430dab,0x4e450968,0x4e47139f,0x4e480ccf,0x4e4916ea,0x4e4b1930,0x4e4c144e, + 0x4e4d189f,0x4e4e071f,0x4e4f049b,0x4e500af8,0x4e520ef6,0x4e530e6e,0x4e540fbe,0x4e560642, + 0x4e580239,0x4e5916df,0x4e5c0d41,0x4e5d0967,0x4e5e0f5b,0x4e5f16aa,0x4e6014b3,0x4e61150d, + 0x4e6611dd,0x4e6907db,0x4e700c92,0x4e710c49,0x4e7310bb,0x4e7e0f8f,0x4e860afd,0x4e8817b4, + 0x4e89191c,0x4e8b11b5,0x4e8c0498,0x4e8d029b,0x4e8e17b3,0x4e8f0a7e,0x4e911836,0x4e92073d, + 0x4e930f3d,0x4e941460,0x4e950941,0x4e9805d6,0x4e9a1623,0x4e9b1547,0x4e9f0801,0x4ea01377, + 0x4ea113e1,0x4ea20a08,0x4ea408ba,0x4ea5069c,0x4ea616f1,0x4ea701e1,0x4ea806f7,0x4ea90d8c, + 0x4eab151d,0x4eac0932,0x4ead1355,0x4eae0b89,0x4eb20fdd,0x4eb3015b,0x4eb5155e,0x4eba1086, + 0x4ebb1087,0x4ebf16eb,0x4ec0116f,0x4ec11088,0x4ec20af7,0x4ec303ec,0x4ec41883,0x4ec5091b, + 0x4ec60f14,0x4ec70278,0x4ec918cd,0x4eca0910,0x4ecb0904,0x4ecd1098,0x4ece02e9,0x4ed10c4e, + 0x4ed30198,0x4ed41a0c,0x4ed511b1,0x4ed612ae,0x4ed718d1,0x4ed80554,0x4ed914df,0x4edd1363, + 0x4ede108f,0x4edf0f78,0x4ee105bd,0x4ee30337,0x4ee40bdc,0x4ee516e1,0x4ee810d4,0x4eea16c7, + 0x4eeb0d91,0x4eec0cee,0x4ef0167d,0x4ef2198b,0x4ef30ec3,0x4ef51462,0x4ef6088e,0x4ef7085b, + 0x4efb1090,0x4efd04f6,0x4eff04c8,0x4f010f5c,0x4f090a09,0x4f0a16bc,0x4f0d1463,0x4f0e081d, + 0x4f0f0520,0x4f10049c,0x4f11159b,0x4f17198c,0x4f181784,0x4f1907c9,0x4f1a07a6,0x4f1b17d5, + 0x4f1e10e3,0x4f1f140b,0x4f2002a8,0x4f221617,0x4f241131,0x4f2501eb,0x4f260c4f,0x4f270199, + 0x4f2a140c,0x4f2b19c3,0x4f2f0156,0x4f30060d,0x4f320de1,0x4f340078,0x4f360bc6,0x4f381164, + 0x4f3a1241,0x4f3c1242,0x4f3d083c,0x4f4303c0,0x4f460358,0x4f4d141d,0x4f4e0390,0x4f4f19c4, + 0x4f501a60,0x4f5117a5,0x4f531325,0x4f5506dc,0x4f5713a5,0x4f581155,0x4f5917b5,0x4f5a16f4, + 0x4f5b0513,0x4f5c1a61,0x4f5d05f9,0x4f5e0e16,0x4f5f1365,0x4f600de2,0x4f63176b,0x4f6413be, + 0x4f650f7d,0x4f6709e6,0x4f690e8c,0x4f6c0aee,0x4f6f1677,0x4f700062,0x4f73083f,0x4f740497, + 0x4f760802,0x4f7b133d,0x4f7c08cd,0x4f7e16fa,0x4f7f11a8,0x4f8309fd,0x4f841942,0x4f88025b, + 0x4f890a5e,0x4f8b0b46,0x4f8d11b6,0x4f8f19a6,0x4f9117a6,0x4f940d85,0x4f970409,0x4f9b05e9, + 0x4f9d16bf,0x4fa014cf,0x4fa30c72,0x4fa508ce,0x4fa618fe,0x4fa701a8,0x4fa80fbf,0x4fa90a65, + 0x4faa01ca,0x4fac0e21,0x4fae1469,0x4faf0710,0x4fb50fde,0x4fbf0115,0x4fc302f4,0x4fc4046c, + 0x4fc51020,0x4fca09db,0x4fce1a4c,0x4fcf0fcb,0x4fd00b4b,0x4fd1177d,0x4fd7126e,0x4fd8052b, + 0x4fda0b2f,0x4fdc0ef7,0x4fdd0096,0x4fde17bb,0x4fdf0f5a,0x4fe1157b,0x4fe317da,0x4fe60279, + 0x4fe8164d,0x4fe90b63,0x4fea0b4c,0x4fed0879,0x4fee159c,0x4fef0549,0x4ff1099b,0x4ff30e56, + 0x4ff80512,0x4ffa0020,0x4ffe00d7,0x500c0649,0x500d00b1,0x500f11e4,0x50120374,0x501409c2, + 0x501812f7,0x5019071c,0x501a16e7,0x501c1328,0x501f090b,0x50210202,0x50250a41,0x502609b2, + 0x5028099c,0x50290f9d,0x502a0ddc,0x502c19f9,0x502d143f,0x502e0c60,0x503a18ab,0x503c1944, + 0x503e0ff6,0x5043164f,0x5047085a,0x5048082c,0x504c10d1,0x504e13f1,0x504f0ed1,0x5055154f, + 0x505a1a6a,0x505c1358,0x50650895,0x506c1a37,0x50760e46,0x50771376,0x507b0c08,0x507e04f9, + 0x507f01f6,0x50800a8f,0x5085055e,0x50880b5c,0x508d0085,0x50a30336,0x50a512f9,0x50a70132, + 0x50a80296,0x50a90e32,0x50ac0304,0x50b20040,0x50ba0269,0x50bb110a,0x50cf1527,0x50d614a4, + 0x50da0b92,0x50e60977,0x50e710fd,0x50ec08c6,0x50ed08a1,0x50ee136d,0x50f3127c,0x50f508aa, + 0x50fb0ece,0x51060947,0x510715d3,0x510b0351,0x511210b2,0x51210b0b,0x513f048c,0x51401470, + 0x5141183d,0x5143180b,0x51441594,0x5145026b,0x514618e0,0x514814e0,0x51490657,0x514b0a2e, + 0x514d0d26,0x51510442,0x51541389,0x51551243,0x5156164b,0x515a0365,0x515c0413,0x5162093e, + 0x516510bd,0x5168104e,0x516b0045,0x516c05e6,0x516d0bf4,0x516e1485,0x51700ac1,0x517105f6, + 0x51730646,0x5174157d,0x51750142,0x51760f43,0x51770998,0x517803bb,0x51791a0e,0x517b167e, + 0x517c0868,0x517d11d8,0x51800838,0x518101e6,0x5182095a,0x51850dd3,0x51880593,0x51891074, + 0x518c01a7,0x518d1858,0x51920cc6,0x51950d2a,0x51960d16,0x519710a8,0x51991557,0x519b09d3, + 0x519c0e20,0x51a00648,0x51a21989,0x51a41807,0x51a50d5b,0x51ab0140,0x51ac0400,0x51af050b, + 0x51b00141,0x51b1073f,0x51b2026c,0x51b309bc,0x51b50a78,0x51b616ab,0x51b70b14,0x51bb0408, + 0x51bc14f7,0x51bd0ba4,0x51c0094a,0x51c40f31,0x51c619f6,0x51c7124f,0x51c90b7f,0x51cb03d1, + 0x51cc0bce,0x51cf087e,0x51d102ed,0x51db0bbd,0x51dd0e14,0x51e007f8,0x51e104a9,0x51e40510, + 0x51eb0521,0x51ed0efa,0x51ef09ec,0x51f0077e,0x51f3038b,0x51f50a00,0x51f61593,0x51f8137c, + 0x51f9002e,0x51fa0287,0x51fb07d8,0x51fc0367,0x51fd06a8,0x51ff186b,0x5200036d,0x520103cf, + 0x5202036e,0x5203108d,0x520604ea,0x52070fd1,0x520816ed,0x520a09f6,0x520d028a,0x520e1432, + 0x52111583,0x5212074b,0x5216182a,0x52170ba2,0x52180be3,0x52191878,0x521a0594,0x521b02b6, + 0x521d0288,0x52201114,0x52240e67,0x52280e79,0x52290b40,0x522b012e,0x522d0943,0x522e0638, + 0x52300378,0x52330a50,0x5236195e,0x5237120a,0x52381061,0x52391101,0x523a02df,0x523b0a2f, + 0x523d0671,0x523f0672,0x524009ed,0x52410463,0x52420824,0x52431327,0x524a15e5,0x524c0aaf, + 0x524d0f89,0x5250063c,0x52510891,0x52541319,0x52560f11,0x525c13c5,0x525e07e4,0x5261164a, + 0x52650150,0x5267099d,0x5269118c,0x526a087f,0x526f055d,0x527205ba,0x527d0edb,0x527f08d9, + 0x52810fb8,0x528209c8,0x52880eae,0x529007c3,0x52931718,0x529b0b2a,0x529d1060,0x529e0076, + 0x529f05e7,0x52a0083d,0x52a11472,0x52a20c94,0x52a30ba3,0x52a80407,0x52a919c5,0x52aa0e2a, + 0x52ab08f2,0x52ac1039,0x52ad114a,0x52b10b41,0x52b20925,0x52b30ae7,0x52be06dd,0x52bf11b7, + 0x52c3015a,0x52c7177e,0x52c90d28,0x52cb15f2,0x52d00cfc,0x52d20afb,0x52d615c1,0x52d809f7, + 0x52df0d98,0x52e40fe6,0x52f01553,0x52f9008b,0x52fa1145,0x52fe05f8,0x52ff1471,0x53001837, + 0x5305008c,0x530602e2,0x53081595,0x530d0f1a,0x530f0e7f,0x53100535,0x531500d1,0x53160753, + 0x531700aa,0x531911ce,0x531a04bc,0x531d184c,0x532008b3,0x53210a6e,0x532314ce,0x5326066b, + 0x532a04db,0x532e0a91,0x53390ec1,0x533a102b,0x533b16be,0x533e010d,0x533f0de7,0x53411199, + 0x53430f77,0x534510d7,0x5347117e,0x53481461,0x534907a4,0x534a0077,0x534e074d,0x534f154b, + 0x535100a4,0x53521a46,0x535319fd,0x53550349,0x53560c97,0x53570db6,0x535a015f,0x535c0171, + 0x535e0110,0x535f0172,0x536018b6,0x536109e5,0x53620c18,0x5363179b,0x53640c24,0x5366063e, + 0x53671447,0x536908ee,0x536b141b,0x536e1932,0x536f0cc0,0x53701740,0x537113ef,0x537307ff, + 0x53741065,0x53750c48,0x537709b1,0x5378155b,0x537a091c,0x537f0ff7,0x538201fb,0x53840475, + 0x53851350,0x53860b3b,0x53890b3c,0x538b1610,0x538c1659,0x538d1158,0x539501a9,0x53980b17, + 0x539a0719,0x539d031f,0x539f1811,0x53a21511,0x53a31650,0x53a509c7,0x53a6110f,0x53a8028c, + 0x53a90973,0x53ae1237,0x53b6122c,0x53bb1048,0x53bf1500,0x53c110e1,0x53c2018d,0x53c817a2, + 0x53c901b2,0x53ca07fa,0x53cb1799,0x53cc1216,0x53cd04b3,0x53d1049a,0x53d411e1,0x53d61044, + 0x53d711d6,0x53d80116,0x53d915be,0x53db0e69,0x53df1265,0x53e003e5,0x53e30a4a,0x53e4061e, + 0x53e50993,0x53e60be0,0x53e8036f,0x53e90a4b,0x53ea193f,0x53eb08dd,0x53ec18df,0x53ed0047, + 0x53ee03ed,0x53ef0a2b,0x53f012bf,0x53f10261,0x53f211a5,0x53f317a3,0x53f50f09,0x53f616ae, + 0x53f706cf,0x53f8122f,0x53f912e2,0x53fb0af9,0x53fc03d0,0x53fd07d9,0x540115b4,0x54030246, + 0x540405ce,0x54061687,0x540806db,0x540907fb,0x540a03d6,0x540c1364,0x540d0d57,0x540e0718, + 0x540f0b3e,0x54101387,0x54111523,0x5412189d,0x541314dc,0x54150c71,0x5416160e,0x54170c85, + 0x541b09d4,0x541d0bc1,0x541e1398,0x541f172d,0x542004e1,0x542100d3,0x54230ff0,0x54260515, + 0x54270049,0x54280447,0x542904eb,0x542b06a6,0x542c1352,0x542d0a3d,0x542e121f,0x542f0f60, + 0x54311935,0x5432173a,0x54341459,0x5435020e,0x54381488,0x543902b8,0x543b1433,0x543c0717, + 0x543e145a,0x54401611,0x54430476,0x54460333,0x54480234,0x544a05ae,0x544b0517,0x54500daa, + 0x54520543,0x545316f5,0x54540334,0x54550e45,0x54560b42,0x545700bd,0x5458180c,0x545913c1, + 0x545b0fa2,0x545c1452,0x54620dd1,0x54640bdd,0x54661787,0x54681992,0x5471061b,0x54721a0b, + 0x5473141e,0x547506d7,0x54760dc3,0x547714cb,0x54780e83,0x547b1166,0x547c0721,0x547d0d62, + 0x5480098a,0x5482184d,0x54840457,0x54860e7a,0x548b189e,0x548c06de,0x548e096f,0x548f177b, + 0x54900558,0x5492199a,0x549409e4,0x5495060e,0x549609e2,0x54990bf7,0x549a0401,0x549b0e0f, + 0x549d1231,0x54a30658,0x54a418a1,0x54a616cf,0x54a70ba1,0x54a81a0f,0x54a90d42,0x54aa0d05, + 0x54ab1954,0x54ac169a,0x54ad07e3,0x54af09e8,0x54b1185c,0x54b30a2a,0x54b40793,0x54b814ef, + 0x54bb159d,0x54bd162b,0x54bf16c0,0x54c00004,0x54c10ef1,0x54c2116c,0x54c40700,0x54c60458, + 0x54c713b7,0x54c80694,0x54c91853,0x54cc0e5a,0x54cd151e,0x54ce0003,0x54cf05d5,0x54d00a70, + 0x54d11620,0x54d20324,0x54d3152c,0x54d400e1,0x54d51828,0x54d7074e,0x54d90a67,0x54da045f, + 0x54dc0826,0x54dd0e22,0x54de0d82,0x54df1769,0x54e505b6,0x54e60e3f,0x54e70247,0x54e8114d, + 0x54e90b62,0x54ea0da2,0x54ed0a52,0x54ee1542,0x54f218eb,0x54f31890,0x54fa0174,0x54fc06f8, + 0x54fd05de,0x54ff05cb,0x5501165c,0x5506129e,0x550702c4,0x55090005,0x550f148f,0x551012e9, + 0x55111a68,0x55140c82,0x551b0c8d,0x55200af2,0x552212a8,0x55231873,0x5524076d,0x552707e5, + 0x552a050f,0x552c073b,0x552e11d9,0x552f1405,0x5530120b,0x55310204,0x55330b57,0x5537176a, + 0x553c110c,0x553e13b5,0x553f0725,0x5541198e,0x55430a3b,0x55441a05,0x55461133,0x55490ace, + 0x554a0001,0x55500309,0x55551309,0x5556035a,0x555c02cc,0x556104d0,0x55640eba,0x55651109, + 0x55660ab4,0x5567187d,0x556a0e4c,0x556c10f8,0x556d19dc,0x556e0e05,0x5575016c,0x557603f9, + 0x55770ad8,0x55781546,0x557b0268,0x557c131e,0x557e0964,0x558009e3,0x55811778,0x55821424, + 0x55830db8,0x55841127,0x55870aae,0x558808ea,0x55890711,0x558a06af,0x558b03e2,0x558f0e34, + 0x5591172b,0x55940e3e,0x559802ae,0x559907b2,0x559c14be,0x559d06d8,0x559f0a92,0x55a715ce, + 0x55b10b1d,0x55b31891,0x55b50d30,0x55b70e92,0x55b90a86,0x55bb17f6,0x55bd0c09,0x55be0a59, + 0x55c4110b,0x55c515ab,0x55c91278,0x55cc0014,0x55cd129d,0x55d10a28,0x55d20327,0x55d310e9, + 0x55d4021d,0x55d6125d,0x55dc11c9,0x55dd05c5,0x55df08eb,0x55e1143a,0x55e3124b,0x55e4024c, + 0x55e506c8,0x55e612ac,0x55e80695,0x55ea0fe7,0x55eb0e06,0x55ec06d9,0x55ef0d9f,0x55f203b5, + 0x55f3000c,0x55f51362,0x55f70031,0x55fd1269,0x55fe1266,0x56000395,0x56010f38,0x560801a1, + 0x5609084a,0x560c0edf,0x560e056a,0x560f062a,0x561815b1,0x561b0c8f,0x561e0b10,0x561f041f, + 0x562300c8,0x56241747,0x56270d20,0x562c1a5d,0x562d0e99,0x563119c0,0x5632020c,0x56341a53, + 0x56361239,0x56390b94,0x563b14a8,0x563f06f2,0x564c01af,0x564d08e3,0x564e16a5,0x56540385, + 0x56570f19,0x565809b9,0x56590fe9,0x565c0c16,0x56620e3d,0x56640931,0x56680f70,0x56690486, + 0x566a1875,0x566b16c5,0x566c11cc,0x567115e8,0x5676056d,0x567b10dd,0x567c0eaf,0x568510b3, + 0x568606c4,0x568e06ca,0x568f132f,0x5693017f,0x56a3153a,0x56af07d4,0x56b7107a,0x56bc08cb, + 0x56ca0dbe,0x56d40dbd,0x56d713fa,0x56da101b,0x56db123e,0x56dd0876,0x56de079c,0x56df157a, + 0x56e01721,0x56e10db4,0x56e2138d,0x56e4044e,0x56eb0729,0x56ed180d,0x56f00aa4,0x56f102e1, + 0x56f413fe,0x56f50c50,0x56f90bc8,0x56fa062d,0x56fd068a,0x56fe137f,0x56ff17a7,0x57030f23, + 0x570417dd,0x57061812,0x5708104d,0x570917de,0x570a0ff8,0x571c0768,0x571f1386,0x57231189, + 0x57281859,0x572913fd,0x572a05b3,0x572c144f,0x572d065f,0x572e0ec4,0x572f16c8,0x573003a9, + 0x57331914,0x57390a76,0x573a01fa,0x573b0f40,0x573e07dc,0x57401950,0x57420071,0x574709d5, + 0x574a04bf,0x574c00c4,0x574d12ce,0x574e09fc,0x574f075c,0x57501a62,0x57510a3e,0x57570a63, + 0x575a0863,0x575b12d4,0x575c0b43,0x575d0058,0x575e146e,0x575f04f0,0x576019ee,0x57610f03, + 0x57640a9a,0x576612de,0x576813a7,0x5769057f,0x576a0efb,0x576b03c3,0x576d0dd9,0x576f0eab, + 0x5773003e,0x57760d94,0x57770a17,0x577b03a3,0x577c0216,0x578202ba,0x57830aaa,0x57840c04, + 0x57850c05,0x57860c1b,0x578b1588,0x578c040a,0x57920b08,0x57930572,0x579b0460,0x57a0172e, + 0x57a1049d,0x57a20607,0x57a3180f,0x57a403df,0x57a60a39,0x57a71137,0x57a9047a,0x57ab03c5, + 0x57ad1626,0x57ae0a5d,0x57b209ee,0x57b40dc9,0x57b81821,0x57c205df,0x57c30006,0x57cb0c90, + 0x57ce0238,0x57cf1638,0x57d20ba6,0x57d40f24,0x57d5023a,0x57d811a3,0x57d915f3,0x57da0683, + 0x57dd0df7,0x57df17f2,0x57e0017c,0x57e40ebb,0x57ed0342,0x57ef0021,0x57f41945,0x57f8170a, + 0x57f90e87,0x57fa07ea,0x57fd10f4,0x58000a53,0x580212ea,0x5806043f,0x58070919,0x580b0e9b, + 0x580d138a,0x58110f9e,0x58150464,0x5819172c,0x581e03e3,0x5820071d,0x58210098,0x58240392, + 0x582a09f9,0x58301662,0x5835042b,0x58440b11,0x584c12b2,0x584d023e,0x58511279,0x585412b4, + 0x585812ec,0x585e10db,0x586505c6,0x586b1336,0x586c1817,0x587e11f2,0x58800257,0x58810ca3, + 0x58830956,0x58851207,0x58891771,0x58921135,0x58930d99,0x58990fad,0x589a0b84,0x589e1889, + 0x589f15b3,0x58a80d7c,0x58a90449,0x58bc07f4,0x58c100f7,0x58c51773,0x58d106f0,0x58d506cb, + 0x58e4107b,0x58eb11ad,0x58ec1089,0x58ee19e6,0x58f01180,0x58f30a29,0x58f6072d,0x58f916c2, + 0x5902194d,0x5904029a,0x590700ae,0x590d055b,0x590f14dd,0x59140a8d,0x59151484,0x591613c3, + 0x5919126f,0x591a0456,0x591c16b2,0x591f0608,0x59241734,0x592507cb,0x59270332,0x59291330, + 0x592a12c7,0x592b0516,0x592d1686,0x592e166c,0x592f06bd,0x5931118f,0x59341378,0x593716c9, + 0x59380a5c,0x5939083e,0x593a045b,0x593c0a74,0x59410b64,0x5942076b,0x5944164c,0x59470f44, + 0x59480daf,0x59490511,0x594b04f7,0x594e0a83,0x594f1a41,0x59510f6c,0x595400be,0x59551701, + 0x595608af,0x5957130e,0x595819e5,0x595a1490,0x596003ca,0x5962114f,0x59650041,0x59730e39, + 0x59740e27,0x59760dac,0x59780861,0x597912ad,0x597d06cd,0x59811224,0x598210af,0x598304ce, + 0x598413ea,0x598619e1,0x59870555,0x59880c83,0x598a1092,0x598d163d,0x5992042f,0x5993081f, + 0x59961688,0x59970926,0x59990d3d,0x599e0e18,0x59a300d4,0x59a417b6,0x59a513b0,0x59a804c4, + 0x59a91464,0x59aa17e8,0x59ab0660,0x59ae0dd7,0x59af1995,0x59b2032a,0x59b90ce5,0x59bb0f2f, + 0x59be0fd5,0x59c60d8e,0x59ca1a25,0x59cb11a9,0x59d00902,0x59d1060f,0x59d21244,0x59d3158e, + 0x59d4140f,0x59d71117,0x59d80eeb,0x59da168e,0x59dc08a5,0x59dd11e3,0x59e308bc,0x59e50aef, + 0x59e816d0,0x59ec07e6,0x59f901c5,0x59fb1723,0x59ff1a10,0x5a0113f0,0x5a0313bc,0x5a040c07, + 0x5a051627,0x5a061081,0x5a0708bd,0x5a080c3f,0x5a090ef5,0x5a0c0b30,0x5a11129f,0x5a131413, + 0x5a180df8,0x5a1c0da6,0x5a1f09aa,0x5a201169,0x5a2303ac,0x5a25046d,0x5a290d29,0x5a3117bf, + 0x5a3213ba,0x5a3414f1,0x5a361045,0x5a3c01ed,0x5a40046a,0x5a460f06,0x5a4913d4,0x5a4a0128, + 0x5a5508f8,0x5a5a07ba,0x5a6200e8,0x5a670951,0x5a6a0ac5,0x5a741745,0x5a7501d5,0x5a761174, + 0x5a771359,0x5a7a147c,0x5a7f15c5,0x5a920cd7,0x5a9a0ce8,0x5a9b1822,0x5aaa003c,0x5ab20ecd, + 0x5ab314b7,0x5ab51768,0x5ab8024d,0x5abe0609,0x5ac1085e,0x5ac210f3,0x5ac907f7,0x5acc14f6, + 0x5ad20015,0x5ad40eee,0x5ad60ee1,0x5ad80aff,0x5adc18c6,0x5ae00b22,0x5ae1039f,0x5ae31637, + 0x5ae601f9,0x5ae90dd4,0x5aeb0d67,0x5af10fae,0x5b0914a9,0x5b1600f8,0x5b17112b,0x5b320dfd, + 0x5b34175d,0x5b370d65,0x5b401218,0x5b501a24,0x5b5108ef,0x5b5309bb,0x5b540a44,0x5b551841, + 0x5b571a2c,0x5b580313,0x5b591295,0x5b5a0522,0x5b5b00bc,0x5b5c1a0d,0x5b5d1541,0x5b5f0d03, + 0x5b62008d,0x5b630825,0x5b640610,0x5b650e28,0x5b6615ea,0x5b690696,0x5b6a0c40,0x5b6c0dc2, + 0x5b7011f0,0x5b7101d7,0x5b731a16,0x5b75051d,0x5b7a10b4,0x5b7d0e0b,0x5b800d22,0x5b810e0e, + 0x5b8312af,0x5b840668,0x5b8518a9,0x5b8717d6,0x5b8811d2,0x5b890019,0x5b8b1259,0x5b8c13cc, + 0x5b8f0706,0x5b930d19,0x5b950368,0x5b971a30,0x5b980656,0x5b99199b,0x5b9a03f8,0x5b9b13d0, + 0x5b9c16cc,0x5b9d0094,0x5b9e119e,0x5ba00274,0x5ba11171,0x5ba20a30,0x5ba315cc,0x5ba411bb, + 0x5ba517a8,0x5ba6076c,0x5baa1506,0x5bab05eb,0x5bb01855,0x5bb3069e,0x5bb4165d,0x5bb5152f, + 0x5bb60844,0x5bb80224,0x5bb910a0,0x5bbd0a6b,0x5bbe0130,0x5bbf1275,0x5bc2082d,0x5bc4082e, + 0x5bc51730,0x5bc60d1d,0x5bc70a4d,0x5bcc055f,0x5bd00ce9,0x5bd206ac,0x5bd317f7,0x5bdd0fef, + 0x5bde0d78,0x5bdf01bd,0x5be1063d,0x5be41480,0x5be50b93,0x5be818ad,0x5bee0b95,0x5bf00765, + 0x5bf80315,0x5bf90441,0x5bfa123f,0x5bfb15f9,0x5bfc0372,0x5bff11d5,0x5c010502,0x5c04115b, + 0x5c0608a6,0x5c091422,0x5c0a1a58,0x5c0f153e,0x5c111149,0x5c140490,0x5c15056e,0x5c160862, + 0x5c18021e,0x5c1a113b,0x5c1c056c,0x5c1d01f5,0x5c22178a,0x5c24178b,0x5c250b9e,0x5c27168c, + 0x5c2c056f,0x5c310975,0x5c340586,0x5c38118e,0x5c391738,0x5c3a025a,0x5c3b0a0e,0x5c3c0dd8, + 0x5c3d0924,0x5c3e13f9,0x5c3f0dfe,0x5c400987,0x5c410ecb,0x5c4201b0,0x5c450979,0x5c481030, + 0x5c491326,0x5c4a0907,0x5c4b1454,0x5c4e11ab,0x5c4f0efd,0x5c5007e7,0x5c51155c,0x5c5518b8, + 0x5c590469,0x5c5e11fb,0x5c601384,0x5c610c76,0x5c6314c0,0x5c650c7a,0x5c6609a6,0x5c6e0214, + 0x5c6f139a,0x5c711112,0x5c7916f2,0x5c7a0f5d,0x5c7f17d7,0x5c81128c,0x5c820f5e,0x5c881618, + 0x5c8c07fc,0x5c8d0f7e,0x5c900f41,0x5c9101ad,0x5c9401c3,0x5c96102d,0x5c97059a,0x5c981501, + 0x5c99003f,0x5c9a0ac2,0x5c9b0373,0x5c9c004a,0x5ca20a2c,0x5ca305ff,0x5ca91640,0x5cab15a6, + 0x5cac0854,0x5cad0bde,0x5cb10338,0x5cb3182b,0x5cb50742,0x5cb70d48,0x5cb80025,0x5cbd0402, + 0x5cbf0a7f,0x5cc10cc1,0x5cc416fb,0x5ccb15fd,0x5cd2040b,0x5cd91965,0x5ce114d1,0x5ce40fbd, + 0x5ce5191f,0x5ce60c41,0x5ce8046e,0x5cea17ee,0x5ced0fcd,0x5cf00505,0x5cfb09dd,0x5d020ae9, + 0x5d030ab6,0x5d060a42,0x5d070273,0x5d0e0f4a,0x5d140303,0x5d16161c,0x5d1b09c3,0x5d1e0685, + 0x5d24153c,0x5d26162f,0x5d271250,0x5d2900c6,0x5d2d18ba,0x5d2e0630,0x5d3413ee,0x5d3d1856, + 0x5d3e169d,0x5d4707f9,0x5d4a118d,0x5d4b0cd8,0x5d4c0f9f,0x5d5810a1,0x5d5b17c7,0x5d5d0c0f, + 0x5d691253,0x5d6b1a17,0x5d6c1409,0x5d6f031a,0x5d740817,0x5d8218d7,0x5d990bb5,0x5d9d038c, + 0x5db716da,0x5dc503b9,0x5dcd13f8,0x5ddb02a4,0x5ddd02a5,0x5dde198f,0x5de115fa,0x5de2020a, + 0x5de505e4,0x5de61a5f,0x5de70fc9,0x5de80994,0x5de905f2,0x5deb1453,0x5dee01c6,0x5def1025, + 0x5df10811,0x5df216e0,0x5df3123d,0x5df40046,0x5df71524,0x5dfd160c,0x5dfe090f,0x5e0100db, + 0x5e0211b2,0x5e030177,0x5e051210,0x5e0604a4,0x5e081190,0x5e0c1489,0x5e0f13ff,0x5e1018d2, + 0x5e1112f6,0x5e140e8d,0x5e150e53,0x5e16134e,0x5e180b66,0x5e19195f,0x5e1a1998,0x5e1b0158, + 0x5e1c1960,0x5e1d03ab,0x5e26033c,0x5e27190c,0x5e2d14b4,0x5e2e007e,0x5e31027a,0x5e371406, + 0x5e3801f7,0x5e3b187e,0x5e3c068b,0x5e3d0cca,0x5e420d1e,0x5e441448,0x5e45053c,0x5e4c0791, + 0x5e540ca4,0x5e550d9a,0x5e5b18d8,0x5e5e0540,0x5e6104a6,0x5e6202b4,0x5e72057b,0x5e730ef8, + 0x5e740ded,0x5e76014a,0x5e78158f,0x5e7a1685,0x5e7b076a,0x5e7c17a4,0x5e7d1788,0x5e7f065b, + 0x5e800ec2,0x5e8419e2,0x5e861007,0x5e8700df,0x5e8a02b3,0x5e8b066a,0x5e8f15bd,0x5e900c19, + 0x5e911465,0x5e930a57,0x5e941743,0x5e9503a4,0x5e960e7b,0x5e9703c4,0x5e990d3e,0x5e9a05da, + 0x5e9c0546,0x5e9e0e71,0x5e9f04e2,0x5ea0151a,0x5ea5159e,0x5ea60432,0x5ea71a69,0x5ead1356, + 0x5eb300a9,0x5eb5001c,0x5eb61204,0x5eb70a04,0x5eb8176f,0x5eb913b1,0x5ebe17df,0x5ec90b6c, + 0x5eca0adb,0x5ed10920,0x5ed20032,0x5ed30aa9,0x5ed60b9c,0x5edb01dc,0x5ee81563,0x5eea0bbe, + 0x5ef41737,0x5ef6163a,0x5ef71354,0x5efa088f,0x5efe05f1,0x5eff0df5,0x5f0009e9,0x5f010111, + 0x5f0216f3,0x5f030f69,0x5f040e25,0x5f081702,0x5f0a00f3,0x5f0b16ec,0x5f0f11b4,0x5f1111c6, + 0x5f1305e5,0x5f151739,0x5f17051f,0x5f180704,0x5f1b0251,0x5f1f03aa,0x5f2018c3,0x5f250d07, + 0x5f2614ed,0x5f27072a,0x5f290e2b,0x5f2a094b,0x5f2d0d13,0x5f2f13c4,0x5f3110d2,0x5f39035b, + 0x5f3a0fac,0x5f3c00eb,0x5f40060a,0x5f5015ed,0x5f52065e,0x5f530362,0x5f550c2d,0x5f561390, + 0x5f5707af,0x5f581972,0x5f5d16db,0x5f611113,0x5f621586,0x5f641366,0x5f66165a,0x5f690188, + 0x5f6a011c,0x5f6c0131,0x5f6d0e9c,0x5f7018c7,0x5f711764,0x5f730260,0x5f770e70,0x5f7916f6, + 0x5f7b0215,0x5f7c00d5,0x5f8013e4,0x5f81191d,0x5f8202f2,0x5f84094c,0x5f85033d,0x5f871609, + 0x5f8806f4,0x5f891679,0x5f8a0758,0x5f8b0c7d,0x5f8c071a,0x5f9015b5,0x5f921380,0x5f950aba, + 0x5f97037f,0x5f980e57,0x5f9914bc,0x5f9c01f8,0x5fa117f8,0x5fa80781,0x5faa1602,0x5fad1693, + 0x5fae13f5,0x5fb51926,0x5fb70381,0x5fbc08db,0x5fbd079a,0x5fc3156d,0x5fc4156c,0x5fc500dc, + 0x5fc616ee,0x5fc90370,0x5fcc0820,0x5fcd108a,0x5fcf01e8,0x5fd012dd,0x5fd1130f,0x5fd21310, + 0x5fd60314,0x5fd7195b,0x5fd813eb,0x5fd90cac,0x5fdd1338,0x5fe0197f,0x5fe1026d,0x5fe41466, + 0x5fe71785,0x5fea124d,0x5feb0a64,0x5fed0112,0x5fee195c,0x5ff10220,0x5ff50df6,0x5ff80e1a, + 0x5ffb156e,0x5ffd0722,0x5ffe09f5,0x5fff04f8,0x60000757,0x600112c9,0x60021254,0x60031467, + 0x60040e49,0x60050200,0x600602b7,0x600a0206,0x600d1a64,0x600e1886,0x600f1681,0x60120e2d, + 0x6014191e,0x60150e54,0x60160179,0x60190743,0x601b032b,0x601c0b67,0x601d1232,0x6020033e, + 0x602116cd,0x60250803,0x60260e95,0x60271590,0x6028181f,0x60290dda,0x602a0645,0x602b0525, + 0x602f0fd6,0x6035029c,0x603b1a36,0x603c0443,0x603f16fc,0x60410dd5,0x604215fe,0x604311bc, + 0x604b0b79,0x604d078e,0x60500a45,0x605206f9,0x60551203,0x60591682,0x605a07ac,0x605d084f, + 0x60620794,0x60631a22,0x606415bf,0x60670e3b,0x606806f6,0x60690489,0x606a0a31,0x606b040c, + 0x606c1333,0x606d05ec,0x606f1491,0x60700f74,0x60730a3a,0x6076047b,0x60781374,0x6079162c, + 0x607a09ef,0x607b01aa,0x607c0dca,0x607d1844,0x607f1780,0x60830aa1,0x60840fc8,0x60891494, + 0x608c1329,0x608d06b3,0x60921706,0x609407a1,0x609600b2,0x609a1255,0x609b104c,0x609d0a80, + 0x609f1479,0x60a01789,0x60a30771,0x60a6182c,0x60a80e0d,0x60ab1066,0x60ac15d6,0x60ad0f81, + 0x60af0d53,0x60b104dd,0x60b200a6,0x60b4030a,0x60b8082f,0x60bb1592,0x60bc0379,0x60c50ffc, + 0x60c6027b,0x60ca0937,0x60cb13d5,0x60d107d1,0x60d5132c,0x60d813e7,0x60da0726,0x60dc1495, + 0x60dd01fd,0x60df1407,0x60e007b3,0x60e603c8,0x60e7099e,0x60e80193,0x60e90242,0x60eb00b4, + 0x60ec0fd9,0x60ed0192,0x60ee035c,0x60ef0650,0x60f00466,0x60f31521,0x60f419f0,0x60f60782, + 0x60f91084,0x60fa157f,0x61000fca,0x6101027e,0x61060f84,0x610817fc,0x610917c8,0x610d0d55, + 0x610e00ec,0x610f170e,0x61150480,0x611a17cc,0x611f058b,0x61201847,0x61230b15,0x612404fa, + 0x61260a93,0x61270a94,0x612b127a,0x613f1825,0x614802d7,0x614a0f99,0x614c077b,0x614e117b, + 0x6151115e,0x61550d9c,0x615d1313,0x61620ca5,0x616707b5,0x616809f1,0x61701428,0x61751772, + 0x61770a05,0x618b012b,0x618e188a,0x61940fc3,0x619d0445,0x61a70270,0x61a806a3,0x61a90f71, + 0x61ac0948,0x61b702a0,0x61be06b9,0x61c20406,0x61c81564,0x61ca0043,0x61cb0cce,0x61d10cf1, + 0x61d20ad5,0x61d40bbf,0x61e60e37,0x61f50d01,0x61ff1720,0x6206059e,0x620805b2,0x620a1473, + 0x620b0860,0x620c15ac,0x620d11fd,0x620e109a,0x620f14c3,0x62100233,0x62111444,0x62120905, + 0x62150fa4,0x621607cd,0x62170fa5,0x621818bd,0x621a0f34,0x621b0850,0x621f0816,0x622109fa, + 0x62220806,0x62240579,0x62250389,0x622a08fc,0x622c0888,0x622e0c37,0x623302cb,0x62340345, + 0x6237073e,0x623d0744,0x623e0b47,0x623f04c5,0x624012a7,0x6241010b,0x6243095b,0x62471126, + 0x62480747,0x624904d3,0x624b11d0,0x624c11d1,0x624d0183,0x624e1896,0x62510f17,0x62520048, + 0x62530330,0x62541097,0x625813a0,0x625b0a07,0x62630a4c,0x62660f7a,0x62671941,0x62690aa5, + 0x626a0cec,0x626b10f2,0x626c1672,0x626d0e1b,0x626e0079,0x626f0213,0x62701082,0x62730068, + 0x62760523,0x62790ea8,0x627c0477,0x627e18dd,0x627f0235,0x62800821,0x62840205,0x628909be, + 0x628a0055,0x629116f7,0x629211df,0x629319d5,0x62951379,0x62960417,0x62970a0a,0x629818e9, + 0x629a0544,0x629b0e77,0x629f138e,0x62a00a47,0x62a10c4d,0x62a20fb2,0x62a40740,0x62a5009b, + 0x62a80e96,0x62ab0eac,0x62ac12c1,0x62b1009c,0x62b503a5,0x62b90d70,0x62bb021a,0x62bc1612, + 0x62bd0276,0x62bf0d50,0x62c20526,0x62c419bd,0x62c5034a,0x62c601c7,0x62c70d8f,0x62c80deb, + 0x62c90aab,0x62ca0547,0x62cc007a,0x62cd0e55,0x62ce0bae,0x62d00644,0x62d20996,0x62d313b3, + 0x62d40050,0x62d613a1,0x62d70e1f,0x62d8097a,0x62d919f8,0x62da0e66,0x62db18db,0x62dc005f, + 0x62df0de3,0x62e20c06,0x62e30877,0x62e5176c,0x62e60ac3,0x62e70e10,0x62e8014d,0x62e91879, + 0x62ec0aa6,0x62ed11bd,0x62ee08f4,0x62ef1927,0x62f105f4,0x62f31053,0x62f41213,0x62f6184e, + 0x62f70a10,0x62fc0eec,0x62fd19d7,0x62fe119f,0x62ff0da0,0x63010256,0x63020640,0x63071955, + 0x63080fd8,0x63090026,0x630e0a5f,0x6311133e,0x631613b8,0x631a1968,0x631b0c42,0x631d143e, + 0x631e12b8,0x631f154e,0x63200dc4,0x63210364,0x632208cf,0x63231929,0x63240813,0x63250795, + 0x63280007,0x632a0e31,0x632b0320,0x632f1917,0x633212a0,0x63391707,0x633a135d,0x633d13d1, + 0x6342146a,0x634309de,0x63451371,0x63460aa2,0x634919fa,0x634b0c7b,0x634c004d,0x634d06b4, + 0x634e113e,0x634f0e00,0x635009ab,0x63550175,0x635e0ae6,0x635f1299,0x6361087c,0x6362076e, + 0x63630375,0x63670ea5,0x63690ba8,0x636d0064,0x636e099f,0x63710009,0x637602bc,0x637708f9, + 0x637a0da9,0x637b0df1,0x638014e6,0x638203b6,0x6387045a,0x638811da,0x638903d9,0x638a0f13, + 0x638c18cf,0x638e0815,0x638f1301,0x63900f72,0x63920e58,0x639616b5,0x639809c4,0x63a00c4a, + 0x63a212e4,0x63a30217,0x63a508e8,0x63a70a46,0x63a81391,0x63a91651,0x63aa0321,0x63ac097f, + 0x63ad133c,0x63ae0f90,0x63b0005e,0x63b30c26,0x63b40643,0x63b7196e,0x63b80354,0x63ba01d3, + 0x63bc0651,0x63be1823,0x63c417c9,0x63c60a87,0x63c910aa,0x63cd1a42,0x63ce15cf,0x63cf0d32, + 0x63d0131f,0x63d201b4,0x63d616c3,0x63de0023,0x63e0162a,0x63e11449,0x63e301cd,0x63e909ea, + 0x63ea0965,0x63ed08ec,0x63f21153,0x63f41814,0x63f616a8,0x63f81892,0x63fd0ad0,0x63ff0ff2, + 0x640001d4,0x640105bb,0x64020c10,0x640508d7,0x640b01c9,0x640c18bb,0x640f0162,0x6410029e, + 0x64130316,0x641410ed,0x641b086f,0x641c125e,0x641e05a8,0x64201229,0x642110ea,0x64260e35, + 0x642a12ed,0x642c006d,0x642d0326,0x64340f87,0x643a1552,0x643d01ba,0x643f05c7,0x6441048b, + 0x6444115f,0x644511eb,0x64460065,0x64471694,0x6448013b,0x644a12d0,0x6452014c,0x6454120e, + 0x645818a8,0x645e0c6b,0x64670305,0x64690d6c,0x646d194b,0x64780d64,0x64790d69,0x647a18ef, + 0x64820ba0,0x64841748,0x648509ba,0x64870ee7,0x64910230,0x649210d5,0x6495123a,0x649606b8, + 0x64991a5c,0x649e19e8,0x64a40218,0x64a90b8d,0x64ac0fcf,0x64ad0154,0x64ae0318,0x64b019de, + 0x64b50df3,0x64b71554,0x64b80c17,0x64ba02fd,0x64bc06ba,0x64c0058e,0x64c20b05,0x64c5112c, + 0x64cd019e,0x64ce0fff,0x64d00778,0x64d20fea,0x64d70ec6,0x64d8016a,0x64de126a,0x64e21a08, + 0x64e4158c,0x64e60180,0x65000e5f,0x650907c5,0x6512185e,0x6518107c,0x65251a52,0x652b09d2, + 0x652e0dc1,0x652f1931,0x65340f15,0x65350f16,0x653611cf,0x65381786,0x65390574,0x653b05e8, + 0x653e04cc,0x653f192e,0x6545062e,0x65481543,0x65490d14,0x654c039a,0x654f0d54,0x65510974, + 0x65550267,0x65560030,0x655908e0,0x655b0b72,0x655d00e9,0x655e01fe,0x6562058a,0x656310e6, + 0x65660448,0x656b08da,0x656c0953,0x65701205,0x65720fb9,0x65741928,0x6577051e,0x6587142c, + 0x658b18a7,0x658c0133,0x659004d7,0x6591006c,0x65930acb,0x65970416,0x65990b9f,0x659b072e, + 0x659c1550,0x659f1905,0x65a1144c,0x65a40911,0x65a50262,0x65a70548,0x65a918b7,0x65ab1a00, + 0x65ad0439,0x65af1234,0x65b01574,0x65b904bd,0x65bc17b1,0x65bd1193,0x65c10e73,0x65c318b1, + 0x65c40cba,0x65c50c73,0x65c60e8e,0x65cb15d7,0x65cc0938,0x65ce0de4,0x65cf1a47,0x65d20be9, + 0x65d616e9,0x65d70f54,0x65e01457,0x65e20827,0x65e51099,0x65e60357,0x65e7096d,0x65e8194f, + 0x65e9186c,0x65ec15fb,0x65ed15bc,0x65ee0569,0x65ef0aad,0x65f0058f,0x65f106b2,0x65f6119c, + 0x65f70a79,0x65fa13ec,0x6600183a,0x6602002c,0x66031884,0x66060a9b,0x660a06d0,0x660c01ec, + 0x660e0d58,0x660f07b8,0x661316fd,0x6614148a,0x66151571,0x661912d5,0x661d185d,0x661f157e, + 0x66201766,0x662502c0,0x66270ce6,0x66281a5e,0x662d18dc,0x662f11be,0x663117ec,0x66340cc3, + 0x66350de5,0x663601fc,0x663c199d,0x663e14f8,0x66410209,0x6643078f,0x664b092a,0x664c1138, + 0x664f165e,0x66521111,0x6653153f,0x665416b3,0x66551845,0x66560796,0x665706a9,0x665a13d2, + 0x665f118a,0x6661016f,0x6664147a,0x666607b0,0x66680225,0x666e0f26,0x666f0946,0x6670149b, + 0x66740ffd,0x6676093a,0x6677066f,0x667a1973,0x667e0b8c,0x66821860,0x668415d1,0x668714d6, + 0x668c0a89,0x669111f4,0x66960e2e,0x66970029,0x669d0d5e,0x66a70017,0x66a80832,0x66ae0d9d, + 0x66b400a0,0x66b914eb,0x66be1399,0x66d911fa,0x66db15f7,0x66dc16a1,0x66dd00a2,0x66e614b1, + 0x66e90dc0,0x66f01826,0x66f2102c,0x66f316af,0x66f405d9,0x66f706e0,0x66f901a0,0x66fc0ca2, + 0x66fe1888,0x66ff132d,0x67001a54,0x67081829,0x6709179a,0x670a10c4,0x670b0e9a,0x670d0527, + 0x6710103a,0x67141226,0x67151918,0x67170ae1,0x671b13ed,0x671d020b,0x671f0f36,0x67260cf8, + 0x67280d90,0x672a141c,0x672b0d71,0x672c00c1,0x672d1897,0x672f11fc,0x673119a5,0x67340f22, + 0x6735045e,0x673a07dd,0x673d15a4,0x674010fe,0x6742184f,0x6743104f,0x6746057d,0x674801b3, + 0x67491115,0x674c1475,0x674e0b2d,0x674f158d,0x67500184,0x67510311,0x67531144,0x675618d3, + 0x675c0430,0x675e0f61,0x675f11fe,0x6760059c,0x67611340,0x67650ab5,0x67681675,0x67690c8b, + 0x676a0d35,0x676d06be,0x676f00a5,0x677008f3,0x677205a7,0x67731699,0x67750294,0x67770e4e, + 0x677c19c7,0x677e124e,0x677f0072,0x67810800,0x67840604,0x67870eb5,0x678913e5,0x678b04c1, + 0x6790148b,0x6795190e,0x67970bb0,0x679810c9,0x679a0cd2,0x679c068e,0x679d1936,0x679e02e4, + 0x67a211e2,0x67a3186d,0x67a50b48,0x67a70878,0x67a80236,0x67aa0fa6,0x67ab0501,0x67ad152b, + 0x67af0a51,0x67b00efe,0x67b31940,0x67b5152d,0x67b6085d,0x67b70841,0x67b80602,0x67c10468, + 0x67c30bcb,0x67c40146,0x67cf0063,0x67d00d89,0x67d10582,0x67d20f30,0x67d31076,0x67d410a9, + 0x67d818f7,0x67d914d2,0x67da17a1,0x67dc0673,0x67dd13b4,0x67de1a65,0x67e00e12,0x67e203a6, + 0x67e501b7,0x67e90971,0x67ec087a,0x67ef0a19,0x67f00db0,0x67f119cb,0x67f30bef,0x67f401cb, + 0x67fd022e,0x67ff11bf,0x6800193a,0x680518a2,0x6807011d,0x680818be,0x68091966,0x680a0bfa, + 0x680b040d,0x680c0c1e,0x680e0b4d,0x680f0ac4,0x68111201,0x68131214,0x68160f32,0x68170b52, + 0x681d063b,0x68211544,0x682915b8,0x682a19ab,0x68320a11,0x68330af0,0x68371683,0x683806e2, + 0x683905d3,0x683c05c0,0x683d1854,0x683e0c43,0x684008f7,0x684106fa,0x68420676,0x68431307, + 0x68440659,0x68451403,0x68460a7c,0x68480027,0x6849001a,0x684a09b3,0x684c19fb,0x684e1969, + 0x68501368,0x685110e7,0x68530762,0x68540901,0x68550972,0x68601614,0x68611080,0x68621901, + 0x6863036b,0x68640f33,0x68650fc1,0x68660756,0x68670679,0x686808b0,0x686919e3,0x686b12a1, + 0x68740536,0x68761372,0x687709c5,0x68810b80,0x6883135e,0x68850cd6,0x6886007f,0x688f0631, + 0x68931a29,0x689705e2,0x68a2113f,0x68a60d04,0x68a7145c,0x68a80b18,0x68ad12a2,0x68af131a, + 0x68b0155d,0x68b311e6,0x68b504bb,0x68c00880,0x68c20bd1,0x68c90d25,0x68cb0f4f,0x68cd0682, + 0x68d20086,0x68d51a32,0x68d80807,0x68da0e9d,0x68e012eb,0x68e303b0,0x68ee10fc,0x68f002bd, + 0x68f10b12,0x68f50a1f,0x68f918e4,0x68fa064a,0x68fc04f2,0x6901068f,0x690516e8,0x690b0b81, + 0x690d1947,0x690e19ec,0x69100980,0x691208c2,0x691f0425,0x69200fa0,0x69240c5a,0x692d13b2, + 0x693016a4,0x6934043b,0x6939117c,0x693d02ac,0x693f02c1,0x69421894,0x69541548,0x6957089a, + 0x695a0298,0x695d0b7c,0x695e0b13,0x69600db9,0x69630cdb,0x696615e2,0x696b080a,0x696e0297, + 0x697102ee,0x697709f3,0x69781018,0x69791758,0x697c0c0b,0x69800ef2,0x6982057a,0x69840ad2, + 0x698617cd,0x6987022b,0x69880c70,0x6989098f,0x698d1561,0x69940add,0x699510a4,0x69980990, + 0x699b1908,0x699c0083,0x69a704de,0x69a818a6,0x69ab129c,0x69ad1562,0x69b10306,0x69b40beb, + 0x69b7106c,0x69bb12bb,0x69c105aa,0x69ca122b,0x69cc02be,0x69ce01bc,0x69d0075a,0x69d405a2, + 0x69db09fb,0x69df0136,0x69e019b1,0x69ed0f64,0x69f20735,0x69fd01a3,0x69ff0922,0x6a0a04ad, + 0x6a170289,0x6a1812f0,0x6a1f18ca,0x6a210d6a,0x6a2814ab,0x6a2a06fc,0x6a2f0fb0,0x6a31174b, + 0x6a350fc5,0x6a3d1a5a,0x6a3e1832,0x6a44058d,0x6a470fbb,0x6a5013ae,0x6a580989,0x6a590241, + 0x6a5b09cc,0x6a611528,0x6a6519b3,0x6a710291,0x6a790c28,0x6a7c181b,0x6a8012dc,0x6a8414b9, + 0x6a8e0feb,0x6a901649,0x6a910b01,0x6a97016b,0x6aa01000,0x6aa90bc0,0x6aab01bf,0x6aac0cf9, + 0x6b200f9a,0x6b2102de,0x6b22075d,0x6b231572,0x6b2417b7,0x6b270e41,0x6b3217f3,0x6b371496, + 0x6b390f3b,0x6b3a0f37,0x6b3e0a6d,0x6b43110d,0x6b461575,0x6b471549,0x6b490fa1,0x6b4c05bc, + 0x6b591162,0x6b62194e,0x6b63192a,0x6b6402dd,0x6b650178,0x6b661468,0x6b670f45,0x6b6a13c2, + 0x6b790335,0x6b7b123c,0x6b7c0864,0x6b810d72,0x6b8202f3,0x6b83166e,0x6b841339,0x6b86033f, + 0x6b871132,0x6b89160b,0x6b8a11e5,0x6b8b0190,0x6b8d0ee3,0x6b921840,0x6b930b7a,0x6b961948, + 0x6b9a034f,0x6b9b0808,0x6ba1013c,0x6baa1719,0x6bb311de,0x6bb40e42,0x6bb50438,0x6bb71728, + 0x6bbf03cb,0x6bc107a2,0x6bc2061c,0x6bc51715,0x6bcb1458,0x6bcd0d8b,0x6bcf0ce1,0x6bd20422, + 0x6bd31800,0x6bd400d2,0x6bd500dd,0x6bd600e2,0x6bd70eb6,0x6bd900e5,0x6bdb0cb6,0x6be118b0, + 0x6bea0d8a,0x6beb06c7,0x6bef12e1,0x6bf3030d,0x6bf510e2,0x6bf911ec,0x6bfd089b,0x6c0501ff, + 0x6c060f29,0x6c070c2a,0x6c0d1041,0x6c0f11ae,0x6c100394,0x6c110d47,0x6c130cb1,0x6c140f65, + 0x6c150ee6,0x6c160dae,0x6c180371,0x6c1914e2,0x6c1a02a6,0x6c1b04ee,0x6c1f052c,0x6c210403, + 0x6c220ff4,0x6c241729,0x6c26069f,0x6c27167f,0x6c28001b,0x6c291629,0x6c2a0a33,0x6c2e0360, + 0x6c2f0c81,0x6c300ffe,0x6c321835,0x6c34121c,0x6c35121b,0x6c381779,0x6c3d139e,0x6c401351, + 0x6c411933,0x6c42101d,0x6c4602fc,0x6c4707a5,0x6c4906b0,0x6c4a01c2,0x6c501486,0x6c540f67, + 0x6c551124,0x6c5706b1,0x6c5b1607,0x6c5c1240,0x6c5d10ba,0x6c5e05f3,0x6c5f08a4,0x6c600252, + 0x6c611450,0x6c6412e6,0x6c680d18,0x6c69061f,0x6c6a13e0,0x6c7012c8,0x6c7207fd,0x6c740113, + 0x6c761437,0x6c791597,0x6c7d0f6a,0x6c7e04f1,0x6c810ff1,0x6c8216ca,0x6c831445,0x6c85180e, + 0x6c8606c2,0x6c881170,0x6c890221,0x6c8c044f,0x6c8f0f2e,0x6c900d93,0x6c9312b7,0x6c940d27, + 0x6c9910ff,0x6c9b0e8b,0x6c9f05fa,0x6ca10cd1,0x6ca30500,0x6ca40e4a,0x6ca50b44,0x6ca60c51, + 0x6ca7019a,0x6ca91400,0x6caa0741,0x6cab0d73,0x6cad11ff,0x6cae098b,0x6cb113a8,0x6cb213a3, + 0x6cb306df,0x6cb804e3,0x6cb9178f,0x6cbb1961,0x6cbc18de,0x6cbd0611,0x6cbe18af,0x6cbf1641, + 0x6cc41558,0x6cc5101f,0x6cc91051,0x6cca0159,0x6ccc0d1a,0x6cd00afa,0x6cd30708,0x6cd40580, + 0x6cd504a1,0x6cd60cc2,0x6cd71246,0x6cdb04b6,0x6cde0e17,0x6ce00bc9,0x6ce10e81,0x6ce2014e, + 0x6ce30f6b,0x6ce50ddb,0x6ce819c8,0x6cea0b0d,0x6ceb15dc,0x6cee0e68,0x6cef0d51,0x6cf012cc, + 0x6cf1166d,0x6cf3177c,0x6cf500ca,0x6cf615eb,0x6cf70bf8,0x6cf80c1c,0x6cfa0c64,0x6cfb1559, + 0x6cfc0f04,0x6cfd187a,0x6cfe0933,0x6d0108f5,0x6d04079d,0x6d071724,0x6d0b167a,0x6d0c0ba5, + 0x6d0e0828,0x6d1210d6,0x6d1714ba,0x6d1919a9,0x6d1a08b5,0x6d1b0c65,0x6d1e040e,0x6d250914, + 0x6d271412,0x6d2a0709,0x6d2b15c0,0x6d2e1305,0x6d310493,0x6d321993,0x6d3310be,0x6d3515ff, + 0x6d390761,0x6d3b07c6,0x6d3c13b9,0x6d3d0f75,0x6d3e0e5b,0x6d410be5,0x6d430842,0x6d450f94, + 0x6d4608a8,0x6d4708be,0x6d4818ff,0x6d4a1a01,0x6d4b01ab,0x6d4d07a8,0x6d4e0829,0x6d4f0be4, + 0x6d5107bc,0x6d52073a,0x6d530e23,0x6d541600,0x6d5918f8,0x6d5a09df,0x6d5c0080,0x6d5e1a02, + 0x6d601492,0x6d63076f,0x6d660f25,0x6d6906d1,0x6d6a0ae4,0x6d6e0531,0x6d6f145d,0x6d7417ef, + 0x6d770699,0x6d78092b,0x6d7c0ce3,0x6d821381,0x6d850e02,0x6d881530,0x6d89115c,0x6d8c177f, + 0x6d8e14f0,0x6d911272,0x6d9309ac,0x6d9401ae,0x6d95132a,0x6d9b12ff,0x6d9d0af3,0x6d9e0ab7, + 0x6d9f0b68,0x6da01404,0x6da11440,0x6da30770,0x6da4039b,0x6da610cf,0x6da70896,0x6da818ce, + 0x6da910f7,0x6daa0537,0x6dab064c,0x6dae1215,0x6daf161d,0x6db216b6,0x6db506aa,0x6db806e5, + 0x6dbf19fc,0x6dc003c9,0x6dc41a13,0x6dc51497,0x6dc6153d,0x6dc70f4b,0x6dcb0bb2,0x6dcc12f8, + 0x6dd111e7,0x6dd60dce,0x6dd8130a,0x6dd902eb,0x6ddd04d9,0x6dde1251,0x6de00ecc,0x6de1035d, + 0x6de417af,0x6de60591,0x6deb1731,0x6dec030b,0x6dee0759,0x6df1116b,0x6df302c6,0x6df707c0, + 0x6df91630,0x6dfb1331,0x6dfc0d38,0x6e050ff9,0x6e0a180a,0x6e0c0c30,0x6e0d1a2e,0x6e0e0424, + 0x6e100898,0x6e111184,0x6e1417c3,0x6e161175,0x6e17117a,0x6e1a19be,0x6e1d17b2,0x6e20103c, + 0x6e210433,0x6e231893,0x6e240160,0x6e25144a,0x6e29142a,0x6e2b155f,0x6e2d1425,0x6e2f059b, + 0x6e3215e1,0x6e340a2d,0x6e381795,0x6e3a0d39,0x6e430e5c,0x6e440cd9,0x6e4d138c,0x6e4e0d2b, + 0x6e530e94,0x6e54086c,0x6e56072f,0x6e581512,0x6e5b18c1,0x6e5f0783,0x6e6b08d8,0x6e6e1634, + 0x6e7e13c6,0x6e7f1195,0x6e830a95,0x6e85089c,0x6e8615c6,0x6e890578,0x6e8f12ee,0x6e901818, + 0x6e980a36,0x6e9c0be1,0x6e9f0d5d,0x6ea2170f,0x6ea50f27,0x6ea70b16,0x6eaa14a1,0x6eaf127b, + 0x6eb10fe8,0x6eb2125f,0x6eb415aa,0x6eb610a2,0x6eb707c1,0x6eba0de8,0x6ebb12b3,0x6ebd10bf, + 0x6ec1028d,0x6ec20e6f,0x6ec703b7,0x6ecb1a18,0x6ecf054e,0x6ed10751,0x6ed31a2b,0x6ed41302, + 0x6ed51317,0x6ed700ee,0x6eda067f,0x6ede1974,0x6edf1666,0x6ee01160,0x6ee10ca0,0x6ee21759, + 0x6ee40c7c,0x6ee50ad7,0x6ee60c46,0x6ee80134,0x6ee912d1,0x6ef40393,0x6ef90727,0x6f020edc, + 0x6f060f39,0x6f090c36,0x6f0f0c13,0x6f130b1f,0x6f141656,0x6f1501a2,0x6f200d79,0x6f240ad3, + 0x6f2915d8,0x6f2a16c4,0x6f2b0ca6,0x6f2d0cb3,0x6f2f0c6c,0x6f311208,0x6f3318c8,0x6f360776, + 0x6f3e1684,0x6f46175b,0x6f471536,0x6f4b0b7d,0x6f4d140a,0x6f580e5e,0x6f5c0f92,0x6f5e0c39, + 0x6f620786,0x6f660b8e,0x6f6d12db,0x6f6e020d,0x6f72114e,0x6f7419b2,0x6f78111e,0x6f7a01dd, + 0x6f7c136e,0x6f840240,0x6f880219,0x6f89058c,0x6f8c123b,0x6f8d1209,0x6f8e0ea1,0x6f9c0ac9, + 0x6fa1186f,0x6fa70b35,0x6fb30042,0x6fb601e0,0x6fb912d3,0x6fc007f5,0x6fc20b6e,0x6fc91287, + 0x6fd10abe,0x6fd20138,0x6fde00fc,0x6fe006cc,0x6fe110b5,0x6fee0f20,0x6fef1a09,0x70110f2c, + 0x701a06bc,0x701b175f,0x70231569,0x703504fd,0x70391834,0x704c0653,0x704f06d5,0x705e005d, + 0x706b07c8,0x706c07c7,0x706d0d43,0x706f0383,0x70700792,0x70750bc7,0x70761871,0x70780969, + 0x707c19fe,0x707e1851,0x707f0195,0x70801676,0x70850674,0x70890c1d,0x708a02b9,0x708e1642, + 0x7092020f,0x70941062,0x70950a0c,0x70960450,0x70991962,0x709c1410,0x709d0fb5,0x70ab15dd, + 0x70ac0999,0x70ad12e3,0x70ae0e7d,0x70af095d,0x70b112c3,0x70b30147,0x70b719cc,0x70b818a3, + 0x70b903bc,0x70bb11a0,0x70bc0b78,0x70bd0265,0x70c00723,0x70c11225,0x70c20ad6,0x70c31353, + 0x70c80ba7,0x70ca167b,0x70d80702,0x70d90af4,0x70db19b6,0x70df162d,0x70e40a12,0x70e604ac, + 0x70e71140,0x70e816b4,0x70e907ad,0x70eb12fd,0x70ec092c,0x70ed1085,0x70ef1498,0x70f713cf, + 0x70f90e98,0x70fd0506,0x71091631,0x710a06b5,0x7110147b,0x711306ab,0x71150772,0x71160cf0, + 0x7118037a,0x711900b5,0x711a04f3,0x712608c3,0x712f19f7,0x71301663,0x71311664,0x71361071, + 0x7145043c,0x714a15d2,0x714c0785,0x714e0870,0x715c17fd,0x715e1108,0x71640cdc,0x716615c8, + 0x716718e5,0x716813f6,0x716e19bf,0x71720090,0x71730732,0x71780106,0x717a1395,0x717d111d, + 0x718414a5,0x718a159a,0x718f15f4,0x719410a5,0x71980be2,0x719914a6,0x719f11f3,0x71a01716, + 0x71a8184a,0x71ac002f,0x71b30ca9,0x71b51136,0x71b914ac,0x71c31073,0x71ce0b98,0x71d404af, + 0x71d5166a,0x71e01803,0x71e51876,0x71e71292,0x71ee1568,0x71f914ff,0x720600a1,0x721d09d1, + 0x72280302,0x722a19d6,0x722c0e4f,0x72301810,0x72310011,0x723509cd,0x72360552,0x723716a6, + 0x72380059,0x723903dc,0x723b168b,0x723d1219,0x723f0e60,0x72470ed9,0x72480073,0x724c0e59, + 0x724d0426,0x725203e6,0x7256179f,0x72591616,0x725b0e19,0x725d0ef3,0x725f0d84,0x72610d8d, + 0x72620ae8,0x72660cb8,0x72670d95,0x72691477,0x726e0892,0x726f0623,0x72721181,0x72750f80, + 0x72791311,0x727a1493,0x727e146b,0x727f0632,0x7280149c,0x72810b1c,0x728407eb,0x728a0427, + 0x728b09a1,0x728d086d,0x728f0ed2,0x72920a14,0x729f08b8,0x72ac105d,0x72ad105c,0x72af04b5, + 0x72b0101c,0x72b40024,0x72b619e7,0x72b7065c,0x72b80c87,0x72b9178d,0x72c1183e,0x72c20a72, + 0x72c30e1c,0x72c40397,0x72c800ac,0x72cd0e7c,0x72ce14d0,0x72d0072b,0x72d204e4,0x72d70600, + 0x72d9097b,0x72de0e11,0x72e006f5,0x72e108d0,0x72e8109c,0x72e911d7,0x72ec0429,0x72ed14d3, + 0x72ee1194,0x72ef0a68,0x72f01920,0x72f117ed,0x72f21296,0x72f317c0,0x72f400e6,0x72f709b4, + 0x72f80b19,0x72fa172f,0x72fb1280,0x72fc0ada,0x73010b53,0x730314fa,0x730a0dde,0x730e0ba9, + 0x73130689,0x73150d0a,0x731601ee,0x731716dc,0x731b0cfd,0x731c0182,0x731d02f5,0x731e1150, + 0x73210c56,0x73220730,0x73251416,0x73291580,0x732a19ae,0x732b0cb5,0x732c1426,0x732e150a, + 0x73310dc7,0x73340712,0x73371797,0x73380cda,0x733901bb,0x733e0752,0x733f1819,0x734d0957, + 0x735018c9,0x73520033,0x735709ca,0x73600b96,0x736c1565,0x736d12b5,0x736f15f5,0x737e075e, + 0x738415d4,0x73870c7f,0x738917e4,0x738b13e2,0x738e03ee,0x739107de,0x7396096a,0x739b0c88, + 0x739f0d49,0x73a2013a,0x73a913cd,0x73ab0cd3,0x73ae1411,0x73af075f,0x73b01503,0x73b20bcc, + 0x73b30340,0x73b703c6,0x73ba14bb,0x73bb014f,0x73c00f0d,0x73c20a1a,0x73c80843,0x73c90d4b, + 0x73ca111a,0x73cd1900,0x73cf09bf,0x73d004a3,0x73d10bfb,0x73d905f5,0x73de0c69,0x73e019ac, + 0x73e50495,0x73e71690,0x73e906fb,0x73ed0069,0x73f20797,0x74031023,0x74050adc,0x74060b32, + 0x74090be7,0x740a161a,0x740f0b73,0x741012aa,0x741a0981,0x741b021c,0x74221a06,0x7425073c, + 0x74260f50,0x74280a9c,0x742a0f51,0x742c13d9,0x742e02ec,0x74301654,0x74330bb3,0x74340fe4, + 0x74350ebc,0x74360e51,0x743c1012,0x74410ccb,0x745514d7,0x74571824,0x74590dcc,0x745a0733, + 0x745b1746,0x745c17ce,0x745e10cc,0x745f10fa,0x746d12ef,0x74700666,0x74761696,0x74770018, + 0x747e0923,0x74800307,0x748102e7,0x74830b23,0x748715d9,0x748b18cb,0x748e174c,0x74900c3a, + 0x749c0787,0x749e0f1f,0x74a700ff,0x74a80197,0x74a9103f,0x74ba1438,0x74d21863,0x74dc0637, + 0x74de03e0,0x74e00748,0x74e20ee0,0x74e3007c,0x74e41078,0x74e613bd,0x74ee143c,0x74ef0e43, + 0x74f40bcd,0x74f60eff,0x74f702d6,0x74ff017d,0x75041906,0x750d0cf6,0x750f00cc,0x7511188e, + 0x75130ecf,0x7518057c,0x75190339,0x751a1178,0x751c1335,0x751f117f,0x75251183,0x75281783, + 0x7529120f,0x752b0545,0x752c177a,0x752d00c9,0x752f0e15,0x75301332,0x7531178c,0x75320855, + 0x75331163,0x753503bf,0x75370db5,0x753803c1,0x753a03f4,0x753b0754,0x753e1852,0x754000e0, + 0x75450201,0x754804ba,0x754b1334,0x754c0908,0x754e105e,0x754f141f,0x75540e6b,0x75590be6, + 0x755a00c3,0x755b1910,0x755c02a3,0x75650c4b,0x75660f4c,0x756a04a5,0x75721152,0x7574027d, + 0x757807ee,0x757913db,0x757f07f1,0x7583138f,0x758608ad,0x758b0ec8,0x758f11e9,0x759116d9, + 0x75920dcf,0x759403ef,0x759608e6,0x75970b90,0x759905b5,0x759a0970,0x759d1125,0x759f0e2f, + 0x75a00b49,0x75a11678,0x75a31790,0x75a4004c,0x75a50909,0x75ab1703,0x75ac0b4e,0x75ae02b1, + 0x75af0503,0x75b019ce,0x75b10e82,0x75b20eb7,0x75b30584,0x75b40a1d,0x75b502d1,0x75b80353, + 0x75b91911,0x75bc1314,0x75bd097e,0x75be0805,0x75c20845,0x75c315d5,0x75c418a4,0x75c5014b, + 0x75c7192f,0x75c8176d,0x75c9094f,0x75ca1055,0x75cd16d5,0x75d21680,0x75d4196f,0x75d506f3, + 0x75d61621,0x75d8041d,0x75db1375,0x75de0ec5,0x75e20b5d,0x75e31975,0x75e4031b,0x75e6147d, + 0x75e71105,0x75e80aea,0x75ea0774,0x75eb14f4,0x75f012d8,0x75f104e7,0x75f4024e,0x75f900ef, + 0x75fc0634,0x75ff1417,0x760017b0,0x7601030e,0x760319b9,0x76050356,0x760a0713,0x760c0ab1, + 0x761017e0,0x76150859,0x76171713,0x76180c14,0x761910f5,0x761b026a,0x761f142b,0x7620080d, + 0x7622006e,0x76240bec,0x762501cf,0x762611dc,0x7629032d,0x762a012d,0x762b12d2,0x762d0122, + 0x76300c62,0x76330277,0x763418d9,0x763518ae,0x76381064,0x763c0d7d,0x763e173e,0x763f1765, + 0x7640078a,0x76430c01,0x764c000b,0x764d006f,0x7654171e,0x76560ec7,0x765c03cd,0x765e0abf, + 0x766315db,0x766b03ba,0x766f1042,0x7678066d,0x767b0384,0x767d0060,0x767e0061,0x76821872, + 0x76840382,0x768608e7,0x7687077d,0x76880663,0x768b059f,0x768e08d3,0x7691000a,0x769306d3, + 0x769613da,0x769914a2,0x76a40f08,0x76ae0eb3,0x76b119a0,0x76b209d7,0x76b40312,0x76bf0d4e, + 0x76c217b8,0x76c51981,0x76c60e93,0x76c81752,0x76ca1708,0x76cd06e3,0x76ce002d,0x76cf18b9, + 0x76d01644,0x76d10869,0x76d206e6,0x76d40a81,0x76d60577,0x76d7037b,0x76d80e61,0x76db118b, + 0x76df0cf5,0x76e50652,0x76ee0d92,0x76ef03f0,0x76f115ad,0x76f20cae,0x76f41943,0x76f8150f, + 0x76f9044c,0x76fc0e6a,0x76fe0451,0x77011186,0x77040d2e,0x77070d36,0x7708034b,0x77090cd4, + 0x770b0a01,0x770d0a49,0x771916d3,0x771a1187,0x771f1902,0x77200d23,0x77221808,0x77261a2f, + 0x7728189b,0x772915df,0x772d067a,0x772f0d06,0x7735024a,0x77360a7d,0x773709b7,0x77380d86, + 0x773a1348,0x773c1652,0x774018fb,0x77411922,0x774312a3,0x774703b1,0x77500abc,0x77510882, + 0x775a161e,0x775b093c,0x7761121e,0x77621286,0x77630420,0x77650101,0x77660d9b,0x77680de9, + 0x776b08fb,0x776c0189,0x7779042d,0x777d0a8b,0x777e05a3,0x777f10cd,0x77800ccc,0x77840d33, + 0x77850285,0x778c0a24,0x778d1267,0x778e14cd,0x77910d5f,0x77920c9c,0x779f0ee4,0x77a00231, + 0x77a20cf7,0x77a50ee8,0x77a70fc6,0x77a919c2,0x77aa038d,0x77ac1222,0x77b00a03,0x77b3136f, + 0x77b50bb9,0x77bb18b5,0x77bd062c,0x77bf1038,0x77cd09d0,0x77d702a2,0x77db0cb7,0x77dc0915, + 0x77e211a6,0x77e316e3,0x77e51937,0x77e71172,0x77e9098d,0x77eb08d4,0x77ec031c,0x77ed0437, + 0x77ee000d,0x77f3119b,0x77f607e1,0x77f80587,0x77fd148c,0x77fe04aa,0x77ff0a7a,0x78000369, + 0x78010c89,0x78021102,0x7809074c,0x780c0f6d,0x780d09fe,0x78111628,0x78120ead,0x78141643, + 0x781619d9,0x78170212,0x78180452,0x781a165b,0x781c0504,0x781d04a2,0x781f189c,0x782313aa, + 0x782503a7,0x782618ac,0x78271903,0x78290532,0x782c0b38,0x782d0103,0x78300e97,0x78340f0e, + 0x7837116a,0x78381850,0x78390012,0x783a0b54,0x783b0bfd,0x783c1369,0x783e0b55,0x78400295, + 0x78450665,0x78470dc5,0x784c05d0,0x784e1589,0x78500411,0x78521499,0x78551228,0x785614d4, + 0x78570fb6,0x785d1534,0x786a144b,0x786b0be8,0x786c1767,0x786d0cb0,0x786e1068,0x78770883, + 0x787c0e9e,0x788703fb,0x788903d3,0x788c0c34,0x788d0016,0x788e1290,0x789100a7,0x78930444, + 0x789713dc,0x789803bd,0x789a00b7,0x789b0f6f,0x789c0227,0x789f03e7,0x78a119a4,0x78a308fd, + 0x78a5010e,0x78a700f4,0x78b00ea6,0x78b10889,0x78b203b4,0x78b312e5,0x78b401be,0x78b915e3, + 0x78be0df4,0x78c102d9,0x78c50089,0x78c910eb,0x78ca0b09,0x78cb0317,0x78d00e62,0x78d418f0, + 0x78d50a25,0x78d90680,0x78e80d6d,0x78ec1009,0x78f2103e,0x78f4038e,0x78f70bba,0x78fa078b, + 0x790108c9,0x7905044a,0x791308ac,0x791e0cfa,0x79240181,0x79340167,0x793a11b3,0x793b11af, + 0x793c0b2c,0x793e115a,0x79401245,0x79410f3e,0x794614e3,0x79480f46,0x79491953,0x7953052d, + 0x79561a4d,0x7957193b,0x795a1a66,0x795b1031,0x795c0745,0x795d19cd,0x795e116e,0x795f128d, + 0x796002d3,0x79620d08,0x7965151b,0x7967133f,0x79680ee5,0x796d0830,0x796f1904,0x79770376, + 0x797807d0,0x797a0f52,0x79800149,0x7981091a,0x79840c33,0x798501d8,0x798a14ca,0x798f053d, + 0x799a1a07,0x79a714c2,0x79b31077,0x79b917db,0x79ba17bc,0x79bb0b1a,0x79bd0fe5,0x79be06da, + 0x79c015a5,0x79c11230,0x79c3137d,0x79c60588,0x79c90145,0x79cb1016,0x79cd1988,0x79d10a1b, + 0x79d20d37,0x79d500d6,0x79d80d1c,0x79df1a43,0x79e30d76,0x79e40245,0x79e60fe3,0x79e7166f, + 0x79e9196a,0x79eb11ef,0x79ed1a26,0x79ef07e8,0x79f0022d,0x79f808e9,0x79fb16d6,0x79fd07b1, + 0x7a00149d,0x7a020ade,0x7a03051b,0x7a060c74,0x7a0b023c,0x7a0d1141,0x7a0e121d,0x7a14108c, + 0x7a170067,0x7a1a1978,0x7a1e0a21,0x7a20027f,0x7a23126d,0x7a331435,0x7a370836,0x7a391913, + 0x7a3b037d,0x7a3c085f,0x7a3d07f2,0x7a3f05ab,0x7a460d9e,0x7a5110fb,0x7a571293,0x7a701079, + 0x7a7415e9,0x7a760960,0x7a77100e,0x7a78148d,0x7a79100f,0x7a7a0a40,0x7a7f02a7,0x7a8019f4, + 0x7a81137e,0x7a830fd7,0x7a8418aa,0x7a86010c,0x7a88169b,0x7a8d0fce,0x7a911691,0x7a921970, + 0x7a951347,0x7a9608e1,0x7a9702b2,0x7a98095e,0x7a9c0300,0x7a9d1442,0x7a9f0a54,0x7aa00a22, + 0x7aa50a82,0x7aa6041e,0x7aa8173f,0x7aac17d1,0x7aad09a4,0x7ab317e1,0x7abf0c02,0x7acb0b3d, + 0x7ad61202,0x7ad918bf,0x7ade0950,0x7adf0952,0x7ae018c4,0x7ae309e1,0x7ae5136b,0x7ae61257, + 0x7aed08fe,0x7aef0436,0x7af919b4,0x7afa19b5,0x7afd17bd,0x7aff0583,0x7b03042a,0x7b0407e9, + 0x7b06004e,0x7b080804,0x7b0a18e3,0x7b0b129a,0x7b0f0746,0x7b111545,0x7b1400d8,0x7b15087d, + 0x7b191182,0x7b1b039d,0x7b1e024b,0x7b200b58,0x7b241342,0x7b251249,0x7b260538,0x7b2800c5, + 0x7b2a0331,0x7b2b1a28,0x7b2c03ae,0x7b2e187f,0x7b310603,0x7b330846,0x7b380f0b,0x7b3a086a, + 0x7b3c0bfe,0x7b3e0104,0x7b4514fc,0x7b471011,0x7b490388,0x7b4b0917,0x7b4c1057,0x7b4f04a0, + 0x7b500a71,0x7b5119d1,0x7b521373,0x7b54032c,0x7b5601ac,0x7b580a4e,0x7b5a00ed,0x7b5b1110, + 0x7b5d1924,0x7b6009d9,0x7b620e52,0x7b6e11ca,0x7b711540,0x7b721142,0x7b751646,0x7b770a6a, + 0x7b790280,0x7b7b059d,0x7b7e0f85,0x7b800886,0x7b8500f5,0x7b8d061a,0x7b901008,0x7b940163, + 0x7b9507f0,0x7b971283,0x7b9c0a43,0x7b9d0f91,0x7ba1064e,0x7ba213dd,0x7ba61881,0x7ba70fda, + 0x7ba813b6,0x7ba90c5c,0x7baa0350,0x7bab1537,0x7bac10d3,0x7bad08a2,0x7bb11515,0x7bb41909, + 0x7bb819d3,0x7bc10788,0x7bc619df,0x7bc70ed3,0x7bcc0714,0x7bd10a98,0x7bd30c11,0x7bd905a5, + 0x7bda04e0,0x7bdd05fd,0x7be10301,0x7be50b61,0x7be600f9,0x7bea0259,0x7bee0acc,0x7bf10b26, + 0x7bf70ea2,0x7bfc0415,0x7bfe0d45,0x7c0702f9,0x7c0b0670,0x7c0c127f,0x7c0f0c3b,0x7c16043e, + 0x7c1f03ce,0x7c260386,0x7c27078c,0x7c2a185b,0x7c380169,0x7c3f017e,0x7c4019a3,0x7c410ac0, + 0x7c4d080f,0x7c730d12,0x7c740398,0x7c7b0b0e,0x7c7c14e4,0x7c7d1a23,0x7c8904f5,0x7c91004f, + 0x7c920b59,0x7c950f0f,0x7c9702f1,0x7c9818b2,0x7c9c1349,0x7c9d0b5a,0x7c9e149e,0x7c9f1276, + 0x7ca21a19,0x7ca41830,0x7ca51994,0x7caa04fb,0x7cae0b82,0x7cb10b83,0x7cb20196,0x7cb3093d, + 0x7cb9030f,0x7cbc0bb4,0x7cbd1a39,0x7cbe093f,0x7cc110e4,0x7cc510ab,0x7cc70715,0x7cc815b9, + 0x7cca0728,0x7ccc185a,0x7ccd02dc,0x7cd505a6,0x7cd612f2,0x7cd7102a,0x7cd9019f,0x7cdc0d0d, + 0x7cdf186a,0x7ce00a06,0x7ce808b9,0x7cef0e38,0x7cf80d17,0x7cfb14c4,0x7d0a1434,0x7d201273, + 0x7d2212a9,0x7d27091d,0x7d2b1a2a,0x7d2f0b04,0x7d6e15c7,0x7d771949,0x7da60f55,0x7dae1006, + 0x7e3b0d0e,0x7e4104b0,0x7e471697,0x7e821a51,0x7e9b037e,0x7e9f122d,0x7ea0095f,0x7ea117ad, + 0x7ea20705,0x7ea31999,0x7ea414e1,0x7ea505b4,0x7ea61827,0x7ea707fe,0x7ea813ca,0x7ea90a77, + 0x7eaa081e,0x7eab1091,0x7eac140d,0x7ead1838,0x7eaf02c3,0x7eb00ea9,0x7eb11100,0x7eb20595, + 0x7eb30da4,0x7eb51a38,0x7eb60c52,0x7eb704ec,0x7eb81951,0x7eb9142d,0x7eba04ca,0x7ebd0e1d, + 0x7ebe11e0,0x7ebf1504,0x7ec00590,0x7ec1155a,0x7ec20528,0x7ec30b77,0x7ec41a4b,0x7ec51167, + 0x7ec614c6,0x7ec71938,0x7ec81980,0x7ec9199c,0x7eca007b,0x7ecb0529,0x7ecc029d,0x7ecd114c, + 0x7ece16fe,0x7ecf0934,0x7ed0033a,0x7ed10082,0x7ed2109d,0x7ed308f6,0x7ed40a58,0x7ed51083, + 0x7ed706bf,0x7ed807a9,0x7ed905d2,0x7eda15de,0x7edb08b6,0x7edc0c66,0x7edd09c0,0x7ede08d1, + 0x7edf1370,0x7ee005e0,0x7ee11531,0x7ee209b5,0x7ee315a7,0x7ee51288,0x7ee61300,0x7ee7082a, + 0x7ee8131d,0x7ee9081a,0x7eea15c2,0x7eeb0bd2,0x7eed15c3,0x7eee0f63,0x7eef04d1,0x7ef002ce, + 0x7ef1113c,0x7ef2067d,0x7ef31185,0x7ef41408,0x7ef50d24,0x7ef611db,0x7ef700c7,0x7ef8027c, + 0x7efa0bf0,0x7efb105f,0x7efc1a31,0x7efd18c0,0x7efe13d6,0x7eff0c80,0x7f0019ef,0x7f011a14, + 0x7f020a35,0x7f031513,0x7f04086e,0x7f050d2c,0x7f060ad1,0x7f071320,0x7f080d3a,0x7f0907ec, + 0x7f0b07b4,0x7f0c1235,0x7f0d0461,0x7f0e043a,0x7f0f0117,0x7f1105fc,0x7f1219f1,0x7f130769, + 0x7f1403b2,0x7f150c77,0x7f160105,0x7f170d4c,0x7f181815,0x7f19092e,0x7f1a0561,0x7f1b10c0, + 0x7f1c1912,0x7f1d050d,0x7f1f05a9,0x7f2001da,0x7f210b20,0x7f221710,0x7f230871,0x7f240135, + 0x7f250ee2,0x7f260ca7,0x7f270b00,0x7f281749,0x7f2912a6,0x7f2a0d3f,0x7f2b10ef,0x7f2c1555, + 0x7f2d0b97,0x7f2e112a,0x7f2f188b,0x7f3008ab,0x7f310f98,0x7f320fbc,0x7f330766,0x7f3408dc, + 0x7f351a50,0x7f360514,0x7f380597,0x7f3a1063,0x7f42174a,0x7f44100a,0x7f4514de,0x7f500655, + 0x7f5113e3,0x7f5413e6,0x7f5506ae,0x7f570c55,0x7f58052e,0x7f5a049e,0x7f5f0625,0x7f610599, + 0x7f62005a,0x7f681655,0x7f6918e6,0x7f6a1a55,0x7f6e1979,0x7f710ad4,0x7f7211f6,0x7f740ebe, + 0x7f790b27,0x7f7e188c,0x7f8107f6,0x7f8a1673,0x7f8c0fa3,0x7f8e0ce2,0x7f9405a0,0x7f9a0bd3, + 0x7f9d0391,0x7f9e159f,0x7f9f0fb3,0x7fa11509,0x7fa4106f,0x7fa712a4,0x7faf0900,0x7fb012e7, + 0x7fb214ad,0x7fb80b03,0x7fb905dd,0x7fbc01ea,0x7fbd17d8,0x7fbf1704,0x7fc11439,0x7fc50266, + 0x7fca170b,0x7fcc170c,0x7fce0bd4,0x7fd4151c,0x7fd5149f,0x7fd80fc7,0x7fdf03a0,0x7fe00310, + 0x7fe104df,0x7fe519d4,0x7fe6088a,0x7fe90ed4,0x7fee06eb,0x7ff006bb,0x7ff10035,0x7ff3171b, + 0x7ffb04a7,0x7ffc171c,0x800016a2,0x80010aed,0x80030a0f,0x80040cc8,0x800518f2,0x80060f47, + 0x800b03e4,0x800c048d,0x800d120c,0x80100db1,0x80120b06,0x80141a27,0x801505db,0x80160210, + 0x801706d2,0x8018183c,0x80190e50,0x801c124a,0x802007c2,0x80220af5,0x802512fa,0x80260e47, + 0x80270c0c,0x80280e26,0x802908b2,0x802a0e75,0x80310d81,0x80330491,0x803503f2,0x803616a7, + 0x80370325,0x80381256,0x803b025d,0x803d034c,0x803f05e1,0x80420e03,0x8043034e,0x80460bd5, + 0x804a0b91,0x804b0bff,0x804c1946,0x804d0e13,0x80520686,0x80540b6a,0x80580ef4,0x805a09a5, + 0x80690a99,0x806a02e8,0x80710036,0x807f17e6,0x808017e3,0x80831271,0x80841711,0x8086124c, + 0x808718e7,0x808910ae,0x808b0b0c,0x808c07df,0x80930779,0x8096153b,0x80981997,0x809a0431, + 0x809b0596,0x809c109b,0x809d057e,0x809f1446,0x80a001f3,0x80a10622,0x80a21939,0x80a40518, + 0x80a504d8,0x80a90866,0x80aa04c6,0x80ab19f3,0x80ad0da5,0x80ae002b,0x80af0a38,0x80b105ea, + 0x80b217ea,0x80b4168d,0x80b70f95,0x80ba04e5,0x80bc0944,0x80bd12ca,0x80be1177,0x80bf1987, + 0x80c018d4,0x80c1154d,0x80c21179,0x80c31420,0x80c4199e,0x80c60352,0x80cc00af,0x80cd0639, + 0x80ce12be,0x80d60e76,0x80d7190b,0x80d91a67,0x80da0e84,0x80db0856,0x80dc1188,0x80dd193c, + 0x80de008f,0x80e1072c,0x80e41742,0x80e515ae,0x80e70bfc,0x80e8040f,0x80e909e7,0x80ea0c1f, + 0x80eb094e,0x80ec0e2c,0x80ed162e,0x80ef0a60,0x80f016d4,0x80f1065a,0x80f2069a,0x80f305b7, + 0x80f40410,0x80f608c1,0x80f81598,0x80fa0028,0x80fc0ed6,0x80fd0dd6,0x8102193d,0x81060308, + 0x81090c98,0x810a0814,0x810d0a69,0x810e10d9,0x810f1867,0x81100f48,0x81110dcb,0x81120d15, + 0x81130e24,0x81140c45,0x81160155,0x811813d7,0x811a08d5,0x811e031e,0x812c0e78,0x812f054b, + 0x813113a2,0x81320dff,0x81360c57,0x81380b74,0x813e0ebd,0x8146133a,0x8148093b,0x814a0ab0, + 0x814b16b8,0x814c1635,0x8150054f,0x8151054d,0x815304da,0x81540fa8,0x815513df,0x81591a33, + 0x815a03fa,0x816002ef,0x81651581,0x81671206,0x81690dbb,0x816d0483,0x816e10dc,0x81701689, + 0x8171089d,0x817417ca,0x81790562,0x817a150b,0x817b0dea,0x817c0d2d,0x817d13c0,0x817e1315, + 0x817f1393,0x81800084,0x81820c78,0x818805c8,0x818a0164,0x818f05a4,0x8191013d,0x81980121, + 0x819b12f1,0x819c0d6b,0x819d14aa,0x81a3197b,0x81a60bc4,0x81a80ea3,0x81aa01d1,0x81b3112d, + 0x81ba174e,0x81bb111f,0x81c0139d,0x81c10b6f,0x81c200fd,0x81c31775,0x81c6171d,0x81ca10f0, + 0x81cc062b,0x81e3021f,0x81e71865,0x81ea1a2d,0x81ec0e04,0x81ed0286,0x81f3195a,0x81f4196b, + 0x81fb190a,0x81fc096e,0x81fe17b9,0x8200169c,0x820117be,0x8202026f,0x820414c8,0x82050976, + 0x820617d2,0x820c1154,0x820d1157,0x821011c2,0x821211ea,0x8214133b,0x821b02ad,0x821c1221, + 0x821e146d,0x821f1990,0x822102a9,0x8222111b,0x822316e5,0x82280075,0x822a06c0,0x822b04cb, + 0x822c006a,0x822d00d9,0x822f1983,0x82300897,0x8231019c,0x823319b8,0x82341880,0x82350465, + 0x8236015e,0x823714f2,0x823805cc,0x823902aa,0x823b0c21,0x823e14a0,0x82441143,0x82471360, + 0x82491418,0x824b0cff,0x824f11d4,0x82581263,0x825a01a4,0x825f0271,0x82680cfb,0x826e05d7, + 0x826f0b7e,0x82700867,0x827210f6,0x8273165f,0x82740539,0x8279003d,0x827a16ef,0x827d101a, + 0x827e0010,0x827f0dad,0x828208f0,0x828413cb,0x82880d40,0x828a0f7b,0x828b17e7,0x828d1146, + 0x828e1596,0x828f042e,0x82910f5f,0x82920cad,0x8297150e,0x82980eb4,0x82990524,0x829c145b, + 0x829d1934,0x829f1116,0x82a10f9b,0x82a40a48,0x82a50906,0x82a60c1a,0x82a807e0,0x82a90fe1, + 0x82aa0f42,0x82ab163e,0x82ac04ed,0x82ad004b,0x82ae10c8,0x82af156f,0x82b00822,0x82b1074a, + 0x82b304c0,0x82b41476,0x82b71952,0x82b81839,0x82b90fe2,0x82bd1619,0x82be04e9,0x82c102e3, + 0x82c40114,0x82c7140e,0x82c80b45,0x82ca0478,0x82cb1502,0x82cc01f4,0x82cd019b,0x82ce19c6, + 0x82cf126b,0x82d1181e,0x82d21075,0x82d30bca,0x82d412c2,0x82d51147,0x82d70d31,0x82d81002, + 0x82db0a18,0x82dc0d96,0x82de008e,0x82df0601,0x82e00d4a,0x82e116e4,0x82e30997,0x82e40eea, + 0x82e510d0,0x82e60a56,0x82eb1120,0x82ef00c2,0x82f11760,0x82f4097c,0x82f70581,0x82f90efc, + 0x82fb052a,0x830119ff,0x83020cc5,0x830304b8,0x83040fd2,0x83050cb9,0x83060cbf,0x83070051, + 0x830802d4,0x83090d74,0x830c0255,0x830e0935,0x830f0bf9,0x83110dfb,0x83141751,0x83151010, + 0x83170d5a,0x831a1741,0x831b05d8,0x831c0f9c,0x8327087b,0x832802d5,0x832b0caf,0x832c01b8, + 0x832d08bf,0x832f052f,0x833119aa,0x833308a7,0x8334079e,0x83351725,0x833601b9,0x8338109e, + 0x833910b0,0x833a026e,0x833c1367,0x83401601,0x83431052,0x83460936,0x83471591,0x834901a6, + 0x834f108b,0x83500893,0x835116d1,0x8352077a,0x83540b4f,0x835a084e,0x835b107e,0x835c00e3, + 0x835e0fc0,0x835f07aa,0x8360083b,0x8361036a,0x8363109f,0x836407b9,0x8365158a,0x83660c67, + 0x83671753,0x83680f8a,0x83690929,0x836a1297,0x836b1726,0x836c0c93,0x836d070a,0x836e199f, + 0x836f169e,0x837706e4,0x837800cf,0x837b039c,0x837c1382,0x837d1285,0x83850b56,0x83860f1b, + 0x83890b39,0x838e1103,0x8392098e,0x83930cd5,0x8398116d,0x839b1357,0x839c1791,0x839e13d3, + 0x83a0179d,0x83a80ae2,0x83a90533,0x83aa046f,0x83ab0d77,0x83b009ff,0x83b10ab8,0x83b20b69, + 0x83b311ac,0x83b41441,0x83b614e5,0x83b707cf,0x83b81792,0x83b91754,0x83ba1744,0x83bc02c5, + 0x83bd0cb2,0x83c013d8,0x83c10939,0x83c5086b,0x83c70614,0x83ca0988,0x83cc09d8,0x83cf06e7, + 0x83d4053a,0x83d601ef,0x83d81252,0x83dc018b,0x83dd0052,0x83df138b,0x83e00153,0x83e106b6, + 0x83e5149a,0x83e90f1c,0x83ea036c,0x83f00615,0x83f10bd6,0x83f204d2,0x83f81632,0x83f91a44, + 0x83fd11e8,0x84010f4d,0x8403030c,0x8404130b,0x840600ea,0x840b0f35,0x840c0cf4,0x840d0f00, + 0x840e1415,0x840f035e,0x84110763,0x84180db2,0x841c134c,0x841d0c58,0x84241755,0x84251756, + 0x84261757,0x84271533,0x842810da,0x843115d0,0x843817c4,0x843c0481,0x843d0c6a,0x84460099, + 0x84510507,0x845719cf,0x84591514,0x845a1176,0x845b05c2,0x845c0f73,0x84610f1d,0x84630405, + 0x84690e4d,0x846b0731,0x846c1868,0x846d0848,0x847102e5,0x847313f4,0x84750a88,0x8476135a, + 0x847814bf,0x847a0f6e,0x848203b3,0x848701e5,0x848809f2,0x84890a96,0x848b08b1,0x848c0c0a, + 0x848e0e5d,0x84970ae5,0x84990cf2,0x849c1282,0x84a10088,0x84af0a62,0x84b20f1e,0x84b4122a, + 0x84b81925,0x84b90872,0x84ba080b,0x84bd048a,0x84bf06c3,0x84c11907,0x84c415c9,0x84c910a3, + 0x84ca143b,0x84cd1196,0x84d010c1,0x84d112a5,0x84d300b8,0x84d600f0,0x84dd0ac7,0x84df0831, + 0x84e00b21,0x84e317fe,0x84e5175a,0x84e60d7a,0x84ec0e9f,0x84f014c1,0x84fc0b9b,0x84ff15ca, + 0x850c127d,0x85110d44,0x85130ca8,0x851718f9,0x851a1427,0x851f02f7,0x8521018c,0x852b0dec, + 0x852c11ee,0x85370faf,0x85380414,0x85390b76,0x853a0bc3,0x853b0a4f,0x853c000e,0x853d00f6, + 0x854304ae,0x8548160d,0x854908c8,0x854a10c7,0x8556103d,0x855907b6,0x855e1a56,0x856410c6, + 0x856809cb,0x85720f57,0x8574184b,0x8579143d,0x857a080e,0x857b070e,0x857e0b0a,0x85840166, + 0x858506c5,0x858713f7,0x858f171a,0x859b15e7,0x859c00fa,0x85a41566,0x85a80703,0x85aa1576, + 0x85ae1268,0x85af11f9,0x85b015f6,0x85b710b6,0x85b912c6,0x85c105ad,0x85c9090e,0x85cf019d, + 0x85d00d3b,0x85d314fe,0x85d50e48,0x85dc0b28,0x85e41318,0x85e904a8,0x85fb1870,0x85ff07d5, + 0x860506fe,0x86110d6e,0x86160e0c,0x86271040,0x862904b2,0x863818c2,0x863c0d11,0x864d0720, + 0x864e0739,0x864f0c25,0x86500e30,0x86510c7e,0x86540f8c,0x865a15b0,0x865e17cf,0x8662068c, + 0x866b0272,0x866c101e,0x866e0812,0x86711191,0x8679070b,0x867a07a0,0x867b0cf3,0x867c05cf, + 0x867d1284,0x867e14cc,0x867f01ce,0x868011a1,0x868116e6,0x86820c8a,0x868a142f,0x868b10ca, + 0x868c0081,0x868d0eb8,0x8693173c,0x86950191,0x869c161b,0x869d06c6,0x86a305ed,0x86a4186e, + 0x86a7090c,0x86a80534,0x86a90248,0x86aa041a,0x86ac14fb,0x86af1017,0x86b01794,0x86b118a5, + 0x86b417aa,0x86b50a16,0x86b606a1,0x86ba1070,0x86c019d0,0x86c40616,0x86c61032,0x86c71156, + 0x86c90bd7,0x86ca0627,0x86cb035f,0x86ce0b5b,0x86cf022f,0x86d01034,0x86d10d83,0x86d4079f, + 0x86d8167c,0x86d913bb,0x86db19b0,0x86de0aa7,0x86df08c4,0x86e405c3,0x86e91013,0x86ed1976, + 0x86ee0c9a,0x86f018ed,0x86f10852,0x86f20dc8,0x86f31236,0x86f40f53,0x86f8152a,0x86f91781, + 0x86fe0472,0x870011f8,0x87020509,0x8703117d,0x870718ea,0x8708145e,0x8709053e,0x870a0b3a, + 0x870d028f,0x87121647,0x8713135b,0x87151396,0x87171443,0x8718193e,0x871a04d4,0x871c0d21, + 0x871e0f56,0x87210ab2,0x87220d00,0x87230fa9,0x872514a7,0x87291344,0x872e1801,0x87310ebf, + 0x87341714,0x87371058,0x873b0ffa,0x873e0690,0x873f13c7,0x8747175c,0x87480688,0x874901db, + 0x874c0a26,0x874e154a,0x875317d3,0x87570789,0x87590107,0x87600541,0x87631798,0x87641028, + 0x87650cbd,0x876e0565,0x87700a8c,0x87740736,0x877603e8,0x877b0dbc,0x877c0c0d,0x877d02c2, + 0x877e10a6,0x87820ae0,0x87830e74,0x878514ae,0x8788181c,0x878b1264,0x878d10a7,0x87930fec, + 0x879712f3,0x879f0d60,0x87a80ca1,0x87ab11cd,0x87ac01a5,0x87ad024f,0x87af0037,0x87b312f4, + 0x87b50ede,0x87ba0c5f,0x87bd1986,0x87c01211,0x87c60c8e,0x87ca0cbe,0x87cb14af,0x87d118cc, + 0x87d20cb4,0x87d31529,0x87db0ea4,0x87e00e64,0x87e5077c,0x87ea07b7,0x87ee112f,0x87f9156a, + 0x87fe01de,0x88030c63,0x880a0b71,0x88130d02,0x881510b8,0x881607d6,0x881b0d46,0x88210b2b, + 0x882202c9,0x883209af,0x88390435,0x883c1043,0x884015f0,0x88440e3c,0x8845157c,0x884c1584, + 0x884d164e,0x885414f3,0x885708ed,0x8859161f,0x886106fd,0x88621047,0x886316bd,0x886416bb, + 0x88650173,0x88680127,0x886901c1,0x886b1118,0x886c0228,0x886e067c,0x8870120d,0x88720da7, + 0x88771984,0x887d1096,0x887e0fe0,0x887f0916,0x88811813,0x88820ce7,0x8884003b,0x88850dfc, + 0x88880847,0x888b0343,0x888d0e7e,0x889212df,0x889615a8,0x889c13bf,0x88a20e6c,0x88a40cc9, + 0x88ab00b3,0x88ad14b5,0x88b1053b,0x88b7084c,0x88bc05b8,0x88c10186,0x88c20baa,0x88c519e4, + 0x88c60363,0x88c90a3c,0x88ce023d,0x88d20f12,0x88d41712,0x88d517f9,0x88d81027,0x88d9106e, + 0x88df1106,0x88e20b6b,0x88e30b75,0x88e40a5a,0x88e50884,0x88e800f1,0x88f00459,0x88f10129, + 0x88f3113d,0x88f40e8a,0x88f80c61,0x88f90691,0x88fc132e,0x88fe0983,0x89020641,0x890a010f, + 0x891006ed,0x89120093,0x8913009a,0x891900b9,0x891a0299,0x891b0c79,0x89210328,0x892510c2, + 0x892a1397,0x892b025f,0x89300f88,0x89340aca,0x893618f5,0x89410fb4,0x89441516,0x895e0100, + 0x895f0918,0x896610b7,0x897b0e6d,0x897f1487,0x8981169f,0x89830fed,0x89860567,0x89c1088d, + 0x89c20647,0x89c40662,0x89c50d1b,0x89c611b8,0x89c701d2,0x89c80acf,0x89c909c1,0x89ca082b, + 0x89cb14b6,0x89cc039e,0x89ce17d0,0x89cf060c,0x89d00930,0x89d1104a,0x89d208cc,0x89d609c6, + 0x89da0617,0x89dc1a1b,0x89de1134,0x89e30903,0x89e505f0,0x89e6029f,0x89eb127e,0x89ef197c, + 0x89f30738,0x8a00163f,0x8a070701,0x8a3e1a21,0x8a480b5e,0x8a7918b3,0x8a8917ff,0x8a8a1316, + 0x8a9311cb,0x8b07088b,0x8b261005,0x8b660949,0x8b6c0ed0,0x8ba01639,0x8ba1081b,0x8ba203f7, + 0x8ba30553,0x8ba4108e,0x8ba507d7,0x8ba608f1,0x8ba7070f,0x8ba8130d,0x8ba9107d,0x8baa1123, + 0x8bab0f66,0x8bad1605,0x8bae16f0,0x8baf1606,0x8bb0081c,0x8bb208ae,0x8bb307a7,0x8bb40e40, + 0x8bb50995,0x8bb61624,0x8bb70dd0,0x8bb815b6,0x8bb9046b,0x8bba0c54,0x8bbc1258,0x8bbd050e, + 0x8bbe1159,0x8bbf04c9,0x8bc009bd,0x8bc1192b,0x8bc20620,0x8bc306d6,0x8bc40ef9,0x8bc51a49, + 0x8bc6119d,0x8bc818a0,0x8bc91270,0x8bca190d,0x8bcb03a1,0x8bcc1991,0x8bcd02d2,0x8bce102e, + 0x8bcf18e1,0x8bd116f8,0x8bd216cb,0x8bd30a6f,0x8bd40b07,0x8bd511b9,0x8bd6063f,0x8bd71192, + 0x8bd80810,0x8bd907a3,0x8bda0237,0x8bdb19a7,0x8bdc1168,0x8bdd0755,0x8bde0359,0x8bdf0605, + 0x8be01050,0x8be1066c,0x8be215fc,0x8be316ff,0x8be4192c,0x8be50570,0x8be61519,0x8be701c4, + 0x8be807bf,0x8be915b7,0x8beb090a,0x8bec1455,0x8bed17dc,0x8bee0fcc,0x8bef1478,0x8bf005af, + 0x8bf117a9,0x8bf207ab,0x8bf30a73,0x8bf41223,0x8bf5125a,0x8bf60488,0x8bf71004,0x8bf819ad, + 0x8bf91a3c,0x8bfa0e33,0x8bfb0423,0x8bfc1a03,0x8bfd04dc,0x8bfe0a32,0x8bff1414,0x8c0017c1, + 0x8c01121a,0x8c021173,0x8c0303d8,0x8c0401e2,0x8c050b8a,0x8c0619f5,0x8c07128e,0x8c0812d6, + 0x8c0a1709,0x8c0b0d87,0x8c0c0226,0x8c0d03e1,0x8c0e0790,0x8c0f0899,0x8c101551,0x8c1115f1, + 0x8c1216b7,0x8c131423,0x8c14047d,0x8c1517f4,0x8c1615cd,0x8c1701d6,0x8c181a15,0x8c19001d, + 0x8c1a1661,0x8c1b03af,0x8c1c0d0b,0x8c1d0ed8,0x8c1f0d66,0x8c200366,0x8c211277,0x8c221560, + 0x8c231692,0x8c240087,0x8c2511c7,0x8c260f83,0x8c270d1f,0x8c28091e,0x8c290c9f,0x8c2a18ee, + 0x8c2b0887,0x8c2c0d63,0x8c2d12da,0x8c2e1887,0x8c2f0fc2,0x8c300ac8,0x8c310f28,0x8c3209c9, + 0x8c331668,0x8c340f97,0x8c3518b4,0x8c36022c,0x8c370621,0x8c4107c4,0x8c46041b,0x8c4708a9, + 0x8c49025e,0x8c4c13c8,0x8c5511a7,0x8c5a139c,0x8c611526,0x8c620775,0x8c6a06c9,0x8c6b1802, + 0x8c730139,0x8c78195d,0x8c79009d,0x8c7a01cc,0x8c8203d2,0x8c8515a1,0x8c8906e9,0x8c8a0d7b, + 0x8c8c0ccd,0x8c940eca,0x8c980d80,0x8d1d00ab,0x8d1e18fc,0x8d1f0556,0x8d2105f7,0x8d220185, + 0x8d23187b,0x8d2414ee,0x8d250066,0x8d2618d5,0x8d2707ce,0x8d281963,0x8d2904b9,0x8d2a12cf, + 0x8d2b0eed,0x8d2c010a,0x8d2d0606,0x8d2e19c9,0x8d2f064f,0x8d300499,0x8d310894,0x8d3200bf, + 0x8d3311c0,0x8d34134b,0x8d350675,0x8d360a7b,0x8d370341,0x8d380cc7,0x8d3904e6,0x8d3a06ec, + 0x8d3b16d2,0x8d3c1885,0x8d3d196c,0x8d3e0857,0x8d3f07ae,0x8d401a11,0x8d410bc2,0x8d420c2e, + 0x8d431864,0x8d441a12,0x8d450573,0x8d46092d,0x8d471024,0x8d481919,0x8d490abb,0x8d4a1151, + 0x8d4b0560,0x8d4c042c,0x8d4d07ed,0x8d4e11f1,0x8d4f1139,0x8d5002e0,0x8d5305dc,0x8d540e88, + 0x8d550355,0x8d560abd,0x8d5819f2,0x8d590564,0x8d5a19dd,0x8d5b10df,0x8d5c1882,0x8d5d166b, + 0x8d5e1861,0x8d60188f,0x8d61112e,0x8d62175e,0x8d630592,0x8d640263,0x8d66115d,0x8d670dba, + 0x8d6b06ee,0x8d6d18f4,0x8d701a40,0x8d730962,0x8d74055c,0x8d7518e2,0x8d760589,0x8d770f62, + 0x8d81022a,0x8d840fd4,0x8d850208,0x8d8a1831,0x8d8b1035,0x8d911a1c,0x8d940bab,0x8d9f12fe, + 0x8da3104b,0x8db1185f,0x8db31a45,0x8db40e4b,0x8db5009e,0x8db8044d,0x8dba0519,0x8dbc0881, + 0x8dbe1957,0x8dbf12b0,0x8dc3182f,0x8dc40fa7,0x8dc612c4,0x8dcb0053,0x8dcc03dd,0x8dce13ac, + 0x8dcf0849,0x8dd10e80,0x8dd6194a,0x8dd7051c,0x8dda111c,0x8ddb0168,0x8ddd09a0,0x8dde0b5f, + 0x8ddf05d4,0x8de314fd,0x8de408c5,0x8de80a61,0x8dea0677,0x8deb100b,0x8dec0a90,0x8def0c35, + 0x8df3134a,0x8df5089e,0x8df70fb7,0x8df800f2,0x8df914e7,0x8dfa0467,0x8dfb07ef,0x8dfd0833, + 0x8e0515ec,0x8e090b85,0x8e0a1782,0x8e0c0282,0x8e0f12bc,0x8e1402ca,0x8e1d075b,0x8e1e09a7, + 0x8e1f0258,0x8e22131c,0x8e230165,0x8e29018a,0x8e2a1a34,0x8e2c197d,0x8e2e03be,0x8e2f194c, + 0x8e31045d,0x8e35198a,0x8e3901d0,0x8e3a08a3,0x8e3d0992,0x8e4003e9,0x8e410ed7,0x8e4210ac, + 0x8e441323,0x8e47088c,0x8e480377,0x8e490319,0x8e4a1483,0x8e4b12bd,0x8e510e0a,0x8e520e63, + 0x8e5902fa,0x8e6600cd,0x8e69012f,0x8e6c0387,0x8e6d01b1,0x8e6f04b1,0x8e700293,0x8e72044b, + 0x8e7402fb,0x8e7609cf,0x8e7c0f2b,0x8e7f02ff,0x8e811877,0x8e8519ba,0x8e870292,0x8e8f0bc5, + 0x8e900bac,0x8e9401df,0x8e9c1a4e,0x8e9e156b,0x8eab1165,0x8eac05ee,0x8eaf1033,0x8eb20462, + 0x8eba12fb,0x8ece1421,0x8f660211,0x8f671898,0x8f680669,0x8f6915cb,0x8f6b1093,0x8f6c19db, + 0x8f6d0479,0x8f6e0c53,0x8f6f10c5,0x8f7006ff,0x8f710612,0x8f720a1c,0x8f730c3e,0x8f741996, + 0x8f751956,0x8f761705,0x8f770724,0x8f78190f,0x8f790b50,0x8f7a168f,0x8f7b0ff5,0x8f7c11c3, + 0x8f7d1857,0x8f7e196d,0x8f7f08de,0x8f811054,0x8f820c2f,0x8f8308df,0x8f8418ec,0x8f85054c, + 0x8f860b8b,0x8f870df2,0x8f8800b6,0x8f890798,0x8f8a067e,0x8f8b13e8,0x8f8d02cf,0x8f8e1a1a, + 0x8f8f02f0,0x8f90053f,0x8f91080c,0x8f9311ed,0x8f940e90,0x8f95181a,0x8f9614d8,0x8f9718bc, + 0x8f980c38,0x8f9918f1,0x8f9a0bb7,0x8f9b1570,0x8f9c0618,0x8f9e02d8,0x8f9f0ec9,0x8fa30ab3, + 0x8fa80119,0x8fa9011a,0x8fab011b,0x8fb00222,0x8fb110bc,0x8fb602cd,0x8fb90102,0x8fbd0b8f, + 0x8fbe0329,0x8fc10f7c,0x8fc217ae,0x8fc40f68,0x8fc51608,0x8fc70692,0x8fc80c95,0x8fce1750, + 0x8fd01842,0x8fd10927,0x8fd31625,0x8fd404b4,0x8fd5146f,0x8fd80698,0x8fd918f6,0x8fdb0928, + 0x8fdc181d,0x8fdd1401,0x8fde0b65,0x8fdf0254,0x8fe21341,0x8fe416dd,0x8fe5095c,0x8fe60840, + 0x8fe8033b,0x8fe90492,0x8fea0399,0x8feb0f0c,0x8fed03de,0x8fee187c,0x8ff01200,0x8ff3094d, + 0x8ff70d09,0x8ff800cb,0x8ff90819,0x8ffd19ea,0x90001394,0x9001125b,0x900211c1,0x90031306, + 0x90040e72,0x9005071b,0x90060de6,0x900915da,0x900a160a,0x900b016d,0x900d1532,0x900f137b, + 0x901019b7,0x90111022,0x901203ad,0x90141383,0x9016132b,0x9017041c,0x901a1361,0x901b065d, + 0x901d11c4,0x901e0243,0x901f1274,0x90201874,0x9021106d,0x9022050c,0x90260b31,0x902d0773, + 0x902e0344,0x902f0c31,0x90350a84,0x903613f2,0x9038170d,0x903b0c59,0x903c00ce,0x903e17cb, + 0x90410455,0x9042128f,0x904402ab,0x904717fa,0x904d0118,0x904f0482,0x905014d5,0x90510784, + 0x90521026,0x9053037c,0x905716d7,0x9058060b,0x905b0bf2,0x906212ba,0x90630f96,0x90651695, + 0x90680034,0x906d1869,0x906e18e8,0x90740bb6,0x90751a59,0x907d09a8,0x907f00fb,0x9080168a, + 0x90821567,0x90831294,0x90880d3c,0x908b0aac,0x909116f9,0x9093038a,0x9095176e,0x909706a5, + 0x90990cab,0x909b100d,0x909d0a75,0x90a104be,0x90a21585,0x90a30da3,0x90a6007d,0x90aa154c, + 0x90ac1451,0x90ae178e,0x90af06a7,0x90b012c0,0x90b11015,0x90b30eaa,0x90b40144,0x90b5114b, + 0x90b600ad,0x90b803a2,0x90b91a3a,0x90ba16b1,0x90bb0baf,0x90be19a8,0x90c117eb,0x90c40fdc, + 0x90c51964,0x90c70760,0x90ca08bb,0x90ce0ad9,0x90cf084d,0x90d00a66,0x90d1192d,0x90d31843, + 0x90d7148e,0x90db0530,0x90dc05b0,0x90dd06ce,0x90e109dc,0x90e21761,0x90e60b51,0x90e7183b, + 0x90e8017b,0x90eb0eb9,0x90ed0684,0x90ef12d7,0x90f4021b,0x90f8034d,0x90fd0412,0x90fe1653, + 0x9102047e,0x910409b8,0x911900da,0x911e1733,0x91221636,0x912318c5,0x912f1129,0x91310f07, + 0x91391a3e,0x91430bdb,0x9146050a,0x9149179c,0x914a03f3,0x914b1021,0x914c1a04,0x914d0e8f, + 0x914e19a1,0x914f16de,0x91500585,0x9152096c,0x915715c4,0x915a04ef,0x915d1846,0x915e12cd, + 0x916113ad,0x916202f6,0x916306a2,0x91640619,0x9165126c,0x91690d61,0x916a0af6,0x916c0281, + 0x916e136c,0x916f1959,0x917014e8,0x917108b7,0x9172023f,0x91741385,0x917508e2,0x91760cdd, + 0x91770a5b,0x91781281,0x91790b0f,0x917d1667,0x917e1197,0x917f0df9,0x91850e85,0x918702c8, + 0x91891a57,0x918b02f8,0x918c0a9f,0x918d1324,0x91900737,0x919115ba,0x9192158b,0x919a0d0c, + 0x919b1059,0x91a2069b,0x91a312f5,0x91aa0aec,0x91ad0170,0x91ae08e4,0x91af14b0,0x91b40b36, + 0x91b509a9,0x91ba15f8,0x91c70187,0x91c917ab,0x91ca11c8,0x91cc0b2e,0x91cd198d,0x91ce16ac, + 0x91cf0b86,0x91d10913,0x91dc054a,0x9274089f,0x928e100c,0x92ae0c47,0x92c81482,0x933e1862, + 0x936a0d88,0x938f0bee,0x93ca0044,0x93d60039,0x943e00bb,0x946b1578,0x94850912,0x9486056b, + 0x948716e2,0x948818fd,0x948903f1,0x948a18da,0x948b0f02,0x948c0b9a,0x948d1388,0x948e0f7f, + 0x948f02b0,0x94901119,0x949204ab,0x949303d7,0x94940ced,0x94950e3a,0x949701c8,0x94990576, + 0x949a017a,0x949b12cb,0x949c099a,0x949d0453,0x949e0207,0x949f1982,0x94a00da8,0x94a100b0, + 0x94a20598,0x94a30074,0x94a40f8b,0x94a516a3,0x94a60fdf,0x94a709d6,0x94a81456,0x94a905fb, + 0x94aa0a0d,0x94ab04c2,0x94ac07ca,0x94ad0418,0x94ae0e1e,0x94af0056,0x94b017f0,0x94b10f8d, + 0x94b21921,0x94b30f8e,0x94b40626,0x94b50151,0x94b60a1e,0x94b70f0a,0x94b8016e,0x94b9015c, + 0x94ba182d,0x94bb1a4f,0x94bc0d97,0x94bd12e0,0x94be0858,0x94bf03c7,0x94c01793,0x94c1134d, + 0x94c2015d,0x94c30bcf,0x94c41227,0x94c50f82,0x94c60cc4,0x94c811c5,0x94c915e0,0x94ca12b1, + 0x94cb00e7,0x94cc0ddd,0x94cd0eb2,0x94ce045c,0x94d00a13,0x94d10af1,0x94d20496,0x94d5179e, + 0x94d6023b,0x94d70851,0x94d816a9,0x94d90dc6,0x94db0361,0x94dc136a,0x94dd0c75,0x94de03da, + 0x94df172a,0x94e009f0,0x94e1189a,0x94e219af,0x94e314bd,0x94e4135f,0x94e503fe,0x94e70750, + 0x94e81056,0x94e91104,0x94ea0693,0x94eb03db,0x94ec05d1,0x94ed0d5c,0x94ee1923,0x94ef10f9, + 0x94f008d6,0x94f116c1,0x94f201e3,0x94f30275,0x94f412fc,0x94f50022,0x94f61732,0x94f710b1, + 0x94f819d2,0x94f90aeb,0x94fa0f18,0x94fc0ab9,0x94fd1312,0x94fe0b7b,0x94ff0a3f,0x95001535, + 0x950112ab,0x95020b33,0x9503188d,0x9504028e,0x95050687,0x950605b1,0x95070470,0x950815a9, + 0x95090322,0x950a0c4c,0x950b0508,0x950c1573,0x950d0bf1,0x950e09eb,0x950f0885,0x951010cb, + 0x9511131b,0x95120adf,0x95130fee,0x95140982,0x95150002,0x95160faa,0x951718f3,0x95180e36, + 0x95190323,0x951a0cbb,0x951b00c0,0x951d0380,0x951e0a37,0x951f0a9d,0x952114a3,0x95220635, + 0x95230c5b,0x952402bf,0x952519ed,0x9526091f,0x952814e9,0x952909b0,0x952a07cc,0x952b0e89, + 0x952c12d9,0x952d03fc,0x952e08a0,0x952f09a3,0x95300cfe,0x95311a1d,0x95320fdb,0x953409f4, + 0x95350fab,0x95361238,0x95370484,0x953801b6,0x95390fba,0x953a1985,0x953b043d,0x953c1262, + 0x953e0764,0x953f0008,0x95400434,0x95410ce4,0x95420c15,0x954404e8,0x95450cde,0x95460d7e, + 0x9547191a,0x954905c9,0x954a0e07,0x954c09ae,0x954d0e08,0x954e0da1,0x954f0bed,0x955005ac, + 0x9551008a,0x95521717,0x9553084b,0x95540137,0x95560123,0x955712e8,0x95580caa,0x95590c5e, + 0x955b1774,0x955c0959,0x955d0396,0x955e1a48,0x955f15e4,0x95611579,0x956209ce,0x95630b9d, + 0x95640f21,0x95650c29,0x95660446,0x95670acd,0x95680f2a,0x956902fe,0x956a0fb1,0x956b038f, + 0x956c07d3,0x956d0b02,0x956f1a0a,0x95700b70,0x9571171f,0x957201c0,0x95730126,0x95761518, + 0x957f01f2,0x95e80ceb,0x95e91212,0x95ea1121,0x95eb163b,0x95ed00de,0x95ee1436,0x95ef02b5, + 0x95f010ce,0x95f11402,0x95f214ec,0x95f30707,0x95f40865,0x95f50d4f,0x95f60a0b,0x95f70cef, + 0x95f81899,0x95f90dcd,0x95fa0664,0x95fb142e,0x95fc12b9,0x95fd0d52,0x95fe0c6f,0x9600049f, + 0x960105be,0x960206e1,0x96030aa3,0x96040963,0x9605182e,0x96060ae3,0x960817f5,0x96091633, + 0x960a01f0,0x960b14c7,0x960c1430,0x960d07bb,0x960e1645,0x960f047f,0x961001e4,0x96110ac6, + 0x96121049,0x96140aa8,0x96151069,0x961606ea,0x96171337,0x9619106a,0x961a0a02,0x961c0559, + 0x961d0551,0x961f0440,0x96210f79,0x96221474,0x962a0070,0x962e10c3,0x96310942,0x963204c3, + 0x96331674,0x96341722,0x96351915,0x963608e5,0x963b1a4a,0x963c1a63,0x963d03c2,0x963f0000, + 0x964013a6,0x964200a3,0x96440557,0x96450823,0x96460c2c,0x96470c03,0x96480223,0x96491587, + 0x964b0c12,0x964c0d75,0x964d08b4,0x96501505,0x96540571,0x96551122,0x965b00e4,0x965f1967, + 0x96610419,0x96621820,0x9664028b,0x96670e01,0x9668183f,0x966914f9,0x966a0e86,0x966c1a3d, + 0x967202bb,0x96740eb1,0x96750bd0,0x96761308,0x96771507,0x968517c5,0x96860c00,0x968813f3, + 0x968b1289,0x968d077f,0x968f128a,0x9690173d,0x969405c4,0x96970a8e,0x96980013,0x969914c9, + 0x969c18d6,0x96a71291,0x96b014b8,0x96b3079b,0x96b60b4a,0x96b919e9,0x96bc129b,0x96bd09b6, + 0x96be0db7,0x96c01067,0x96c11665,0x96c41599,0x96c51622,0x96c60809,0x96c70633,0x96c9197a, + 0x96cc02da,0x96cd1770,0x96ce0984,0x96cf0290,0x96d20c6d,0x96d503d4,0x96e00283,0x96e817d9, + 0x96e917c6,0x96ea15ee,0x96ef1431,0x96f30b60,0x96f60bd8,0x96f70afe,0x96f90092,0x96fe147f, + 0x970015b2,0x97010834,0x97041538,0x9706135c,0x9707191b,0x97080e91,0x97090ce0,0x970d07d2, + 0x970e110e,0x970f04d5,0x97130ddf,0x97160bb8,0x971c1217,0x971e14d9,0x972a1736,0x972d000f, + 0x9730150c,0x97320c2b,0x9738005c,0x97390eb0,0x973e0c91,0x97520ff3,0x97530954,0x97560955, + 0x97590958,0x975b03cc,0x975e04cf,0x97600a15,0x97610d10,0x97620d2f,0x976516b9,0x976905bf, + 0x9773092f,0x977415e6,0x97760057,0x977c032e,0x97851671,0x978b1556,0x978d001f,0x9791032f, + 0x97920fc4,0x97940c9d,0x97980fd0,0x97a00985,0x97a310ad,0x97ab0986,0x97ad0109,0x97af0875, + 0x97b205fe,0x97b400ba,0x97e613fc,0x97e71094,0x97e906ad,0x97ea1419,0x97eb1848,0x97ec1303, + 0x97ed096b,0x97f31727,0x97f51849,0x97f61148,0x987516b0,0x987603f5,0x98771003,0x987806a0, + 0x98791525,0x987a1220,0x987b15af,0x987c15bb,0x987d13ce,0x987e062f,0x987f0454,0x98800f49, + 0x9881006b,0x9882125c,0x988306c1,0x988417f1,0x98850c22,0x98860bdf,0x98870f05,0x98880945, + 0x988908fa,0x988a0853,0x988c06e8,0x988d1762,0x988f0a20,0x989016d8,0x98910eef,0x98931392, + 0x989406b7,0x98961763,0x98970a23,0x98981322,0x989a0474,0x989b19da,0x989c1648,0x989d0473, + 0x989e0e09,0x989f0c99,0x98a003b8,0x98a110ec,0x98a206d4,0x98a401e9,0x98a510b9,0x98a60ef0, + 0x98a7105b,0x98ce04ff,0x98d1011e,0x98d210d8,0x98d309a2,0x98d51261,0x98d80edd,0x98d90124, + 0x98da0125,0x98de04cd,0x98df11a2,0x98e71298,0x98e81520,0x990d1669,0x9910018f,0x992e134f, + 0x99541777,0x99551304,0x9963119a,0x996507da,0x99671582,0x9968139b,0x996914c5,0x996a1095, + 0x996b17e9,0x996c0264,0x996d04b7,0x996e173b,0x996f0890,0x997011ba,0x99710095,0x99721247, + 0x997416ce,0x99750494,0x9976107f,0x9977151f,0x997a08d2,0x997c0148,0x997d0152,0x997f047c, + 0x998017c2,0x99810dd2,0x998407bd,0x99851508,0x9986064d,0x998701b5,0x99880a97,0x998a1260, + 0x998b01d9,0x998d0d68,0x998f0bf3,0x999015a2,0x99910921,0x99920c9b,0x999310e5,0x999419e0, + 0x99950dbf,0x999611d3,0x99970a85,0x9998068d,0x99991510,0x99a50568,0x99a81577,0x9a6c0c86, + 0x9a6d17e5,0x9a6e13a4,0x9a6f1604,0x9a700253,0x9a71102f,0x9a730157,0x9a740c6e,0x9a751866, + 0x9a7611aa,0x9a771248,0x9a78055a,0x9a79097d,0x9a7a1a3b,0x9a7b19ca,0x9a7c13a9,0x9a7d0e29, + 0x9a7e085c,0x9a7f1700,0x9a800347,0x9a81152e,0x9a820c8c,0x9a8408c0,0x9a85074f,0x9a860c68, + 0x9a87069d,0x9a880ed5,0x9a8a0b1b,0x9a8b0244,0x9a8c1660,0x9a8f09e0,0x9a900f4e,0x9a910f3a, + 0x9a920a34,0x9a9319eb,0x9a96018e,0x9a970eda,0x9a981977,0x9a9a10ee,0x9a9b147e,0x9a9c003a, + 0x9a9d0bea,0x9a9e0f86,0x9a9f1128,0x9aa00120,0x9aa10c5d,0x9aa202e6,0x9aa301e7,0x9aa419a2, + 0x9aa5083a,0x9aa71517,0x9aa80624,0x9ab0137a,0x9ab1090d,0x9ab603a8,0x9ab70a55,0x9ab80697, + 0x9aba0716,0x9abc05ca,0x9ac000fe,0x9ac10a27,0x9ac20f76,0x9ac50c0e,0x9acb0a6c,0x9acc013e, + 0x9ad10421,0x9ad3128b,0x9ad805a1,0x9adf011f,0x9ae10a9e,0x9ae60cbc,0x9aeb1345,0x9aed1a1f, + 0x9aef1072,0x9af915a3,0x9afb0839,0x9b031a35,0x9b08105a,0x9b0f0966,0x9b13013f,0x9b1f0767, + 0x9b230bad,0x9b2f0203,0x9b3205c1,0x9b3b1805,0x9b3c066e,0x9b410a8a,0x9b4207be,0x9b430054, + 0x9b440f10,0x9b450cea,0x9b471657,0x9b481539,0x9b490b88,0x9b4d13e9,0x9b4f1429,0x9b510250, + 0x9b540d6f,0x9c7c17ba,0x9c7f1796,0x9c810c27,0x9c8204c7,0x9c85005b,0x9c860f01,0x9c870dee, + 0x9c880c23,0x9c8b0563,0x9c8d009f,0x9c8e071e,0x9c9012c5,0x9c910667,0x9c9208ff,0x9c94141a, + 0x9c95048f,0x9c9a0835,0x9c9b08c7,0x9c9c14ea,0x9c9e1522,0x9c9f1603,0x9ca005e3,0x9ca10b24, + 0x9ca20b6d,0x9ca30873,0x9ca40b34,0x9ca511a4,0x9ca61346,0x9ca70681,0x9ca81107,0x9ca90777, + 0x9cab0837,0x9cad0ffb,0x9cae0bda,0x9cb01a3f,0x9cb104d6,0x9cb20aa0,0x9cb301f1,0x9cb40636, + 0x9cb50de0,0x9cb60def,0x9cb703d5,0x9cb80940,0x9cba1198,0x9cbb1a20,0x9cbc04fc,0x9cbd03ea, + 0x9cc310de,0x9cc40487,0x9cc51019,0x9cc60566,0x9cc7078d,0x9cca0108,0x9ccb10f1,0x9ccc0038, + 0x9ccd0f58,0x9cce12b6,0x9ccf064b,0x9cd01698,0x9cd30afc,0x9cd4012a,0x9cd515ef,0x9cd6012c, + 0x9cd70c9e,0x9cd80d56,0x9cd91776,0x9cdc0678,0x9cdd1130,0x9cde0bbb,0x9cdf1a5b,0x9ce20b37, + 0x9e1f0dfa,0x9e200961,0x9e2107e2,0x9e221806,0x9e230d59,0x9e250e44,0x9e261613,0x9e280097, + 0x9e291916,0x9e2a0613,0x9e2b0404,0x9e2c0c20,0x9e2d1615,0x9e2f1670,0x9e310249,0x9e32103b, + 0x9e331809,0x9e3513ab,0x9e361233,0x9e371971,0x9e38048e,0x9e39063a,0x9e3a15a0,0x9e3d05b9, + 0x9e3e0c44,0x9e3f070c,0x9e410161,0x9e420b1e,0x9e4309ad,0x9e440628,0x9e450471,0x9e4617fb, + 0x9e4714f5,0x9e481321,0x9e49146c,0x9e4a106b,0x9e4b0d34,0x9e4c001e,0x9e4e00a8,0x9e4f0ea0, + 0x9e5102c7,0x9e550734,0x9e570485,0x9e58061d,0x9e5a02db,0x9e5b0cdf,0x9e5c1481,0x9e5e16a0, + 0x9e630874,0x9e6406ef,0x9e66174d,0x9e6718fa,0x9e680bf5,0x9e690b99,0x9e6a08ca,0x9e6b0978, + 0x9e6c1804,0x9e6d0c3c,0x9e70174f,0x9e710749,0x9e730654,0x9e7e031d,0x9e7f0c32,0x9e820818, + 0x9e8709da,0x9e8819c1,0x9e8b0d0f,0x9e920f59,0x9e930c3d,0x9e9d1161,0x9e9f0bbc,0x9ea60c96, + 0x9eb41036,0x9eb8051a,0x9ebb0c84,0x9ebd0cd0,0x9ebe0799,0x9ec40780,0x9ec9070d,0x9ecd11f5, + 0x9ece0b25,0x9ecf0df0,0x9ed106f1,0x9ed40f93,0x9ed80d7f,0x9edb0346,0x9edc02a1,0x9edd17a0, + 0x9edf16c6,0x9ee014da,0x9ee21037,0x9ee51001,0x9ee70b29,0x9ee90428,0x9eea0194,0x9eef002a, + 0x9ef91958,0x9efb0542,0x9efc0550,0x9efe0d4d,0x9f0b1816,0x9f0d13af,0x9f0e03f6,0x9f100db3, + 0x9f130629,0x9f17130c,0x9f190ec0,0x9f2011f7,0x9f2204f4,0x9f2c17ac,0x9f2f145f,0x9f3714b2, + 0x9f391658,0x9f3b00d0,0x9f3d1029,0x9f3e06a4,0x9f441895,0x9f500f3f,0x9f5107f3,0x9f7f025c, + 0x9f800229,0x9f830991,0x9f840bd9,0x9f850091,0x9f861343,0x9f871a1e,0x9f881735,0x9f8917e2, + 0x9f8a02d0,0x9f8b1046,0x9f8c144d,0x9f990bf6,0x9f9a05ef,0x9f9b09f8,0x9f9f0661,0x9fa01833, + 0xff011a6b,0xff021a6c,0xff031a6d,0xff041a6e,0xff051a6f,0xff061a70,0xff071a71,0xff081a72, + 0xff091a73,0xff0a1a74,0xff0b1a75,0xff0c1a76,0xff0d1a77,0xff0e1a78,0xff0f1a79,0xff101a7a, + 0xff111a7b,0xff121a7c,0xff131a7d,0xff141a7e,0xff151a7f,0xff161a80,0xff171a81,0xff181a82, + 0xff191a83,0xff1a1a84,0xff1b1a85,0xff1c1a86,0xff1d1a87,0xff1e1a88,0xff1f1a89,0xff201a8a, + 0xff211a8b,0xff221a8c,0xff231a8d,0xff241a8e,0xff251a8f,0xff261a90,0xff271a91,0xff281a92, + 0xff291a93,0xff2a1a94,0xff2b1a95,0xff2c1a96,0xff2d1a97,0xff2e1a98,0xff2f1a99,0xff301a9a, + 0xff311a9b,0xff321a9c,0xff331a9d,0xff341a9e,0xff351a9f,0xff361aa0,0xff371aa1,0xff381aa2, + 0xff391aa3,0xff3a1aa4,0xff3b1aa5,0xff3d1aa6,0xff3e1aa7,0xff3f1aa8,0xff401aa9,0xff411aaa, + 0xff421aab,0xff431aac,0xff441aad,0xff451aae,0xff461aaf,0xff471ab0,0xff481ab1,0xff491ab2, + 0xff4a1ab3,0xff4b1ab4,0xff4c1ab5,0xff4d1ab6,0xff4e1ab7,0xff4f1ab8,0xff501ab9,0xff511aba, + 0xff521abb,0xff531abc,0xff541abd,0xff551abe,0xff561abf,0xff571ac0,0xff581ac1,0xff591ac2, + 0xff5a1ac3,0xff5b1ac4,0xff5c1ac5,0xff5d1ac6,0xff5e1ac7, + }; + +static const TCollationKeyTable TheChineseTable = + { TheChineseKey, TheChineseIndex, 6861, NULL, NULL, 0 }; + +static const TCollationMethod TheChineseMethod = + { 0, NULL, &TheChineseTable, 0 }; + +void test_unicode_collations() + { + /* + Note: the curious method of getting values greater than 255 into the strings is needed + because GCC doesn't handle the \x notation properly: it zeroes the high byte, so + L"\x2011" puts the value 0x0011, not 0x2011, into the string. + */ + TBuf<32> x, y; + + test.Next(_L("collation")); + test_unicode_collation(_L("Graham"),_L("Graham"),0); // equality + test_unicode_collation(_L("something"),_L(""),1); // something after nothing + test_unicode_collation(_L("inform"),_L("information"),-1); // prefixes come first + test_unicode_collation(_L("\x30CB\x30e5\x30fc"),_L("\x30CB\x30e5\x30fc\x30e0"),-1); // Katakana + test_unicode_collation(_L("\x3042\x308a"),_L("\x3042\x308a\x304c\x3068"),-1); // Hiragana + test_unicode_collation(_L("unicode"),_L("consortium"),1); // standard alphabetic ordering: lowercase + test_unicode_collation(_L("AARON"),_L("AARDVARK"),1); // standard alphabetic ordering: uppercase + test_unicode_collation(_L("AARON"),_L("AARDVARK"),1,0); // alphabetic ordering is significant at level 0 + test_unicode_collation(_L("hello"),_L("Hello"),1,3,&TheSwapCaseMethod); // lowercase before uppercase + test_unicode_collation(_L("hello"),_L("Hello"),-1,2); // case is significant at level 2 + //test_unicode_collation(_L("hello"),_L("Hello"),0,1); // ignore case at level 1 + test_unicode_collation(_L("hello"),_L("Hello"),0,1); + test_unicode_collation(_L("hello"),_L("[H E L L O !]"),0,1);// ignore punctuation and case at level 1 + test_unicode_collation(_L("1234"),_L("abc"),-1); // digits before letters + x = _L("week day"); x[4] = 0x2011; // (week-day with non-breaking hyphen) + test_unicode_collation(x,_L("weekend"),-1); // ignore punctuation if letters differ; d < e + test_unicode_collation(x,_L("week-day"),1); // compare punctuation if otherwise equal + test_unicode_collation(x,_L("week-day"),0,2); // ignore difference between hyphens at level 2 + test_unicode_collation(x,_L("Week-day"),-1); // case difference outweighs punctuation ordering + y = _L("a ngstro m"); y[1] = 0x30a; y[8] = 0x308; // (angstrom with piece accents) + test_unicode_collation(_L("\xe5ngstr\xf6m"),y,0); // base+accent = precomposed (angstrom) + test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1); // unaccented before accented... + test_unicode_collation(_L("Liege"),_L("Li\xe8ge"),-1,1); // accents are significant at level 1 + test_unicode_collation(_L("Liege"),_L("li\xe8ge"),-1); // accentuation outweighs case + test_unicode_collation(_L("Liege"),_L("li\xe8ge"),0,0); // ignore accents and case at level 0 + test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),-1); // a-ring before z by default + // test_unicode_collation(_L("\xe5ngstr\xf6m"),_L("zoo"),1,3,&TheSwedishMethod); // a-ring after z in Sweden + test_unicode_collation(_L("Antidisestablishmentarian"),_L("antidisestablishmentariac"),1); // long strings that don't have identical prefixes + + test_unicode_collation(_L("\xFF86"),_L(""),1); + test_unicode_collation(_L("\x30B9"),_L(""),1); + // Equality + test_unicode_collation(_L("\xFF71"),_L("\xFF71"),0,3,&TheKanaMethod); // Same Halfwidth Katakana characters + test_unicode_collation(_L("\x30A2"),_L("\x30A2"),0,3,&TheKanaMethod); // Same Katakana characters + test_unicode_collation(_L("\xFF71\xFF67"),_L("\xFF71\xFF67"),0,3,&TheKanaMethod); // Same katakana Characters with small letter + test_unicode_collation(_L("\x30b9\x30af\x30ea\x30fc\x30e0"),_L("\x30b9\x30af\x30ea\x30fc\x30e0"),0,3,&TheKanaMethod); // Scream in Katakana + test_unicode_collation(_L("\x3042"),_L("\x3042"),0,3,&TheKanaMethod); // same Hiragana characters + test_unicode_collation(_L("\x3042\x308A"),_L("\x3042\x308A"),0,3,&TheKanaMethod); + test_unicode_collation(_L("\x304C"),_L("\x304B\x3099"),0,3,&TheKanaMethod); + test_unicode_collation(_L("\x3072\x3063\x304f"),_L("\x3072\x3063\x304f"),0,3,&TheKanaMethod); // Hiragana word Hyaku + // 1/2 width Katakana is sorted before Katakana + test_unicode_collation(_L("\xFF71"),_L("\x30A2"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30A2"),_L("\xFF71"), 1,3,&TheKanaMethod); + test_unicode_collation(_L("\xFF86\xFF6D\xFF70\xFF7D"),_L("\x30CB\x30E5\x30FC\x30B9"),-1,3,&TheKanaMethod); // News Katakan 1/2 width & full width..this shoule be -1 + // 1/2 width katakana sorted before half width with small character; + test_unicode_collation(_L("\xFF71"),_L("\xFF71\xFF67"),-1,3,&TheKanaMethod); // same katakana characcter, one with a small character + test_unicode_collation(_L("\xFF77"),_L("\xFF71\xFF6C"),1,3,&TheKanaMethod); // different Katakana character, one with small character + // Hiragana before Katakana & 1/2 width Katakana + test_unicode_collation(_L("\x3042"),_L("\x30a2"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3042"),_L("\x30a2"),1,3,&TheSwapKanaMethod); + test_unicode_collation(_L("\x3042"),_L("\x30cb"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x308a"),_L("\x30a2\x30ea\x30e0"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3042\x308a"),_L("\x30a2\x30ea"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3042\x308a\x304c\x3068"),_L("\xFF71\xFF86\xFF6D\xFF70\xff7D"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3042"),_L("\xFF71"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3042\x308a"),_L("\x30a2\x30ea\x30e0\x30b9"),-1,3,&TheKanaMethod); + + // Test Katakana Nigori and Maru Sort sequence + test_unicode_collation(_L("\xff8a"),_L("\xff8A\xff9e"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\xff8a"),_L("\xff8a\xff9f"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\xff8a\xff9e"),_L("\xff8a\xff9f"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30cf"),_L("\x30d0"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30cf"),_L("\x30d1"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30d1"),_L("\x30d0"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x306f"),_L("\x3070"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x306f"),_L("\x3071"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3070"),_L("\x3071"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\xff8a"),_L("\x30cf"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3071"),_L("\x3068"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x306f"),_L("\x30d1"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x306f"),_L("\xff8a"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3070"),_L("\xff8a\xff9e"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3071"),_L("\xff8a\xff9f"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3042\x304e\x3089"),_L("\x3044"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3070"),_L("\x30cf"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30cf"),_L("\x3070"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3070"),_L("\xff8a"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x3071"),_L("\xff8a"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30d1"),_L("\x3071"),1,3,&TheKanaMethod); + + test_unicode_collation(_L("\x30ac"),_L("\x30ab"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30a2\x30ac"),_L("\x30a2\x30ab"),1,3,&TheKanaMethod); // ka comes before Ga + test_unicode_collation(_L("\x306b\x3058\x3085"),_L("\x306b\x3057\x308c"),-1,3,&TheKanaMethod); + + // Triplet support test + test_unicode_collation(_L("\x30ac\x30fc"),_L("\x30ae\x30fc"),-1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30ab\x30fc"),_L("\x30ab\x30fc"),0,3,&TheKanaMethod); + test_unicode_collation(_L("\x30ab\x30a4"),_L("\x30ab\x30fc"),1,3,&TheKanaMethod); + test_unicode_collation(_L("\x30ab\x30a4"),_L("\x30ac"),1,3,&TheKanaMethod); + + //Simplified Chinese test starts. Note that the Chinese collation table only includes the ideological characters. + //The characters which are in the base table should come to the front while the characters which are not either + //in base table or client table should come after + test.Next(_L("Simplified Chinese test starts")); + test_unicode_collation(_L("\x554a"),_L("\x4f4f"),-1,3,&TheChineseMethod);//different sound + test_unicode_collation(_L("\x54ed"),_L("\x5757"),-1,3,&TheChineseMethod);//different sound + test_unicode_collation(_L("\x8d30"),_L("\x82ac"),-1,3,&TheChineseMethod);//different sound + test_unicode_collation(_L("\x62bd"),_L("\x6577"),-1,3,&TheChineseMethod);//different sound + test_unicode_collation(_L("\x75c5"),_L("\x7e94"),-1,3,&TheChineseMethod);//different sound +//same sound + test_unicode_collation(_L("\x78e8"),_L("\x672b"),-1,3,&TheChineseMethod);//different tones + test_unicode_collation(_L("\x5e9c"),_L("\x7236"),-1,3,&TheChineseMethod);//different tones + test_unicode_collation(_L("\x7840"),_L("\x5904"),-1,3,&TheChineseMethod);//different tones + test_unicode_collation(_L("\x5976"),_L("\x8010"),-1,3,&TheChineseMethod);//different tones + test_unicode_collation(_L("\x7720"),_L("\x9762"),-1,3,&TheChineseMethod);//different tones +//same sound and stroke count + test_unicode_collation(_L("\x5757"),_L("\x5feb"),-1,3,&TheChineseMethod);//different first stroke + test_unicode_collation(_L("\x51b3"),_L("\x8bc0"),-1,3,&TheChineseMethod);//different first stroke + test_unicode_collation(_L("\x5316"),_L("\x4ee4"),-1,3,&TheChineseMethod);//different first stroke + test_unicode_collation(_L("\x62df"),_L("\x4f60"),1,3,&TheChineseMethod);//different radical + test_unicode_collation(_L("\x6d1b"),_L("\x9a86"),-1,3,&TheChineseMethod);//different first stroke +//smae sound and same tones + test_unicode_collation(_L("\x5757"),_L("\x4fa9"),-1,3,&TheChineseMethod);//different stroke count + test_unicode_collation(_L("\x51e1"),_L("\x7e41"),-1,3,&TheChineseMethod);//different stroke count + test_unicode_collation(_L("\x98ce"),_L("\x950b"),-1,3,&TheChineseMethod);//different stroke count + test_unicode_collation(_L("\x5e01"),_L("\x5e87"),-1,3,&TheChineseMethod);//different stroke count + test_unicode_collation(_L("\x529e"),_L("\x534a"),-1,3,&TheChineseMethod);//different stroke count +//compare the Chinese ideological characters to other characters which are not included in the Chinese collation table + test_unicode_collation(_L("abc"),_L("\x4f4f"),-1,3,&TheChineseMethod);//compare alphabets to Chinese character + test_unicode_collation(_L("zxc"),_L("\x4f4f"),-1,3,&TheChineseMethod);//compare alphabets to Chinese character + test_unicode_collation(_L("\x3041"),_L("\x4f4f"),1,3,&TheChineseMethod);//compare a Hiragana to Chinese characters + test_unicode_collation(_L("\x30f6"),_L("\x4f4f"),1,3,&TheChineseMethod);//compare a Katakana to Chinese characters + test_unicode_collation(_L("\x3041"),_L("\x30f6"),-1,3,&TheChineseMethod);//compare a Hiragana to a Katakana +//compare two group of chinese characters + test_unicode_collation(_L("\x8584\x554a"),_L("\x8584\x4f4f"),-1,3,&TheChineseMethod);//the first chinese character is the same + test_unicode_collation(_L("\x5b89\x95ed"),_L("\x5b89\x6b65"),-1,3,&TheChineseMethod);//the first chinese character is the same + test_unicode_collation(_L("\x60b2\x7c3f"),_L("\x60b2\x5e9c"),-1,3,&TheChineseMethod);//the first chinese character is the same + test_unicode_collation(_L("\x8336\x5e01"),_L("\x8336\x5e87"),-1,3,&TheChineseMethod);//the first chinese character is the same + test_unicode_collation(_L("\x4ea7\x529e"),_L("\x4ea7\x534a"),-1,3,&TheChineseMethod);//the first chinese character is the same + + test_unicode_collation(_L("\x3041\x554a"),_L("\x3041\x4f4f"),-1,3,&TheChineseMethod);//the first Hiragana is the same + test_unicode_collation(_L("\x3063\x6bd4"),_L("\x3063\x660c"),-1,3,&TheChineseMethod);//the first Hiragana is the same + test_unicode_collation(_L("\x30b7\x5999"),_L("\x30b7\x6728"),-1,3,&TheChineseMethod);//the first Katakana is the same + test_unicode_collation(_L("\x3041\x534a"),_L("\x3041\x907e"),-1,3,&TheChineseMethod);//the first Katakana is the same + + test_unicode_collation(_L("\x3041\x554a"),_L("\x30f6\x4f4f"),-1,3,&TheChineseMethod);//the first symbole is different + test_unicode_collation(_L("\x3041\x4fbc"),_L("\x3063\x5068"),-1,3,&TheChineseMethod);//the first symbole is different + test_unicode_collation(_L("\x30b7\x6478"),_L("\x30c2\x51dd"),-1,3,&TheChineseMethod);//the first symbole is different + test_unicode_collation(_L("\x3046\x5ff5"),_L("\x30ea\x5b81"),-1,3,&TheChineseMethod);//the first symbole is different + test_unicode_collation(_L("\x3072\x7aed"),_L("\x254b\x670d"),1,3,&TheChineseMethod);//the first symbole is different +//compare full width and half width digits and letters + test_unicode_collation(_L("\xff11"),_L("\x0031"),1,3,&TheChineseMethod);//full width "1" comes after half width "1" + test_unicode_collation(_L("\x0032"),_L("\xff11"),1,3,&TheChineseMethod);//half width "2" comes after full width "1" + test_unicode_collation(_L("\xff21"),_L("\x0061"),1,3,&TheChineseMethod);//full width "a" comes after half width "a" + test_unicode_collation(_L("\x0062"),_L("\xff21"),1,3,&TheChineseMethod);//half width "b" comes after full width "a" + } + +_LIT(KFoo1, "foo"); +_LIT(KFoo2, "FOO"); +_LIT(KFoo3, "Foo"); +_LIT(KNotFoo1, "fo\x300o"); +_LIT(KNotFoo2, "foo "); +_LIT(KNotFoo3, "foo\x300"); +_LIT(KNotFoo4, "fo,o"); +_LIT(KSigma1, "\x3C3"); +_LIT(KSigma2, "\x3C2"); +_LIT(KSigma3, "\x3A3"); +_LIT(KPeach, "pe\x302\x63he"); +_LIT(KFish, "pe\x301\x63he\x301"); + +TInt CompareIWrapper(const TDesC& a, const TDesC& b) + { +#if 0 + return a.CompareIdentifiers(b); +#else + TCollationMethod method; + method.iMainTable = 0; + method.iOverrideTable = 0; + method.iFlags = TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase; + return a.CompareC(b, 2, &method); +#endif + } + +void test_identifiers() + { + // test that comparison is as expected + test(0 == CompareIWrapper(KFoo1, KFoo1)); + test(0 == CompareIWrapper(KFoo1, KFoo3)); + test(0 == CompareIWrapper(KFoo2, KFoo3)); + test(0 == CompareIWrapper(KFoo2, KFoo1)); + test(0 == CompareIWrapper(KFoo3, KFoo1)); + test(0 == CompareIWrapper(KFoo3, KFoo2)); + test(0 != CompareIWrapper(KFoo1, KNotFoo1)); + test(0 != CompareIWrapper(KNotFoo2, KFoo1)); + test(0 != CompareIWrapper(KFoo1, KNotFoo3)); + test(0 != CompareIWrapper(KNotFoo4, KFoo1)); + test(0 == CompareIWrapper(KSigma1, KSigma2)); + test(0 == CompareIWrapper(KSigma1, KSigma3)); + test(0 != CompareIWrapper(KPeach, KFish)); + } + +// This whole test should first use the japanese collation lookup table and if not found what it was +// looking for then it will search the basic standard table ... + + +GLDEF_C TInt E32Main(void) + { + + test.Title(); + test.Start(_L("TCollate Testing")); + + test_unicode_collations(); + test_identifiers(); + + test.End(); + return(KErrNone); + } + +#pragma warning ( default :4700) +#pragma warning ( default :4710) diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_des.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_des.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1505 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_des.cpp +// Overview: +// Test methods of the TDes template class. +// API Information: +// TDes +// Details: +// - Test assigning TPtrs in various ways and confirm results are as expected. +// - Test locating in reverse on an empty TPtr, verify it returns KErrNoFound. +// - For TBuf, TBuf8 and TBuf16 objects: +// - Construct a default TBuf object and verify Length and MaxLength values are +// as expected. +// - Construct a TBuf object with length and verify Length and MaxLength values +// are as expected. +// - Construct a TBuf object over a string, verify Length and MaxLength values +// are as expected. Verify the string data is correct. +// - Construct a TBuf object over a descriptor, verify Length and MaxLength values +// are as expected. Verify the data is correct. +// - Construct a TBuf object over a buffer, verify Length and MaxLength values +// are as expected. Verify the data is correct. +// - Construct a TBuf object and assign a string to it, verify Length and MaxLength +// values are as expected. Verify the data is correct. +// - Construct a TBuf object and assign a descriptor to it, verify Length and MaxLength +// values are as expected. Verify the data is correct. +// - Construct a TBuf object and assign a buffer to it, verify Length and MaxLength +// values are as expected. Verify the data is correct. +// - Check the available user heap space and check for memory leaks by comparing it to +// the initial value. +// - For TPtrC, TPtrC8 and TPtrC16 objects: +// - Verify the invariant for a null pointer descriptor +// - Construct a TPtrC object over a constant string, verify Length and string data +// are correct. +// - Construct a TPtrC object over a constant descriptor, verify Length and data are +// correct. +// - Construct a TPtrC object over a constant buffer with length, verify Length and +// data are correct. +// - Check the available user heap space and check for memory leaks by comparing it to +// the initial value. +// - For TPtr, TPtr8 and TPtr16 objects: +// - Verify the invariant for a null pointer descriptor +// - Construct a TPtr object over a buffer with length and maxlength, verify Length, +// MaxLength and data are correct. +// - Construct a TPtr object over a buffer with maxlength, verify Length, MaxLength +// and Ptr are correct. +// - Construct a TPtr object and assign a string to it. Verify Length, MaxLength and +// the string data are correct. +// - Construct a TPtr object and assign a buffer to it. Verify Length, MaxLength and +// the data are correct. +// - Construct a TPtr object and assign a descriptor to it. Verify Length, MaxLength +// and the data are correct. +// - Check the available user heap space and check for memory leaks by comparing it to +// the initial value. +// - Verify the TPtr copy constructor by setting and checking a text string. +// - For TBufC, TBufC8 and TBufC16 objects: +// - Construct a default TBufC object. Verify default Length is as expected. +// - Construct a TBufC object over a string, verify Length and data are correct. +// - Construct a TBufC object over a TBufC, verify Length and data are correct. +// - Construct a TBufC object and assign a string to it, verify Length and data +// are correct. +// - Construct a TBufC object and assign a descriptor to it, verify Length and data +// are correct. +// - Construct a TBufC object and assign a TBufC to it, verify Length and data +// are correct. +// - Check the available user heap space and check for memory leaks by comparing it to +// the initial value. +// - For HBufC, HBufC8 and HBufC16 objects: +// - Create a new descriptor using the New() method, verify non-NULL return value. +// - Construct a HBufC object and assign a string to it, verify Length and data +// are correct. +// - Construct a HBufC object and assign a descriptor to it, verify Length and data +// are correct. +// - Construct a HBufC object and assign a HBufC to it, verify Length and data +// are correct. +// - Construct a HBufC object and call ReAlloc method, verify Length and data are +// correct. +// - Check the available user heap space and check for memory leaks by comparing it to +// the initial value. +// - Test ASCII destination with Unicode source. Verify string results are as expected. +// - For TLitC, TLitC8 and TLitC16 objects: +// - Verify member operators. +// - Assign and validate literal values +// - For TBuf, TBuf8 and TBuf16 objects, test TDes derived objects that return TPtrs. +// - Extract and verify the left portion of the descriptor (LeftTPtr). +// - Extract and verify the right portion of the descriptor (RightTPtr). +// - Extract and verify the middle portion of the descriptor (MidTPtr). +// - For TPtr, TPtr8 and TPtr16 objects, test TDes derived objects that return TPtrs. +// - Extract and verify the left portion of the descriptor (LeftTPtr). +// - Extract and verify the right portion of the descriptor (RightTPtr). +// - Extract and verify the middle portion of the descriptor (MidTPtr). +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +LOCAL_D RTest test(_L("T_DES")); + +template +class TestTDes + { +public: + TestTDes(); // Test class constructor. + void Test1(); + void Test2(); + void Test3(); + void Test4(); + void Test5(); + void Test6(); + void Test7(); + void Test8(); + void Test9(); + void Test10(); + void Test11(); + void Test12(); + void Test13(); + void Test14(); + void Test15(); + void Test16(); + void Test17(); + void Test18(); + void TestA(); + void TestB(); + void TestC(); + void TestD(); + void TestE(); + void TestF(); + void TestG(); + void TestH(); + void TestI(); + void TestJ(); + void TestK(); + void TestL(); + void TestM(); + void TestN(); + void TestO(); + void TestP(); + void test_TPtrC(); // Test TPtrC classes + void test_TPtr(); // Test TPtr classes + void test_TBuf(); // Test TBuf classes + void test_TBufC(); // Test TBufC classes + void test_HBufC(); // Test HBufC classes + void test_TBufReturningModifiable(); + void test_TPtrReturningModifiable(); + void test_TDesReturningModifiable(const T& a, R& b); + void testHeapSpace(TInt); + }; + +template +GLDEF_C TestTDes::TestTDes() +// +// Constructor +// + {} + +template +GLDEF_C void TestTDes::testHeapSpace(TInt startAvail) +// +// Test no memory leakage has occured +// + { + + test.Next(_L("Testing for memory leaks")); + TInt endAvail,temp; + endAvail=User::Available(temp); + test(endAvail==startAvail); + } + +template +GLDEF_C void TestTDes::Test1() +// +// Constructs a view over a constant string +// + { + + T a(_TL("ABc")); + a.__DbgTestInvariant(); + test(a.Length()==3); + test(*a.Ptr()=='A'); + test(*(a.Ptr()+1)=='B'); + test(*(a.Ptr()+2)=='c'); + } + +template +GLDEF_C void TestTDes::Test2() +// +// Constructs a view over a descriptor +// + { + + T aDes(_TL("ABc")); + aDes.__DbgTestInvariant(); + T b(aDes); + b.__DbgTestInvariant(); + test(b.Length()==aDes.Length()); + test(*b.Ptr()==*aDes.Ptr()); + test(*(b.Ptr()+1)==*(aDes.Ptr()+1)); + test(*(b.Ptr()+2)==*(aDes.Ptr()+2)); + } + +template +GLDEF_C void TestTDes::Test3() +// +// Constructs a view over a length specified buffer +// + { + + S* aBuf = _TL("ABCDEF"); + T aDes(aBuf,6); + aDes.__DbgTestInvariant(); + test(aDes.Length()==6); + for(S count=0; count +GLDEF_C void TestTDes::Test4() +// +// Constructs a r/w view over a buffer with length & maxlength +// + { + + S* aBuf; + aBuf=_TL("LMNOPQ"); + T aDesW(aBuf,6,0x0A); + aDesW.__DbgTestInvariant(); + test(aDesW.Length()==6); + for(S count=0; count +GLDEF_C void TestTDes::Test5() +// +// Constructs a r/w view over a buffer with maxlength +// + { + + S* aBuf; + aBuf=_TL("ZYXWVU"); + T aDesW(aBuf,0x06); + aDesW.__DbgTestInvariant(); + test(aDesW.Length()==0); + test(aDesW.MaxLength()==0x06); + test(aDesW.Ptr()==aBuf); + } + +template +GLDEF_C void TestTDes::Test6() +// +// Constructs a r/w view over a LcbBase with maxlength +// + { + // Cant use yet, see calling function + } + +template +GLDEF_C void TestTDes::Test7() +// +// Constructs a default TBuf view +// + { + + T aBuf; + aBuf.__DbgTestInvariant(); + test(aBuf.Length()==0); + test(aBuf.MaxLength()==0x40); + } + +template +GLDEF_C void TestTDes::Test8() +// +// Constructs a TBuf view with length +// + { + + T aBuf(10); + aBuf.__DbgTestInvariant(); + test(aBuf.Length()==10); + test(aBuf.MaxLength()==0x40); + } + +template +GLDEF_C void TestTDes::Test9() +// +// Constructs a TBuf view over a string +// + { + + T aBuf(_TL("ABCDEF")); + aBuf.__DbgTestInvariant(); + test(aBuf.Length()==6); + test(aBuf.MaxLength()==0x40); + for(S count=0;count +GLDEF_C void TestTDes::Test10() +// +// Constructs a TBuf view over a descriptor +// + { + + R aDesR(_TL("ABCDEF")); + aDesR.__DbgTestInvariant(); + T aBuf(aDesR); + aBuf.__DbgTestInvariant(); + test(aBuf.MaxLength()==0x40); + test(aBuf.Length()==aDesR.Length()); + test(aBuf.Length()==6); + for(S count=0;count +GLDEF_C void TestTDes::Test11() +// +// Constructs a TBuf view over a buffer +// + { + + T aBuf(_TL("ABCDEF")); + aBuf.__DbgTestInvariant(); + T bBuf(aBuf); + bBuf.__DbgTestInvariant(); + test(bBuf.MaxLength()==aBuf.MaxLength()); + test(bBuf.MaxLength()==0x40); + test(bBuf.Length()==aBuf.Length()); + test(bBuf.Length()==6); + for(S count=0;count +GLDEF_C void TestTDes::Test12() +// +// Exercise the default TBufC constructor +// + { + + T buf; + buf.__DbgTestInvariant(); + test(buf.Length()==0); + } + +template +GLDEF_C void TestTDes::Test13() +// +// Constructor over a string +// + { + + S* pString=(_TL("12")); + T buf(pString); + buf.__DbgTestInvariant(); + test(buf.Length()==2); + test(*(buf.Ptr())=='1'); + test(*(buf.Ptr()+1)=='2'); + } + +template +GLDEF_C void TestTDes::Test14() +// +// Constructor over a TDesC (TPtrC) +// + { + + R des(_TL("Test 14")); + des.__DbgTestInvariant(); + T buf(des); + buf.__DbgTestInvariant(); + test(buf.Length()==7); + test(buf.Length()==des.Length()); + test(*(buf.Ptr())=='T'); + test(*(buf.Ptr()+1)=='e'); + test(*(buf.Ptr()+2)=='s'); + test(*(buf.Ptr()+3)=='t'); + test(*(buf.Ptr()+4)==' '); + test(*(buf.Ptr()+5)=='1'); + test(*(buf.Ptr()+6)=='4'); + } + + +template +GLDEF_C void TestTDes::Test15() +// +// Constructor over a TBufC +// + { + + T oldBuf(_TL("Test 15")); + oldBuf.__DbgTestInvariant(); + T newBuf(oldBuf); + newBuf.__DbgTestInvariant(); + test(newBuf.Length()==8); + test(newBuf.Length()==oldBuf.Length()); + test(*(newBuf.Ptr())=='T'); + test(*(newBuf.Ptr()+1)=='e'); + test(*(newBuf.Ptr()+2)=='s'); + test(*(newBuf.Ptr()+3)=='t'); + test(*(newBuf.Ptr()+4)==' '); + test(*(newBuf.Ptr()+5)==' '); + test(*(newBuf.Ptr()+6)=='1'); + test(*(newBuf.Ptr()+7)=='5'); + } + +template +GLDEF_C void TestTDes::Test16() +// +// New operator - without leave +// + { + + T* pBuf=T::New(0x40); + test(pBuf!=NULL); + pBuf->__DbgTestInvariant(); + User::Free(pBuf); + } + +template +GLDEF_C void TestTDes::Test17() +// +// NewL operator - forcing a leave +// + { + +/* + + Reinstate if some method is found of forcing alloc fail + This test no longer works due to heap growing functionality of E32 057 + + T* pBuf; + TInt temp; + TInt available=User::Available(temp); + TAny* pDummy=User::Alloc(available); + TRAPD(ret,pBuf=T::NewL(0x40)) + test(ret==KErrNoMemory); + User::Free(pDummy); +*/ + } + +template +GLDEF_C void TestTDes::Test18() +// +// NewL operator - forcing success +// + { + + T* pBuf=NULL; + TRAPD(ret,pBuf=T::NewL(0x40)) + test(ret==0); + test(pBuf!=NULL); + pBuf->__DbgTestInvariant(); + User::Free(pBuf); + } + +template +GLDEF_C void TestTDes::TestA() +// +// String Assignment +// + { + + S myBuf[7]; + Mem::Copy(myBuf,_TL("ABCDEF"),7*sizeof(S)); + T aDes(myBuf,0x06,0x06); + aDes=_TL("ZYXWVU"); + aDes.__DbgTestInvariant(); + test(aDes.Length()==6); + test(aDes.MaxLength()==0x06); + S count=0; + for(;count +GLDEF_C void TestTDes::TestB() +// DesW Assignment + { + S aBuf[11]; + S bBuf[11]; + + Mem::Copy(aBuf,_TL("ZYXWVUTSRQ"),11*sizeof(S)); + Mem::Copy(bBuf,_TL("ABCDEFGHIJ"),11*sizeof(S)); + T aDes(aBuf,0x0A,0x0A); + T bDes(bBuf,0x0A); + bDes=aDes; + aDes.__DbgTestInvariant(); + bDes.__DbgTestInvariant(); + test(aDes.Length()==bDes.Length()); + test(aDes.MaxLength()==0x0A); + test(bDes.MaxLength()==0x0A); + for(S count=0; count +GLDEF_C void TestTDes::TestC() +// DesC Assignment + { + S aBuf[11]; + R aDesR(_TL("1234567890")); + Mem::Copy(aBuf,_TL("ABCDEFGHIJ"),11*sizeof(S)); + T aDes(aBuf,0x0A,0x0A); + aDes=aDesR; + aDes.__DbgTestInvariant(); + test(aDes.Length()==aDesR.Length()); + test(aDes.MaxLength()==0x0A); + for(S count=0; count +GLDEF_C void TestTDes::TestD() +// TBuf string Assignment + { + T aBuf; + aBuf=(_TL("ABCDEF")); + aBuf.__DbgTestInvariant(); + test(aBuf.Length()==6); + test(aBuf.MaxLength()==0x40); + for(S count=0; count +GLDEF_C void TestTDes::TestE() +// TBuf descriptor Assignment + { + R aDesR(_TL("ABCDEF")); + T aBuf; + aBuf=aDesR; + aBuf.__DbgTestInvariant(); + test(aBuf.MaxLength()==0x40); + test(aBuf.Length()==aDesR.Length()); + test(aBuf.Length()==6); + for(S count=0;count +GLDEF_C void TestTDes::TestF() +// TBuf buffer Assignment + { + T aBuf(_TL("ABCDEF")); + T bBuf; + bBuf=aBuf; + bBuf.__DbgTestInvariant(); + test(bBuf.MaxLength()==aBuf.MaxLength()); + test(bBuf.MaxLength()==0x40); + test(bBuf.Length()==aBuf.Length()); + test(bBuf.Length()==6); + for(S count=0;count +GLDEF_C void TestTDes::TestG() +// TBufC string assignment test + { + S* pString=_TL("TestG"); + T buf; + + test(buf.Length()==0); + buf=pString; + buf.__DbgTestInvariant(); + test(buf.Length()==5); + test(*(buf.Ptr())=='T'); + test(*(buf.Ptr()+1)=='e'); + test(*(buf.Ptr()+2)=='s'); + test(*(buf.Ptr()+3)=='t'); + test(*(buf.Ptr()+4)=='G'); + } + + +template +GLDEF_C void TestTDes::TestH() +// TBufC descriptor assignment + { + R des(_TL("TestH")); + T buf; + + test(buf.Length()==0); + buf=des; + buf.__DbgTestInvariant(); + test(buf.Length()==5); + test(buf.Length()==des.Length()); + test(*(buf.Ptr())=='T'); + test(*(buf.Ptr()+1)=='e'); + test(*(buf.Ptr()+2)=='s'); + test(*(buf.Ptr()+3)=='t'); + test(*(buf.Ptr()+4)=='H'); + } + +template +GLDEF_C void TestTDes::TestI() +// TBufC TBufC assignment + { + T oldBuf(_TL("TEsti")); + T newBuf; + + test(newBuf.Length()==0); + newBuf=oldBuf; + newBuf.__DbgTestInvariant(); + test(newBuf.Length()==5); + test(newBuf.Length()==oldBuf.Length()); + test(*(newBuf.Ptr())=='T'); + test(*(newBuf.Ptr()+1)=='E'); + test(*(newBuf.Ptr()+2)=='s'); + test(*(newBuf.Ptr()+3)=='t'); + test(*(newBuf.Ptr()+4)=='i'); + } + +template +GLDEF_C void TestTDes::TestJ() +// +// HBufC string assignment +// + { + + S* pString=_TL("tEStJ"); + T* pBuf=NULL; + TRAPD(ret,pBuf=T::NewL(0x40)) + test(ret==0); + test(pBuf!=NULL); + *pBuf=pString; + pBuf->__DbgTestInvariant(); + test(pBuf->Length()==5); + test(*(pBuf->Ptr())=='t'); + test(*(pBuf->Ptr()+1)=='E'); + test(*(pBuf->Ptr()+2)=='S'); + test(*(pBuf->Ptr()+3)=='t'); + test(*(pBuf->Ptr()+4)=='J'); + User::Free(pBuf); + } + +template +GLDEF_C void TestTDes::TestK() +// +// HBufC descriptor assignment +// + { + + R des(_TL("TestK")); + T* pBuf=NULL; + TRAPD(ret,pBuf=T::NewL(0x40)) + test(ret==0); + test(pBuf!=NULL); + *pBuf=des; + pBuf->__DbgTestInvariant(); + test(pBuf->Length()==5); + test(pBuf->Length()==des.Length()); + test(*(pBuf->Ptr())=='T'); + test(*(pBuf->Ptr()+1)=='e'); + test(*(pBuf->Ptr()+2)=='s'); + test(*(pBuf->Ptr()+3)=='t'); + test(*(pBuf->Ptr()+4)=='K'); + User::Free(pBuf); + } + +template +GLDEF_C void TestTDes::TestL() +// +// HBufC HBufC assignment +// + { + + S* pString=_TL("testl"); + T* pOldBuf=NULL; + T* pNewBuf=NULL; + TRAPD(ret,pOldBuf=T::NewL(0x40)) + test(ret==0); + TRAP(ret,pNewBuf=T::NewL(0x40)) + test(ret==0); + test(pNewBuf!=NULL); + test(pOldBuf!=NULL); + *pOldBuf=pString; + *pNewBuf=*pOldBuf; + pOldBuf->__DbgTestInvariant(); + pNewBuf->__DbgTestInvariant(); + test(pNewBuf->Length()==5); + test(pOldBuf->Length()==pNewBuf->Length()); + test(*(pNewBuf->Ptr())=='t'); + test(*(pNewBuf->Ptr()+1)=='e'); + test(*(pNewBuf->Ptr()+2)=='s'); + test(*(pNewBuf->Ptr()+3)=='t'); + test(*(pNewBuf->Ptr()+4)=='l'); + User::Free(pOldBuf); + User::Free(pNewBuf); +// + TRAP(ret,pOldBuf=T::NewMaxL(0x40)) + test(ret==0); + TRAP(ret,pNewBuf=T::NewMaxL(0x40)) + test(ret==0); + test(pNewBuf!=NULL); + test(pOldBuf!=NULL); + pOldBuf->__DbgTestInvariant(); + pNewBuf->__DbgTestInvariant(); + test(pNewBuf->Length()==0x40); + test(pOldBuf->Length()==0x40); + pNewBuf->Des().Zero(); + pOldBuf->Des().Zero(); + pOldBuf->__DbgTestInvariant(); + pNewBuf->__DbgTestInvariant(); + test(pNewBuf->Length()==0); + test(pOldBuf->Length()==0); + *pOldBuf=pString; + *pNewBuf=*pOldBuf; + pOldBuf->__DbgTestInvariant(); + pNewBuf->__DbgTestInvariant(); + test(pNewBuf->Length()==5); + test(pOldBuf->Length()==pNewBuf->Length()); + test(*(pNewBuf->Ptr())=='t'); + test(*(pNewBuf->Ptr()+1)=='e'); + test(*(pNewBuf->Ptr()+2)=='s'); + test(*(pNewBuf->Ptr()+3)=='t'); + test(*(pNewBuf->Ptr()+4)=='l'); + User::Free(pOldBuf); + User::Free(pNewBuf); + } + +template +GLDEF_C void TestTDes::TestM() +// +// HBufC ReAlloc +// + { + + S* pString=_TL("TESTM"); + T* pBuf; + pBuf=T::NewL(0x40); + *pBuf=pString; + pBuf->ReAlloc(0x40); + test(pBuf!=NULL); + pBuf->__DbgTestInvariant(); + test(pBuf->Length()==5); + test(*(pBuf->Ptr())=='T'); + test(*(pBuf->Ptr()+1)=='E'); + test(*(pBuf->Ptr()+2)=='S'); + test(*(pBuf->Ptr()+3)=='T'); + test(*(pBuf->Ptr()+4)=='M'); + User::Free(pBuf); + } + +template +GLDEF_C void TestTDes::TestN() +// +// HBufC ReAllocL - forcing a leave +// + { + +/* + + Reinstate if some method is found of forcing alloc fail + This test no longer works due to heap growing functionality of E32 057 + + S* pString=_TL("tEStJ"); + T* pBuf; + TInt available, temp; + TAny* pDummy; + pBuf=T::NewL(0x40); + test(pBuf!=NULL); + *pBuf=pString; + available=User::Available(temp); + pDummy=User::Alloc(available); + TRAPD(ret,pBuf->ReAllocL(0x50)) + test(ret==KErrNoMemory); + User::Free(pDummy); + User::Free(pBuf); +*/ + } + +template +GLDEF_C void TestTDes::TestO() +// HBufC ReAllocL - forcing success + { + + S* pString=_TL("tEStJ"); + T* pBuf; + pBuf=T::NewL(0x40); + test(pBuf!=0); + *pBuf=pString; + TRAPD(ret,pBuf->ReAllocL(0x40)) + test(ret==0); + test(pBuf!=NULL); + pBuf->__DbgTestInvariant(); + test(pBuf->Length()==5); + test(*(pBuf->Ptr())=='t'); + test(*(pBuf->Ptr()+1)=='E'); + test(*(pBuf->Ptr()+2)=='S'); + test(*(pBuf->Ptr()+3)=='t'); + test(*(pBuf->Ptr()+4)=='J'); + User::Free(pBuf); + } + +template +GLDEF_C void TestTDes::TestP() +// Invariant for null pointer descriptor +// Added to reproduce DEF023302 + { + T p(NULL, 0); + p.__DbgTestInvariant(); + } + +GLDEF_C void TestCopy16() +// Test TPtr16 copy constructor + { + TBuf16<0x20> buf(_S16("Paddington Station")); + TPtr16 ptr1((TText16*)buf.Ptr(),buf.Length(),buf.MaxLength()); + ptr1.__DbgTestInvariant(); + TPtr16 ptr2(ptr1); + ptr2.__DbgTestInvariant(); + ptr2[11]='B'; + ptr2[12]='e'; + ptr2[13]='a'; + ptr2[14]='r'; + ptr2[15]=' '; + ptr1.SetLength(15); + ptr2.Append(_L16(" acid")); + test(ptr1==_L16("Paddington Bear")); + test(ptr2==_L16("Paddington Bear on acid")); + } + +GLDEF_C void Test16To8() +// Test ASCII dest with Unicode source + { + TBuf8<0x20> buf(_S8("Paddington Station")); + TPtr8 ptr1((TText8*)buf.Ptr(),buf.Length(),buf.MaxLength()); + ptr1.__DbgTestInvariant(); + TPtr8 ptr2(ptr1); + ptr2.__DbgTestInvariant(); + ptr2[11]='B'; + ptr2[12]='e'; + ptr2[13]='a'; + ptr2[14]='r'; + ptr2[15]=' '; + ptr1.SetLength(15); + ptr1.__DbgTestInvariant(); + ptr2.Append(_L16(" acid")); + ptr2.__DbgTestInvariant(); + test(ptr1==_L8("Paddington Bear")); + test(ptr2==_L8("Paddington Bear on acid")); + } + + +GLDEF_C void TestCopy8() +// Test TPtr8 copy constructor + { + TBuf8<0x20> buf(_S8("Paddington Station")); + TPtr8 ptr1((TText8*)buf.Ptr(),buf.Length(),buf.MaxLength()); + TPtr8 ptr2(ptr1); + ptr2[11]='B'; + ptr2[12]='e'; + ptr2[13]='a'; + ptr2[14]='r'; + ptr2[15]=' '; + ptr1.SetLength(15); + ptr2.Append(_L8(" acid")); + ptr1.__DbgTestInvariant(); + ptr2.__DbgTestInvariant(); + test(ptr1==_L8("Paddington Bear")); + test(ptr2==_L8("Paddington Bear on acid")); + } + +GLDEF_C void TestCopy() +// Test TPtr copy constructor + { + TBuf<0x20> buf(_S("Paddington Station")); + TPtr ptr1((TText*)buf.Ptr(),buf.Length(),buf.MaxLength()); + TPtr ptr2(ptr1); + ptr2[11]='B'; + ptr2[12]='e'; + ptr2[13]='a'; + ptr2[14]='r'; + ptr2[15]=' '; + ptr1.SetLength(15); + ptr2.Append(_L(" acid")); + ptr1.__DbgTestInvariant(); + ptr2.__DbgTestInvariant(); + test(ptr1==_L("Paddington Bear")); + test(ptr2==_L("Paddington Bear on acid")); + } + +template +GLDEF_C void TestTDes::test_TPtrC() +// +// Test the TDesC class special member functions +// + { + + test.Start(_L("Invariant for null pointer descriptor")); + TestP(); + test.Next(_L("R/O view over constant string")); + Test1(); + test.Next(_L("R/O view over constant descriptor")); + Test2(); + test.Next(_L("R/O view over constant buffer with length")); + Test3(); + } + +template +GLDEF_C void TestTDes::test_TPtr() +// +// Test the TPtr class special member functions +// + { + + test.Start(_L("Invariant for null pointer descriptor")); + TestP(); + test.Next(_L("R/W view over buffer with length & maxlength")); + Test4(); + test.Next(_L("R/W view over buffer with maxlength")); + Test5(); +// Skipped the following test because Colly hasn't +// written the templates yet for the TBufC8 & 16 classes +// test.Next(_L("R/W view over LcbBase with maxlength")); +// Test6(); + test.Next(_L("String assignment")); + TestA(); + test.Next(_L("DesW assignment")); + TestB(); + test.Next(_L("DesC assignment")); + TestC(); + } + +template +GLDEF_C void TestTDes::test_TBuf() +// +// Test the TBuf class special member functions +// + { + + test.Start(_L("TBuf default view, no params")); + Test7(); + test.Next(_L("TBuf view with a length")); + Test8(); + test.Next(_L("TBuf view over a string")); + Test9(); + test.Next(_L("TBuf view over a descriptor")); + Test10(); + test.Next(_L("TBuf view over a buffer")); + Test11(); + test.Next(_L("String assignment")); + TestD(); + test.Next(_L("Descriptor assignment")); + TestE(); + test.Next(_L("Buffer assignment")); + TestF(); + } + +template +GLDEF_C void TestTDes::test_TBufC() +// +// Test the TBufC class methods +// + { + + test.Start(_L("Default constructor")); + Test12(); + test.Next(_L("With a string")); + Test13(); + test.Next(_L("With a Descriptor (TPtrC)")); + Test14(); + test.Next(_L("With a TBufC")); + Test15(); + test.Next(_L("String assignment")); + TestG(); + test.Next(_L("Descriptor assignment (TPtrC)")); + TestH(); + test.Next(_L("TBufC assignment")); + TestI(); + } + +template +GLDEF_C void TestTDes::test_HBufC() +// +// Test the HBufC class methods. +// + { + + test.Start(_L("New")); + Test16(); + test.Next(_L("NewL - forcing a leave")); + Test17(); + test.Next(_L("NewL - showing success")); + Test18(); + test.Next(_L("String assignment")); + TestJ(); + test.Next(_L("Descriptor assignment")); + TestK(); + test.Next(_L("HBufC assignment")); + TestL(); + test.Next(_L("ReAlloc")); + TestM(); + test.Next(_L("ReAllocL - forcing a leave")); + TestN(); + test.Next(_L("ReAllocL - showing success")); + TestO(); + } + +template +GLDEF_C void TestTDes::test_TBufReturningModifiable() + { + T a; + R b(0,0); + a.Copy(_TL("abcdefg")); + test_TDesReturningModifiable(a,b); + } + +template +GLDEF_C void TestTDes::test_TPtrReturningModifiable() + { + S* aBuf; + aBuf=_TL("abcdefg"); + T a(aBuf,7,7); + R b(0,0); + test_TDesReturningModifiable(a,b); + } + +template +GLDEF_C void TestTDes::test_TDesReturningModifiable(const T& a, R& b) + { + test.Start(_L("Test TDes derived objects that return TPtrs")); + + test.Next(_L("LeftTPtr")); + b.Set(a.LeftTPtr(3)); + b.__DbgTestInvariant(); + test(b == a.Left(3)); + + b.Set(a.LeftTPtr(0)); + b.__DbgTestInvariant(); + test(b == a.Left(0)); + + b.Set(a.LeftTPtr(7)); + b.__DbgTestInvariant(); + test(b == a.Left(7)); + + b = a.LeftTPtr(42); + b.__DbgTestInvariant(); + test(b == a.Left(7)); + + test.Next(_L("RightTPtr")); + b.Set(a.RightTPtr(5)); + b.__DbgTestInvariant(); + test(b == a.Right(5)); + + b.Set(a.RightTPtr(7)); + b.__DbgTestInvariant(); + test(b == a.Right(7)); + + b.Set(a.RightTPtr(0)); + b.__DbgTestInvariant(); + test(b == a.Right(0)); + + b.Set(a.RightTPtr(42)); + b.__DbgTestInvariant(); + test(b == a.Right(42)); + + test.Next(_L("MidTPtr")); + b.Set(a.MidTPtr(5)); + b.__DbgTestInvariant(); + test(b == a.Mid(5)); + + b.Set(a.MidTPtr(7)); + b.__DbgTestInvariant(); + test(b == a.Mid(7)); + + b.Set(a.MidTPtr(0)); + b.__DbgTestInvariant(); + test(b == a.Mid(0)); + + test.Next(_L("MidTPtr (2 parms)")); + b.Set(a.MidTPtr(4,3)); + b.__DbgTestInvariant(); + test(b == a.Mid(4,3)); + test(b == a.Mid(4)); + + b.Set(a.MidTPtr(0,0)); + b.__DbgTestInvariant(); + test(b == a.Mid(0,0)); + + b.Set(a.MidTPtr(3,2)); + b.__DbgTestInvariant(); + test(b == a.Mid(3,2)); + + b.Set(a.MidTPtr(7,0)); + b.__DbgTestInvariant(); + test(b == a.Mid(7,0)); + } + +LOCAL_C void testAssignTPtr() +// +// Test assigning TPtr's. +// + { + + TBufC<0x20> x(_S("Hello")); + TPtr p=x.Des(); + p+=_L(" World"); + test(p==_L("Hello World")); + test(x==_L("Hello World")); + p.SetLength(5); + test(p==_L("Hello")); + test(x==_L("Hello")); + TBufC<0x20> y(_S("ByeBye")); + TPtr q=y.Des(); + q.Set(p); + test(q==p); + q+=_L(" World"); + test(q==_L("Hello World")); + test(x==_L("Hello World")); + test(y==_L("ByeBye")); + q.Set((TText*)x.Ptr(),x.Length(),x.Des().MaxLength()); + test(q==_L("Hello World")); + test(q.MaxLength()==0x20); + q.SetLength(1); + test(q==_L("H")); + test(x==_L("Hello World")); + } + +LOCAL_C void testTPtrLocateReverse() +// +// Test locating in reverse on an empty TPtr +// + { + + TPtrC a; + test(a.LocateReverse('0')==KErrNotFound); + test(a.LocateReverseF('0')==KErrNotFound); + } + +_LIT8(KLitTest1_8,"1"); +_LIT8(KLitTest12_8,"12"); +_LIT8(KLitTest123_8,"123"); +_LIT8(KLitTest1234_8,"1234"); +_LIT8(KLitTestalpha_8,"abcdefghijklmnopqrstuvwxyz"); + +LOCAL_C const TDesC8& testByRef8(TRefByValue aRef) + { + return aRef; + } + +LOCAL_C void testTLitC8() + { + test.Start(_L("All members")); + test (_L8("")==KNullDesC8); // operator const TDesC8& + test (KNullDesC8()==TPtrC8()); // operator() + const TDesC8* pNull=&KNullDesC8; // operator& + test (pNull->Compare(_L8(""))==0); + test (&testByRef8(KNullDesC8)==&KNullDesC8); // operator const TRefByValue +// + test.Next(_L("Literal values")); + const TDesC8& t1=KLitTest1_8; + test (t1.Length()==1); + test (t1[0]=='1'); + test (t1==_L8("1")); + const TDesC8& t12=KLitTest12_8; + test (t12.Length()==2); + test (t12[0]=='1'); + test (t12==_L8("12")); + const TDesC8& t123=KLitTest123_8; + test (t123.Length()==3); + test (t123[0]=='1'); + test (t123==_L8("123")); + const TDesC8& t1234=KLitTest1234_8; + test (t1234.Length()==4); + test (t1234[0]=='1'); + test (t1234==_L8("1234")); + const TDesC8& talpha=KLitTestalpha_8; + test (talpha.Length()==26); + test (talpha[0]=='a'); + test (talpha==_L8("abcdefghijklmnopqrstuvwxyz")); +// + test.End(); + } + +_LIT16(KLitTest1_16,"1"); +_LIT16(KLitTest12_16,"12"); +_LIT16(KLitTest123_16,"123"); +_LIT16(KLitTest1234_16,"1234"); +_LIT16(KLitTestalpha_16,"abcdefghijklmnopqrstuvwxyz"); + +LOCAL_C const TDesC16& testByRef16(TRefByValue aRef) + { + return aRef; + } + +LOCAL_C void testTLitC16() + { + test.Start(_L("All members")); + test (_L16("")==KNullDesC16); // operator const TDesC16& + test (KNullDesC16()==TPtrC16()); // operator() + const TDesC16* pNull=&KNullDesC16; // operator& + test (pNull->Compare(_L16(""))==0); + test (&testByRef16(KNullDesC16)==&KNullDesC16); // operator const TRefByValue +// + test.Next(_L("Literal values")); + const TDesC16& t1=KLitTest1_16; + test (t1.Length()==1); + test (t1[0]=='1'); + test (t1==_L16("1")); + const TDesC16& t12=KLitTest12_16; + test (t12.Length()==2); + test (t12[0]=='1'); + test (t12==_L16("12")); + const TDesC16& t123=KLitTest123_16; + test (t123.Length()==3); + test (t123[0]=='1'); + test (t123==_L16("123")); + const TDesC16& t1234=KLitTest1234_16; + test (t1234.Length()==4); + test (t1234[0]=='1'); + test (t1234==_L16("1234")); + const TDesC16& talpha=KLitTestalpha_16; + test (talpha.Length()==26); + test (talpha[0]=='a'); + test (talpha==_L16("abcdefghijklmnopqrstuvwxyz")); +// + test.End(); + } + +_LIT(KLitTest1,"1"); +_LIT(KLitTest12,"12"); +_LIT(KLitTest123,"123"); +_LIT(KLitTest1234,"1234"); +_LIT(KLitTestalpha,"abcdefghijklmnopqrstuvwxyz"); + +LOCAL_C const TDesC& testByRef(TRefByValue aRef) + { + return aRef; + } + +LOCAL_C void testTLitC() + { + test.Start(_L("All members")); + test (_L("")==KNullDesC); // operator const TDesC& + test (KNullDesC()==TPtrC()); // operator() + const TDesC* pNull=&KNullDesC; // operator& + test (pNull->Compare(_L(""))==0); + test (&testByRef(KNullDesC)==&KNullDesC); // operator const TRefByValue +#if defined(_UNICODE) + test (_L16("")==KNullDesC); // operator const TDesC& + test (KNullDesC()==TPtrC16()); // operator() + const TDesC16* pNull16=&KNullDesC; // operator& + test (pNull16->Compare(_L16(""))==0); + test (&testByRef16(KNullDesC)==&KNullDesC); // operator const TRefByValue +#else + test (_L8("")==KNullDesC); // operator const TDesC& + test (KNullDesC()==TPtrC8()); // operator() + const TDesC8* pNull8=&KNullDesC; // operator& + test (pNull8->Compare(_L8(""))==0); + test (&testByRef8(KNullDesC)==&KNullDesC); // operator const TRefByValue +#endif +// + test.Next(_L("Literal values")); + const TDesC& t1=KLitTest1; + test (t1.Length()==1); + test (t1[0]=='1'); + test (t1==_L("1")); + const TDesC& t12=KLitTest12; + test (t12.Length()==2); + test (t12[0]=='1'); + test (t12==_L("12")); + const TDesC& t123=KLitTest123; + test (t123.Length()==3); + test (t123[0]=='1'); + test (t123==_L("123")); + const TDesC& t1234=KLitTest1234; + test (t1234.Length()==4); + test (t1234[0]=='1'); + test (t1234==_L("1234")); + const TDesC& talpha=KLitTestalpha; + test (talpha.Length()==26); + test (talpha[0]=='a'); + test (talpha==_L("abcdefghijklmnopqrstuvwxyz")); +// + test.End(); + } + +LOCAL_C void testLiteral() + { + test.Next(_L("class TLitC8")); + testTLitC8(); + test.Next(_L("class TLitC16")); + testTLitC16(); + test.Next(_L("class TLitC")); + testTLitC(); + } + +#ifndef _DEBUG +#pragma warning (disable: 4702)// Unreachable code +#pragma warning (disable: 4701)// Local variable used without being initialized +#pragma warning (disable: 4710)// Function not expanded +#endif + +GLDEF_C TInt E32Main() +// +// Test the TDes type. +// + { + test.Title(); +// + TInt startAvail,temp; + startAvail=User::Available(temp); +// + test.Start(_L("Assigning TPtr's")); + testAssignTPtr(); +// + test.Next(_L("Locate reverse on empty TPtr")); + testTPtrLocateReverse(); +// + test.Next(_L("class TBuf<0x40>")); + TestTDes,TText,TUint, TPtrC> jj; + jj.test_TBuf(); + jj.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TBuf8<0x40>")); + TestTDes,TUint8,TUint8, TPtrC8> ii; + ii.test_TBuf(); + ii.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TBuf16<0x40>")); + TestTDes,TUint16,TUint16, TPtrC16> hh; + hh.test_TBuf(); + hh.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TPtrC")); + TestTDes dd; + dd.test_TPtrC(); + dd.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TPtrC8")); + TestTDes cc; + cc.test_TPtrC(); + cc.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TPtrC16")); + TestTDes bb; + bb.test_TPtrC(); + bb.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TPtr")); + TestTDes gg; + gg.test_TPtr(); + gg.testHeapSpace(startAvail); + test.Next(_L("Copy constructor")); + TestCopy(); + test.End(); +// + test.Next(_L("class TPtr8")); + TestTDes ff; + ff.test_TPtr(); + ff.testHeapSpace(startAvail); + test.Next(_L("Copy constructor")); + TestCopy8(); + test.End(); +// + test.Next(_L("class TPtr16")); + TestTDes ee; + ee.test_TPtr(); + ee.testHeapSpace(startAvail); + test.Next(_L("Copy constructor")); + TestCopy16(); + test.End(); +// + test.Next(_L("class TBufC")); + TestTDes, TText, TUint16, TPtrC> kk; + kk.test_TBufC(); + kk.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TBufC8")); + TestTDes, TUint8, TUint8, TPtrC8> ll; + ll.test_TBufC(); + ll.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class TBufC16")); + TestTDes, TUint16, TUint16, TPtrC16> mm; + mm.test_TBufC(); + mm.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class HBufC")); + TestTDes nn; + nn.test_HBufC(); + nn.testHeapSpace(startAvail); + test.End(); +// + test.Next(_L("class HBufC8")); + TestTDes oo; + oo.test_HBufC(); + oo.testHeapSpace(startAvail); + test.End(); + + test.Next(_L("Test Unicode to Ascii stuff")); + Test16To8(); +// + test.Next(_L("class HBufC16")); + TestTDes pp; + pp.test_HBufC(); + pp.testHeapSpace(startAvail); + test.End(); +// + testLiteral(); +// + test.Next(_L("class TBuf returning TPtr")); + TestTDes, TText, TUint, TPtr> qq; + qq.test_TBufReturningModifiable(); + test.End(); + + test.Next(_L("class TBuf8 returning TPtr8")); + TestTDes, TText8, TUint8, TPtr8> rr; + rr.test_TBufReturningModifiable(); + test.End(); + + test.Next(_L("class TBuf16 returning TPtr16")); + TestTDes, TText16, TUint16, TPtr16> ss; + ss.test_TBufReturningModifiable(); + test.End(); + + test.Next(_L("class TPtr returning TPtr")); + TestTDes tt; + tt.test_TPtrReturningModifiable(); + test.End(); + + test.Next(_L("class TPtr8 returning TPtr8")); + TestTDes uu; + uu.test_TPtrReturningModifiable(); + test.End(); + + test.Next(_L("class TPtr16 returning TPtr16")); + TestTDes vv; + vv.test_TPtrReturningModifiable(); + test.End(); + + test.End(); + + return(KErrNone); + } +#pragma warning (default: 4702)// Unreachable code +#pragma warning (default: 4701)// Local variable used without being initialized +#pragma warning (default: 4710)// Function not expanded + + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_farray.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_farray.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,388 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_farray.cpp +// Overview: +// Test the functionality of CArrayFixFlat, CArrayPtrFlat, CArrayFixSeg classes. +// API Information: +// CArrayFixFlat, CArrayPtrFlat, CArrayFixSeg. +// Details: +// - Create an array of fixed length buffer descriptor objects contained within a flat +// dynamic and segmented buffer and verify that +// - number of elements held in the array is 0. +// - length of an element is as specified. +// - array is compressed and reset as expected. +// - the elements of the array are sorted as expected. +// - insertion of a text into the array at specified position and filling a blank space +// at the beginning is as expected. +// - return value is 0 when available element is searched within the array. +// - removal of first element from the array is successful. +// - number of elements held in the array is 1 after appending a single element onto +// the end of the array. +// - the position of specified element is found successfully +// - resetting the array is as expected +// - End and Back methods are as expected. +// - Create an array of fixed length text character objects contained within a flat dynamic +// and segmented buffer. +// - append a text onto the end of the array, check the contents and number of elements +// held in the array are as expected. +// - insert a text and verify that the change in the content of array and number of +// elements held in the array are as expected. +// - remove a single character and multiple characters from the array and verify that +// the Delete method is as expected. Compress the array. +// - Create an array of fixed length text character objects contained within a flat dynamic +// and segmented buffer. +// - append strings of specified length onto the end of the array and verify that the +// number of elements held in the array is as expected. +// - insert strings at specified location and check that the contents are as expected. +// - reset the array, append a string, compress the array and verify that content is as +// expected. +// - sort the array and verify that content is as expected. +// - verify the correct position of the element and return value is zero when an element +// is found using binary and sequential search technique and nonzero if not present in +// the array. +// - Create an array of fixed length text character objects contained within a flat dynamic +// and segmented buffer. +// - Insert some elements into the array at specified positions determined by key of +// type TInt and verify that KErrAlreadyExists is returned if an element with the +// same key already exists within the array. +// - Create an array of pointers to objects implemented using a flat dynamic buffer, insert one +// element into the array at the specified position and destroy the object whose pointer form +// the element of the array, before resetting the array. +// - Create and delete an array of CBase objects contained within a flat dynamic buffer. +// - Test whether the heap has been corrupted by all the tests. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +class MyCBase : public CBase + { + }; + +const TInt KTestGranularity=0x02; + +LOCAL_D RTest test(_L("T_FARRAY")); + +template +class TArr + { +public: + TArr() {} + TInt Count() const {return S;} + T& operator[](TInt anIndex) {return iArr[anIndex];} + const T& operator[](TInt anIndex) const {return iArr[anIndex];} +private: + T iArr[S]; + }; + +LOCAL_C void testFix(CArrayFix >& aFix) +// +// Test all methods +// + { + test.Next(_L("Test all methods")); + test(aFix.Count()==0); + test(aFix.Length()==sizeof(TBuf<0x10>)); + aFix.Compress(); + test(TRUE); + aFix.Reset(); + test(TRUE); + TKeyArrayFix kk(0,ECmpNormal,0x10); + test(TRUE); + aFix.Sort(kk); + test(TRUE); + TBuf<0x10> aa(_L("aaaaa")); + aFix.InsertL(0,aa); + test(TRUE); + aFix[0].Fill(' '); + test(TRUE); + TBuf<0x10> z(aFix[0]); + z.Length(); + test(TRUE); + aFix[0].Fill('a'); + test(TRUE); + TInt pp; + test(aFix.Find(aa,kk,pp)==0); + test(pp==0); + aFix.Delete(0); + TBuf<0x10> bb(_L("bbbbb")); + aFix.AppendL(bb); + test(aFix.Count()==1); + test(aFix.InsertIsqAllowDuplicatesL(aa,kk)==0); + test(aFix.InsertIsqAllowDuplicatesL(bb,kk)==2); + test(aFix.FindIsq(aa,kk,pp)==0); + test(pp==0); + aFix.Reset(); + for(TInt index=0;index *end=NULL; + const TBuf<0x10> *ptr=NULL; + for(TInt index2=0;index2 *bak=NULL; + ptr=NULL; + for(TInt index3=KTestGranularity*7/2;index3>0;index3--) + { + if (bak==ptr) + { + bak=aFix.Back(index3); + ptr=&aFix[index3-1]+1; + TInt seglen=ptr-bak; + test(seglen==KTestGranularity || seglen==index3 || seglen==index3%KTestGranularity); + } + test(&aFix[index3-1]==--ptr); + } + } + +LOCAL_C void test1(CArrayFix& aFix) +// + { + test.Next(_L("AppendL and InsertL single chars")); + aFix.AppendL(_S("abcd"),4); + test(aFix[0]=='a'); + test(aFix[1]=='b'); + test(aFix[3]=='d'); + test(aFix.Count()==4); + aFix.InsertL(2,_S("ef"),2); + test(aFix[1]=='b'); + test(aFix[2]=='e'); + test(aFix[4]=='c'); + test(aFix.Count()==6); + aFix.AppendL(TText('z')); + test(aFix[6]=='z'); + aFix.InsertL(0,TText('y')); + test(aFix[0]=='y'); + test(aFix[1]=='a'); + test(aFix.Count()==8); + test.Next(_L("Delete single chars")); + aFix.Delete(3); + test(aFix[2]=='b'); + test(aFix[3]=='f'); + test(aFix[4]=='c'); + aFix.Delete(1,2); + test(aFix[0]=='y'); + test(aFix[1]=='f'); + test(aFix[2]=='c'); + test(aFix.Count()==5); + aFix.Compress(); + } + +LOCAL_C void test2(CArrayFix >& aFix) +// + { + test(aFix.Length()==sizeof(TArr)); + test.Next(_L("AppendL and insert strings of length 4")); + TPtrC des1=_L("abcd"); + TPtrC des2=_L("efgh"); + aFix.AppendL(*(const TArr*)des1.Ptr()); + aFix.AppendL(*(const TArr*)des2.Ptr()); + test(aFix.Count()==2); + TPtrC des3(&aFix[0][0],4); + TPtrC des4(&aFix[1][0],4); + test(des3==_L("abcd")); + test(des4==_L("efgh")); + aFix.InsertL(1,*(const TArr*)_S("ijkl")); + test(aFix.Count()==3); + TPtrC des5(&aFix[2][0],4); + test(des3==_L("abcd")); + test(des4==_L("ijkl")); + test(des5==_L("efgh")); + + test.Next(_L("Reset and Compress")); + aFix.Reset(); + TBuf<0x10> buf1=_L("abcdefgh"); + aFix.AppendL((const TArr*)buf1.Ptr(),2); + aFix.Compress(); + TPtrC des6(&aFix[0][0],4); + test(des6==_L("abcd")); + TPtrC des7(&aFix[1][0],4); + test(des7==_L("efgh")); + buf1=_L("ghighhxy"); + aFix.InsertL(1,(const TArr*)buf1.Ptr(),2); + aFix.Compress(); + TPtrC des8(&aFix[0][0],4); + test(des8==_L("abcd")); + TPtrC des9(&aFix[1][0],4); + test(des9==_L("ghig")); + TPtrC des10(&aFix[2][0],4); + test(des10==_L("hhxy")); + TPtrC des11(&aFix[3][0],4); + test(des11==_L("efgh")); + + test.Next(_L("Sort strings")); + TKeyArrayFix kk(0,ECmpNormal,0x04); + aFix.Sort(kk); + TPtrC des12(&aFix[0][0],4); + test(des12==_L("abcd")); + TPtrC des13(&aFix[1][0],4); + test(des13==_L("efgh")); + TPtrC des14(&aFix[2][0],4); + test(des14==_L("ghig")); + TPtrC des15(&aFix[3][0],4); + test(des15==_L("hhxy")); + + test.Next(_L("Find and FindIsq")); + aFix.Compress(); + test(aFix.InsertIsqL(*(const TArr*)_S("ffff"),kk)==2); + aFix.Compress(); + test(aFix.InsertIsqAllowDuplicatesL(*(const TArr*)_S("ffff"),kk)==3); + aFix.Compress(); + TRAPD(r,aFix.InsertIsqL(*(const TArr*)_S("ffff"),kk)) + test(r==KErrAlreadyExists); + TInt aPos=0; + test(aFix.Find(*(const TArr*)_S("xxxx"),kk,aPos)==1); + test(aPos==6); + test(aFix.Find(*(const TArr*)_S("abcd"),kk,aPos)==0); + test(aPos==0); + test(aFix.Find(*(const TArr*)_S("ghig"),kk,aPos)==0); + test(aPos==4); + test(aFix.Find(*(const TArr*)_S("ffff"),kk,aPos)==0); + test(aPos==2); + test(aFix.Find(*(const TArr*)_S("hhxy"),kk,aPos)==0); + test(aPos==5); + test(aFix.FindIsq(*(const TArr*)_S("bbbb"),kk,aPos)!=0); + test(aPos==1); + test(aFix.FindIsq(*(const TArr*)_S("abcd"),kk,aPos)==0); + test(aPos==0); + test(aFix.FindIsq(*(const TArr*)_S("ghig"),kk,aPos)==0); + test(aPos==4); + test(aFix.FindIsq(*(const TArr*)_S("ffff"),kk,aPos)==0); + test(aPos==2); + test(aFix.InsertIsqL(*(const TArr*)_S("fghz"),kk)==4); + test(aFix.FindIsq(*(const TArr*)_S("fghz"),kk,aPos)==0); + test(aPos==4); + test(aFix.FindIsq(*(const TArr*)_S("hhxy"),kk,aPos)==0); + test(aPos==6); + } + +LOCAL_C void test3(CArrayFix& aFix) + { + + test.Next(_L("InsertIsqL")); + TKeyArrayFix kk(0,ECmpTInt); + + TInt pos=0; + TInt mod=47; + TInt inc=23; + TInt i=0; + + FOREVER + { + TInt ret; + if (i&1) + TRAP(ret,aFix.InsertIsqL(i,kk)) + else + { + TRAP(ret,pos=aFix.InsertIsqL(i,kk)) + if (ret==KErrNone) + test(aFix[pos]==i); + } + if (ret==KErrAlreadyExists) + break; + i=(i+inc)%mod; + } + + for(i=0;i >* pFixFlat=new CArrayFixFlat >(KTestGranularity); + if (pFixFlat==NULL) + test.Panic(_L("Allocating array")); + testFix(*pFixFlat); + delete pFixFlat; + + CArrayFixFlat* pFixFlatChar=new CArrayFixFlat(KTestGranularity); + test1(*pFixFlatChar); + delete pFixFlatChar; + + CArrayFixFlat >* pFixFlatArr=new CArrayFixFlat >(KTestGranularity); + test2(*pFixFlatArr); + delete pFixFlatArr; + + CArrayFixFlat* pFixFlatInt=new CArrayFixFlat(KTestGranularity); + test3(*pFixFlatInt); + delete pFixFlatInt; + + test.Next(_L("class CArrayPtrFlat of CBase")); + + CArrayPtrFlat* pPtrFlatCBase=new CArrayPtrFlat(KTestGranularity); + if (pPtrFlatCBase==NULL) + test.Panic(_L("Allocating array of CBase*")); + MyCBase* c1 = new MyCBase(); + pPtrFlatCBase->InsertL(0,&c1,1); + pPtrFlatCBase->ResetAndDestroy(); +// test(pFixFlatCBase->iBase==0); + pPtrFlatCBase->ResetAndDestroy(); + delete pPtrFlatCBase; + + test.Next(_L("class CArrayFixFlat of CBase")); + + CArrayFixFlat* pFixFlatCBase=new CArrayFixFlat(KTestGranularity); + if (pFixFlatCBase==NULL) + test.Panic(_L("Allocating array of CBase")); + delete pFixFlatCBase; + + test.Next(_L("class CArrayFixSeg")); + CArrayFixSeg >* pFixSeg=new CArrayFixSeg >(KTestGranularity); + if (pFixSeg==NULL) + test.Panic(_L("Allocating array")); + testFix(*pFixSeg); + delete pFixSeg; + + CArrayFixSeg* pFixSegChar=new CArrayFixSeg(KTestGranularity); + test1(*pFixSegChar); + delete pFixSegChar; + + CArrayFixSeg >* pFixSegArr=new CArrayFixSeg >(KTestGranularity); + test2(*pFixSegArr); + delete pFixSegArr; + + CArrayFixSeg* pFixSegInt=new CArrayFixSeg(KTestGranularity); + test3(*pFixSegInt); + delete pFixSegInt; + + test.End(); + __UHEAP_MARKEND; + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_func.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_func.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,939 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_func.cpp +// Overview: +// Comprehensive test for the ARM coded Mem, Des and integer divide routines. +// Check memory for a large variation of buffer sizes and alignments, +// check all the optimizations made in the copying/filling code. +// API Information: +// Mem::Fill, Mem::Copy, Mem::Move, Mem::Swap, Mem::Compare +// Details: +// - Create blocks, fill some data into one block, copy data across block of varying +// lengths, alignments and check the copy is as expected. +// - Create blocks, fill some data into the block, move data from one block to other +// block and check it is as expected. +// - Create blocks, fill some data and check the data is filled as expected. +// - Create blocks, fill some data in two blocks, swap the blocks check the data +// is swapped as expected. +// - Create blocks, fill some data into the blocks, compare the data at different specified +// offsets, compare the return value, check it is as expected. +// - Check the conversion from specified integer numbers in different number systems to +// character representation is as expected. Check for both upper and lower case results. +// - Initialize variables with signed, unsigned, positive, negative integer values, check the +// integer division routines are as expected. +// - Check the integer modulo operation results are as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include +#include +#include + +RTest test(_L("T_FUNC")); + +TInt failed; + +void PrintInfo(TText8* aBuf1,TText8* aBuf2) + { + if(aBuf1=ii && kk<(ii+length) && bufa[kk]!=0xaa) + { + PrintInfo(bufb,bufa); + test.Printf(_L("Mem::Copy failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + if(kk>=(ii+length) && bufa[kk]!=0x55) + { + PrintInfo(bufb,bufa); + test.Printf(_L("Mem::Copy failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + } + + Mem::Fill(&bufa[0],512,a55); + Mem::Fill(&bufb[0],512,aAA); + + length=Min(496-jj,496-ii); + + addr=Mem::Copy(&bufb[ii],&bufa[jj],length); + + if(addr!=(&bufb[ii]+length)) + { + PrintInfo(bufa,bufb); + test.Printf(_L("Mem::Copy returned incorrect address for %d bytes\n"),length); + failed=KErrGeneral; + //test.Getch(); + return; + } + + for(kk=0;kk<512;kk++) + { + if(kk=ii && kk<(ii+length) && bufb[kk]!=0x55) + { + PrintInfo(bufa,bufb); + test.Printf(_L("Mem::Copy failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + if(kk>=(ii+length) && bufb[kk]!=0xaa) + { + PrintInfo(bufa,bufb); + test.Printf(_L("Mem::Copy failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + } + }; + } + } + +// +// Assert panic test, debug ARM build only. See DEF118984. +// +#if defined(_DEBUG) && defined(__CPU_ARM) +const TInt KMemMoveBufferSize=0x20; +const TInt KMemMoveBadLength=3; + +enum TMemMoveTest + { + EMemMoveValid=0, + EMemMoveSourceNotAligned=1, + EMemMoveTargetNotAligned=2, + EMemMoveLengthNotMultipleOf4=3, + }; + +LOCAL_C TInt MemMoveClient(TAny* aPtr) + { + TMemMoveTest aMode = *(TMemMoveTest *)&aPtr; + TText8 srcbuf[KMemMoveBufferSize]; + TText8 trgbuf[KMemMoveBufferSize]; + TText8 *src=srcbuf, *trg=trgbuf; + TInt length=KMemMoveBufferSize; + + switch (aMode) + { + case EMemMoveValid: + break; + case EMemMoveSourceNotAligned: + src=&srcbuf[1]; + break; + case EMemMoveTargetNotAligned: + trg=&trgbuf[1]; + break; + case EMemMoveLengthNotMultipleOf4: + length=KMemMoveBadLength; + break; + } + Mem::Move(trg,src,length); + return KErrNone; + } +#endif //_DEBUG + +void testMemMove() + { + TText8 bufa[0x200]; + TText8 bufb[0x200]; + + TInt ii,jj,kk; + + test.Next(_L("Mem::Move()")); +// +// Test various copying lengths and alignments and src before/after trg +// + TInt length; + TChar a55(0x55); + TChar aAA(0xaa); + + TUint8* addr; + + for(ii=0;ii<512;ii+=24) + { + for(jj=0;jj<512;jj+=24) + { + length=Min(512-jj,512-ii); + + Mem::Fill(&bufa[0],512,a55); + Mem::Fill(&bufb[0],512,aAA); + + addr=Mem::Move(&bufa[ii],&bufb[jj],length); + + if(addr!=(&bufa[ii]+length)) + { + PrintInfo(bufb,bufa); + test.Printf(_L("Mem::Copy returned incorrect address for %d bytes\n"),length); + failed=KErrGeneral; + //test.Getch(); + return; + } + + for(kk=0;kk<512;kk++) + { + if(kk=ii && kk<(ii+length) && bufa[kk]!=0xaa) + { + PrintInfo(bufb,bufa); + test.Printf(_L("Mem::Move failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + if(kk>=(ii+length) && bufa[kk]!=0x55) + { + PrintInfo(bufb,bufa); + test.Printf(_L("Mem::Move failed copying %d bytes from bufb[%d] to bufa[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + } + + Mem::Fill(&bufa[0],512,a55); + Mem::Fill(&bufb[0],512,aAA); + + length=Min(512-jj,512-ii); + + addr=Mem::Move(&bufb[ii],&bufa[jj],length); + + if(addr!=(&bufb[ii]+length)) + { + PrintInfo(bufa,bufb); + test.Printf(_L("Mem::Copy returned incorrect address for %d bytes\n"),length); + failed=KErrGeneral; + //test.Getch(); + return; + } + + for(kk=0;kk<512;kk++) + { + if(kk=ii && kk<(ii+length) && bufb[kk]!=0x55) + { + PrintInfo(bufa,bufb); + test.Printf(_L("Mem::Move failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + if(kk>=(ii+length) && bufb[kk]!=0xaa) + { + PrintInfo(bufa,bufb); + test.Printf(_L("Mem::Move failed copying %d bytes from bufa[%d] to bufb[%d] at byte %d\n"),length,jj,ii,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + } + }; + } +#if defined(_DEBUG) && defined(__CPU_ARM) + // + // Test wordmove asserts. Source and target addresses are word aligned, + // and length is a multiple of the word size. + // Test asserts (debug build only) + // + RThread clientThread; + TRequestStatus status(KRequestPending); + + User::SetJustInTime(EFalse); + test.Next(_L("Mem::Move() - wordmove() valid call")); + test(clientThread.Create(_L("MemMovePanic - Valid"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveValid)==KErrNone); + clientThread.Logon(status); + clientThread.Resume(); + User::WaitForRequest(status); + test(clientThread.ExitType()==EExitKill); + test(clientThread.ExitReason()==KErrNone); + clientThread.Close(); + status=KRequestPending; + test.Next(_L("Mem::Move() - wordmove() source alignment")); + test(clientThread.Create(_L("MemMovePanic - SrcAlign"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveSourceNotAligned)==KErrNone); + clientThread.Logon(status); + clientThread.Resume(); + User::WaitForRequest(status); + test(clientThread.ExitType()==EExitPanic); + test(clientThread.ExitReason()==EWordMoveSourceNotAligned); + clientThread.Close(); + status=KRequestPending; + test.Next(_L("Mem::Move() - wordmove() target alignment")); + test(clientThread.Create(_L("MemMovePanic - TrgAlign"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveTargetNotAligned)==KErrNone); + clientThread.Logon(status); + clientThread.Resume(); + User::WaitForRequest(status); + test(clientThread.ExitType()==EExitPanic); + test(clientThread.ExitReason()==EWordMoveTargetNotAligned); + clientThread.Close(); + status=KRequestPending; + test.Next(_L("Mem::Move() - wordmove() length word multiple")); + test(clientThread.Create(_L("MemMovePanic - LengthMultiple"),MemMoveClient,KDefaultStackSize,0x2000,0x2000,(TAny*)EMemMoveLengthNotMultipleOf4)==KErrNone); + clientThread.Logon(status); + clientThread.Resume(); + User::WaitForRequest(status); + test(clientThread.ExitType()==EExitPanic); + test(clientThread.ExitReason()==EWordMoveLengthNotMultipleOf4); + clientThread.Close(); + User::SetJustInTime(ETrue); +#endif //_DEBUG + } + +void testMemFill() + { + + TText8 bufa[0x200]; + + TInt ii,jj,kk,pos,length; + + test.Next(_L("Mem::Fill()")); + + TChar a55(0x55); + TChar aAA(0xaa); + + for(ii=0;ii<512-32;ii++) + { + for(jj=0;jj<32;jj++) + { + Mem::Fill(&bufa[0],512,aAA); + + pos=ii+jj; + length=512-32-ii; + + Mem::Fill(&bufa[pos],length,a55); + + for(kk=0;kk<512;kk++) + { + if(kk<(pos) && bufa[kk]!=0xaa) + { + test.Printf(_L("Mem::Fill failed filling %d bytes to bufa[%d] at byte %d (1)\n"),length,pos,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + if(kk>=(pos) && kk<(pos+length) && bufa[kk]!=0x55) + { + test.Printf(_L("Mem::Fill failed filling %d bytes to bufa[%d] at byte %d (2)\n"),length,pos,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + if(kk>=(pos+length) && bufa[kk]!=0xaa) + { + test.Printf(_L("Mem::Fill failed filling %d bytes to bufa[%d] at byte %d (3)\n"),length,pos,kk); + failed=KErrGeneral; + //test.Getch(); + return; + } + } + } + } + } + +void testMemSwap() + { + + test.Next(_L("Mem::Swap()")); + + TText8 bufa[0x200]; + TText8 bufb[0x200]; + + TInt ii,jj,kk; + + TInt length; + TChar a55(0x55); + TChar aAA(0xaa); + + for(ii=24;ii<496;ii+=5) + { + for(jj=24;jj<496;jj+=3) + { + length=Min(496-jj,496-ii); + + Mem::Fill(&bufa[0],512,a55); + Mem::Fill(&bufb[0],512,aAA); + + Mem::Swap(&bufa[ii],&bufb[jj],length); + + for(kk=0;kk<512;kk++) + { + if(kk=ii && kk<(ii+length) && bufa[kk]!=0xaa) + { + test.Printf(_L("Mem::Swap failed. bufa[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj); + failed=KErrGeneral; + //test.Getch(); + } + if(kk>=(ii+length) && bufa[kk]!=0x55) + { + test.Printf(_L("Mem::Swap failed. bufa[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj); + failed=KErrGeneral; + //test.Getch(); + } + if(kk=jj && kk<(jj+length) && bufb[kk]!=0x55) + { + test.Printf(_L("Mem::Swap failed. bufb[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj); + failed=KErrGeneral; + //test.Getch(); + } + if(kk>=(jj+length) && bufb[kk]!=0xaa) + { + test.Printf(_L("Mem::Swap failed. bufb[%d] contains wrong byte. Swap length=%d, ii=%d, jj=%d\n"),kk,length,ii,jj); + failed=KErrGeneral; + //test.Getch(); + } + } + } + } + } + +void testMemCompare() + { + + TText8 bufa[516]; + TText8 bufb[516]; + + test.Next(_L("Mem::Compare()")); + + TInt ii,jj,kk; + + TChar a55(0x55); + TChar a11(0x11); + TChar a99(0x99); + + TInt posi,posj,offi,offj,leni,lenj; + + for(ii=0;ii<512;ii+=2) + { + for(jj=0;jj<512;jj+=3) + { + Mem::Fill(&bufa[0],512,a55); + Mem::Fill(&bufb[0],512,a55); + + posi=(511+ii)/2; // get a position somewhere in the middle + posj=(511+jj)/2; + + bufa[posi]=0x12; + bufb[posj]=0x12; + + offi=posi-ii; + offj=posj-jj; + + leni=511-ii; + lenj=511-jj; +// +// Make sure that outside the compare range is different +// + Mem::Fill(&bufa[ii+leni],4,a11); + Mem::Fill(&bufb[jj+lenj],4,a99); + + kk=Mem::Compare(&bufa[ii],leni,&bufb[jj],lenj); + + if(offi==offj) // Wrong byte is at same offset + { + if(ii==jj) // Same lengths being compared, so should compare ok + { + if(kk!=0) + { + test.Printf(_L("%d returned when offi=%d, offj=%d, ii=%d, jj=%d\n"),kk,offi,offj,ii,jj); + test.Printf(_L("Should return zero\n")); + test.Printf(_L("bufa=%d,bufb=%d, leftl=%d, rightl=%d\n"),&bufa[ii],&bufb[jj],leni,lenj); + //test.Getch(); + failed=KErrGeneral; + } + } + else // Different lengths, so should return difference of lengths + { + if(kk!=leni-lenj) + { + test.Printf(_L("%d returned when offi=%d, offj=%d, ii=%d, jj=%d\n"),kk,offi,offj,ii,jj); + test.Printf(_L("Should return difference of the lengths\n")); + test.Printf(_L("bufa=%d,bufb=%d, leftl=%d, rightl=%d\n"),&bufa[ii],&bufb[jj],leni,lenj); + //test.Getch(); + failed=KErrGeneral; + } + } + } + if(offi!=offj) // Wrong byte at different offset + { + if(offi aBuf; + + test.Next(_L("Des::Num(EHex)")); + aBuf.Num(0x1b34a678,EHex); + if(aBuf!=_L("1b34a678")) + testFailed(_L("Des::Num(0x1b34a678,EHex)")); + else + { + aBuf.Num(0x1234,EHex); + if(aBuf!=_L("1234")) + testFailed(_L("Des::Num(0x1234,EHex)")); + } + + test.Next(_L("Des::Num(EDecimal)")); + aBuf.Num(7462521,EDecimal); + if(aBuf!=_L("7462521")) + testFailed(_L("Des::Num(7462521,EDecimal)")); + else + { + aBuf.Num(1234,EDecimal); + if(aBuf!=_L("1234")) + testFailed(_L("Des::Num(1234,EDecimal)")); + } + + test.Next(_L("Des::Num(EOctal)")); + + aBuf.Num(03521,EOctal); + if(aBuf!=_L("3521")) + testFailed(_L("Des::Num(03521,EOctal)")); + else + { + aBuf.Num(0706321,EOctal); + if(aBuf!=_L("706321")) + testFailed(_L("Des::Num(0706321,EOctal)")); + } + + test.Next(_L("Des::Num(EBinary)")); + aBuf.Num(0x92074625,EBinary); + if(aBuf!=_L("10010010000001110100011000100101")) + { + testFailed(_L("Des::Num(0x92074625,EBinary)")); + } + else + { + aBuf.Num(0x4625,EBinary); + if(aBuf!=_L("100011000100101")) + testFailed(_L("Des::Num(0x4625,EBinary)")); + } + } + +void testDesNumUC() + { + + TBuf<36> aBuf; + + test.Next(_L("Des::NumUC(EHex)")); + aBuf.NumUC(0x1b3ca678,EHex); + if(aBuf!=_L("1B3CA678")) + testFailed(_L("Des::NumUC(0x1b3ca678,EHex)")); + else + { + aBuf.NumUC(0x89abcdef,EHex); + if(aBuf!=_L("89ABCDEF")) + testFailed(_L("Des::NumUC(0x89abcdef,EHex)")); + } + + test.Next(_L("Des::NumUC(EDecimal)")); + aBuf.NumUC(7462521,EDecimal); + if(aBuf!=_L("7462521")) + testFailed(_L("Des::NumUC(7462521,EDecimal)")); + else + { + aBuf.NumUC(1234,EDecimal); + if(aBuf!=_L("1234")) + testFailed(_L("Des::NumUC(1234,EDecimal)")); + } + + test.Next(_L("Des::NumUC(EOctal)")); + + aBuf.NumUC(03521,EOctal); + if(aBuf!=_L("3521")) + testFailed(_L("Des::NumUC(03521,EOctal)")); + else + { + aBuf.NumUC(0706321,EOctal); + if(aBuf!=_L("706321")) + testFailed(_L("Des::NumUC(0706321,EOctal)")); + } + + test.Next(_L("Des::NumUC(EBinary)")); + aBuf.NumUC(0x92074625,EBinary); + if(aBuf!=_L("10010010000001110100011000100101")) + { + testFailed(_L("Des::NumUC(0x92074625,EBinary)")); + } + else + { + aBuf.NumUC(0x4625,EBinary); + if(aBuf!=_L("100011000100101")) + testFailed(_L("Des::NumUC(0x4625,EBinary)")); + } + } + +void testDivTen(TInt aInc) +// +// Always pass aInc as zero. It's just there to stop the compiler +// optimising the a=a/10 statements out for you. They must be +// worked out by the operating system at runtime. +// + { + + TUint a=68417814+aInc; // some random unsigned number + TInt b=-48910759+aInc; // some random signed negative number + TInt c=2147483647+aInc; // maximum positive number + TUint d=3147484647u+aInc; // high positive unsigned number + + TUint ar=68417814/10; + TInt br=-48910759/10; + TInt cr=2147483647/10; + TUint dr=3147484647u/10; + + a=a/10; + b=b/10; + c=c/10; + d=d/10; + + test.Next(_L("Integer divide by 10")); + + if(a!=ar) + { + test.Printf(_L("68417814/10 gives %u\n"),a); + failed=KErrGeneral; + } + if(b!=br) + { + test.Printf(_L("-48910759/10 gives %d\n"),b); + failed=KErrGeneral; + } + if(c!=cr) + { + test.Printf(_L("2147483647/10 gives %d\n"),c); + failed=KErrGeneral; + } + if(d!=dr) + { + test.Printf(_L("3147484647/10 gives %u\n"),d); + failed=KErrGeneral; + } + } + +void testDivSeven(TInt aInc) +// +// Always pass aInc as zero. It's just there to stop the compiler +// optimising the a=a/7 statements out for you. They must be +// worked out by the operating system at runtime. +// + { + + TUint a=68417814+aInc; // some random unsigned number + TInt b=-48910759+aInc; // some random signed negative number + TInt c=2147483647+aInc; // maximum positive number + TUint d=3147484647u+aInc; // high positive unsigned number + + TUint ar=68417814/7; + TInt br=-48910759/7; + TInt cr=2147483647/7; + TUint dr=3147484647u/7; + + a=a/7; + b=b/7; + c=c/7; + d=d/7; + + test.Next(_L("Integer divide by 7")); + + if(a!=ar) + { + test.Printf(_L("68417814/7 gives %u\n"),a); + failed=KErrGeneral; + } + if(b!=br) + { + test.Printf(_L("-48910759/7 gives %d\n"),b); + failed=KErrGeneral; + } + if(c!=cr) + { + test.Printf(_L("2147483647/7 gives %d\n"),c); + failed=KErrGeneral; + } + if(d!=dr) + { + test.Printf(_L("3147484647/7 gives %u\n"),d); + failed=KErrGeneral; + } + } + +void testDivFive(TInt aInc) +// +// Always pass aInc as zero. It's just there to stop the compiler +// optimising the a=a/5 statements out for you. They must be +// worked out by the operating system at runtime. +// + { + + TUint a=68417814+aInc; // some random unsigned number + TInt b=-48910759+aInc; // some random signed negative number + TInt c=2147483647+aInc; // maximum positive number + TUint d=3147484647u+aInc; // high positive unsigned number + + TUint ar=68417814/5; + TInt br=-48910759/5; + TInt cr=2147483647/5; + TUint dr=3147484647u/5; + + a=a/5; + b=b/5; + c=c/5; + d=d/5; + + test.Next(_L("Integer divide by 5")); + + if(a!=ar) + { + test.Printf(_L("68417814/5 gives %u\n"),a); + failed=KErrGeneral; + } + if(b!=br) + { + test.Printf(_L("-48910759/5 gives %d\n"),b); + failed=KErrGeneral; + } + if(c!=cr) + { + test.Printf(_L("2147483647/5 gives %d\n"),c); + failed=KErrGeneral; + } + if(d!=dr) + { + test.Printf(_L("3147484647/5 gives %u\n"),d); + failed=KErrGeneral; + } + } + +void testDivSixteen(TInt aInc) +// +// Always pass aInc as zero. It's just there to stop the compiler +// optimising the a=a/16 statements out for you. They must be +// worked out by the operating system at runtime. +// + { + + TUint a=68417814+aInc; // some random unsigned number + TInt b=-48910759+aInc; // some random signed negative number + TInt c=2147483647+aInc; // maximum positive number + TUint d=3147484647u+aInc; // high positive unsigned number + + TUint ar=68417814/16; + TInt br=-48910759/16; + TInt cr=2147483647/16; + TUint dr=3147484647u/16; + + a=a/16; + b=b/16; + c=c/16; + d=d/16; + + test.Next(_L("Integer divide by 16")); + + if(a!=ar) + { + test.Printf(_L("68417814/16 gives %u\n"),a); + failed=KErrGeneral; + } + if(b!=br) + { + test.Printf(_L("-48910759/16 gives %d\n"),b); + failed=KErrGeneral; + } + if(c!=cr) + { + test.Printf(_L("2147483647/16 gives %d\n"),c); + failed=KErrGeneral; + } + if(d!=dr) + { + test.Printf(_L("3147484647/16 gives %u\n"),d); + failed=KErrGeneral; + } + } + +void testModulo(TInt aInc) + { + + test.Next(_L("Integer modulo")); + + TInt ii,kk; + + for(kk=1;kk<32;kk++) + { + for(ii=0;ii + +LOCAL_D RTest test(_L("T_GRAPH")); + +class TestTPoint + { +public: + TestTPoint(TInt x1,TInt y1,TInt x2,TInt y2,TInt x3,TInt y3,TInt x4,TInt y4); + void TestSet(); + void TestAdd(); + void TestSub(); + void TestUnaryMinus(); +private: + TInt iX1; + TInt iY1; + TInt iX2; + TInt iY2; + TInt iX3; + TInt iY3; + TInt iX4; + TInt iY4; + }; + +class TestTSize + { +public: + TestTSize(TInt wid1,TInt hgt1,TInt wid2,TInt hgt2,TInt wid3,TInt hgt3,TInt wid4,TInt hgt4); + void TestSet(); + void TestAdd(); + void TestSub(); + void TestUnaryMinus(); +private: + TInt iWidth1; + TInt iHeight1; + TInt iWidth2; + TInt iHeight2; + TInt iWidth3; + TInt iHeight3; + TInt iWidth4; + TInt iHeight4; + }; + +class TestTRect + { +public: + TestTRect(TInt tlx1,TInt tly1,TInt brx1,TInt bry1, + TInt tlx2,TInt tly2,TInt brx2,TInt bry2, + TInt tlx3,TInt tly3,TInt brx3,TInt bry3); + void TestSet(); + void TestMove(); + void TestResize(); + void TestShrink(); + void TestGrow(); + void TestBoundingRect(); + void TestIsEmpty(); + void TestIntersects(); + void TestIntersection(); + void TestNormalize(); + void TestContains(); + void TestCenter(); +private: + TInt iTlx1; + TInt iTly1; + TInt iBrx1; + TInt iBry1; + TInt iTlx2; + TInt iTly2; + TInt iBrx2; + TInt iBry2; + TInt iTlx3; + TInt iTly3; + TInt iBrx3; + TInt iBry3; + }; + +class TestTPoint3D + { +public: + TestTPoint3D(TInt x1,TInt y1,TInt z1,TInt x2,TInt y2,TInt z2,TInt x3,TInt y3,TInt z3,TInt x4,TInt y4,TInt z4); + void TestSet(); + void TestAdd(); + void TestSub(); + void TestUnaryMinus(); +private: + TInt iX1; + TInt iY1; + TInt iZ1; + TInt iX2; + TInt iY2; + TInt iZ2; + TInt iX3; + TInt iY3; + TInt iZ3; + TInt iX4; + TInt iY4; + TInt iZ4; + + }; + +////////////////////////////////////////////////////////////////////////////// +// Point test code // +////////////////////////////////////////////////////////////////////////////// + +TestTPoint::TestTPoint(TInt x1,TInt y1,TInt x2,TInt y2,TInt x3,TInt y3,TInt x4,TInt y4) + { + iX1=x1; + iY1=y1; + iX2=x2; + iY2=y2; + iX3=x3; + iY3=y3; + iX4=x4; + iY4=y4; + } + +void TestTPoint::TestSet() + { + TSize s1(iX3,iY3); + TPoint p1(iX1,iY1); + TPoint p2(iX2,iY2); + TPoint p3; + TPoint p4; + + test(p1.iX==iX1 && p1.iY==iY1); + test(p2.iX==iX2 && p2.iY==iY2); + test(p4.iX==0 && p4.iY==0); + + p3.iX=iX3; + p3.iY=iY3; + test(p3.iX==iX3 && p3.iY==iY3); + test(p3.AsSize()==s1); + + p4.SetXY(iX4,iY4); + test(p4.iX==iX4 && p4.iY==iY4); + + p1=p4; + test(p1==p4); + test(p1.iX==p4.iX && p1.iY==p4.iY); + + p3=p2; + test(p3==p2); + test(p3.iX==p2.iX && p3.iY==p2.iY); + + p1=p4; + p1.iX++; + test(p1!=p4); + p1=p4; + p1.iY++; + test(p1!=p4); + } + +void TestTPoint::TestAdd() + { + TSize s1(iX3,iY3); + TPoint p1(iX1,iY1); + TPoint p2(iX2,iY2); + TPoint p3(iX3,iY3); + TPoint p4(iX4,iY4); + TPoint px; + + p1+=p2; + test(p1.iX==(p2.iX+iX1) && p1.iY==(p2.iY+iY1)); + px=p3=p1+p2; + test(p3.iX==(p1.iX+p2.iX) && p3.iY==(p1.iY+p2.iY)); + test(p3==(p1+p2)); + test(px==p3); + px=p4+=p1; + test(p4.iX==(p1.iX+iX4) && p4.iY==(p1.iY+iY4)); + test(px==p4); + + px=p1; + p1+=s1; + test(p1.iX==(px.iX+s1.iWidth) && p1.iY==(px.iY+s1.iHeight)); + p2=px+s1; + test(p2==p1); + } + +void TestTPoint::TestSub() + { + TSize s1(iX3,iY3); + TPoint p1(iX1,iY1); + TPoint p2(iX2,iY2); + TPoint p3(iX3,iY3); + TPoint p4(iX4,iY4); + TPoint px; + + p1-=p2; + test(p1.iX==(iX1-p2.iX) && p1.iY==(iY1-p2.iY)); + px=p3=p1-p2; + test(p3.iX==(p1.iX-p2.iX) && p3.iY==(p1.iY-p2.iY)); + test(p3==(p1-p2)); + test(px==p3); + px=p4-=p1; + test(p4.iX==(iX4-p1.iX) && p4.iY==(iY4-p1.iY)); + test(px==p4); + + px=p1; + p1-=s1; + test(p1.iX==(px.iX-s1.iWidth) && p1.iY==(px.iY-s1.iHeight)); + p2=px-s1; + test(p2==p1); + } + +void TestTPoint::TestUnaryMinus() + { + TPoint p1(iX1,iY1); + TPoint p2(iX2,iY2); + TPoint p3(iX3,iY3); + TPoint p4(iX4,iY4); + + TPoint p=-p1; + test (p==TPoint(-iX1,-iY1)); + p=-p2; + test (p==TPoint(-iX2,-iY2)); + p=-p3; + test (p==TPoint(-iX3,-iY3)); + p=-p4; + test (p==TPoint(-iX4,-iY4)); + } + +////////////////////////////////////////////////////////////////////////////// +// Size test code // +////////////////////////////////////////////////////////////////////////////// + +TestTSize::TestTSize(TInt x1,TInt y1,TInt x2,TInt y2,TInt x3,TInt y3,TInt x4,TInt y4) + { + iWidth1=x1; + iHeight1=y1; + iWidth2=x2; + iHeight2=y2; + iWidth3=x3; + iHeight3=y3; + iWidth4=x4; + iHeight4=y4; + } + +void TestTSize::TestSet() + { + TPoint p1(iWidth3,iHeight3); + TSize s1(iWidth1,iHeight1); + TSize s2(iWidth2,iHeight2); + TSize s3; + TSize s4; + + test(s1.iWidth==iWidth1 && s1.iHeight==iHeight1); + test(s2.iWidth==iWidth2 && s2.iHeight==iHeight2); + test(s4.iWidth==0 && s4.iHeight==0); + + s3.iWidth=iWidth3; + s3.iHeight=iHeight3; + test(s3.iWidth==iWidth3 && s3.iHeight==iHeight3); + test(s3.AsPoint()==p1); + + s4.SetSize(iWidth4,iHeight4); + test(s4.iWidth==iWidth4 && s4.iHeight==iHeight4); + + s1=s4; + test(s1==s4); + test(s1.iWidth==s4.iWidth && s1.iHeight==s4.iHeight); + s3=s2; + test(s3==s2); + test(s3.iWidth==s2.iWidth && s3.iHeight==s2.iHeight); + + s1=s4; + s1.iWidth++; + test(s1!=s4); + s1=s4; + s1.iHeight++; + test(s1!=s4); + } + +void TestTSize::TestAdd() + { + TPoint p1(iWidth3,iHeight3); + TSize s1(iWidth1,iHeight1); + TSize s2(iWidth2,iHeight2); + TSize s3(iWidth3,iHeight3); + TSize s4(iWidth4,iHeight4); + TSize sx; + + s1+=s2; + test(s1.iWidth==(s2.iWidth+iWidth1) && s1.iHeight==(s2.iHeight+iHeight1)); + sx=s3=s1+s2; + test(s3.iWidth==(s1.iWidth+s2.iWidth) && s3.iHeight==(s1.iHeight+s2.iHeight)); + test(s3==(s1+s2)); + test(sx==s3); + sx=s4+=s1; + test(s4.iWidth==(s1.iWidth+iWidth4) && s4.iHeight==(s1.iHeight+iHeight4)); + test(sx==s4); + + sx=s1; + s1+=p1; + test(s1.iWidth==(sx.iWidth+p1.iX) && s1.iHeight==(sx.iHeight+p1.iY)); + s2=sx+p1; + test(s1==s2); + } + +void TestTSize::TestSub() + { + TPoint p1(iWidth3,iHeight3); + TSize s1(iWidth1,iHeight1); + TSize s2(iWidth2,iHeight2); + TSize s3(iWidth3,iHeight3); + TSize s4(iWidth4,iHeight4); + TSize sx; + + s1-=s2; + test(s1.iWidth==(iWidth1-s2.iWidth) && s1.iHeight==(iHeight1-s2.iHeight)); + sx=s3=s1-s2; + test(s3.iWidth==(s1.iWidth-s2.iWidth) && s3.iHeight==(s1.iHeight-s2.iHeight)); + test(s3==(s1-s2)); + test(sx==s3); + sx=s4-=s1; + test(s4.iWidth==(iWidth4-s1.iWidth) && s4.iHeight==(iHeight4-s1.iHeight)); + test(sx==s4); + + sx=s1; + s1-=p1; + test(s1.iWidth==(sx.iWidth-p1.iX) && s1.iHeight==(sx.iHeight-p1.iY)); + s2=sx-p1; + test(s1==s2); + } + +void TestTSize::TestUnaryMinus() + { + TSize s1(iWidth1,iHeight1); + TSize s2(iWidth2,iHeight2); + TSize s3(iWidth3,iHeight3); + TSize s4(iWidth4,iHeight4); + + TSize s=-s1; + test (s==TSize(-iWidth1,-iHeight1)); + s=-s2; + test (s==TSize(-iWidth2,-iHeight2)); + s=-s3; + test (s==TSize(-iWidth3,-iHeight3)); + s=-s4; + test (s==TSize(-iWidth4,-iHeight4)); + } + +////////////////////////////////////////////////////////////////////////////// +// Rectangle test code // +////////////////////////////////////////////////////////////////////////////// + +TestTRect::TestTRect(TInt tlx1,TInt tly1,TInt brx1,TInt bry1, + TInt tlx2,TInt tly2,TInt brx2,TInt bry2, + TInt tlx3,TInt tly3,TInt brx3,TInt bry3) + { + iTlx1=tlx1; + iTly1=tly1; + iBrx1=brx1; + iBry1=bry1; + iTlx2=tlx2; + iTly2=tly2; + iBrx2=brx2; + iBry2=bry2; + iTlx3=tlx3; + iTly3=tly3; + iBrx3=brx3; + iBry3=bry3; + } + +void TestTRect::TestSet() + { + TSize s1(iTlx3,iTly3); + TPoint pTl(iTlx2,iTly2); + TPoint pBr(iBrx2,iBry2); + TRect r1(iTlx1,iTly1,iBrx1,iBry1); + TRect r2(pTl,pBr); + TRect r3; + TRect r4(pTl,s1); + + test(r1.iTl.iX==iTlx1 && r1.iTl.iY==iTly1 && r1.iBr.iX==iBrx1 && r1.iBr.iY==iBry1); + test(r2.iTl.iX==iTlx2 && r2.iTl.iY==iTly2 && r2.iBr.iX==iBrx2 && r2.iBr.iY==iBry2); + test(r2.iTl==pTl && r2.iBr==pBr); + test(r3.iTl.iX==0 && r3.iTl.iY==0 && r3.iBr.iX==0 && r3.iBr.iY==0); + test(r4.iTl==pTl && r4.iBr.iX==(pTl.iX+s1.iWidth) && r4.iBr.iY==(pTl.iY+s1.iHeight)); + + r3.iTl.iX=iTlx3; + r3.iTl.iY=iTly3; + r3.iBr.iX=iBrx3; + r3.iBr.iY=iBry3; + test(r3.iTl.iX==iTlx3 && r3.iTl.iY==iTly3 && r3.iBr.iX==iBrx3 && r3.iBr.iY==iBry3); + + r1.SetRect(iTlx2,iTly2,iBrx2,iBry2); + test(r1==r2); + + r2=r3; + test(r2==r3); + + pTl.SetXY(iTlx3,iTly3); + pBr.SetXY(iBrx3,iBry3); + r1.SetRect(pTl,pBr); + test(r1.iTl.iX==iTlx3 && r1.iTl.iY==iTly3 && r1.iBr.iX==iBrx3 && r1.iBr.iY==iBry3); + pTl.SetXY(iTlx2,iTly2); + r1.SetRect(pTl,s1); + test(r1==r4); + r4.iTl.iX++; + test(r1!=r4); + r4.iTl.iX--; + test(r1==r4); + r4.iTl.iY++; + test(r1!=r4); + r4.iTl.iY--; + test(r1==r4); + r4.iBr.iX++; + test(r1!=r4); + r4.iBr.iX--; + test(r1==r4); + r4.iBr.iY++; + test(r1!=r4); + + r4=TRect(0,0,0,0); + r4.SetWidth(r1.Size().iWidth); + test(r1.Size().iWidth==r4.Size().iWidth); + test(r4.Size().iHeight==0); + + r4.SetHeight(r1.Size().iHeight); + test(r1.Size().iHeight==r4.Size().iHeight); + test(r1.Size().iWidth==r4.Size().iWidth); + + r4=TRect(0,0,0,0); + r4.SetSize(r1.Size()); + test(r1.Size()==r4.Size()); + } + +void TestTRect::TestMove() + { + TPoint offs(iTlx2,iTly2); + TRect r1(iTlx1,iTly1,iBrx1,iBry1); + TRect rCheck,rTest; + + rCheck=r1; + rCheck.iTl+=offs; + rCheck.iBr+=offs; + + rTest=r1; + rTest.Move(offs); + test(rTest==rCheck); + + rTest=r1; + rTest.Move(offs.iX,offs.iY); + test(rTest==rCheck); + } + +void TestTRect::TestResize() + { + TSize resize(iTlx1,iTly1); + TRect rTest(iTlx2,iTly2,iBrx2,iBry2); + TRect rCheck; + + rCheck=rTest; + rTest.Resize(resize); + rCheck.iBr+=resize; + test(rTest==rCheck); + } + +void TestTRect::TestShrink() + { + TSize shrink(iTlx3,iTly3); + TRect r2(iTlx2,iTly2,iBrx2,iBry2); + TRect rCheck,rTest; + + rCheck=r2; + rCheck.iTl+=shrink; + rCheck.iBr-=shrink; + + rTest=r2; + rTest.Shrink(shrink); + test(rTest==rCheck); + + rTest=r2; + rTest.Shrink(shrink.iWidth,shrink.iHeight); + test(rTest==rCheck); + } + +void TestTRect::TestGrow() + { + TSize grow(iTlx3,iTly3); + TRect r2(iTlx2,iTly2,iBrx2,iBry2); + TRect rCheck,rTest; + + rCheck=r2; + rCheck.iTl-=grow; + rCheck.iBr+=grow; + + rTest=r2; + rTest.Grow(grow.iWidth,grow.iHeight); + test(rTest==rCheck); + + rTest=r2; + rTest.Grow(grow); + test(rTest==rCheck); + } + +void TestTRect::TestBoundingRect() + { + TRect r1(iTlx1,iTly1,iBrx1,iBry1); + TRect r2(iTlx2,iTly2,iBrx2,iBry2); + TRect r3(iTlx3,iTly3,iBrx3,iBry3); + TRect rCheck,rTest; + + rCheck=r1; + rCheck.iTl.iX=Min(r1.iTl.iX,r2.iTl.iX); + rCheck.iTl.iY=Min(r1.iTl.iY,r2.iTl.iY); + rCheck.iBr.iX=Max(r1.iBr.iX,r2.iBr.iX); + rCheck.iBr.iY=Max(r1.iBr.iY,r2.iBr.iY); + rTest=r1; + rTest.BoundingRect(r2); + test(rTest==rCheck); + + rCheck=r1; + rCheck.iTl.iX=Min(r1.iTl.iX,r3.iTl.iX); + rCheck.iTl.iY=Min(r1.iTl.iY,r3.iTl.iY); + rCheck.iBr.iX=Max(r1.iBr.iX,r3.iBr.iX); + rCheck.iBr.iY=Max(r1.iBr.iY,r3.iBr.iY); + rTest=r1; + rTest.BoundingRect(r3); + test(rTest==rCheck); + } + +void TestTRect::TestIsEmpty() + { + TRect f1(0,0,1,1); // f? should return false + TRect f2(-1,-1,0,0); + TRect f3(-2,-2,-1,-1); + TRect t1(0,0,1,0); // t? should return true + TRect t2(0,0,0,1); + TRect t3(0,0,-1,1); + TRect t4(0,0,1,-1); + TRect t5(-2,-2,-1,-3); + TRect t6(-2,-2,-3,-1); + + test(f1.IsEmpty()==FALSE); + test(f2.IsEmpty()==FALSE); + test(f3.IsEmpty()==FALSE); + test(t1.IsEmpty()==TRUE); + test(t2.IsEmpty()==TRUE); + test(t3.IsEmpty()==TRUE); + test(t4.IsEmpty()==TRUE); + test(t5.IsEmpty()==TRUE); + test(t6.IsEmpty()==TRUE); + } + +void TestTRect::TestIntersects() + { + test(TRect(-5,-10,5,10).Intersects(TRect(4,-10,10,10))==TRUE); + test(TRect(-5,-10,5,10).Intersects(TRect(5,-10,10,10))==FALSE); + test(TRect(-5,-10,5,10).Intersects(TRect(6,-10,10,10))==FALSE); + test(TRect(-5,-10,5,10).Intersects(TRect(-5, 9, 5,20))==TRUE); + test(TRect(-5,-10,5,10).Intersects(TRect(-5,10, 5,20))==FALSE); + test(TRect(-5,-10,5,10).Intersects(TRect(-5,11, 5,20))==FALSE); +// + test(TRect(4,-10,10,10).Intersects(TRect(-5,-10,5,10))==TRUE); + test(TRect(5,-10,10,10).Intersects(TRect(-5,-10,5,10))==FALSE); + test(TRect(6,-10,10,10).Intersects(TRect(-5,-10,5,10))==FALSE); + test(TRect(-5, 9, 5,20).Intersects(TRect(-5,-10,5,10))==TRUE); + test(TRect(-5,10, 5,20).Intersects(TRect(-5,-10,5,10))==FALSE); + test(TRect(-5,11, 5,20).Intersects(TRect(-5,-10,5,10))==FALSE); +// Empty rects, should all return FALSE + test(TRect(0,11, 5,11).Intersects(TRect(0,0,5,20))==FALSE); + test(TRect(1,10, 1,11).Intersects(TRect(0,0,5,20))==FALSE); + test(TRect(5,11, 5,11).Intersects(TRect(0,0,5,20))==FALSE); + } + +void TestTRect::TestIntersection() + { + TRect r1(iTlx1,iTly1,iBrx1,iBry1); + TRect r2(iTlx2,iTly2,iBrx2,iBry2); + TRect r3(iTlx3,iTly3,iBrx3,iBry3); + TRect rCheck,rTest; + + rCheck=r1; + rCheck.iTl.iX=Max(r1.iTl.iX,r2.iTl.iX); + rCheck.iTl.iY=Max(r1.iTl.iY,r2.iTl.iY); + rCheck.iBr.iX=Min(r1.iBr.iX,r2.iBr.iX); + rCheck.iBr.iY=Min(r1.iBr.iY,r2.iBr.iY); + rTest=r1; + rTest.Intersection(r2); + if (!rCheck.IsEmpty()) + test(rTest==rCheck); + + rCheck=r1; + rCheck.iTl.iX=Max(r1.iTl.iX,r3.iTl.iX); + rCheck.iTl.iY=Max(r1.iTl.iY,r3.iTl.iY); + rCheck.iBr.iX=Min(r1.iBr.iX,r3.iBr.iX); + rCheck.iBr.iY=Min(r1.iBr.iY,r3.iBr.iY); + rTest=r1; + rTest.Intersection(r3); + if (!rCheck.IsEmpty()) + test(rTest==rCheck); + + rCheck=r3; + rCheck.iTl.iX=Max(r3.iTl.iX,r2.iTl.iX); + rCheck.iTl.iY=Max(r3.iTl.iY,r2.iTl.iY); + rCheck.iBr.iX=Min(r3.iBr.iX,r2.iBr.iX); + rCheck.iBr.iY=Min(r3.iBr.iY,r2.iBr.iY); + rTest=r3; + rTest.Intersection(r2); + if (!rCheck.IsEmpty()) + test(rTest==rCheck); + } + +void TestTRect::TestNormalize() + { + TUint i; + TInt tmp; + TRect a[]={TRect(0,0,1,1),TRect(-1,0,0,-1),TRect(-2,2,-1,1),TRect(10,2,1,0), + TRect(-10,-20,-2,-1),TRect(0,0,10,0),TRect(20,1,20,2),TRect(10,10,10,10)}; + TBool aIsNormalized[]={TRUE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE}; + TRect tst,check; + + for(i=0;i<(sizeof(a)/sizeof(a[0]));i++) + { + check=tst=a[i]; + if (check.iTl.iX>check.iBr.iX) + { + tmp=check.iBr.iX; + check.iBr.iX=check.iTl.iX; + check.iTl.iX=tmp; + } + if (check.iTl.iY>check.iBr.iY) + { + tmp=check.iBr.iY; + check.iBr.iY=check.iTl.iY; + check.iTl.iY=tmp; + } + test(tst.IsNormalized()==aIsNormalized[i]); + tst.Normalize(); + test(tst.IsNormalized()==TRUE); + test(tst==check); + } + } + +void TestTRect::TestContains() + { + TPoint tl1(iTlx1,iTly1); + TPoint br1(iBrx1,iBry1); + TPoint tl2(iTlx2,iTly2); + TPoint br2(iBrx2,iBry2); + TPoint tl3(iTlx3,iTly3); + TPoint br3(iBrx3,iBry3); + TRect rect1(tl1,br1); + TRect rect2(tl2,br2); + TRect rect3(tl3,br3); + + rect1.Normalize(); + rect2.Normalize(); + rect3.Normalize(); + test(rect1.IsEmpty() || rect1.Contains(rect1.iTl)); + test(rect2.IsEmpty() || rect2.Contains(rect2.iTl)); + test(rect3.IsEmpty() || rect3.Contains(rect3.iTl)); + test(!rect1.Contains(rect1.iBr)); + test(!rect2.Contains(rect2.iBr)); + test(!rect3.Contains(rect3.iBr)); + TPoint pnt; + pnt.SetXY(rect1.iTl.iX,rect1.iBr.iY); + test(!rect1.Contains(pnt)); + pnt.SetXY(rect1.iBr.iX,rect1.iTl.iY); + test(!rect1.Contains(pnt)); + pnt=rect2.iTl; + if (rect2.iBr.iX>(rect2.iTl.iX+1) && rect2.iBr.iY>(rect2.iTl.iY+1)) + pnt+=TPoint(1,1); + test(rect2.Contains(pnt)); + } + +void TestTRect::TestCenter() + { + TRect rect[]={TRect(iTlx1,iTly1,iBrx1,iBry1),TRect(iTlx2,iTly2,iBrx2,iBry2),TRect(iTlx3,iTly3,iBrx3,iBry3)}; + + for(TUint i=0;i<(sizeof(rect)/sizeof(rect[0]));i++) + { + TRect& r=rect[i]; + TPoint center((r.iBr.iX+r.iTl.iX)/2,(r.iBr.iY+r.iTl.iY)/2); + test(center==r.Center()); + } + } + +////////////////////////////////////////////////////////////////////////////// +// 3DPoint test code // +////////////////////////////////////////////////////////////////////////////// +TestTPoint3D::TestTPoint3D(TInt x1,TInt y1,TInt z1,TInt x2,TInt y2,TInt z2,TInt x3,TInt y3,TInt z3,TInt x4,TInt y4,TInt z4) + { + iX1=x1; + iY1=y1; + iZ1=z1; + iX2=x2; + iY2=y2; + iZ2=z2; + iX3=x3; + iY3=y3; + iZ3=z3; + iX4=x4; + iY4=y4; + iZ4=z4; + } + + +void TestTPoint3D::TestSet() + { + + TPoint aPoint(iX3,iY3); + TPoint3D p3D1(iX1,iY1,iZ1); + TPoint3D p3D2(iX2,iY2,iZ2); + TPoint3D p3D3; + TPoint3D p3D4; + TPoint3D p3D5(aPoint); + + test(p3D1.iX==iX1 && p3D1.iY==iY1 && p3D1.iZ==iZ1); + test(p3D2.iX==iX2 && p3D2.iY==iY2 && p3D2.iZ==iZ2); + test(p3D4.iX==0 && p3D4.iY==0 && p3D4.iZ==0); + + p3D3.iX=iX3; + p3D3.iY=iY3; + p3D3.iZ=iZ3; + test(p3D3.iX==iX3 && p3D3.iY==iY3&& p3D3.iZ==iZ3); + test(p3D3.AsPoint()==aPoint); + test(p3D5.AsPoint()==p3D3.AsPoint()); + + + p3D4.SetXYZ(iX4,iY4,iZ4); + test(p3D4.iX==iX4 && p3D4.iY==iY4); + + p3D1=p3D4; + test(p3D1==p3D4); + test(p3D1.iX==p3D4.iX && p3D1.iY==p3D4.iY && p3D1.iZ==p3D4.iZ); + + p3D3=p3D2; + test(p3D3==p3D2); + test(p3D3.iX==p3D2.iX && p3D3.iY==p3D2.iY && p3D3.iZ==p3D2.iZ); + + p3D1=p3D4; + p3D1.iX++; + test(p3D1!=p3D4); + p3D1=p3D4; + p3D1.iY++; + test(p3D1!=p3D4); + } + + +void TestTPoint3D::TestAdd() + { + TPoint apoint(iX3,iY3); + TPoint3D p1(iX1,iY1,iZ1); + TPoint3D p2(iX2,iY2,iZ2); + TPoint3D p3(iX3,iY3,iZ3); + TPoint3D p4(iX4,iY4,iZ4); + TPoint3D px; + + p1+=p2; + test(p1.iX==(p2.iX+iX1) && p1.iY==(p2.iY+iY1)&& p1.iZ==(p2.iZ+iZ1)); + px=p3=p1+p2; + test(p3.iX==(p1.iX+p2.iX) && p3.iY==(p1.iY+p2.iY)&& p3.iZ==(p1.iZ+p2.iZ)); + test(p3==(p1+p2)); + test(px==p3); + px=p4+=p1; + test(p4.iX==(p1.iX+iX4) && p4.iY==(p1.iY+iY4)&& p4.iZ==(p1.iZ+iZ4)); + test(px==p4); + px=p1; + p1+=apoint; + //TPoint has no Z co-ordinate + test(p1.iX==(px.iX+apoint.iX) && p1.iY==(px.iY+apoint.iY) &&p1.iZ==px.iZ); + p2=px+apoint; + test(p2==p1); + } + +void TestTPoint3D::TestSub() + { + TPoint apoint(iX3,iY3); + TPoint3D p1(iX1,iY1,iZ1); + TPoint3D p2(iX2,iY2,iZ2); + TPoint3D p3(iX3,iY3,iZ3); + TPoint3D p4(iX4,iY4,iZ4); + TPoint3D px; + + p1-=p2; + test(p1.iX==(iX1-p2.iX) && p1.iY==(iY1-p2.iY)&& p1.iZ==(iZ1-p2.iZ)); + px=p3=p1-p2; + test(p3.iX==(p1.iX-p2.iX) && p3.iY==(p1.iY-p2.iY)&& p3.iZ==(p1.iZ-p2.iZ)); + test(p3==(p1-p2)); + test(px==p3); + px=p4-=p1; + test(p4.iX==(iX4-p1.iX) && p4.iY==(iY4-p1.iY)&& p4.iZ==(iZ4-p1.iZ)); + test(px==p4); + + px=p1; + p1-=apoint; + //TPoint has no Z co-ordinate + test(p1.iX==(px.iX-apoint.iX) && p1.iY==(px.iY-apoint.iY)&&p1.iZ==px.iZ); + p2=px-apoint; + test(p2==p1); + } + +void TestTPoint3D::TestUnaryMinus() + { + TPoint3D p1(iX1,iY1,iZ1); + TPoint3D p2(iX2,iY2,iZ2); + TPoint3D p3(iX3,iY3,iZ3); + TPoint3D p4(iX4,iY4,iZ4); + TPoint3D p=-p1; + test (p==TPoint3D(-iX1,-iY1,-iZ1)); + p=-p2; + test (p==TPoint3D(-iX2,-iY2,-iZ2)); + p=-p3; + test (p==TPoint3D(-iX3,-iY3,-iZ3)); + p=-p4; + test (p==TPoint3D(-iX4,-iY4,-iZ4)); + } + +////////////////////////////////////////////////////////////////////////////// +// Top level test code // +////////////////////////////////////////////////////////////////////////////// + +LOCAL_C void test_point(TestTPoint t) + { + test.Start(_L("Setting values")); + t.TestSet(); + test.Next(_L("Addition")); + t.TestAdd(); + test.Next(_L("Subtraction")); + t.TestSub(); + test.Next(_L("Unary minus")); + t.TestUnaryMinus(); + test.End(); + } + +LOCAL_C void test_size(TestTSize t) + { + test.Start(_L("Setting values")); + t.TestSet(); + test.Next(_L("Addition")); + t.TestAdd(); + test.Next(_L("Subtraction")); + t.TestSub(); + test.Next(_L("Unary minus")); + t.TestUnaryMinus(); + test.End(); + } + +LOCAL_C void test_rect(TestTRect t) + { + test.Start(_L("Setting values")); + t.TestSet(); + test.Next(_L("Offset")); + t.TestMove(); + test.Next(_L("Resize")); + t.TestResize(); + test.Next(_L("Grow")); + t.TestGrow(); + test.Next(_L("Shrink")); + t.TestShrink(); + test.Next(_L("BoundingRect")); + t.TestBoundingRect(); + test.Next(_L("IsEmpty")); + t.TestIsEmpty(); + test.Next(_L("Intersects")); + t.TestIntersects(); + test.Next(_L("Intersection")); + t.TestIntersection(); + test.Next(_L("Normalize")); + t.TestNormalize(); + test.Next(_L("Contains")); + t.TestContains(); + test.Next(_L("Center")); + t.TestCenter(); + test.End(); + } + + +LOCAL_C void test_3Dpoint(TestTPoint3D t) + { + test.Start(_L("Setting values")); + t.TestSet(); + test.Next(_L("Addition")); + t.TestAdd(); + test.Next(_L("Subtraction")); + t.TestSub(); + test.Next(_L("Unary minus")); + t.TestUnaryMinus(); + test.End(); + } + +GLDEF_C TInt E32Main() + { +// + + + test.Title(); +// +// Test the TPoint type. +// + TestTPoint tp1(1,2, 3,5, 8,13, 20,33); + TestTPoint tp2(10,-12, -55,29, -222,-666, 0,0); + TestTPoint tp3(345678,10, -9,987654, -1234567,-9876543, 222222,33333); + TestTPoint tp4(-1,-2,-3,-4,-5,-6,-7,-8); + TestTPoint tp5(0,0, 1000000,0, 0,2000000, 3000000,4000000); +// + test.Start(_L("class TPoint 1")); + test_point(tp1); + test.Next(_L("class TPoint 2")); + test_point(tp2); + test.Next(_L("class TPoint 3")); + test_point(tp3); + test.Next(_L("class TPoint 4")); + test_point(tp4); + test.Next(_L("class TPoint 5")); + test_point(tp5); +// +// Test the TSize type. +// + TestTSize sp1(5,4, 9,5, 17,33, 44,75); + TestTSize sp2(12,-10, -29,55, -666,-222, 0,0); + TestTSize sp3(456789,20, -3,876543, -2345678,-8765432, 33333,11111); + TestTSize sp4(-1,-2,-3,-4,-5,-6,-7,-8); + TestTSize sp5(0,0, 2000000,0, 0,3000000, 1000000,6000000); +// + test.Next(_L("class TSize 1")); + test_size(sp1); + test.Next(_L("class TSize 2")); + test_size(sp2); + test.Next(_L("class TSize 3")); + test_size(sp3); + test.Next(_L("class TSize 4")); + test_size(sp4); + test.Next(_L("class TSize 5")); + test_size(sp5); +// +// TRect tests +// + TestTRect tr1(0,0,1,2, 10,20,14,19, 33,11,44,55); + TestTRect tr2(-10,-20,11,22, -100,-200,-90,-199, 3000,1100,-4400,-5500); + TestTRect tr3(0,0,0,0, 1,1,2,2, -1,-1,0,0); +// + test.Next(_L("class TRect 1")); + test_rect(tr1); + test.Next(_L("class TRect 2")); + test_rect(tr2); + test.Next(_L("class TRect 3")); + test_rect(tr3); +// +// +// Test the TPoint3D type. +// + TestTPoint3D t3dp1(1,2,3, 4,5,6, 7 ,8,9, 10,11,12); + TestTPoint3D t3dp2(28,-12,75, -55,-98, -222, -788,-666,-155, 0,0,0); + TestTPoint3D t3dp3(89823,-45,12121,-78454,345678,10, -9,987654, -1234567,-9876543, 222222,33333); + TestTPoint3D t3dp4(-12,-32,-53,-84,-95,-456,-467,-4658,-45,-908,-65,-908); + TestTPoint3D t3dp5(0,0,0, 23,1000000,0,10677,-3,2000000, 3000000,4000000,501); + + // + test.Start(_L("class TPoint3D 1")); + test_3Dpoint(t3dp1); + test.Next(_L("class TPoint3D 2")); + test_3Dpoint(t3dp2); + test.Next(_L("class TPoint3D 3")); + test_3Dpoint(t3dp3); + test.Next(_L("class TPoint3D 4")); + test_3Dpoint(t3dp4); + test.Next(_L("class TPoint3D 5")); + test_3Dpoint(t3dp5); + // + test.Printf(_L("T_GRAPH: TEST Successfully Completed \n")); + test.End(); + test.Close(); + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_hashtab.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_hashtab.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2439 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test/buffer/t_hashtab.cpp +// +// + +#include +#include +#include + +#if defined(__VC32__) || defined(__CW32__) +typedef unsigned short wch; +#else +typedef wchar_t wch; +#endif + + +RTest test(_L("T_HASHTAB")); +TInt NanoTickPeriod; + +typedef TBuf8<80> TTestName; +typedef RHashSet TIntSet; +typedef RHashSet TNameSet; +typedef RPtrHashSet TStringSet8; +typedef RPtrHashSet TStringSet16; +typedef RPtrHashMap TStringMap8; +typedef RPtrHashMap TStringMap16; + +#define INTSET(x) TIntSet x +#define NAMESET(x) TNameSet x(&HashTestName, &TestNameIdentity) +#define STRSET8(x) TStringSet8 x +#define STRSET16(x) TStringSet16 x +#define STRMAP8(x) TStringMap8 x +#define STRMAP16(x) TStringMap16 x + +RPointerArray DesC8Array; +RPointerArray DesC16Array; + +class HashTest : public RHashTableBase + { +public: + HashTest() : RHashTableBase(0,0,0,0) {} + using RHashTableBase::ConsistencyCheck; + using RHashTableBase::Count; + }; + +void CCheck(RHashTableBase& aHT) + { + TUint32 ci[1024]; + TUint32 dc; + TUint32 cmp; + HashTest* h = (HashTest*)&aHT; + h->ConsistencyCheck(&dc, &cmp, 1024, ci); + test.Printf(_L("Count = %d, Deleted = %d, Cmp = %d\n"), h->Count(), dc, cmp); + TInt i; + for (i=0; i<1024; ++i) + { + if (ci[i]) + test.Printf(_L("%d chains of length %d\n"), ci[i], i); + } + } + +const char* Numbers[] = + { + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "ten", + "eleven", + "twelve", + "thirteen", + "fourteen", + "fifteen", + "sixteen", + "seventeen", + "eighteen", + "nineteen", + "twenty", + "thirty", + "forty", + "fifty", + "sixty", + "seventy", + "eighty", + "ninety", + "hundred", + "thousand" + }; + +TTestName NumberInWords(const TInt& aNum) + { + TInt a = aNum; + TTestName n; + if (a<20) + { + n.Copy((const TUint8*)Numbers[a]); + return n; + } + if (a<100) + { + TInt tens = a/10; + TInt units = a%10; + n.Copy((const TUint8*)Numbers[tens-2+20]); + if (units) + { + n.Append(' '); + n.Append(TPtrC8((const TUint8*)Numbers[units])); + } + return n; + } + if (a<1000) + { + TInt h = a/100; + n.Copy((const TUint8*)Numbers[h]); + n.Append(' '); + n.Append(TPtrC8((const TUint8*)Numbers[28])); + a%=100; + if (a) + { + TTestName n2(NumberInWords(a)); + n.Append(_L8(" and ")); + n+=n2; + } + return n; + } + TInt t = a/1000; + n = NumberInWords(t); + n.Append(' '); + n.Append(TPtrC8((const TUint8*)Numbers[29])); + a%=1000; + if (a) + { + TTestName n2(NumberInWords(a)); + if (a<100) + n.Append(_L8(" and ")); + else + n.Append(' '); + n+=n2; + } + return n; + } + +void PrintNumberInWords(TInt a) + { + TBuf<256> buf; + TTestName n(NumberInWords(a)); + buf.Copy(n); + test.Printf(_L("%d: %S\n"), a, &buf); + } + +TUint32 HashTestName(const TTestName& aN) + { + return DefaultHash::Des8(aN); + } + +TBool TestNameIdentity(const TTestName& aA, const TTestName& aB) + { + return aA == aB; + } + +/****************************************************************************** + * Utility functions for RHashSet + ******************************************************************************/ +template +void Union(RHashSet& aD, const RHashSet& aS) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + typename RHashSet::TIter iS(aS); + FOREVER + { + const T* p = iS.Next(); + if (!p) + break; + --c2; + TInt r = aD.Insert(*p); + test(r==KErrNone); + ++d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + } + +template +void Subtract(RHashSet& aD, const RHashSet& aS) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + TInt nfd = 0; + typename RHashSet::TIter iS(aS); + FOREVER + { + const T* p = iS.Next(); + if (!p) + break; + --c2; + TInt r = aD.Remove(*p); + test(r==KErrNone || r==KErrNotFound); + if (r==KErrNotFound) + ++nfd; + else + --d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + test( (d0-d1) + nfd == c); + } + +template +void Intersect(RHashSet& aD, const RHashSet& aS) + { + typename RHashSet::TIter iD(aD); + FOREVER + { + const T* p = iD.Next(); + if (!p) + break; + if (!aS.Find(*p)) + iD.RemoveCurrent(); + } + } + +template +void CheckIdentical(const RHashSet& aA, const RHashSet& aB) + { + test(aA.Count()==aB.Count()); + TInt c = aA.Count(); + typename RHashSet::TIter iA(aA); + FOREVER + { + const T* p = iA.Next(); + if (!p) + break; + --c; + test(aB.Find(*p)!=0); + } + test(c==0); + c = aA.Count(); + typename RHashSet::TIter iB(aB); + FOREVER + { + const T* p = iB.Next(); + if (!p) + break; + --c; + test(aA.Find(*p)!=0); + } + test(c==0); + } + + +/****************************************************************************** + * Utility functions for RPtrHashSet + ******************************************************************************/ +template +void Union(RPtrHashSet& aD, const RPtrHashSet& aS) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + typename RPtrHashSet::TIter iS(aS); + FOREVER + { + const T* p = iS.Next(); + if (!p) + break; + --c2; + TInt r = aD.Insert(p); + test(r==KErrNone); + ++d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + } + +template +void Subtract(RPtrHashSet& aD, const RPtrHashSet& aS) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + TInt nfd = 0; + typename RPtrHashSet::TIter iS(aS); + FOREVER + { + const T* p = iS.Next(); + if (!p) + break; + --c2; + TInt r = aD.Remove(p); + test(r==KErrNone || r==KErrNotFound); + if (r==KErrNotFound) + ++nfd; + else + --d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + test( (d0-d1) + nfd == c); + } + +template +void Intersect(RPtrHashSet& aD, const RPtrHashSet& aS) + { + typename RPtrHashSet::TIter iD(aD); + FOREVER + { + const T* p = iD.Next(); + if (!p) + break; + if (!aS.Find(*p)) + iD.RemoveCurrent(); + } + } + +template +void CheckIdentical(const RPtrHashSet& aA, const RPtrHashSet& aB) + { + test(aA.Count()==aB.Count()); + TInt c = aA.Count(); + typename RPtrHashSet::TIter iA(aA); + FOREVER + { + const T* p = iA.Next(); + if (!p) + break; + --c; + test(aB.Find(*p)!=0); + } + test(c==0); + c = aA.Count(); + typename RPtrHashSet::TIter iB(aB); + FOREVER + { + const T* p = iB.Next(); + if (!p) + break; + --c; + test(aA.Find(*p)!=0); + } + test(c==0); + } + + +/****************************************************************************** + * Utility functions for RHashMap + ******************************************************************************/ +template +void UnionTransform(RHashMap& aD, const RHashSet& aS, V (*aTransform)(const K&) ) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + typename RHashSet::TIter iS(aS); + FOREVER + { + const K* p = iS.Next(); + if (!p) + break; + --c2; + TInt r = aD.Insert(*p, (*aTransform)(*p) ); + test(r==KErrNone); + ++d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + } + + +template +void UnionMap(RHashSet& aD, const RHashSet& aS, const RHashMap& aM) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + typename RHashSet::TIter iS(aS); + FOREVER + { + const K* p = iS.Next(); + if (!p) + break; + --c2; + const V* q = aM.Find(*p); + if (!q) + continue; + TInt r = aD.Insert(*q); + test(r==KErrNone); + ++d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + } + + +template +void UnionKeys(RHashSet& aD, const RHashMap& aM) + { + typename RHashMap::TIter iM(aM); + FOREVER + { + const K* p = iM.NextKey(); + if (!p) + break; + aD.Insert(*p); + } + } + + +template +void UnionValues(RHashSet& aD, const RHashMap& aM) + { + typename RHashMap::TIter iM(aM); + FOREVER + { + const K* p = iM.NextKey(); + if (!p) + break; + const V* q = iM.CurrentValue(); + aD.Insert(*q); + } + } + + +template +void UnionTransform(RHashMap& aD, const RHashMap& aS, V (*aTransform)(const V&) ) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + typename RHashMap::TIter iS(aS); + FOREVER + { + const K* p = iS.NextKey(); + if (!p) + break; + --c2; + TInt r = aD.Insert(*p, (*aTransform)(*iS.CurrentValue()) ); + test(r==KErrNone); + ++d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + } + + +template +void UnionInverse(RHashMap& aD, const RHashMap& aS) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + typename RHashMap::TIter iS(aS); + FOREVER + { + const K* p = iS.NextKey(); + if (!p) + break; + --c2; + const V* q = iS.CurrentValue(); + TInt r = aD.Insert(*q, *p); + test(r==KErrNone); + ++d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + } + +template +void SetMap(RHashMap& aM, const V& aV) + { + typename RHashMap::TIter iM(aM); + FOREVER + { + const K* p = iM.NextKey(); + if (!p) + break; + V* q = iM.CurrentValue(); + *q = aV; + test(*q == aV); + } + } + + +/****************************************************************************** + * Utility functions for RPtrHashMap + ******************************************************************************/ +template +void UnionTransform(RPtrHashMap& aD, const RPtrHashMap& aS, V* (*aTransform)(const V*) ) + { + TInt c = aS.Count(); + TInt c2 = c; + TInt d0 = aD.Count(); + TInt d1 = d0; + typename RPtrHashMap::TIter iS(aS); + FOREVER + { + const K* p = iS.NextKey(); + if (!p) + break; + --c2; + TInt r = aD.Insert(p, (*aTransform)(iS.CurrentValue()) ); + test(r==KErrNone); + ++d1; + } + test(d1 == aD.Count()); + test(c2 == 0); + } + + +template +void UnionInverse(RPtrHashMap& aD, const RPtrHashMap& a1) + { + typename RPtrHashMap::TIter iter(a1); + const A* pA; + while ( (pA=iter.NextKey()) != 0 ) + { + const B* pB = iter.CurrentValue(); + TInt r = aD.Insert(pB, pA); + test(r==KErrNone); + } + } + + +template +void UnionCompose(RPtrHashMap& aD, const RPtrHashMap& a1, const RPtrHashMap& a2) + { + typename RPtrHashMap::TIter iter(a1); + const A* pA; + while ( (pA=iter.NextKey()) != 0 ) + { + const B* pB = iter.CurrentValue(); + const C* pC = a2.Find(*pB); + if (pC) + { + TInt r = aD.Insert(pA, pC); + test(r==KErrNone); + } + } + } + + +template +void CheckIdenticalMaps(const RPtrHashMap& aA, const RPtrHashMap& aB) + { + test(aA.Count()==aB.Count()); + TInt c = aA.Count(); + const K* p; + const V* q; + typename RPtrHashMap::TIter iA(aA); + while( (p=iA.NextKey()) != 0) + { + --c; + q = aB.Find(*p); + test(q && q==iA.CurrentValue()); + } + test(c==0); + c = aB.Count(); + typename RPtrHashMap::TIter iB(aB); + while( (p=iB.NextKey()) != 0) + { + --c; + q = aA.Find(*p); + test(q && q==iB.CurrentValue()); + } + test(c==0); + } + + + + + +/****************************************************************************** + * Tests of TIntSet + ******************************************************************************/ +void Populate(TIntSet& aH, TInt aS, TInt aE, TInt aM) + { + TInt x = aS; + for (; x<=aE; x+=aM) + aH.Insert(x); + } + +void PrimeSieve(TIntSet& aH, TInt aStart, TInt aEnd) + { + TInt x; + TInt e = (aEnd&1) ? aEnd : aEnd-1; + TInt s = (aStart<2) ? 2 : aStart|1; + for (x=s; x<=e; ++x) + { +// test.Printf(_L("add %d\n"),x); + aH.Insert(x); + } + TInt m=2; + FOREVER + { + for (; m*m<=e && !aH.Find(m); ++m) + {} + if (m*m > e) + break; + for (x=m*2; x<=e; x+=m) + { +// test.Printf(_L("remove %d\n"),x); + aH.Remove(x); + } + ++m; + } + } + +TBool IsPrime(TInt x) + { + if (x==2) + return ETrue; + if (!(x&1)) + return EFalse; + TInt d; + for (d=3; d*d<=x; d+=2) + { + if (x%d==0) + return EFalse; + } + return ETrue; + } + +void CheckSieveOutput(TIntSet& aH) + { + RHashSet::TIter iter(aH); + TInt min = KMaxTInt; + TInt max = KMinTInt; + TInt c = 0; + test.Printf(_L("%d elements:\n"),aH.Count()); + FOREVER + { + const TInt* p = iter.Next(); + if (!p) + break; + ++c; + if (*p>max) max=*p; + if (*p::TIter iter(aA); + FOREVER + { + const TInt* p = iter.Next(); + if (!p) + break; + m |= (1<<*p); + } + return m; + } + +void AddToSmallHashSet(TIntSet& aA, TUint32 aMask) + { + CheckSmallHashSet(aA); + TInt i; + TInt r; + for (i=0; i<32; ++i) + { + if (aMask & (1< hs; // empty + RHashSet::TIter iter(hs); + test(iter.Next() == 0); + test(iter.Current() == 0); + iter.RemoveCurrent(); + test(iter.Next() == 0); + test(iter.Current() == 0); + + test(hs.Insert(1) == KErrNone); + test(hs.Insert(2) == KErrNone); + test(hs.Insert(3) == KErrNone); + iter.Reset(); + TUint mask = 14; + TInt i; + for (i=0; i<3; ++i) + { + const TInt* p = iter.Next(); + test(p!=0); + TInt x = *p; + test (x>=1 && x<=3 && (mask&(1< empty; + CheckIdentical(hs, empty); +#ifdef _DEBUG + __UHEAP_FAILNEXT(1); + test(empty.Insert(1)==KErrNoMemory); + test(empty.Insert(1)==KErrNone); + empty.Close(); + __UHEAP_FAILNEXT(1); + test(hs.Insert(1)==KErrNone); + hs.Close(); + __UHEAP_FAILNEXT(1); + test(hs.Insert(1)==KErrNoMemory); +#endif + hs.Close(); + } + +void Print(const char* aTitle, const RHashMap& aM) + { + TBuf<256> buf; + buf.Copy(TPtrC8((const TUint8*)aTitle)); + test.Printf(_L("%S\n"), &buf); + RHashMap::TIter iter(aM); + FOREVER + { + const TInt* p = iter.NextKey(); + if (!p) break; + buf.Copy(*iter.CurrentValue()); + test.Printf(_L("%d: %S\n"), *p, &buf); + } + } + +void Print(const char* aTitle, const RHashSet& aS) + { + TBuf<256> buf; + buf.Copy(TPtrC8((const TUint8*)aTitle)); + test.Printf(_L("%S\n"), &buf); + RHashSet::TIter iter(aS); + FOREVER + { + if (!iter.Next()) + break; + buf.Copy(*iter.Current()); + test.Printf(_L("%S\n"), &buf); + } + } + +void TestHashMap() + { + test.Next(_L("Test RHashMap")); + + RHashMap ht; + CCheck(ht); // check consistency for empty table + TInt x; + for (x=0; x<200; x++) + { + TInt r = ht.Insert(x*x, x); + test(r==KErrNone); + } + test(ht.Count()==200); + + TInt z = 0; + TInt y; + for (x=0; x<40000; x++) + { + const TInt* e = ht.Find(x); + if (e) + { + const TInt& ee = ht.FindL(x); + test(&ee==e); + y = *e; +// test.Printf(_L("Find(%d) -> %d\n"), x, y); + test(x == z*z); + test(y == z); + ++z; + } + else + { + TRAPD(rr, ht.FindL(x)); + test(rr==KErrNotFound); + } + } + CCheck(ht); + + for (x=0; x<200; x++) + { + TInt r = ht.Insert(x*x*x, x); + test(r==KErrNone); + } + test(ht.Count()==200*2-6); + CCheck(ht); + + TInt sq = 0; + TInt cb = 0; + for (x=0; x<8000000; x++) + { + const TInt* e = ht.Find(x); + if (e) + { + const TInt& ee = ht.FindL(x); + test(&ee==e); + y = *e; +// test.Printf(_L("Find(%d) -> %d\n"), x, y); + if (x == cb*cb*cb) + { + test(y==cb); + ++cb; + if (x == sq*sq) + ++sq; + } + else if (x == sq*sq) + { + test(y==sq); + ++sq; + } + } + } + + for (x=0; x<200; x++) + { + TInt r = ht.Remove(x*x); + test(r==KErrNone); + } + test(ht.Count()==200-6); + CCheck(ht); + + cb = 2; + for (x=2; x<8000000; x++) + { + const TInt* e = ht.Find(x); + if (e) + { + const TInt& ee = ht.FindL(x); + test(&ee==e); + y = *e; +// test.Printf(_L("Find(%d) -> %d\n"), x, y); + if (cb == 4 || cb == 9 || cb == 16 || cb == 25) ++cb; + test(x == cb*cb*cb); + test(y == cb); + ++cb; + } + } + + SetMap(ht, 17); + + ht.Close(); + + PrintNumberInWords(2000); + PrintNumberInWords(2001); + PrintNumberInWords(131072); + PrintNumberInWords(111111); + PrintNumberInWords(524288); + + INTSET(all); + Populate(all,0,1000,1); + RHashMap to_words(&DefaultHash::Integer, &DefaultIdentity::Integer); + UnionTransform(to_words, all, &NumberInWords); + RHashMap from_words(&HashTestName, &TestNameIdentity); + UnionInverse(from_words, to_words); +// Print("TO WORDS:", to_words); + INTSET(primes); + PrimeSieve(primes, 1, 100); +// Print("Primes 1-100", primes); + RHashMap prime_map(&DefaultHash::Integer, &DefaultIdentity::Integer); + UnionTransform(prime_map, primes, &NumberInWords); +// Print("Prime map 1-100", prime_map); + INTSET(pmkeys); + UnionKeys(pmkeys, prime_map); + NAMESET(pmval); + NAMESET(pmval2); + UnionValues(pmval, prime_map); + CheckIdentical(pmkeys, primes); + INTSET(pr2); + UnionMap(pr2, pmval, from_words); + CheckIdentical(pr2, primes); + pr2.Close(); + Union(pmval2, pmval); +// Print("pmval",pmval); +// Print("pmval2",pmval2); + CheckIdentical(pmval2, pmval); + UnionMap(pr2, pmval2, from_words); + CheckIdentical(pr2, primes); + + pr2.Close(); + pmval.Close(); + pmval2.Close(); + pmkeys.Close(); + prime_map.Close(); + primes.Close(); + all.Close(); + + INTSET(m); + Populate(all,2,1000,1); + + NAMESET(pr3); + NAMESET(nm); + UnionMap(pr3, all, to_words); + all.Close(); + CCheck(pr3); + + Populate(m,4,1000,2); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,6,1000,3); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,10,1000,5); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,14,1000,7); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,22,1000,11); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,26,1000,13); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,34,1000,17); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,38,1000,19); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,46,1000,23); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,58,1000,29); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + + Populate(m,62,1000,31); + UnionMap(nm, m, to_words); + m.Close(); + Subtract(pr3, nm); + nm.Close(); + +// Print("pr3",pr3); + PrimeSieve(primes, 1, 1000); + UnionMap(nm, primes, to_words); + CheckIdentical(nm, pr3); + CCheck(pr3); + UnionMap(m, pr3, from_words); + CheckIdentical(m, primes); + + m.Close(); + nm.Close(); + primes.Close(); + pr3.Close(); + from_words.Close(); + to_words.Close(); + } + +void PopulateArray8(TInt aMax) + { + TInt i; + for (i=0; i n16; + n16.Copy(n); + HBufC16* p = n16.Alloc(); + test(p!=0); + TInt r = DesC16Array.Append(p); + test(r==KErrNone); + } + } + +TUint32 istrh8(const TDesC8* const & a) + { + return DefaultHash::Des8(*a); + } + +TBool istrid8(const TDesC8* const & aA, const TDesC8* const & aB) + { + return *aA == *aB; + } + +TUint32 istrh16(const TDesC16* const & a) + { + return DefaultHash::Des16(*a); + } + +TBool istrid16(const TDesC16* const & aA, const TDesC16* const & aB) + { + return *aA == *aB; + } + +void TestPtrHashSet() + { + test.Next(_L("Test RPtrHashSet")); + + STRSET8(s); + CCheck(s); // check consistency for empty table + RHashMap hm(&istrh8, &istrid8); + RPtrHashSet::TIter iter(s); + const TDesC8* q; + TInt i; + for (i=0; i<4096; ++i) + { + TInt r = s.Insert(DesC8Array[i]); + test(r==KErrNone); + r = hm.Insert(DesC8Array[i], i); + test(r==KErrNone); + } + CCheck(s); + for (i=0; i<4100; ++i) + { + TTestName n(NumberInWords(i)); + const TDesC8* p = s.Find(n); + if (i<4096) + { + const TDesC8& pp = s.FindL(n); + test(p && *p==n && p==DesC8Array[i]); + test(&pp == p); + } + else + { + test(!p); + TRAPD(rr,s.FindL(n)); + test(rr==KErrNotFound); + } + } + while((q=iter.Next())!=0) + { + const TInt* qi = hm.Find(q); + test(qi!=0 && *qi>=0 && *qi<4096); + test(DesC8Array[*qi]==q); + } + for (i=0; i<4100; i+=2) + { + TTestName n(NumberInWords(i)); + TInt r = s.Remove(&n); + if (i<4096) + test(r==KErrNone); + else + test(r==KErrNotFound); + } + test(s.Count()==2048); + CCheck(s); + for (i=0; i<4100; ++i) + { + TTestName n(NumberInWords(i)); + const TDesC8* p = s.Find(n); + if (i<4096 && (i&1)) + test(p && *p==n && p==DesC8Array[i]); + else + test(!p); + } + iter.Reset(); + while((q=iter.Next())!=0) + { + const TInt* qi = hm.Find(q); + test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&1)); + test(DesC8Array[*qi]==q); + } + for (i=2; i<4096; i+=4) + { + TInt r = s.Insert(DesC8Array[i]); + test(r==KErrNone); + } + test(s.Count()==3072); + CCheck(s); + for (i=0; i<4100; ++i) + { + TTestName n(NumberInWords(i)); + const TDesC8* p = s.Find(n); + if (i<4096 && (i&3)) + test(p && *p==n && p==DesC8Array[i]); + else + test(!p); + } + iter.Reset(); + while((q=iter.Next())!=0) + { + const TInt* qi = hm.Find(q); + test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&3)); + test(DesC8Array[*qi]==q); + } + s.Close(); + + // test ResetAndDestroy + for (i=0; i<16; ++i) + { + TInt r = s.Insert(DesC8Array[i]->Alloc()); + test(r==KErrNone); + } + iter.Reset(); + while((q=iter.Next())!=0) + { + const TInt* qi = hm.Find(q); + test(qi!=0 && *qi>=0 && *qi<16); + test(*DesC8Array[*qi]==*q); + test(DesC8Array[*qi]!=q); + } + s.ResetAndDestroy(); + hm.Close(); + + + STRSET16(S); + RHashMap HM(&istrh16, &istrid16); + RPtrHashSet::TIter ITER(S); + const TDesC16* Q; + for (i=0; i<4096; ++i) + { + TInt r = S.Insert(DesC16Array[i]); + test(r==KErrNone); + r = HM.Insert(DesC16Array[i], i); + test(r==KErrNone); + } + CCheck(S); + for (i=0; i<4100; ++i) + { + TTestName n(NumberInWords(i)); + TBuf<80> buf; + buf.Copy(n); + const TDesC16* p = S.Find(buf); + if (i<4096) + test(p && *p==buf && p==DesC16Array[i]); + else + test(!p); + } + while((Q=ITER.Next())!=0) + { + const TInt* qi = HM.Find(Q); + test(qi!=0 && *qi>=0 && *qi<4096); + test(DesC16Array[*qi]==Q); + } + for (i=0; i<4100; i+=2) + { + TTestName n(NumberInWords(i)); + TBuf<80> buf; + buf.Copy(n); + TInt r = S.Remove(&buf); + if (i<4096) + test(r==KErrNone); + else + test(r==KErrNotFound); + } + test(S.Count()==2048); + CCheck(S); + for (i=0; i<4100; ++i) + { + TTestName n(NumberInWords(i)); + TBuf<80> buf; + buf.Copy(n); + const TDesC16* p = S.Find(buf); + if (i<4096 && (i&1)) + test(p && *p==buf && p==DesC16Array[i]); + else + test(!p); + } + ITER.Reset(); + while((Q=ITER.Next())!=0) + { + const TInt* qi = HM.Find(Q); + test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&1)); + test(DesC16Array[*qi]==Q); + } + for (i=2; i<4096; i+=4) + { + TInt r = S.Insert(DesC16Array[i]); + test(r==KErrNone); + } + test(S.Count()==3072); + CCheck(S); + for (i=0; i<4100; ++i) + { + TTestName n(NumberInWords(i)); + TBuf<80> buf; + buf.Copy(n); + const TDesC16* p = S.Find(buf); + if (i<4096 && (i&3)) + test(p && *p==buf && p==DesC16Array[i]); + else + test(!p); + } + ITER.Reset(); + while((Q=ITER.Next())!=0) + { + const TInt* qi = HM.Find(Q); + test(qi!=0 && *qi>=0 && *qi<4096 && (*qi&3)); + test(DesC16Array[*qi]==Q); + } + S.Close(); + + // test ResetAndDestroy + for (i=0; i<16; ++i) + { + TInt r = S.Insert(DesC16Array[i]->Alloc()); + test(r==KErrNone); + } + ITER.Reset(); + while((Q=ITER.Next())!=0) + { + const TInt* qi = HM.Find(Q); + test(qi!=0 && *qi>=0 && *qi<16); + test(*DesC16Array[*qi]==*Q); + test(DesC16Array[*qi]!=Q); + } + S.ResetAndDestroy(); + HM.Close(); + } + +void TestPtrHashMap() + { + test.Next(_L("Test RPtrHashMap")); + + STRMAP8(map); + CCheck(map); // check consistency for empty table + STRMAP8(id); + TInt i; + for (i=0; i<4096; ++i) + { + TInt r = map.Insert(DesC8Array[i], DesC8Array[(i+1)&0xfff]); + test(r==KErrNone); + r = id.Insert(DesC8Array[i], DesC8Array[i]); + test(r==KErrNone); + } + for (i=0; i<4096; ++i) + { + const TDesC8* p = map.Find(*DesC8Array[i]); + test(p == DesC8Array[(i+1)&0xfff]); + const TDesC8& pp = map.FindL(*DesC8Array[i]); + test(&pp == p); + } + TRAPD(rr,map.FindL(_L8("two"))); + test(rr==KErrNone); + TRAP(rr,map.FindL(_L8("twx"))); + test(rr==KErrNotFound); + CCheck(map); + STRMAP8(map2); + STRMAP8(mapi); + STRMAP8(map3); + UnionInverse(mapi, map); + UnionCompose(map2, map, map); + UnionCompose(map3, map, mapi); + CheckIdenticalMaps(map3, id); + map3.Close(); + UnionCompose(map3, map2, mapi); + CheckIdenticalMaps(map3, map); + map3.Close(); + for (i=0; i<4096; ++i) + { + TInt r = map3.Insert(DesC8Array[i], DesC8Array[(i+2)&0xfff]); + test(r==KErrNone); + } + CheckIdenticalMaps(map3, map2); + map3.Close(); + + mapi.Close(); + map2.Close(); + id.Close(); + map.Close(); + + // test ResetAndDestroy() + for(i=0; i<16; ++i) + { + TInt r = map.Insert(DesC8Array[i]->Alloc(), DesC8Array[i*i]->Alloc()); + test(r==KErrNone); + } + map.ResetAndDestroy(); + } + +void TestOOM() + { + // Max out memory and check it still works + test.Next(_L("Test OOM")); + + TInt x = 0; + TInt n = 0; + TInt r; + INTSET(set); + FOREVER + { + x += 0x58b90bfb; + r = set.Insert(x); + if (r != KErrNone) + break; + ++n; + } + test(r==KErrNoMemory); + TRAPD(rr,set.InsertL(x)); + test(rr==KErrNoMemory); + test.Printf(_L("%d integers stored\n"), n); + test(set.Count()==n); + TRAP(rr,set.InsertL(0x58b90bfb)); // already there + test(rr==KErrNone); // should succeed + + // final count should be a power of 2 minus 1 + test( (n&(n+1)) == 0 ); + + x = 0; + TInt i; + for (i=0; i<=n; ++i) // check everything has been stored correctly + { + x += 0x58b90bfb; + const TInt* p = set.Find(x); + if (i < n) + test(p && *p == x); + else + test(!p); + } + set.Close(); + TInt nn; + for (nn=256; nn<=n+256; nn+=256) + { + r = set.Reserve(nn); + set.Close(); + if (r!=KErrNone) + break; + } + test.Printf(_L("Max reserve %d\n"),nn); + TInt thresh = 3*((n+1)>>2); + test(nn == thresh + 256); + } + +#ifndef __TOOLS2__ +class RDummyAllocator : public RAllocator + { +public: + virtual TAny* Alloc(TInt) {test(0); return 0;} + virtual void Free(TAny*) {test(0);} + virtual TAny* ReAlloc(TAny*, TInt, TInt) {test(0); return 0;} + virtual TInt AllocLen(const TAny*) const {test(0); return 0;} + virtual TInt Compress() {test(0); return 0;} + virtual void Reset() {test(0);} + virtual TInt AllocSize(TInt&) const {test(0); return 0;} + virtual TInt Available(TInt&) const {test(0); return 0;} + virtual TInt DebugFunction(TInt, TAny*, TAny*) {test(0); return 0;} + virtual TInt Extension_(TUint, TAny*&, TAny*) {test(0); return 0;} + }; + +void IntegerBenchmark(TInt aCount, TBool aReserve) + { + RArray array; + TUint32 before, after, diff; + TInt x=0; + TInt i; + double avg; + + test.Printf(_L("**** INTEGER BENCHMARKS ***\n")); + + if (!aReserve) + { + before = User::NTickCount(); + for (i=0; i=0); + } + after = User::NTickCount(); + diff = after - before; + diff *= NanoTickPeriod; + avg = (double)diff / (double)aCount; + test.Printf(_L("ARRAY: %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg); + + before = User::NTickCount(); + for (i=0; i=0); + array.Remove(r); + } + after = User::NTickCount(); + diff = after - before; + diff *= NanoTickPeriod; + avg = (double)diff / (double)aCount; + test.Printf(_L("ARRAY: %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg); + array.Close(); + } + + INTSET(set); + x=0; + RAllocator* pA = 0; + RDummyAllocator da; + if (aReserve) + { + test(set.Reserve(aCount)==KErrNone); + pA = User::SwitchAllocator(&da); // check that no memory accesses occur + test(set.Reserve(10)==KErrNone); // shouldn't need to do anything + test(set.Reserve(aCount/2)==KErrNone); // shouldn't need to do anything + test(set.Reserve(aCount)==KErrNone); // shouldn't need to do anything + } + before = User::NTickCount(); + for (i=0; i array; + TUint32 before, after, diff; + TInt x=0; + TInt i; + double avg; + const TDesC8** base = (const TDesC8**)&DesC8Array[0]; + test(base[1331] == DesC8Array[1331]); + + test.Printf(_L("**** 8 BIT STRING BENCHMARKS ***\n")); + + if (!aReserve) + { + before = User::NTickCount(); + for (i=0; i=0); + } + after = User::NTickCount(); + diff = after - before; + diff *= NanoTickPeriod; + avg = (double)diff / (double)aCount; + test.Printf(_L("ARRAY: %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg); + + before = User::NTickCount(); + for (i=0; i=0); + array.Remove(r); + } + after = User::NTickCount(); + diff = after - before; + diff *= NanoTickPeriod; + avg = (double)diff / (double)aCount; + test.Printf(_L("ARRAY: %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg); + array.Close(); + } + + STRSET8(set); + x=0; + if (aReserve) + test(set.Reserve(aCount)==KErrNone); + before = User::NTickCount(); + for (i=0; i array; + TUint32 before, after, diff; + TInt x=0; + TInt i; + double avg; + const TDesC16** base = (const TDesC16**)&DesC16Array[0]; + test(base[1331] == DesC16Array[1331]); + + test.Printf(_L("**** 16 BIT STRING BENCHMARKS ***\n")); + + if (!aReserve) + { + before = User::NTickCount(); + for (i=0; i=0); + } + after = User::NTickCount(); + diff = after - before; + diff *= NanoTickPeriod; + avg = (double)diff / (double)aCount; + test.Printf(_L("ARRAY: %d successful finds take %dus (%.2gus each)\n"), aCount, diff, avg); + + before = User::NTickCount(); + for (i=0; i=0); + array.Remove(r); + } + after = User::NTickCount(); + diff = after - before; + diff *= NanoTickPeriod; + avg = (double)diff / (double)aCount; + test.Printf(_L("ARRAY: %d deletions take %dus (%.2gus each)\n"), aCount, diff, avg); + array.Close(); + } + + STRSET16(set); + x=0; + if (aReserve) + test(set.Reserve(aCount)==KErrNone); + before = User::NTickCount(); + for (i=0; i>8); break; + }; + h ^= c; + i = (i+1)&3; + } + return mp(h); + } + +void TestHash(TInt* aIn, TUint32 aExpected) + { + THashFunction32 hf(&DefaultHash::IntegerPtr); + TUint32 out = hf.Hash(aIn); + test(aExpected == mp((TUint32)aIn)); + if (out != aExpected) + { + test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out); + test(0); + } + } + +void TestHash(TDesC8* aIn, TUint32 aExpected) + { + THashFunction32 hf(&DefaultHash::Des8Ptr); + TUint32 out = hf.Hash(aIn); + test(aExpected == mp((TUint32)aIn)); + if (out != aExpected) + { + test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out); + test(0); + } + } + +void TestHash(TDesC16* aIn, TUint32 aExpected) + { + THashFunction32 hf(&DefaultHash::Des16Ptr); + TUint32 out = hf.Hash(aIn); + test(aExpected == mp((TUint32)aIn)); + if (out != aExpected) + { + test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out); + test(0); + } + } + + +void TestHash(TInt aIn, TUint32 aExpected) + { + THashFunction32 hf(&DefaultHash::Integer); + TUint32 out = hf.Hash(aIn); + test(aExpected == mp((TUint32)aIn)); + if (out != aExpected) + { + test.Printf(_L("Hashing %08x Expected %08x Got %08x\n"), aIn, aExpected, out); + test(0); + } + } + +void TestHash(const char* aIn, TUint32 aExpected) + { + THashFunction32 hf(&DefaultHash::Des8); + TPtrC8 p((const TUint8*)aIn); + TUint32 out = hf.Hash(p); + test(aExpected == strh(aIn)); + if (out != aExpected) + { + TBuf<256> buf; + buf.Copy(p); + test.Printf(_L("Hashing %S (len %d) Expected %08x Got %08x\n"), &buf, p.Length(), aExpected, out); + test(0); + } + } + +void TestHash(const wch* aIn) + { + THashFunction32 hf(&DefaultHash::Des16); + TPtrC16 p((const TUint16*)aIn); + TUint32 out = hf.Hash(p); + TUint32 exp = strh(aIn); + if (out != exp) + { + test.Printf(_L("Hashing %S (len %d) Expected %08x Got %08x\n"), &p, p.Size(), exp, out); + test(0); + } + } + +void TestHash() + { + test.Next(_L("Test integer hash")); + TestHash(1,0x9e3779b9); + TestHash(2,0x3c6ef372); + TestHash(4,0x78dde6e4); + TestHash(8,0xf1bbcdc8); + TestHash(16,0xe3779b90); + TestHash(0xc90fdaa2,0xbf999112); + TestHash(0xb504f334,0x7fb35494); + TestHash(0xddb3d743,0xd11a3a6b); + TestHash(0xadf85458,0x873a8b98); + TestHash(0x11730859,0xb4321951); + TestHash(0x64636261,0x8628f119); + } + +void TestIntegerPtrHash() + { + TInt i[5]; + TInt* ptr; + test.Next(_L("Test Integer pointer hash")); + for (ptr=i; ptr i[5]; + TDesC8* ptr; + test.Next(_L("Test Des8 pointer hash")); + for (ptr=i; ptr i[5]; + TDesC16* ptr; + test.Next(_L("Test Des16 pointer hash")); + for (ptr=i; ptr +void TestHashMapPtr(RHashMap &map, K ptr, V* i) +{ + test(map.Reserve(5) == KErrNone); + for (ptr=i;ptr=i;ptr--) + { + test(*(map.Find(ptr)) == *ptr); + } + test(map.Count() == 5); + test(map.Remove(i) == KErrNone); + test(map.Count()==4); + test(map.Find(i)==NULL); + map.Close(); +} + +void TestPtrHashMaps() + { + + test.Next(_L("Test RHashMap of default pointer types")); + TInt i[5]; + TInt *ptr=i; + RHashMap mp; + TestHashMapPtr(mp, ptr, i); + + TInt32 i1[5]; + TInt32 *ptr1=i1; + RHashMap mp1; + TestHashMapPtr(mp1,ptr1,i1); + + TUint i2[5]; + TUint *ptr2=i2; + RHashMap mp2; + TestHashMapPtr(mp2,ptr2,i2); + + TUint32 i3[5]; + TUint32 *ptr3=i3; + RHashMap mp3; + TestHashMapPtr(mp3,ptr3,i3); + + TBuf8<5> i4[5]; + TBuf8<5> *ptr4=i4; + RHashMap mp4; + for (ptr4=i4; ptr4 < i4+5; ptr4++) + { + test(mp4.Insert(ptr4,*ptr4) == KErrNone); + } + for (ptr4=i4+4; ptr4 >= i4; ptr4--) + { + test(*(mp4.Find(ptr4)) == *ptr4); + } + test(mp4.Count()==5); + test(mp4.Remove(i4) == KErrNone); + test(mp4.Find(i4) == NULL); + test(mp4.Count()==4); + mp4.Close(); + + + TBuf16<5> i5[5]; + TBuf16<5> *ptr5=i5; + RHashMap mp5; + for (ptr5=i5; ptr5 < i5+5; ptr5++) + { + test(mp5.Insert(ptr5,*ptr5) == KErrNone); + } + for (ptr5=i5+4; ptr5 >= i5; ptr5--) + { + test(*(mp5.Find(ptr5)) == *ptr5); + } + test(mp5.Count()==5); + test(mp5.Remove(i5) == KErrNone); + test(mp5.Find(i5) == NULL); + test(mp5.Count()==4); + mp5.Close(); + +} + +/** Tests that Reserve() will always allocate memory for new tables + even for small reserve sizes + See DEF087906. +*/ +#ifndef __TOOLS2__ +void TestSmallReserve() + { + test.Next(_L("Test RHashTableBase::Reserve preallocates memory, even for small no of elements")); + RAllocator* pA = 0; + RDummyAllocator da; + + // Reserve should allocate the memory required for the table of 1 element + INTSET(set); + RHashMap hashMap; + + test(set.Reserve(1) == KErrNone); + test(hashMap.Reserve(1) == KErrNone); + + pA = User::SwitchAllocator(&da); + + // No more memory should be allocated for the table as it should + // have been already allocated by Reserve() + test(set.Insert(123) == KErrNone); + test(hashMap.Insert(123,456) == KErrNone); + + // Switch back to allow set to be closed + User::SwitchAllocator(pA); + set.Close(); + hashMap.Close(); + } +#endif + +TInt E32Main() + { + test.Title(); + +#ifndef __TOOLS2__ + test(HAL::Get(HAL::ENanoTickPeriod, NanoTickPeriod)==KErrNone); + test.Printf(_L("NanoTickPeriod %dus\n"), NanoTickPeriod); +#endif + + __UHEAP_MARK; + + test.Start(_L("Testing hash tables")); + + TestHash(); + TestStringHash(); + TestWStringHash(); + TestIntegerPtrHash(); + TestDes8PtrHash(); + TestDes16PtrHash(); + + TestHashSet(); + TestHashIter(); + TestHashMap(); + TestPtrHashMaps(); + + PopulateArray8(4096); + PopulateArray16(4096); + TestPtrHashSet(); + TestPtrHashMap(); + DesC16Array.ResetAndDestroy(); + DesC8Array.ResetAndDestroy(); + + +#ifndef __TOOLS2__ + TestOOM(); + Benchmark(); + TestSmallReserve(); +#endif + + test.End(); + + __UHEAP_MARKEND; + return 0; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_huff.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_huff.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,995 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test/buffer/t_huff.cpp +// Overview: +// Test methods of the Huffman, TBitInput and TBitOutput classes. +// API Information: +// Huffman, TBitInput, TBitOutput +// Details: +// - Test and verify the results of TBitInput bit reading: +// - test and verify single bit reads, multiple bit reads and 32-bit reads +// - test and verify single bit reads and multiple bit reads from a +// fractured input. +// - test and verify overrun reads +// - Test and verify the results of TBitOutput bit writing: +// - test and verify bitstream padding +// - test and verify single bit and multiple bit writes +// - test and verify overflow writes +// - Test and verify the results of a Huffman decoder using Huffman class +// static methods, TBitOutput and TBitInput objects. +// - Test and verify the results of a Huffman generator for known distributions: +// flat, power-of-2 and Fibonacci. +// - Test and verify the results of a Huffman generator for random distributions: +// - generate random frequency distributions and verify: +// (a) the Huffman generator creates a mathematically 'optimal code' +// (b) the canonical encoding is canonical +// (c) the decoding tree correctly decodes each code +// (d) the encoding can be correctly externalised and internalised +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include + +RTest test(_L("T_HUFF")); + +const Uint64 KTestData=UI64LIT(0x6f1b09a7e8c523d4); +const TUint8 KTestBuffer[] = {0x6f,0x1b,0x09,0xa7,0xe8,0xc5,0x23,0xd4}; +const TInt KTestBytes=sizeof(KTestBuffer); +const TInt KTestBits=KTestBytes*8; + +// Input stream: bit and multi-bit read tests with exhsautive buffer reload testing + +typedef TBool (*TestFn)(TBitInput& aIn, Uint64 aBits, TInt aCount); + +class TAlignedBitInput : public TBitInput + { +public: + TAlignedBitInput(const TUint8*,TInt,TInt); +private: + void UnderflowL(); +private: + const TUint8* iRemainder; + TInt iCount; + }; + +TAlignedBitInput::TAlignedBitInput(const TUint8* aPtr,TInt aCount,TInt aOffset) + :TBitInput(aPtr,32-aOffset,aOffset), iRemainder(aPtr+4), iCount(aOffset+aCount-32) + {} + +void TAlignedBitInput::UnderflowL() + { + if (!iRemainder) + User::Leave(KErrUnderflow); + else + { + Set(iRemainder,iCount); + iRemainder=0; + } + } + +class TSplitBitInput : public TBitInput + { +public: + TSplitBitInput(const TUint8*,TInt,TInt,TInt); +private: + void UnderflowL(); +private: + const TUint8* iBase; + TInt iBlockSize; + TInt iOffset; + TInt iAvail; + }; + +TSplitBitInput::TSplitBitInput(const TUint8* aPtr,TInt aLength,TInt aOffset,TInt aSize) + :TBitInput(aPtr,aSize,aOffset), iBase(aPtr), iBlockSize(aSize), iOffset(aOffset+aSize), iAvail(aLength-aSize) + {} + +void TSplitBitInput::UnderflowL() + { + TInt len=Min(iBlockSize,iAvail); + if (len==0) + User::Leave(KErrUnderflow); + Set(iBase,len,iOffset); + iOffset+=len; + iAvail-=len; + } + +class TAlternateBitInput : public TBitInput + { +public: + TAlternateBitInput(const TUint8*,TInt,TInt); +private: + void UnderflowL(); +private: + const TUint8* iBase; + TInt iOffset; + TInt iAvail; + }; + +TAlternateBitInput::TAlternateBitInput(const TUint8* aPtr,TInt aLength,TInt aOffset) + :TBitInput(aPtr,1,aOffset), iBase(aPtr), iOffset(aOffset+2), iAvail(aLength-2) + {} + +void TAlternateBitInput::UnderflowL() + { + if (iAvail<=0) + User::Leave(KErrUnderflow); + Set(iBase,1,iOffset); + iOffset+=2; + iAvail-=2; + } + +void TestReader(TBitInput& aIn, TestFn aFunc, Uint64 aBits, TInt aCount) + { + TBool eof=EFalse; + TRAPD(r,eof=aFunc(aIn,aBits,aCount)); + test (r==KErrNone); + if (eof) + { + TRAP(r,aIn.ReadL()); + test (r==KErrUnderflow); + } + } + +void TestBits(TInt aOffset, TInt aCount, TestFn aFunc) + { + Uint64 bits=KTestData; + if (aOffset) + bits<<=aOffset; + if (aCount<64) + bits&=~((Uint64(1)<<(64-aCount))-1); + // test with direct input + TBitInput in1(KTestBuffer,aCount,aOffset); + TestReader(in1,aFunc,bits,aCount); + // test with aligned input + if (aOffset<32 && aOffset+aCount>32) + { + TAlignedBitInput in2(KTestBuffer,aCount,aOffset); + TestReader(in2,aFunc,bits,aCount); + } + // test with blocked input + for (TInt block=aCount;--block>0;) + { + TSplitBitInput in3(KTestBuffer,aCount,aOffset,block); + TestReader(in3,aFunc,bits,aCount); + } + } + +void TestAlternateBits(TInt aOffset, TInt aCount, TestFn aFunc) + { + Uint64 bits=0; + TInt c=0; + for (TInt ix=aOffset;ix>63) + bits|=Uint64(1)<<(63-c); + ++c; + } + // test with alternate input + TAlternateBitInput in1(KTestBuffer,aCount,aOffset); + TestReader(in1,aFunc,bits,c); + } + +void PermBits(TestFn aFunc, TInt aMinCount=1, TInt aMaxCount=64) + { + for (TInt offset=0;offset=aMinCount;--count) + TestBits(offset,count,aFunc); + } + +void AlternateBits(TestFn aFunc, TInt aMinCount=1) + { + for (TInt offset=0;offset=aMinCount;--count) + TestAlternateBits(offset,count,aFunc); + } + +TBool SingleBitRead(TBitInput& aIn, Uint64 aBits, TInt aCount) + { + while (--aCount>=0) + { + test (aIn.ReadL() == (aBits>>63)); + aBits<<=1; + } + return ETrue; + } + +TBool MultiBitRead(TBitInput& aIn, Uint64 aBits, TInt aCount) + { + TInt c=aCount/2; + TUint v=aIn.ReadL(c); + if (c==0) + test (v==0); + else + { + test (v==TUint(aBits>>(64-c))); + aBits<<=c; + } + c=aCount-c; + v=aIn.ReadL(c); + if (c==0) + test (v==0); + else + test (v==TUint(aBits>>(64-c))); + return ETrue; + } + +TBool LongShortRead(TBitInput& aIn, Uint64 aBits, TInt aCount) + { + TUint v=aIn.ReadL(32); + test (v==TUint(aBits>>32)); + aBits<<=32; + TInt c=aCount-32; + v=aIn.ReadL(c); + if (c==0) + test (v==0); + else + test (v==TUint(aBits>>(64-c))); + return ETrue; + } + +TBool ShortLongRead(TBitInput& aIn, Uint64 aBits, TInt aCount) + { + TInt c=aCount-32; + TUint v=aIn.ReadL(c); + if (c==0) + test (v==0); + else + { + test (v==TUint(aBits>>(64-c))); + aBits<<=c; + } + v=aIn.ReadL(32); + test (v==TUint(aBits>>32)); + return ETrue; + } + +TBool EofRead(TBitInput& aIn, Uint64, TInt aCount) + { + TRAPD(r,aIn.ReadL(aCount+1)); + test(r==KErrUnderflow); + return EFalse; + } + +void TestBitReading() + { + test.Start(_L("Test single bit reads")); + PermBits(&SingleBitRead); + test.Next(_L("Test multi bit reads")); + PermBits(&MultiBitRead); + test.Next(_L("Test 32-bit reads")); + PermBits(&LongShortRead,32); + PermBits(&ShortLongRead,32); + test.Next(_L("Test single bit reads (fractured input)")); + AlternateBits(&SingleBitRead); + test.Next(_L("Test multi bit reads (fractured input)")); + AlternateBits(&MultiBitRead); + test.Next(_L("Test overrun reads")); + PermBits(&EofRead,1,31); + test.End(); + } + +// Bit output testing (assumes bit input is correct) + +void TestPadding() + { + TUint8 buffer[4]; + TBitOutput out(buffer,4); + test(out.Ptr()==buffer); + test(out.BufferedBits()==0); + out.PadL(0); + test(out.Ptr()==buffer); + test(out.BufferedBits()==0); + out.WriteL(0,0); + out.PadL(0); + test(out.Ptr()==buffer); + test(out.BufferedBits()==0); + + TInt i; + for (i=1;i<=8;++i) + { + out.Set(buffer,4); + out.WriteL(0,i); + test(out.BufferedBits()==(i%8)); + out.PadL(1); + test(out.BufferedBits()==0); + out.WriteL(0,i); + test(out.BufferedBits()==(i%8)); + out.PadL(1); + test(out.BufferedBits()==0); + test (out.Ptr()==buffer+2); + test (buffer[0]==(0xff>>i)); + test (buffer[1]==(0xff>>i)); + } + + for (i=1;i<=8;++i) + { + out.Set(buffer,4); + out.WriteL(0xff,i); + out.PadL(0); + test (out.Ptr()==buffer+1); + test (buffer[0]==(0xff^(0xff>>i))); + } + } + +void TestBitWrites() + { + TUint8 buffer[KTestBytes]; + TBitOutput out(buffer,KTestBytes); + TBitInput in(KTestBuffer,KTestBits); + TInt i; + for (i=KTestBits;--i>=0;) + out.WriteL(in.ReadL(),1); + test (Mem::Compare(buffer,KTestBytes,KTestBuffer,KTestBytes)==0); + + Mem::FillZ(buffer,KTestBytes); + out.Set(buffer,KTestBytes); + Uint64 bits=KTestData; + for (i=KTestBits;--i>=0;) + out.WriteL(TUint(bits>>i),1); + test (Mem::Compare(buffer,KTestBytes,KTestBuffer,KTestBytes)==0); + } + +void TestMultiBitWrites() + { + TInt i=0; + for (TInt j=0;j<32;++j) + for (TInt k=0;k<32;++k) + { + ++i; + if (i+j+k>KTestBits) + i=0; + TUint8 buffer[KTestBytes]; + TBitInput in(KTestBuffer,KTestBits); + TBitOutput out(buffer,KTestBytes); + in.ReadL(i); + out.WriteL(in.ReadL(j),j); + out.WriteL(in.ReadL(k),k); + out.PadL(0); + const TUint8* p=out.Ptr(); + test (p-buffer == (j+k+7)/8); + Uint64 v=0; + while (p>buffer) + v=(v>>8) | Uint64(*--p)<<56; + Uint64 res=KTestData; + if (i+j+k>=KTestBits-i-j-k; + if (j+k=0) + out.WriteL(i&1?0:0xffffffff,i); + out.PadL(0); + TBitInput in(buffer,KBufferSize); + for (i=0;i<=32;++i) + { + TUint v=in.ReadL(i); + if (i&1) + test (v == (1u<=0) + { + TUint v=in.ReadL(i); + if (i&1) + test (v == 0); + else if (i==32) + test (v == 0xffffffffu); + else + test (v == (1u<KTestBytes) + i=1; + TUint8 buffer[KTestBytes+1]; + Mem::FillZ(buffer,sizeof(buffer)); + out.Set(buffer,i); + TRAPD(r,OverflowTestL(out,j)); + test (r == KErrOverflow); + TInt k=0; + while (buffer[k]==0xff) + { + ++k; + test (k=0;) + vout.WriteL(in.ReadL(),1); + test(vout.BufferedBits() == 0); + TRAPD(r,vout.WriteL(0,1)); + test (r == KErrNone); + TRAP(r,vout.PadL(0)); + test (r == KErrOverflow); + test.End(); + } + +void TestBitWriting() + { + test.Start(_L("Test padding")); + TestPadding(); + test.Next(_L("Test bit writes")); + TestBitWrites(); + test.Next(_L("Test multi-bit writes")); + TestMultiBitWrites(); + TestAlternatingWrites(); + test.Next(_L("Test overflow writes")); + TestOverflow(); + test.End(); + } + +// Huffman decode testing +#ifdef __ARMCC__ +#pragma Onoinline +#endif +void Dummy(volatile TInt & /*x*/) + { + } + +void TestHuffmanL() + { + const TInt KTestBits=32*32; + + // build the huffman decoding tree for + // 0: '0' + // 1: '10' + // 2: '110' etc + TUint32 huffman[Huffman::KMaxCodeLength+1]; + TInt i; + for (i=0;i=0;) + tab[i]=2*tab[i+1]; + + TRAPD(r,Huffman::HuffmanL(tab,c+1,tab)); + if (c>Huffman::KMaxCodeLength) + { + test (r==KErrOverflow); + continue; + } + + test (TInt(tab[c]) == c); + for (i=0;i=0;) + tab[i]=tab[i+1]+tab[i+2]; + + TRAPD(r,Huffman::HuffmanL(tab,c+1,tab)); + if (c>Huffman::KMaxCodeLength) + { + test (r==KErrOverflow); + continue; + } + + test (TInt(tab[c]) == c); + for (i=0;i0 ? (Math::Rand(RSeed)%aLimit) : 0;} + +void GenerateFreq(TUint32* aTable, TInt aCount, TInt aTotalFreq, TInt aVariance, TInt aZeros) +// +// Generate a random frequency table +// + { + for (TInt i=0;i>8); + TInt min=Max(1,ave-var); + TInt max=Min(1+aTotalFreq-(aCount-aZeros-i),ave+var); + TInt f = max<=min ? ave : min+Random(max-min); + aTable[i] = f; + aTotalFreq-=f; + } + } + } + } + +TInt NumericalSort(const TUint32& aLeft, const TUint32& aRight) + { + return aLeft-aRight; + } + +TInt64 VerifyOptimalCode(const TUint32* aFreq, const TUint32* aCode, TInt aCount, TInt aTotalFreqLog2) +// +// We can show tht the expected code length is at least as short as a Shannon-Fano encoding +// + { + TInt64 totalHuff=0; + TInt64 totalSF=0; + TInt i; + for (i=0;i>aTotalFreqLog2)!=1) + ++s; + totalSF+=f*s; + } + test (totalHuff<=totalSF); + + RPointerArray index(aCount); + CleanupClosePushL(index); + for (i=0;ipf); + test (ns<=ps); + smin=smax=ns; + } + } + CleanupStack::PopAndDestroy(); + + return totalHuff; + } + +TInt LexicalSort(const TUint32& aLeft, const TUint32& aRight) + { + const TUint32 KCodeMask=(1<>Huffman::KMaxCodeLength); + + RPointerArray index(aCount); + CleanupClosePushL(index); + for (i=0;i index order preserved + + // check that a code is not a prefix of the next one. This is sufficent for checking the + // prefix condition as we have already sorted the codes in lexicographical order + TUint32 pc=aEncode[pix]<<(32-Huffman::KMaxCodeLength); + TUint32 nc=aEncode[nix]<<(32-Huffman::KMaxCodeLength); + TInt plen=aCode[pix]; + test ((pc>>(32-plen)) != (nc>>(32-plen))); // pc is not a prefix for nc + } + CleanupStack::PopAndDestroy(&index); + } + +void VerifyCanonicalDecoding(const TUint32* aEncode, const TUint32* aDecode, TInt aCount, TInt aBase) +// +// We've checked the encoding is valid, so now we check that the decoding can correctly +// decode every code +// + { + TUint8 buffer[(Huffman::KMaxCodeLength+7)/8]; + TBitInput in; + TBitOutput out; + + while (--aCount>=0) + { + if (aEncode[aCount]) + { + out.Set(buffer,sizeof(buffer)); + out.HuffmanL(aEncode[aCount]); + out.PadL(0); + in.Set(buffer,aEncode[aCount]>>Huffman::KMaxCodeLength); + TInt v=-1; + TRAPD(r,v=in.HuffmanL(aDecode)); + test (r==KErrNone); + test (v==aCount+aBase); + TRAP(r,in.ReadL()); + test (r==KErrUnderflow); + } + } + } + +TInt TestExternalizeL(const TUint32* aCode, TUint8* aExtern, TUint32* aIntern, TInt aCount) + { + TBitOutput out(aExtern,aCount*4); + Huffman::ExternalizeL(out,aCode,aCount); + TInt bits=out.BufferedBits()+8*(out.Ptr()-aExtern); + out.PadL(0); + TBitInput in(aExtern,bits); + TRAPD(r,Huffman::InternalizeL(in,aIntern,aCount)); + test (r == KErrNone); + test (Mem::Compare((TUint8*)aCode,aCount*sizeof(TUint32),(TUint8*)aIntern,aCount*sizeof(TUint32)) == 0); + TRAP(r,in.ReadL()); + test (r == KErrUnderflow); + return bits; + } + +void RandomHuffmanL(TInt aIter, TInt aMaxSymbols) +// +// generate random frequency distributions and verify +// (a) the Huffman generator creates a mathematically 'optimal code' +// (b) the canonical encoding is the canonical encoding +// (c) the decoding tree correctly decodes each code. +// (d) the encoding can be correctly externalised and internalised +// + { + TReal KLog2; + Math::Ln(KLog2,2); + const TInt KTotalFreqLog2=24; + const TInt KTotalFreq=1<= 0) + { + TInt num=2+Random(aMaxSymbols-1); + + TUint32* const freq = new(ELeave) TUint32[num*3]; + CleanupArrayDeletePushL(freq); + TUint32* const code = freq+num; + TUint32* const encoding = code+num; + TUint32* const decoding = freq; + TUint8* const exter = (TUint8*)encoding; + TUint32* const intern = freq; + + TInt var=Random(24); + TInt zero=Random(num-2); + GenerateFreq(freq,num,KTotalFreq,var,zero); + + Huffman::HuffmanL(freq,num,code); + VerifyOptimalCode(freq,code,num,KTotalFreqLog2); + + Huffman::Encoding(code,num,encoding); + VerifyCanonicalEncodingL(code,encoding,num); + + TInt base=Random(Huffman::KMaxCodes-num); + Huffman::Decoding(code,num,decoding,base); + VerifyCanonicalDecoding(encoding,decoding,num,base); + + TestExternalizeL(code,exter,intern,num); + CleanupStack::PopAndDestroy(); + } + } + +/// + +void MainL() + { + test.Start(_L("Test Bit reader")); + TestBitReading(); + test.Next(_L("Test Bit writer")); + TestBitWriting(); + test.Next(_L("Test Huffman decoder")); + TestHuffmanL(); + test.Next(_L("Test Huffman generator for known distributions")); + SpecificHuffman(800); + test.Next(_L("Test Huffman generator for random distributions")); + TRAPD(r,RandomHuffmanL(1000,800)); + test (r==KErrNone); + test.End(); + } + +TInt E32Main() + { + test.Title(); + CTrapCleanup* c=CTrapCleanup::New(); + test (c!=0); + TRAPD(r,MainL()); + test (r==KErrNone); + delete c; + test.Close(); + return r; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_key.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_key.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,742 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_key.cpp +// Overview: +// Test arrays keys against flat and segmented arrays of characters (8 and 16 bit) and records. +// API Information: +// TKeyArrayFix, TKeyArrayVar. +// Details: +// - Create flat and segmented array of TText8, TText16, TText. Append some text to the +// arrays and test the functions of the TKeyArrayFix class using the Find method which +// calls SetPtr, Set, Compare methods with ECmpNormal8, ECmpFolded8, ECmpCollated8, +// ECmpNormal16, ECmpFolded16, ECmpCollated16, ECmpNormal, ECmpFolded, ECmpCollated key types. +// - Test the functions of the TKeyArrayVar class using the Find method which calls SetPtr, Set, +// Compare methods with ECmpNormal8, ECmpFolded8, ECmpCollated8, ECmpNormal16, ECmpFolded16, +// ECmpCollated16, ECmpNormal, ECmpFolded, ECmpCollated key types. +// - Create flat and segmented array of TText, append some structures with different values. +// - Test the functions of the TKeyArrayFix, TKeyArrayVar classes by searching the values using +// sequential search technique with ECmpNormal, ECmpTInt32 key type and verifying that it is +// found at correct position. +// - For TKeyArrayFix and TKeyArrayVar class, create a flat array of TText, append some structures +// with different numeric values, sort the array, search the values using ECmpTInt, ECmpTUint, +// ECmpTint8, ECmpTUint8, ECmpTint16, ECmpTUint16, ECmpTint32, ECmpTUint32 key types and verify +// that values are found in order as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include +#include +#include + +#ifdef __VC32__ +#pragma warning (disable:4710) // Function not expanded +#pragma warning (disable:4702) // Unreachable code +#endif + +const TInt KTestGranularity=0x02; + +LOCAL_D RTest test(_L("T_KEY")); + +template +class TArr + { +public: + TArr() {} + TInt Count() const {return S;} + T& operator[](TInt anIndex) {return iArr[anIndex];} + const T& operator[](TInt anIndex) const {return iArr[anIndex];} +private: + T iArr[S]; + }; + +//#if defined(_DEBUG) +struct Record + { + TBuf<0x10> name; + TInt32 age; + TText8 code; + }; + +struct Record2 + { + TInt tint; + TUint tuint; + TInt8 tint8; + TUint8 tuint8; + TInt16 tint16; + TUint16 tuint16; + TInt32 tint32; + TUint32 tuint32; + }Rec1, Rec2, Rec3, Rec4; + +LOCAL_C void SetRecordData(void) + { + Rec1.tint=KMaxTInt; + Rec2.tint=0; + Rec3.tint=-KMaxTInt; + Rec4.tint=KMinTInt; + Rec1.tint8=KMaxTInt8; + Rec2.tint8=0; + Rec3.tint8=-KMaxTInt8; + Rec4.tint8=(TInt8)KMinTInt8; + Rec1.tint16=KMaxTInt16; + Rec2.tint16=0; + Rec3.tint16=-KMaxTInt16; + Rec4.tint16=(TInt16)KMinTInt16; + Rec1.tint32=KMaxTInt32; + Rec2.tint32=0; + Rec3.tint32=-KMaxTInt32; + Rec4.tint32=(TInt32)KMinTInt32; + Rec1.tuint=0; + Rec2.tuint=1; + Rec3.tuint=KMaxTUint-1; + Rec4.tuint=KMaxTUint; + Rec1.tuint8=0; + Rec2.tuint8=1; + Rec3.tuint8=(TUint8)(KMaxTUint8-1); + Rec4.tuint8=(TUint8)KMaxTUint8; + Rec1.tuint16=0; + Rec2.tuint16=1; + Rec3.tuint16=(TUint16)(KMaxTUint16-1); + Rec4.tuint16=(TUint16)KMaxTUint16; + Rec1.tuint32=0; + Rec2.tuint32=1; + Rec3.tuint32=(TUint32)(KMaxTUint32-1); + Rec4.tuint32=KMaxTUint32; + } + +typedef enum {eEight, eSixteen} TMode; + +template // S is TText8, TTExt etc. called S as _TL requires S in e32test.h +class TestTKey + { +public: + void Test1(TKeyCmpText, TKeyCmpText, TKeyCmpText); + void Test2(TKeyCmpText, TKeyCmpText, TKeyCmpText); + void Test3(void); + void Test4(void); + void Test5(void); + void Test6(void); + }; + +template +GLDEF_C void TestTKey::Test1(TKeyCmpText N, TKeyCmpText F, TKeyCmpText C) + { + // This tests the functions of the TKey classes indirectly - mostly using the Find method + // which calls SetPtr(), Set() (both trivial) and more importantly Compare(), + + ArrayType* pArray=new ArrayType(KTestGranularity); + pArray->AppendL(*(const TArr*)_TL("aa cc")); + pArray->AppendL(*(const TArr*)_TL("bb bb")); + pArray->AppendL(*(const TArr*)_TL("cc aa")); + + KeyType NormalKey(0,N,5); + KeyType NormalKeyOffset(sizeof(S)*3,N,2) ; + KeyType FoldedKey(0,F,5); + KeyType FoldedKeyOffset(sizeof(S)*3,F,2); + KeyType CollatedKey(0,C,5); + KeyType CollatedKeyOffset(sizeof(S)*3,C,2); + + TInt pos; + test(pArray->Find(*(const TArr*)_TL("aa cc"), NormalKey, pos)==0); + test(pos==0); + test(pArray->Find(*(const TArr*)_TL("bb bb"), NormalKey, pos)==0); + test(pos==1); + test(pArray->Find(*(const TArr*)_TL("cc aa"), NormalKey, pos)==0); + test(pos==2); + test(pArray->Find(*(const TArr*)_TL("BB BB"), NormalKey, pos)!=0); + + + test(pArray->Find(*(const TArr*)_TL("___cc"), NormalKeyOffset, pos)==0); + test(pos==0); + test(pArray->Find(*(const TArr*)_TL("___bb"), NormalKeyOffset, pos)==0); + test(pos==1); + test(pArray->Find(*(const TArr*)_TL("___aa"), NormalKeyOffset, pos)==0); + test(pos==2); + test(pArray->Find(*(const TArr*)_TL("___ax"), NormalKeyOffset, pos)!=0); + + + test(pArray->Find(*(const TArr*)_TL("aa cc"), FoldedKey, pos)==0); + test(pos==0); + test(pArray->Find(*(const TArr*)_TL("bb bb"), FoldedKey, pos)==0); + test(pos==1); + test(pArray->Find(*(const TArr*)_TL("cc aa"), FoldedKey, pos)==0); + test(pos==2); + + + test(pArray->Find(*(const TArr*)_TL("___CC"), FoldedKeyOffset, pos)==0); + test(pos==0); + test(pArray->Find(*(const TArr*)_TL("___bB"), FoldedKeyOffset, pos)==0); + test(pos==1); + test(pArray->Find(*(const TArr*)_TL("___Aa"), FoldedKeyOffset, pos)==0); + test(pos==2); + test(pArray->Find(*(const TArr*)_TL("___ax"), FoldedKeyOffset, pos)!=0); + + + test(pArray->Find(*(const TArr*)_TL("aa cc"), CollatedKey, pos)==0); + test(pos==0); + test(pArray->Find(*(const TArr*)_TL("bb bb"), CollatedKey, pos)==0); + test(pos==1); + test(pArray->Find(*(const TArr*)_TL("cc aa"), CollatedKey, pos)==0); + test(pos==2); + + + test(pArray->Find(*(const TArr*)_TL("___cc"), CollatedKeyOffset, pos)==0); + test(pos==0); + test(pArray->Find(*(const TArr*)_TL("___bb"), CollatedKeyOffset, pos)==0); + test(pos==1); + test(pArray->Find(*(const TArr*)_TL("___aa"), CollatedKeyOffset, pos)==0); + test(pos==2); + test(pArray->Find(*(const TArr*)_TL("___ax"), CollatedKeyOffset, pos)!=0); + + delete pArray; + } + + +template +GLDEF_C void TestTKey::Test2(TKeyCmpText N, TKeyCmpText F, TKeyCmpText C) + { + // This tests the functions of the TKey classes indirectly - mostly using the Find method + // which calls SetPtr(), Set() (both trivial) and more importantly Compare(), + + ArrayType* pArray=new ArrayType(KTestGranularity); + pArray->AppendL(*(S(*))_TL("aa cc"), 5*sizeof(S)); + pArray->AppendL(*(S(*))_TL("bb bbb"), 6*sizeof(S)); + pArray->AppendL(*(S(*))_TL("cc aaaa"), 7*sizeof(S)); + + KeyType NormalKey5(0,N,5); + KeyType NormalKey6(0,N,6); + KeyType NormalKey7(0,N,7); + KeyType NormalKeyOffset(sizeof(S)*3,N,2); + + KeyType FoldedKey5(0,F,5); + KeyType FoldedKey6(0,F,6); + KeyType FoldedKey7(0,F,7); + KeyType FoldedKeyOffset(sizeof(S)*3,F,2); + + KeyType CollatedKey5(0,C,5); + KeyType CollatedKey6(0,C,6); + KeyType CollatedKey7(0,C,7); + KeyType CollatedKeyOffset(sizeof(S)*3,C,2); + + TInt pos; + test(pArray->Find(*(S(*))_TL("aa cc"), NormalKey5, pos)==0); + test(pos==0); + test(pArray->Find(*(S(*))_TL("bb bbb"), NormalKey6, pos)==0); + test(pos==1); + test(pArray->Find(*(S(*))_TL("cc aaaa"), NormalKey7, pos)==0); + test(pos==2); + test(pArray->Find(*(S(*))_TL("BB BB"), NormalKey5, pos)!=0); + + + test(pArray->Find(*(S(*))_TL("___cc"), NormalKeyOffset, pos)==0); + test(pos==0); + test(pArray->Find(*(S(*))_TL("___bb"), NormalKeyOffset, pos)==0); + test(pos==1); + test(pArray->Find(*(S(*))_TL("___aa"), NormalKeyOffset, pos)==0); + test(pos==2); + test(pArray->Find(*(S(*))_TL("___ax"), NormalKeyOffset, pos)!=0); + + + test(pArray->Find(*(S(*))_TL("aa cc"), FoldedKey5, pos)==0); + test(pos==0); + test(pArray->Find(*(S(*))_TL("bb bbb"), FoldedKey6, pos)==0); + test(pos==1); + test(pArray->Find(*(S(*))_TL("cc aaaa"), FoldedKey7, pos)==0); + test(pos==2); + + + test(pArray->Find(*(S(*))_TL("___CC"), FoldedKeyOffset, pos)==0); + test(pos==0); + test(pArray->Find(*(S(*))_TL("___bB"), FoldedKeyOffset, pos)==0); + test(pos==1); + test(pArray->Find(*(S(*))_TL("___Aa"), FoldedKeyOffset, pos)==0); + test(pos==2); + test(pArray->Find(*(S(*))_TL("___ax"), FoldedKeyOffset, pos)!=0); + + + test(pArray->Find(*(S(*))_TL("aa cc"), CollatedKey5, pos)==0); + test(pos==0); + test(pArray->Find(*(S(*))_TL("bb bbb"), CollatedKey6, pos)==0); + test(pos==1); + test(pArray->Find(*(S(*))_TL("cc aaaa"), CollatedKey7, pos)==0); + test(pos==2); + + + test(pArray->Find(*(S(*))_TL("___cc"), CollatedKeyOffset, pos)==0); + test(pos==0); + test(pArray->Find(*(S(*))_TL("___bb"), CollatedKeyOffset, pos)==0); + test(pos==1); + test(pArray->Find(*(S(*))_TL("___aa"), CollatedKeyOffset, pos)==0); + test(pos==2); + test(pArray->Find(*(S(*))_TL("___ax"), CollatedKeyOffset, pos)!=0); + + delete pArray; + } + + +template +GLDEF_C void TestTKey::Test3(void) + { + ArrayType* pArray=new ArrayType(KTestGranularity); + Record rec1, rec2, rec3; + + rec1.name=(_TL("fred")); + rec1.age=5; + rec1.code='A'; + + rec2.name=(_TL("bill")); + rec2.age=0x7fffffff; + rec2.code='Z'; + + rec3.name=(_TL("bert")); + rec3.age=-5; + rec3.code='X'; + + pArray->AppendL(rec1); + pArray->AppendL(rec2); + pArray->AppendL(rec3); + + TInt pos; + + KeyType codekey(_FOFF(Record, code),ECmpNormal,1); + test(pArray->Find(rec1, codekey, pos)==0); + test(pos==0); + test(pArray->Find(rec2, codekey, pos)==0); + test(pos==1); + test(pArray->Find(rec3, codekey, pos)==0); + test(pos==2); + + KeyType agekey(_FOFF(Record, age), ECmpTInt32); + test(pArray->Find(rec1, agekey, pos)==0); + test(pos==0); + test(pArray->Find(rec2, agekey, pos)==0); + test(pos==1); + test(pArray->Find(rec3, agekey, pos)==0); + test(pos==2); + + rec1.age=-50; // march 95 - this isn't allowed , lucky that it works + test(pArray->Find(rec1, agekey, pos)!=0); + rec1.age=5; + + pArray->Sort(agekey); + test(pArray->Find(rec1, agekey, pos)==0); + test(pos==1); + test(pArray->Find(rec2, agekey, pos)==0); + test(pos==2); + test(pArray->Find(rec3, agekey, pos)==0); + test(pos==0); + + delete pArray; + } + +template +GLDEF_C void TestTKey::Test4(void) + { + ArrayType* pArray=new ArrayType(KTestGranularity); + Record rec1, rec2, rec3; + + rec1.name=(_TL("fred")); + rec1.age=5; + rec1.code='A'; + rec2.name=(_TL("bill")); + rec2.age=0x7fffffff; + rec2.code='Z'; + rec3.name=(_TL("bert")); + rec3.age=-5; + rec3.code='X'; + + pArray->AppendL(rec1, sizeof(Record)); + pArray->AppendL(rec2, sizeof(Record)); + pArray->AppendL(rec3, sizeof(Record)); + + TInt pos; + KeyType codekey(_FOFF(Record, code),ECmpNormal,1); + test(pArray->Find(rec1, codekey, pos)==0); + test(pos==0); + test(pArray->Find(rec2, codekey, pos)==0); + test(pos==1); + test(pArray->Find(rec3, codekey, pos)==0); + test(pos==2); + + KeyType agekey(_FOFF(Record, age), ECmpTInt32); + test(pArray->Find(rec1, agekey, pos)==0); + test(pos==0); + test(pArray->Find(rec2, agekey, pos)==0); + test(pos==1); + test(pArray->Find(rec3, agekey, pos)==0); + test(pos==2); + rec1.age=-50; // march 95 - this isn't allowed - lucky to get away with it + test(pArray->Find(rec1, agekey, pos)!=0); + rec1.age=5; + + pArray->Sort(agekey); + test(pArray->Find(rec1, agekey, pos)==0); + test(pos==1); + test(pArray->Find(rec2, agekey, pos)==0); + test(pos==2); + test(pArray->Find(rec3, agekey, pos)==0); + test(pos==0); + + delete pArray; + } + +template +GLDEF_C void TestTKey::Test5(void) + { + // test the numeric enumeration types + ArrayType* pArray=new ArrayType(KTestGranularity); + TInt pos; + + KeyType TIntKey(_FOFF(Record2, tint), ECmpTInt); + KeyType TUintKey(_FOFF(Record2, tuint), ECmpTUint); + KeyType TInt8Key(_FOFF(Record2, tint8), ECmpTInt8); + KeyType TUint8Key(_FOFF(Record2, tuint8), ECmpTUint8); + KeyType TInt16Key(_FOFF(Record2, tint16), ECmpTInt16); + KeyType TUint16Key(_FOFF(Record2, tuint16), ECmpTUint16); + KeyType TInt32Key(_FOFF(Record2, tint32), ECmpTInt32); + KeyType TUint32Key(_FOFF(Record2, tuint32), ECmpTUint32); + + SetRecordData(); + + pArray->AppendL(Rec1); + pArray->AppendL(Rec2); + pArray->AppendL(Rec3); + pArray->AppendL(Rec4); + + pArray->Sort(TIntKey); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TIntKey, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TIntKey, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TIntKey, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TIntKey, pos)==0); + test(pos==3); + + pArray->Sort(TUintKey); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUintKey, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUintKey, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUintKey, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUintKey, pos)==0); + test(pos==3); + + pArray->Sort(TInt8Key); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TInt8Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TInt8Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TInt8Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TInt8Key, pos)==0); + test(pos==3); + + pArray->Sort(TUint8Key); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUint8Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUint8Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUint8Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUint8Key, pos)==0); + test(pos==3); + + pArray->Sort(TInt16Key); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TInt16Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TInt16Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TInt16Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TInt16Key, pos)==0); + test(pos==3); + + pArray->Sort(TUintKey); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUint16Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUint16Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUint16Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUint16Key, pos)==0); + test(pos==3); + + pArray->Sort(TInt32Key); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TInt32Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TInt32Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TInt32Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TInt32Key, pos)==0); + test(pos==3); + + pArray->Sort(TUint32Key); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUint32Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUint32Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUint32Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUint32Key, pos)==0); + test(pos==3); + + delete pArray; + } + +template +GLDEF_C void TestTKey::Test6(void) + { + // test the numeric enumeration types + ArrayType* pArray=new ArrayType(KTestGranularity); + TInt pos; + + KeyType TIntKey(_FOFF(Record2, tint), ECmpTInt); + KeyType TUintKey(_FOFF(Record2, tuint), ECmpTUint); + KeyType TInt8Key(_FOFF(Record2, tint8), ECmpTInt8); + KeyType TUint8Key(_FOFF(Record2, tuint8), ECmpTUint8); + KeyType TInt16Key(_FOFF(Record2, tint16), ECmpTInt16); + KeyType TUint16Key(_FOFF(Record2, tuint16), ECmpTUint16); + KeyType TInt32Key(_FOFF(Record2, tint32), ECmpTInt32); + KeyType TUint32Key(_FOFF(Record2, tuint32), ECmpTUint32); + + SetRecordData(); + + pArray->AppendL(Rec1, sizeof(Record2)); + pArray->AppendL(Rec2, sizeof(Record2)); + pArray->AppendL(Rec3, sizeof(Record2)); + pArray->AppendL(Rec4, sizeof(Record2)); + + pArray->Sort(TIntKey); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TIntKey, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TIntKey, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TIntKey, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TIntKey, pos)==0); + test(pos==3); + + pArray->Sort(TUintKey); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUintKey, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUintKey, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUintKey, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUintKey, pos)==0); + test(pos==3); + + pArray->Sort(TInt8Key); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TInt8Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TInt8Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TInt8Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TInt8Key, pos)==0); + test(pos==3); + + pArray->Sort(TUint8Key); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUint8Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUint8Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUint8Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUint8Key, pos)==0); + test(pos==3); + + pArray->Sort(TInt16Key); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TInt16Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TInt16Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TInt16Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TInt16Key, pos)==0); + test(pos==3); + + pArray->Sort(TUintKey); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUint16Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUint16Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUint16Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUint16Key, pos)==0); + test(pos==3); + + pArray->Sort(TInt32Key); + // order should be 4,3,2,1 + test(pArray->Find(Rec4, TInt32Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec3, TInt32Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec2, TInt32Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec1, TInt32Key, pos)==0); + test(pos==3); + + pArray->Sort(TUint32Key); + // order should be 1,2,3,4 + test(pArray->Find(Rec1, TUint32Key, pos)==0); + test(pos==0); + test(pArray->Find(Rec2, TUint32Key, pos)==0); + test(pos==1); + test(pArray->Find(Rec3, TUint32Key, pos)==0); + test(pos==2); + test(pArray->Find(Rec4, TUint32Key, pos)==0); + test(pos==3); + + delete pArray; + } + +GLDEF_C TInt E32Main() + { + + test.Title(); + test.Start(_L("Fixed key class with a flat array of TText8")); + typedef CArrayFixFlat > aFixedFlatArrayOfTText8; + TestTKey T1; + T1.Test1(ECmpNormal8, ECmpFolded8, ECmpCollated8); + + test.Next(_L("Fixed key class with a flat array of TText16")); + typedef CArrayFixFlat > aFixedFlatArrayOfTText16; + TestTKey T2; + T2.Test1(ECmpNormal16, ECmpFolded16, ECmpCollated16); + + test.Next(_L("Fixed key class with a flat array of TText")); + typedef CArrayFixFlat > aFixedFlatArrayOfTText; + TestTKey T3; + T3.Test1(ECmpNormal, ECmpFolded, ECmpCollated); + + test.Next(_L("Fixed key class with a segmented array of TText8")); + typedef CArrayFixSeg > aFixedSegmentedArrayOfTText8; + TestTKey T4; + T4.Test1(ECmpNormal8, ECmpFolded8, ECmpCollated8); + + test.Next(_L("Fixed key class with a segmented array of TText16")); + typedef CArrayFixSeg > aFixedSegmentedArrayOfTText16; + TestTKey T5; + T5.Test1(ECmpNormal16, ECmpFolded16, ECmpCollated16); + + test.Next(_L("Fixed key class with a segmented array of TText")); + typedef CArrayFixSeg > aFixedSegmentedArrayOfTText; + TestTKey T6; + T6.Test1(ECmpNormal, ECmpFolded, ECmpCollated); + + test.Next(_L("Var key with a flat array of TText8")); + typedef CArrayVarFlat aVarFlatArrayOfTText8; + TestTKey T7; + T7.Test2(ECmpNormal8, ECmpFolded8, ECmpCollated8); + + test.Next(_L("Var key with a flat array of TText16")); + typedef CArrayVarFlat aVarFlatArrayOfTText16; + TestTKey T8; + T8.Test2(ECmpNormal16, ECmpFolded16, ECmpCollated16); + + test.Next(_L("Var key with a flat array of TText")); + typedef CArrayVarFlat aVarFlatArrayOfTText; + TestTKey T9; + T9.Test2(ECmpNormal, ECmpFolded, ECmpCollated); + + test.Next(_L("Var key with a segmented array of TText8")); + typedef CArrayVarSeg aVarSegmentedArrayOfTText8; + TestTKey T10; + T10.Test2(ECmpNormal8, ECmpFolded8, ECmpCollated8); + + test.Next(_L("Var key with a segmented array of TText16")); + typedef CArrayVarSeg aVarSegmentedArrayOfTText16; + TestTKey T11; + T11.Test2(ECmpNormal16, ECmpFolded16, ECmpCollated16); + + test.Next(_L("Var key with a segmented array of TText")); + typedef CArrayVarSeg aVarSegmentedArrayOfTText; + TestTKey T12; + T12.Test2(ECmpNormal, ECmpFolded, ECmpCollated); + + test.Next(_L("Fixed key with a flat array of structs")); + typedef CArrayFixFlat aFixedFlatArrayOfRecord; + TestTKey T13; + T13.Test3(); + + test.Next(_L("Fixed key with a segmented array of structs")); + typedef CArrayFixSeg aFixedSegmentedArrayOfRecord; + TestTKey T14; + T14.Test3(); + + test.Next(_L("Var key with a flat array of structs")); + typedef CArrayVarFlat aVarFlatArrayOfRecord; + TestTKey T15; + T15.Test4(); + + test.Next(_L("Var key with a segmented array of structs")); + typedef CArrayVarSeg aVarSegmentedArrayOfRecord; + TestTKey T16; + T16.Test4(); + + test.Next(_L("Fixed key with a flat array of structs testing numeric types")); + typedef CArrayFixFlat aFixedFlatArrayOfRecord2; + TestTKey T17; + T17.Test5(); + + test.Next(_L("Var key with a flat array of structs testing numeric types")); + typedef CArrayVarFlat aVarFlatArrayOfRecord2; + TestTKey T18; + T18.Test6(); + test.End(); + return(KErrNone); + } + +/*#else +GLDEF_C TInt E32Main() +// +// Test unavailable in release build. +// + { + + test.Title(); + test.Start(_L("No tests for release builds")); + test.End(); + return(0); + } +#endif + +*/ + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_lex.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_lex.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1550 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_lex.cpp +// Overview: +// Test TLex and TLexMark classes. +// API Information: +// TLex, TLexMark. +// Details: +// - For Unicode, non Unicode and build independent variant of TLex class +// - Test that string-parsing methods are present. +// - Test the constructors with no parameter, by a string, with an empty TLex class, +// non-empty TLex class is as expected. +// - Test assignment operator of TLex, by initializing with TLex reference, string, +// TBuf reference and check it is as expected. +// - Check that Eos, Inc, Mark, Get, Peek, UnGet, SkipSpace, SkipSpaceAndMark, +// SkipCharacters, TokenLength, MarkedToken methods are as expected. +// - Initialize Lex string, assign different values, Parse to extract signed, +// unsigned integer of different lengths, using specified radix and verify +// that the return value is KErrNone when a valid string is parsed, KErrGeneral +// when invalid string is parsed, KErrOverflow when converted value is greater +// than the limit. +// - Refresh the contents with the system's locale settings, separate whole number from +// it's fractional part, change locale settings then parse a 64-bit floating point +// number and check that results are as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +LOCAL_D RTest test(_L("T_LEX")); + +struct TLexMark8Dump + { + const TUint8* iPtr; + }; + +struct TLexMark16Dump + { + const TUint16* iPtr; + }; + +void TLexMark8::__DbgTest(void *pTLexMark8Dump) const + { + ((TLexMark8Dump*)pTLexMark8Dump)->iPtr=iPtr; + } + +void TLexMark16::__DbgTest(void *pTLexMark16Dump) const + { + ((TLexMark16Dump*)pTLexMark16Dump)->iPtr=iPtr; + } + +struct TLex8Dump + { + const TUint8* iNext; + const TUint8* iBuf; + const TUint8* iEnd; + TLexMark8Dump iMark; + }; + +struct TLex16Dump + { + const TUint16* iNext; + const TUint16* iBuf; + const TUint16* iEnd; + TLexMark16Dump iMark; + }; + + +void TLex8::__DbgTest(void* pTLex8Dump) const + { + ((TLex8Dump*)pTLex8Dump)->iNext=iNext; + ((TLex8Dump*)pTLex8Dump)->iBuf=iBuf; + ((TLex8Dump*)pTLex8Dump)->iEnd=iEnd; + iMark.__DbgTest(&((TLex8Dump*)pTLex8Dump)->iMark); + } + +void TLex16::__DbgTest(void* pTLex16Dump) const + { + ((TLex16Dump*)pTLex16Dump)->iNext=iNext; + ((TLex16Dump*)pTLex16Dump)->iBuf=iBuf; + ((TLex16Dump*)pTLex16Dump)->iEnd=iEnd; + iMark.__DbgTest(&((TLex16Dump*)pTLex16Dump)->iMark); + } + + +LOCAL_C void TestDes(const TUint16* start1, const TUint16* start2, const TUint16* end1, const TUint16* end2) + { + TPtrC16 des1(start1, end1-start1); + TPtrC16 des2(start2, end2-start2); + test(des1==des2); + } +LOCAL_C void TestDes(const TUint8* start1, const TUint8* start2, const TUint8* end1, const TUint8* end2) + { + TPtrC8 des1(start1, end1-start1); + TPtrC8 des2(start2, end2-start2); + test(des1==des2); + } +LOCAL_C void TestDes(const TUint16* start, const TUint16* end, const TUint16* string) + { + TPtrC16 des1(start, end-start); + TPtrC16 des2(string); + test(des1==des2); + } +LOCAL_C void TestDes(const TUint8* start, const TUint8* end, const TUint8* string) + { + TPtrC8 des1(start, end-start); + TPtrC8 des2(string); + test(des1==des2); + } + + +void _LL(TText8 array[], TText8 string[]) + { + + TInt index=0; + for(;string[index]; index++) + array[index]=string[index]; + array[index]='\0'; + } + +void _LL(TText16 array[], TText8 string[]) + { + + TInt index=0; + for(;string[index]; index++) + array[index]=string[index]; + array[index]='\0'; + } + +template +class TestTLex + { +public: + void Test1(); + void Test2(); + void Test3(); + void Test4(); + void Test5(); +protected: + void TestList(TLexType* object, TUint param, ...); + }; + + +//********************************* +// Test that methods are in the DLL +//********************************* +template +GLDEF_C void TestTLex::Test1() + { + test.Start(_L("Constructors")); + S String[100]; + _LL(&String[0], (TText8*)"hello"); + TBufType aTBufObject; + TLexType a; + TLexType b(a); + TLexType c(&String[0]); + TLexType d(aTBufObject); + d.Offset(); // Avoids 'unused' warning + TLexMarkType mark; + + test.Next(_L("Assignment operations")); + a=b; + a=&String[0]; + a=aTBufObject; + + test.Next(_L("Assorted")); + c.Eos(); + c.Mark(mark); + c.Mark(); + c.Inc(); + c.Get(); + (S)c.Peek(); + c.UnGet(); + c.UnGetToMark(mark); + c.UnGetToMark(); + c.SkipSpace(); + c.SkipSpaceAndMark(mark); + c.SkipSpaceAndMark(); + c.SkipCharacters(); + c.TokenLength(mark); + c.TokenLength(); + aTBufObject=c.MarkedToken(mark); + aTBufObject=c.MarkedToken(); + aTBufObject=c.NextToken(); + aTBufObject=c.Remainder(); + aTBufObject=c.RemainderFromMark(mark); + aTBufObject=c.RemainderFromMark(); + c.Offset(); + c.MarkedOffset(mark); + c.MarkedOffset(); + + test.Next(_L("Val")); + TInt TI=1; + c.Val(TI); + TInt8 TI8='a'; + c.Val(TI8); + TInt16 TI16=1; + c.Val(TI16); + TInt32 TI32=1; + c.Val(TI32); + TInt64 TI64=1; + c.Val(TI64); + TUint TU=1; + c.Val(TU); + TReal32 TR32=1.0F; + c.Val(TR32); + TReal64 TR64=1.0; + c.Val(TR64); + TUint8 TU8='a'; + TUint32 TU32=1; + TRadix TR=(TRadix)EDecimal; + TUint16 TU16=1; + + c.Val(TU8, TR); + c.Val(TU16, TR); + c.BoundedVal(TI32, TU); + c.BoundedVal(TU32, TR, TU); + c.BoundedVal(TI64, TR, TU); + + test.Next(_L("Assign")); + c.Assign(b); + c.Assign(&String[0]); + c.Assign(aTBufObject); + + test.Next(_L("Test Dumps")); + MarkDumpType mDump; + mark.__DbgTest(&mDump); + + DumpType dump; + c.__DbgTest(&dump); + test.End(); + } + + +/////////////////////////////////////// +// Test calling Convert() with a list +/////////////////////////////////////// +template +GLDEF_C void TestTLex::TestList(TLexType *object, TUint param, ...) + { + VA_LIST l; + TBufType b; + + VA_START(l, param); + object->Convert(b, l); + } + + +///////////////////////// +// Test the constructors +//////////////////////// +template +GLDEF_C void TestTLex::Test2() + { + // Test constructors NOTE: there's no getters for iMark or iBuf + DumpType dump, dump2; + S String[40]; + + test.Start(_L("Constructors:")); // TLexx::TLexx() + test.Next(_L("By default")); + TLexType a; + a.__DbgTest(&dump); + test(dump.iBuf==NULL); + + test.Next(_L("By string")); // TLexx::TLexx(const TUintx*) + _LL(&String[0], (TText8*)"AB"); + TLexType b(&String[0]); + b.__DbgTest(&dump); + TestDes(dump.iNext, dump.iEnd, &String[0]); + TestDes(dump.iBuf, dump.iEnd, &String[0]); + TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]); + + test.Next(_L("By TLex reference")); // TLexx::TLexx(const TLexx&) + // Test with an empty class + TLexType c, d(c); + c.__DbgTest(&dump); + d.__DbgTest(&dump2); + TestDes(dump.iNext, dump2.iNext, dump.iEnd, dump2.iEnd); + test(dump.iBuf==NULL); + test(dump.iBuf==dump2.iBuf); + TestDes(dump.iMark.iPtr, dump2.iMark.iPtr, dump.iEnd, dump2.iEnd); + + //Test with a non empty class + _LL(&String[0], (TText8*)"XYZ"); + TLexType e(&String[0]), f(e); + e.__DbgTest(&dump); + f.__DbgTest(&dump2); + TestDes(dump.iNext, dump.iEnd, &String[0]); + TestDes(dump.iNext, dump2.iNext, dump.iEnd, dump2.iEnd); + TestDes(dump.iBuf, dump2.iBuf, dump.iEnd, dump2.iEnd); + TestDes(dump.iMark.iPtr, dump2.iMark.iPtr, dump.iEnd, dump2.iEnd); + + test.Next(_L("By TBuf reference")); //TLexx::TLexx(const TBufBasex&) + _LL(&String[0], (TText8*)"Hello"); + TBufType aBuf(&String[0]); + TLexType g(aBuf); + g.__DbgTest(&dump); + TestDes(dump.iNext, dump.iEnd, &String[0]); + TestDes(dump.iBuf, dump.iEnd, &String[0]); + TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]); + + test.End(); + } + + +//********************************* +// Test the = methods +//********************************* +template +GLDEF_C void TestTLex::Test3() + { + DumpType dump, dump2; + S String[40]; + + test.Start(_L("= operators")); + test.Next(_L("by TLex reference")); //TLexx::operator=(const TLexx&) + _LL(&String[0], (TText8*)"MNO"); + TLexType a(&String[0]), b; + b=a; + a.__DbgTest(&dump); + b.__DbgTest(&dump2); + TestDes(dump.iNext, dump2.iNext, dump.iEnd, dump2.iEnd); + TestDes(dump.iMark.iPtr, dump2.iMark.iPtr, dump.iEnd, dump2.iEnd); + TestDes(dump.iBuf, dump2.iBuf, dump.iEnd, dump2.iEnd); + + test.Next(_L("by string")); //TLexx::operator=(const TUintx*) + TLexType c; + _LL(&String[0], (TText8*)" abc"); + c=&String[0]; + c.__DbgTest(&dump); + TestDes(dump.iNext, dump.iEnd, &String[0]); + TestDes(dump.iBuf, dump.iEnd, &String[0]); + TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]); + + test.Next(_L("by TBuf reference")); //TLexx::operator=(const TBufx&); + _LL(&String[0], (TText8*)"PQ R "); + TLexType d; + TBufType e(&String[0]); + d=e; + d.__DbgTest(&dump); + TestDes(dump.iNext, dump.iEnd, &String[0]); + TestDes(dump.iBuf, dump.iEnd, &String[0]); + TestDes(dump.iMark.iPtr, dump.iEnd, &String[0]); + test.End(); + } + + +//********************************* +// Test supporting methods +//********************************* +template +GLDEF_C void TestTLex::Test4() + { + S String[40]; + DumpType dump1,dump2; + MarkDumpType mDump; + + test.Start(_L("Supporting methods")); + test.Next(_L("Eos()")); + _LL(&String[0], (TText8*)"GGG"); + TLexType a, b(&String[0]); + test(a.Eos()==TRUE); + test(b.Eos()==FALSE); + + test.Next(_L("Inc()")); // Inc() increments iNext + _LL(&String[0], (TText8*)"mno"); + TLexType c(&String[0]); + c.__DbgTest(&dump1); + + TestDes(dump1.iNext, dump1.iEnd, &String[0]); + c.Inc(); + test((S)c.Peek()==String[1]); + c.Inc(); + test((S)c.Peek()==String[2]); + + test.Next(_L("Mark()")); // Mark() sets iMark=iNext + _LL(&String[0], (TText8*)"pqr"); + TLexType d(&String[0]); + d.Inc(); + d.__DbgTest(&dump1); + d.Mark(); + d.__DbgTest(&dump2); + TestDes(dump2.iMark.iPtr, dump1.iNext, dump2.iEnd, dump1.iEnd); + + test.Next(_L("Mark(mark)")); // Mark(aMark) sets aMark=iNext + _LL(&String[0], (TText8*)"pqr"); + TLexType d1(&String[0]); + TLexMarkType dm; + d1.Inc(); + d1.__DbgTest(&dump1); + d1.Mark(dm); + dm.__DbgTest(&mDump); + TestDes(mDump.iPtr, dump1.iNext, dump1.iEnd, dump1.iEnd); + + + test.Next(_L("Get()")); // Get() is {TChar c(*iNext);Inc(); return(c);} + _LL(&String[0], (TText8*)"s"); + TLexType e(&String[0]); + TChar temp=e.Get(); + test(temp=='s'); + e.Inc(); + temp=e.Get(); + test(temp==0); + + + test.Next(_L("Peek()")); // Peek() returns *iNext + TLexType f; + test(f.Peek()==0); + _LL(&String[0], (TText8*)"ab"); + TLexType g(&String[0]); + test((S)g.Peek()==String[0]); + + test.Next(_L("UnGet()")); // UnGet() is effectively if(iNext!=iBuf) iNext--; + _LL(&String[0], (TText8*)"abc"); + TLexType h(&String[0]); + h.Inc(); + test((S)h.Peek()==String[1]); + h.UnGet(); + test((S)h.Peek()==String[0]); + + test.Next(_L("SkipSpace()")); // SkipSpace() is while(Peek.IsSpace()) iNext++; + _LL(&String[0], (TText8*)" j kl"); + TLexType i(&String[0]); + i.SkipSpace(); + test((S)i.Peek()==String[2]); + i.Inc(); + i.SkipSpace(); + test((S)i.Peek()==String[5]); + + test.Next(_L("SkipSpaceAndMark()")); // while(Peek.IsSpace()) iNext++; iMark=iNext; + _LL(&String[0], (TText8*)" aaa"); + TLexType j(&String[0]); + j.SkipSpaceAndMark(); + j.__DbgTest(&dump1); + _LL(&String[0], (TText8*)"aaa"); + TestDes(dump1.iNext, dump1.iEnd, &String[0]); + TestDes(dump1.iMark.iPtr, dump1.iEnd, &String[0]); + + test.Next(_L("SkipSpaceAndMark(aMark)")); // while(Peek.IsSpace()) iNext++; iMark=iNext; + _LL(&String[0], (TText8*)" aaa"); + TLexType j1(&String[0]); + TLexMarkType jm; + j1.SkipSpaceAndMark(jm); + j1.__DbgTest(&dump1); + jm.__DbgTest(&mDump); + _LL(&String[0], (TText8*)"aaa"); + TestDes(dump1.iNext, dump1.iEnd, &String[0]); + TestDes(mDump.iPtr, dump1.iEnd, &String[0]); + + test.Next(_L("SkipCharacters()")); // Skips non whitespace characters + _LL(&String[0], (TText8*)"abc "); + TLexType k(&String[0]); + k.SkipCharacters(); + test((S)k.Peek()==String[3]); + + test.Next(_L("TokenLength()")); // returns iNext-iMark + _LL(&String[0], (TText8*)"GGG"); + TLexType l(&String[0]); + test(l.TokenLength()==0); + l.Inc(); + test(l.TokenLength()==1); + + test.Next(_L("MarkedToken()")); // Extract a marked token + _LL(&String[0], (TText8*)"ABCD"); + TLexType m(&String[0]); + TBufType Buf; + TLexMarkType mm; + m.Inc(); + m.Mark(); + m.Inc(); + m.Mark(mm); + m.Inc(); + Buf=m.MarkedToken(); + S String2[4]; + _LL(&String2[0], (TText8*)"BC"); + test(TDesType(&String2[0])==Buf); + _LL(&String2[0], (TText8*)"C"); + Buf=m.MarkedToken(mm); + test(TDesType(&String2[0])==Buf); + + test.End(); + } + + +//********************************* +// Test Val() +//********************************* +template +GLDEF_C void TestTLex::Test5() + { + S String[66]; + TInt ret; + TLexType Lex; + test.Start(_L("Val()")); + + ////////////////// + // Test Val(TInt8) + ///////////////// + test.Next(_L("Val(TInt8)")); + TInt8 T8; + _LL(&String[0], (TText8*)""); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrGeneral); + + _LL(&String[0], (TText8*)"abc"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrGeneral); + + _LL(&String[0], (TText8*)"-abc-"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrGeneral); + + _LL(&String[0], (TText8*)"+abc+"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrGeneral); + + _LL(&String[0], (TText8*)"0000000123abc"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==123); + + _LL(&String[0], (TText8*)"000"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==0); + + _LL(&String[0], (TText8*)"+0"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==0); + + _LL(&String[0], (TText8*)"-0"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==0); + + _LL(&String[0], (TText8*)"+1 "); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==1); + + _LL(&String[0], (TText8*)"-1 "); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==-1); + + _LL(&String[0], (TText8*)"127"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==127); + + _LL(&String[0], (TText8*)"128"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrOverflow); + + _LL(&String[0], (TText8*)"-128"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrNone); + test(T8==-128); + + _LL(&String[0], (TText8*)"-129"); + Lex=&String[0]; + test((ret=Lex.Val(T8))==KErrOverflow); + + + /////////////////// + // Test Val(TInt16) + /////////////////// + test.Next(_L("Val(TInt16)")); + TInt16 T16; + _LL(&String[0], (TText8*)""); + Lex=&String[0]; + test((ret=Lex.Val(T16))==KErrGeneral); + + _LL(&String[0], (TText8*)"32767"); + Lex=&String[0]; + test((ret=Lex.Val(T16))==KErrNone); + test(T16==32767); + + _LL(&String[0], (TText8*)"32768"); + Lex=&String[0]; + test((ret=Lex.Val(T16))==KErrOverflow); + + _LL(&String[0], (TText8*)"-32768"); + Lex=&String[0]; + test((ret=Lex.Val(T16))==KErrNone); + test(T16==-32768); + + _LL(&String[0], (TText8*)"-32769"); + Lex=&String[0]; + test((ret=Lex.Val(T16))==KErrOverflow); + + + /////////////////// + // Test Val(TInt32) + /////////////////// + test.Next(_L("Val(TInt32)")); + TInt32 T32; + _LL(&String[0], (TText8*)""); + Lex=&String[0]; + test((ret=Lex.Val(T32))==KErrGeneral); + + _LL(&String[0], (TText8*)"2147483647"); + Lex=&String[0]; + test((ret=Lex.Val(T32))==KErrNone); + test(T32==2147483647L); + + _LL(&String[0], (TText8*)"2147483648"); + Lex=&String[0]; + test((ret=Lex.Val(T32))==KErrOverflow); + + _LL(&String[0], (TText8*)"-2147483648"); + Lex=&String[0]; + test((ret=Lex.Val(T32))==KErrNone); + test(T32==-2147483647-1); // the -1 prevents a (bug?) warning + + _LL(&String[0], (TText8*)"-2147483649"); + Lex=&String[0]; + test((ret=Lex.Val(T32))==KErrOverflow); + + + ///////////////// + // Test Val(TInt) + ///////////////// + test.Next(_L("Val(TInt)")); + TInt T; + _LL(&String[0], (TText8*)""); + Lex=&String[0]; + test((ret=Lex.Val(T))==KErrGeneral); + + _LL(&String[0], (TText8*)"2147483647"); + Lex=&String[0]; + test((ret=Lex.Val(T))==KErrNone); + test(T==2147483647L); + + _LL(&String[0], (TText8*)"2147483648"); + Lex=&String[0]; + test((ret=Lex.Val(T))==KErrOverflow); + + _LL(&String[0], (TText8*)"-2147483648"); + Lex=&String[0]; + test((ret=Lex.Val(T))==KErrNone); + test(T==-2147483647-1); // the -1 prevents a (bug?) warning + + _LL(&String[0], (TText8*)"-2147483649"); + Lex=&String[0]; + test((ret=Lex.Val(T))==KErrOverflow); + + ///////////////// + // Test Val(TInt64) + ///////////////// + test.Next(_L("Val(TInt64)")); + TInt64 T64; + _LL(&String[0], (TText8*)""); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrGeneral); + + _LL(&String[0], (TText8*)"2147483647"); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrNone); + test(T64==TInt(2147483647L)); + + _LL(&String[0], (TText8*)"2147483648"); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrNone); + test(T64==MAKE_TINT64(0,0x80000000u)); + + _LL(&String[0], (TText8*)"-2147483648"); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrNone); + test(T64==-2147483647-1); // the -1 prevents a (bug?) warning + + _LL(&String[0], (TText8*)"-2147483649"); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrNone); + test(T64==MAKE_TINT64(0xffffffffu,0x7fffffffu)); + + _LL(&String[0], (TText8*)"9223372036854775807"); + Lex=&String[0]; + ret=Lex.Val(T64); + test.Printf(_L("ret=%d\n"),ret); + test(ret==KErrNone); + test.Printf(_L("%lx\n"),T64); + test(T64==MAKE_TINT64(0x7fffffffu,0xffffffffu)); + + _LL(&String[0], (TText8*)"9223372036854775808"); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrOverflow); + + _LL(&String[0], (TText8*)"-9223372036854775808"); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrNone); + test(T64==MAKE_TINT64(0x80000000u,0x0)); + + _LL(&String[0], (TText8*)"-9223372036854775809"); + Lex=&String[0]; + test((ret=Lex.Val(T64))==KErrOverflow); + + //////////////////// + // Test Val(TReal32) + ///////////////////// +// test.Next(_L("Val(TReal32)")); +// TReal32 TR32; +// test((ret=Lex.Val(TR32))==KErrNotSupported); + + + //////////////////// + // Test Val(TReal64) + /////////////////// +// test.Next(_L("Val(TReal64)")); +// TReal64 TR64; +// test((ret=Lex.Val(TR64))==KErrNotSupported); + + + /////////////////////////// + // Test Val(TUint8, TRadix) + /////////////////////////// + test.Next(_L("Val(TUint8, TRadix)")); + TUint8 TU8; + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrNone); + test(TU8==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrNone); + test(TU8==1); + + _LL(&String[0], (TText8*)"11111111"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrNone); + test(TU8==255); + + _LL(&String[0], (TText8*)"100000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EBinary))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrNone); + test(TU8==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrNone); + test(TU8==1); + + _LL(&String[0], (TText8*)"377"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrNone); + test(TU8==255); + + _LL(&String[0], (TText8*)"400"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EOctal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrNone); + test(TU8==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrNone); + test(TU8==1); + + _LL(&String[0], (TText8*)"255"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrNone); + test(TU8==255); + + _LL(&String[0], (TText8*)"256"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EDecimal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrNone); + test(TU8==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrNone); + test(TU8==1); + + _LL(&String[0], (TText8*)"Ff"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrNone); + test(TU8==255); + + _LL(&String[0], (TText8*)"100"); + Lex=&String[0]; + test((ret=Lex.Val(TU8, (TRadix)EHex))==KErrOverflow); + + + + //////////////////////////// + // Test Val(TUint16, TRadix) + //////////////////////////// + test.Next(_L("Val(TUint16, TRadix)")); + TUint16 TU16; + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrNone); + test(TU16==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrNone); + test(TU16==1); + + _LL(&String[0], (TText8*)"1111111111111111"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrNone); + test(TU16==65535); + + _LL(&String[0], (TText8*)"10000000000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EBinary))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrNone); + test(TU16==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrNone); + test(TU16==1); + + _LL(&String[0], (TText8*)"177777"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrNone); + test(TU16==65535); + + _LL(&String[0], (TText8*)"200000"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EOctal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrNone); + test(TU16==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrNone); + test(TU16==1); + + _LL(&String[0], (TText8*)"65535"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrNone); + test(TU16==65535); + + _LL(&String[0], (TText8*)"65536"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EDecimal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrNone); + test(TU16==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrNone); + test(TU16==1); + + _LL(&String[0], (TText8*)"ffFf"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrNone); + test(TU16==65535); + + _LL(&String[0], (TText8*)"10000"); + Lex=&String[0]; + test((ret=Lex.Val(TU16, (TRadix)EHex))==KErrOverflow); + + + + //////////////////////////// + // Test Val(TUint32, TRadix) + //////////////////////////// + test.Next(_L("Val(TUint32, TRadix)")); + TUint32 TU32; + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrNone); + test(TU32==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrNone); + test(TU32==1); + + _LL(&String[0], (TText8*)"11111111111111111111111111111111"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrNone); + test(TU32==4294967295u); + + _LL(&String[0], (TText8*)"100000000000000000000000000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EBinary))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrNone); + test(TU32==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrNone); + test(TU32==1); + + _LL(&String[0], (TText8*)"37777777777"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrNone); + test(TU32==4294967295u); + + _LL(&String[0], (TText8*)"40000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EOctal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrNone); + test(TU32==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrNone); + test(TU32==1); + + _LL(&String[0], (TText8*)"4294967295"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrNone); + test(TU32==4294967295u); + + _LL(&String[0], (TText8*)"4294967296"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EDecimal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrNone); + test(TU32==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrNone); + test(TU32==1); + + _LL(&String[0], (TText8*)"FFFFFFFF"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrNone); + test(TU32==4294967295u); + + _LL(&String[0], (TText8*)"100000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU32, (TRadix)EHex))==KErrOverflow); + + /////////////////////////////////// + // Test Val(TInt64, TRadix) + /////////////////////////////////// + test.Next(_L("Val(TInt64,TRadix)")); + TInt64 TI64; + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone); + test(TI64==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone); + test(TI64==1); + + _LL(&String[0], (TText8*)"11111111111111111111111111111111"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone); + test(TI64==TInt64(0xffffffffu)); + + _LL(&String[0], (TText8*)"100000000000000000000000000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone); + test(TI64==MAKE_TINT64(0x1,0x0)); + + _LL(&String[0], (TText8*)"1111111111111111111111111111111111111111111111111111111111111111"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrNone); + test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu)); + + _LL(&String[0], (TText8*)"10000000000000000000000000000000000000000000000000000000000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EBinary))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone); + test(TI64==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone); + test(TI64==1); + + _LL(&String[0], (TText8*)"37777777777"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone); + test(TI64==TInt64(0xffffffffu)); + + _LL(&String[0], (TText8*)"40000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone); + test(TI64==MAKE_TINT64(0x1,0x0)); + + _LL(&String[0], (TText8*)"1777777777777777777777"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrNone); + test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu)); + + _LL(&String[0], (TText8*)"2000000000000000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EOctal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone); + test(TI64==0); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; //************** iNext is set to "" by Val + test((ret=Lex.Val(TI64))==KErrNone); + test(TI64==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone); + test(TI64==1); + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TI64))==KErrNone); + test(TI64==1); + + _LL(&String[0], (TText8*)"4294967295"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone); + test(TI64==TInt64(0xffffffffu)); + _LL(&String[0], (TText8*)"4294967295"); + Lex=&String[0]; + test((ret=Lex.Val(TI64))==KErrNone); + test(TI64==TInt64(0xffffffffu)); + + _LL(&String[0], (TText8*)"4294967296"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone); + test(TI64==MAKE_TINT64(1,0)); + _LL(&String[0], (TText8*)"4294967296"); + Lex=&String[0]; + test((ret=Lex.Val(TI64))==KErrNone); + test(TI64==MAKE_TINT64(1,0)); + + _LL(&String[0], (TText8*)"18446744073709551615"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrNone); + test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu)); + _LL(&String[0], (TText8*)"18446744073709551616"); + Lex=&String[0]; + test((ret=Lex.Val(TI64))==KErrOverflow); + + _LL(&String[0], (TText8*)"-1"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EDecimal))==KErrGeneral); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone); + test(TI64==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone); + test(TI64==1); + + _LL(&String[0], (TText8*)"FFFFFFFF"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone); + test(TI64==TInt64(0xffffffffu)); + + _LL(&String[0], (TText8*)"100000000"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone); + test(TI64==MAKE_TINT64(1,0)); + + _LL(&String[0], (TText8*)"FFFFFFFFffffffff"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrNone); + test(TI64==MAKE_TINT64(0xffffffffu,0xffffffffu)); + + _LL(&String[0], (TText8*)"10000000000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TI64, (TRadix)EHex))==KErrOverflow); + + + /////////////////////////////////// + // Test Val(TUint, TRadix=(TRadix)EDecimal) + /////////////////////////////////// + test.Next(_L("Val(TUint, TRadix=(TRadix)EDecimal)")); + TUint TU; + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrNone); + test(TU==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrNone); + test(TU==1); + + _LL(&String[0], (TText8*)"11111111111111111111111111111111"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrNone); + test(TU==4294967295u); + + _LL(&String[0], (TText8*)"100000000000000000000000000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EBinary))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrNone); + test(TU==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrNone); + test(TU==1); + + _LL(&String[0], (TText8*)"37777777777"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrNone); + test(TU==4294967295u); + + _LL(&String[0], (TText8*)"40000000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EOctal))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrNone); + test(TU==0); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; //************** iNext is set to "" by Val + test((ret=Lex.Val(TU))==KErrNone); + test(TU==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrNone); + test(TU==1); + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU))==KErrNone); + test(TU==1); + + _LL(&String[0], (TText8*)"4294967295"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrNone); + test(TU==4294967295u); + _LL(&String[0], (TText8*)"4294967295"); + Lex=&String[0]; + test((ret=Lex.Val(TU))==KErrNone); + test(TU==4294967295u); + + _LL(&String[0], (TText8*)"4294967296"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EDecimal))==KErrOverflow); + _LL(&String[0], (TText8*)"4294967296"); + Lex=&String[0]; + test((ret=Lex.Val(TU))==KErrOverflow); + + _LL(&String[0], (TText8*)"00"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EHex))==KErrNone); + test(TU==0); + + _LL(&String[0], (TText8*)"01"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EHex))==KErrNone); + test(TU==1); + + _LL(&String[0], (TText8*)"FFFFFFFF"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EHex))==KErrNone); + test(TU==4294967295u); + + _LL(&String[0], (TText8*)"100000000"); + Lex=&String[0]; + test((ret=Lex.Val(TU, (TRadix)EHex))==KErrOverflow); + + + ///////////////////////////////// + // Test Val(TInt32, TUint aLimit) + ///////////////////////////////// + // This is called by several of the other Val methods and so has been indirectly tested already + test.Next(_L("Val(TInt32, TUint aLimit")); + + _LL(&String[0], (TText8*)"1000"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(T32,1000))==KErrNone); + test(T32==1000); + + _LL(&String[0], (TText8*)"1001"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(T32, 1000))==KErrOverflow); + + _LL(&String[0], (TText8*)"-1000"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(T32, 1000))==KErrNone); + test(T32==-1000); + + _LL(&String[0], (TText8*)"-1001"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(T32, 1000))==KErrNone); + test(T32==-1001); + + _LL(&String[0], (TText8*)"-1002"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(T32, 1000))==KErrOverflow); + + _LL(&String[0], (TText8*)"0"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(T32, 0))==KErrNone); + test(T32==0); + + _LL(&String[0], (TText8*)"1"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(T32, 0))==KErrOverflow); + + + ///////////////////////////////////////////////// + // Test Val(TUInt32, TRadix aRadix, TUint aLimit) + //////////////////////////////////////////////// + // This is called by several of the other Val methods and so has been indirectly tested already + test.Next(_L("Val(TUInt32, TRadix, TUint)")); + + // Test bug found during previous testing + _LL(&String[0], (TText8*)"10"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrNone); + test(TU32==10); + + _LL(&String[0], (TText8*)"11"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"19"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"20"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TU32, (TRadix)EDecimal, 10))==KErrOverflow); + + ///////////////////////////////////////////////// + // Test Val(TInt64, TRadix aRadix, TInt64 aLimit) + //////////////////////////////////////////////// + test.Next(_L("Val(TInt64, TRadix, TInt64)")); + + _LL(&String[0], (TText8*)"10"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrNone); + test(TI64==TInt64(10)); + + _LL(&String[0], (TText8*)"11"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"19"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"20"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"34532739886900"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone); + test(TI64==MAKE_TINT64(0x1f68u,0x47b1af34u)); + + _LL(&String[0], (TText8*)"34532739886901"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow); + + _LL(&String[0], (TText8*)"74532739886901"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow); + + _LL(&String[0], (TText8*)"6901"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EDecimal, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone); + test(TI64==TInt64(6901)); + + _LL(&String[0], (TText8*)"1f6847b1af34"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone); + test(TI64==MAKE_TINT64(0x1f68u,0x47b1af34u)); + + _LL(&String[0], (TText8*)"1f6847b1af35"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow); + + _LL(&String[0], (TText8*)"1f6847b1af340"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow); + + _LL(&String[0], (TText8*)"1e82791aed35"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, (TRadix)EHex, TInt64(0x56fba45u)))==KErrOverflow); + + ///////////////////////////////////////////////// + // Test Val(TInt64, TInt64 aLimit) + //////////////////////////////////////////////// + test.Next(_L("Val(TInt64, TInt64)")); + + _LL(&String[0], (TText8*)"10"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, 10))==KErrNone); + test(TI64==TInt64(10)); + + _LL(&String[0], (TText8*)"11"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"19"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"20"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, 10))==KErrOverflow); + + _LL(&String[0], (TText8*)"34532739886900"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone); + test(TI64==MAKE_TINT64(0x1f68u,0x47b1af34u)); + + _LL(&String[0], (TText8*)"34532739886901"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow); + + _LL(&String[0], (TText8*)"74532739886901"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrOverflow); + + _LL(&String[0], (TText8*)"6901"); + Lex=&String[0]; + test((ret=Lex.BoundedVal(TI64, MAKE_TINT64(0x1f68u,0x47b1af34u)))==KErrNone); + test(TI64==TInt64(6901)); + + test.End(); + } + +void testLocale() + { + + TLocale current; + current.Refresh(); + TLocale loc; + loc.Refresh(); + + TReal64 v,v8; + TLex l; + TLex8 l8; + TInt r; + + loc.SetDecimalSeparator('.'); + loc.Set(); + l=_L("-12.34"); + l8=_L8("-12.34"); + r=l.Val(v); + r=l8.Val(v8); + test(r==KErrNone); + test(v==-12.34); + test(v==v8); + + l=_L("-12.34"); + l8=_L8("-12.34"); + r=l.Val(v,'.'); + r=l8.Val(v8,'.'); + test(r==KErrNone); + test(v==-12.34); + test(v==v8); + l=_L("-12.34"); + l8=_L8("-12.34"); + r=l.Val(v,','); + r=l8.Val(v8,','); + test(r==KErrNone); + test(v==-12); + test(v==v8); + + l=_L("-12,34"); + l8=_L8("-12,34"); + r=l.Val(v); + r=l8.Val(v8); + test(r==KErrNone); + test(v==-12); + test(v==v8); + l=_L("-12,34"); + l8=_L8("-12,34"); + r=l.Val(v,'.'); + r=l8.Val(v8,'.'); + test(r==KErrNone); + test(v==-12); + test(v==v8); + l=_L("-12,34"); + l8=_L8("-12,34"); + r=l.Val(v,','); + r=l8.Val(v8,','); + test(r==KErrNone); + test(v==-12.34); + test(v==v8); + + loc.SetDecimalSeparator(','); + loc.Set(); + l=_L("-12.34"); + l8=_L8("-12.34"); + r=l.Val(v); + r=l8.Val(v8); + test(r==KErrNone); + test(v==-12); + test(v==v8); + + l=_L("-12.34"); + l8=_L8("-12.34"); + r=l.Val(v,'.'); + r=l8.Val(v8,'.'); + test(r==KErrNone); + test(v==-12.34); + test(v==v8); + l=_L("-12.34"); + l8=_L8("-12.34"); + r=l.Val(v,','); + r=l8.Val(v8,','); + test(r==KErrNone); + test(v==-12); + test(v==v8); + + l=_L("-12,34"); + l8=_L8("-12,34"); + r=l.Val(v); + r=l8.Val(v8); + test(r==KErrNone); + test(v==-12.34); + l=_L("-12,34"); + l8=_L8("-12,34"); + r=l.Val(v,'.'); + r=l8.Val(v8,'.'); + test(r==KErrNone); + test(v==-12); + test(v==v8); + l=_L("-12,34"); + l8=_L8("-12,34"); + r=l.Val(v,','); + r=l8.Val(v8,','); + test(r==KErrNone); + test(v==-12.34); + test(v==v8); + + loc.Set(); + current.Set(); + } + +#pragma warning( disable : 4705 ) // statement has no effect +GLDEF_C TInt E32Main() + { + + test.Title(); + + test.Start(_L("********* TLEX **********")); +#if defined(_UNICODE) + TestTLex, TLex16Dump, TLexMark16Dump, TText> T; +#else + TestTLex, TLex8Dump, TLexMark8Dump, TText> T; +#endif + test.Next(_L("TText 1")); + T.Test1(); + test.Next(_L("TText 2")); + T.Test2(); + test.Next(_L("TText 3")); + T.Test3(); + test.Next(_L("TText 4")); + T.Test4(); + test.Next(_L("TText 5")); + T.Test5(); + + TestTLex, TLex8Dump, TLexMark8Dump, TText8> T8; + test.Next(_L("TText8 1")); + T8.Test1(); + test.Next(_L("TText8 2")); + T8.Test2(); + test.Next(_L("TText8 3")); + T8.Test3(); + test.Next(_L("TText8 4")); + T8.Test4(); + test.Next(_L("TText8 5")); + T8.Test5(); + + TestTLex, TLex16Dump, TLexMark16Dump, TText16> T16; + test.Next(_L("TText16 1")); + T16.Test1(); + test.Next(_L("TText16 2")); + T16.Test2(); + test.Next(_L("TText16 3")); + T16.Test3(); + test.Next(_L("TText16 4")); + T16.Test4(); + test.Next(_L("TText16 5")); + T16.Test5(); + + test.Next(_L("Test TLex in different locales")); + testLocale(); + + test.End(); + return(KErrNone); + } +#pragma warning( default : 4705 ) + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_match.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_match.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2274 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_match.cpp +// Overview: +// Test the match methods of TPtrC8 and TPtrC16 objects and the +// TCharIterator TCombiningCharIterator, TCollationValueIterator +// and TCollationRawValueIterator classes. +// API Information: +// TPtrC8, TPtrC16, TCharIterator, TCombiningCharIterator, +// TCollationValueIterator, TCollationRawValueIterator +// Details: +// - Test and verify the results of TPtrC8 Match and MatchF methods +// on a variety of constant strings. Verify both match and mismatch +// conditions. +// - Test and verify the results of TPtrC16 Match and MatchF methods +// on a variety of constant strings. Verify both match and mismatch +// conditions. +// - For a TCharIterator object, test and verify: +// - basic character handling +// - ability to reset the iterator correctly +// - combining characters works as expected +// - ability to jump into the middle of combined characters +// - full-width variants are not modified +// - narrow strings work as expected +// - surrogate pairs work as expected +// - Using a TCombiningCharIterator object with a variety of character +// strings as input, verify that the output is as expected. +// - Using TCollationValueIterator and TCollationRawValueIterator objects: +// - test the raw iterator +// - test starting at different points in the iteration and verify capitals +// are ignored at level 0 +// - verify capitals are ignored at level 1 +// - verify capitals do not match at level 2 +// - check the TCollationValueIterator Restart method +// - test collation keys, when they success and when they fail halfway +// - exhaust the internal cache, verify object still works +// - test different decompositions at level 3 +// - verify results are as expected +// - Test and verify the results of the TUnicodeFold::FindWildcardMatchFolded() +// method on a variety of constant strings: find a string within another +// string, verify the offset into the candidate string if it is present, or +// KErrNotFound if it is not. +// - Test and verify the results of the TUnicodeFold::FindFolded() method on +// a variety of constant strings: compare two strings, verify return value. +// - Test and verify results of UnicodeFoldCase() on a variety of characters. +// - Test and verify results of MatchLeadingWildcards() on a variety of strings. +// - Test and verify results of MatchesHereFoldedWithPrefixTest() on a variety +// of strings. +// - Test and verify results of LocateFolded() on a variety of strings. +// - Test and verify results of FindFoldedWithWildcard() and FindMatchFolded() +// on a variety of strings. +// - Test and verify results of TDesc.CompareF() on a variety of strings. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include +#include "collateimp.h" +#include "compareimp.h" +#include "u32std.h" + +#ifndef __TOOLS2__ +///***************** copied from locale euser source code *********************** +static const TCollationMethod TheCollationMethod[] = + { + { + KUidBasicCollationMethod, // this is the standard unlocalised method + NULL, // null means use the standard table + NULL, // there's no override table + 0 // the flags are standard + } + }; +static const TCollationDataSet TheCollationDataSet = + { + TheCollationMethod, + 1 + }; +const LCharSet TheCharSet = + { + NULL, + &TheCollationDataSet + }; +const LCharSet* GetLocaleCharSet() + { + return &TheCharSet; + } +#endif +///******************************************************************************* + + +#ifdef __VC32__ + // Solve compilation problem caused by non-English locale + #pragma setlocale("english") +#endif + +#define ARRAY_SIZE(ar) (sizeof(ar) / (sizeof(ar[0]))) + +LOCAL_D RTest test(_L("T_MATCH")); + +#ifndef __TOOLS2__ +_LIT(KUnicodeTestDataFile, "z:\\Test\\UnicodeData.txt"); +#else +_LIT(KUnicodeTestDataFile, "UnicodeData.txt"); +#endif + +static const TUint32 TheDevanagariKey[] = + { + 0x22a010b,0x22b010b,0x285010b,0xb109,0xb209,0xb309,0xb409,0xb509, + 0x6c5e609,0x6c6e609,0x6c7e609,0x6c8e609,0x6c9e609,0x6cae609,0x6cbe609,0x6cce609, + 0x6cde609,0x6cee609,0xba40109,0xba50109,0xba60109,0xba70109,0xba80109,0xba90109, + 0xbaa0109,0xbab0109,0xbac0109,0xbad0109,0xbae0109,0xbaf0109,0xbb00109,0xbb10109, + 0xbb20109,0xbb30109,0xbb40109,0xbb50109,0xbb60109,0xbb70109,0xbb80109,0xbb90109, + 0xbb9b109,0xbba0109,0xbbab109,0xbbb0109,0xbbbb109,0xbbc0109,0xbbd0109,0xbbe0109, + 0xbbf0109,0xbc00109,0xbc0b109,0xbc10109,0xbc20109,0xbc30109,0xbc40109,0xbc50109, + 0xbc5b109,0xbc60109,0xbc6b109,0xbc70109,0xbc80109,0xbc90109,0xbca0109,0xbcb0109, + 0xbcc0109,0xbccb109,0xbcd0109,0xbce0109,0xbceb109,0xbcf0109,0xbd00109,0xbd10109, + 0xbd20109,0xbd2b109,0xbd30109,0xbd3b109,0xbd40109,0xbd50109,0xbd5b109,0xbd60109, + 0xbd70109,0xbd80109,0xbd90109,0xbda0109,0xbdb0109,0xbdc0109,0xbdd0109,0xbde0109, + 0xbdf0109,0xbe00109,0xbe10109,0xbe20109,0xbe30109,0xbe40109,0xbe50109,0xbe60109, + 0xbe70109,0xbe80109,0xbe90109,0xbea0109,0xbeb0109,0xbec0109,0xbed0109, + }; + +static const TUint32 TheDevanagariIndex[] = + { + 0x9010012,0x9020013,0x9030014,0x9050015,0x9060016,0x9070017,0x9080018,0x9090019, + 0x90a001a,0x90b001b,0x90c001d,0x90d001f,0x90e0020,0x90f0021,0x9100022,0x9110023, + 0x9120024,0x9130025,0x9140026,0x9150027,0x9160029,0x917002b,0x918002d,0x919002e, + 0x91a002f,0x91b0030,0x91c0031,0x91d0033,0x91e0034,0x91f0035,0x9200036,0x9210037, + 0x9220039,0x923003b,0x924003c,0x925003d,0x926003e,0x927003f,0x9280040,0x9290041, + 0x92a0042,0x92b0043,0x92c0045,0x92d0046,0x92e0047,0x92f0048,0x930004a,0x931004b, + 0x932004c,0x933004d,0x934004e,0x935004f,0x9360050,0x9370051,0x9380052,0x9390053, + 0x93c0003,0x93d0054,0x93e0055,0x93f0056,0x9400057,0x9410058,0x9420059,0x943005a, + 0x944005b,0x945005e,0x946005f,0x9470060,0x9480061,0x9490062,0x94a0063,0x94b0064, + 0x94c0065,0x94d0066,0x9510004,0x9520005,0x9530006,0x9540007,0x9580028,0x959002a, + 0x95a002c,0x95b0032,0x95c0038,0x95d003a,0x95e0044,0x95f0049,0x960001c,0x961001e, + 0x962005c,0x963005d,0x9640000,0x9650001,0x9660008,0x9670009,0x968000a,0x969000b, + 0x96a000c,0x96b000d,0x96c000e,0x96d000f,0x96e0010,0x96f0011,0x9700002, + }; + +static const TCollationKeyTable TheDevanagariTable = + { TheDevanagariKey, TheDevanagariIndex, 103, 0, 0, 0 }; + +static const TCollationMethod TheDevanagariMethod = + { 0, 0, &TheDevanagariTable, 0 }; + +static const TCollationMethod TheDevanagariIgnoreCombiningMethod = + { 0, 0, &TheDevanagariTable, TCollationMethod::EIgnoreCombining }; + +static const TUint32 TheSwedishKey[] = + { + 0x8f60109,0x8f70109,0x8f80109,0x8f60121,0x8f70121,0x8f80121,0x8dd0109,0x8dd0121, + 0x8c50121,0x8c50109, + }; + +static const TUint32 TheSwedishIndex[] = + { + 0x570008,0x770009, + }; + +static const TUint16 TheSwedishStringElement[] = + { + 0x2,0x61,0x30a,0x2,0x61,0x308,0x2,0x6f, + 0x308,0x2,0x41,0x30a,0x2,0x41,0x308,0x2, + 0x4f,0x308,0x2,0x75,0x308,0x2,0x55,0x308, + }; + +static const TUint32 TheSwedishStringIndex[] = + { + 0xc0004,0x90003,0xf0005,0x150007,0x30001,0x0,0x60002,0x120006, + }; + +static const TCollationKeyTable TheSwedishTable = + { TheSwedishKey, TheSwedishIndex, 2, TheSwedishStringElement, TheSwedishStringIndex, 8 }; + +static const TCollationMethod TheSwedishMethod = + { 0, 0, &TheSwedishTable, TCollationMethod::EIgnoreNone }; + +static const TCollationMethod TheIgnoreNoneMethod = + { 0, 0, 0, TCollationMethod::EIgnoreNone }; + +void TestPrintCaption(const TDesC& aTestName, const TText16 aStr[], TInt aLen) + { + test.Next(aTestName); + RDebug::Print(_L("Char seq: ")); + for(TInt i=0;i search, target; + //All Devanagari dependant vowels are in the following range + for(TInt dependantVowel=0x93e; dependantVowel<=0x94c; dependantVowel++) + { + //Most of the Devanagari consonants are in the following range + for(TInt consonant=0x915; consonant<=0x939; consonant++) + { + target.Format(_L("%c%c"),consonant,dependantVowel); + search.Format(_L("%c*"),consonant); + TestDisableCombiningCharacterCheckFlag(target, search); + } + } + //Test same situation but where consonants decompose to consonant + dependant vowel + TestDisableCombiningCharacterCheckFlag(_L("\x929"), _L("\x928*")); + TestDisableCombiningCharacterCheckFlag(_L("\x931"), _L("\x930*")); + TestDisableCombiningCharacterCheckFlag(_L("\x934"), _L("\x933*")); + TestDisableCombiningCharacterCheckFlag(_L("\x958"), _L("\x915*")); + TestDisableCombiningCharacterCheckFlag(_L("\x959"), _L("\x916*")); + TestDisableCombiningCharacterCheckFlag(_L("\x95a"), _L("\x917*")); + TestDisableCombiningCharacterCheckFlag(_L("\x95b"), _L("\x91c*")); + TestDisableCombiningCharacterCheckFlag(_L("\x95c"), _L("\x921*")); + TestDisableCombiningCharacterCheckFlag(_L("\x95d"), _L("\x922*")); + TestDisableCombiningCharacterCheckFlag(_L("\x95e"), _L("\x92b*")); + TestDisableCombiningCharacterCheckFlag(_L("\x95f"), _L("\x92f*")); + } + +_LIT(KHelloT, "Hello"); +_LIT(KLatin1AccentsC, "\xE0\xD2p\xE2\xEB\xED\xF1\xC7"); +_LIT(KLatin1AccentsD, "a\x300O\x300pa\x302\x65\x308i\x301n\x303\x43\x327"); +// four alpha + psili + varia + ypogegrameni +_LIT(KGreekAccentsC, "\x1f82\x1f82\x1f82\x1f82"); +// decomposed in four different ways +_LIT(KGreekAccentsS, "\x1f82\x1f02\x345\x1f00\x300\x345\x3b1\x313\x300\x345"); +// completely decomposed +_LIT(KGreekAccentsD, "\x3b1\x313\x300\x345\x3b1\x313\x300\x345\x3b1\x313\x300\x345\x3b1\x313\x300\x345"); +// full-width variants +_LIT(KFullWidth, "\xFF21\xFF42\xFF43"); +// surrogate pair, unpaired low surrogate, unpaired high surrogate, unpaired +// high surrogate at end of string +_LIT(KSurrogates, "\xD965\xDEF0\xDF12\xDB10\xDA4E"); +_LIT(KSurrogatesTest, "\xD965\xDEF0"); + +void TestIteratorOutput(TDecompositionIterator& aIt, const TDesC& aCheck) + { + TBool unpairedHighSurrogate = EFalse; + for(TInt i = 0; i != aCheck.Length(); aIt.Next()) + { + if (aIt.AtEnd()) + { + test(0); + return; + } + TInt c = aIt.Current(); + // test that we are not looking at an unpaired low surrogate that + // follows an unpaired high surrogate: this is not possible. + test((c & 0xFC00) != 0xDC00 || !unpairedHighSurrogate); + unpairedHighSurrogate = (c & 0xFC00) == 0xD800? (TBool)ETrue : (TBool)EFalse; + if (c < 0x10000) + { + test(c == aCheck[i]); + ++i; + } + else + { + TInt sp = ((aCheck[i] - 0xD7F7) << 10) + aCheck[i + 1]; + test(c == sp); + i += 2; + } + } + test(aIt.AtEnd()); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0097 +@SYMTestCaseDesc TUTF32Iterator functionality tested on 2 character sequences: + (1) single character + (2) surrogate pair +@SYMTestPriority High +@SYMTestActions TUTF32Iterator test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestUTF32Iterator() + { + //Single character + const TText16 KStr[] = {0x01D5}; + ::TestPrintCaption(_L("TUTF32Iterator"), KStr, ARRAY_SIZE(KStr)); + TUTF32Iterator it(KStr, KStr + ARRAY_SIZE(KStr)); + TInt itCount = 0; + for(;!it.AtEnd();++itCount, it.Next()) + { + TChar ch = it.Current(); + test(ch == static_cast (KStr[0])); + RDebug::Print(_L("%04X "), (TUint)ch); + } + test(itCount == 1); + RDebug::Print(_L("\n")); + //Surrogate pair + ::TestPrintCaption(_L("TUTF32Iterator-surrogates"), KSurrogatesTest().Ptr(), KSurrogatesTest().Length()); + it = TUTF32Iterator(KSurrogatesTest().Ptr(), KSurrogatesTest().Ptr() + KSurrogatesTest().Length()); + for(itCount=0;!it.AtEnd();++itCount, it.Next()) + { + TChar ch = it.Current(); + test(ch == 0x696F0); + RDebug::Print(_L("%06X "), (TUint)ch); + } + test(itCount == 1); + RDebug::Print(_L("\n")); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0098 +@SYMTestCaseDesc TFoldedDecompIterator functionality tested on 2 character sequences. +@SYMTestPriority High +@SYMTestActions TFoldedDecompIterator test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestFoldedDecompIterator() + { + //Character sequence 1: + //(1) DEVANAGARI LETTER FA - 0x095E, (2) LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5 + //Decompositions: + //(1) 0x095E decomposed to: 0x092B 0x093C + //(2) 0x01D5 decomposed to: 0x00DC 0x0304 + // 0x00DC decomposed to: 0x0055 0x0308 + // 0x0055 decomposed to: 0x0075 + const TText16 KStr[] = {0x095E, 0x01D5}; + const TText16 KStrOut[] = {0x092B, 0x093C, 0x0075, 0x0308, 0x0304}; + ::TestPrintCaption(_L("TFoldedDecompIterator-1"), KStr, ARRAY_SIZE(KStr)); + TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr)); + TFoldedDecompIterator it(itSrc); + TInt itCount = 0; + for(;!it.AtEnd();++itCount, it.Next()) + { + if(!it.IsInFoldedSequence()) + { + it.EnterFoldedSequence(); + } + TChar ch = it.Current(); + test(ch == static_cast (KStrOut[itCount])); + RDebug::Print(_L("%04X "), (TUint)ch); + } + test(itCount == ARRAY_SIZE(KStrOut)); + RDebug::Print(_L("\n")); + //Character sequence 2: + //(1) GREEK CAPITAL LETTER BETA - 0x0392 + //(2) COMBINING GRAVE ACCENT - 0x0300 + //(3) COMBINING GRAVE ACCENT BELOW - 0x0316 + //(4) GREEK CAPITAL LETTER GAMMA - 0x0393 + //(5) HEBREW POINT TSERE - 0x05B5 + //(6) TIBETAN MARK HALANTA - 0x0F84 + //Decompositions: + //(1) 0x0392 decomposed to: 0x03B2 + //(2) 0x0300 decomposed to: 0x0300 + //(3) 0x0316 decomposed to: 0x0316 + //(4) 0x0393 decomposed to: 0x03B3 + //(5) 0x05B5 decomposed to: 0x05B5 + //(6) 0x0F84 decomposed to: 0x0F84 + const TText16 KStr2[] = {0x0392, 0x0300, 0x0316, 0x0393, 0x05B5, 0x0F84}; + const TText16 KStrOut2[] = {0x03B2, 0x0300, 0x0316, 0x03B3, 0x05B5, 0x0F84}; + ::TestPrintCaption(_L("TFoldedDecompIterator-2"), KStr2, ARRAY_SIZE(KStr2)); + itSrc = TUTF32Iterator(KStr2, KStr2 + ARRAY_SIZE(KStr2)); + it = TFoldedDecompIterator(itSrc); + for(itCount=0;!it.AtEnd();++itCount, it.Next()) + { + if(!it.IsInFoldedSequence()) + { + it.EnterFoldedSequence(); + } + TChar ch = it.Current(); + test(ch == static_cast (KStrOut2[itCount])); + RDebug::Print(_L("%04X "), (TUint)ch); + } + test(itCount == ARRAY_SIZE(KStrOut2)); + RDebug::Print(_L("\n")); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0099 +@SYMTestCaseDesc TFoldedSortedDecompIterator functionality tested on 1 character sequence. +@SYMTestPriority High +@SYMTestActions TFoldedSortedDecompIterator test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestFoldedSortedDecompIterator() + { + //Character sequence 1: + //(1) GREEK CAPITAL LETTER BETA - 0x0392 + //(2) COMBINING GRAVE ACCENT - 0x0300 + //(3) COMBINING GRAVE ACCENT BELOW - 0x0316 + //(4) GREEK CAPITAL LETTER GAMMA - 0x0393 + //(5) HEBREW POINT TSERE - 0x05B5 + //(6) TIBETAN MARK HALANTA - 0x0F84 + //Decompositions: + //0x03B2 Class 0 + //0x0316 Class 220 + //0x0300 Class 230 + //0x03B3 Class 0 + //0x0F84 Class 9 + //0x05B5 Class 15 + const TText16 KStr[] = {0x0392, 0x0300, 0x0316, 0x0393, 0x05B5, 0x0F84}; + const TText16 KStrOut[] = {0x03B2, 0x0316, 0x0300, 0x03B3, 0x0F84, 0x05B5}; + const TInt KClass[] = {0, 220, 230, 0, 9, 15}; + ::TestPrintCaption(_L("TFoldedSortedDecompIterator"), KStr, ARRAY_SIZE(KStr)); + RDebug::Print(_L("\n")); + TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr)); + TFoldedDecompIterator itDecomp(itSrc); + TInt itCount = 0; + while(!itDecomp.AtEnd()) + { + if(!itDecomp.IsInFoldedSequence()) + { + itDecomp.EnterFoldedSequence(); + } + if(itDecomp.Current().GetCombiningClass() == 0) + { + TChar ch = itDecomp.Current(); + TInt clss = itDecomp.Current().GetCombiningClass(); + test(ch == static_cast (KStrOut[itCount])); + test(clss == KClass[itCount]); + RDebug::Print(_L("BaseCh %04X Class %d\n"), (TUint)ch, clss); + itDecomp.Next(); + ++itCount; + } + else + { + TFoldedSortedDecompIterator it; + it.Set(itDecomp); + while(!it.AtEnd()) + { + TChar ch = it.Current(); + TInt clss = it.Current().GetCombiningClass(); + test(ch == static_cast (KStrOut[itCount])); + test(clss == KClass[itCount]); + RDebug::Print(_L("CombCh %04X Class %d\n"), (TUint)ch, clss); + it.Next(); + ++itCount; + } + } + } + test(itCount == ARRAY_SIZE(KStrOut)); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0100 +@SYMTestCaseDesc TFoldedCanonicalIterator functionality tested on 1 character sequence. +@SYMTestPriority High +@SYMTestActions TFoldedCanonicalIterator test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestFoldedCanonicalIterator() + { + //Character sequence 1: + //(1) GREEK CAPITAL LETTER BETA - 0x0392 + //(2) COMBINING GRAVE ACCENT - 0x0300 + //(3) COMBINING GRAVE ACCENT BELOW - 0x0316 + //(4) GREEK CAPITAL LETTER GAMMA - 0x0393 + //(5) HEBREW POINT TSERE - 0x05B5 + //(6) TIBETAN MARK HALANTA - 0x0F84 + //(7) LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5 + //Decompositions: + //0x0392 to 0x03B2 + //0x0316 to 0x0316 + //0x0300 to 0x0300 + //0x0393 to 0x03B3 + //0x0F84 to 0x0F84 + //0x05B5 to 0x05B5 + //0x01D5 to 0x0075 0x0308 0x0304 + const TText16 KStr[] = {0x0392, 0x0300, 0x0316, 0x0393, 0x05B5, 0x0F84, 0x01D5}; + const TText16 KStrOut[] = {0x03B2, 0x0316, 0x0300, 0x03B3, 0x0F84, 0x05B5, 0x0075, 0x0308, 0x0304}; + TestPrintCaption(_L("TFoldedCanonicalIterator"), KStr, ARRAY_SIZE(KStr)); + TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr)); + TFoldedCanonicalIterator it(itSrc); + TInt itCount = 0; + + const TUnicodeDataSet* charDataSet = GetLocaleCharSet()->iCharDataSet; + + for(;!it.AtEnd();++itCount, it.Next(charDataSet)) + { + TChar ch = it.Current(); + test(ch == static_cast (KStrOut[itCount])); + RDebug::Print(_L("%04X "), (TUint)ch); + } + test(itCount == ARRAY_SIZE(KStrOut)); + RDebug::Print(_L("\n")); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0101 +@SYMTestCaseDesc TDecompositionIterator functionality tested on 1 character sequence +@SYMTestPriority High +@SYMTestActions TDecompositionIterator test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestDecompositionIterator2() + { + //Character sequence 1 + //LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5 + //Decomposition: + //0x01D5 to: 0x0055 0x0308 0x0304 + const TText16 KStr[] = {0x01D5}; + const TText16 KStrOut[] = {0x0055, 0x0308, 0x0304}; + TestPrintCaption(_L("TDecompositionIterator"), KStr, ARRAY_SIZE(KStr)); + TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr)); + TDecompositionIterator it; + it.Set(itSrc); + TInt itCount = 0; + for(;!it.AtEnd(); ++itCount, it.Next()) + { + TChar ch = it.Current(); + test(ch == static_cast (KStrOut[itCount])); + RDebug::Print(_L("%04X "), (TUint)ch); + } + test(itCount == ARRAY_SIZE(KStrOut)); + RDebug::Print(_L("\n")); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0102 +@SYMTestCaseDesc TCanonicalDecompositionIterator functionality tested on 1 character sequence +@SYMTestPriority High +@SYMTestActions TCanonicalDecompositionIterator test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestCanonicalDecompositionIterator2() + { + //Character sequence 1 + //LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5 + //Decomposition: + //0x01D5 to: 0x0055 0x0308 0x0304 + const TText16 KStr[] = {0x01D5}; + const TText16 KStrOut[] = {0x0055, 0x0308, 0x0304}; + TestPrintCaption(_L("TCanonicalDecompositionIterator"), KStr, ARRAY_SIZE(KStr)); + TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr)); + TCanonicalDecompositionIterator it; + it.Set(itSrc); + TInt itCount = 0; + for(;!it.AtEnd();++itCount, it.Next()) + { + TChar ch = it.Current(); + test(ch == static_cast (KStrOut[itCount])); + RDebug::Print(_L("%04X "), (TUint)ch); + } + test(itCount == ARRAY_SIZE(KStrOut)); + RDebug::Print(_L("\n")); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0103 +@SYMTestCaseDesc TCanonicalDecompositionIteratorCached functionality tested on 1 character sequence +@SYMTestPriority High +@SYMTestActions TCanonicalDecompositionIteratorCached test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestCanonicalDecompositionIteratorCached() + { + //Character sequence 1 + //LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x01D5 + //Decomposition: + //0x01D5 to: 0x0055 0x0308 0x0304 + const TText16 KStr[] = {0x01D5}; + const TText16 KStrOut[] = {0x0055, 0x0308, 0x0304}; + TestPrintCaption(_L("TCanonicalDecompositionIteratorCached"), KStr, ARRAY_SIZE(KStr)); + TUTF32Iterator itSrc(KStr, KStr + ARRAY_SIZE(KStr)); + TCanonicalDecompositionIteratorCached it; + it.Set(itSrc); + TInt itCount = 0; + for(;!it.AtEnd();++itCount, it.Next(1)) + { + TChar ch = it.Get(0); + test(ch == static_cast (KStrOut[itCount])); + RDebug::Print(_L("%04X "), (TUint)ch); + } + test(itCount == ARRAY_SIZE(KStrOut)); + RDebug::Print(_L("\n")); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0104 +@SYMTestCaseDesc TDecompositionIterator test +@SYMTestPriority High +@SYMTestActions TDecompositionIterator test. +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestDecompositionIterator() + { + TDecompositionIterator i; + + // test basic character handling + TUTF32Iterator i1(KHelloT().Ptr(), KHelloT().Ptr() + KHelloT().Length()); + i.Set(i1); + TestIteratorOutput(i, KHelloT); + + TUTF32Iterator i2(KHelloT().Ptr() + 3, KHelloT().Ptr() + KHelloT().Length()); + i.Set(i2); + TestIteratorOutput(i, KHelloT().Mid(3)); + + // test combining characters + TUTF32Iterator i3(KLatin1AccentsC().Ptr(), KLatin1AccentsC().Ptr() + KLatin1AccentsC().Length()); + i.Set(i3); + TestIteratorOutput(i, KLatin1AccentsD); + + TUTF32Iterator i4(KGreekAccentsC().Ptr(), KGreekAccentsC().Ptr() + KGreekAccentsC().Length()); + i.Set(i4); + TestIteratorOutput(i, KGreekAccentsD); + + TUTF32Iterator i5(KGreekAccentsS().Ptr(), KGreekAccentsS().Ptr() + KGreekAccentsS().Length()); + i.Set(i5); + TestIteratorOutput(i, KGreekAccentsD); + + // test that full-width variants are not fiddled with + TUTF32Iterator i6(KFullWidth().Ptr(), KFullWidth().Ptr() + KFullWidth().Length()); + i.Set(i6); + TestIteratorOutput(i, KFullWidth); + + TUTF32Iterator i7(KSurrogates().Ptr(), KSurrogates().Ptr() + KSurrogates().Length()); + i.Set(i7); + TestIteratorOutput(i, KSurrogatesTest); + } + +//The function collects collation keys at the specified level aLevel from aIt iterator +//and stores them in aBuf output parameter. +//aExpectedNumKeys value specifies the count of expected collation keys. +void GetKeys(TCollationValueIterator& aIt, TUint32* aBuf, TInt aLevel, TInt aExpectedNumKeys) + { + //Zero the output parameter + Mem::FillZ(aBuf, sizeof(TUint32) * aExpectedNumKeys); + //Get the keys + TInt i = 0; + for(;i!=aExpectedNumKeys;++i) + { + for (;;) + { + (void)aIt.GetCurrentKey(aLevel, aBuf[i]); + test(aIt.Increment()); + if(aBuf[i] != 0) + { + break; + } + } + } + //The rest of the keys at that level should have 0 value. + for(;aIt.Increment();) + { + TUint32 key = 0; + (void)aIt.GetCurrentKey(aLevel, key); + test(key == 0); + } + } + +//The function collects the raw keys from aIt iterator and stores them in aBuf output parameter. +//aExpectedNumKeys value specifies the count of expected raw collation keys. +void GetRawKeys(TCollationValueIterator& aIt, TCollationKey* aBuf, TInt aExpectedNumKeys) + { + //Zero the output parameter + Mem::FillZ(aBuf, sizeof(TCollationKey) * aExpectedNumKeys); + //Get the keys + for(TInt i=0;i!=aExpectedNumKeys;++i) + { + test(aIt.GetCurrentKey(aBuf[i])); + aIt.Increment(); + } + //One additional GetCurrentKey() call. Because there shouldn't be more raw keys than + //aExpectedNumKeys, the call should fail returning EFalse. + TCollationKey dummy; + test(!aIt.GetCurrentKey(dummy)); + } + +//The function gets a sequence of raw collation keys in aBuf parameter and a character number +//aCharNo in the original string. +//It returns the position in aBuf where raw collation key sequence for aCharNo starts. +TInt CharNo2CollKeyPos(const TCollationKey* aBuf, TInt aBufLen, TInt aCharNo) + { + TInt starterCnt = 0; + TInt pos = 0; + do + { + if(aBuf[pos].IsStarter()) + { + ++starterCnt; + } + } while(starterCnt!=(aCharNo+1) && ++pos!=aBufLen); + test(pos != aBufLen); + return pos; + } + +//The function compares aBuf1 and aBuf2 and returns how many elements in aBuf1 differ +//from the elements in aBuf2 at the same position. +TInt CountDiscrepancies(TUint32* aBuf1, TUint32* aBuf2, TInt aCount) + { + TInt discrepancies = 0; + for (; aCount; --aCount) + { + if (*aBuf1++ != *aBuf2++) + ++discrepancies; + } + return discrepancies; + } + +TInt CountDiscrepancies(TCollationKey* aBuf1, TCollationKey* aBuf2, TInt aCount) + { + TInt discrepancies = 0; + for (; aCount; --aCount) + { + if (aBuf1->iHigh != aBuf2->iHigh || aBuf1->iLow != aBuf2->iLow) + ++discrepancies; + ++aBuf1; + ++aBuf2; + } + return discrepancies; + } + +_LIT(KAYZAccentsAbove, "\xE0\x301y\x302z\x303\x304"); +_LIT(KCapitalAYZAccentsAbove, "A\x300\x301Y\x302Z\x303\x304"); +_LIT(KCapitalYAYZAccentsAbove, "a\x300\x301Y\x302z\x303\x304"); +_LIT(KABCRuleTest, "abcwabkakb"); +_LIT(KABCRuleExpected, "eeabkakb"); +//_LIT(KExhaustCaches, "0123456789ABCDEFexhausted"); +_LIT(KGreekOPVY1, "\x1f82"); +_LIT(KGreekOPVY2, "\x1f02\x345"); +_LIT(KGreekOPVY3, "\x1f00\x300\x345"); +_LIT(KGreekOPVY4, "\x3b1\x313\x300\x345"); +_LIT(KGreekOPVY5, "\x3b1\x313\x345\x300"); +_LIT(KGreekOPVY6, "\x3b1\x345\x313\x300"); + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0105 +@SYMTestCaseDesc TCollationValueIterator test +@SYMTestPriority High +@SYMTestActions TCollationValueIterator tests +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void TestCollationValueIterator() + { + // a funny pair of extra collation rules: w and abc both collate as e. + TUint32 abcWTLKey[] = {0/* key for 'e' will go here */, + 0x8ff00101, 0x8ff10101, 0x8ff20101, 0x8ff30101, + 0x8ff40101, 0x8ff50101, 0x8ff60101}; + const TUint32 overrideIndex[] = {0x00770000, 0x0E010001, 0x0E400002, 0x0E440003, + 0x0E810004, 0x0EC10005, 0x0EC20006, 0xEC30007}; + const TUint16 abcString[4] = {0x0003, 0x0061, 0x0062, 0x0063}; + const TUint32 abcStringIndex = 0; + TCollationMethod method; + method.iId = 0; + method.iMainTable = StandardCollationMethod(); + method.iFlags = TCollationMethod::EIgnoreNone; + TInt charindex; + for (charindex = 0; method.iMainTable->iIndex[charindex] >> 16 != 'e'; ++charindex) + { + } + abcWTLKey[0] = method.iMainTable->iKey[method.iMainTable->iIndex[charindex] & 0xFFFF]; + TCollationKeyTable overrideTable = {abcWTLKey, overrideIndex, sizeof(abcWTLKey)/4, abcString, &abcStringIndex, 1}; + method.iOverrideTable = &overrideTable; + + TCollationValueIterator v(method); + TCollationValueIterator rv(method); + + TUint32 buf1[32]; + TUint32 buf2[32]; + + TCollationKey raw1[32]; + TCollationKey raw2[32]; + const TInt KRawKeyCnt = 8;//Raw collation key count produced from KAYZAccentsAbove string. + + //Get the raw key sequence for the whole KAYZAccentsAbove string. + TUTF32Iterator it(KAYZAccentsAbove().Ptr(), KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + rv.SetSourceIt(it); + ::GetRawKeys(rv, raw1, KRawKeyCnt); + + //KAYZAccentsAbove related constants + const TInt KBaseCharCnt = 3;//The number of base characters (A, y, z) in KAYZAccentsAbove string. + const TInt KOrgPosA = 0;//A position in KAYZAccentsAbove + const TInt KOrgPosY = 2;//y position in KAYZAccentsAbove + const TInt KOrgPosZ = 4;//z position in KAYZAccentsAbove + //Find where the collation key sequences start for A, y, z characters in KAYZAccentsAbove string. + const TInt KCollKeyPosA = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 0); + const TInt KCollKeyPosY = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 1); + const TInt KCollKeyPosZ = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 2); + + //Get the raw key sequence for character A in KAYZAccentsAbove string. + it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosA, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + rv.SetSourceIt(it); + ::GetRawKeys(rv, raw2 + KCollKeyPosA, KRawKeyCnt - KCollKeyPosA); + // + test(0 == ::CountDiscrepancies(raw1, raw2, KRawKeyCnt)); + + //Get the raw key sequence for character Y in KAYZAccentsAbove string. + it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosY, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + rv.SetSourceIt(it); + ::GetRawKeys(rv, raw2 + KCollKeyPosY, KRawKeyCnt - KCollKeyPosY); + // + test(0 == ::CountDiscrepancies(raw1, raw2, KRawKeyCnt)); + + //Get the raw key sequence for character Z in KAYZAccentsAbove string. + it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosZ, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + rv.SetSourceIt(it); + ::GetRawKeys(rv, raw2 + KCollKeyPosZ, KRawKeyCnt - KCollKeyPosZ); + // + test(0 == ::CountDiscrepancies(raw1, raw2, KRawKeyCnt)); + + //Test starting at different points in the iteration + + //Level 0 + //The whole string + it = TUTF32Iterator(KAYZAccentsAbove().Ptr(), KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf1, 0, KBaseCharCnt); + //String from Y pos. + it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosY, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 0, KBaseCharCnt - 1); + // + test(0 == ::CountDiscrepancies(buf1 + 1, buf2, KBaseCharCnt - 1)); + //String from Z pos. + it = TUTF32Iterator(KAYZAccentsAbove().Ptr() + KOrgPosZ, KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 0, KBaseCharCnt - 2); + // + test(0 == ::CountDiscrepancies(buf1 + 2, buf2, KBaseCharCnt - 2)); + + //Level 1 + //KCapitalAYZAccentsAbove is used in this test. + it = TUTF32Iterator(KCapitalAYZAccentsAbove().Ptr(), KCapitalAYZAccentsAbove().Ptr() + KCapitalAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetRawKeys(v, raw1, 8); + const TInt KOrgPosY2 = 3;//Y position in KCapitalAYZAccentsAbove + const TInt KCollKeyPosY2 = ::CharNo2CollKeyPos(raw1, KRawKeyCnt, 1); + //The whole string + it = TUTF32Iterator(KCapitalAYZAccentsAbove().Ptr(), KCapitalAYZAccentsAbove().Ptr() + KCapitalAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf1, 1, 8); + //String from Y pos. + it = TUTF32Iterator(KCapitalAYZAccentsAbove().Ptr() + KOrgPosY2, KCapitalAYZAccentsAbove().Ptr() + KCapitalAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 1, 8 - KCollKeyPosY2); + // + test(0 == ::CountDiscrepancies(buf1 + KCollKeyPosY2, buf2, 8 - KCollKeyPosY2)); + + //Level 2 + //Capitals do not match at level 2 + it = TUTF32Iterator(KAYZAccentsAbove().Ptr(), KAYZAccentsAbove().Ptr() + KAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf1, 2, 8); + it = TUTF32Iterator(KCapitalYAYZAccentsAbove().Ptr(), KCapitalYAYZAccentsAbove().Ptr() + KCapitalYAYZAccentsAbove().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 2, 8); + // + test(1 == CountDiscrepancies(buf1, buf2, 8)); + test(buf1[3] != buf2[3]); + + //Test funny collation keys, when they succeed and when they fail half way. + it = TUTF32Iterator(KABCRuleTest().Ptr(), KABCRuleTest().Ptr() + KABCRuleTest().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf1, 0, 8); + it = TUTF32Iterator(KABCRuleExpected().Ptr(), KABCRuleExpected().Ptr() + KABCRuleExpected().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 0, 8); + // + test(0 == ::CountDiscrepancies(buf1, buf2, 8)); + + //Test different decompositions at level 3 + it = TUTF32Iterator(KGreekOPVY1().Ptr(), KGreekOPVY1().Ptr() + KGreekOPVY1().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf1, 3, 4); + // + it = TUTF32Iterator(KGreekOPVY2().Ptr(), KGreekOPVY2().Ptr() + KGreekOPVY2().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 3, 4); + // + test(0 == ::CountDiscrepancies(buf1, buf2, 4)); + // + it = TUTF32Iterator(KGreekOPVY3().Ptr(), KGreekOPVY3().Ptr() + KGreekOPVY3().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 3, 4); + // + test(0 == ::CountDiscrepancies(buf1, buf2, 4)); + // + it = TUTF32Iterator(KGreekOPVY4().Ptr(), KGreekOPVY4().Ptr() + KGreekOPVY4().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 3, 4); + // + test(0 == ::CountDiscrepancies(buf1, buf2, 4)); + // + it = TUTF32Iterator(KGreekOPVY5().Ptr(), KGreekOPVY5().Ptr() + KGreekOPVY5().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 3, 4); + // + test(0 == ::CountDiscrepancies(buf1, buf2, 4)); + // + it = TUTF32Iterator(KGreekOPVY6().Ptr(), KGreekOPVY6().Ptr() + KGreekOPVY6().Length()); + v.SetSourceIt(it); + ::GetKeys(v, buf2, 3, 4); + // + test(0 == ::CountDiscrepancies(buf1, buf2, 4)); + } + +// folding tests + +// equivalence classes: all codes that fold to the same letter (which must be present +// in the list). The lists are separated by -1. The end is marked with two -1s. +// Each list must be in increasing order. +TInt FoldingEquivalenceClasses[] = + { + 'A', 'a', -1, 'Z', 'z', -1, '@', -1, '[', -1, '{', -1, 127, -1, 'I', 'i', 0x131, -1, 0, -1, + ' ', 0xA0, -1, + 0x300, -1, 0x301, -1, + 0x141, 0x142, -1, + 0x1c4, 0x1c5, 0x1c6, -1, 0x1c7, 0x1c8, 0x1c9, -1, 0x1ca, 0x1cb, 0x1cc, -1, + 0x1f1, 0x1f2, 0x1f3, -1, 0x3a3, 0x3c2, 0x3c3, 0x3f2, -1, + 0x402, 0x452, -1, 0x40F, 0x45F, -1, 0x460, 0x461, -1, 0x480, 0x481, -1, 0x482, -1, + 0x410, 0x430, -1, 0x42F, 0x44f, -1, 0x48C, 0x48D, -1, 0x4e8, 0x4e9, -1, + 0x531, 0x561, -1, 0x556, 0x586, -1, 0x559, -1, 0x55f, -1, -1 + }; + +//_LIT(KMatchLeadingCandidate1, "\xE1\x65\x300\x301\x302\x303pqa\x301"); +//_LIT(KNoQMs, "a???"); +//_LIT(KOneQM, "?a"); +//_LIT(KTwoQMs, "??"); +//_LIT(KThreeQMs, "???*?"); + +//Constructs TUTF32Iterator iterator from aStr +TUTF32Iterator UTF32It(const TDesC16& aStr) + { + return TUTF32Iterator(aStr.Ptr(), aStr.Ptr() + aStr.Length()); + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-0107 +@SYMTestCaseDesc MatchSectionFolded test +@SYMTestPriority High +@SYMTestActions MatchSectionFolded test +@SYMTestExpectedResults The test must not fail. +@SYMPREQ814 Optimise folded string comparisons. +*/ +void MatchSectionFoldedTest() + { + TUTF32Iterator candidateIt, searchTermIt; + + candidateIt = UTF32It(_L16("\xE1")); + searchTermIt = UTF32It(_L16("a")); + test(!MatchSectionFolded(candidateIt, searchTermIt)); + + candidateIt = UTF32It(_L16("a")); + searchTermIt = UTF32It(_L16("\xE1")); + test(!MatchSectionFolded(candidateIt, searchTermIt)); + + candidateIt = UTF32It(_L16("abca\xE1\x62\x62\x61\x61\x61\x62\x63\x62\x61")); + searchTermIt = UTF32It(_L16("aBc")); + test(MatchSectionFolded(candidateIt, searchTermIt)); + test(searchTermIt.AtEnd()); + TPtrC16 p1(_L16("a\xE1\x62\x62\x61\x61\x61\x62\x63\x62\x61")); + TPtrC16 p2(candidateIt.CurrentPosition(), 11); + test(p1 == p2); + + candidateIt = UTF32It(_L16("aaaacdeiooo")); + searchTermIt = UTF32It(_L16("acde")); + test(!MatchSectionFolded(candidateIt, searchTermIt)); + } + +//FindMatchSectionFolded test +void DoFindMatchSectionFoldedTest(const TDesC16& aCandidate, const TDesC16& aSearchTerm, TInt aPos) + { + TUTF32Iterator candidateIt, searchTermIt; + candidateIt = UTF32It(aCandidate); + searchTermIt = UTF32It(aSearchTerm); + if(aPos >= 0) + { + test(FindMatchSectionFolded(candidateIt, searchTermIt)); + test(searchTermIt.AtEnd()); + } + else + { + test(!FindMatchSectionFolded(candidateIt, searchTermIt)); + } + } + +//This class is used for reading lines from the unicode data file. +class RUnicodeTestDataFile + { +public: + RUnicodeTestDataFile(); + void OpenLC(); + void Close(); + TBool NextStmt(TPtrC8& aStmt); +private: + HBufC8* iFileData; + TInt iStartPos; + }; + +RUnicodeTestDataFile::RUnicodeTestDataFile() : + iFileData(NULL), + iStartPos(0) + { + } + +void RUnicodeTestDataFile::OpenLC() + { + __ASSERT_ALWAYS(!iFileData && !iStartPos, User::Invariant()); + iFileData = NULL; + iStartPos = 0; + CleanupClosePushL(*this); + + RFs fileSess; + CleanupClosePushL(fileSess); + User::LeaveIfError(fileSess.Connect()); + + RFile file; + CleanupClosePushL(file); + User::LeaveIfError(file.Open(fileSess, KUnicodeTestDataFile, EFileRead)); + + TInt fileSize; + User::LeaveIfError(file.Size(fileSize)); + __ASSERT_ALWAYS(fileSize > 0, User::Invariant()); + + iFileData = HBufC8::NewL(fileSize + 1); + + TPtr8 p = iFileData->Des(); + User::LeaveIfError(file.Read(p)); + + CleanupStack::PopAndDestroy(2, &fileSess); + } + +void RUnicodeTestDataFile::Close() + { + delete iFileData; + iFileData = NULL; + iStartPos = 0; + } + +TBool RUnicodeTestDataFile::NextStmt(TPtrC8& aStmt) + { + aStmt.Set(NULL, 0); + if(iStartPos < iFileData->Length()) + { + const TUint8* pStart = iFileData->Des().Ptr() + iStartPos; + const TUint8* pEnd = pStart; + while(*pEnd++ != 0x0A) + { + } + iStartPos += pEnd - pStart; + aStmt.Set(pStart, pEnd - pStart - 1); + return ETrue; + } + return EFalse; + } + +//Get a field "aFieldNo" from "aStr" statement containing encoded unicode character data +TPtrC8 GetUnicodeDataField(const TPtrC8& aStr, TInt aFieldNo) + { + const TUint8* pStart = aStr.Ptr(); + //Find the beginning of the field + TInt count = 0; + while(count < aFieldNo) + { + if(*pStart++ == ';') + { + ++count; + } + } + //Find the end of the field + const TUint8* pEnd = pStart; + while(*pEnd++ != ';') + { + } + //Construct a string from the field data + TPtrC8 ptr(pStart, pEnd - pStart - 1); + return ptr; + } + +//Construct a string "aStr" with the extracted hex codes from "aUnicodeData" +//The extracted unicodes are placed not from position 0, because some of +//the decomposable unicode characters are combining characters. If "aStr" is a search +//string, then the searching algorithm will not work. +void FillStringL(TDes16& aStr, const TDesC8& aUnicodeData) + { + aStr.SetLength(aStr.MaxLength()); + TLex8 lex(aUnicodeData); + TInt len = 0; + for(len=0;!lex.Eos();++len) + { + TUint32 code; + User::LeaveIfError(lex.Val(code, EHex)); + lex.Assign(lex.NextToken()); + aStr[1+len] = (TUint16)code; + } + __ASSERT_ALWAYS(len > 0, User::Invariant()); + aStr.SetLength(1 + len); + } + +//Get the character unicode, which is at position 0 +TUint32 GetChCodeL(const TDesC8& aStr) + { + TLex8 lex(aStr); + TUint32 chCode; + User::LeaveIfError(lex.Val(chCode, EHex)); + return chCode; + } + +//Simple unicode folding tests +void FindMatchSectionFoldedTestSimple() + { + _LIT16(KCandidate, "abca\xE1\x62\x62\x61\x61\x61\x62\x63\x62\x61"); + DoFindMatchSectionFoldedTest(KCandidate, _L("abc"), 0); + DoFindMatchSectionFoldedTest(KCandidate, _L("abb"), -1); + DoFindMatchSectionFoldedTest(KCandidate, _L("caa"), -1); + DoFindMatchSectionFoldedTest(KCandidate, _L("abcb"), 9); + DoFindMatchSectionFoldedTest(KCandidate, _L("\xE1"), 4); + DoFindMatchSectionFoldedTest(KCandidate, _L("a\x301"), 4); + DoFindMatchSectionFoldedTest(KCandidate, _L("A\xC1\x42\x42"), 3); + DoFindMatchSectionFoldedTest(KCandidate, _L("a\x301\x42\x42"), 4); + DoFindMatchSectionFoldedTest(KCandidate, _L("a?BB"), 3); + DoFindMatchSectionFoldedTest(KCandidate, _L(""), 0); + DoFindMatchSectionFoldedTest(KCandidate, _L("?"), 0); + DoFindMatchSectionFoldedTest(KCandidate, _L("??????????????"), 0); + DoFindMatchSectionFoldedTest(KCandidate, _L("???????????????"), -1); + DoFindMatchSectionFoldedTest(KCandidate, _L("????a?????????"), -1); + DoFindMatchSectionFoldedTest(KCandidate, _L("???a??????????"), 0); + DoFindMatchSectionFoldedTest(KCandidate, _L("caa?"), -1); + DoFindMatchSectionFoldedTest(KCandidate, _L("abcb?"), 9); + DoFindMatchSectionFoldedTest(KCandidate, _L("abcb??"), -1); + DoFindMatchSectionFoldedTest(KCandidate, _L("b?aa"), 5); + } + +//Extended tests - all characters, having non-zero "character decomposition mapping" field +//or non-zero "upper case mapping" field +void FindMatchSectionFoldedTestComplexL() + { + TBuf16<10> candidate; + candidate.Copy(_L16("abcdefghij")); + TBuf16<10> searchTerm; + searchTerm.Copy(_L16("eeeeefghij")); + const TInt KChPos = 5; + //Read and parse each line from the unicode data file. + RUnicodeTestDataFile unicodeTestDataFile; + unicodeTestDataFile.OpenLC(); + TPtrC8 stmt; + while(unicodeTestDataFile.NextStmt(stmt) && stmt.Length() > 0) + { + //Get the character code + TUint32 chCode = GetChCodeL(stmt); + //Do not test characters, which code is > 0xFFFF + if(chCode > (TUint32)0xFFFF) + { + continue; + } + //"LATIN CAPITAL LETTER I WITH DOT ABOVE" - the searching algorithm does not work with it. + if(chCode == (TUint32)0x0130) + { + continue; + } + candidate[KChPos] = (TUint16)chCode; + //"Character decomposition mapping" is the 5th field, starting from 0. + TPtrC8 decomp(GetUnicodeDataField(stmt, 5)); + if(decomp.Length() > 1 && decomp[0] != '<') + { + //This character has valid decomposition mapping - test it. + //Construct the search string + FillStringL(searchTerm, decomp); + //Test + DoFindMatchSectionFoldedTest(candidate, searchTerm, KChPos); + } + //"Uppercase mapping" is the 12th field, starting from 0. + TPtrC8 upperc(GetUnicodeDataField(stmt, 12)); + if(upperc.Length() > 1) + { + //This character has valid uppercase mapping - test it. + //Construct the search string + FillStringL(searchTerm, upperc); + //Test + DoFindMatchSectionFoldedTest(candidate, searchTerm, KChPos); + } + }//end of "while" - for each file statement + CleanupStack::PopAndDestroy(&unicodeTestDataFile); + } + +//MatchStringFolded test +void MatchStringFoldedTestL() + { + TBuf16<2> candidate; + candidate.Copy(_L16("aa")); + TBuf16<10> searchTerm; + searchTerm.Copy(_L16("aaaaaaaaaa")); + const TInt KChPos = 1; + //Read and parse each line from the unicode data file. + RUnicodeTestDataFile unicodeTestDataFile; + unicodeTestDataFile.OpenLC(); + TPtrC8 stmt; + while(unicodeTestDataFile.NextStmt(stmt) && stmt.Length() > 0) + { + //Get the character code + TUint32 chCode = GetChCodeL(stmt); + //Do not test characters, which code is > 0xFFFF + if(chCode > (TUint32)0xFFFF) + { + continue; + } + //"LATIN CAPITAL LETTER I WITH DOT ABOVE" - the searching algorithm does not work with it. + if(chCode == (TUint32)0x0130) + { + continue; + } + candidate[KChPos] = (TUint16)chCode; + //"Character decomposition mapping" is the 5th field, starting from 0. + TPtrC8 decomp(GetUnicodeDataField(stmt, 5)); + if(decomp.Length() > 1 && decomp[0] != '<') + { + //This character has valid decomposition mapping - test it. + //Construct the search string + FillStringL(searchTerm, decomp); + //Test + test(MatchStringFolded(candidate.Ptr(), candidate.Ptr() + candidate.Length(), + searchTerm.Ptr(), searchTerm.Ptr() + searchTerm.Length())); + } + //"Uppercase mapping" is the 12th field, starting from 0. + TPtrC8 upperc(GetUnicodeDataField(stmt, 12)); + if(upperc.Length() > 1) + { + //This character has valid uppercase mapping - test it. + //Construct the search string + FillStringL(searchTerm, upperc); + //Test + test(MatchStringFolded(candidate.Ptr(), candidate.Ptr() + candidate.Length(), + searchTerm.Ptr(), searchTerm.Ptr() + searchTerm.Length())); + } + }//end of "while" - for each file statement + CleanupStack::PopAndDestroy(&unicodeTestDataFile); + } + +void FindMatchSectionFoldedTestL() + { + FindMatchSectionFoldedTestSimple(); + FindMatchSectionFoldedTestComplexL(); + } + +void TestFindMatchFoldedL() + { + MatchSectionFoldedTest(); + FindMatchSectionFoldedTestL(); + MatchStringFoldedTestL(); + } + +void TestCompareFoldedEqual(const TDesC& a, const TDesC& b) + { + test(a.CompareF(b) == 0); + test(b.CompareF(a) == 0); + } + +void TestCompareFolded() + { + // Latin Extended A + TestCompareFoldedEqual(_L("\x100"), _L("\x101")); + TestCompareFoldedEqual(_L("\x100"), _L("A\x304")); + TestCompareFoldedEqual(_L("\x100"), _L("a\x304")); + TestCompareFoldedEqual(_L("\x104"), _L("\x105")); + TestCompareFoldedEqual(_L("\x104"), _L("a\x328")); + TestCompareFoldedEqual(_L("\x107"), _L("C\x301")); + TestCompareFoldedEqual(_L("\x10F"), _L("\x10E")); + TestCompareFoldedEqual(_L("\x10F"), _L("D\x30C")); + TestCompareFoldedEqual(_L("\x110"), _L("\x111")); + TestCompareFoldedEqual(_L("\x123"), _L("G\x327")); + TestCompareFoldedEqual(_L("\x132"), _L("\x133")); + TestCompareFoldedEqual(_L("\x131"), _L("i")); + TestCompareFoldedEqual(_L("\x131"), _L("I")); + TestCompareFoldedEqual(_L("i"), _L("I")); + TestCompareFoldedEqual(_L("\x13F"), _L("\x140")); + TestCompareFoldedEqual(_L("\x141"), _L("\x142")); + TestCompareFoldedEqual(_L("\x14A"), _L("\x14B")); + TestCompareFoldedEqual(_L("\x150"), _L("\x151")); + TestCompareFoldedEqual(_L("\x150"), _L("o\x30B")); + TestCompareFoldedEqual(_L("\x152"), _L("\x153")); + TestCompareFoldedEqual(_L("\x17D"), _L("\x17E")); + TestCompareFoldedEqual(_L("\x17D"), _L("z\x30C")); + // Latin Extended B + TestCompareFoldedEqual(_L("\x182"), _L("\x183")); + TestCompareFoldedEqual(_L("\x184"), _L("\x185")); + TestCompareFoldedEqual(_L("\x187"), _L("\x188")); + TestCompareFoldedEqual(_L("\x18A"), _L("\x257")); + TestCompareFoldedEqual(_L("\x194"), _L("\x263")); + TestCompareFoldedEqual(_L("\x195"), _L("\x1F6")); + TestCompareFoldedEqual(_L("\x196"), _L("\x269")); + TestCompareFoldedEqual(_L("\x1A2"), _L("\x1A3")); + TestCompareFoldedEqual(_L("\x1A6"), _L("\x280")); + TestCompareFoldedEqual(_L("\x1BF"), _L("\x1F7")); + TestCompareFoldedEqual(_L("\x1DC"), _L("\x1DB")); + TestCompareFoldedEqual(_L("\x1DC"), _L("u\x308\x300")); + TestCompareFoldedEqual(_L("\x1DD"), _L("\x18E")); + TestCompareFoldedEqual(_L("\x1EC"), _L("\x1ED")); + TestCompareFoldedEqual(_L("\x1FC"), _L("\x1FD")); + TestCompareFoldedEqual(_L("\x200"), _L("\x201")); + TestCompareFoldedEqual(_L("\x216"), _L("u\x311")); + TestCompareFoldedEqual(_L("\x21B"), _L("T\x326")); + TestCompareFoldedEqual(_L("\x21C"), _L("\x21D")); + TestCompareFoldedEqual(_L("\x229"), _L("E\x327")); + TestCompareFoldedEqual(_L("\x22A"), _L("\x22B")); + TestCompareFoldedEqual(_L("\x22A"), _L("O\x308\x304")); + TestCompareFoldedEqual(_L("\x22A"), _L("\xF6\x304")); + TestCompareFoldedEqual(_L("\x233"), _L("y\x304")); + TestCompareFoldedEqual(_L("\x233"), _L("\x232")); + } + +void TestCompareFoldedNotEqual(TDesC& a, TDesC& b, TInt aValue) + { + test(a.CompareF(b) == aValue); + } + +static void TestCompareFoldedAdditional() + { + const TText16 UnicodeTextOne16[] = {'a', 0}; + const TText16 ErrUnicodeTextOne16[] = {'[', 0}; + + const TText16 UnicodeTextTwo16[] = {0x00EA, 0x0323, 0}; + const TText16 ErrUnicodeTextTwo16[] = {0x00EA, 't', 0}; + + const TText16 UnicodeTextThree16[] = {0x00EA, 0x03B1, 0}; + const TText16 ErrUnicodeTextThree16[] = {0x00EA, 0x0323, 0}; + + TBufC16 oriUnicodeSmallTextOne(UnicodeTextOne16); + TBufC16 nonMatchUnicodeSmallTextOne(ErrUnicodeTextOne16); + + TBufC16 oriUnicodeSmallTextTwo(UnicodeTextTwo16); + TBufC16 nonMatchUnicodeSmallTextTwo(ErrUnicodeTextTwo16); + + TBufC16 oriUnicodeSmallTextThree(UnicodeTextThree16); + TBufC16 nonMatchUnicodeSmallTextThree(ErrUnicodeTextThree16); + + const TText16 AsciiText16[] = {'A', 'B', 'C', 'D', 'E', 0}; + + TBufC16<5> oriAsciiSmallText(_L("ABCDE")); + + // Check that characters are non matching with return value as stated + + TestCompareFoldedNotEqual(oriUnicodeSmallTextOne, nonMatchUnicodeSmallTextOne, 6); + TestCompareFoldedNotEqual(oriUnicodeSmallTextTwo, nonMatchUnicodeSmallTextTwo, 33); + TestCompareFoldedNotEqual(oriUnicodeSmallTextThree, nonMatchUnicodeSmallTextThree, -33); + + // Try other way around... + + TestCompareFoldedNotEqual(nonMatchUnicodeSmallTextOne, oriUnicodeSmallTextOne, -6); + TestCompareFoldedNotEqual(nonMatchUnicodeSmallTextTwo, oriUnicodeSmallTextTwo, -33); + TestCompareFoldedNotEqual(nonMatchUnicodeSmallTextThree, oriUnicodeSmallTextThree, 33); + + // Declare a TPtrC16 which is base from AsciiText16... + + TPtrC16 AsciiSmallText; + + AsciiSmallText.Set(AsciiText16, 4); + + // Check the boundary case + + TestCompareFoldedNotEqual(oriAsciiSmallText, AsciiSmallText, 1); + + // Try other way around... + + TestCompareFoldedNotEqual(AsciiSmallText, oriAsciiSmallText, -1); + + } + +void TestFoldingL() + { + TestFindMatchFoldedL(); + TestCompareFolded(); + TestCompareFoldedAdditional(); + } + +// collation tests +_LIT(KCandidateString1, "abcdefg"); +_LIT(KCandidateString2, "\x1f82\x1f02\x345\x1f00\x300\x345\x3b1\x313\x300\x345"); +_LIT(KCandidateString3, "abcabcdababc"); +_LIT(KCandidateString4, "xyzxyxyzxyxyyxyzxyy"); + +_LIT(KMatch1, "abc"); +_LIT(KMatch2, "abc*"); +_LIT(KMatch3, "*abc*"); +_LIT(KMatch4, "abc*def"); +_LIT(KMatch5, "abc*def*g*"); +_LIT(KMatch6, "*def"); +_LIT(KMatch7, "**d?f?"); +_LIT(KMatch8, "*d?f??"); +_LIT(KMatch9, "***d?f??*"); +_LIT(KMatch10, "a*c*g"); +_LIT(KMatch11, "*c*g"); + +_LIT(KMatch12, "*\x1f82"); +_LIT(KMatch13, "*\x1f82*"); +//_LIT(KMatch14, "*\x3b1*"); +_LIT(KMatch15, "*\x313*"); +_LIT(KMatch16, "*\x300*"); +//_LIT(KMatch17, "*\x345*"); +//_LIT(KMatch18, "*\x3b1\x313*"); +//_LIT(KMatch19, "*\x3b1\x313\x300*"); +_LIT(KMatch20, "*\x1f82*\x1f82*\x1f82\x1f82"); +_LIT(KMatch21, "*\x1f82*\x1f82*\x1f82\x1f82*\x1f82*"); + +_LIT(KMatch22, "*aba*"); +_LIT(KMatch23, "*abc"); +_LIT(KMatch24, "a*abc"); +_LIT(KMatch25, "a*ab"); +_LIT(KMatch26, "*ca*abc"); +_LIT(KMatch27, "*ca*??c"); +_LIT(KMatch28, "*??c"); +_LIT(KMatch29, "a*babc"); +_LIT(KMatch30, "*xyy"); + +_LIT(KFoo1, "foo"); +_LIT(KPeach, "pe\x302\x63he"); +_LIT(KFooMatch1, "fo*"); +_LIT(KFooMatch2, "*Fo*"); +_LIT(KFooMatch3, "*f*O*o"); +_LIT(KFooMatch4, "*f*o*o*"); +_LIT(KFooMatch5, "*o"); +_LIT(KFooMatch6, "???"); +_LIT(KFooMatch7, "*?o?*"); +_LIT(KFooMatch8, "*?"); +_LIT(KFooNonMatch1, "oo*"); +_LIT(KFooNonMatch2, "??"); +_LIT(KFooNonMatch3, "????"); +_LIT(KFooNonMatch4, "*?f*"); +_LIT(KFooNonMatch5, "*f*f*"); +_LIT(KFooNonMatch6, "*?*f*"); +_LIT(KPeachMatch1, "p?che"); +_LIT(KPeachNonMatch1, "peche"); +_LIT(KPeachNonMatch2, "pe?che"); +_LIT(KPeachNonMatch3, "pe?he"); +_LIT(KPeachNonMatch4, "pe*"); + +void TestMatchIdentifiersTDesC(const TDesC& aCandidate, const TDesC& aSearchTerm, TInt aExpectedResult) + { + const TText16* candidateStart = aCandidate.Ptr(); + const TText16* candidateEnd = candidateStart + aCandidate.Length(); + const TText16* searchTermStart = aSearchTerm.Ptr(); + const TText16* searchTermEnd = searchTermStart + aSearchTerm.Length(); + TInt pos = ::LocateMatchStringFolded(candidateStart, candidateEnd, searchTermStart, searchTermEnd); + test(aExpectedResult == pos); + } + +void TestMatchIdentifiers() + { + TestMatchIdentifiersTDesC(KCandidateString1, KMatch1, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch2, 0); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch3, 0); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch4, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch5, 0); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch6, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch7, 3); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch8, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch9, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch10, 0); + TestMatchIdentifiersTDesC(KCandidateString1, KMatch11, 2); + TestMatchIdentifiersTDesC(KCandidateString2, KMatch12, 6); + TestMatchIdentifiersTDesC(KCandidateString2, KMatch13, 0); + //The next test does not pass with the new optimised methods + //TestMatchIdentifiersTDesC(KCandidateString2, KMatch14, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString2, KMatch15, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString2, KMatch16, KErrNotFound); + // I have taken this test out: it tests that combining ypogegrammeni is not + // found on its own: but with case folding it can become a non-combining + // character (iota), so this test is not relevant. + // TestMatchIdentifiersTDesC(KCandidateString2, KMatch17, KErrNotFound); + //The next tests do not pass with the new optimised methods + //TestMatchIdentifiersTDesC(KCandidateString2, KMatch18, KErrNotFound); + //TestMatchIdentifiersTDesC(KCandidateString2, KMatch19, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString2, KMatch20, 0); + TestMatchIdentifiersTDesC(KCandidateString2, KMatch21, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch22, 7); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch23, 9); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch24, 0); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch25, KErrNotFound); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch26, 2); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch27, 2); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch28, 9); + TestMatchIdentifiersTDesC(KCandidateString3, KMatch29, 0); + TestMatchIdentifiersTDesC(KCandidateString4, KMatch30, 16); + + TestMatchIdentifiersTDesC(KFoo1, KFoo1, 0); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch1, 0); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch2, 0); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch3, 0); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch4, 0); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch5, 2); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch6, 0); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch7, 0); + TestMatchIdentifiersTDesC(KFoo1, KFooMatch8, 2); + TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch1, KErrNotFound); + TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch2, KErrNotFound); + TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch3, KErrNotFound); + TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch4, KErrNotFound); + TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch5, KErrNotFound); + TestMatchIdentifiersTDesC(KFoo1, KFooNonMatch6, KErrNotFound); + TestMatchIdentifiersTDesC(KPeach, KPeachMatch1, 0); + TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch1, KErrNotFound); + TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch2, KErrNotFound); + TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch3, KErrNotFound); + TestMatchIdentifiersTDesC(KPeach, KPeachNonMatch4, KErrNotFound); + + TestMatchIdentifiersTDesC(_L(""), _L(""), 0); + TestMatchIdentifiersTDesC(_L("a"), _L(""), KErrNotFound); + TestMatchIdentifiersTDesC(_L(""), _L("*"), 0); + } + +void TestFindIdentifierTDesC(const TDesC& aCandidateString, const TDesC& aSearchTerm, TInt /*aExpectedResult*/) + { + TUTF32Iterator candidateIt(aCandidateString.Ptr(), aCandidateString.Ptr() + aCandidateString.Length()); + TUTF32Iterator searchIt(aSearchTerm.Ptr(), aSearchTerm.Ptr() + aSearchTerm.Length()); + /*aExpectedResult = */::FindFolded(candidateIt, searchIt); + } + +//INC057641 - NTT Functional BC break in 8.1a: string comparison changed +static void INC057641L() + { + _LIT16(KEmptyText, ""); + HBufC16* str = HBufC16::NewLC(4); + str->Des().Copy(_L("****")); + TInt res = str->CompareC(KEmptyText); + CleanupStack::PopAndDestroy(str); + test(res == 1); + } + +_LIT(KFind1, "abc"); +_LIT(KFind2, "def"); +_LIT(KFind3, "efg"); +_LIT(KFind4, "fga"); +_LIT(KFind5, "acd"); +_LIT(KFind6, "\x1f82"); +_LIT(KFind7, "\x3b1\x313\x300\x345"); +_LIT(KFind8, "\x3b1"); +_LIT(KFind9, "aba"); +_LIT(KFind10, "abc"); + +void TestFindIdentifier() + { + TestFindIdentifierTDesC(KCandidateString1, TPtrC(), 0); + TestFindIdentifierTDesC(KCandidateString1, KFind1, 0); + TestFindIdentifierTDesC(KCandidateString1, KFind2, 3); + TestFindIdentifierTDesC(KCandidateString1, KFind3, 4); + TestFindIdentifierTDesC(KCandidateString1, KFind4, KErrNotFound); + TestFindIdentifierTDesC(KCandidateString1, KFind5, KErrNotFound); + TestFindIdentifierTDesC(KCandidateString2, KFind6, 0); + TestFindIdentifierTDesC(KCandidateString2, KFind7, 0); + TestFindIdentifierTDesC(KCandidateString2, KFind8, KErrNotFound); + TestFindIdentifierTDesC(KCandidateString3, KFind9, 7); + TestFindIdentifierTDesC(KCandidateString3, KFind10, 0); + } + +struct TestMatch8 + { + TText8 const* iLeft; + TText8 const* iRight; + TInt iResult; + }; + +TestMatch8 const Tests8[]= + { + {_S8(""),_S8(""),0}, + {_S8(""),_S8("?"),KErrNotFound}, + {_S8(""),_S8("*"),0}, + {_S8(""),_S8("**"),0}, + {_S8(""),_S8("*x*"),KErrNotFound}, + {_S8("x"),_S8(""),KErrNotFound}, + {_S8("x"),_S8("?"),0}, + {_S8("x"),_S8("*"),0}, + {_S8("x"),_S8("**"),0}, + {_S8("x"),_S8("**?"),0}, + {_S8("x"),_S8("?**"),0}, + {_S8("x"),_S8("**?*"),0}, + {_S8("x"),_S8("x"),0}, + {_S8("x"),_S8("a"),KErrNotFound}, + {_S8("x"),_S8("xx"),KErrNotFound}, + {_S8("x"),_S8("?x"),KErrNotFound}, + {_S8("x"),_S8("x*"),0}, + {_S8("x"),_S8("*x"),0}, + {_S8("x"),_S8("*x*"),0}, + {_S8("x"),_S8("**x*"),0}, + {_S8("abc"),_S8(""),KErrNotFound}, + {_S8("abc"),_S8("?*"),0}, + {_S8("abc"),_S8("*?"),2}, + {_S8("abc"),_S8("*?*?"),0}, + {_S8("abc"),_S8("*a*"),0}, + {_S8("abc"),_S8("*b*"),1}, + {_S8("abc"),_S8("*c*"),2}, + {_S8("abc"),_S8("*a"),KErrNotFound}, + {_S8("abc"),_S8("*c"),2}, + {_S8("abc"),_S8("*?c"),1}, + {_S8("abc"),_S8("??c"),0}, + {_S8("abc"),_S8("*b?"),1}, + }; + +struct TestMatch16 + { + TText16 const* iLeft; + TText16 const* iRight; + TInt iResult; + }; + +TestMatch16 const Tests16[]= + { + {_S16(""),_S16(""),0}, + {_S16(""),_S16("?"),KErrNotFound}, + {_S16(""),_S16("*"),0}, + {_S16(""),_S16("**"),0}, + {_S16(""),_S16("*x*"),KErrNotFound}, + {_S16("x"),_S16(""),KErrNotFound}, + {_S16("x"),_S16("?"),0}, + {_S16("x"),_S16("*"),0}, + {_S16("x"),_S16("**"),0}, + {_S16("x"),_S16("**?"),0}, + {_S16("x"),_S16("?**"),0}, + {_S16("x"),_S16("**?*"),0}, + {_S16("x"),_S16("x"),0}, + {_S16("x"),_S16("a"),KErrNotFound}, + {_S16("x"),_S16("xx"),KErrNotFound}, + {_S16("x"),_S16("?x"),KErrNotFound}, + {_S16("x"),_S16("x*"),0}, + {_S16("x"),_S16("*x"),0}, + {_S16("x"),_S16("*x*"),0}, + {_S16("x"),_S16("**x*"),0}, + {_S16("abc"),_S16(""),KErrNotFound}, + {_S16("abc"),_S16("?*"),0}, + {_S16("abc"),_S16("*?"),2}, + {_S16("abc"),_S16("*?*?"),0}, + {_S16("abc"),_S16("*a*"),0}, + {_S16("abc"),_S16("*b*"),1}, + {_S16("abc"),_S16("*c*"),2}, + {_S16("abc"),_S16("*a"),KErrNotFound}, + {_S16("abc"),_S16("*c"),2}, + {_S16("abc"),_S16("*?c"),1}, + {_S16("abc"),_S16("??c"),0}, + {_S16("abc"),_S16("*b?"),1}, + }; + +TInt KTests=sizeof(Tests8)/sizeof(Tests8[0]); + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-1770 +@SYMTestCaseDesc TDes16 Collation conversion function test +@SYMTestPriority High +@SYMTestActions Testing the three collation conversion function + in TDesC16::GetNormalizedDecomposedFormL, + TDesC16::GetFoldedDecomposedFormL, + TDesC16::GetCollationKeysL +@SYMTestExpectedResults The test must not fail. +@SYMREQ 6178 Add several new Unicode utility functions +*/ +static void TestDes16CollationFunctionL() + { + /**----------------Test TDesC16::GetNormalizedDecomposedFormL------------------*/ + + HBufC16* outputBuffer=NULL; + _LIT16(KTestString1,"abc") ; + //LATIN CAPITAL LETTER W WITH DIAERESIS(\x0057\x0308) + //LATIN SMALL LETTER A(\x0061) + //LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE(\x006F\x0302\x0303) + //GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI(\x03B1\x0313\x0342\x0345) + _LIT16(KTestString2,"\x1E84\x0061\x1ED7\x1F86"); + _LIT16(KTestStringNDF2,"\x0057\x0308\x0061\x006F\x0302\x0303\x03B1\x0313\x0342\x0345"); + + outputBuffer=KTestString1().GetNormalizedDecomposedFormL(); + test(outputBuffer->Compare(KTestString1())==0); + delete outputBuffer; + + outputBuffer=KTestString2().GetNormalizedDecomposedFormL(); + test(outputBuffer->Compare(KTestStringNDF2())==0); + delete outputBuffer; + + /**----------------Test TDesC16::GetFoldedDecomposedFormL------------------*/ + _LIT16(KTestString6,"AbC"); + _LIT16(KTestStringFolded6,"abc"); + //GREEK CAPITAL LETTER OMICRON WITH PSILI =>\x03BF\x0313 + //LATIN SMALL LETTER M WITH ACUTE =>\x006D\x0301 + //LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE => \x006F\x0302\x0309 + _LIT16(KTestString7,"\x1F48\x1E3F\x1ED4"); + _LIT16(KTestStringFolded7,"\x03BF\x0313\x006D\x0301\x006F\x0302\x0309"); + + outputBuffer=KTestString6().GetFoldedDecomposedFormL(); + test(outputBuffer->Compare(KTestStringFolded6())==0); + delete outputBuffer; + + outputBuffer=KTestString7().GetFoldedDecomposedFormL(); + test(outputBuffer->Compare(KTestStringFolded7())==0); + delete outputBuffer; + + /**----------------Test TDesC16::GetCollationKeysL------------------*/ + TCollationMethod method; + method.iId = 0; + //purposely set the maintable to NULL, this will result in the DefaultTable being used + method.iMainTable = 0; + method.iOverrideTable = 0; + method.iFlags = TCollationMethod::EIgnoreNone; + + //---------------Test key generation functionality---------------- + /** + Collation keys for + x=08b90108-00000078 + y=08bd0108-00000079 + z=08c90108-0000007a + */ + _LIT(KInputString1,"xyz"); + HBufC8* outbuf=NULL; + //Max Level 0 keys + _LIT8(KMaxLevel0Key,"\x08\xb9\x08\xbd\x08\xc9"); + outbuf=KInputString1().GetCollationKeysL(0,&method); + test(outbuf->Compare(KMaxLevel0Key())==0); + delete outbuf; + //Max Level 1 keys + _LIT8(KMaxLevel1Key,"\x08\xb9\x08\xbd\x08\xc9\x00\x00\x01\x01\x01"); + outbuf=KInputString1().GetCollationKeysL(1,&method); + test(outbuf->Compare(KMaxLevel1Key())==0); + delete outbuf; + //Max Level 2 keys + _LIT8(KMaxLevel2Key,"\x08\xb9\x08\xbd\x08\xc9\x00\x00\x01\x01\x01\x00\x08\x08\x08"); + outbuf=KInputString1().GetCollationKeysL(2,&method); + test(outbuf->Compare(KMaxLevel2Key())==0); + delete outbuf; + //Max Level 3 keys + _LIT8(KMaxLevel3Key,"\x08\xb9\x08\xbd\x08\xc9\x00\x00\x01\x01\x01\x00\x08\x08\x08\x00\x00\x00\x78\x00\x00\x79\x00\x00\x7A"); + outbuf=KInputString1().GetCollationKeysL(3,&method); + test(outbuf->Compare(KMaxLevel3Key())==0); + delete outbuf; + + /** + Decomposition for 1F70 + 1F70=03B1 0300 + Collation keys for + \x03B1 =09360108-000003B1 + \x0300 =00001609-00000300 + y =08bd0108-00000079 + */ + _LIT(KInputString2,"\x1F70y"); + //Max Level 2 keys + _LIT8(KCollationString22,"\x09\x36\x08\xBD\x00\x00\x01\x16\x01\x00\x08\x08\x08"); + outbuf=KInputString2().GetCollationKeysL(2,&method); + test(outbuf->Compare(KCollationString22())==0); + delete outbuf; + + //Max Level 3 keys + _LIT8(KCollationString23,"\x09\x36\x08\xBD\x00\x00\x01\x16\x01\x00\x08\x08\x08\x00\x00\x03\xB1\x00\x03\x00\x00\x00\x79"); + outbuf=KInputString2().GetCollationKeysL(3,&method); + test(outbuf->Compare(KCollationString23())==0); + delete outbuf; + + /** + Decomposition for 1EAC + 1EAC= 1EA0 0302 = 0041 0323 0302 + Collation keys for + \x0041 =06CF0121-00000041 + \x0323 =FF800104-00000001,83230105-00000000(2 keys for one character) + \x0302 =00001D09-00000302 + */ + _LIT(KInputString3,"\x1EAC"); + //Max Level 0 keys + _LIT8(KCollationString30,"\x06\xCF\xFF\x80\x83\x23"); + //Max Level 1 keys + _LIT8(KCollationString31,"\x06\xCF\xFF\x80\x83\x23\x00\x00\x01\x01\x01\x1d"); + outbuf=KInputString3().GetCollationKeysL(1,&method); + test(outbuf->Compare(KCollationString31())==0); + delete outbuf; + + //Max Level 3 keys + _LIT8(KCollationString33,"\x06\xCF\xFF\x80\x83\x23\x00\x00\x01\x01\x01\x1d\x00\x20\x04\x04\x08\x00\x00\x00\x41\x00\x00\x01\x00\x03\x02"); + outbuf=KInputString3().GetCollationKeysL(3,&method); + test(outbuf->Compare(KCollationString33())==0); + delete outbuf; + + //--------------Test using NULL collationMethod----------------------- + outbuf=KInputString3().GetCollationKeysL(3,NULL); + test(outbuf->Compare(KCollationString33())==0); + delete outbuf; + + //--------------Test using out of limit level------------------------- + outbuf=KInputString3().GetCollationKeysL(6,NULL); + test(outbuf->Compare(KCollationString33())==0); + delete outbuf; + + outbuf=KInputString3().GetCollationKeysL(-1,NULL); + test(outbuf->Compare(KCollationString30())==0); + delete outbuf; + + } + +/** +@SYMTestCaseID SYSLIB-UNICODE-CT-1771 +@SYMTestCaseDesc TDes16 Collation conversion function OOM test +@SYMTestPriority High +@SYMTestActions OOM Testing the three collation conversion function + in TDesC16::GetNormalizedDecomposedFormL, + TDesC16::GetFoldedDecomposedFormL, + TDesC16::GetCollationKeysL +@SYMTestExpectedResults The test must not fail. +@SYMREQ 6178 Add several new Unicode utility functions +*/ +static void TestDes16CollationFunctionOOM() + { + test.Next(_L("TestDes16CollationFunctionOOM")); + + TInt err, tryCount = 0; + do + { + __UHEAP_MARK; + // find out the number of open handles + TInt startProcessHandleCount; + TInt startThreadHandleCount; + RThread().HandleCount(startProcessHandleCount, startThreadHandleCount); + + // Setting Heap failure for OOM test + __UHEAP_SETFAIL(RHeap::EDeterministic, ++tryCount); + TRAP(err,TestDes16CollationFunctionL() ); + __UHEAP_SETFAIL(RHeap::ENone, 0); + + // check that no handles have leaked + TInt endProcessHandleCount; + TInt endThreadHandleCount; + RThread().HandleCount(endProcessHandleCount, endThreadHandleCount); + + test(startProcessHandleCount == endProcessHandleCount); + test(startThreadHandleCount == endThreadHandleCount); + + __UHEAP_MARKEND; + } while(err == KErrNoMemory); + + test(err == KErrNone); + test.Printf(_L("- TestDes16CollationFunctionOOM succeeded at heap failure rate of %i\n"), tryCount); + } + +GLDEF_C TInt E32Main() +// +// entry point +// + { + CTrapCleanup* trapCleanup = CTrapCleanup::New(); + test(trapCleanup != NULL); + + test.Title(); +// + + test.Start(_L("Match8")); + TInt ii; + for (ii=0;ii +#include +#include +#include +#include + +const TInt KTestGranularity=0x10; + +LOCAL_D RTest test(_L("T_PARRAY")); + +LOCAL_C void testAllMethods(CArrayPak& aPakVar) + { + test.Next(_L("Test all methods")); + test(aPakVar.Count()==0); + aPakVar.Compress(); + test(TRUE); + aPakVar.Reset(); + test(TRUE); + TKeyArrayPak kk(sizeof(TText),ECmpNormal,0); + TKeyArrayVar vv(sizeof(TText),ECmpNormal,0); + test(TRUE); + TRAPD(res,aPakVar.SortL(vv)); + test(res==KErrNone); + const TText* aa=_S("a"); + aPakVar.InsertL(0,*aa,sizeof(TText)); + TBuf<0x10> des1(1); + des1[0]=aPakVar[0]; + test(des1==_L("a")); + test(aPakVar.Length(0)==sizeof(TText)); + test(TRUE); + TInt pp; + test(aPakVar.Find(*aa,kk,pp)==0); + test(pp==0); + aPakVar.Delete(0); + aPakVar.AppendL(*aa,1); + test(aPakVar.Count()==1); + aPakVar.InsertIsqAllowDuplicatesL(*aa,0,kk); + test(TRUE); + test(aPakVar.FindIsq(*aa,kk,pp)==0); + test(pp==0); + TRAPD(r,aPakVar.InsertIsqL(*aa,0,kk)); + test(r==KErrAlreadyExists); + } + +LOCAL_C void test1(CArrayPak& aPakVar) +// + { + test.Next(_L("AppendL and InsertL chars")); + aPakVar.AppendL(*_S("abcd"),5*sizeof(TText)); // abcd + TBuf<0x10> des1(&aPakVar[0]); + test(des1==_L("abcd")); + test(aPakVar.Count()==1); + aPakVar.AppendL(*_S("wxyz"),5*sizeof(TText)); // abcd wxyz + des1=&aPakVar[1]; + test(des1==_L("wxyz")); + test(aPakVar.Count()==2); + aPakVar.InsertL(1,*_S("ef"),3*sizeof(TText)); // abcd ef wxyz + des1=&aPakVar[1]; + test(des1==_L("ef")); + test(aPakVar.Count()==3); + aPakVar.AppendL(*_S("z"),2*sizeof(TText)); // abcd ef wxyz z + des1=&aPakVar[3]; + test(des1==_L("z")); + aPakVar.InsertL(0,*_S("y"),2*sizeof(TText)); // y abcd ef wxyz z + des1=&aPakVar[0]; + test(des1==_L("y")); + test(aPakVar.Length(0)==2*sizeof(TText)); + test(aPakVar.Length(1)==5*sizeof(TText)); + test(aPakVar.Length(2)==3*sizeof(TText)); + test(aPakVar.Length(3)==5*sizeof(TText)); + test(aPakVar.Length(4)==2*sizeof(TText)); + des1=&aPakVar[1]; + test(des1==_L("abcd")); + test(aPakVar.Count()==5); +// + test.Next(_L("Delete chars")); + aPakVar.Delete(3,1); // y abcd ef z + des1=&aPakVar[2]; + test(des1==_L("ef")); + des1=&aPakVar[1]; + test(des1==_L("abcd")); + des1=&aPakVar[3]; + test(des1==_L("z")); + aPakVar.Delete(1,2); // y z + des1=&aPakVar[0]; + test(des1==_L("y")); + des1=&aPakVar[1]; + test(des1==_L("z")); + test(aPakVar.Count()==2); + } + +LOCAL_C void test2(CArrayPak& aPakVar) +// + { + test.Next(_L("Reset and Compress")); + TBuf<0x10> des1(_L("abcde")); + TBuf<0x10> des2(_L("fgh")); + TBuf<0x10> des3(_L("wxyz")); + aPakVar.AppendL(*(TText*)des1.Ptr(),des1.Size()); + aPakVar.AppendL(*(TText*)des2.Ptr(),des2.Size()); + aPakVar.Compress(); + test(aPakVar.Count()==2); + TPtrC des4((TText*)&aPakVar[0],des1.Length()); + test(des1==des4); + TPtrC des5((TText*)&aPakVar[1],des2.Length()); + test(des2==des5); + aPakVar.InsertL(1,*(TText*)des3.Ptr(),des3.Size()); + test(aPakVar.Count()==3); + TPtrC des6((TText*)&aPakVar[0],des1.Length()); + test(des1==des6); + TPtrC des7((TText*)&aPakVar[2],des2.Length()); + test(des2==des7); + TPtrC des8((TText*)&aPakVar[1],des3.Length()); + test(des3==des8); + aPakVar.Reset(); + // So nothing in this array + test(aPakVar.Count()==0); + TKeyArrayPak kk(0,ECmpNormal,3); // Compare 3 characters + TKeyArrayPak kk1(0,ECmpNormal,2); // Compare 2 characters + TKeyArrayVar vv(0,ECmpNormal,3); // Compare 3 characters + TBuf<0x10> buf1=_L("abcdef"); + TBuf<0x10> buf2=_L("wxyz"); + TBuf<0x10> buf3=_L("lmnop"); + TBuf<0x10> buf4=_L("aa"); + aPakVar.AppendL(*buf1.Ptr(),buf1.Size()); + aPakVar.InsertL(0,*buf2.Ptr(),buf2.Size()); + aPakVar.AppendL(*buf3.Ptr(),buf3.Size()); + aPakVar.InsertL(1,*buf4.Ptr(),buf4.Size()); + aPakVar.Compress(); + TPtrC rd1((TText*)&aPakVar[2],buf1.Length()); + test(buf1==rd1); + TPtrC rd2((TText*)&aPakVar[0],buf2.Length()); + test(buf2==rd2); + TPtrC rd3((TText*)&aPakVar[3],buf3.Length()); + test(buf3==rd3); + TPtrC rd4((TText*)&aPakVar[1],buf4.Length()); + test(buf4==rd4); + test(aPakVar.Count()==4); + + test.Next(_L("Sort")); + TRAPD(res,aPakVar.SortL(vv)); + test(res==KErrNone); + /**/ + TPtrC rd5((TText*)&aPakVar[1],buf1.Length()); + test(buf1==rd5); + TPtrC rd6((TText*)&aPakVar[3],buf2.Length()); + test(buf2==rd6); + TPtrC rd7((TText*)&aPakVar[2],buf3.Length()); + test(buf3==rd7); + TPtrC rd8((TText*)&aPakVar[0],buf4.Length()); + test(buf4==rd8); + test(aPakVar.Count()==4); + /**/ + test.Next(_L("Find and FindIsq")); + TBuf<0x10> buf5=_L("ffff"); + test(aPakVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==2); + TRAPD(r,aPakVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk)) + test(r==KErrAlreadyExists); + test(aPakVar.InsertIsqAllowDuplicatesL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==3); + TInt aPos; + test(aPakVar.Find(*_S("abc"),kk,aPos)==0); // Second parameter 'aLength' is unused. + test(aPos==1); + test(aPakVar.Find(*_S("aa"),kk1,aPos)==0); + test(aPos==0); + test(aPakVar.Find(*_S("wxyz"),kk,aPos)==0); + test(aPos==5); + test(aPakVar.Find(*_S("fgh"),kk,aPos)!=0); // Returns non zero if string not found. + test(aPos==6); // Not present in list, aPos set to last position + test(aPakVar.Find(*_S("ffff"),kk,aPos)==0); + test(aPos==2); + test(aPakVar.Find(*_S("lmn"),kk,aPos)==0); + test(aPos==4); //15 + test(aPakVar.FindIsq(*_S("abc"),kk,aPos)==0); + test(aPos==1); + test(aPakVar.FindIsq(*_S("aa"),kk1,aPos)==0); + test(aPos==0); + test(aPakVar.FindIsq(*_S("wxyz"),kk,aPos)==0); + test(aPakVar.FindIsq(*_S("fgh"),kk,aPos)!=0); // 22 Returns result of last test + test(aPos==4); // Not present in list, aPos set to last position tested + //This test shows problem with BinarySearch + TBuf<0x10> buf7=_L("fghij"); + test(aPakVar.InsertIsqL(*(TText*)buf7.Ptr(),buf7.Size(),kk)==4); + test(aPakVar.FindIsq(*_S("fgh"),kk,aPos)==0); // Returns result of last test + test(aPos==4); + test(aPakVar.FindIsq(*_S("ffff"),kk,aPos)==0); + test(aPos==3); + test(aPakVar.FindIsq(*_S("lmn"),kk,aPos)==0); + test(aPos==5); + aPakVar.Delete(4,1); + test(aPakVar.Find(*_S("wxyz"),kk,aPos)==0); + test(aPos==5); + } + +LOCAL_C void test3(CArrayPak& aPak) + + { + test.Next(_L("InsertIsqL")); + TKeyArrayPak kk(0,ECmpTInt); + + TInt pos=0; + TInt mod=47; + TInt inc=23; + + TInt i=0; + FOREVER + { + TInt ret; + if (i&1) + TRAP(ret,aPak.InsertIsqL(i,sizeof(TInt),kk)) + else + { + TRAP(ret,pos=aPak.InsertIsqL(i,sizeof(TInt),kk)) + if (ret==KErrNone) + test(aPak[pos]==i); + } + if (ret==KErrAlreadyExists) + break; + i=(i+inc)%mod; + } + for(i=0;i* pPakFlat=new CArrayPakFlat(KTestGranularity); + testAllMethods(*pPakFlat); + delete pPakFlat; +// + CArrayPakFlat* pPakFlatChar=new CArrayPakFlat(KTestGranularity); + test1(*pPakFlatChar); + delete pPakFlatChar; +// + CArrayPakFlat* pPakFlatArr=new CArrayPakFlat(KTestGranularity); + test2(*pPakFlatArr); + delete pPakFlatArr; +// + CArrayPakFlat* pPakFlatInt=new CArrayPakFlat(KTestGranularity); + test3(*pPakFlatInt); + delete pPakFlatInt; +// + test.End(); + __UHEAP_MARKEND; + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_que.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_que.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1985 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_que.cpp +// Overview: +// Test double linked list functionality. +// API Information: +// TDblQueLinkBase, TDeltaQueLink, TDblQueLink, TPriQueLink, +// TDblQueIterBase, TDblQueIter +// Details: +// - Create many TDblQueLinkBase links, insert links at specified locations +// and check previous and next links are as expected. +// - Create many TDeltaQueLink links, insert these links at specified locations +// and check previous and next links are as expected. +// - Create many TDblQueLink links, insert, remove these links at specified +// locations and check previous and next links are as expected. +// - Create many TPriQueLink links, insert, remove these links at specified +// locations and check previous and next links are as expected. +// - Create TDblQueBase based object without offset, with specified offset +// and check it is constructed as expected. +// - Create TDblQueBase based object, insert and remove TPriQueLink list +// element, set priorities of TPriQueLink list elements, call IsEmpty +// and Reset methods. +// - Create TDblQueBase based object without, with offset and check +// it is constructed as expected +// - Create TDblQueBase based object, insert TDblQueLink links at +// specified locations and check that they are added as expected. +// - Initialise TPriQueLink link with different priorities, insert +// the elements in priority order and check that they are added +// as expected. +// - Create TDblQueBase based object, check the double linked list for empty +// before inserting, after inserting, before/after Deque, before/after Enque, +// after Reset. Verify that results are as expected. +// - Create TDeltaQueBase object without offset, with specified offset +// and check it is constructed as expected. Insert TDeltaQueLink list +// elements at specified distance from the zero point, remove the elements +// at specified distance, decrement the delta value. +// - Create TDeltaQueBase based object, insert TDblQueLink link at specified +// locations and check the previous, next link are as expected. +// - Check the linked list for empty before inserting, after inserting, +// before/after Deque, before/after Enque, after Reset. Verify that results +// are as expected. +// - Create TDeltaQueBase based object, insert links using DoAddDelta method, +// check that links are as expected. Delete links using DoRemove and +// DoRemoveFirst methods and check that links are as expected. +// - Create TDeltaQueBase based object, insert links using DoAddDelta method, +// check the return value of CountDown is as expected. Delete links using +// DoRemoveFirst method and check the return value of CountDown is as expected. +// - Create TDblQue based object, insert links at front and last, call IsHead, +// IsFirst, IsLast, First and Last methods. +// - Create TDblQue object, check list for empty before inserting, after +// inserting, before/after Deque, before/after Enque, after Reset. +// Verify that results are as expected. +// - Create TDblQue based object with offset constructor, insert links at +// specified locations and check it is added as specified. +// - Create TDblQue based object, insert links using AddFirst and AddLast and +// check the links are as expected. +// - Create TDblQue based object, insert links using AddFirst and AddLast and +// check the result of the IsHead, IsFirst and IsLast methods are as expected. +// - Create TDblQue based object, insert links using AddFirst and AddLast, check +// the results are as expected. +// - Create TPriQueLink list without offset, with different offset, check the +// construction is as expected. +// - Create TPriQueLink list and insert many links at different specified location +// and check it is added as specified. +// - Create TPriQueLink link with different priorities, insert the elements in +// priority order and check that they are added as expected. +// - Create TPriQueLink list, check the double linked list for empty before +// inserting, after inserting, before/after Deque, before/after Enque, after Reset. +// Verify that results are as expected. +// - Create TPriQueLink list with different offset, get the list offset and check it +// is as expected. +// - Create TPriQueLink list, insert many links with different priorities check it is +// as expected. +// - Create TDeltaQueLink list, add ,remove links and check the links and check +// it is as expected. +// - Create TDeltaQueLink list and insert many links at different specified location +// and check it is added as specified. +// - Create TDeltaQueLink list, check the double linked list for empty before, after +// inserting, before Deque, after Enque, Reset method call is as expected. +// - Create TDeltaQueLink list, insert links using DoAddDelta method,check that +// links are as expected. Delete links using DoRemove and DoRemoveFirst methods +// and check that links are as expected. +// - Create TDeltaQueLink based object, insert links using DoAddDelta method, +// check the return value of CountDown is as expected. Delete links using +// DoRemoveFirst method and check the return value of CountDown is as expected. +// - Create TDeltaQueLink list with different offset, get and check the offset is +// as expected. +// - Create TDeltaQueLink list, add, remove links at different specified location +// and check it is added and removed successfully. +// - Initialaize TDblQueIterBase based iterator, get the current item in the queue, +// move the current position forward, backward, set the iterator to point to the +// first element, last item and check it is as expected. +// - Create TDblQueIterBase object with offset constructor, insert links at +// specified locations and check it is added as specified. +// - Create TDblQueIterBase object, iterate the list using operators, DoPostInc, +// DoPostDec, DoCurrent and check it is as expected. +// - Create TDblQue based link with specified offset, initialize TDblQueIter +// based iterator, iterate the link and check the offset is as expected. +// - Create TDblQueIter object with offset constructor, insert links at +// specified locations and check it is added as specified. +// - Create TDblQueIter object, iterate the list using operators, DoPostInc, +// DoPostDec, DoCurrent and check it is as expected. +// - Create TDblQueIter based object, insert links using AddFirst and SetToLast, +// using IsHead, check the results are as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +LOCAL_D RTest test(_L("T_QUE")); + +#ifndef _DEBUG +#pragma warning(disable : 4710) //fuction not expanded +#endif + +#define SIZE 10 +#define MAX_OFFSET 10 + +struct Item + { + TDblQueLink iLink; + TInt iSpace[MAX_OFFSET]; // Reserve some space + }; + +class CItem : public CBase + { +public: + TDblQueLink iLink; + //int iSpac[MAX_OFFSET]; // Reserve some space + }; + +template +class TestTQueLink + { +public: + void TestQueLinkBase(); // Calls Test: 1. + void TestQueLink(); // Calls Test: 1,2. + void Test1(); // Test Enque + void Test2(); // Test Deque +protected: + void CreateObjects(TInt aBaseLink); + void DestroyObjects(); +private: + void CallTest1(); + T* iLink[SIZE]; + }; + +template +void TestTQueLink::CallTest1() + { + test.Start(_L("Test Enque")); + Test1(); + } + +template +void TestTQueLink::CreateObjects(TInt aBaseLink) + { + TInt i; + + for (i=0;i=0&&aBaseLinkiNext=(iLink[aBaseLink])->iPrev=iLink[aBaseLink]; + } + +template +void TestTQueLink::DestroyObjects() + { + TInt i; + + for (i=0;i +void TestTQueLink::TestQueLinkBase() + { + CallTest1(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueLink::TestQueLink() + { + CallTest1(); + test.Next(_L("Text Deque")); + Test2(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueLink::Test1() + { + CreateObjects(1); + test.Start(_L("Check Next and Prev pointers set corectly.")); + iLink[2]->Enque(iLink[1]); + test(iLink[1]->iPrev==iLink[2]); + test(iLink[1]->iNext==iLink[2]); + test(iLink[2]->iPrev==iLink[1]); + test(iLink[2]->iNext==iLink[1]); + iLink[3]->Enque(iLink[2]); + test(iLink[1]->iPrev==iLink[3]); + test(iLink[1]->iNext==iLink[2]); + test(iLink[2]->iPrev==iLink[1]); + test(iLink[2]->iNext==iLink[3]); + test(iLink[3]->iPrev==iLink[2]); + test(iLink[3]->iNext==iLink[1]); + iLink[4]->Enque(iLink[3]); + test(iLink[1]->iPrev==iLink[4]); + test(iLink[1]->iNext==iLink[2]); + test(iLink[2]->iPrev==iLink[1]); + test(iLink[2]->iNext==iLink[3]); + test(iLink[3]->iPrev==iLink[2]); + test(iLink[3]->iNext==iLink[4]); + test(iLink[4]->iPrev==iLink[3]); + test(iLink[4]->iNext==iLink[1]); + iLink[5]->Enque(iLink[2]); + test(iLink[1]->iPrev==iLink[4]); + test(iLink[1]->iNext==iLink[2]); + test(iLink[2]->iPrev==iLink[1]); + test(iLink[2]->iNext==iLink[5]); + test(iLink[5]->iPrev==iLink[2]); + test(iLink[5]->iNext==iLink[3]); + test(iLink[3]->iPrev==iLink[5]); + test(iLink[3]->iNext==iLink[4]); + test(iLink[4]->iPrev==iLink[3]); + test(iLink[4]->iNext==iLink[1]); + test.Next(_L("Finished")); + DestroyObjects(); + test.End(); + } + +template +void TestTQueLink::Test2() + { + CreateObjects(1); + test.Start(_L("Check Next and Prev pointers set corectly")); + iLink[2]->Enque(iLink[1]); + iLink[3]->Enque(iLink[2]); + iLink[4]->Enque(iLink[3]); + iLink[5]->Enque(iLink[4]); + iLink[5]->Deque(); + iLink[5]->Enque(iLink[2]); + test(iLink[1]->iPrev==iLink[4]); + test(iLink[1]->iNext==iLink[2]); + test(iLink[2]->iPrev==iLink[1]); + test(iLink[2]->iNext==iLink[5]); + test(iLink[5]->iPrev==iLink[2]); + test(iLink[5]->iNext==iLink[3]); + test(iLink[3]->iPrev==iLink[5]); + test(iLink[3]->iNext==iLink[4]); + test(iLink[4]->iPrev==iLink[3]); + test(iLink[4]->iNext==iLink[1]); + iLink[3]->Deque(); + test(iLink[1]->iPrev==iLink[4]); + test(iLink[1]->iNext==iLink[2]); + test(iLink[2]->iPrev==iLink[1]); + test(iLink[2]->iNext==iLink[5]); + test(iLink[5]->iPrev==iLink[2]); + test(iLink[5]->iNext==iLink[4]); + test(iLink[4]->iPrev==iLink[5]); + test(iLink[4]->iNext==iLink[1]); + iLink[1]->Deque(); + test(iLink[2]->iPrev==iLink[4]); + test(iLink[2]->iNext==iLink[5]); + test(iLink[5]->iPrev==iLink[2]); + test(iLink[5]->iNext==iLink[4]); + test(iLink[4]->iPrev==iLink[5]); + test(iLink[4]->iNext==iLink[2]); + iLink[4]->Deque(); + test(iLink[2]->iPrev==iLink[5]); + test(iLink[2]->iNext==iLink[5]); + test(iLink[5]->iPrev==iLink[2]); + test(iLink[5]->iNext==iLink[2]); + test.Next(_L("Finished")); + DestroyObjects(); + test.End(); + } + +class VDblQueBase : public TDblQueBase + { +public: + VDblQueBase(); + VDblQueBase(TInt anOffset); + inline void sDoAddFirst(TAny* aPtr) {DoAddFirst(aPtr);} + inline void sDoAddLast(TAny* aPtr) {DoAddLast(aPtr);} + inline void sDoAddPriority(TAny* aPtr) {DoAddPriority(aPtr);} + inline void sTestEmpty() const {__DbgTestEmpty();} + TDblQueLink* sHead; + TInt* sOffset; +private: + void SetMembers(); + }; + +class VDeltaQueBase : public TDeltaQueBase + { +public: + VDeltaQueBase(); + VDeltaQueBase(TInt anOffset); + inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase + inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);} + inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();} + TInt** sFirstDelta; + inline void sDoAddFirst(TAny* aPtr) {DoAddFirst(aPtr);} //From TDblQueBase + inline void sDoAddLast(TAny* aPtr) {DoAddLast(aPtr);} + inline void sDoAddPriority(TAny* aPtr) {DoAddPriority(aPtr);} + TDblQueLink* sHead; + TInt* sOffset; +private: + void SetMembers(); + }; + +template +class VDblQue : public TDblQue + { +public: + VDblQue(); + VDblQue(TInt anOffset); + /*inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase + inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);} + inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();} + TInt** sFirstDelta;*/ + inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} //From TDblQueBase + inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);} + inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);} + TDblQueLink* sHead; + TInt* sOffset; +private: + void SetMembers(); + }; + +template +class VPriQue : public TPriQue + { +public: + VPriQue(); + VPriQue(TInt anOffset); + /*inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase + inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);} + inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();} + TInt** sFirstDelta;*/ + inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} //From TDblQueBase + inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);} + inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);} + TDblQueLink* sHead; + TInt* sOffset; +private: + void SetMembers(); + }; + +template +class VDeltaQue : public TDeltaQue + { +public: + VDeltaQue(); + VDeltaQue(TInt anOffset); + inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {this->DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase + inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);} + inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();} + TInt** sFirstDelta; + inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} //From TDblQueBase + inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);} + inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);} + TDblQueLink* sHead; + TInt* sOffset; +private: + void SetMembers(); + }; + +VDblQueBase::VDblQueBase() + { + SetMembers(); + } + +VDblQueBase::VDblQueBase(TInt anOffset) + :TDblQueBase(anOffset) + { + SetMembers(); + } + +void VDblQueBase::SetMembers() + { + sHead=&iHead; + sOffset=&iOffset; + } + +VDeltaQueBase::VDeltaQueBase() + { + SetMembers(); + } + +VDeltaQueBase::VDeltaQueBase(TInt anOffset) + :TDeltaQueBase(anOffset) + { + SetMembers(); + } + +void VDeltaQueBase::SetMembers() + { + sFirstDelta=&iFirstDelta; + sHead=&iHead; + sOffset=&iOffset; + } + +template +VDblQue::VDblQue() + { + SetMembers(); + } + +template +VDblQue::VDblQue(TInt anOffset) + :TDblQue(anOffset) + { + SetMembers(); + } + +template +void VDblQue::SetMembers() + { + //sFirstDelta=&iFirstDelta; + sHead=&this->iHead; + sOffset=&this->iOffset; + } + +template +VPriQue::VPriQue() + { + SetMembers(); + } + +template +VPriQue::VPriQue(TInt anOffset) + :TPriQue(anOffset) + { + SetMembers(); + } + +template +void VPriQue::SetMembers() + { + //sFirstDelta=&iFirstDelta; + sHead=&this->iHead; + sOffset=&this->iOffset; + } + +template +VDeltaQue::VDeltaQue() + { + SetMembers(); + } + +template +VDeltaQue::VDeltaQue(TInt anOffset) + :TDeltaQue(anOffset) + { + SetMembers(); + } + +template +void VDeltaQue::SetMembers() + { + sFirstDelta=&this->iFirstDelta; + sHead=&this->iHead; + sOffset=&this->iOffset; + } + +template +class TestTQue + { +friend class TestTQueLink; +public: + void TestQueBase(); + void TestDeltaBase(); + void TestDblQue(); + void TestPriQue(); + void TestDeltaQue(); + void Test1(); // All functions //TDblQueBase functions + void Test2(); // Constructors + void Test3(TBool aTestPri); // DoAdd's + void Test4(); // Public functions + void Test5(); // All functions //TDblDeltaQueBase + void Test6(); // Constructors + void Test7(); // Do's + void Test8(); // CountDown + void Test9(); // All functions //TDblQueBase + void Test10(); // Constructors + void Test11(); // Add's + void Test12(); // Is's + void Test13(); // Get's + void Test14(); // All functions //TPriQue + void Test15(); // Constructors + void Test16(); // Add + void Test17(); // All functions //TDeltaQue + void Test18(); // Constructors + void Test19(); // Add/Remove +private: + void CallTest3_4(TBool aTestPri); + void CallTest7_8(); + }; + +template +void TestTQue::CallTest3_4(TBool aTestPri) + { + test.Next(_L("Test DoAdd's")); + Test3(aTestPri); + test.Next(_L("Test public functions")); + Test4(); + } + +template +void TestTQue::CallTest7_8() + { + test.Next(_L("Test Do's")); + Test7(); + test.Next(_L("CountDown")); + Test8(); + } + +template +void TestTQue::TestQueBase() + { + test.Start(_L("Test all member functions (simply)")); + Test1(); + test.Next(_L("Test Constructors")); + Test2(); + CallTest3_4(ETrue); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::TestDeltaBase() + { + test.Start(_L("Test all member functions (simply)")); + Test5(); + CallTest3_4(EFalse); + test.Next(_L("Test Constructors")); + Test6(); + CallTest7_8(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::TestDblQue() + { + test.Start(_L("Test all member functions (simply)")); + Test9(); + CallTest3_4(EFalse); + test.Next(_L("Test Constructor")); + Test10(); + test.Next(_L("Test Add's")); + Test11(); + test.Next(_L("Test Is's")); + Test12(); + test.Next(_L("Get's")); + Test13(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::TestPriQue() + { + test.Start(_L("Test all member functions (simply)")); + Test14(); + CallTest3_4(ETrue); + test.Next(_L("Test Constructor")); + Test15(); + test.Next(_L("Test Add")); + Test16(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::TestDeltaQue() + { + test.Start(_L("Test all member functions (simply)")); + Test17(); + CallTest3_4(EFalse); + CallTest7_8(); + test.Next(_L("Test Constructor")); + Test18(); + test.Next(_L("Test Add/Removes")); + Test19(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test1() + { + T* que; + TPriQueLink link1,link2; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VDblQueBase(offset); + delete que; + que=new VDblQueBase; + //delete que; + test.Next(_L("DoAdd's")); + que->sDoAddFirst(&link1); + link1.Deque(); + que->sDoAddLast(&link1); + link1.iPriority=1; + link2.iPriority=2; + que->sDoAddPriority(&link2); + test.Next(_L("Public")); + que->IsEmpty(); + que->SetOffset(offset); + que->Reset(); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test2() + { + T* que; + TInt offset; + + test.Start(_L("Default constructor")); + que=new VDblQueBase(); + test(*(que->sOffset)==0); + test(que->sHead->iNext==que->sHead); + test(que->sHead->iPrev==que->sHead); + delete que; + test.Next(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VDblQueBase(offset); + test(*(que->sOffset)==offset); + test(que->sHead->iNext==que->sHead); + test(que->sHead->iPrev==que->sHead); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test3(TBool aTestPri) + { + T* que; + TDblQueLink link1,link2,link3,link4; + + test.Start(_L("AddFirst")); + que=new T(); + que->sDoAddFirst(&link1); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==que->sHead); + que->sDoAddFirst(&link2); + test(que->sHead->iNext==&link2); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==que->sHead); + que->sDoAddFirst(&link3); + test(que->sHead->iNext==&link3); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==&link3); + test(link3.iNext==&link2); + test(link3.iPrev==que->sHead); + que->sDoAddFirst(&link4); + test(que->sHead->iNext==&link4); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==&link3); + test(link3.iNext==&link2); + test(link3.iPrev==&link4); + test(link4.iNext==&link3); + test(link4.iPrev==que->sHead); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + test.Next(_L("AddLast")); + que=new T(); + que->sDoAddLast(&link1); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==que->sHead); + que->sDoAddLast(&link2); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link2); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==que->sHead); + test(link2.iPrev==&link1); + que->sDoAddLast(&link3); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link3); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==&link3); + test(link2.iPrev==&link1); + test(link3.iNext==que->sHead); + test(link3.iPrev==&link2); + que->sDoAddLast(&link4); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link4); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==&link3); + test(link2.iPrev==&link1); + test(link3.iNext==&link4); + test(link3.iPrev==&link2); + test(link4.iNext==que->sHead); + test(link4.iPrev==&link3); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + test.Next(_L("Combined AddFirst and AddLast")); + que=new T(); + que->sDoAddFirst(&link1); + que->sDoAddLast(&link2); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link2); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==que->sHead); + test(link2.iPrev==&link1); + que->sDoAddFirst(&link3); + test(que->sHead->iNext==&link3); + test(que->sHead->iPrev==&link2); + test(link1.iNext==&link2); + test(link1.iPrev==&link3); + test(link2.iNext==que->sHead); + test(link2.iPrev==&link1); + test(link3.iNext==&link1); + test(link3.iPrev==que->sHead); + que->sDoAddLast(&link4); + test(que->sHead->iNext==&link3); + test(que->sHead->iPrev==&link4); + test(link1.iNext==&link2); + test(link1.iPrev==&link3); + test(link2.iNext==&link4); + test(link2.iPrev==&link1); + test(link3.iNext==&link1); + test(link3.iPrev==que->sHead); + test(link4.iNext==que->sHead); + test(link4.iPrev==&link2); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + if (aTestPri) + { + TPriQueLink link5,link6,link7,link8,link9,link10; + + test.Next(_L("AddPriority")); + que=new T(); + link5.iPriority=4; + link6.iPriority=6; + link7.iPriority=8; + que->sDoAddPriority(&link5); + que->sDoAddPriority(&link6); + que->sDoAddPriority(&link7); + test(que->sHead->iNext==&link7); + test(que->sHead->iPrev==&link5); + test(link5.iNext==que->sHead); + test(link5.iPrev==&link6); + test(link6.iNext==&link5); + test(link6.iPrev==&link7); + test(link7.iNext==&link6); + test(link7.iPrev==que->sHead); + link8.iPriority=7; + que->sDoAddPriority(&link8); + test(que->sHead->iNext==&link7); + test(que->sHead->iPrev==&link5); + test(link5.iNext==que->sHead); + test(link5.iPrev==&link6); + test(link6.iNext==&link5); + test(link6.iPrev==&link8); + test(link7.iNext==&link8); + test(link7.iPrev==que->sHead); + test(link8.iPrev==&link7); + test(link8.iNext==&link6); + link9.iPriority=5; + que->sDoAddPriority(&link9); + test(que->sHead->iNext==&link7); + test(que->sHead->iPrev==&link5); + test(link5.iNext==que->sHead); + test(link5.iPrev==&link9); + test(link6.iNext==&link9); + test(link6.iPrev==&link8); + test(link7.iNext==&link8); + test(link7.iPrev==que->sHead); + test(link8.iPrev==&link7); + test(link8.iNext==&link6); + test(link9.iPrev==&link6); + test(link9.iNext==&link5); + link10.iPriority=3; + que->sDoAddPriority(&link10); + test(que->sHead->iNext==&link7); + test(que->sHead->iPrev==&link10); + test(link5.iNext==&link10); + test(link5.iPrev==&link9); + test(link6.iNext==&link9); + test(link6.iPrev==&link8); + test(link7.iNext==&link8); + test(link7.iPrev==que->sHead); + test(link8.iPrev==&link7); + test(link8.iNext==&link6); + test(link9.iPrev==&link6); + test(link9.iNext==&link5); + test(link10.iNext==que->sHead); + test(link10.iPrev==&link5); + link5.Deque(); + link6.Deque(); + link7.Deque(); + link8.Deque(); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test4() + { + T* que; + TInt offset; + + test.Start(_L("IsEmpty")); + que=new T(); + test(que->IsEmpty()==TRUE); + TDblQueLink link1,link2; + que->sDoAddFirst(&link1); + test(que->IsEmpty()==FALSE); + link1.Deque(); + test(que->IsEmpty()==TRUE); + que->sDoAddLast(&link2); + test(que->IsEmpty()==FALSE); + link1.Enque(&link2); + test(que->IsEmpty()==FALSE); + link2.Deque(); + test(que->IsEmpty()==FALSE); + link1.Deque(); + test(que->IsEmpty()==TRUE); + test.Next(_L("Reset")); + que->sDoAddFirst(&link1); + test(que->IsEmpty()==FALSE); + que->Reset(); + test(que->IsEmpty()==TRUE); + test.Next(_L("SetOffset")); + for (offset=0;offset<40;offset+=4) + { + que->SetOffset(offset); + test(*(que->sOffset)==offset); + } + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test5() + { + T* que; + TDeltaQueLink link1,link2,link3; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VDeltaQueBase(offset); + delete que; + que=new VDeltaQueBase; + test.Next(_L("Do's")); + que->sDoAddDelta(&link1,3); + que->sDoAddDelta(&link2,2); + que->sDoAddDelta(&link3,0); + que->sDoRemoveFirst(); + que->sDoRemove(&link2); + test.Next(_L("CountDown")); + que->CountDown(); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test6() + { + T* que; + TInt offset; + + test.Start(_L("Default constructor")); + que=new VDeltaQueBase(); + test(*(que->sFirstDelta)==NULL); + delete que; + test.Next(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VDeltaQueBase(offset); + test(*(que->sOffset)==offset); + test(*(que->sFirstDelta)==NULL); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test7() + { + T* que; + TDeltaQueLink link1,link2,link3,link4,link5,link6; + + test.Start(_L("DoAddDelta")); + que=new T(); + que->sDoAddDelta(&link2,3); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + que->sDoAddDelta(&link5,15); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link5.iDelta==12); + que->sDoAddDelta(&link3,6); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link5.iDelta==9); + que->sDoAddDelta(&link4,10); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->sDoAddDelta(&link1,1); + test(*(que->sFirstDelta)==&link1.iDelta); + test(link1.iDelta==1); + test(link2.iDelta==2); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->sDoAddDelta(&link6,21); + test(*(que->sFirstDelta)==&link1.iDelta); + test(link1.iDelta==1); + test(link2.iDelta==2); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + test(link6.iDelta==6); + test.Next(_L("DoRemove")); + que->sDoRemove(&link6); + test(*(que->sFirstDelta)==&link1.iDelta); + test(link1.iDelta==1); + test(link2.iDelta==2); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->sDoRemove(&link1); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->sDoRemove(&link4); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link5.iDelta==9); + que->sDoRemove(&link3); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link5.iDelta==12); + que->sDoRemove(&link5); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test.Next(_L("DoRemoveFirst")); + test(NULL==que->sDoRemoveFirst()); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + link2.iDelta=1; + test(NULL==que->sDoRemoveFirst()); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==1); + link2.iDelta=0; + test(&link2==que->sDoRemoveFirst()); + delete que; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test8() + { + T* que; + TDeltaQueLink link1,link2,link3; + + que=new T(); + que->sDoAddDelta(&link1,1); + que->sDoAddDelta(&link2,3); + que->sDoAddDelta(&link3,6); + test(que->CountDown()==TRUE); + que->sDoRemoveFirst(); + test(que->CountDown()==FALSE); + test(que->CountDown()==TRUE); + que->sDoRemoveFirst(); + test(que->CountDown()==FALSE); + test(que->CountDown()==FALSE); + test(que->CountDown()==TRUE); + que->sDoRemoveFirst(); + delete que; + } + +template +void TestTQue::Test9() + { + T* que; + TDblQueLink link1,link2; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VDblQue(offset); + delete que; + que=new VDblQue; + test.Next(_L("Add's")); + que->AddFirst(link1); + que->AddLast(link2); + test.Next(_L("Is's")); + que->IsHead(que->sHead); + que->IsFirst(&link1); + que->IsLast(&link2); + test.Next(_L("Get's")); + que->First(); + que->Last(); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test10() + { + T* que; + TInt offset; + + test.Start(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VDblQue(offset); + test(*(que->sOffset)==offset); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test11() + { + T* que; + TDblQueLink link1,link2,link3,link4; + + test.Start(_L("AddFirst")); + que=new T(); + que->AddFirst(link1); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==que->sHead); + que->AddFirst(link2); + test(que->sHead->iNext==&link2); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==que->sHead); + que->AddFirst(link3); + test(que->sHead->iNext==&link3); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==&link3); + test(link3.iNext==&link2); + test(link3.iPrev==que->sHead); + que->AddFirst(link4); + test(que->sHead->iNext==&link4); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==&link3); + test(link3.iNext==&link2); + test(link3.iPrev==&link4); + test(link4.iNext==&link3); + test(link4.iPrev==que->sHead); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + test.Next(_L("AddLast")); + que=new T(); + que->AddLast(link1); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link1); + test(link1.iNext==que->sHead); + test(link1.iPrev==que->sHead); + que->AddLast(link2); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link2); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==que->sHead); + test(link2.iPrev==&link1); + que->AddLast(link3); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link3); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==&link3); + test(link2.iPrev==&link1); + test(link3.iNext==que->sHead); + test(link3.iPrev==&link2); + que->AddLast(link4); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link4); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==&link3); + test(link2.iPrev==&link1); + test(link3.iNext==&link4); + test(link3.iPrev==&link2); + test(link4.iNext==que->sHead); + test(link4.iPrev==&link3); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + test.Next(_L("Combined AddFirst and AddLast")); + que=new T(); + que->AddFirst(link1); + que->AddLast(link2); + test(que->sHead->iNext==&link1); + test(que->sHead->iPrev==&link2); + test(link1.iNext==&link2); + test(link1.iPrev==que->sHead); + test(link2.iNext==que->sHead); + test(link2.iPrev==&link1); + que->AddFirst(link3); + test(que->sHead->iNext==&link3); + test(que->sHead->iPrev==&link2); + test(link1.iNext==&link2); + test(link1.iPrev==&link3); + test(link2.iNext==que->sHead); + test(link2.iPrev==&link1); + test(link3.iNext==&link1); + test(link3.iPrev==que->sHead); + que->AddLast(link4); + test(que->sHead->iNext==&link3); + test(que->sHead->iPrev==&link4); + test(link1.iNext==&link2); + test(link1.iPrev==&link3); + test(link2.iNext==&link4); + test(link2.iPrev==&link1); + test(link3.iNext==&link1); + test(link3.iPrev==que->sHead); + test(link4.iNext==que->sHead); + test(link4.iPrev==&link2); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test12() + { + T* que; + TDblQueLink link1,link2,link3,link4,*head; + + que=new T(); + que->AddFirst(link1); + que->AddLast(link2); + que->AddLast(link3); + que->AddLast(link4); + head=que->sHead; + test.Start(_L("IsHead")); + test(que->IsHead(head)==TRUE); + test(que->IsHead(&link1)==FALSE); + test(que->IsHead(&link2)==FALSE); + test(que->IsHead(&link3)==FALSE); + test(que->IsHead(&link4)==FALSE); + test.Next(_L("IsFirst")); + test(que->IsFirst(head)==FALSE); + test(que->IsFirst(&link1)==TRUE); + test(que->IsFirst(&link2)==FALSE); + test(que->IsFirst(&link3)==FALSE); + test(que->IsFirst(&link4)==FALSE); + test.Next(_L("IsLast")); + test(que->IsLast(head)==FALSE); + test(que->IsLast(&link1)==FALSE); + test(que->IsLast(&link2)==FALSE); + test(que->IsLast(&link3)==FALSE); + test(que->IsLast(&link4)==TRUE); + delete que; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test13() + { + T* que; + TDblQueLink link1,link2,link3,link4; + + test.Start(_L("First")); + que=new T(); + que->AddFirst(link1); + test(que->First()==&link1); + que->AddFirst(link2); + test(que->First()==&link2); + que->AddFirst(link3); + test(que->First()==&link3); + que->AddFirst(link4); + test(que->First()==&link4); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + test.Next(_L("Last")); + que=new T(); + que->AddLast(link1); + test(que->Last()==&link1); + que->AddLast(link2); + test(que->Last()==&link2); + que->AddLast(link3); + test(que->Last()==&link3); + que->AddLast(link4); + test(que->Last()==&link4); + link1.Deque(); + link2.Deque(); + link3.Deque(); + link4.Deque(); + delete que; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test14() + { + T* que; + TPriQueLink link; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VPriQue(offset); + delete que; + que=new VPriQue; + test.Next(_L("Add")); + que->Add(link); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test15() + { + T* que; + TInt offset; + + test.Start(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VPriQue(offset); + test(*(que->sOffset)==offset); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test16() + { + T* que; + TPriQueLink link1,link2,link3,link4,link5,link6; + + que=new T(); + link1.iPriority=4; + link2.iPriority=6; + link3.iPriority=2; + que->sDoAddPriority(&link1); + que->sDoAddPriority(&link2); + que->sDoAddPriority(&link3); + test(que->sHead->iNext==&link2); + test(que->sHead->iPrev==&link3); + test(link1.iNext==&link3); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==que->sHead); + test(link3.iNext==que->sHead); + test(link3.iPrev==&link1); + link4.iPriority=3; + que->sDoAddPriority(&link4); + test(que->sHead->iNext==&link2); + test(que->sHead->iPrev==&link3); + test(link1.iNext==&link4); + test(link1.iPrev==&link2); + test(link2.iNext==&link1); + test(link2.iPrev==que->sHead); + test(link3.iNext==que->sHead); + test(link3.iPrev==&link4); + test(link4.iNext==&link3); + test(link4.iPrev==&link1); + link5.iPriority=5; + que->sDoAddPriority(&link5); + test(que->sHead->iNext==&link2); + test(que->sHead->iPrev==&link3); + test(link1.iNext==&link4); + test(link1.iPrev==&link5); + test(link2.iNext==&link5); + test(link2.iPrev==que->sHead); + test(link3.iNext==que->sHead); + test(link3.iPrev==&link4); + test(link4.iNext==&link3); + test(link4.iPrev==&link1); + test(link5.iNext==&link1); + test(link5.iPrev==&link2); + link6.iPriority=1; + que->sDoAddPriority(&link6); + test(que->sHead->iNext==&link2); + test(que->sHead->iPrev==&link6); + test(link1.iNext==&link4); + test(link1.iPrev==&link5); + test(link2.iNext==&link5); + test(link2.iPrev==que->sHead); + test(link3.iNext==&link6); + test(link3.iPrev==&link4); + test(link4.iNext==&link3); + test(link4.iPrev==&link1); + test(link5.iNext==&link1); + test(link5.iPrev==&link2); + test(link6.iNext==que->sHead); + test(link6.iPrev==&link3); + delete que; + } + +template +void TestTQue::Test17() + { + T* que; + TDeltaQueLink link1,link2; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VDeltaQue(offset); + delete que; + que=new VDeltaQue; + test.Next(_L("Add/Remove")); + que->Add(link1,0); + que->Add(link2,2); + que->Remove(link2); + que->RemoveFirst(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test18() + { + T* que; + TInt offset; + + test.Start(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VDeltaQue(offset); + test(*(que->sOffset)==offset); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test19() + { + T* que; + TDeltaQueLink link1,link2,link3,link4,link5,link6; + + test.Start(_L("Add")); + que=new T(); + que->Add(link2,3); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + que->Add(link5,15); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link5.iDelta==12); + que->Add(link3,6); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link5.iDelta==9); + que->Add(link4,10); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->Add(link1,1); + test(*(que->sFirstDelta)==&link1.iDelta); + test(link1.iDelta==1); + test(link2.iDelta==2); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->Add(link6,21); + test(*(que->sFirstDelta)==&link1.iDelta); + test(link1.iDelta==1); + test(link2.iDelta==2); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + test(link6.iDelta==6); + test.Next(_L("Remove")); + que->Remove(link6); + test(*(que->sFirstDelta)==&link1.iDelta); + test(link1.iDelta==1); + test(link2.iDelta==2); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->Remove(link1); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link4.iDelta==4); + test(link5.iDelta==5); + que->Remove(link4); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link3.iDelta==3); + test(link5.iDelta==9); + que->Remove(link3); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test(link5.iDelta==12); + que->Remove(link5); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + test.Next(_L("RemoveFirst")); + test(NULL==que->RemoveFirst()); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==3); + link2.iDelta=1; + test(NULL==que->RemoveFirst()); + test(*(que->sFirstDelta)==&link2.iDelta); + test(link2.iDelta==1); + link2.iDelta=0; + test(&link2==que->RemoveFirst()); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +class VDblQueIterBase : public TDblQueIterBase + { +public: + VDblQueIterBase(TDblQueBase& aQue); + inline TAny* sDoPostInc() {return DoPostInc();} + inline TAny* sDoPostDec() {return DoPostDec();} + inline TAny* sDoCurrent() {return DoCurrent();} + TInt* sOffset; + TDblQueLinkBase** sHead; + TDblQueLinkBase** sNext; +private: + void SetMember(); + }; + +template +class VDblQueIter : public TDblQueIter + { +public: + VDblQueIter(TDblQueBase& aQue); + inline TAny* sDoPostInc() {return this->DoPostInc();} + inline TAny* sDoPostDec() {return this->DoPostDec();} + inline TAny* sDoCurrent() {return this->DoCurrent();} + TInt* sOffset; + TDblQueLinkBase** sHead; + TDblQueLinkBase** sNext; +private: + void SetMember(); + }; + +VDblQueIterBase::VDblQueIterBase(TDblQueBase& aQue) + :TDblQueIterBase(aQue) + { + SetMember(); + } + +void VDblQueIterBase::SetMember() + { + sOffset=&iOffset; + sHead=&iHead; + sNext=&iNext; + } + +template +VDblQueIter::VDblQueIter(TDblQueBase& aQue) + :TDblQueIter(aQue) + { + SetMember(); + } + +template +void VDblQueIter::SetMember() + { + sOffset=&this->iOffset; + sHead=&this->iHead; + sNext=&this->iNext; + } + +template +class TestTQueIter + { +public: + void TestIterBase(); + void TestQueIter(); + void Test1(); //All functions //TDblQueIterBase + void Test2(); //Constructors + void Test3(); //Do's + void Test4(); //Set + void Test5(); //All functions //TDblQueIter + void Test1Item(); + //void Test6(); //Constructors //Redundant + void Test7(); //Iterators +private: + void CallTest2_4(); + }; + +template +void TestTQueIter::CallTest2_4() + { + test.Next(_L("Constructors")); + Test2(); + test.Next(_L("Do's")); + Test3(); + test.Next(_L("Sets")); + Test4(); + } + +template +void TestTQueIter::TestIterBase() + { + test.Start(_L("All Methods")); + Test1(); + CallTest2_4(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::TestQueIter() + { + test.Start(_L("All Methods")); + Test5(); + CallTest2_4(); + test.Next(_L("One item in queue")); + Test1Item(); + test.Next(_L("Iterators")); + Test7(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test1() + { + Item item1,item2; + TDblQue que; + T* iter; + + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("Constructor")); + iter=new VDblQueIterBase(que); + test.Next(_L("Do's")); + iter->sDoCurrent(); + iter->sDoPostInc(); + iter->sDoPostDec(); + test.Next(_L("Sets")); + iter->SetToFirst(); + iter->SetToLast(); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test2() + { + Item item; + TDblQue* que; + TInt offset; + T* iter; + + for(offset=0;offset<40;offset+=4) + { + que=new TDblQue(offset); + new(PtrAdd(&item.iLink,offset)) TDblQueLink(); // create the link at this offset + iter=new T(*que); + test(que->IsHead((Item*) PtrSub(*(iter->sHead),offset))); //Need to pass a pointer to a item + test(que->IsHead((Item*) PtrSub(*(iter->sNext),offset))); + test(*(iter->sOffset)==offset); + delete iter; + delete que; + que=new TDblQue(offset); + new(PtrAdd(&item.iLink,offset)) TDblQueLink(); // create the link at this offset + que->AddFirst(item); + iter=new T(*que); + test(que->IsHead((Item*) PtrSub(*(iter->sHead),offset))); + test(*(iter->sNext)==PtrAdd(&item.iLink,offset)); //Need a pointer to a link + test(*(iter->sOffset)==offset); + PtrAdd(&item.iLink,offset)->Deque(); + delete iter; + delete que; + } + } + +template +void TestTQueIter::Test3() + { + Item item1,item2,item3,item4; + TDblQue que; + T* iter; + + que.AddFirst(item4); + que.AddFirst(item3); + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("DoPostInc")); + iter=new T(que); + test(&item1==iter->sDoPostInc()); + test(&item2.iLink==*(iter->sNext)); + test(&item2==iter->sDoPostInc()); + test(&item3.iLink==*(iter->sNext)); + test(&item3==iter->sDoPostInc()); + test(&item4.iLink==*(iter->sNext)); + test(&item4==iter->sDoPostInc()); + test(que.IsHead((Item*) *(iter->sNext))); + test(iter->sDoPostInc()==NULL); + delete iter; + test.Next(_L("DoPostDec")); + iter=new T(que); + iter->sDoPostInc(); + iter->sDoPostInc(); + iter->sDoPostInc(); + test(&item4.iLink==*(iter->sNext)); + test(&item4==iter->sDoPostDec()); + test(&item3.iLink==*(iter->sNext)); + test(&item3==iter->sDoPostDec()); + test(&item2.iLink==*(iter->sNext)); + test(&item2==iter->sDoPostDec()); + test(&item1.iLink==*(iter->sNext)); + test(&item1==iter->sDoPostDec()); + test(que.IsHead((Item*) *(iter->sNext))); + test(iter->sDoPostDec()==NULL); + delete iter; + test.Next(_L("DoCurrent")); + iter=new T(que); + test(&item1==iter->sDoCurrent()); + iter->sDoPostInc(); + test(&item2==iter->sDoCurrent()); + iter->sDoPostInc(); + test(&item3==iter->sDoCurrent()); + iter->sDoPostInc(); + test(&item4==iter->sDoCurrent()); + iter->sDoPostInc(); + test(iter->sDoCurrent()==NULL); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test4() + { + Item item1,item2,item3,item4; + TDblQue que; + T* iter; + TInt i,j; + + que.AddFirst(item4); + que.AddFirst(item3); + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("SetToFirst")); + iter=new T(que); + for(i=0;i<5;i++) + { + for(j=0;jsDoPostInc(); + iter->SetToFirst(); + test(*(iter->sNext)==&item1.iLink); + } + delete iter; + test.Next(_L("SetToLast")); + iter=new T(que); + for(i=0;i<5;i++) + { + iter->SetToFirst(); + for(j=0;jsDoPostInc(); + iter->SetToLast(); + test(*(iter->sNext)==&item4.iLink); + } + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test5() + { + Item item1,item2; + TDblQue que; + T* iter; + Item* a; + + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("Constructor")); + iter=new T(que); + test.Next(_L("Iterators")); + a=*iter; + test(((*iter)++)==&item1); + test(((*iter)--)==&item2); + test(((*iter)++)==&item1); + test(((*iter)++)==&item2); + test(((*iter)++)==NULL); + test(((*iter)++)==NULL); + test(((*iter)--)==NULL); + test(((*iter)--)==NULL); + iter->Set(item2); + test(((*iter)--)==&item2); + test(((*iter)++)==&item1); + test(((*iter)--)==&item2); + test(((*iter)--)==&item1); + test(((*iter)++)==NULL); + test(((*iter)++)==NULL); + test(((*iter)--)==NULL); + test(((*iter)--)==NULL); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test1Item() + { + Item item; + TDblQue que; + T* iter; + + test.Start(_L("Constructor")); + iter=new T(que); + que.AddFirst(item); + iter->Set(item); + test.Next(_L("Iterators")); + test(((*iter)++)==&item); + test(((*iter)++)==NULL); + test(((*iter)++)==NULL); + test(((*iter)++)==NULL); + test(((*iter)--)==NULL); + test(((*iter)--)==NULL); + iter->Set(item); + test(((*iter)--)==&item); + test(((*iter)++)==NULL); + test(((*iter)--)==NULL); + test(((*iter)--)==NULL); + test(((*iter)--)==NULL); + test(((*iter)++)==NULL); + test(((*iter)++)==NULL); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +/*template //Redundant +void TestTQueIter::Test6() + { + Item item; + TDblQue* que; + TInt offset; + T* iter; + + for(offset=0;offset<40;offset+=4) + { + que=new TDblQue(offset); + iter=new T(*que); + test(que->IsHead((Item*) *(iter->sHead))); + test(que->IsHead((Item*) *(iter->sNext))); + test(*(iter->sOffset)==offset); + delete iter; + delete que; + que=new TDblQue(offset); + que->AddFirst(item); + iter=new T(*que); + test(que->IsHead((Item*) *(iter->sHead))); + test(*(iter->sNext)==&item.iLink); + test(*(iter->sOffset)==offset); + delete iter; + delete que; + } + }*/ + +template +void TestTQueIter::Test7() + { + Item item1,item2,item3,item4; + TDblQue que; + T* iter; + + que.AddFirst(item4); + que.AddFirst(item3); + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("PostFix ++")); + iter=new T(que); + test(&item1==(*iter)++); + test(&item2.iLink==*(iter->sNext)); + test(&item2==(*iter)++); + test(&item3.iLink==*(iter->sNext)); + test(&item3==(*iter)++); + test(&item4.iLink==*(iter->sNext)); + test(&item4==(*iter)++); + test(que.IsHead((Item*) *(iter->sNext))); + test((*iter)++==NULL); + delete iter; + test.Next(_L("PostFix --")); + iter=new T(que); + iter->SetToLast(); + test(&item4.iLink==*(iter->sNext)); + test(&item4==(*iter)--); + test(&item3.iLink==*(iter->sNext)); + test(&item3==(*iter)--); + test(&item2.iLink==*(iter->sNext)); + test(&item2==(*iter)--); + test(&item1.iLink==*(iter->sNext)); + test(&item1==(*iter)--); + test(que.IsHead((Item*) *(iter->sNext))); + test((*iter)--==NULL); + delete iter; + test.Next(_L("Conversion Operator")); + iter=new T(que); + test(&item1==*iter); + (*iter)++; + test(&item2==*iter); + (*iter)++; + test(&item3==*iter); + (*iter)++; + test(&item4==*iter); + (*iter)++; + test(*iter==NULL); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +GLDEF_C TInt E32Main() + { + + TestTQueLink* testDblQueLinkBase; + TestTQueLink* testDeltaQueLink; + TestTQueLink* testDblQueLink; + TestTQueLink* testPriQueLink; + TestTQue* testDblQueBase; + TestTQue* testDeltaQueBase; + TestTQue >* testDblQue; + TestTQue >* testPriQue; + TestTQue >* testDeltaQue; + TestTQueIter* testDblQueIterBase; + TestTQueIter >* testDblQueIter; + +// Test the queue classes. + test.Title(); + test.Start(_L("class TDblQueLinkBase")); + testDblQueLinkBase=new TestTQueLink; + testDblQueLinkBase->TestQueLinkBase(); + delete testDblQueLinkBase; + + test.Next(_L("class TDeltaQueLink")); + testDeltaQueLink=new TestTQueLink; + testDeltaQueLink->TestQueLinkBase(); + delete testDeltaQueLink; + + test.Next(_L("class TDblQueLink")); + testDblQueLink=new TestTQueLink; + testDblQueLink->TestQueLink(); + delete testDblQueLink; + + test.Next(_L("class TPriQueLink")); + testPriQueLink=new TestTQueLink; + testPriQueLink->TestQueLink(); + delete testPriQueLink; + + test.Next(_L("class TDblQueBase")); + testDblQueBase=new TestTQue; + testDblQueBase->TestQueBase(); + delete testDblQueBase; + + test.Next(_L("class TDeltaQueBase")); + testDeltaQueBase=new TestTQue; + testDeltaQueBase->TestDeltaBase(); + delete testDeltaQueBase; + + test.Next(_L("class TDlbQue")); + testDblQue=new TestTQue >; + testDblQue->TestDblQue(); + delete testDblQue; + + test.Next(_L("class TPriQue")); + testPriQue=new TestTQue >; + testPriQue->TestPriQue(); + delete testPriQue; + + test.Next(_L("class TDeltaQue")); + testDeltaQue=new TestTQue >; + testDeltaQue->TestDeltaQue(); + delete testDeltaQue; + + test.Next(_L("class TDblQueIterBase")); + testDblQueIterBase=new TestTQueIter; + testDblQueIterBase->TestIterBase(); + delete testDblQueIterBase; + + test.Next(_L("class TDblQueIter")); + testDblQueIter=new TestTQueIter >; + testDblQueIter->TestQueIter(); + delete testDblQueIter; + + test.Next(_L("Finished")); + test.End(); + return(0); + } + +#pragma warning(default : 4710) //fuction not expanded + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_rbuf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_rbuf.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,567 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_rbuf.cpp +// Overview: +// Test methods of the RBuf16, RBuf8, RBuf template class. +// API Information: +// RBuf16, RBuf8, RBuf. +// Details: +// For RBuf8, RBuf16 and RBuf objects: +// - Test the Create and CreateMax methods by verifying the return value of +// KErrNone, the initial length and max length. Perform basic write and read +// operations and verify the results. +// - Test the CreateL and CreateMaxL methods by verifying the return value of +// KErrNone. Also force a heap error and verify return value of KErrNoMemory. +// - Test the Create(const TDesC_& aDesc) and Create(const TDesCX_ aDesc, +// TInt aMaxLength) methods by verifying the return value of KErrNone. Verify +// initial length, max length and initialisation. +// - Test the CreateL(const TDesC_& aDesc) and CreateMaxL(const TDesCX_ aDesc, +// TInt aMaxLength) methods by verifying the return value of KErrNone. Also +// force a heap error and verify return value of KErrNoMemory. +// - Test the Swap method by creating two initialised objects, calling Swap +// and confirming the results as expected. +// - Test the Assign method by performing an assign from a variety of sources +// and verifying the results are as expected. +// - Test the ReAlloc method in a variety of scenarios that decrease memory, +// increase memory and zero-length memory. Verify that the results are as +// expected. +// - Test the ReAllocL by verifying the return value of KErrNone. Also force +// a heap error and verify return value of KErrNoMemory. Verify that the +// object is the same as before the failed ReAllocL call. +// - Test the CleanupClosePushL method via CleanupStack::PopAndDestroy(). +// - Force the CleanupClosePushL to leave to check cleanup of RBuf. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include + +LOCAL_D RTest test(_L("T_RBUF")); + +#undef _TS +#define _TS(a) ((const TTEXT*)RTest::String(sizeof(TTEXT),(TText8*)a,(TText16*)L ## a)) + +/** +Tests the following methods. + - TInt Create(TInt aMaxLength); + - TInt CreateMax(TInt aMaxLength); +*/ +template +LOCAL_C void TestCreate(RBUF*) +{ + RBUF rBuf; + + test.Next(_L("Create(TInt aMaxLength) method")); + + test(rBuf.Create(19)==KErrNone); //Create RBuf as EPtr type + test(rBuf.Length()==0); + test(rBuf.MaxLength()==19); + rBuf.SetLength(2); + rBuf[1] = 1; //Try basic write & ... + test(rBuf[1] == 1); //... read + rBuf.Close(); + + test(rBuf.Create(0)==KErrNone); //Create zero length RBuf as EPtr type + test(rBuf.Length()==0); + test(rBuf.MaxLength()==0); + rBuf.Close(); + + test.Next(_L("CreateMax(TInt aMaxLength) method")); + + test(rBuf.CreateMax(20)==KErrNone); //Create RBuf as EPtr type + test(rBuf.Length()==20); + test(rBuf.MaxLength()==20); + rBuf[1] = 1; + test(rBuf[1] == 1); + rBuf.Close(); +} + +/** +Tests the following methods. + - void CreateL(TInt aMaxLength); + - void CreateMaxL(TInt aMaxLength); +*/ +template +LOCAL_C void TestCreateLeaving(RBUF*) +{ + RBUF rBuf; + + test.Next(_L("CreateL(TInt aMaxLength) method")); + + TRAPD(ret, rBuf.CreateL(20)); //Create RBuf as EPtr type + test(KErrNone == ret); + rBuf.Close(); + +#if defined(_DEBUG) + __UHEAP_FAILNEXT(1); //Set the next alloc to fail + TRAP(ret, rBuf.CreateL(10)); + test(KErrNoMemory == ret); // It fails due to __UHEAP_FAILNEXT(1); +#endif //_DEBUG + + test.Next(_L("CreateMaxL(TInt aMaxLength) method")); + + TRAP(ret, rBuf.CreateMaxL(20)); //Create RBuf as EPtr type + test(KErrNone == ret); + rBuf.Close(); + +#if defined(_DEBUG) + __UHEAP_FAILNEXT(1); //Set the next alloc to fail + TRAP(ret, rBuf.CreateMaxL(10)); + test(KErrNoMemory == ret); // It fails due to __UHEAP_FAILNEXT(1); +#endif //_DEBUG +} + +/** +Tests the following methods. + - TInt Create(const TDesC_& aDesc); + - TInt Create(const TDesC_& aDesc, TInt aMaxLength)); +*/ +template +LOCAL_C void TestCreateFromDes(RBUF*) +{ + RBUF rBuf; + TBUF des (_TS("012345")); + + test.Next(_L("Create(const TDesC_& aDesc) method")); + + test(rBuf.Create(des)==KErrNone); //Create RBuf as EPtr type + test(rBuf == des); + rBuf.Close(); + + test.Next(_L("Create(const TDesCX_ aDesc, TInt aMaxLength) method")); + + test(rBuf.Create(des, des.Length())==KErrNone); //Create RBuf as EPtr type + test(rBuf==des); + rBuf.Close(); + + test(rBuf.Create(des, des.Length()-2)==KErrNone); //Create RBuf as EPtr type + test(rBuf.Length()==4); + test(rBuf.MaxLength()==4); + test(rBuf[0] == (TTEXT)('0')); + test(rBuf[3] == (TTEXT)('3')); + test(rBuf +LOCAL_C void TestCreateFromDesLeaving(RBUF*) +{ + RBUF rBuf; + TBUF des (_TS("123456")); + + test.Next(_L("CreateL(const TDesC_& aDesc) method")); + + TRAPD(ret, rBuf.CreateL(des)); //Create RBuf as EPtr type + test(KErrNone == ret); + rBuf.Close(); + +#if defined(_DEBUG) + __UHEAP_FAILNEXT(1); //Set the next alloc to fail + TRAP(ret, rBuf.CreateL(des)); + test(KErrNoMemory == ret); // This will fail due to __UHEAP_FAILNEXT(1); +#endif //(_DEBUG) + + test.Next(_L("CreateL(const TDesC_& aDesc, TInt aMaxLength) method")); + + TRAP(ret, rBuf.CreateL(des, des.Length())); //Create RBuf as EPtr type + test(KErrNone == ret); + rBuf.Close(); + +#if defined(_DEBUG) + __UHEAP_FAILNEXT(1); //Set the next alloc to fail + TRAP(ret, rBuf.CreateL(des, des.Length())); + test(KErrNoMemory == ret); // It fails due to __UHEAP_FAILNEXT(1); +#endif //(_DEBUG) +} + +/** +Tests the following methods: + - TInt Assign(const RBuf_& rBuf); + - TInt Assign(TUint* aHeapCell, TInt aMaxLength); + - TInt Assign(TUint* aHeapCell, TInt aLength, TInt aMaxLength); + - TInt Assign(HBufC& aHBuf); + - RBuf(HBufC_&) constructor. +*/ +template +LOCAL_C void TestAssign(RBUF*) +{ + RBUF rBuf; + TBUF des (_TS("123456")); + RBUF rBuf2; + + test.Next(_L("Assign(const RBuf_& aRBuf) method")); + + rBuf2.Create(des); + rBuf.Assign(rBuf2); + test(rBuf==rBuf2); + rBuf.Close(); + + test.Next(_L("Assign(TUint* aHeapCell, TInt aLength, TInt aMaxLength ) method")); + + TTEXT* heap = (TTEXT*)User::Alloc(24*(TInt)sizeof(TTEXT)); //Allocate 48 bytes for 24 long RBuf16 + rBuf.Assign(heap, 12,24); + test(rBuf.Length() == 12); + test(rBuf.MaxLength() == 24); + rBuf.Close(); + + heap = NULL; + rBuf.Assign(heap, 0,0); + test(rBuf.Length() == 0); + test(rBuf.MaxLength() == 0); + rBuf.Close(); + + test.Next(_L("Assign(TUint* aHeapCell, TInt aMaxLength ) method")); + + heap = (TTEXT*)User::Alloc(24*(TInt)sizeof(TTEXT)); //Allocate 48 bytes for 24 long RBuf16 + rBuf.Assign(heap, 24); + test(rBuf.Length() == 0); + test(rBuf.MaxLength() == 24); + rBuf.Close(); + + test.Next(_L("Assign(HBufC_* aHBuf) method")); + + HBUF* hBuf = HBUF::NewMax(11); + rBuf.Assign(hBuf); //Create RBuf as EBufCPtr type + test(rBuf.Length() == 11); + test(rBuf.MaxLength() >= 11); //There could me more allocated memory - see HBufC8::Des() + rBuf.Close(); + + test.Next(_L("RBuf_(HBufC_* aHBuf) constructor")); + + hBuf = HBUF::NewMax(12); //Create RBuf as EBufCPtr + RBUF rBuf3(hBuf); + test(rBuf3.Length() == 12); + test(rBuf3.MaxLength() >= 12); + rBuf3.Close(); + + hBuf = HBUF::NewMax(0); + RBUF rBuf4(hBuf); //The length of aHBuf is zero + test(rBuf4.Length() == 0); + rBuf4.Close(); + + hBuf = NULL; //aHBuf is NULL + RBUF rBuf5(hBuf); + test(rBuf5.Length() == 0); + test(rBuf5.MaxLength() == 0); + rBuf5.Close(); +} + +/** +Tests the following methods. + - TInt ReAlloc(TInt aMaxLength); +*/ +template +LOCAL_C void TestReAlloc(RBUF*) +{ + RBUF rBuf; + + TBUF des (_TS("0123456")); + + + test.Next(_L("ReAlloc(TInt aMaxLength) method")); + + //reallocate EPtr type - decrease memory + test(rBuf.Create(des)==KErrNone); //Create as EPtr + rBuf.SetLength(3); + test(rBuf.ReAlloc(3)==KErrNone); //ReAlloc to EPtr + test(rBuf.MaxLength()>=3); + test(rBuf.Length()==3); + test(rBuf[0] == (TTEXT)('0')); + test(rBuf[2] == (TTEXT)('2')); + rBuf.Close(); + + //reallocate EPtr type - increase memory + test(rBuf.Create(des,des.MaxLength())==KErrNone); //Create as EPtr + test(rBuf.ReAlloc(15)==KErrNone); //ReAlloc to EPtr + test(rBuf.MaxLength()==15); + test(rBuf.Length()==7); + test(rBuf[0] == (TTEXT)('0')); + test(rBuf[6] == (TTEXT)('6')); + rBuf.Close(); + + + //reallocate EBufCPtr type - decrease memory + HBUF* hBuf = HBUF::NewMax(9); + *hBuf = _TS("012345678"); + rBuf.Assign(hBuf); //Create as EBufCPtr + rBuf.SetLength(5); + test(rBuf.ReAlloc(5)==KErrNone); //ReAlloc to EBufCPtr + test(rBuf.MaxLength()>=5);//There could be more allocated memory - see HBufC8::Des() + test(rBuf.Length()==5); + test(rBuf[0] == (TTEXT)('0')); + test(rBuf[4] == (TTEXT)('4')); + rBuf.Close(); + + //reallocate EBufCPtr type - increase memory + hBuf = HBUF::NewMax(9); + *hBuf = _TS("012345678"); + rBuf.Assign(hBuf); //Create as EBufCPtr + test(rBuf.ReAlloc(15)==KErrNone); //ReAlloc to EBufCPtr + test(rBuf.MaxLength()>=15);//There could be more allocated memory - see HBufC8::Des() + test(rBuf.Length()==9); + test(rBuf[0] == (TTEXT)('0')); + test(rBuf[8] == (TTEXT)('8')); + rBuf.Close(); + + //reallocate EPtr type - to zero-length + test(rBuf.Create(des)==KErrNone); //Create as EPtr + rBuf.SetLength(0); + test(rBuf.ReAlloc(0)==KErrNone); //ReAlloc to EPtr + test(rBuf.MaxLength()==0); + test(rBuf.Length()==0); + rBuf.Close(); + + //reallocate EBufCPtr type to zero-length + hBuf = HBUF::NewMax(9); + *hBuf = _TS("012345678"); + rBuf.Assign(hBuf); //Create as EBufCPtr + rBuf.SetLength(0); + test(rBuf.ReAlloc(0)==KErrNone); //ReAlloc to EPtr + test(rBuf.MaxLength()==0); + test(rBuf.Length()==0); + rBuf.Close(); + + //reallocate from zero-length + rBuf.Create(0); //Create as EPtr + test(rBuf.ReAlloc(9)==KErrNone); //ReAlloc to EPtr + test(rBuf.MaxLength()==9); + test(rBuf.Length()==0); + rBuf.Close(); + + //reallocate from zero-length EBufCPtr to EPtr + struct dummy // make it look like RBuf16 + { + TInt iLength; + TInt iMaxLength; + HBUF* iEBufCPtrType; //Pointer to buffer data + }; + + // reference rBuf as our dummy.. + dummy &drBuf = (dummy&) rBuf; + rBuf.Assign(HBUF::NewL(0)); //Create as EBufCPtr + test(EBufCPtr == (drBuf.iLength>>KShiftDesType)); + rBuf.Close(); // the actual behavior causes memory leaks, so we should close it first. + test(rBuf.ReAlloc(13)==KErrNone); // ReAlloc changes it from EBufCPtr to EPtr + test(EPtr == (drBuf.iLength>>KShiftDesType)); + test(rBuf.MaxLength() == 13); + test(rBuf.Length() == 0); + rBuf.Close(); + + //reallocate from zero-length to zero-length + rBuf.Create(0); //Create as EPtr + test(rBuf.ReAlloc(0)==KErrNone); //ReAlloc to EPtr + test(rBuf.Length() == 0); + test(rBuf.MaxLength() == 0); + rBuf.Close(); + +} + +/** +Tests the following methods. + - TInt ReAllocL(TInt aMaxLength); +*/ +template +LOCAL_C void TestReAllocLeaving(RBUF*) +{ + RBUF rBuf; + + TBUF des(_TS("01")); + + test.Next(_L("ReAllocL(TInt aMaxLength) method")); + + test(rBuf.Create(des) ==KErrNone); + TRAPD(ret, rBuf.ReAllocL(6)); //ReAlloc buffer + test(KErrNone == ret); + +#if defined(_DEBUG) + __UHEAP_FAILNEXT(1); + TRAP(ret, rBuf.ReAllocL(100)); //Realloc buffer. This should fail. + test(KErrNoMemory == ret); +#endif //(_DEBUG) + + test(rBuf.MaxLength()==6); //Check RBuf is the same as before ... + test(rBuf.Length()==2); //... ReAlloc that failed. + test(rBuf[0] == (TTEXT)('0')); + test(rBuf[1] == (TTEXT)('1')); + rBuf.Close(); +} + +/** +Tests the following methods. + - void Swap(RBuf_& aBuf); +*/ +template +LOCAL_C void TestSwap(RBUF*) +{ + RBUF rBuf1, rBuf2; + TBUF des1(_TS("12")); + TBUF des2 (_TS("345678")); + + test.Next(_L("Swap(RBuf_& aRBuf) method")); + + test(rBuf1.Create(des1) ==KErrNone); + test(rBuf2.Create(des2) ==KErrNone); + + rBuf1.Swap(rBuf2); + + test(rBuf1==des2); + test(rBuf2==des1); + + rBuf1.Close(); + rBuf2.Close(); +} + +/** +Test assignemnt operator. +*/ +template +LOCAL_C void TestAssignmentOperator() +{ + test.Next(_L("Assignment operator")); + + TBUF tdes(_TS("Modifiable descriptor")); + TBUFC tdesc(_TS("Non-modifiable descriptor")); + + RBUF rbuf, rbuf2; + rbuf.Create(32); + rbuf2.Create(32); + rbuf2.Copy(_TS("Buffer descriptor"), 17); + + rbuf = tdesc; test(rbuf == tdesc); + rbuf = tdes; test(rbuf == tdes); + rbuf = rbuf2; test(rbuf == rbuf2); + + rbuf2.Close(); + rbuf.Close(); +} + +/** +Tests the following methods. + - void CleanupClosePushL(); +*/ +template LOCAL_C void TestCleanupClosePushL(RBUF*) +{ + RBUF rBuf; + + test.Next(_L("CleanupClosePushL() method")); + test(KErrNone == rBuf.Create(10)); + rBuf.CleanupClosePushL(); + CleanupStack::PopAndDestroy(); +} + +/** +This function will intentionally leave to check cleanup of RBuf. +To be called in debug build only. Otherwise will panic. +*/ +template LOCAL_C void TestRBufCleanupL(RBUF*) +{ + RBUF rBuf; + + test.Next(_L("Test cleanup of RBuf")); + test(KErrNone == rBuf.Create(10)); + rBuf.CleanupClosePushL(); + + __UHEAP_FAILNEXT(1); + TInt* ptr = (TInt*)User::AllocL(20); //This should leave + *ptr = 0; //Avoid compiler warning + User::Panic(_L("Should not reach this line"),0); +} + +GLDEF_C TInt E32Main() + { + RBuf8* r8=0; + RBuf16* r16=0; + RBuf* r=0; + + CTrapCleanup* trapHandler=CTrapCleanup::New(); + test(trapHandler!=NULL); + + test.Title(); + test.Start(_L("Testing RBuf8, RBuf16 & RBuf classes")); + + __UHEAP_MARK; + + test.Start(_L("Testing class RBuf8 ...")); + TestCreate(r8); + TestCreateLeaving(r8); + TestCreateFromDes,TText8>(r8); + TestCreateFromDesLeaving,TText8>(r8); + TestSwap,TText8>(r8); + TestAssign,TText8,HBufC8>(r8); + TestReAlloc,TText8,HBufC8>(r8); + TestReAllocLeaving,TText8>(r8); + TestAssignmentOperator,TBufC8<32>,TText8>(); + TRAPD(ret,TestCleanupClosePushL(r8)); test(ret==KErrNone); +#if defined(_DEBUG) + TRAP(ret, TestRBufCleanupL(r8)); test(KErrNoMemory == ret); +#endif //(_DEBUG) + test.End(); + + test.Start(_L("Testing class RBuf16 ...")); + TestCreate(r16); + TestCreateLeaving(r16); + TestCreateFromDes,TText16>(r16); + TestCreateFromDesLeaving,TText16>(r16); + TestSwap,TText16>(r16); + TestAssign,TText16,HBufC16>(r16); + TestReAlloc,TText16,HBufC16>(r16); + TestReAllocLeaving,TText16>(r16); + TestAssignmentOperator,TBufC16<32>,TText16>(); + TRAP(ret,TestCleanupClosePushL(r16)); test(ret==KErrNone); +#if defined(_DEBUG) + TRAP(ret, TestRBufCleanupL(r16)); test(KErrNoMemory == ret); +#endif //(_DEBUG) + test.End(); + + test.Start(_L("Testing class RBuf ...")); + TestCreate(r); + TestCreateLeaving(r); + TestCreateFromDes,TText>(r); + TestCreateFromDesLeaving,TText>(r); + TestSwap,TText>(r); + TestAssign,TText,HBufC>(r); + TestReAlloc,TText,HBufC>(r); + TestReAllocLeaving,TText>(r); + TestAssignmentOperator,TBufC<32>,TText>(); + TRAP(ret,TestCleanupClosePushL(r)); test(ret==KErrNone); +#if defined(_DEBUG) + TRAP(ret, TestRBufCleanupL(r)); test(KErrNoMemory == ret); +#endif //(_DEBUG) + test.End(); + + __UHEAP_MARKEND; + + test.End(); + + delete trapHandler; + return(KErrNone); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_readar.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_readar.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,181 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_readar.cpp +// Overview: +// Test the CArrayFixFlat, CArrayPakFlat, CArrayVarFlat classes. +// API Information: +// CArrayFixFlat, CArrayPakFlat, CArrayVarFlat. +// Details: +// - Create an array of fixed length objects contained within a flat +// dynamic buffer, append some elements onto the end of the array, +// sort the array into key sequence, check the number of elements +// in the array is as expected and read all of elements. Check +// whether the heap has been corrupted. +// - Create an array of variable length objects implemented using a +// flat dynamic buffer, append some elements onto the end of the +// array, sort the array into key sequence, check the number of elements +// in the array is as expected and read all of elements. Check whether +// the heap has been corrupted. +// - Create an array of variable length objects packed into a flat buffer, +// append some elements onto the end of the array, sort the array into +// key sequence and check the number of elements held in the array is +// as expected. Read all array elements. Check whether the heap has been +// corrupted. +// - Check whether the heap has been corrupted by any of the tests. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +const TInt KMaxStrings=3; + +LOCAL_D RTest test(_L("T_READAR")); +LOCAL_D const TPtrC s1(_L("ZZZZ")); +LOCAL_D const TPtrC s2(_L("AAAA")); +LOCAL_D const TPtrC s3(_L("MMMM")); +LOCAL_D const TPtrC* str[KMaxStrings] = {&s1,&s2,&s3}; +LOCAL_D const TPtrC* strSorted[KMaxStrings] = {&s2,&s3,&s1}; + +LOCAL_C void testReadAny(const TArray > anArray) +// +// Test with fixed length arrays. +// + { + + test(anArray.Count()==KMaxStrings); + for (TInt i=0;i >* pFix=new(ELeave) CArrayFixFlat >(1); + for (TInt i=0;i b=(*str[i]); + pFix->AppendL(b); + } +// + test.Next(_L("Sorting Fix array")); + TKeyArrayFix array(0,ECmpNormal); + pFix->Sort(array); +// + test.Next(_L("Reading Fix array")); + testReadAny(pFix->Array()); +// + test.Next(_L("Destroying Fix array")); + delete pFix; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testVarL() +// +// Test with variable length arrays. +// + { + + __UHEAP_MARK; +// + test.Start(_L("Creating Var array")); + CArrayVarFlat >* pVar=new(ELeave) CArrayVarFlat >(1); + for (TInt i=0;i b=(*str[i]); + pVar->AppendL(b,b.Size()+sizeof(TUint)); + } +// + test.Next(_L("Sorting Var array")); + TKeyArrayVar array(0,ECmpNormal); + pVar->Sort(array); +// + test.Next(_L("Reading Var array")); + testReadAny(pVar->Array()); +// + test.Next(_L("Destroying Var array")); + delete pVar; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testPakL() +// +// Test with variable length packed arrays. +// + { + + __UHEAP_MARK; +// + test.Start(_L("Creating Pak array")); + CArrayPakFlat >* pPak=new(ELeave) CArrayPakFlat >(1); + for (TInt i=0;i b=(*str[i]); + pPak->AppendL(b,b.Size()+sizeof(TUint)); + } +// + test.Next(_L("Sorting Pak array")); + TKeyArrayVar array(0,ECmpNormal); + pPak->SortL(array); +// + test.Next(_L("Reading Pak array")); + testReadAny(pPak->Array()); +// + test.Next(_L("Destroying Pak array")); + delete pPak; + __UHEAP_MARKEND; +// + test.End(); + } + +GLDEF_C TInt E32Main() +// +// Test the Array classes. +// + { + + test.Title(); + __UHEAP_MARK; +// + test.Start(_L("Testing Fix arrays")); + TRAPD(r,testFixL()); + test(r==KErrNone); +// + test.Next(_L("Testing Var arrays")); + TRAP(r,testVarL()); + test(r==KErrNone); +// + test.Next(_L("Testing Pak arrays")); + TRAP(r,testPakL()); + test(r==KErrNone); +// + __UHEAP_MARKEND; + test.End(); + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_regn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_regn.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,820 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_regn.cpp +// Overview: +// Test fixed and variable clipping regions. +// API Information: +// TRegionFix, RRegion . +// Details: +// - Construct some expandable clipping regions, add some rectangles, check the region +// matches the rectangles, clear the region, add some rectangles to the region and +// check the region matches the rectangles. +// - Copy one region to another, using the Copy method and the copy constructor, +// and check the region matches the rectangles. +// - Create a some fixed clipping regions, add some rectangles, check the region +// matches the rectangles, clear the region, add some rectangles, and check the +// region matches the rectangles. +// - Copy one fixed region to another, using the Copy method and the copy constructor, +// and check the region matches the rectangles. +// - Test TRegionFix creation and error handling using Clear, Count, AddRect, CheckError +// and Tidy methods +// - Test adding rectangles, via AddRect, to an RRegion object. Verify the results +// via the Count, BoundingRect and IsEmpty methods. +// - Test subtracting rectangles, via SubRect, from an RRegion object. Verify the +// results via the Count, BoundingRect and SubRegion methods. +// - Test subtracting regions, via AddRect and SubRegion, from an RRegion object. +// Verify the results via the Count, BoundingRect, Clear, Copy, and SubRect methods. +// - Test the RRegion Tidy method. Verify the results via the Count, AddRect, +// BoundingRect and Clear methods. +// - Test the RRegion CheckSpare method. Verify the results via the AddRect, Tidy, +// Clear and SubRect methods. +// - Test the RRegion Offset method. Verify the results via the AddRect, Move, +// Clear, IsEmpty and RectangleList methods. +// - Test the RRegion Intersection and Intersect methods. Verify the results via +// the AddRect, Count, IsEmpty and RectangleList methods. +// - Test the RRegion Union method. Verify the results via the AddRect, Count, +// Copy, Offset and BoundingRect methods. +// - Test the RRegion ClipRect method. Verify the results via the AddRect, Count, +// and BoundingRect methods. +// - Test the RRegion and TRgionFix Contains methods. Verify the results via the +// AddRect method. +// - Test the RRegion ForceError and CheckError methods. Verify the results via the +// AddRect, Copy, Count, SubRect, Clear and BoundingRect methods. +// - Test the RRegion and RRegionBuf sort method. +// - Construct some regions with pre-allocated buffer (RRegionBuf), add some rectangles, +// get a pointer to the array of rectangles defining this region and check the +// rectangles are as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +LOCAL_D RTest test(_L("T_REGN")); + +class TestRRegion + { +public: + TestRRegion(TInt tlx, TInt tly, TInt brx, TInt bry); + void TestSet(); + void TestRegionFix(); + void TestAddRect(); + void TestSubRect(); + void TestSubRegion(); + void TestTidy(); + void TestSpare(); + void TestOffset(); + void TestIntersection(); + void TestUnion(); + void TestClipRect(); + void TestContains(); + void TestIntersects(); + void TestErrors(); + void doTestSort(RRegion &aRegion); + void TestSort(); + void doTestRegionBuf(RRegion &aRegion); + void TestRegionBuf(); +private: + void DoTestSet(TRegion** rgn,TInt rgnArraySize); + void CheckRectRegion(const TRegion& region,const TRect& rect); +private: + TRect rect[4]; + TRect bounds; + TRect xrect; + }; + +// Region test code +TestRRegion::TestRRegion(TInt tlx, TInt tly, TInt brx, TInt bry) + { + rect[0]=TRect( tlx, tly, brx, bry); + rect[1]=TRect(-brx,-bry,-tlx,-tly); + rect[2]=TRect( tlx,-bry, brx,-tly); + rect[3]=TRect(-brx, tly,-tlx, bry); + bounds=TRect(-brx,-bry,brx,bry); + xrect=TRect(-(tlx/2+brx/2),-(tly/2+bry/2),tlx/2+brx/2,tly/2+bry/2); + } + +void TestRRegion::CheckRectRegion(const TRegion& region,const TRect& rect) +// Check the region matches the rectangle + { + const TRect* rlist; + + if (rect.IsEmpty()) + test(region.Count()==0); + else + { + test(region.Count()==1); + rlist=region.RectangleList(); + test(rlist[0]==rect); + test(region[0]==rect); + } + } + +void TestRRegion::DoTestSet(TRegion** rgn,TInt rgnArraySize) + { + TInt index; + for(index=0;indexAddRect(rect[index]); + for(index=0;indexClear(); + rgn[index]->AddRect(rect[index]); + } + for(index=0;index rgnf[5]; + TRegion* prgnf[5]={&rgnf[0],&rgnf[1],&rgnf[2],&rgnf[3],&rgnf[4]}; + DoTestSet(&prgnf[0],(sizeof(rgnf)/sizeof(rgnf[0]))); + for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++) + { + TRegionFix<5> rgn1; + rgn1.Copy(rgnf[index]); + CheckRectRegion(rgn1,rect[index]); + TRegionFix<5> rgn2(rgnf[index]); + CheckRectRegion(rgn2,rect[index]); + } + } + +void TestRRegion::TestRegionFix() +// +// Test TRegionFix creation and error handling +// + { + TRegionFix<1> rgnf(rect[0]); + CheckRectRegion(rgnf,rect[0]); + rgnf.Clear(); + test(rgnf.Count()==0); + rgnf.AddRect(TRect(0,0,2,2)); + test(rgnf.CheckError()==FALSE); + rgnf.AddRect(TRect(2,2,4,4)); // Should cause error, rgnf can only hold 1 rectangle + test(rgnf.CheckError()==TRUE && rgnf.Count()==0); + rgnf.Clear(); + test(rgnf.CheckError()==FALSE && rgnf.Count()==0); +// + TRegionFix<10> rgnf2; + TInt index; + for(index=0;index<10;index++) + { + rgnf2.AddRect(TRect(index*4,0,index*4+2,10)); + test(rgnf2.Count()==(index+1)); + TRegionFix<10> rgnf4(rgnf2); // Test copy constructor + TRegionFix<10> rgnf5; + rgnf5=rgnf2; // Test assignment + test(rgnf4.Count()==(index+1)); + for(TInt index2=0;index2<=index;index2++) + test(rgnf2[index2]==rgnf4[index2] && rgnf2[index2]==rgnf5[index2]); + } + rgnf2.AddRect(TRect(-10,-10,0,0)); // Should push it over the edge + test(rgnf2.CheckError()==TRUE && rgnf2.Count()==0); +// + TRegionFix<5> rgnf3; + for(index=0;index<4;index++) + { + rgnf3.AddRect(TRect(index*4,index*4,index*4+8,index*4+8)); + if (index==3) + test(rgnf3.CheckError()==TRUE); + else + { + rgnf3.Tidy(); + if (index>0) + test(rgnf3.Count()==(index+2)); + } + } + } + +void TestRRegion::TestAddRect() + { + RRegion rgn; + TInt index,i; + + if (!rect[0].IsEmpty()) + { + for(index=0;index<4;index++) + { + for(i=0;i<=index;i++) + rgn.AddRect(rect[index]); + test(rgn.Count()==(index+1)); + } + test(rgn.BoundingRect()==bounds); + if (!xrect.IsEmpty()) + { + rgn.AddRect(xrect); + test(rgn.Count()==7); + } + } + rgn.AddRect(bounds); + test(rgn.Count()==1); + rgn.Close(); + } + +void TestRRegion::TestSubRect() + { + TRect rect1(-rect[0].iBr.iX,-rect[0].iBr.iY,rect[0].iBr.iX,rect[0].iBr.iY); + RRegion rgn; + RRegion subRgn; + RRegion rgn2; + TInt index; + + if (!rect[0].IsEmpty()) + { + rgn.AddRect(rect1); + for(index=0;index<4;index++) + rgn.SubRect(rect[index],&subRgn); + if (rect[0].iTl.iX==0) // Special case region, all rects join in the middle + { + test(rgn.Count()==0); + test(subRgn.Count()==4); + } + else + { + test(rgn.Count()==3); + test(subRgn.Count()==4); + test(rgn.BoundingRect()==subRgn.BoundingRect()); + rgn.SubRect(xrect); + test(rgn.Count()==4); + rgn2.Copy(rgn); + subRgn.Clear(); + rgn.SubRect(rgn.BoundingRect(),&subRgn); + test(rgn.Count()==0); + rgn2.SubRegion(subRgn,&rgn); + test(rgn2.Count()==0); + subRgn.SubRegion(rgn); + test(subRgn.Count()==0); + } + } + rgn.Close(); + rgn2.Close(); + subRgn.Close(); + } + +void TestRRegion::TestSubRegion() + { + TRect rect1(-rect[0].iBr.iX,-rect[0].iBr.iY,rect[0].iBr.iX,rect[0].iBr.iY); + RRegion rgn,subRgn; + RRegion rgn2; + TInt index; + + if (!rect[0].IsEmpty()) + { + rgn.AddRect(rect1); + for(index=0;index<4;index++) + rgn2.AddRect(rect[index]); + rgn.SubRegion(rgn2,&subRgn); + if (rect[0].iTl.iX==0) // Special case region, all rects join in the middle + { + test(rgn.Count()==0); + test(subRgn.Count()==4); + } + else + { + test(rgn.Count()==3); + test(subRgn.Count()==4); + test(rgn.BoundingRect()==subRgn.BoundingRect()); + rgn2.Clear(); + rgn2.AddRect(xrect); + rgn.SubRegion(rgn2); + test(rgn.Count()==4); + rgn2.Copy(rgn); + subRgn.Clear(); + rgn.SubRect(rgn.BoundingRect(),&subRgn); + test(rgn.Count()==0); + rgn2.SubRegion(subRgn,&rgn); + test(rgn2.Count()==0); + subRgn.SubRegion(rgn); + test(subRgn.Count()==0); + } + } + rgn.Close(); + rgn2.Close(); + subRgn.Close(); + } + +void TestRRegion::TestTidy() + { + RRegion rgn; + TInt loop; + TRect const rlist[8]={ // 8 Rectangles that form a square with the centre rectangle missing + TRect(10,10,20,20), + TRect(20,10,30,20), + TRect(30,10,40,20), + + TRect(10,20,20,30), + TRect(30,20,40,30), + + TRect(10,30,20,40), + TRect(20,30,30,40), + TRect(30,30,40,40)}; + TRect const rect1(rlist[0].iTl.iX,rlist[0].iTl.iY,rlist[2].iBr.iX,rlist[2].iBr.iY); + TRect const rect2(rlist[0].iTl.iX,rlist[0].iTl.iY,rlist[7].iBr.iX,rlist[7].iBr.iY); + +// Add 3 adjoining rectangles and tidy them + for(loop=0;loop<3;loop++) + rgn.AddRect(rlist[loop]); + test(rgn.Count()==3); + rgn.Tidy(); + test(rgn.Count()==1); + test(rgn[0]==rect1); +// Same again but add the adjoining rectangles in reverse order + rgn.Clear(); + for(loop=2;loop>=0;loop--) + rgn.AddRect(rlist[loop]); + test(rgn.Count()==3); + rgn.Tidy(); + test(rgn.Count()==1); + test(rgn[0]==rect1); +// Now add 8 rectangles that should tidy down to 4 + rgn.Clear(); + for(loop=0;loop<8;loop++) + rgn.AddRect(rlist[loop]); + test(rgn.Count()==8); + rgn.Tidy(); + test(rgn.Count()==4); + test(rgn.BoundingRect()==rect2); +// ...and in reverse + rgn.Clear(); + for(loop=7;loop>=0;loop--) + rgn.AddRect(rlist[loop]); + test(rgn.Count()==8); + rgn.Tidy(); + test(rgn.Count()==4); + test(rgn.BoundingRect()==rect2); + rgn.Close(); + } + +void TestRRegion::TestSpare() + { + TInt gran[5]={1,2,4,20,100}; + RRegion rgn[5]={gran[0],gran[1],gran[2],gran[3],gran[4]}; + TUint index; + TInt loop,spare; + TRect rect1(0,0,1,1); + TRect rect; + + for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++) + { + test(rgn[index].CheckSpare()==0); + rgn[index].AddRect(rect1); + test(rgn[index].CheckSpare()==(gran[index]-1)); + rgn[index].Tidy(); + test(rgn[index].CheckSpare()==0); + rgn[index].Clear(); + test(rgn[index].CheckSpare()==0); + } + for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++) + { + spare=0; + for(loop=0;loop<30;loop++) + { + rect.iTl.iX=rect.iTl.iY=loop; + rect.iBr.iX=rect.iBr.iY=loop+1; + rgn[index].AddRect(rect); + if (spare==0) + spare=gran[index]; + spare--; + test(rgn[index].CheckSpare()==spare); + } + do + { + loop--; + rect.iTl.iX=rect.iTl.iY=loop; + rect.iBr.iX=rect.iBr.iY=loop+1; + rgn[index].SubRect(rect); + spare++; + test(rgn[index].CheckSpare()==spare); + } while(loop>0); + } + for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++) + rgn[index].Close(); + } + +void TestRRegion::TestOffset() + { + RRegion rgn; + const TRect* rlist; + TRect r; + TUint index; + + for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++) + { + rgn.Clear(); + rgn.AddRect(rect[index]); + r=rect[index]; + r.Move(1,1); + rgn.Offset(1,1); + if (rect[index].IsEmpty()) + test(rgn.Count()==0); + else + { + test(rgn.Count()==1); + rlist=rgn.RectangleList(); + test(rlist[0]==r); + } + } + rgn.Close(); + } + +void TestRRegion::TestIntersection() + { + RRegion rgn1,rgn2,tmp_rgn; + const TRect* rlist; + TUint index; + + rgn1.AddRect(xrect); + rgn2.Copy(rgn1); + if (!rgn1.IsEmpty()) + { + for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++) + tmp_rgn.AddRect(rect[index]); + rgn2.Intersection(rgn1,tmp_rgn); + test(rgn2.Count()==4); + rlist=rgn2.RectangleList(); + for(index=0;index<(TUint)rgn2.Count();index++) + { + test(rlist[index].iTl.iX==xrect.iTl.iX || rlist[index].iTl.iX==rect[0].iTl.iX); + test(rlist[index].iTl.iY==xrect.iTl.iY || rlist[index].iTl.iY==rect[0].iTl.iY); + test(rlist[index].iBr.iX==xrect.iBr.iX || rlist[index].iBr.iX==(-rect[0].iTl.iX)); + test(rlist[index].iBr.iY==xrect.iBr.iY || rlist[index].iBr.iY==(-rect[0].iTl.iY)); + } + rgn1.Intersect(tmp_rgn); + test(rgn1.Count()==4); + rlist=rgn1.RectangleList(); + for(index=0;index<(TUint)rgn1.Count();index++) + { + test(rlist[index].iTl.iX==xrect.iTl.iX || rlist[index].iTl.iX==rect[0].iTl.iX); + test(rlist[index].iTl.iY==xrect.iTl.iY || rlist[index].iTl.iY==rect[0].iTl.iY); + test(rlist[index].iBr.iX==xrect.iBr.iX || rlist[index].iBr.iX==(-rect[0].iTl.iX)); + test(rlist[index].iBr.iY==xrect.iBr.iY || rlist[index].iBr.iY==(-rect[0].iTl.iY)); + } + } + rgn1.Close(); + rgn2.Close(); + tmp_rgn.Close(); + } + +void TestRRegion::TestUnion() + { + RRegion rgn1,rgn2,tmp_rgn; + TRect bounds; + TUint index; + + rgn1.AddRect(xrect); + if (!rgn1.IsEmpty()) + { + for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++) + tmp_rgn.AddRect(rect[index]); + test(tmp_rgn.Count()==4); + rgn1.Union(tmp_rgn); + test(rgn1.Count()==7); + rgn2.Copy(rgn1); + rgn2.Offset(3,5); + bounds=rgn1.BoundingRect(); + rgn1.Union(rgn2); + bounds.Resize(3,5); + test(rgn1.BoundingRect()==bounds); + } + rgn1.Close(); + rgn2.Close(); + tmp_rgn.Close(); + } + +void TestRRegion::TestClipRect() + { + RRegion rgn1(xrect); + if (!rgn1.IsEmpty()) + { + TUint index; + for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++) + rgn1.AddRect(rect[index]); + TRect clip=rgn1.BoundingRect(); + rgn1.ClipRect(clip); + test(clip==rgn1.BoundingRect()); + clip.iTl.iX>>=1; + clip.iTl.iY>>=1; + clip.iBr.iX>>=1; + clip.iBr.iY>>=1; + rgn1.ClipRect(clip); + test(clip==rgn1.BoundingRect()); + clip.iTl.iX=clip.iBr.iX; + rgn1.ClipRect(clip); + test(rgn1.Count()==0); + } + rgn1.Close(); + } + +void TestRRegion::TestContains() + { + RRegion rgn; + rgn.AddRect(TRect(10,10,20,20)); + rgn.AddRect(TRect(10,20,50,30)); + test(rgn.Contains(TPoint(10,10))); + test(rgn.Contains(TPoint(49,29))); + test(rgn.Contains(TPoint(15,15))); + test(rgn.Contains(TPoint(31,22))); + test(rgn.Contains(TPoint(50,30))==EFalse); + test(rgn.Contains(TPoint(-100,-30))==EFalse); + test(rgn.Contains(TPoint(200,20))==EFalse); + test(rgn.Contains(TPoint(15,30000))==EFalse); + rgn.Close(); + TRegionFix<1> rgn2(TRect(20,20,25,25)); + test(rgn2.Contains(TPoint(20,20))); + test(rgn2.Contains(TPoint(22,23))); + test(rgn2.Contains(TPoint(0,0))==EFalse); + test(rgn2.Contains(TPoint(25,25))==EFalse); + test(rgn2.Contains(TPoint(30,30))==EFalse); + } + +void TestRRegion::TestIntersects() + { + RRegion rgn; + rgn.AddRect(TRect(10,10,20,20)); + rgn.AddRect(TRect(10,20,50,30)); + test(rgn.Intersects(TRect(10,10,20,20))); + test(rgn.Intersects(TRect(5,5,15,15))); + test(rgn.Intersects(TRect(10,20,50,30))); + test(rgn.Intersects(TRect(10,10,20,20))); + test(rgn.Intersects(TRect(40,10,60,30))); + test(rgn.Intersects(TRect(0,0,10,10))==EFalse); + test(rgn.Intersects(TRect(30,10,40,20))==EFalse); + rgn.Close(); + TRegionFix<1> rgn2(TRect(20,20,30,30)); + test(rgn2.Intersects(TRect(20,20,30,30))); + test(rgn2.Intersects(TRect(15,25,25,35))); + test(rgn2.Intersects(TRect(25,15,35,25))); + test(rgn2.Intersects(TRect(15,15,25,25))); + test(rgn2.Intersects(TRect(25,25,35,35))); + test(rgn2.Intersects(TRect(10,20,20,30))==EFalse); + test(rgn2.Intersects(TRect(30,20,40,30))==EFalse); + test(rgn2.Intersects(TRect(20,10,30,20))==EFalse); + test(rgn2.Intersects(TRect(20,30,30,40))==EFalse); + // empty rectangles + test(rgn2.Intersects(TRect(30,30,20,20))==EFalse); + TRegionFix<1> rgn3(TRect(30,30,20,20)); + test(rgn3.Intersects(TRect(30,30,20,20))==EFalse); + test(rgn3.Intersects(TRect(20,20,30,30))==EFalse); + } + +void TestRRegion::TestErrors() + { + RRegion rgnErr,rgnErr2; + RRegion rgn; + TRect rect(1,2,3,4),rect2; + const TRect* rList; + TPoint pnt; + + rgnErr.ForceError(); + rgn.AddRect(rect); + rgnErr.Copy(rgn); + test(rgnErr.CheckError()==EFalse); + test(rgnErr.Count()==1); + + rgnErr.ForceError(); + test(rgnErr.CheckError()==TRUE); + rgnErr.AddRect(rect); + rgnErr.AddRect(TRect(2,3,4,5)); + test(rgnErr.CheckError()==TRUE); + rgnErr.SubRect(rect); + test(rgnErr.CheckError()==TRUE); + rgn.Copy(rgnErr); + test(rgn.CheckError()==TRUE); + rgnErr.Offset(1,2); + rgnErr.Offset(pnt); + test(rgnErr.CheckError()==TRUE); + + rgn.Union(rgnErr); + test(rgn.CheckError()==TRUE); + rgnErr.AddRect(rect); + test(rgnErr.CheckError()==TRUE); + rgn.Clear(); + rgn.AddRect(rect); + rgnErr.Union(rgn); + test(rgnErr.CheckError()==TRUE); + rgn.Clear(); + test(rgn.CheckError()==FALSE); + + rgnErr2.Clear(); + rgnErr2.AddRect(rect); + rgn.Intersection(rgnErr,rgnErr2); + test(rgn.CheckError()==TRUE); + rgn.Clear(); + rgn.Intersection(rgnErr2,rgnErr); + test(rgn.CheckError()==TRUE); + rgnErr2.ForceError(); + rgn.Clear(); + rgn.Intersection(rgnErr2,rgnErr); + test(rgn.CheckError()==TRUE); + rgn.Clear(); + rgn.AddRect(rect); + rgn.Intersect(rgnErr); + test(rgn.CheckError()==TRUE); + rgn.Clear(); + rgn.AddRect(rect); + rgnErr.Intersect(rgn); + test(rgnErr.CheckError()==TRUE); + test(rgn.CheckError()==FALSE); + + test(rgnErr.IsEmpty()==FALSE); + + rgn.Clear(); + rgn.AddRect(rect); + rgn.SubRegion(rgnErr); + test(rgn.CheckError()==TRUE); + test(rgnErr.CheckError()==TRUE); + + rgnErr.ClipRect(rect); + test(rgnErr.CheckError()==TRUE); + rgnErr.Tidy(); + test(rgnErr.CheckError()==TRUE); + rect2=rgnErr.BoundingRect(); + test(rect2.iTl.iX==0 && rect2.iBr.iY==0); + + test(rgnErr.Count()==0); + rList=rgnErr.RectangleList(); + rgn.Close(); + rgnErr.Close(); + rgnErr2.Close(); + } + +void TestRRegion::doTestSort(RRegion &rgn) + { + TInt loop,loop2; + TRect const rlist[8]={ // 8 Rectangles that form a square with the centre rectangle missing + TRect(20,30,30,40), + TRect(20,10,30,20), + TRect(10,20,20,30), + TRect(30,20,40,30), + TRect(10,30,20,40), + TRect(30,30,40,40), + TRect(10,10,20,20), + TRect(30,10,40,20)}; + TRect sorted[8]; + TRect const* plist; + TRect tmp; + +// Work out wot the sorted list should be + for(loop=0;loop<8;loop++) + sorted[loop]=rlist[loop]; + for(loop=0;loop<8;loop++) + { +restart: + for(loop2=loop+1;loop2<8;loop2++) + { + if (sorted[loop2].iTl.iY>sorted[loop].iTl.iY) + continue; + if (sorted[loop2].iTl.iY==sorted[loop].iTl.iY && sorted[loop2].iTl.iX>sorted[loop].iTl.iX) + continue; + tmp=sorted[loop]; + sorted[loop]=sorted[loop2]; + sorted[loop2]=tmp; + goto restart; + } + } + for(loop=0;loop<8;loop++) + rgn.AddRect(rlist[loop]); + rgn.Sort(); + plist=rgn.RectangleList(); + for(loop=0;loop<8;loop++) + test(plist[loop]==sorted[loop]); + rgn.Close(); + } + +void TestRRegion::TestSort() + { + RRegion rgn; + doTestSort(rgn); + RRegionBuf<1> rgnBuf; + doTestSort(rgnBuf); + } + +void TestRRegion::doTestRegionBuf(RRegion &aRegion) + { + for(TInt index=0;index<8;index++) + { + aRegion.AddRect(TRect(index*2,index*2,index*2+2,index*2+2)); + test(aRegion.Count()==(index+1)); + const TRect *pr=aRegion.RectangleList(); + for(TInt index2=0;index2<=index;index2++) + test(pr[index2]==TRect(index2*2,index2*2,index2*2+2,index2*2+2)); + } + aRegion.Close(); + } + +void TestRRegion::TestRegionBuf() + { + RRegionBuf<1> rgn(TRect(1,2,3,4)); + test(rgn[0]==TRect(1,2,3,4)); + RRegionBuf<1> rgn1; + doTestRegionBuf(rgn1); + RRegionBuf<2> rgn2; + doTestRegionBuf(rgn2); + RRegionBuf<5> rgn5; + doTestRegionBuf(rgn5); + RRegionBuf<10> rgn10; + doTestRegionBuf(rgn10); + } + +// Top level test code +LOCAL_C void test_region(TestRRegion t) + { + test.Start(_L("Setting values")); + t.TestSet(); + test.Next(_L("TRegionFix")); + t.TestRegionFix(); + test.Next(_L("AddRect")); + t.TestAddRect(); + test.Next(_L("SubRect")); + t.TestSubRect(); + test.Next(_L("SubRegion")); + t.TestSubRegion(); + test.Next(_L("Tidy")); + t.TestTidy(); + test.Next(_L("Spare")); + t.TestSpare(); + test.Next(_L("Offset")); + t.TestOffset(); + test.Next(_L("Intersection")); + t.TestIntersection(); + test.Next(_L("Union")); + t.TestUnion(); + test.Next(_L("Clip rect")); + t.TestClipRect(); + test.Next(_L("Contains")); + t.TestContains(); + test.Next(_L("Intersects")); + t.TestIntersects(); + test.Next(_L("Errors")); + t.TestErrors(); + test.Next(_L("Sort")); + t.TestSort(); + test.Next(_L("RegionBuf")); + t.TestRegionBuf(); + test.End(); + } + +GLDEF_C TInt E32Main() +// +// Main +// + { + + test.Title(); + __UHEAP_MARK; + TestRRegion t1(10,20,30,40); + TestRRegion t2(0,0,1,1); + TestRRegion t3(1,1,1,1); + TestRRegion t4(1000000,2000000,3000000,4000000); + + test.Start(_L("class RRegion 1")); + test_region(t1); + test.Next(_L("class RRegion 2")); + test_region(t2); + test.Next(_L("class RRegion 3")); + test_region(t3); + test.Next(_L("class RRegion 4")); + test_region(t4); + test.End(); + __UHEAP_MARKEND; + return(0); + } + + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_sque.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_sque.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1081 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_sque.cpp +// Overview: +// Test single linked list functionality. +// API Information: +// TSglQueLink, TSglQueBase. +// Details: +// - Create specified number of TSglQueLink objects, then delete them. +// - Create TSglQueBase object with specified offset and without an offset, +// add and remove links to the list, check that the list is empty. +// - Create TSglQueBase object with and without an offset, verify offset, head +// and last member values are correct. +// - Create TSglQueBase object, insert links using DoAddFirst and DoAddLast and +// remove links using DoRemove, check the results are as expected. +// - Create TSglQueBase object, insert links using DoAddFirst and DoAddLast and +// verify IsEmpty return the correct value. Set and verify the offset. +// - Create TSglQue object, insert TSglQueLink link at front and end of list, test +// whether the links are inserted at specified location, remove some links. +// - Create TSglQue object, insert links using DoAddFirst and DoAddLast and +// remove links using DoRemove, check the results are as expected. +// - Create TSglQue object, insert links using DoAddFirst and DoAddLast and +// verify IsEmpty return the correct value. Set and verify the offset. +// - Create TSglQue object with and without an offset, verify offset, head +// and last member values are correct. +// - Create TSglQue object, insert links using AddFirst and AddLast and +// verify results are as expected. +// - Create TSglQue object, insert links using AddFirst and AddLast and +// verify results using IsFirst and IsLast are as expected. +// - Create TSglQue object, insert links using AddFirst and AddLast and +// verify results using First and Last are as expected. +// - Create TSglQue object, insert links using AddLast and delete using Remove, +// verify results are as expected. +// - Create TSglQueIterBase object, with and without an offset, call the +// DoCurrent, DoPostInc and SetToFirst methods. +// - Create TSglQueIterBase object, with and without an offset, and TSglQue +// with different offsets, verify results are as expected. +// - Create TSglQueIterBase object, , with and without an offset, use the +// DoCurrent and DoPostInc methods and verify the results are as expected. +// - Create TSglQueIterBase object, , with and without an offset, use the +// DoPostInc and SetToFirst methods and verify the results are as expected. +// - Create TSglQueIter object, with and without an offset, iterate using +// the ++ operator and delete the object. +// - Create TSglQueIter object, with and without an offset, and TSglQue +// object with different offsets, verify results are as expected. +// - Create TSglQueIter object, with and without an offset, use the +// DoCurrent and DoPostInc methods and verify the results are as expected. +// - Create TSglQueIter object, with and without an offset, use the +// DoPostInc and SetToFirst methods and verify the results are as expected. +// - Create TSglQueIter object, with and without an offset, iterate using +// the ++ operator, use the conversion operator, verify the results are +// as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include + +LOCAL_D RTest test(_L("T_SQUE")); + +#define SIZE 10 +#define MAX_OFFSET 10 + +struct Item + { + TSglQueLink iLink; + TInt iSpace[MAX_OFFSET]; // Reserve some space + }; + +struct ItemWithOffset + { + TInt iSpace[MAX_OFFSET]; + TSglQueLink iLink; + }; + +template +class TestTQueLink + { +public: + void TestQueLink(); // Calls Test: 1 + void Test1(); +protected: + void CreateObjects(TInt aBaseLink); + void DestroyObjects(); +private: + T* iLink[SIZE]; + }; + +template +void TestTQueLink::CreateObjects(TInt aBaseLink) + { + TInt i; + + for (i=0;i=0&&aBaseLinkiNext=iLink[aBaseLink]; + } + +template +void TestTQueLink::DestroyObjects() + { + TInt i; + + for (i=0;i +void TestTQueLink::TestQueLink() + { + test.Start(_L("Test Enque")); + Test1(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueLink::Test1() + { + test.Start(_L("Create objects")); + CreateObjects(1); + test.Next(_L("Destroy objects")); + DestroyObjects(); + test.End(); + } + +class VSglQueBase : public TSglQueBase + { +public: + inline VSglQueBase(); + inline VSglQueBase(TInt anOffset); + inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} + inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);} + inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);} +public: + TSglQueLink** sHead; + TSglQueLink** sLast; + TInt* sOffset; +private: + void SetMembers(); + }; + +template +class VSglQue : public TSglQue + { +public: + inline VSglQue(); + inline VSglQue(TInt anOffset); + inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} + inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);} + inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);} +public: + TSglQueLink** sHead; + TSglQueLink** sLast; + TInt* sOffset; +private: + void SetMembers(); + }; + +inline VSglQueBase::VSglQueBase() + { + SetMembers(); + } + +inline VSglQueBase::VSglQueBase(TInt anOffset) + :TSglQueBase(anOffset) + { + SetMembers(); + } + +void VSglQueBase::SetMembers() + { + sHead=&iHead; + sLast=&iLast; + sOffset=&iOffset; + } + +template +VSglQue::VSglQue() + { + SetMembers(); + } + +template +VSglQue::VSglQue(TInt anOffset) + :TSglQue(anOffset) + { + SetMembers(); + } + +template +void VSglQue::SetMembers() + { + sHead=&this->iHead; + sLast=&this->iLast; + sOffset=&this->iOffset; + } + +template +class TestTQue + { +public: + void TestQueBase(); + void TestSglQue(); + void Test1(); // All functions //TSglQueBase functions + void Test2(); // Constructors + void Test3(); // DoAdd's + void Test4(); // Public functions + void Test5(); // All functions //TSglQue + //void Test6(); // Constructors + void Test7(); // Add's + void Test8(); // Is's + void Test9(); // Get's + void Test10(); // Add's +private: + void CallTest3_4(); + }; + +template +void TestTQue::CallTest3_4() + { + test.Next(_L("Test DoAdd's")); + Test3(); + test.Next(_L("Test public functions")); + Test4(); + } + +template +void TestTQue::TestQueBase() + { + test.Start(_L("Test all member functions (simply)")); + Test1(); + test.Next(_L("Test Constructors")); + Test2(); + CallTest3_4(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::TestSglQue() + { + test.Start(_L("Test all member functions (simply)")); + Test5(); + test.Next(_L("Test Super Class functions")); + CallTest3_4(); + test.Next(_L("Test Constructors")); + Test2(); + test.Next(_L("Test Add's")); + Test7(); + test.Next(_L("Test Is's")); + Test8(); + test.Next(_L("Test Get's")); + Test9(); + test.Next(_L("Test Remove")); + Test10(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test1() + { + T* que; + TSglQueLink link1,link2; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VSglQueBase(offset); + delete que; + que=new VSglQueBase; + //delete que; + test.Next(_L("DoAdd's")); + que->sDoAddFirst(&link1); + que->sDoAddLast(&link2); + que->sDoRemove(&link1); + que->sDoRemove(&link2); + test.Next(_L("Public")); + que->IsEmpty(); + que->SetOffset(offset); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test2() + { + T* que; + TInt offset; + + test.Start(_L("Default constructor")); + que=new T(); + test(*(que->sOffset)==0); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + delete que; + test.Next(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new T(offset); + test(*(que->sOffset)==offset); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test3() + { + T* que; + + { + TSglQueLink link1,link2,link3,link4; + test.Start(_L("AddFirst")); + que=new T(); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + que->sDoAddFirst(&link1); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + que->sDoAddFirst(&link2); + test(*(que->sHead)==&link2); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + test(link2.iNext==&link1); + que->sDoAddFirst(&link3); + test(*(que->sHead)==&link3); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + test(link2.iNext==&link1); + test(link3.iNext==&link2); + que->sDoAddFirst(&link4); + test(*(que->sHead)==&link4); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + test(link2.iNext==&link1); + test(link3.iNext==&link2); + test(link4.iNext==&link3); + delete que; + } + TSglQueLink link1,link2,link3,link4; + test.Next(_L("AddLast")); + que=new T(); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + que->sDoAddLast(&link1); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + que->sDoAddLast(&link2); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link2); + test(link1.iNext==&link2); + test(link2.iNext==NULL); + que->sDoAddLast(&link3); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link3); + test(link1.iNext==&link2); + test(link2.iNext==&link3); + test(link3.iNext==NULL); + que->sDoAddLast(&link4); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link4); + test(link1.iNext==&link2); + test(link2.iNext==&link3); + test(link3.iNext==&link4); + test(link4.iNext==NULL); + test.Next(_L("Remove")); + que->sDoRemove(&link3); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link4); + test(link1.iNext==&link2); + test(link2.iNext==&link4); + test(link4.iNext==NULL); + que->sDoRemove(&link4); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link2); + test(link1.iNext==&link2); + test(link2.iNext==NULL); + que->sDoRemove(&link1); + test(*(que->sHead)==&link2); + test(*(que->sLast)==&link2); + test(link2.iNext==NULL); + que->sDoRemove(&link2); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + delete que; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test4() + { + T* que; + TInt offset; + + test.Start(_L("IsEmpty")); + que=new T(); + test(que->IsEmpty()==TRUE); + TSglQueLink link1,link2; + que->sDoAddFirst(&link1); + test(que->IsEmpty()==FALSE); + que->sDoRemove(&link1); + test(que->IsEmpty()==TRUE); + que->sDoAddLast(&link2); + test(que->IsEmpty()==FALSE); + que->sDoAddFirst(&link1); + test(que->IsEmpty()==FALSE); + que->sDoRemove(&link2); + test(que->IsEmpty()==FALSE); + que->sDoRemove(&link1); + test(que->IsEmpty()==TRUE); + test.Next(_L("SetOffset")); + for (offset=0;offset<40;offset+=4) + { + que->SetOffset(offset); + test(*(que->sOffset)==offset); + } + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test5() + { + T* que; + TSglQueLink link1,link2; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VSglQue(offset); + delete que; + que=new VSglQue; + test.Next(_L("Add's")); + que->AddFirst(link1); + que->AddLast(link2); + test.Next(_L("Is's")); + que->IsFirst(&link1); + que->IsLast(&link1); + test.Next(_L("Get's")); + que->First(); + que->Last(); + test.Next(_L("Remove")); + que->Remove(link1); + que->Remove(link2); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +/*template +void TestTQue::Test6() + { + T* que; + TInt offset; + + test.Start(_L("Default constructor")); + que=new VSglQue(); + test(*(que->sFirstDelta)==NULL); + delete que; + test.Next(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VDeltaQueBase(offset); + test(*(que->sOffset)==offset); + test(*(que->sFirstDelta)==NULL); + delete que; + } + test.Next(_L("Finished")); + test.End(); + }*/ + +template +void TestTQue::Test7() + { + T* que; + + { + TSglQueLink link1,link2,link3,link4; + test.Start(_L("AddFirst")); + que=new T(); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + que->AddFirst(link1); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + que->AddFirst(link2); + test(*(que->sHead)==&link2); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + test(link2.iNext==&link1); + que->AddFirst(link3); + test(*(que->sHead)==&link3); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + test(link2.iNext==&link1); + test(link3.iNext==&link2); + que->AddFirst(link4); + test(*(que->sHead)==&link4); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + test(link2.iNext==&link1); + test(link3.iNext==&link2); + test(link4.iNext==&link3); + delete que; + } + TSglQueLink link1,link2,link3,link4; + test.Next(_L("AddLast")); + que=new T(); + test.Next(_L("AddLast")); + que=new T(); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + que->AddLast(link1); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link1); + test(link1.iNext==NULL); + que->AddLast(link2); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link2); + test(link1.iNext==&link2); + test(link2.iNext==NULL); + que->AddLast(link3); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link3); + test(link1.iNext==&link2); + test(link2.iNext==&link3); + test(link3.iNext==NULL); + que->AddLast(link4); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link4); + test(link1.iNext==&link2); + test(link2.iNext==&link3); + test(link3.iNext==&link4); + test(link4.iNext==NULL); + delete que; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::Test8() + { + T* que; + + { + TSglQueLink link1,link2,link3,link4; + test.Start(_L("IsFirst")); + que=new T(); + test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE); + test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE); + test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE); + que->AddFirst(link1); + test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE); + test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE); + test(que->IsFirst((TSglQueLink*) *(que->sLast))==TRUE); + test(que->IsFirst(&link1)==TRUE); + que->AddFirst(link2); + test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE); + test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE); + test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE); + test(que->IsFirst(&link1)==FALSE); + test(que->IsFirst(&link2)==TRUE); + que->AddFirst(link3); + test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE); + test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE); + test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE); + test(que->IsFirst(&link1)==FALSE); + test(que->IsFirst(&link2)==FALSE); + test(que->IsFirst(&link3)==TRUE); + que->AddFirst(link4); + test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE); + test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE); + test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE); + test(que->IsFirst(&link1)==FALSE); + test(que->IsFirst(&link2)==FALSE); + test(que->IsFirst(&link3)==FALSE); + test(que->IsFirst(&link4)==TRUE); + delete que; + } + TSglQueLink link1,link2,link3,link4; + test.Next(_L("IsLast")); + que=new T(); + test(que->IsLast((TSglQueLink*) que->sHead)==TRUE); + test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE); + que->AddLast(link1); + test(que->IsLast((TSglQueLink*) que->sHead)==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sHead))==TRUE); + test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE); + test(que->IsLast(&link1)==TRUE); + que->AddLast(link2); + test(que->IsLast((TSglQueLink*) que->sHead)==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE); + test(que->IsLast(&link1)==FALSE); + test(que->IsLast(&link2)==TRUE); + que->AddLast(link3); + test(que->IsLast((TSglQueLink*) que->sHead)==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE); + test(que->IsLast(&link1)==FALSE); + test(que->IsLast(&link2)==FALSE); + test(que->IsLast(&link3)==TRUE); + que->AddLast(link4); + test(que->IsLast((TSglQueLink*) que->sHead)==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE); + test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE); + test(que->IsLast(&link1)==FALSE); + test(que->IsLast(&link2)==FALSE); + test(que->IsLast(&link3)==FALSE); + test(que->IsLast(&link4)==TRUE); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test9() + { + T* que; + + { + TSglQueLink link1,link2,link3,link4; + test.Start(_L("First")); + que=new T(); + test(que->First()==NULL); + que->AddFirst(link1); + test(que->First()==&link1); + que->AddFirst(link2); + test(que->First()==&link2); + que->AddFirst(link3); + test(que->First()==&link3); + que->AddFirst(link4); + test(que->First()==&link4); + delete que; + } + TSglQueLink link1,link2,link3,link4; + test.Next(_L("Last")); + que=new T(); + test(que->Last()==(TSglQueLink*) que->sHead); + que->AddLast(link1); + test(que->Last()==&link1); + que->AddLast(link2); + test(que->Last()==&link2); + que->AddLast(link3); + test(que->Last()==&link3); + que->AddLast(link4); + test(que->Last()==&link4); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test10() + { + T* que; + TSglQueLink link1,link2,link3,link4; + + que=new T(); + que->AddLast(link1); + que->AddLast(link2); + que->AddLast(link3); + que->AddLast(link4); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link4); + test(link1.iNext==&link2); + test(link2.iNext==&link3); + test(link3.iNext==&link4); + test(link4.iNext==NULL); + que->Remove(link3); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link4); + test(link1.iNext==&link2); + test(link2.iNext==&link4); + test(link4.iNext==NULL); + que->Remove(link4); + test(*(que->sHead)==&link1); + test(*(que->sLast)==&link2); + test(link1.iNext==&link2); + test(link2.iNext==NULL); + que->Remove(link1); + test(*(que->sHead)==&link2); + test(*(que->sLast)==&link2); + test(link2.iNext==NULL); + que->Remove(link2); + test(*(que->sHead)==NULL); + test(*(que->sLast)==(TSglQueLink*) que->sHead); + delete que; + } + +class VSglQueIterBase : public TSglQueIterBase + { +public: + VSglQueIterBase(TSglQueBase& aQue); + inline TAny* sDoPostInc() {return DoPostInc();} + inline TAny* sDoCurrent() {return DoCurrent();} +public: + TInt* sOffset; + TSglQueLink** sHead; + TSglQueLink** sNext; +private: + void SetMember(); + }; + +template +class VSglQueIter : public TSglQueIter + { +public: + VSglQueIter(TSglQue& aQue); + inline TAny* sDoPostInc() {return this->DoPostInc();} + inline TAny* sDoCurrent() {return this->DoCurrent();} +public: + TInt* sOffset; + TSglQueLink** sHead; + TSglQueLink** sNext; +private: + void SetMember(); + }; + +VSglQueIterBase::VSglQueIterBase(TSglQueBase& aQue) + :TSglQueIterBase(aQue) + { + SetMember(); + } + +void VSglQueIterBase::SetMember() + { + sOffset=&iOffset; + sHead=&iHead; + sNext=&iNext; + } + +template +VSglQueIter::VSglQueIter(TSglQue& aQue) + :TSglQueIter(aQue) + { + SetMember(); + } + +template +void VSglQueIter::SetMember() + { + sOffset=&this->iOffset; + sHead=&this->iHead; + sNext=&this->iNext; + } + +template +class TestTQueIter + { +public: + void TestIterBase(); + void TestQueIter(); + void Test1(); //All functions //TSglQueIterBase + void Test2(); //Constructor + void Test3(); //Do's + void Test4(); //Set + void Test5(); //All functions //TDblQueIter + //void Test6(); //Constructors //Redundant + void Test7(); //Iterators +private: + void CallTest2_4(); + }; + +template +void TestTQueIter::CallTest2_4() + { + test.Next(_L("Constructors")); + Test2(); + test.Next(_L("Do's")); + Test3(); + test.Next(_L("Sets")); + Test4(); + } + +template +void TestTQueIter::TestIterBase() + { + test.Start(_L("All Methods")); + Test1(); + CallTest2_4(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::TestQueIter() + { + test.Start(_L("All Methods")); + Test5(); + CallTest2_4(); + test.Next(_L("Iterators")); + Test7(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test1() + { + T item1,item2; + TSglQue que(_FOFF(T,iLink)); + Iter* iter; + + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("Constructor")); + iter=new Iter(que); + test.Next(_L("Do's")); + iter->sDoCurrent(); + iter->sDoPostInc(); + test.Next(_L("Sets")); + iter->SetToFirst(); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test2() + { + TSglQue* que; + TInt offset; + Iter* iter; + TSglQueLink* head; + + for (offset=0;offset<40;offset+=4) + { + que=new TSglQue(offset); + iter=new Iter(*que); + test(*(iter->sHead)==PtrAdd((TSglQueLink*) que->Last(),offset)); + head=*(iter->sHead); + test(que->IsFirst((T*) PtrSub(*(iter->sNext),offset))); //Need to pass a pointer to a item + test(*(iter->sOffset)==offset); + delete iter; + T item; + que->AddFirst(item); + iter=new Iter(*que); + test(*(iter->sHead)==head); + test(que->IsFirst((T*) PtrSub(*(iter->sNext),offset))); + test(*(iter->sOffset)==offset); + delete iter; + delete que; + } + } + +template +void TestTQueIter::Test3() + { + T item1,item2,item3,item4; + TSglQue que(_FOFF(T,iLink)); + Iter* iter; + + que.AddFirst(item4); + que.AddFirst(item3); + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("DoPostInc")); + iter=new Iter(que); + test(&item1==iter->sDoPostInc()); + test(&item2.iLink==*(iter->sNext)); + test(&item2==iter->sDoPostInc()); + test(&item3.iLink==*(iter->sNext)); + test(&item3==iter->sDoPostInc()); + test(&item4.iLink==*(iter->sNext)); + test(&item4==iter->sDoPostInc()); + test((Item*) *(iter->sNext)==NULL); + test(iter->sDoPostInc()==NULL); + delete iter; + test.Next(_L("DoCurrent")); + iter=new Iter(que); + test(&item1==iter->sDoCurrent()); + iter->sDoPostInc(); + test(&item2==iter->sDoCurrent()); + iter->sDoPostInc(); + test(&item3==iter->sDoCurrent()); + iter->sDoPostInc(); + test(&item4==iter->sDoCurrent()); + iter->sDoPostInc(); + test(iter->sDoCurrent()==NULL); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test4() + { + T item1,item2,item3,item4; + TSglQue que(_FOFF(T,iLink)); + Iter* iter; + TInt i,j; + + que.AddFirst(item4); + que.AddFirst(item3); + que.AddFirst(item2); + que.AddFirst(item1); + iter=new Iter(que); + for(i=0;i<5;i++) + { + for(j=0;jsDoPostInc(); + iter->SetToFirst(); + test(*(iter->sNext)==&item1.iLink); + } + delete iter; + } + +template +void TestTQueIter::Test5() + { + T item1,item2; + TSglQue que(_FOFF(T,iLink)); + Iter* iter; + T* a; + + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("Constructor")); + iter=new Iter(que); + test.Next(_L("Iterators")); + a=*iter; + (*iter)++; + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +/*template //Redundant +void TestTQueIter::Test6() + { + Item item; + TDblQue* que; + TInt offset; + T* iter; + + for (offset=0;offset<40;offset+=4) + { + que=new TDblQue(offset); + iter=new T(*que); + test(que->IsHead((Item*) *(iter->sHead))); + test(que->IsHead((Item*) *(iter->sNext))); + test(*(iter->sOffset)==offset); + delete iter; + delete que; + que=new TDblQue(offset); + que->AddFirst(item); + iter=new T(*que); + test(que->IsHead((Item*) *(iter->sHead))); + test(*(iter->sNext)==&item.iLink); + test(*(iter->sOffset)==offset); + delete iter; + delete que; + } + }*/ + +template +void TestTQueIter::Test7() + { + T item1,item2,item3,item4; + TSglQue que(_FOFF(T,iLink)); + Iter* iter; + + que.AddFirst(item4); + que.AddFirst(item3); + que.AddFirst(item2); + que.AddFirst(item1); + test.Start(_L("PostFix ++")); + iter=new Iter(que); + test(&item1==(*iter)++); + test(&item2.iLink==*(iter->sNext)); + test(&item2==(*iter)++); + test(&item3.iLink==*(iter->sNext)); + test(&item3==(*iter)++); + test(&item4.iLink==*(iter->sNext)); + test(&item4==(*iter)++); + test((Item*) *(iter->sNext)==NULL); + test((*iter)++==NULL); + delete iter; + test.Next(_L("Conversion Operator")); + iter=new Iter(que); + test(&item1==*iter); + (*iter)++; + test(&item2==*iter); + (*iter)++; + test(&item3==*iter); + (*iter)++; + test(&item4==*iter); + (*iter)++; + test(*iter==NULL); + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +#ifndef _DEBUG +#pragma warning (disable: 4710) +#endif + +GLDEF_C TInt E32Main() + { + + TestTQueLink* testSglQueLink; + TestTQue* testSglQueBase; + TestTQue >* testSglQue; + TestTQueIter* testSglQueIterBase; + TestTQueIter >* testSglQueIter; + + TestTQueIter* testSglQueIterBaseOffset; + TestTQueIter >* testSglQueIterOffset; + + test.Title(); + test.Start(_L("class TSglQueLink")); + testSglQueLink=new TestTQueLink; + testSglQueLink->TestQueLink(); + delete testSglQueLink; + + test.Next(_L("class TSglQueBase")); + testSglQueBase=new TestTQue; + testSglQueBase->TestQueBase(); + delete testSglQueBase; + + test.Next(_L("class TSlgQue")); + testSglQue=new TestTQue >; + testSglQue->TestSglQue(); + delete testSglQue; + + test.Next(_L("class TSglQueIterBase")); + testSglQueIterBase=new TestTQueIter; + testSglQueIterBase->TestIterBase(); + delete testSglQueIterBase; + + test.Next(_L("class TSglQueIter")); + testSglQueIter=new TestTQueIter >; + testSglQueIter->TestQueIter(); + delete testSglQueIter; + + test.Next(_L("class TSglQueIterBase with Offset")); + testSglQueIterBaseOffset=new TestTQueIter; + testSglQueIterBaseOffset->TestIterBase(); + delete testSglQueIterBaseOffset; + + test.Next(_L("class TSglQueIter with Offset")); + testSglQueIterOffset=new TestTQueIter >; + testSglQueIterOffset->TestQueIter(); + delete testSglQueIterOffset; + + test.Next(_L("Finished")); + test.End(); + return(KErrNone); + } +#pragma warning (default: 4710) + + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_varray.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_varray.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,341 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_varray.cpp +// Overview: +// Test variable record length array classes. +// API Information: +// CArrayVarFlat, CArrayVarSeg. +// Details: +// - Create an array of variable length text using a flat dynamic & segmented +// buffer and verify that: +// - number of elements held in the array is 0. +// - array is compressed and reset as expected. +// - the elements of the array are sorted as expected. +// - insertion of a text character into the array at specified position +// and length of the array is as expected. +// - return value is 0 when available element is searched using sequential +// search technique within the array. +// - removal of first element from the array is successful. +// - number of elements held in the array is 1 after appending a single +// element at the end of empty array. +// - insertion of a single element with specified key is successful. +// - the element is found when searched using binary search technique +// - KErrAlreadyExists is returned if an element is inserted with the same +// key already exists within the array. +// - Create an array of variable length text character implemented using a flat +// dynamic & segmented buffer. +// - append some strings onto the end of the array, check the contents and +// number of elements held in the array are as expected. +// - insert some strings and verify that the change in the content of array +// and number of elements held in the array are as expected. +// - remove a single, multiple elements from the array and verify that the +// Delete method is as expected. +// - Create an array of variable length text character contained within a flat +// dynamic & segmented buffer. +// - append some strings of specified length onto the end of the array, compress +// the array and verify that the number of elements held in the array is as specified. +// - insert a string at specified location, check the contents and reset the array. +// - append some strings at the end, insert some strings at specified position, +// compress the array and verify that content, number of strings in the array +// are as expected. +// - test that the number of elements and contents of the array are sorted as expected. +// - verify the correct position of the element and return value is zero when +// an element is found using binary, sequential search technique and nonzero +// if not present in the array. +// - insert some strings at the specified location and check that correct position +// is returned when searched using binary search technique. +// - Create an array of variable length integer contained within a flat dynamic & +// segmented buffer. +// - insert some elements with same key which is already present within the array +// and check that KErrAlreadyExists is returned. +// - Test whether the heap has been corrupted by all the tests. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include +#include +#include + +const TInt KTestGranularity=0x02; + +LOCAL_D RTest test(_L("T_VARRAY")); + +LOCAL_C void testAllMethods(CArrayVar& aVar) + { + test.Next(_L("Test all methods")); + test(aVar.Count()==0); + aVar.Compress(); + test(TRUE); + aVar.Reset(); + test(TRUE); + TKeyArrayVar kk(sizeof(TText),ECmpNormal,0); + test(TRUE); + aVar.Sort(kk); + test(TRUE); + const TText* aa=_S("a"); + aVar.InsertL(0,*aa,sizeof(TText)); + test(aVar.Length(0)==sizeof(TText)); + test(TRUE); + TInt pp; + test(aVar.Find(*aa,kk,pp)==0); + test(pp==0); + aVar.Delete(0); + aVar.AppendL(*aa,1); + test(aVar.Count()==1); + aVar.InsertIsqAllowDuplicatesL(*aa,0,kk); + test(TRUE); + test(aVar.FindIsq(*aa,kk,pp)==0); + test(pp==0); + TRAPD(r,aVar.InsertIsqL(*aa,0,kk)); + test(r==KErrAlreadyExists); + } + +LOCAL_C void test1(CArrayVar& aVar) +// + { + test.Next(_L("AppendL and InsertL chars")); + aVar.AppendL(*_S("abcd"),5*sizeof(TText)); // abcd + TBuf<0x10> des1(&aVar[0]); + test(des1==_L("abcd")); + test(aVar.Count()==1); + aVar.AppendL(*_S("wxyz"),5*sizeof(TText)); // abcd wxyz + des1=&aVar[1]; + test(des1==_L("wxyz")); + test(aVar.Count()==2); + aVar.InsertL(1,*_S("ef"),3*sizeof(TText)); // abcd ef wxyz + des1=&aVar[1]; + test(des1==_L("ef")); + test(aVar.Count()==3); + aVar.AppendL(*_S("z"),2*sizeof(TText)); // abcd ef wxyz z + des1=&aVar[3]; + test(des1==_L("z")); + aVar.InsertL(0,*_S("y"),2*sizeof(TText)); // y abcd ef wxyz z + des1=&aVar[0]; + test(des1==_L("y")); + test(aVar.Length(0)==2*sizeof(TText)); + test(aVar.Length(1)==5*sizeof(TText)); + test(aVar.Length(2)==3*sizeof(TText)); + test(aVar.Length(3)==5*sizeof(TText)); + test(aVar.Length(4)==2*sizeof(TText)); + des1=&aVar[1]; + test(des1==_L("abcd")); + test(aVar.Count()==5); +// + test.Next(_L("Delete chars")); + aVar.Delete(3,1); // y abcd ef z + des1=&aVar[2]; + test(des1==_L("ef")); + des1=&aVar[1]; + test(des1==_L("abcd")); + des1=&aVar[3]; + test(des1==_L("z")); + aVar.Delete(1,2); // y z + des1=&aVar[0]; + test(des1==_L("y")); + des1=&aVar[1]; + test(des1==_L("z")); + test(aVar.Count()==2); + } + +LOCAL_C void test2(CArrayVar& aVar) +// + { + test.Next(_L("Reset and Compress")); + TBuf<0x10> des1(_L("abcde")); + TBuf<0x10> des2(_L("fgh")); + TBuf<0x10> des3(_L("wxyz")); + aVar.AppendL(*(TText*)des1.Ptr(),des1.Size()); + aVar.AppendL(*(TText*)des2.Ptr(),des2.Size()); + aVar.Compress(); + test(aVar.Count()==2); + TPtrC des4((TText*)&aVar[0],des1.Length()); + test(des1==des4); + TPtrC des5((TText*)&aVar[1],des2.Length()); + test(des2==des5); + aVar.InsertL(1,*(TText*)des3.Ptr(),des3.Size()); + test(aVar.Count()==3); + TPtrC des6((TText*)&aVar[0],des1.Length()); + test(des1==des6); + TPtrC des7((TText*)&aVar[2],des2.Length()); + test(des2==des7); + TPtrC des8((TText*)&aVar[1],des3.Length()); + test(des3==des8); + aVar.Reset(); + + TBuf<0x10> buf1=_L("abcdef"); + TBuf<0x10> buf2=_L("wxyz"); + TBuf<0x10> buf3=_L("lmnop"); + TBuf<0x10> buf4=_L("aa"); + aVar.AppendL(*buf1.Ptr(),buf1.Size()); + aVar.InsertL(0,*buf2.Ptr(),buf2.Size()); + aVar.AppendL(*buf3.Ptr(),buf3.Size()); + aVar.InsertL(1,*buf4.Ptr(),buf4.Size()); + aVar.Compress(); + TPtrC rd1((TText*)&aVar[2],buf1.Length()); + test(buf1==rd1); + TPtrC rd2((TText*)&aVar[0],buf2.Length()); + test(buf2==rd2); + TPtrC rd3((TText*)&aVar[3],buf3.Length()); + test(buf3==rd3); + TPtrC rd4((TText*)&aVar[1],buf4.Length()); + test(buf4==rd4); + test(aVar.Count()==4); + + TKeyArrayVar kk(0,ECmpNormal,3); // Compare 3 characters + TKeyArrayVar kk1(0,ECmpNormal,2); // Compare 2 characters + test.Next(_L("Sort")); + aVar.Sort(kk); + TPtrC rd5((TText*)&aVar[1],buf1.Length()); + test(buf1==rd5); + TPtrC rd6((TText*)&aVar[3],buf2.Length()); + test(buf2==rd6); + TPtrC rd7((TText*)&aVar[2],buf3.Length()); + test(buf3==rd7); + TPtrC rd8((TText*)&aVar[0],buf4.Length()); + test(buf4==rd8); + test(aVar.Count()==4); + + test.Next(_L("Find and FindIsq")); + TBuf<0x10> buf5=_L("ffff"); + test(aVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==2); + TRAPD(r,aVar.InsertIsqL(*(TText*)buf5.Ptr(),buf5.Size(),kk)) + test(r==KErrAlreadyExists); + test(aVar.InsertIsqAllowDuplicatesL(*(TText*)buf5.Ptr(),buf5.Size(),kk)==3); + TInt aPos; + test(aVar.Find(*_S("abc"),kk,aPos)==0); // Second parameter 'aLength' is unused. + test(aPos==1); + test(aVar.Find(*_S("aa"),kk1,aPos)==0); + test(aPos==0); + test(aVar.Find(*_S("wxyz"),kk,aPos)==0); + test(aPos==5); + test(aVar.Find(*_S("fgh"),kk,aPos)!=0); // Returns !=0 if string not found. + test(aPos==6); // Not present in list, aPos set to last position + test(aVar.Find(*_S("ffff"),kk,aPos)==0); + test(aPos==2); + test(aVar.Find(*_S("lmn"),kk,aPos)==0); + test(aPos==4); + test(aVar.FindIsq(*_S("abc"),kk,aPos)==0); + test(aPos==1); + test(aVar.FindIsq(*_S("aa"),kk1,aPos)==0); + test(aPos==0); + test(aVar.FindIsq(*_S("wxyz"),kk,aPos)==0); + test(aPos==5); + test(aVar.FindIsq(*_S("fgh"),kk,aPos)!=0); // Returns result of last test + test(aPos==4); // Not present in list, aPos set to last position tested + TBuf<0x10> buf7=_L("fgh"); + test(aVar.InsertIsqL(*(TText*)buf7.Ptr(),buf7.Size(),kk)==4); + test(aVar.FindIsq(*_S("fgh"),kk,aPos)==0); // Returns result of last test + test(aPos==4); + + test(aVar.FindIsq(*_S("ffff"),kk,aPos)==0); + test(aPos==3); + test(aVar.FindIsq(*_S("lmn"),kk,aPos)==0); + test(aPos==5); + } + +LOCAL_C void test3(CArrayVar& aVar) + { + + test.Next(_L("InsertIsqL")); + TKeyArrayVar kk(0,ECmpTInt); + + TInt pos=0; + TInt mod=47; + TInt inc=23; + + TInt i=0; + FOREVER + { + TInt ret; + if (i&1) + TRAP(ret,aVar.InsertIsqL(i,sizeof(TInt),kk)) + else + { + TRAP(ret,pos=aVar.InsertIsqL(i,sizeof(TInt),kk)) + if (ret==KErrNone) + test(aVar[pos]==i); + } + if (ret==KErrAlreadyExists) + break; + i=(i+inc)%mod; + } + for(i=0;i* pVarFlat=new CArrayVarFlat(KTestGranularity); + if (pVarFlat==NULL) + test.Panic(_L("Allocating array")); + testAllMethods(*pVarFlat); + delete pVarFlat; +// + CArrayVarFlat* pVarFlatChar=new CArrayVarFlat(KTestGranularity); + test1(*pVarFlatChar); + delete pVarFlatChar; +// + CArrayVarFlat* pVarFlatArr=new CArrayVarFlat(KTestGranularity); + test2(*pVarFlatArr); + delete pVarFlatArr; +// + CArrayVarFlat* pVarFlatInt=new CArrayVarFlat(KTestGranularity); + test3(*pVarFlatInt); + delete pVarFlatInt; +// + test.Next(_L("class CArrayVarSeg")); + CArrayVarSeg* pVarSeg=new CArrayVarSeg(KTestGranularity); + if (pVarSeg==NULL) + test.Panic(_L("Allocating array")); + testAllMethods(*pVarSeg); + delete pVarSeg; +// + CArrayVarSeg* pVarSegChar=new CArrayVarSeg(KTestGranularity); + test1(*pVarSegChar); + delete pVarSegChar; +// + CArrayVarSeg* pVarSegArr=new CArrayVarSeg(KTestGranularity); + test2(*pVarSegArr); + delete pVarSegArr; +// + CArrayVarSeg* pVarSegInt=new CArrayVarSeg(KTestGranularity); + test3(*pVarSegInt); + delete pVarSegInt; +// + test.End(); + __UHEAP_MARKEND; + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_versio.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_versio.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,178 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\buffer\t_versio.cpp +// Overview: +// Test the version information class. +// API Information: +// TVersion. +// Details: +// - Test the version name for different versions as expected. +// - Compare the major, minor, build version number of current version and +// specified version and verify that error message is popped when version +// is not supported. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include + +const TInt KNumTVersions=1+3*3*3; + +class RTvTest : public RTest + { +public: + RTvTest(); + void TestName(); + void TestQVS(); + void Start(const TDesC &aHeading) {Printf(aHeading);Push();} +private: + TBool QVS(TInt i,TInt j); +private: + TVersion* iTV[KNumTVersions]; + TVersion iDefTV; // tests default constructor + }; + +LOCAL_D const TText* Names[]= + { + _S("0.00(0)"), + _S("0.00(0)"), + _S("0.00(1)"), + _S("0.00(999)"), + _S("0.01(0)"), + _S("0.01(1)"), + _S("0.01(999)"), + _S("0.99(0)"), + _S("0.99(1)"), + _S("0.99(999)"), + _S("1.00(0)"), + _S("1.00(1)"), + _S("1.00(999)"), + _S("1.01(0)"), + _S("1.01(1)"), + _S("1.01(999)"), + _S("1.99(0)"), + _S("1.99(1)"), + _S("1.99(999)"), + _S("99.00(0)"), + _S("99.00(1)"), + _S("99.00(999)"), + _S("99.01(0)"), + _S("99.01(1)"), + _S("99.01(999)"), + _S("99.99(0)"), + _S("99.99(1)"), + _S("99.99(999)") + }; + +RTvTest::RTvTest() +// +// Constructor +// + : RTest(_L("T_VERSIO")) + { + + iTV[0]=&iDefTV; + TInt i=1; + TInt major=0; + FOREVER + { + TInt minor=0; + FOREVER + { + TInt build=0; + FOREVER + { + iTV[i++]=new TVersion(major,minor,build); + if (build==999) + break; + build=(build==1? 999: 1); + } + if (minor==99) + break; + minor=(minor==1? 99: 1); + } + if (major==99) + break; + major=(major==1? 99: 1); + } + } + +void RTvTest::TestName() +// +// Test the version name +// + { + + Next(_L("Testing TVersion::Name()")); + for (TInt i=0; iName().Compare(Name)) + Panic(Name); + } + } + +TBool RTvTest::QVS(TInt aCurrent,TInt aRequested) +// +// An independent calculation of what QueryVersionSupported should return +// + { + + if (aCurrent) + aCurrent--; + if (aRequested) + aRequested--; + aCurrent/=3; + aRequested/=3; + return(aCurrent>=aRequested); + } + +void RTvTest::TestQVS() +// +// Check QueryVersionSupported() +// + { + + Next(_L("Testing User::QueryVersionSupported()")); + for (TInt i=0; i=aSrc.iC); // if not truncating, dest can't be shorter than source + __ASSERT(aMode!=ETruncate||n<=aSrc.iC); // if truncating, dest can't be longer than source + TInt min = Min(n,aSrc.iC); + TInt i; + for (i=0; i=2); + Mem::Copy(iX, &aSigned64, 8); + TUint f = (iX[1] & 0x80000000u) ? 0xff : 0; + Mem::Fill(iX+2,(n-2)*sizeof(TUint32),f); + } + +TLargeIntBase::TLargeIntBase(TInt n, const Uint64& aUnsigned64) + : iC(n) + { + __ASSERT(n>=2); + Mem::Copy(iX, &aUnsigned64, 8); + Mem::FillZ(iX+2,(n-2)*sizeof(TUint32)); + } + +void TLargeIntBase::Not() + { + TInt i; + for (i=0; i>31); + c = iX[i]; + iX[i] = x; + } + return c>>31; + } + +TUint32 TLargeIntBase::Lsr() + { + TInt i; + TUint32 c = 0; + for (i=iC-1; i>=0; --i) + { + TUint32 x = (iX[i]>>1) | (c<<31); + c = iX[i]; + iX[i] = x; + } + return c&1; + } + +TUint32 TLargeIntBase::Asr() + { + TInt i=iC-1; + TUint32 c = iX[i]>>31; + for (; i>=0; --i) + { + TUint32 x = (iX[i]>>1) | (c<<31); + c = iX[i]; + iX[i] = x; + } + return c&1; + } + +void TLargeIntBase::Lsl(TInt aCount) + { + while(--aCount>=0) + Lsl(); + } + +void TLargeIntBase::Lsr(TInt aCount) + { + while(--aCount>=0) + Lsr(); + } + +void TLargeIntBase::Asr(TInt aCount) + { + while(--aCount>=0) + Asr(); + } + +void TLargeIntBase::Add(const TLargeIntBase& a) + { + __ASSERT(a.iC==iC); + TInt i; + TUint32 c = 0; + for (i=0; i>31)); + TUint32 g = (x & y) | ((x | y) &~ s); + TUint32 p = ~s ? 0 : s; + c = g | (c & p); + } + } + +void TLargeIntBase::Sub(const TLargeIntBase& a) + { + __ASSERT(a.iC==iC); + TInt i; + TUint32 c = 0x80000000u; + for (i=0; i>31)); + TUint32 g = (x & y) | ((x | y) &~ s); + TUint32 p = ~s ? 0 : s; + c = g | (c & p); + } + } + +void TLargeIntBase::Mul(const TLargeIntBase& a) + { + __ASSERT(a.iC==iC); + TUint32 temp[64]; // HACK!! + Mem::Copy(temp, this, (iC+1)*sizeof(TUint32)); + TLargeIntBase& b = *(TLargeIntBase*)temp; + new (this) TLargeIntBase(iC,TUint32(0u)); + TInt i; + for (i=0; i<32*iC; ++i) + { + Lsl(); + if (b.Lsl()) + Add(a); + } + } + +void TLargeIntBase::DivU(const TLargeIntBase& aDivisor, TLargeIntBase& aRem) + { + __ASSERT(aDivisor.iC==iC); + __ASSERT(aRem.iC==iC); + new (&aRem) TLargeIntBase(iC,TUint32(0u)); + TInt i; + for (i=0; i=0; --i) + { + TUint32 x = iX[i]; + TUint32 y = a.iX[i]; + if (x>y) + return 1; + if (x=0; --i) + { + TUint32 x = iX[i] ^ m; + TUint32 y = a.iX[i] ^ m; + m = 0; + if (x>y) + return 1; + if (x + +#define __ASSERT(c) __ASSERT_DEBUG(c,User::Invariant()) + +class TLargeIntBase + { +public: + enum TMode {EZeroExtend,ESignExtend,ETruncate}; + TLargeIntBase(TInt n); + TLargeIntBase(TInt n, TInt32 aSigned32); + TLargeIntBase(TInt n, TUint32 aUnsigned32); + TLargeIntBase(TInt n, const TLargeIntBase&, TMode); + TLargeIntBase(TInt n, const TUint32* aPtr); + TLargeIntBase(TInt n, const Int64& aSigned64); + TLargeIntBase(TInt n, const Uint64& aUnsigned64); +public: + void Not(); + void Neg(); + void Abs(); + void Inc(); + void Dec(); + TUint32 Lsl(); + TUint32 Lsr(); + TUint32 Asr(); + void Lsl(TInt aCount); + void Lsr(TInt aCount); + void Asr(TInt aCount); + void Add(const TLargeIntBase&); + void Sub(const TLargeIntBase&); + void Mul(const TLargeIntBase&); + void DivU(const TLargeIntBase& aDivisor, TLargeIntBase& aRem); + void DivS(const TLargeIntBase& aDivisor, TLargeIntBase& aRem); + TInt CompareU(const TLargeIntBase&) const; + TInt CompareS(const TLargeIntBase&) const; + inline TLargeIntBase& operator++() {Inc(); return *this;} + inline TLargeIntBase& operator--() {Dec(); return *this;} +public: + inline TBool operator==(const TLargeIntBase& a) const + {return CompareU(a)==0;} + inline TBool operator!=(const TLargeIntBase& a) const + {return CompareU(a)!=0;} + inline TBool Hi(const TLargeIntBase& a) const + {return CompareU(a)>0;} + inline TBool Hs(const TLargeIntBase& a) const + {return CompareU(a)>=0;} + inline TBool Lo(const TLargeIntBase& a) const + {return CompareU(a)<0;} + inline TBool Ls(const TLargeIntBase& a) const + {return CompareU(a)<=0;} + inline TBool Gt(const TLargeIntBase& a) const + {return CompareS(a)>0;} + inline TBool Ge(const TLargeIntBase& a) const + {return CompareS(a)>=0;} + inline TBool Lt(const TLargeIntBase& a) const + {return CompareS(a)<0;} + inline TBool Le(const TLargeIntBase& a) const + {return CompareS(a)<=0;} + inline TUint32& operator[](TInt a) + {__ASSERT(TUint32(a) +class TLargeInt : public TLargeIntBase + { +public: + inline TLargeInt() : TLargeIntBase(n) {} + inline TLargeInt(TInt32 aSigned32) : TLargeIntBase(n,aSigned32) {} + inline TLargeInt(TUint32 aUnsigned32) : TLargeIntBase(n,aUnsigned32) {} + inline TLargeInt(const TLargeIntBase& aSrc, TMode aMode) : TLargeIntBase(n,aSrc,aMode) {} + inline TLargeInt(const TUint32* aPtr) : TLargeIntBase(n, aPtr) {} + inline TLargeInt(const Int64& aSigned64) : TLargeIntBase(n, aSigned64) {} + inline TLargeInt(const Uint64& aUnsigned64) : TLargeIntBase(n, aUnsigned64) {} + inline TLargeInt<2*n> LongMultU(const TLargeInt& a) const + {TLargeInt<2*n> x(*this,EZeroExtend); TLargeInt<2*n> y(a,EZeroExtend); x.Mul(y); return x;} + inline TLargeInt<2*n> LongMultS(const TLargeInt& a) const + {TLargeInt<2*n> x(*this,ESignExtend); TLargeInt<2*n> y(a,ESignExtend); x.Mul(y); return x;} +public: + TUint32 iExtra[n-1]; + }; + +#define CHECK(X) void __compile_assert(int __check[(X)?1:-1]) + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_float.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_float.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,370 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_float.cpp +// Data split into files: t_float1.cpp, t_float2.cpp and t_float3.cpp +// Overview: +// Test conversion of real to descriptors, descriptors to real and the +// Math::Round method. +// API Information: +// TDes8, TDes16, TLex8, TLex16, Math. +// Details: +// - Test conversion of specified TReal32, TReal64 into TBuf8, TBuf16 +// is as expected. +// - Round some numbers to a specified number of decimal places and check it +// is as expected. +// - Test conversion of specified TReal32, TReal64 into TBuf8, TBuf16 in +// calculator mode is as expected. +// - Check that errors returned during conversion from TReal32, TReal64 into +// TBuf8, TBuf16 are as expected. +// - Verify the result when a string is parsed to extract a real number. +// - Test string to real conversion in cases, which are not exact and check +// that results are as expected. +// - Test errors in string to real conversion are as expected. +// - Test that the conversion from string to real and then real to string, verify +// the results are as expected. +// - For specified strings values check parsing of string to extract real value, +// absolute value, token length is as expected. +// - Check the character representation of specified real numbers are as expected. +// Platforms/Drives/Compatibility: +// All +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include "t_math.h" +#include "t_float.h" + +GLREF_D RtoB_TEST testd[]; +GLREF_D TUint size_testd; +GLREF_D RtoB_TEST testcalc[]; +GLREF_D TUint size_testcalc; +GLREF_D ERR_TEST testerr[]; +GLREF_D TUint size_testerr; +GLREF_D DtoR_ERR_TEST testerr2[]; +GLREF_D TUint size_testerr2; +GLREF_D DtoR_ERR_TEST testerr3[]; +GLREF_D TUint size_testerr3; +GLREF_D CALC_TEST calctest[]; +GLREF_D TUint size_calctest; +GLREF_D ROUND_TEST testround[]; +GLREF_D TUint size_testround; +GLREF_D DtoR_TEST64 testd2[]; +GLREF_D TUint size_testd2; +GLREF_D DtoR_TEST64 testApprox[]; +GLREF_D TUint size_testApprox; +GLREF_D DtoR_TEST32 testd32[]; +GLREF_D TUint size_testd32; + +GLDEF_D RTest test(_L("T_FLOAT")); + +LOCAL_C TInt rtob(RtoB_TEST& tst) + { + + TBuf<0x100> buf; + + TInt ret=buf.Num(tst.num,tst.format); + if (ret!=KErrGeneral) + { + buf.ZeroTerminate(); + TPtrC result(tst.res); +// test.Printf(_L("buf=%S\nres=%S\n"),&buf,&result); + test(buf.Compare(result)==0); + } + return(ret); + } + +LOCAL_C void test1() +// +// Test RtoB using selected numbers +// + { + + for (TInt jj=0;jj=0); + } + +LOCAL_C void test2() +// +// Test Math::Round(_,_,_) for specific numbers +// + { + + TReal res; + TRealFormat pf; + pf.iType=KRealFormatExponent; + pf.iWidth=22; + pf.iPlaces=15; + pf.iPoint='.'; + pf.iTriad=','; + pf.iTriLen=1; + + for (TInt jj=0;jj=0); + } + +LOCAL_C void test4() +// +// Tests errors +// + { + + for (TInt jj=0;jjiLex; + test(l.Val(r64)==KErrNone); + test(tst64->iRes==r64); + } + + TReal32 r32; + + for (jj=0; jjiLex; + test(l.Val(r32)==KErrNone); + test(tst32->iRes==r32); + } + } + +LOCAL_C void test6() +// +// Test string to real conversion in cases which are not exact +// Added by AnnW, December 1996 +// + { + + TReal r64; + + for (TInt jj=0; jjiLex; + test(l.Val(r64)==KErrNone); + test(tst64->iRes==r64); + } + } + +LOCAL_C void test7() +// +// Test errors in string to real conversion +// added by AnnW, December 1996 +// + { + + TReal r64; + TInt jj; + + for (jj=0; jjiLex; + TInt err=errtst64->iErr; + test(l.Val(r64)==err); + } + + TReal32 r32; + + for (jj=0; jjiLex; + TInt err=errtst32->iErr; + test(l.Val(r32)==err); + } + } + +LOCAL_C void test8() +// +// Some tests for calc to check that a number entered is printed to same significance when +// returned +// do dtor and rtod test +// + { + + TLex l; + TBuf<0x100> buf; + TInt ret; + TReal64 num; + + for (TInt jj=0;jj=0); + } + } + +// Tag on a few extra tests relating to ascii and unicode + +template +class AsciiUnicode + { +public: + void Test1(); + }; + +template +void AsciiUnicode::Test1() +// R == TReal32 or TReal64 +// S == TText, TText8 or TText16 +// L == TLex, TLex8 or TLex16 +// B == TBuf, TBuf8 or TBuf16 +// T == TPtr, TPtr8 or TPtr16 + { + + L lex1(_TL("123.456")); + R real; // TReal32 or TReal64 + test(lex1.Val(real)==KErrNone); + test(Abs(real-123.456)<1E-5); + test(lex1.TokenLength()==7); + test((lex1.Remainder()).Compare(T(_TL(""),0,0))==0); + test(lex1.Val(real)==KErrGeneral); + + L lex2(_TL("123.456abc")); + test(lex2.Val(real)==KErrNone); + test(Abs(real-123.456)<1E-5); + test(lex2.TokenLength()==7); + test((lex2.Remainder()).Compare(T(_TL("abc"),3,3))==0); + test(lex2.Val(real)==KErrGeneral); + + L lex3; + real=(R)0.5; + test(lex3.Val(real)==KErrGeneral); + test(real==((R)0.5)); + test(lex3.TokenLength()==0); + + L lex4(_TL("abc123.45")); + real=(R)0.5; + test(lex4.Val(real)==KErrGeneral); + test(real==((R)0.5)); + + L Lex5(_TL("1.2e37")); + real=(R)0.5; + test(Lex5.Val(real)==KErrNone); + + L Lex6(_TL("1.2e")); + real=(R)0.5; + test(Lex6.Val(real)==KErrNone); + + TRealFormat format(20,3); // first param width, 2nd decimals + real=(R)12345.6789; + B buf1; + test(buf1.Num(real,format)==10); + test(buf1.Compare(T(_TL("12,345.679"),10,10))==0); + + B buf2(_TL("abc")); + test(buf2.AppendNum(real,format)==13); + test(buf2.Compare(T(_TL("abc12,345.679"),13,13))==0); + + B buf3; + test(buf3.AppendNum(real,format)==10); + test(buf3.Compare(T(_TL("12,345.679"),10,10))==0); + } + +#ifndef _DEBUG +#pragma warning (disable :4710) //Function not expanded +#pragma warning (disable :4702) //Unreachable code +#endif + +GLDEF_C TInt E32Main() + { + + test.Start(_L("Test ftol")); + TReal f=34.567; + TInt i=TInt(f); + test(i==34); + test.Next(_L("Test TBuf8/16::Num() using selected numbers")); + test1(); + test.Next(_L("Test specific numbers for Math::Round(_,_,_)")); + test2(); + test.Next(_L("Test TBuf8/16::Num() using selected numbers in calculator mode")); + test3(); + test.Next(_L("Test errors")); + test4(); + test.Next(_L("Test TLex8/16::Val using selected values which give exact results")); + test5(); + test.Next(_L("Test TLex8/16::Val using values which do NOT give exact results")); + test6(); + test.Next(_L("Test errors")); + test7(); + test.Next(_L("Test for CALC")); + test8(); + // + test.Next(_L("Ascii/Unicode: TText")); + AsciiUnicode,TPtr> T1; + T1.Test1(); + test.Next(_L("Ascii/Unicode: TText8")); + AsciiUnicode,TPtr8> T2; + T2.Test1(); + test.Next(_L("Ascii/Unicode: TText16")); + AsciiUnicode,TPtr16> T3; + T3.Test1(); + // + test.End(); + return(KErrNone); + } +#pragma warning (default :4710) +#pragma warning (default :4702) + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_float.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_float.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,115 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_float.h +// Header file for T_FLOAT.CPP +// +// + + +#if !defined(__T_FLTCL_H__) +#define __T_FLTCL_H__ + +#if !defined(__E32STD_H__) +#include +#endif + +#include "t_vals.h" + +//Added by AnnW +const TInt fixedLimitAndTriads=KRealFormatFixed | KGeneralLimit; +const TInt fixedNoTriads=KRealFormatFixed | KDoNotUseTriads; +const TInt fixedLimit=fixedNoTriads | KGeneralLimit; +const TInt fixedSpaceForSign=fixedNoTriads | KExtraSpaceForSign; +const TInt fixedTriadsAndSign=KRealFormatFixed | KExtraSpaceForSign; +const TInt fixedLimitAndSpaceForSign=fixedLimit |KExtraSpaceForSign; +const TInt exponentThreeDigitExp=KRealFormatExponent | KAllowThreeDigitExp; +const TInt exponentLimit=KRealFormatExponent | KGeneralLimit; +const TInt exponentLimitAndThreeDigExp=exponentLimit | KAllowThreeDigitExp; +const TInt generalSpaceForSign=KRealFormatGeneral | KExtraSpaceForSign; +const TInt generalThreeDigitExp=KRealFormatGeneral | KAllowThreeDigitExp; +const TInt generalLimit=KRealFormatGeneral | KGeneralLimit; +const TInt noExponentNoTriads=KRealFormatNoExponent | KDoNotUseTriads; +const TInt noExponentLimit=noExponentNoTriads | KGeneralLimit; +const TInt calculatorThreeDigitExp=KRealFormatCalculator | KAllowThreeDigitExp; +const TInt calculatorLimit=KRealFormatCalculator | KGeneralLimit; +const TInt calculatorLimitAndThreeDigExp=calculatorLimit | KAllowThreeDigitExp; +const TInt noExponentCalc=noExponentNoTriads | KExtraSpaceForSign; +// +// new - 17/3/97 +const TInt exponentThreeDigitExpAndSigFigs=KRealFormatExponent | KAllowThreeDigitExp | KUseSigFigs; +const TInt exponentSigFigs=KRealFormatExponent | KUseSigFigs; + + +// classes used by T_FLOAT.CPP + +class ROUND_TEST + { +public: + TReal num; // input number + TInt plcs; // number of places to be rounded + TReal res; // expected result + }; + +class RtoB_TEST + { +public: + RtoB_TEST(); + RtoB_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes); + TReal num; // input number + TRealFormat format; // format + const TText* res; // expected result + }; + +class ERR_TEST + { +public: + ERR_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad, TInt aTrilen,const TText* aRes=_S(""),TInt aErr=KErrGeneral); + RtoB_TEST rtob; + TInt err; + }; + +class DtoR_TEST64 + { +public: + DtoR_TEST64(const TDesC& aDes,const TReal aRes) : iLex(aDes),iRes(aRes) {} + TLex iLex ; // input string + TReal iRes; // expected result + }; + +class DtoR_TEST32 + { +public: + DtoR_TEST32(const TDesC& aDes,const TReal32 aRes) : iLex(aDes),iRes(aRes) {} + TLex iLex ; // input string + TReal32 iRes; // expected result + }; + +class DtoR_ERR_TEST + { +public: + DtoR_ERR_TEST(const TDesC& aDes,const TInt aErr) : iLex(aDes),iErr(aErr) {} + TLex iLex; + TInt iErr; + }; + +class CALC_TEST + { +public: + CALC_TEST(const TDesC& aDes,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes); + TLex iLex; + TRealFormat iFormat; + const TText* iRes; + }; + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_float1.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_float1.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,452 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_float1.cpp +// File for T_FLOAT.CPP containing data for test1 +// T_FLOAT.CPP split into header files because there seems to be too much static data for GCC +// compiler +// +// + +#include "t_float.h" + +GLDEF_D RtoB_TEST testd[]= + { + // GENERAL format limited to 12 significant digits + // No triads, no three-digit exponents and no extra space for sign + RtoB_TEST(1.23456789012501,generalLimit,32,15,'.',',',3,_S("1.23456789013")), + RtoB_TEST(1.2345678901249,generalLimit,32,15,'.',',',3,_S("1.23456789012")), + RtoB_TEST(1.99999999996,generalLimit,32,15,'.',',',3,_S("1.99999999996")), + RtoB_TEST(1.999999999996,generalLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.9999999999996,generalLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.99999999999996,generalLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.99999999994,generalLimit,32,15,'.',',',3,_S("1.99999999994")), + RtoB_TEST(1.999999999994,generalLimit,32,15,'.',',',3,_S("1.99999999999")), + RtoB_TEST(1.9999999999994,generalLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.99999999999994,generalLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.99999999996E2,generalLimit,32,15,'.',',',3,_S("199.999999996")), + RtoB_TEST(1.999999999996E-2,generalLimit,32,15,'.',',',3,_S("0.02")), + RtoB_TEST(1.9999999999996E2,generalLimit,32,15,'.',',',3,_S("200")), + RtoB_TEST(1.99999999999996E-2,generalLimit,32,15,'.',',',3,_S("0.02")), + RtoB_TEST(1.99999999994E2,generalLimit,32,15,'.',',',3,_S("199.999999994")), + RtoB_TEST(1.999999999994E-2,generalLimit,32,15,'.',',',3,_S("0.0199999999999")), + RtoB_TEST(1.9999999999994E99,generalLimit,32,15,'.',',',3,_S("2E+99")), + RtoB_TEST(1.99999999999994E-99,generalLimit,32,15,'.',',',3,_S("2E-99")), + RtoB_TEST(0.0,generalLimit,32,15,'.',',',3,_S("0")), + // + RtoB_TEST(1.2E+99,generalLimit,8,15,'.','0',0,_S("1.2E+99")), + RtoB_TEST(1.2E-99,generalLimit,8,15,'.','0',0,_S("1.2E-99")), + RtoB_TEST(-1.2E+99,generalLimit,8,15,'.','0',0,_S("-1.2E+99")), + RtoB_TEST(-1.2E-99,generalLimit,8,15,'.','0',0,_S("-1.2E-99")), + // + RtoB_TEST(1.2E+99,generalLimit,6,15,'.','0',0,_S("1E+99")), + RtoB_TEST(1.2E-99,generalLimit,6,15,'.','0',0,_S("1E-99")), + RtoB_TEST(-1.2E+99,generalLimit,7,15,'.','0',0,_S("-1E+99")), + RtoB_TEST(-1.2E-99,generalLimit,7,15,'.','0',0,_S("-1E-99")), + // + RtoB_TEST(1.2E+99,generalLimit,5,15,'.','0',0,_S("1E+99")), + RtoB_TEST(1.2E-99,generalLimit,5,15,'.','0',0,_S("1E-99")), + RtoB_TEST(-1.2E+99,generalLimit,6,15,'.','0',0,_S("-1E+99")), + RtoB_TEST(-1.2E-99,generalLimit,6,15,'.','0',0,_S("-1E-99")), + // + RtoB_TEST(1E+99,generalLimit,8,15,'.','0',0,_S("1E+99")), + RtoB_TEST(1E-99,generalLimit,8,15,'.','0',0,_S("1E-99")), + RtoB_TEST(-1E+99,generalLimit,9,15,'.','0',0,_S("-1E+99")), + RtoB_TEST(-1E-99,generalLimit,9,15,'.','0',0,_S("-1E-99")), + // + RtoB_TEST(1E+99,generalLimit,7,15,'.','0',0,_S("1E+99")), + RtoB_TEST(1E-99,generalLimit,7,15,'.','0',0,_S("1E-99")), + RtoB_TEST(-1E+99,generalLimit,8,15,'.','0',0,_S("-1E+99")), + RtoB_TEST(-1E-99,generalLimit,8,15,'.','0',0,_S("-1E-99")), + // + RtoB_TEST(1E+99,generalLimit,6,15,'.','0',0,_S("1E+99")), + RtoB_TEST(1E-99,generalLimit,6,15,'.','0',0,_S("1E-99")), + RtoB_TEST(-1E+99,generalLimit,7,15,'.','0',0,_S("-1E+99")), + RtoB_TEST(-1E-99,generalLimit,7,15,'.','0',0,_S("-1E-99")), + // + RtoB_TEST(1E+99,generalLimit,5,15,'.','0',0,_S("1E+99")), + RtoB_TEST(1E-99,generalLimit,5,15,'.','0',0,_S("1E-99")), + RtoB_TEST(-1E+99,generalLimit,6,15,'.','0',0,_S("-1E+99")), + RtoB_TEST(-1E-99,generalLimit,6,15,'.','0',0,_S("-1E-99")), + // + RtoB_TEST(0,generalLimit,2,14,'.','0',0,_S("0")), + RtoB_TEST(1,generalLimit,2,14,'.','0',0,_S("1")), + RtoB_TEST(370,generalLimit,20,14,'.','0',0,_S("370")), + RtoB_TEST(-9E98,fixedLimitAndTriads,150,15,'.',',',3,_S("-900,000,000,000,000,000,000,\ +000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,\ +000,000,000,000,000,000,000.000000000000000")), + RtoB_TEST(9E98,fixedLimitAndTriads,150,15,'.',',',3,_S("900,000,000,000,000,000,000,\ +000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,\ +000,000,000,000,000,000,000.000000000000000")), + RtoB_TEST(90000000.0,generalLimit,20,3,'.','0',0,_S("90000000")), + RtoB_TEST(90000000.0,generalLimit,9,3,'.','0',0,_S("90000000")), + RtoB_TEST(90000000.0,generalLimit,7,3,'.','0',0,_S("9E+07")), + RtoB_TEST(90000000.0,generalLimit,6,3,'.','0',0,_S("9E+07")), + RtoB_TEST(-900,generalLimit,20,3,'.','0',0,_S("-900")), + RtoB_TEST(-90000000.0,generalLimit,20,3,'.','0',0,_S("-90000000")), + RtoB_TEST(-90000000.0,generalLimit,9,3,'.','0',0,_S("-90000000")), + RtoB_TEST(-90000000.0,generalLimit,8,3,'.','0',0,_S("-9E+07")), + RtoB_TEST(-90000000.0,generalLimit,6,3,'.','0',0,_S("-9E+07")), + RtoB_TEST(900,generalLimit,20,3,'.','0',0,_S("900")), + RtoB_TEST(-900,generalLimit,20,3,'.','0',0,_S("-900")), + RtoB_TEST(999,generalLimit,3,3,'.','0',0,_S("999")), + RtoB_TEST(999.1,generalLimit,3,3,'.','0',0,_S("999")), + RtoB_TEST(999.1,generalLimit,4,3,'.','0',0,_S("999")), + RtoB_TEST(-999.1,generalLimit,4,3,'.','0',0,_S("-999")), + RtoB_TEST(-300,generalLimit,10,3,'.','0',0,_S("-300")), + RtoB_TEST(-355555555.0,generalLimit,6,3,'.','0',0,_S("-4E+08")), + RtoB_TEST(355555555.0,generalLimit,7,3,'.','0',0,_S("3.6E+08")), + RtoB_TEST(355555555.0,generalLimit,6,3,'.','0',0,_S("4E+08")), + RtoB_TEST(123456.0,generalLimit,6,4,'.','0',0,_S("123456")), + RtoB_TEST(999999.0,generalLimit,6,4,'.','0',0,_S("999999")), + RtoB_TEST(12346.0,generalLimit,5,4,'.','0',0,_S("12346")), + RtoB_TEST(9999999.0,generalLimit,5,4,'.','0',0,_S("1E+07")), + // + RtoB_TEST(0.02,generalLimit,6,4,'.','0',0,_S("0.02")), + RtoB_TEST(0.04,generalLimit,9,0,'.','0',0,_S("0.04")), + RtoB_TEST(0.004,generalLimit,9,0,'.','0',0,_S("0.004")), + RtoB_TEST(0.0004,generalLimit,9,0,'.','0',0, _S("4E-04")), + RtoB_TEST(0.05,generalLimit,9,0,'.','0',0,_S("0.05")), + RtoB_TEST(9.999999999964E-2,generalLimit,9,0,'.','0',0,_S("0.1")), + RtoB_TEST(0.0000999,generalLimit,7,4,'.','0',0,_S("1E-04")), + + // FIXED FORMAT + // test -ve number < 1 with 0 dp + RtoB_TEST(-0.01,KRealFormatFixed,7,0,'.','0',0,_S("0")), + RtoB_TEST(-0.4999999999,KRealFormatFixed,7,0,'.','0',0,_S("0")), + RtoB_TEST(-0.9,KRealFormatFixed,7,0,'.','0',0,_S("-1")), + RtoB_TEST(-0.51,KRealFormatFixed,7,0,'.','0',0,_S("-1")), + // No Triad separators (because length zero), no space for sign + RtoB_TEST(0.0,KRealFormatFixed,7,0,'.','0',0,_S("0")), + RtoB_TEST(KNegZeroTReal64,KRealFormatFixed,7,0,'.','0',0,_S("0")), + RtoB_TEST(0.0,KRealFormatFixed,7,0,'.','0',0,_S("0")), + RtoB_TEST(0.0,KRealFormatFixed,7,2,'.','0',0,_S("0.00")), + RtoB_TEST(0.0,KRealFormatFixed,7,3,'.','0',0,_S("0.000")), + RtoB_TEST(0.0,KRealFormatFixed,7,4,'.','0',0,_S("0.0000")), + RtoB_TEST(3.0,KRealFormatFixed,7,3,'.','0',0,_S("3.000")), + RtoB_TEST(12.9999,KRealFormatFixed,6,3,'.','0',0,_S("13.000")), + RtoB_TEST(123456.789,KRealFormatFixed,9,2,'.','0',0,_S("123456.79")), + RtoB_TEST(123456.0,KRealFormatFixed,9,2,'.','0',0,_S("123456.00")), + RtoB_TEST(1234567890123.,KRealFormatFixed,18,1,'.',',',0,_S("1234567890123.0")), + RtoB_TEST(123456.789,KRealFormatFixed,9,2,'.',',',0,_S("123456.79")), + RtoB_TEST(123456.0,KRealFormatFixed,9,2,'.',',',0,_S("123456.00")), + RtoB_TEST(1234567890123.,KRealFormatFixed,18,1,'.','0',0,_S("1234567890123.0")), + RtoB_TEST(.0453,KRealFormatFixed,12,4,'.','0',0,_S("0.0453")), + RtoB_TEST(.0453,KRealFormatFixed,12,2,'.','0',0,_S("0.05")), + RtoB_TEST(.0453,KRealFormatFixed,12,5,'.','0',0,_S("0.04530")), + RtoB_TEST(.00000876,KRealFormatFixed,11,9,'.','0',0,_S("0.000008760")), + RtoB_TEST(.00000876,KRealFormatFixed,11,8,'.','0',0,_S("0.00000876")), + RtoB_TEST(.00000876,KRealFormatFixed,11,7,'.','0',0,_S("0.0000088")), + RtoB_TEST(.00000876,KRealFormatFixed,11,6,'.','0',0,_S("0.000009")), + RtoB_TEST(.00000876,KRealFormatFixed,11,5,'.','0',0,_S("0.00001")), + RtoB_TEST(.123,KRealFormatFixed,5,3,'.','0',0,_S("0.123")), + RtoB_TEST(.1235,KRealFormatFixed,5,3,'.','0',0,_S("0.124")), + RtoB_TEST(1.0E4,KRealFormatFixed,10,2,'.',',',0,_S("10000.00")), + RtoB_TEST(1.0E-4,KRealFormatFixed,10,2,'.',',',0,_S("0.00")), + // No triad separators (because flag not set), no space for sign + RtoB_TEST(123456.789,fixedNoTriads,9,2,'.','0',3,_S("123456.79")), + RtoB_TEST(123456.0,fixedNoTriads,9,2,'.','0',3,_S("123456.00")), + RtoB_TEST(1234567890123.,fixedNoTriads,18,1,'.',',',3,_S("1234567890123.0")), + RtoB_TEST(123456.789,fixedNoTriads,9,2,'.',',',3,_S("123456.79")), + RtoB_TEST(123456.0,fixedNoTriads,9,2,'.',',',3,_S("123456.00")), + RtoB_TEST(1234567890123.,fixedNoTriads,18,1,'.','0',3,_S("1234567890123.0")), + RtoB_TEST(.00000876,fixedNoTriads,11,9,'.','0',3,_S("0.000008760")), + RtoB_TEST(.00000876,fixedNoTriads,11,8,'.','0',3,_S("0.00000876")), + RtoB_TEST(.00000876,fixedNoTriads,11,7,'.','0',3,_S("0.0000088")), + RtoB_TEST(.00000876,fixedNoTriads,11,6,'.','0',3,_S("0.000009")), + RtoB_TEST(.00000876,fixedNoTriads,11,5,'.','0',3,_S("0.00001")), + // UK Triad separators, no space for sign + RtoB_TEST(0.0,KRealFormatFixed,9,2,'.',',',3,_S("0.00")), + RtoB_TEST(.00568,KRealFormatFixed,9,2,'.',',',3,_S("0.01")), + RtoB_TEST(12345.0,KRealFormatFixed,9,2,'.',',',3,_S("12,345.00")), + RtoB_TEST(12345.669,KRealFormatFixed,9,2,'.',',',3,_S("12,345.67")), + RtoB_TEST(100000.0,KRealFormatFixed,10,2,'.',',',3,_S("100,000.00")), + RtoB_TEST(99999.999,KRealFormatFixed,10,2,'.',',',3,_S("100,000.00")), + RtoB_TEST(1234567890.675,KRealFormatFixed,16,2,'.',',',3,_S("1,234,567,890.68")), + RtoB_TEST(1.0E3,KRealFormatFixed,10,2,'.',',',3,_S("1,000.00")), + // French Triad separators, no space for sign + RtoB_TEST(0.0,KRealFormatFixed,10,2,',',' ',4,_S("0,00")), + RtoB_TEST(.00568,KRealFormatFixed,10,2,',',' ',4,_S("0,01")), + RtoB_TEST(1.0E3,KRealFormatFixed,10,2,',',' ',4,_S("1000,00")), + RtoB_TEST(1234.0,KRealFormatFixed,10,2,',',' ',4,_S("1234,00")), + RtoB_TEST(12345.0,KRealFormatFixed,9,2,',',' ',4,_S("12 345,00")), + RtoB_TEST(12345.669,KRealFormatFixed,9,2,',',' ',4,_S("12 345,67")), + RtoB_TEST(100000.0,KRealFormatFixed,10,2,',',' ',4,_S("100 000,00")), + RtoB_TEST(99999.999,KRealFormatFixed,10,2,',',' ',4,_S("100 000,00")), + RtoB_TEST(1234567890.675,KRealFormatFixed,16,2,',',' ',4,_S("1 234 567 890,68")), + // '.' as triad separator, and ',' as decimal point, no space for sign + RtoB_TEST(1234.0,KRealFormatFixed,10,2,',','.',3,_S("1.234,00")), + RtoB_TEST(0.0,KRealFormatFixed,10,2,',','.',3,_S("0,00")), + RtoB_TEST(.00568,KRealFormatFixed,10,2,',','.',3,_S("0,01")), + RtoB_TEST(1.0E3,KRealFormatFixed,10,2,',','.',3,_S("1.000,00")), + RtoB_TEST(12345.669,KRealFormatFixed,9,2,',','.',3,_S("12.345,67")), + RtoB_TEST(12345.0,KRealFormatFixed,9,2,',','.',4,_S("12.345,00")), + RtoB_TEST(100000.0,KRealFormatFixed,10,2,',','.',3,_S("100.000,00")), + RtoB_TEST(99999.999,KRealFormatFixed,10,2,',','.',3,_S("100.000,00")), + RtoB_TEST(1234567890.675,KRealFormatFixed,16,2,',','.',3,_S("1.234.567.890,68")), + // Added by AnnW + // no triads, space for sign + RtoB_TEST(0.0,fixedSpaceForSign,2,0,'.','0',0,_S("0")), + RtoB_TEST(3.0,fixedSpaceForSign,6,3,'.','0',0,_S("3.000")), + RtoB_TEST(-3.0,fixedSpaceForSign,6,3,'.','0',0,_S("-3.000")), + RtoB_TEST(12.9999,fixedSpaceForSign,7,3,'.','0',0,_S("13.000")), + RtoB_TEST(-12.9999,fixedSpaceForSign,7,3,'.','0',0,_S("-13.000")), + RtoB_TEST(123456.789,fixedSpaceForSign,10,2,'.','0',0,_S("123456.79")), + RtoB_TEST(-123456.789,fixedSpaceForSign,10,2,'.','0',0,_S("-123456.79")), + RtoB_TEST(1234567890123.,fixedSpaceForSign,16,1,'.','0',0,_S("1234567890123.0")), + RtoB_TEST(-1234567890123.,fixedSpaceForSign,16,1,'.','0',0,_S("-1234567890123.0")), + RtoB_TEST(.0453,fixedSpaceForSign,12,4,'.','0',0,_S("0.0453")), + RtoB_TEST(.0453,fixedSpaceForSign,12,2,'.','0',0,_S("0.05")), + RtoB_TEST(.0453,fixedSpaceForSign,12,5,'.','0',0,_S("0.04530")), + RtoB_TEST(.00000876,fixedSpaceForSign,11,8,'.','0',0,_S("0.00000876")), + RtoB_TEST(-.00000876,fixedSpaceForSign,11,8,'.','0',0,_S("-0.00000876")), + RtoB_TEST(.00000876,fixedSpaceForSign,9,6,'.','0',0,_S("0.000009")), + RtoB_TEST(-.00000876,fixedSpaceForSign,9,6,'.','0',0,_S("-0.000009")), + RtoB_TEST(.1235,fixedSpaceForSign,6,3,'.','0',0,_S("0.124")), + RtoB_TEST(-.1235,fixedSpaceForSign,6,3,'.','0',0,_S("-0.124")), + // UK triads and space for sign + RtoB_TEST(0.0,fixedTriadsAndSign,10,2,'.',',',3,_S("0.00")), + RtoB_TEST(.00568,fixedTriadsAndSign,10,2,'.',',',3,_S("0.01")), + RtoB_TEST(-.00568,fixedTriadsAndSign,10,2,'.',',',3,_S("-0.01")), + RtoB_TEST(12345.0,fixedTriadsAndSign,10,2,'.',',',3,_S("12,345.00")), + RtoB_TEST(-12345.0,fixedTriadsAndSign,10,2,'.',',',3,_S("-12,345.00")), + RtoB_TEST(100000.0,fixedTriadsAndSign,11,2,'.',',',3,_S("100,000.00")), + RtoB_TEST(99999.999,fixedTriadsAndSign,11,2,'.',',',3,_S("100,000.00")), + RtoB_TEST(-99999.999,fixedTriadsAndSign,11,2,'.',',',3,_S("-100,000.00")), + RtoB_TEST(1234567890.675,fixedTriadsAndSign,17,2,'.',',',3,_S("1,234,567,890.68")), + RtoB_TEST(-1234567890.675,fixedTriadsAndSign,17,2,'.',',',3,_S("-1,234,567,890.68")), + RtoB_TEST(1.0E3,fixedTriadsAndSign,9,2,'.',',',3,_S("1,000.00")), + RtoB_TEST(-1.0E3,fixedTriadsAndSign,9,2,'.',',',3,_S("-1,000.00")), + // + RtoB_TEST(1234.9876E-107,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")), + RtoB_TEST(1234.9876E-109,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")), + RtoB_TEST(1234.9876E-110,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")), + RtoB_TEST(1234.9876E-200,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")), + RtoB_TEST(1234.9876E-300,KRealFormatFixed,12,6,'.','0',0,_S("0.000000")), + + // FIXED FORMAT + // Limited + RtoB_TEST(1.23456789012501,fixedLimit,32,15,'.',',',0,_S("1.234567890130000")), + RtoB_TEST(1.2345678901249,fixedLimit,32,15,'.',',',3,_S("1.234567890120000")), + RtoB_TEST(1.99999999996,fixedLimit,32,15,'.',',',0,_S("1.999999999960000")), + RtoB_TEST(1.999999999996,fixedLimit,32,15,'.',',',0,_S("2.000000000000000")), + RtoB_TEST(1.9999999999996,fixedLimit,32,15,'.',',',3,_S("2.000000000000000")), + RtoB_TEST(1.99999999999996,fixedLimit,32,15,'.',',',3,_S("2.000000000000000")), + // + RtoB_TEST(1.23456789012501E+6,fixedLimitAndTriads,32,9,'.',',',3,_S("1,234,567.890130000")), + RtoB_TEST(1.2345678901249E+8,fixedLimitAndTriads,32,7,'.',',',3,_S("123,456,789.0120000")), + RtoB_TEST(1.99999999996E+3,fixedLimitAndTriads,32,12,'.',',',3,_S("1,999.999999960000")), + RtoB_TEST(1.999999999996E+12,fixedLimitAndTriads,32,3,'.',',',3,_S("2,000,000,000,000.000")), + RtoB_TEST(1.9999999999996E+4,fixedLimitAndTriads,32,11,'.',',',3,_S("20,000.00000000000")), + RtoB_TEST(1.99999999999996E+13,fixedLimitAndTriads,32,2,'.',',',3,_S("20,000,000,000,000.00")), + // + RtoB_TEST(1.23456789012501,fixedLimitAndSpaceForSign,32,15,'.',',',0,_S("1.234567890130000")), + RtoB_TEST(1.2345678901249,fixedLimitAndSpaceForSign,32,15,'.',',',3,_S("1.234567890120000")), + RtoB_TEST(1.99999999996,fixedLimitAndSpaceForSign,32,15,'.',',',0,_S("1.999999999960000")), + RtoB_TEST(1.999999999996,fixedLimitAndSpaceForSign,32,15,'.',',',0,_S("2.000000000000000")), + RtoB_TEST(1.9999999999996,fixedLimitAndSpaceForSign,32,15,'.',',',3,_S("2.000000000000000")), + RtoB_TEST(1.99999999999996,fixedLimitAndSpaceForSign,32,15,'.',',',3,_S("2.000000000000000")), + // end of added + + // EXPONENT FORMAT + // Zero Exponents + RtoB_TEST(0.0,KRealFormatExponent,8,0,'.','0',0,_S("0E+00")), + RtoB_TEST(0.0,KRealFormatExponent,8,2,'.','0',0,_S("0.00E+00")), + RtoB_TEST(9.0,KRealFormatExponent,8,2,'.','0',0,_S("9.00E+00")), + RtoB_TEST(9.9,KRealFormatExponent,8,2,'.','0',0,_S("9.90E+00")), + RtoB_TEST(1234.9876E-3,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E+00")), + // Positive Exponents, not allowing three-digit exponents + RtoB_TEST(123.098785,KRealFormatExponent,8,2,'.','0',0,_S("1.23E+02")), + RtoB_TEST(123.098785,KRealFormatExponent,12,3,'.','0',0,_S("1.231E+02")), + RtoB_TEST(123.098785,KRealFormatExponent,12,4,'.','0',0,_S("1.2310E+02")), + RtoB_TEST(123.098785,KRealFormatExponent,12,5,'.','0',0,_S("1.23099E+02")), + RtoB_TEST(123.098785,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E+02")), + RtoB_TEST(98765.0,KRealFormatExponent,12,5,'.','0',0,_S("9.87650E+04")), + RtoB_TEST(10000000.0,KRealFormatExponent,8,2,'.','0',0,_S("1.00E+07")), + RtoB_TEST(100000000.0,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+08")), + RtoB_TEST(100000000.000087643,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+08")), + RtoB_TEST(999999999.999,KRealFormatExponent,8,2,'.','0',0,_S("1.00E+09")), + RtoB_TEST(1234567.8765E12,KRealFormatExponent,8,2,'.','0',0,_S("1.23E+18")), + RtoB_TEST(1234567.8765E12,KRealFormatExponent,12,6,'.','0',0,_S("1.234568E+18")), + RtoB_TEST(34574567645555555.0E35,KRealFormatExponent,12,6,'.','0',0,_S("3.457457E+51")), + RtoB_TEST(123.098785E56,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E+58")), + RtoB_TEST(.99999999E99,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+99")), + RtoB_TEST(1.0E99,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E+99")), + // Negative Exponents, not allowing three-digit exponents + RtoB_TEST(1234.9876E-4,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E-01")), + RtoB_TEST(.0000000001235,KRealFormatExponent,8,2,'.','0',0,_S("1.24E-10")), + RtoB_TEST(.0000000001235,KRealFormatExponent,8,1,'.','0',0,_S("1.2E-10")), + RtoB_TEST(.0000000001235,KRealFormatExponent,9,3,'.','0',0,_S("1.235E-10")), + RtoB_TEST(.00000000999,KRealFormatExponent,8,2,'.','0',0,_S("9.99E-09")), + RtoB_TEST(.0000000001,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E-10")), + RtoB_TEST(.00000000010001,KRealFormatExponent,12,6,'.','0',0,_S("1.000100E-10")), + RtoB_TEST(123.098785E-32,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E-30")), + RtoB_TEST(123.098785E-87,KRealFormatExponent,12,6,'.','0',0,_S("1.230988E-85")), + RtoB_TEST(1.0E-99,KRealFormatExponent,12,6,'.','0',0,_S("1.000000E-99")), + // Added by AnnW + // Positive Exponents, allowing three-digit exponents + RtoB_TEST(123.098785,exponentThreeDigitExp,12,6,'.','0',0,_S("1.230988E+02")), + RtoB_TEST(999999999.999,exponentThreeDigitExp,8,2,'.','0',0,_S("1.00E+09")), + RtoB_TEST(34574567645555555.0E35,exponentThreeDigitExp,12,6,'.','0',0,_S("3.457457E+51")), + RtoB_TEST(.99999999E99,exponentThreeDigitExp,12,6,'.','0',0,_S("1.000000E+99")), + RtoB_TEST(1.0E99,exponentThreeDigitExp,12,6,'.','0',0,_S("1.000000E+99")), + RtoB_TEST(1234.9876E-103,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-100")), + RtoB_TEST(1234.9876E-107,exponentThreeDigitExp,14,6,'.','0',0,_S("1.234988E-104")), + RtoB_TEST(1234.9876E-109,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-106")), + RtoB_TEST(1234.9876E-110,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-107")), + RtoB_TEST(1234.9876E-200,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-197")), + RtoB_TEST(1234.9876E-300,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E-297")), + RtoB_TEST(1234.9876E97,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+100")), + RtoB_TEST(1234.9876E100,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+103")), + RtoB_TEST(1234.9876E103,exponentThreeDigitExp,14,5,'.','0',0,_S("1.23499E+106")), + RtoB_TEST(1234.9876E200,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+203")), + RtoB_TEST(1234.9876E300,exponentThreeDigitExp,14,7,'.','0',0,_S("1.2349876E+303")), + // Negative Exponents, allowing three-digit exponents + RtoB_TEST(1234.9876E-4,exponentThreeDigitExp,12,6,'.','0',0,_S("1.234988E-01")), + RtoB_TEST(.00000000999,exponentThreeDigitExp,8,2,'.','0',0,_S("9.99E-09")), + RtoB_TEST(123.098785E-32,exponentThreeDigitExp,12,6,'.','0',0,_S("1.230988E-30")), + RtoB_TEST(123.098785E-87,exponentThreeDigitExp,12,6,'.','0',0,_S("1.230988E-85")), + RtoB_TEST(1.0E-99,exponentThreeDigitExp,12,6,'.','0',0,_S("1.000000E-99")), + // Limited + RtoB_TEST(1.23456789012501E24,exponentLimit,32,15,'.',',',3,_S("1.234567890130000E+24")), + RtoB_TEST(1.2345678901249E+97,exponentLimit,32,15,'.',',',3,_S("1.234567890120000E+97")), + RtoB_TEST(1.99999999996E-19,exponentLimit,32,15,'.',',',3,_S("1.999999999960000E-19")), + RtoB_TEST(1.999999999996E-53,exponentLimit,32,15,'.',',',3,_S("2.000000000000000E-53")), + RtoB_TEST(1.9999999999996E+46,exponentLimit,32,15,'.',',',3,_S("2.000000000000000E+46")), + RtoB_TEST(1.99999999999996,exponentLimit,32,15,'.',',',3,_S("2.000000000000000E+00")), + // + RtoB_TEST(1.23456789012501E24,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("1.234567890130000E+24")), + RtoB_TEST(1.2345678901249E+169,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("1.234567890120000E+169")), + RtoB_TEST(1.99999999996E-19,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("1.999999999960000E-19")), + RtoB_TEST(1.999999999996E-253,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("2.000000000000000E-253")), + RtoB_TEST(1.9999999999996E+246,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("2.000000000000000E+246")), + RtoB_TEST(1.99999999999996E-302,exponentLimitAndThreeDigExp,32,15,'.',',',3,_S("2.000000000000000E-302")), + // end of added + + // GENERAL FORMAT + // Fixed format, no space for sign + RtoB_TEST(0.000,KRealFormatGeneral,7,4,'.','0',0,_S("0")), + RtoB_TEST(98.000,KRealFormatGeneral,7,4,'.','0',0,_S("98")), + RtoB_TEST(12345.6700009,KRealFormatGeneral,12,4,'.','0',3,_S("12345.670001")), + RtoB_TEST(1.E2,KRealFormatGeneral,3,4,'.','0',0,_S("100")), + RtoB_TEST(1234.0,KRealFormatGeneral,4,4,'.','0',3,_S("1234")), + RtoB_TEST(1.2345,KRealFormatGeneral,4,4,'.','0',0,_S("1.23")), + RtoB_TEST(1.235,KRealFormatGeneral,4,4,'.','0',0,_S("1.24")), + RtoB_TEST(98765.0,KRealFormatGeneral,13,6,'.','0',0,_S("98765")), + RtoB_TEST(100000000.0,KRealFormatGeneral,13,6,'.','0',0,_S("100000000")), + RtoB_TEST(123.098785E00,KRealFormatGeneral,10,6,'.','0',0,_S("123.098785")), + RtoB_TEST(-123.098785E00,KRealFormatGeneral,10,6,'.','0',0,_S("-123.09879")), + RtoB_TEST(0.001209,KRealFormatGeneral,6,4,'.','0',0,_S("0.0012")), + RtoB_TEST(0.00100987,KRealFormatGeneral,7,4,'.','0',0,_S("0.00101")), + RtoB_TEST(1234.9876E-4,KRealFormatGeneral,13,6,'.','0',0,_S("0.12349876")), + RtoB_TEST(1234.9876E-5,KRealFormatGeneral,13,6,'.','0',0,_S("0.012349876")), + // Fixed format, space for sign + RtoB_TEST(0.000,generalSpaceForSign,7,4,'.','0',0,_S("0")), + RtoB_TEST(98.000,generalSpaceForSign,7,4,'.','0',0,_S("98")), + RtoB_TEST(12345.6700009,generalSpaceForSign,13,4,'.','0',3,_S("12345.670001")), + RtoB_TEST(-12345.6700009,generalSpaceForSign,13,4,'.','0',3,_S("-12345.670001")), + RtoB_TEST(1.E2,generalSpaceForSign,4,4,'.','0',0,_S("100")), + RtoB_TEST(1234.0,generalSpaceForSign,5,4,'.','0',3,_S("1234")), + RtoB_TEST(1.2345,generalSpaceForSign,5,4,'.','0',0,_S("1.23")), + RtoB_TEST(1.235,generalSpaceForSign,5,4,'.','0',0,_S("1.24")), + RtoB_TEST(-1.235,generalSpaceForSign,5,4,'.','0',0,_S("-1.24")), + RtoB_TEST(98765.0,generalSpaceForSign,13,6,'.','0',0,_S("98765")), + RtoB_TEST(100000000.0,generalSpaceForSign,13,6,'.','0',0,_S("100000000")), + RtoB_TEST(123.098785E00,generalSpaceForSign,11,6,'.','0',0,_S("123.098785")), + RtoB_TEST(-123.098785E00,generalSpaceForSign,11,6,'.','0',0,_S("-123.098785")), + RtoB_TEST(0.001209,generalSpaceForSign,7,4,'.','0',0,_S("0.0012")), + RtoB_TEST(0.00100987,generalSpaceForSign,8,4,'.','0',0,_S("0.00101")), + RtoB_TEST(1234.9876E-4,generalSpaceForSign,11,6,'.','0',0,_S("0.12349876")), + RtoB_TEST(-1234.9876E-4,generalSpaceForSign,11,6,'.','0',0,_S("-0.12349876")), + RtoB_TEST(1234.9876E-5,generalSpaceForSign,12,6,'.','0',0,_S("0.012349876")), + RtoB_TEST(-1234.9876E-5,generalSpaceForSign,12,6,'.','0',0,_S("-0.012349876")), + // Initially the format type is exponent, but after rounding + // it is changed to fixed + // no space for sign + RtoB_TEST(0.00099,KRealFormatGeneral,5,5,'.','0',0,_S("0.001")), + RtoB_TEST(0.00099999109,KRealFormatGeneral,6,5,'.','0',0,_S("0.001")), + // space allowed for sign + RtoB_TEST(0.00099,generalSpaceForSign,6,5,'.','0',0,_S("0.001")), + RtoB_TEST(0.00099999109,generalSpaceForSign,7,5,'.','0',0,_S("0.001")), + // Exponent format, two digit exponent only + RtoB_TEST(10000000.0,KRealFormatGeneral,7,4,'.','0',0,_S("1E+07")), + RtoB_TEST(9999999.0,KRealFormatGeneral,6,4,'.','0',0,_S("1E+07")), + RtoB_TEST(1234567890123.0,KRealFormatGeneral,12,4,'.','0',0,_S("1.234568E+12")), + RtoB_TEST(1234567.8765E12,KRealFormatGeneral,10,6,'.','0',0,_S("1.2346E+18")), + RtoB_TEST(123.098785E56,KRealFormatGeneral,12,6,'.','0',0,_S("1.230988E+58")), + RtoB_TEST(0.0000678,KRealFormatGeneral,12,4,'.','0',0,_S("6.78E-05")), + RtoB_TEST(0.0000001234,KRealFormatGeneral,12,4,'.','0',0,_S("1.234E-07")), + RtoB_TEST(.99999999E99,KRealFormatGeneral,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(1.0E99,KRealFormatGeneral,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(.0000000001,KRealFormatGeneral,12,6,'.','0',0,_S("1E-10")), + RtoB_TEST(5384795.26E-52,KRealFormatGeneral,12,6,'.','0',0,_S("5.384795E-46")), + RtoB_TEST(123.098785E-87,KRealFormatGeneral,12,6,'.','0',0,_S("1.230988E-85")), + RtoB_TEST(.99999999E-99,KRealFormatGeneral,12,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1.0E-99,KRealFormatGeneral,12,6,'.','0',0,_S("1E-99")), + // Exponent format, three-digit exponents allowed + RtoB_TEST(9999999.0,generalThreeDigitExp,6,4,'.','0',0,_S("1E+07")), + RtoB_TEST(1234567890123.0,generalThreeDigitExp,13,4,'.','0',0,_S("1234567890123")), // Leave room for three-digit exponent, so can have fixed numbers one digit longer + RtoB_TEST(1234567.8765E12,generalThreeDigitExp,11,6,'.','0',0,_S("1.23457E+18")), + RtoB_TEST(123.098785E56,generalThreeDigitExp,12,6,'.','0',0,_S("1.230988E+58")), + RtoB_TEST(.99999999E99,generalThreeDigitExp,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(1.0E99,generalThreeDigitExp,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(.0000000001,generalThreeDigitExp,12,6,'.','0',0,_S("1E-10")), + RtoB_TEST(5384795.26E-52,generalThreeDigitExp,12,6,'.','0',0,_S("5.384795E-46")), + RtoB_TEST(.99999999E-99,generalThreeDigitExp,12,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1.0E-99,generalThreeDigitExp,12,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1234.9876E-103,generalThreeDigitExp,12,15,'.','0',0,_S("1.23499E-100")), + RtoB_TEST(1234.9876E-107,generalThreeDigitExp,22,7,'.','0',0,_S("1.2349876E-104")), + RtoB_TEST(1234.9876E-109,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-106")), + RtoB_TEST(1234.9876E-110,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-107")), + RtoB_TEST(1234.9876E-200,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-197")), + RtoB_TEST(1234.9876E-300,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E-297")), + RtoB_TEST(1234.9876E97,generalThreeDigitExp,12,15,'.','0',0,_S("1.23499E+100")), + RtoB_TEST(1234.9876E100,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+103")), + RtoB_TEST(1234.9876E103,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+106")), + RtoB_TEST(1234.9876E200,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+203")), + RtoB_TEST(1234.9876E300,generalThreeDigitExp,22,15,'.','0',0,_S("1.2349876E+303")), + // + RtoB_TEST(1.2E+100,generalThreeDigitExp,6,15,'.','0',0,_S("1E+100")), + RtoB_TEST(1.2E-100,generalThreeDigitExp,6,15,'.','0',0,_S("1E-100")), + RtoB_TEST(-1.2E+100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E+100")), + RtoB_TEST(-1.2E-100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E-100")), + RtoB_TEST(1.2E+100,generalThreeDigitExp,8,15,'.','0',0,_S("1.2E+100")), + RtoB_TEST(1.2E-100,generalThreeDigitExp,8,15,'.','0',0,_S("1.2E-100")), + RtoB_TEST(-1.2E+100,generalThreeDigitExp,9,15,'.','0',0,_S("-1.2E+100")), + RtoB_TEST(-1.2E-100,generalThreeDigitExp,9,15,'.','0',0,_S("-1.2E-100")), + RtoB_TEST(1E+100,generalThreeDigitExp,6,15,'.','0',0,_S("1E+100")), + RtoB_TEST(1E-100,generalThreeDigitExp,6,15,'.','0',0,_S("1E-100")), + RtoB_TEST(-1E+100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E+100")), + RtoB_TEST(-1E-100,generalThreeDigitExp,7,15,'.','0',0,_S("-1E-100")), + RtoB_TEST(1E+100,generalThreeDigitExp,7,15,'.','0',0,_S("1E+100")), + RtoB_TEST(1E-100,generalThreeDigitExp,7,15,'.','0',0,_S("1E-100")), + RtoB_TEST(-1E+100,generalThreeDigitExp,8,15,'.','0',0,_S("-1E+100")), + RtoB_TEST(-1E-100,generalThreeDigitExp,8,15,'.','0',0,_S("-1E-100")), + // + RtoB_TEST(1.4E+308,generalThreeDigitExp,6,15,'.','0',0,_S("1E+308")), + RtoB_TEST(2.3E-308,generalThreeDigitExp,6,15,'.','0',0,_S("2E-308")), + RtoB_TEST(-1.4E+308,generalThreeDigitExp,7,15,'.','0',0,_S("-1E+308")), + RtoB_TEST(-2.3E-308,generalThreeDigitExp,7,15,'.','0',0,_S("-2E-308")), + RtoB_TEST(1.7E+308,generalThreeDigitExp,8,15,'.','0',0,_S("1.7E+308")), + RtoB_TEST(2.3E-308,generalThreeDigitExp,8,15,'.','0',0,_S("2.3E-308")), + RtoB_TEST(-1.7E+308,generalThreeDigitExp,9,15,'.','0',0,_S("-1.7E+308")), + RtoB_TEST(-2.3E-308,generalThreeDigitExp,9,15,'.','0',0,_S("-2.3E-308")), + RtoB_TEST(1.797693E+308,generalThreeDigitExp,15,15,'.','0',0,_S("1.797693E+308")), + RtoB_TEST(2.225074E-308,generalThreeDigitExp,15,15,'.','0',0,_S("2.225074E-308")), + RtoB_TEST(-1.797693E+308,generalThreeDigitExp,16,15,'.','0',0,_S("-1.797693E+308")), + RtoB_TEST(-2.225074E-308,generalThreeDigitExp,16,15,'.','0',0,_S("-2.225074E-308")) + }; + +GLDEF_D TUint size_testd=sizeof(testd); + + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_float2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_float2.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,557 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_float2.cpp +// File for T_FLOAT.CPP containing data for test2, test3 and test4 +// T_FLOAT.CPP split into header files because there seems to be too much static +// data for GCC compiler +// +// + +#include "t_float.h" + +GLDEF_D ROUND_TEST testround[]= +{ +{30,0,30}, +{1.47934,2,1.48}, +{-72.86345,3,-72.863}, +{-734.9999,0,-735.0}, +{4855.9974,1,4856.0}, +{232478.35,-1,232480.0}, +{1.0,2,1.00}, +{.0006,3,0.001}, +{0.00000012,-1,0.0}, +{4923.45,-1,4920.0}, +{0,4,0}, +{0,0,0}, +{7493650136.435,-5,7493700000.0}, +{-34.566732,7,-34.566732}, +{-36842.6570524,-2,-36800.0}, +{9,2,9.0}, +{.0000003,7,.0000003,}, +{.0000003,6,0.0}, +{476253405.342,-12,0.0}, +{.00000000000657,-3,0.0}, +{0.1,0,0}, +{9.9,0,10.0}, +{.0000008,6,.000001}, +{18.0,0,18.0}, +{9.1,0,9.0}, +{9.5,0,10.0}, +{9.9,0,10.0}, +{0.9,0,1.0}, +{0.9,1, 0.9}, +{0.99,1,1.0} +}; + +GLDEF_D TUint size_testround=sizeof(testround); + +//Added by AnnW +GLDEF_D RtoB_TEST testcalc[]= + { + RtoB_TEST(-1.234E+19,KRealFormatCalculator,20,12,'.',',',0,_S("-1.234E+19")), + // NO EXPONENT FORMAT - no triads because triad length==0 + RtoB_TEST(0,KRealFormatNoExponent,7,5,'.','0',0,_S("0")), + RtoB_TEST(0,KRealFormatNoExponent,1,1,'.','0',0,_S("0")), + RtoB_TEST(0.00,KRealFormatNoExponent,7,4,'.','0',0,_S("0")), + RtoB_TEST(3.000,KRealFormatNoExponent,7,5,'.','0',0,_S("3")), + RtoB_TEST(12.9999,KRealFormatNoExponent,6,4,'.','0',0,_S("13")), + RtoB_TEST(12.9999,KRealFormatNoExponent,4,4,'.','0',0,_S("13")), + RtoB_TEST(123456.0,KRealFormatNoExponent,6,6,'.','0',0,_S("123456")), + RtoB_TEST(123456.0,KRealFormatNoExponent,9,6,'.','0',0,_S("123456")), + RtoB_TEST(123456.0,KRealFormatNoExponent,10,8,'.',',',0,_S("123456")), + RtoB_TEST(123456.0000,KRealFormatNoExponent,16,8,'.',',',0,_S("123456")), + RtoB_TEST(123456.789,KRealFormatNoExponent,10,8,'.','0',0,_S("123456.79")), + RtoB_TEST(123456.789,KRealFormatNoExponent,11,9,'.',',',0,_S("123456.789")), + RtoB_TEST(123456.78900,KRealFormatNoExponent,13,11,'.',',',0,_S("123456.789")), + RtoB_TEST(1234567890123.00,KRealFormatNoExponent,18,16,'.',',',0,_S("1234567890123")), + RtoB_TEST(1234567890123.00,KRealFormatNoExponent,13,13,'.',',',0,_S("1234567890123")), + RtoB_TEST(1234567890123.,KRealFormatNoExponent,20,16,'.','0',0,_S("1234567890123")), + RtoB_TEST(.0453,KRealFormatNoExponent,12,10,'.','0',0,_S("0.0453")), + RtoB_TEST(.0453,KRealFormatNoExponent,12,1,'.','0',0,_S("0.05")), + RtoB_TEST(.00000876,KRealFormatNoExponent,12,10,'.','0',0,_S("0.00000876")), + RtoB_TEST(.00000876,KRealFormatNoExponent,12,8,'.','0',0,_S("0.00000876")), + RtoB_TEST(.00000876,KRealFormatNoExponent,9,7,'.','0',0,_S("0.0000088")), + RtoB_TEST(.00000876,KRealFormatNoExponent,8,6,'.','0',0,_S("0.000009")), + RtoB_TEST(.123,KRealFormatNoExponent,7,5,'.','0',0,_S("0.123")), + RtoB_TEST(.1230000,KRealFormatNoExponent,7,5,'.','0',0,_S("0.123")), + RtoB_TEST(.1230,KRealFormatNoExponent,7,5,'.','0',0,_S("0.123")), + RtoB_TEST(.1230,KRealFormatNoExponent,5,4,'.','0',0,_S("0.123")), + RtoB_TEST(.1235,KRealFormatNoExponent,6,4,'.','0',0,_S("0.1235")), + RtoB_TEST(10000.00,KRealFormatNoExponent,10,7,'.',',',0,_S("10000")), + RtoB_TEST(1.0E4,KRealFormatNoExponent,10,7,'.',',',0,_S("10000")), + RtoB_TEST(1234.9876,KRealFormatNoExponent,8,8,'.',',',0,_S("1234.988")), + RtoB_TEST(-1234.9876,KRealFormatNoExponent,9,8,'.',',',0,_S("-1234.988")), + RtoB_TEST(1234.9876E-8,KRealFormatNoExponent,8,8,'.',',',0,_S("0.000012")), + RtoB_TEST(-1234.9876E-8,KRealFormatNoExponent,8,7,'.',',',0,_S("-0.00001")), + // - no triads because flag set + RtoB_TEST(0,noExponentNoTriads,7,5,'.','0',3,_S("0")), + RtoB_TEST(3.000,noExponentNoTriads,7,5,'.','0',3,_S("3")), + RtoB_TEST(3.000,noExponentNoTriads,1,1,'.','0',3,_S("3")), + RtoB_TEST(12.9999,noExponentNoTriads,6,4,'.','0',3,_S("13")), + RtoB_TEST(123456.0,noExponentNoTriads,9,6,'.','0',0,_S("123456")), // flag set and length==0 + RtoB_TEST(123456.0,noExponentNoTriads,10,8,'.',',',3,_S("123456")), + RtoB_TEST(123456.0000,noExponentNoTriads,16,8,'.',',',3,_S("123456")), + RtoB_TEST(123456.789,noExponentNoTriads,10,8,'.','0',0,_S("123456.79")), // flag set and length==0 + RtoB_TEST(123456.789,noExponentNoTriads,9,8,'.','0',0,_S("123456.79")), // flag set and length==0 + RtoB_TEST(123456.789,noExponentNoTriads,11,9,'.',',',3,_S("123456.789")), + RtoB_TEST(123456.78900,noExponentNoTriads,13,11,'.',',',0,_S("123456.789")), // flag set and length==0 + RtoB_TEST(1234567890123.00,noExponentNoTriads,18,16,'.',',',3,_S("1234567890123")), + RtoB_TEST(1234567890123.,noExponentNoTriads,20,16,'.','0',0,_S("1234567890123")), // flag set and length==0 + RtoB_TEST(.0453,noExponentNoTriads,12,10,'.','0',3,_S("0.0453")), + RtoB_TEST(.0453,noExponentNoTriads,6,5,'.','0',3,_S("0.0453")), + RtoB_TEST(.0453,noExponentNoTriads,5,3,'.','0',3,_S("0.045")), + RtoB_TEST(.00000876,noExponentNoTriads,12,10,'.','0',3,_S("0.00000876")), + // - UK triad separators + RtoB_TEST(0.0,KRealFormatNoExponent,9,6,'.',',',3,_S("0")), + RtoB_TEST(.00568,KRealFormatNoExponent,9,3,'.',',',3,_S("0.00568")), + RtoB_TEST(12345.0,KRealFormatNoExponent,9,6,'.',',',3,_S("12,345")), + RtoB_TEST(12345.669,KRealFormatNoExponent,10,7,'.',',',3,_S("12,345.67")), + RtoB_TEST(100000.0,KRealFormatNoExponent,10,8,'.',',',3,_S("100,000")), + RtoB_TEST(99999.999,KRealFormatNoExponent,10,7,'.',',',3,_S("100,000")), + RtoB_TEST(1234567890.675,KRealFormatNoExponent,17,12,'.',',',3,_S("1,234,567,890.68")), + RtoB_TEST(1234567890.675,KRealFormatNoExponent,16,12,'.',',',3,_S("1,234,567,890.68")), + RtoB_TEST(1.0E3,KRealFormatNoExponent,10,7,'.',',',3,_S("1,000")), + RtoB_TEST(12345.669,KRealFormatNoExponent,8,7,'.',',',3,_S("12,345.7")), + // - French Triad separators + RtoB_TEST(0.0,KRealFormatNoExponent,10,7,',',' ',4,_S("0")), + RtoB_TEST(.00568,KRealFormatNoExponent,10,3,',',' ',4,_S("0,00568")), + RtoB_TEST(1.0E3,KRealFormatNoExponent,10,7,',',' ',4,_S("1000")), + RtoB_TEST(1234.0,KRealFormatNoExponent,10,7,',',' ',4,_S("1234")), + RtoB_TEST(12345.0,KRealFormatNoExponent,9,6,',',' ',4,_S("12 345")), + RtoB_TEST(12345.669,KRealFormatNoExponent,9,7,',',' ',4,_S("12 345,67")), + RtoB_TEST(100000.0,KRealFormatNoExponent,10,8,',',' ',4,_S("100 000")), + RtoB_TEST(100000.0,KRealFormatNoExponent,7,6,',',' ',4,_S("100 000")), + RtoB_TEST(99999.999,KRealFormatNoExponent,10,7,',',' ',4,_S("100 000")), + RtoB_TEST(1234567890.675,KRealFormatNoExponent,16,12,',',' ',4,_S("1 234 567 890,68")), + // '.' as triad separator, and ',' as decimal point + RtoB_TEST(1234.0,KRealFormatNoExponent,10,8,',','.',3,_S("1.234")), + RtoB_TEST(0.0,KRealFormatNoExponent,10,8,',','.',3,_S("0")), + RtoB_TEST(.00568,KRealFormatNoExponent,10,3,',','.',3,_S("0,00568")), + RtoB_TEST(1.0E3,KRealFormatNoExponent,10,6,',','.',3,_S("1.000")), + RtoB_TEST(12345.669,KRealFormatNoExponent,10,7,',','.',3,_S("12.345,67")), + RtoB_TEST(12345.669,KRealFormatNoExponent,9,7,',','.',3,_S("12.345,67")), + RtoB_TEST(12345.67,KRealFormatNoExponent,9,7,',','.',4,_S("12.345,67")), + RtoB_TEST(1234567890.675,KRealFormatNoExponent,16,12,',','.',3,_S("1.234.567.890,68")), + // Limited + RtoB_TEST(1.23456789012501,noExponentLimit,32,15,'.',',',3,_S("1.23456789013")), + RtoB_TEST(1.2345678901249,noExponentLimit,32,15,'.',',',3,_S("1.23456789012")), + RtoB_TEST(1.99999999996,noExponentLimit,32,15,'.',',',3,_S("1.99999999996")), + RtoB_TEST(1.999999999996,noExponentLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.9999999999996,noExponentLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.99999999999996,noExponentLimit,32,15,'.',',',3,_S("2")), + // Calc setting - no triads and space for sign, width=14, dp=12 + RtoB_TEST(1.234567890123,noExponentCalc,14,12,'.',',',3,_S("1.23456789012")), + RtoB_TEST(1.234567890129,noExponentCalc,14,12,'.',',',3,_S("1.23456789013")), + RtoB_TEST(-1.234567890123,noExponentCalc,14,12,'.',',',3,_S("-1.23456789012")), + RtoB_TEST(-1.234567890129,noExponentCalc,14,12,'.',',',3,_S("-1.23456789013")), + RtoB_TEST(123456789012.00,noExponentCalc,14,12,'.',',',0,_S("123456789012")), + RtoB_TEST(999999999999.00,noExponentCalc,14,12,'.',',',0,_S("999999999999")), + // + // CALCULATOR format + // No Exponent format + RtoB_TEST(1.234E-8,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000001234")), + RtoB_TEST(1.234E-7,KRealFormatCalculator,20,12,'.',',',0,_S("0.0000001234")), + RtoB_TEST(1.234E-6,KRealFormatCalculator,20,12,'.',',',0,_S("0.000001234")), + RtoB_TEST(1.234E-3,KRealFormatCalculator,20,12,'.',',',0,_S("0.001234")), + RtoB_TEST(1.234E-2,KRealFormatCalculator,20,12,'.',',',0,_S("0.01234")), + RtoB_TEST(1E-11,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000001")), + RtoB_TEST(1.2E-10,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000012")), + RtoB_TEST(1.23E-9,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000123")), + RtoB_TEST(1.234E-8,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000001234")), + RtoB_TEST(1.2345E-7,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000012345")), + RtoB_TEST(1.23456E-6,KRealFormatCalculator,20,12,'.',',',0,_S("0.00000123456")), + RtoB_TEST(1.234567E-5,KRealFormatCalculator,20,12,'.',',',0,_S("0.00001234567")), + RtoB_TEST(1.2345678E-4,KRealFormatCalculator,20,12,'.',',',0,_S("0.00012345678")), + RtoB_TEST(1.23456789E-3,KRealFormatCalculator,20,12,'.',',',0,_S("0.00123456789")), + RtoB_TEST(1.234567891E-2,KRealFormatCalculator,20,12,'.',',',0,_S("0.01234567891")), + RtoB_TEST(1.2345678912E-1,KRealFormatCalculator,20,12,'.',',',0,_S("0.12345678912")), + RtoB_TEST(1.23456789123E0,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789123")), + // + RtoB_TEST(0.000,KRealFormatCalculator,10,4,'.','0',0,_S("0")), + RtoB_TEST(98.000,KRealFormatCalculator,10,4,'.','0',0,_S("98")), + RtoB_TEST(12345.6700009,KRealFormatCalculator,17,11,'.','0',3,_S("12345.670001")), + RtoB_TEST(1.E2,KRealFormatCalculator,10,4,'.','0',0,_S("100")), + RtoB_TEST(1234.0,KRealFormatCalculator,10,4,'.','0',3,_S("1234")), + RtoB_TEST(1.2345,KRealFormatCalculator,10,3,'.','0',0,_S("1.23")), + RtoB_TEST(1.235,KRealFormatCalculator,9,3,'.','0',0,_S("1.24")), + RtoB_TEST(98765.0,KRealFormatCalculator,13,6,'.','0',0,_S("98765")), + RtoB_TEST(100000000.0,KRealFormatCalculator,15,9,'.','0',0,_S("100000000")), + RtoB_TEST(123.098785E00,KRealFormatCalculator,15,9,'.','0',0,_S("123.098785")), + RtoB_TEST(-123.098785E00,KRealFormatCalculator,15,8,'.','0',0,_S("-123.09879")), + RtoB_TEST(1234.9876E-4,KRealFormatCalculator,15,9,'.','0',0,_S("0.12349876")), + RtoB_TEST(1234.9876E-5,KRealFormatCalculator,16,10,'.','0',0,_S("0.012349876")), + RtoB_TEST(0.0099,KRealFormatCalculator,11,5,'.','0',0,_S("0.0099")), + RtoB_TEST(0.099,KRealFormatCalculator,10,4,'.','0',0,_S("0.099")), + RtoB_TEST(0.001209,KRealFormatCalculator,15,7,'.','0',0,_S("0.001209")), + RtoB_TEST(0.00100987,KRealFormatCalculator,15,9,'.','0',0,_S("0.00100987")), + RtoB_TEST(0.678,KRealFormatCalculator,10,4,'.','0',0,_S("0.678")), + RtoB_TEST(99999.0,KRealFormatCalculator,12,6,'.','0',0,_S("99999")), + RtoB_TEST(12345678901234567890.0,KRealFormatCalculator,20,12,'.','0',0,_S("1.23456789012E+19")), + RtoB_TEST(1234567890123.0,KRealFormatCalculator,13,7,'.','0',0,_S("1.234568E+12")), + // Initially the format type is exponent, but after rounding it is changed to fixed + RtoB_TEST(0.00099999,KRealFormatCalculator,10,4,'.','0',0,_S("0.001")), + // Exponent format, two digit exponent only + RtoB_TEST(1.23412341234E-11,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-11")), + RtoB_TEST(1.23412341234E-8,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-08")), + RtoB_TEST(1.23412341234E-7,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")), + RtoB_TEST(1.23412341234E-6,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-06")), + RtoB_TEST(1.23412341234E-3,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-03")), + RtoB_TEST(1.23412341234E-2,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-02")), + RtoB_TEST(1.23412341234123E-7,KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")), + RtoB_TEST(1.234E-11,KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-11")), + RtoB_TEST(1.234E-9,KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-09")), + // + RtoB_TEST(10000000.0,KRealFormatCalculator,13,7,'.','0',0,_S("1E+07")), + RtoB_TEST(0.001209,KRealFormatCalculator,11,5,'.','0',0,_S("1.209E-03")), + RtoB_TEST(0.00100987,KRealFormatCalculator,12,6,'.','0',0,_S("1.00987E-03")), + RtoB_TEST(0.00099999109,KRealFormatCalculator,13,7,'.','0',0,_S("9.999911E-04")), + RtoB_TEST(0.0000678,KRealFormatCalculator,9,3,'.','0',0,_S("6.78E-05")), + RtoB_TEST(1234567.8765E12,KRealFormatCalculator,11,5,'.','0',0,_S("1.2346E+18")), + RtoB_TEST(123.098785E56,KRealFormatCalculator,13,7,'.','0',0,_S("1.230988E+58")), + RtoB_TEST(0.0000001234,KRealFormatCalculator,10,4,'.','0',0,_S("1.234E-07")), + RtoB_TEST(.99999999E99,KRealFormatCalculator,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(1.0E99,KRealFormatCalculator,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(.00000000001,KRealFormatCalculator,12,6,'.','0',0,_S("1E-11")), + RtoB_TEST(5384795.26E-52,KRealFormatCalculator,13,7,'.','0',0,_S("5.384795E-46")), + RtoB_TEST(123.098785E-87,KRealFormatCalculator,13,7,'.','0',0,_S("1.230988E-85")), + RtoB_TEST(.99999999E-99,KRealFormatCalculator,12,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1.0E-99,KRealFormatCalculator,12,6,'.','0',0,_S("1E-99")), + // + RtoB_TEST(1E-12,KRealFormatCalculator,20,12,'.',',',0,_S("1E-12")), + RtoB_TEST(1.2E-11,KRealFormatCalculator,20,12,'.',',',0,_S("1.2E-11")), + RtoB_TEST(1.23E-10,KRealFormatCalculator,20,12,'.',',',0,_S("1.23E-10")), + RtoB_TEST(1.234E-9,KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-09")), + RtoB_TEST(1.2345E-8,KRealFormatCalculator,20,12,'.',',',0,_S("1.2345E-08")), + RtoB_TEST(1.23456E-7,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456E-07")), + RtoB_TEST(1.234567E-6,KRealFormatCalculator,20,12,'.',',',0,_S("1.234567E-06")), + RtoB_TEST(1.2345678E-5,KRealFormatCalculator,20,12,'.',',',0,_S("1.2345678E-05")), + RtoB_TEST(1.23456789E-4,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789E-04")), + RtoB_TEST(1.234567891E-3,KRealFormatCalculator,20,12,'.',',',0,_S("1.234567891E-03")), + RtoB_TEST(1.2345678912E-2,KRealFormatCalculator,20,12,'.',',',0,_S("1.2345678912E-02")), + RtoB_TEST(1.23456789123E-1,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789123E-01")), + RtoB_TEST(1.234567891234,KRealFormatCalculator,20,12,'.',',',0,_S("1.23456789123")), + // Exponent format, three-digit exponents allowed + RtoB_TEST(9999999.0,calculatorThreeDigitExp,11,4,'.','0',0,_S("1E+07")), + RtoB_TEST(1234567890123.0,calculatorThreeDigitExp,20,13,'.','0',0,_S("1234567890123")), // Leave room for three-digit exponent, so can have fixed numbers one digit longer + RtoB_TEST(1234567.8765E12,calculatorThreeDigitExp,13,6,'.','0',0,_S("1.23457E+18")), + RtoB_TEST(123.098785E56,calculatorThreeDigitExp,14,7,'.','0',0,_S("1.230988E+58")), + RtoB_TEST(.99999999E99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E+99")), + RtoB_TEST(1.0E99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E+99")), + RtoB_TEST(.000000000001,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E-12")), + RtoB_TEST(5384795.26E-52,calculatorThreeDigitExp,14,7,'.','0',0,_S("5.384795E-46")), + RtoB_TEST(.99999999E-99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1.0E-99,calculatorThreeDigitExp,13,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1234.9876E-103,calculatorThreeDigitExp,13,6,'.','0',0,_S("1.23499E-100")), + RtoB_TEST(1234.9876E-107,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E-104")), + RtoB_TEST(1234.9876E-109,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E-106")), + RtoB_TEST(1234.9876E-110,calculatorThreeDigitExp,16,9,'.','0',0,_S("1.2349876E-107")), + RtoB_TEST(1234.9876E-200,calculatorThreeDigitExp,17,10,'.','0',0,_S("1.2349876E-197")), + RtoB_TEST(1234.9876E-300,calculatorThreeDigitExp,17,10,'.','0',0,_S("1.2349876E-297")), + RtoB_TEST(1234.9876E97,calculatorThreeDigitExp,13,6,'.','0',0,_S("1.23499E+100")), + RtoB_TEST(1234.9876E100,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E+103")), + RtoB_TEST(1234.9876E103,calculatorThreeDigitExp,15,8,'.','0',0,_S("1.2349876E+106")), + RtoB_TEST(1234.9876E200,calculatorThreeDigitExp,16,9,'.','0',0,_S("1.2349876E+203")), + RtoB_TEST(1234.9876E300,calculatorThreeDigitExp,17,10,'.','0',0,_S("1.2349876E+303")), + // + RtoB_TEST(1.2E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E+100")), + RtoB_TEST(1.2E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E-100")), + RtoB_TEST(-1.2E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E+100")), + RtoB_TEST(-1.2E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E-100")), + RtoB_TEST(1.2E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1.2E+100")), + RtoB_TEST(1.2E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1.2E-100")), + RtoB_TEST(-1.2E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1.2E+100")), + RtoB_TEST(-1.2E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1.2E-100")), + RtoB_TEST(1E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1E+100")), + RtoB_TEST(1E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("1E-100")), + RtoB_TEST(-1E+100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1E+100")), + RtoB_TEST(-1E-100,calculatorThreeDigitExp,9,2,'.','0',0,_S("-1E-100")), + RtoB_TEST(1E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E+100")), + RtoB_TEST(1E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E-100")), + RtoB_TEST(-1E+100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E+100")), + RtoB_TEST(-1E-100,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E-100")), + // + RtoB_TEST(1.4E+308,calculatorThreeDigitExp,8,1,'.','0',0,_S("1E+308")), + RtoB_TEST(2.3E-308,calculatorThreeDigitExp,8,1,'.','0',0,_S("2E-308")), + RtoB_TEST(-1.4E+308,calculatorThreeDigitExp,8,1,'.','0',0,_S("-1E+308")), + RtoB_TEST(-2.3E-308,calculatorThreeDigitExp,8,1,'.','0',0,_S("-2E-308")), + RtoB_TEST(1.7E+308,calculatorThreeDigitExp,9,2,'.','0',0,_S("1.7E+308")), + RtoB_TEST(2.3E-308,calculatorThreeDigitExp,10,3,'.','0',0,_S("2.3E-308")), + RtoB_TEST(-1.7E+308,calculatorThreeDigitExp,10,3,'.','0',0,_S("-1.7E+308")), + RtoB_TEST(-2.3E-308,calculatorThreeDigitExp,9,2,'.','0',0,_S("-2.3E-308")), + RtoB_TEST(1.797693E+308,calculatorThreeDigitExp,15,7,'.','0',0,_S("1.797693E+308")), + RtoB_TEST(2.225074E-308,calculatorThreeDigitExp,16,8,'.','0',0,_S("2.225074E-308")), + RtoB_TEST(-1.797693E+308,calculatorThreeDigitExp,16,8,'.','0',0,_S("-1.797693E+308")), + RtoB_TEST(-2.225074E-308,calculatorThreeDigitExp,16,7,'.','0',0,_S("-2.225074E-308")), + // Limited + RtoB_TEST(1.23456789012501E24,calculatorLimit,21,15,'.',',',3,_S("1.23456789013E+24")), + RtoB_TEST(1.2345678901249E+97,calculatorLimit,32,15,'.',',',3,_S("1.23456789012E+97")), + RtoB_TEST(1.99999999996E-19,calculatorLimit,21,15,'.',',',3,_S("1.99999999996E-19")), + RtoB_TEST(1.999999999996E-53,calculatorLimit,32,15,'.',',',3,_S("2E-53")), + RtoB_TEST(1.9999999999996E+46,calculatorLimit,32,15,'.',',',3,_S("2E+46")), + // + RtoB_TEST(1.23456789012501,calculatorLimit,32,15,'.',',',3,_S("1.23456789013")), + RtoB_TEST(1.2345678901249,calculatorLimit,32,15,'.',',',3,_S("1.23456789012")), + RtoB_TEST(1.99999999996,calculatorLimit,32,15,'.',',',3,_S("1.99999999996")), + RtoB_TEST(1.999999999996,calculatorLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.9999999999996,calculatorLimit,32,15,'.',',',3,_S("2")), + RtoB_TEST(1.99999999999996,calculatorLimit,32,15,'.',',',3,_S("2")), + // + RtoB_TEST(1.23456789012501E24,calculatorLimitAndThreeDigExp,22,15,'.',',',3,_S("1.23456789013E+24")), + RtoB_TEST(1.2345678901249E+197,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("1.23456789012E+197")), + RtoB_TEST(1.99999999996E-19,calculatorLimitAndThreeDigExp,22,15,'.',',',3,_S("1.99999999996E-19")), + RtoB_TEST(1.999999999996E-153,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("2E-153")), + RtoB_TEST(1.9999999999996E+246,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("2E+246")), + RtoB_TEST(1.99999999999996E-302,calculatorLimitAndThreeDigExp,32,15,'.',',',3,_S("2E-302")), + + // new - exponent with significant figures + RtoB_TEST(10000000.0,exponentSigFigs,13,7,'.','0',0,_S("1E+07")), + RtoB_TEST(9999999.0,exponentSigFigs,12,6,'.','0',0,_S("1E+07")), + RtoB_TEST(1234567890123.0,exponentSigFigs,13,7,'.','0',0,_S("1.234568E+12")), + RtoB_TEST(1234567.8765E12,exponentSigFigs,11,5,'.','0',0,_S("1.2346E+18")), + RtoB_TEST(123.098785E56,exponentSigFigs,13,7,'.','0',0,_S("1.230988E+58")), + RtoB_TEST(0.0000678,exponentSigFigs,9,3,'.','0',0,_S("6.78E-05")), + RtoB_TEST(0.0000001234,exponentSigFigs,10,4,'.','0',0,_S("1.234E-07")), + RtoB_TEST(.99999999E99,exponentSigFigs,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(1.0E99,exponentSigFigs,12,6,'.','0',0,_S("1E+99")), + RtoB_TEST(.0000000001,exponentSigFigs,12,6,'.','0',0,_S("1E-10")), + RtoB_TEST(5384795.26E-52,exponentSigFigs,13,7,'.','0',0,_S("5.384795E-46")), + RtoB_TEST(123.098785E-87,exponentSigFigs,13,7,'.','0',0,_S("1.230988E-85")), + RtoB_TEST(.99999999E-99,exponentSigFigs,12,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1.0E-99,exponentSigFigs,12,6,'.','0',0,_S("1E-99")), + // three-digit exponents allowed + RtoB_TEST(9999999.0,exponentThreeDigitExpAndSigFigs,11,4,'.','0',0,_S("1E+07")), + RtoB_TEST(1234567.8765E12,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1.23457E+18")), + RtoB_TEST(123.098785E56,exponentThreeDigitExpAndSigFigs,14,7,'.','0',0,_S("1.230988E+58")), + RtoB_TEST(.99999999E99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E+99")), + RtoB_TEST(1.0E99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E+99")), + RtoB_TEST(.0000000001,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E-10")), + RtoB_TEST(5384795.26E-52,exponentThreeDigitExpAndSigFigs,14,7,'.','0',0,_S("5.384795E-46")), + RtoB_TEST(.99999999E-99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1.0E-99,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1E-99")), + RtoB_TEST(1234.9876E-103,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1.23499E-100")), + RtoB_TEST(1234.9876E-107,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E-104")), + RtoB_TEST(1234.9876E-109,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E-106")), + RtoB_TEST(1234.9876E-110,exponentThreeDigitExpAndSigFigs,16,9,'.','0',0,_S("1.2349876E-107")), + RtoB_TEST(1234.9876E-200,exponentThreeDigitExpAndSigFigs,17,10,'.','0',0,_S("1.2349876E-197")), + RtoB_TEST(1234.9876E-300,exponentThreeDigitExpAndSigFigs,17,10,'.','0',0,_S("1.2349876E-297")), + RtoB_TEST(1234.9876E97,exponentThreeDigitExpAndSigFigs,13,6,'.','0',0,_S("1.23499E+100")), + RtoB_TEST(1234.9876E100,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E+103")), + RtoB_TEST(1234.9876E103,exponentThreeDigitExpAndSigFigs,15,8,'.','0',0,_S("1.2349876E+106")), + RtoB_TEST(1234.9876E200,exponentThreeDigitExpAndSigFigs,16,9,'.','0',0,_S("1.2349876E+203")), + RtoB_TEST(1234.9876E300,exponentThreeDigitExpAndSigFigs,17,10,'.','0',0,_S("1.2349876E+303")) + }; + +GLDEF_D TUint size_testcalc=sizeof(testcalc); + +GLDEF_D ERR_TEST testerr[]= + { + // FIXED - special values + ERR_TEST(KPosInfTReal64,fixedNoTriads,32,4,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(KNegInfTReal64,fixedNoTriads,32,4,'.','0',0,_S("-Inf"),KErrOverflow), + ERR_TEST(KNaNTReal64,fixedNoTriads,32,4,'.','0',0,_S("NaN"),KErrArgument), + ERR_TEST(K1EMinus324Real64,fixedNoTriads,32,4,'.','0',0,_S("0.0000"),6), + // - no space for sign and no triads - does not fit + ERR_TEST(1234.9876E95,fixedNoTriads,12,0,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(-1234.9876E95,fixedNoTriads,12,0,'.','0',0,_S("-Inf"),KErrOverflow), + ERR_TEST(1234.9876,fixedNoTriads,8,4,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E-8,fixedNoTriads,3,7,'.','0',0), + ERR_TEST(1234.9876E-8,fixedNoTriads,8,7,'.','0',0), + // - no space for sign and triads - does not fit + ERR_TEST(1234.9876E-8,KRealFormatFixed,10,10,'.','0',0), + ERR_TEST(1234.9876E-107,KRealFormatFixed,12,11,'.','0',0), + ERR_TEST(1234.9876E-109,KRealFormatFixed,12,11,'.','0',0), + ERR_TEST(1234.9876E-110,KRealFormatFixed,12,11,'.','0',0), + ERR_TEST(1234.9876E-200,KRealFormatFixed,12,11,'.','0',0), + ERR_TEST(1234.9876E-300,KRealFormatFixed,12,11,'.','0',0), + // + ERR_TEST(1234.9876E4,KRealFormatFixed,8,0,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E4,KRealFormatFixed,9,0,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E95,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E96,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E97,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E100,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E103,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E200,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E300,KRealFormatFixed,12,6,'.','0',0,_S("Inf"),KErrOverflow), + // - space for sign and no triads - does not fit + ERR_TEST(1234.9876,fixedSpaceForSign,9,4,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E-8,fixedSpaceForSign,11,9,'.','0',0), + // - space for sign and triads - does not fit + ERR_TEST(1234.9876E4,fixedTriadsAndSign,9,0,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E4,fixedTriadsAndSign,10,0,'.',',',3,_S("Inf"),KErrOverflow), + // - no error, returns length + ERR_TEST(1234.9876,fixedNoTriads,9,4,'.','0',0,_S("1234.9876"),9), + ERR_TEST(1234.9876E4,KRealFormatFixed,11,0,'.',',',3,_S("12,349,876"),10), + ERR_TEST(1234.9876,fixedSpaceForSign,10,4,'.','0',0,_S("1234.9876"),9), + ERR_TEST(-1234.9876,fixedSpaceForSign,10,4,'.','0',0,_S("-1234.9876"),10), + ERR_TEST(1234.9876E4,fixedTriadsAndSign,12,0,'.',',',3,_S("12,349,876"),10), + ERR_TEST(1234.9876E-101,KRealFormatFixed,12,6,'.','0',0,_S("0.000000"),8), + ERR_TEST(1234.9876E-102,KRealFormatFixed,12,6,'.','0',0,_S("0.000000"),8), + ERR_TEST(1234.9876E-103,KRealFormatFixed,12,6,'.','0',0,_S("0.000000"),8), + + // EXPONENT - special values + ERR_TEST(KPosInfTReal64,KRealFormatExponent,32,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(KNegInfTReal64,KRealFormatExponent,32,6,'.','0',0,_S("-Inf"),KErrOverflow), + ERR_TEST(KNaNTReal64,KRealFormatExponent,32,6,'.','0',0,_S("NaN"),KErrArgument), + ERR_TEST(K5EMinus324Real64,exponentThreeDigitExp,32,6,'.',',',0,_S("4.940656E-324"),13), + ERR_TEST(K1EMinus324Real64,KRealFormatExponent,32,6,'.','0',0,_S("0.000000E+00"),12), + // - only two digits allowed - underflow + ERR_TEST(1234.9876E-103,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-110,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-200,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-300,KRealFormatExponent,12,6,'.','0',0,_S("0"),KErrUnderflow), + // - overflow + ERR_TEST(1234.9876E97,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(-1234.9876E97,KRealFormatExponent,12,6,'.','0',0,_S("-Inf"),KErrOverflow), + ERR_TEST(1234.9876E100,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E200,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E300,KRealFormatExponent,12,6,'.','0',0,_S("Inf"),KErrOverflow), + // - does not fit + ERR_TEST(1234.9876E24,KRealFormatExponent,12,7,'.','0',0), + ERR_TEST(1234.9876E95,KRealFormatExponent,6,3,'.','0',0), + ERR_TEST(1234.9876E-76,KRealFormatExponent,8,7,'.','0',0), + ERR_TEST(1234.9876E-98,KRealFormatExponent,9,4,'.','0',0), + // - three digits allowed - does not fit + ERR_TEST(1234.9876E240,exponentThreeDigitExp,13,7,'.','0',0), + ERR_TEST(1234.9876E98,exponentThreeDigitExp,6,1,'.','0',0), + ERR_TEST(1234.9876E-160,exponentThreeDigitExp,9,7,'.','0',0), + ERR_TEST(1234.9876E-98,exponentThreeDigitExp,9,4,'.','0',0), + // - two digit exponent - no error, returns length + ERR_TEST(1234.9876E95,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E+98"),12), + ERR_TEST(1234.9876E96,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E+99"),12), + ERR_TEST(1234.9876E-101,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E-98"),12), + ERR_TEST(1234.9876E-102,KRealFormatExponent,12,6,'.','0',0,_S("1.234988E-99"),12), + // - three-digit exponent - no error, returns length + ERR_TEST(1234.9876E125,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E+128"),13), + ERR_TEST(1234.9876E126,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E+129"),13), + ERR_TEST(1234.9876E-139,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E-136"),13), + ERR_TEST(1234.9876E-142,exponentThreeDigitExp,13,6,'.','0',0,_S("1.234988E-139"),13), + + // GENERAL - only two-digit exponents allowed - underflow + ERR_TEST(1234.9876E-103,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-107,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-200,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-300,KRealFormatGeneral,12,6,'.','0',0,_S("0"),KErrUnderflow), + // - overflow + ERR_TEST(1234.9876E97,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E100,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E200,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E300,KRealFormatGeneral,12,6,'.','0',0,_S("Inf"),KErrOverflow), + // - space for sign needed + ERR_TEST(1,generalSpaceForSign,1,0,'.',',',0), + // - no errors, returns length + ERR_TEST(1234.9876E-101,KRealFormatGeneral,12,6,'.','0',0,_S("1.234988E-98"),12), + ERR_TEST(1234.9876E-104,generalThreeDigitExp,13,6,'.','0',0,_S("1.234988E-101"),13), + ERR_TEST(1234.9876E95,KRealFormatGeneral,12,6,'.','0',0,_S("1.234988E+98"),12), + ERR_TEST(1234.9876E99,generalThreeDigitExp,13,6,'.','0',0,_S("1.234988E+102"),13), + ERR_TEST(1234.9876,generalSpaceForSign,10,4,'.','0',0,_S("1234.9876"),9), + ERR_TEST(-1234.9876,generalSpaceForSign,10,4,'.','0',0,_S("-1234.9876"),10), + + // NO EXPONENT - not enough space + ERR_TEST(1234.9876E95,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E103,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E200,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E300,KRealFormatNoExponent,12,10,'.','0',0,_S("Inf"),KErrOverflow), + // + ERR_TEST(1234.9876E-101,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-104,KRealFormatNoExponent,13,11,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-107,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-109,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-110,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-200,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-300,KRealFormatNoExponent,12,10,'.','0',0,_S("0"),KErrUnderflow), + // + ERR_TEST(.00568,KRealFormatNoExponent,3,3,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(12345.0,KRealFormatNoExponent,5,5,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(100000.0,KRealFormatNoExponent,6,6,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(100000.0,KRealFormatNoExponent,6,5,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(99999.999,KRealFormatNoExponent,6,6,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(1234567890.675,KRealFormatNoExponent,12,12,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(1234567890.675,KRealFormatNoExponent,12,9,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(1.0E3,KRealFormatNoExponent,4,4,'.',',',3,_S("Inf"),KErrOverflow), + ERR_TEST(1234567890120.00,noExponentCalc,14,12,'.',',',0,_S("Inf"),KErrOverflow), + ERR_TEST(999999999999.90,noExponentCalc,14,12,'.',',',0,_S("Inf"),KErrOverflow), + // + ERR_TEST(1234.9876,KRealFormatNoExponent,9,8,'.','0',0,_S("1234.9876"),9), + ERR_TEST(1234.9876,KRealFormatNoExponent,12,12,'.','0',0,_S("1234.9876"),9), + ERR_TEST(-1234.9876,KRealFormatNoExponent,10,10,'.','0',0,_S("-1234.9876"),10), + ERR_TEST(-1234.9876,KRealFormatNoExponent,12,11,'.','0',0,_S("-1234.9876"),10), + // + //CALCULATOR - only two-digit exponents allowed - underflow + ERR_TEST(1234.9876E-103,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-107,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-200,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow), + ERR_TEST(1234.9876E-300,KRealFormatCalculator,12,6,'.','0',0,_S("0"),KErrUnderflow), + // - overflow + ERR_TEST(1234.9876E97,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E100,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E200,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow), + ERR_TEST(1234.9876E300,KRealFormatCalculator,12,6,'.','0',0,_S("Inf"),KErrOverflow), + // - does not fit + ERR_TEST(1234.9876E24,KRealFormatCalculator,12,7,'.','0',0), + ERR_TEST(1234.9876E95,KRealFormatCalculator,6,2,'.','0',0), + ERR_TEST(1234.9876E-76,KRealFormatCalculator,9,6,'.','0',0), + ERR_TEST(1234.9876E-98,KRealFormatCalculator,6,4,'.','0',0), + ERR_TEST(-1234.9876E24,KRealFormatCalculator,9,8,'.','0',0), + ERR_TEST(-1234.9876E95,KRealFormatCalculator,4,2,'.','0',0), + ERR_TEST(-1234.9876E-76,KRealFormatCalculator,10,7,'.','0',0), + ERR_TEST(-1234.9876E-98,KRealFormatCalculator,9,4,'.','0',0), + // - three digits allowed - does not fit + ERR_TEST(1234.9876E240,calculatorThreeDigitExp,13,7,'.','0',0), + ERR_TEST(1234.9876E98,calculatorThreeDigitExp,6,1,'.','0',0), + ERR_TEST(1234.9876E-160,calculatorThreeDigitExp,9,7,'.','0',0), + ERR_TEST(1234.9876E-98,calculatorThreeDigitExp,10,6,'.','0',0), + ERR_TEST(-1234.9876E240,calculatorThreeDigitExp,11,8,'.','0',0), + ERR_TEST(-1234.9876E98,calculatorThreeDigitExp,7,1,'.','0',0), + ERR_TEST(-1234.9876E-160,calculatorThreeDigitExp,10,7,'.','0',0), + ERR_TEST(-1234.9876E-98,calculatorThreeDigitExp,11,6,'.','0',0), + // + ERR_TEST(1234.9876E24,calculatorThreeDigitExp,13,7,'.','0',0), + ERR_TEST(1234.9876E95,calculatorThreeDigitExp,9,7,'.','0',0), + ERR_TEST(1234.9876E-76,calculatorThreeDigitExp,12,6,'.','0',0), + ERR_TEST(1234.9876E-98,calculatorThreeDigitExp,6,4,'.','0',0), + ERR_TEST(-1234.9876E24,calculatorThreeDigitExp,9,8,'.','0',0), + ERR_TEST(-1234.9876E95,calculatorThreeDigitExp,8,2,'.','0',0), + ERR_TEST(-1234.9876E-76,calculatorThreeDigitExp,10,7,'.','0',0), + ERR_TEST(-1234.9876E-98,calculatorThreeDigitExp,10,4,'.','0',0) + }; + +GLDEF_D TUint size_testerr=sizeof(testerr); + + +GLDEF_D DtoR_ERR_TEST testerr2[]= + { + DtoR_ERR_TEST(KNullDesC,KErrGeneral), + DtoR_ERR_TEST(_L("E-20"),KErrGeneral), + DtoR_ERR_TEST(_L("1.#INF"),KErrNone), + DtoR_ERR_TEST(_L("1.#NAN"),KErrNone), + DtoR_ERR_TEST(_L("c.fgh"),KErrGeneral), + DtoR_ERR_TEST(_L("xyz"),KErrGeneral), + DtoR_ERR_TEST(_L("1.0E"),KErrNone), + DtoR_ERR_TEST(_L("1.0E2147483648"),KErrOverflow), + DtoR_ERR_TEST(_L("1.234567801234567890E+308"),KErrNone), + DtoR_ERR_TEST(_L("3.456789012345678901E-308"),KErrNone), + DtoR_ERR_TEST(_L("1.797693134862316E+308"),KErrOverflow), + DtoR_ERR_TEST(_L("2.225073858507201E-308"),KErrNone), + DtoR_ERR_TEST(_L("3.0E+308"),KErrOverflow), + DtoR_ERR_TEST(_L("1.0E-308"),KErrNone), + DtoR_ERR_TEST(_L("3.0E310"),KErrOverflow), + DtoR_ERR_TEST(_L("3.0E-310"),KErrNone), + DtoR_ERR_TEST(_L("1.0E-325"),KErrUnderflow), + DtoR_ERR_TEST(_L("2.0E-400"),KErrUnderflow), + DtoR_ERR_TEST(_L("2.0E+400"),KErrOverflow), + }; + +GLDEF_D TUint size_testerr2=sizeof(testerr2); + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_float3.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_float3.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,330 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_float3.cpp +// File for T_FLOAT.CPP containing data for test5, test6, test7 and test8 +// T_FLOAT.CPP split into header files because there seems to be too much static data for GCC +// compiler +// +// + +#include "t_float.h" +#include + +GLDEF_D DtoR_TEST64 testd2[]= + { + DtoR_TEST64(_L("1.000000000000000000000001"),1.0), + DtoR_TEST64(_L("1.00000000000000000000001"),1.0), + DtoR_TEST64(_L("1.0000000000000000000001"),1.0), + DtoR_TEST64(_L("1.000000000000000000001"),1.0), + DtoR_TEST64(_L("1.0000000000000000001"),1.0), + DtoR_TEST64(_L("1.000000000000000001"),1.0), + DtoR_TEST64(_L("1.000000000000001"),1.000000000000001), + DtoR_TEST64(_L("1.0000000000000001E+10"),1.0E+10), + DtoR_TEST64(_L("1.0000000000000001E-10"),1.0E-10), + DtoR_TEST64(_L("1.00000000000001E8"),1.00000000000001E8), + DtoR_TEST64(_L("1.00000000000001E-8"),1.00000000000001E-8), + // + DtoR_TEST64(_L("1.23412341234e-7"),1.23412341234E-7), + DtoR_TEST64(_L("0.000000123412341234"),1.23412341234E-7), + DtoR_TEST64(_L("0.0000000123412341234"),1.23412341234E-8), + // + DtoR_TEST64(_L("0.29"),0.29), + DtoR_TEST64(_L("0.2900"),0.2900), + DtoR_TEST64(_L("0.2900"),0.29), + // + DtoR_TEST64(_L("0.0"),0.0), + DtoR_TEST64(_L("1.0"),1.0), + DtoR_TEST64(_L("10.0"),10.0), + DtoR_TEST64(_L("100.0"),100.0), + DtoR_TEST64(_L("1000.0"),1000.0), + DtoR_TEST64(_L("0.1"),0.1), + DtoR_TEST64(_L("0.01"),0.01), + DtoR_TEST64(_L("0.001"),0.001), + DtoR_TEST64(_L("0.0001"),0.0001), + // + DtoR_TEST64(_L("9.99999999999999999"),9.99999999999999999), + DtoR_TEST64(_L("9.99999999999999"),9.99999999999999), + DtoR_TEST64(_L("9.9999999999999"),9.9999999999999), + DtoR_TEST64(_L("9.999999999"),9.999999999), + // + DtoR_TEST64(_L(".015"),0.015), + DtoR_TEST64(_L("1.00E-15"),1.0E-15), + DtoR_TEST64(_L("1.0E-07"),1.00E-7), + // + DtoR_TEST64(_L("1024.0"),1024.0), + DtoR_TEST64(_L("1E10"),1E10), + DtoR_TEST64(_L("1E20"),1E20), + DtoR_TEST64(_L("1E30"),1E30), + DtoR_TEST64(_L("1E40"),1E40), + DtoR_TEST64(_L("1E50"),1E50), +// DtoR_TEST64(_L("1E60"),1E60), + DtoR_TEST64(_L("1E70"),1E70), + DtoR_TEST64(_L("1E80"),1E80), + DtoR_TEST64(_L("1E90"),1E90), + DtoR_TEST64(_L("1E98"),1E98), +// DtoR_TEST64(_L("1E99"),1E99), + DtoR_TEST64(_L("1E100"),1E100), + DtoR_TEST64(_L("1E200"),1E200), + DtoR_TEST64(_L("1E300"),1E300), + DtoR_TEST64(_L("1.7976931348623157E+308"),1.7976931348623157E+308), + // + DtoR_TEST64(_L("-1024.0"),-1024.0), + DtoR_TEST64(_L("-1E10"),-1E10), + DtoR_TEST64(_L("-1E20"),-1E20), + DtoR_TEST64(_L("-1E30"),-1E30), + DtoR_TEST64(_L("-1E40"),-1E40), + DtoR_TEST64(_L("-1E50"),-1E50), +// DtoR_TEST64(_L("-1E60"),-1E60), + DtoR_TEST64(_L("-1E70"),-1E70), + DtoR_TEST64(_L("-1E80"),-1E80), + DtoR_TEST64(_L("-1E90"),-1E90), + DtoR_TEST64(_L("-1E98"),-1E98), +// DtoR_TEST64(_L("-1E99"),-1E99), + DtoR_TEST64(_L("-1E100"),-1E100), + DtoR_TEST64(_L("-1E200"),-1E200), + DtoR_TEST64(_L("-1E300"),-1E300), + DtoR_TEST64(_L("-1.7976931348623157E+308"),-1.7976931348623157E+308), + // + DtoR_TEST64(_L("123456789012345.0"),123456789012345.0), + DtoR_TEST64(_L("12345678901234567.0"),12345678901234568.0), // 54 bits. Check we are rounding up + DtoR_TEST64(_L("1.23456789012345"),1.23456789012345), + DtoR_TEST64(_L("1.2345678901234567"),1.2345678901234567), + DtoR_TEST64(_L("1.2345678901234567890"),1.2345678901234567890), +// DtoR_TEST64(_L("1.23456789012345E+38"),1.23456789012345E+38), + DtoR_TEST64(_L("1.2345678901234567E+38"),1.2345678901234567E+38), + DtoR_TEST64(_L("1.23456789012345E+299"),1.23456789012345E+299), +// DtoR_TEST64(_L("1.2345678901234567E+299"),1.2345678901234567E+299), +// DtoR_TEST64(_L("1.23456789012345E-75"),1.23456789012345E-75), + DtoR_TEST64(_L("1.2345678901234567E-75"),1.2345678901234567E-75), + DtoR_TEST64(_L("1.23456789012345E-146"),1.23456789012345E-146), +// DtoR_TEST64(_L("1.2345678901234567E-146"),1.2345678901234567E-146), + // + DtoR_TEST64(_L("1E-10"),1E-10), +// DtoR_TEST64(_L("1E-20"),1E-20), + DtoR_TEST64(_L("1E-30"),1E-30), +// DtoR_TEST64(_L("1E-40"),1E-40), + DtoR_TEST64(_L("1E-50"),1E-50), + DtoR_TEST64(_L("1E-60"),1E-60), + DtoR_TEST64(_L("1E-70"),1E-70), + DtoR_TEST64(_L("1E-80"),1E-80), + DtoR_TEST64(_L("1E-90"),1E-90), + DtoR_TEST64(_L("1E-98"),1E-98), + DtoR_TEST64(_L("1E-99"),1E-99), +// DtoR_TEST64(_L("1E-100"),1E-100), +// DtoR_TEST64(_L("1E-200"),1E-200), + DtoR_TEST64(_L("1E-300"),1E-300), + DtoR_TEST64(_L("2.2250738585072015E-308"),2.2250738585072015E-308), + // + DtoR_TEST64(_L("-1E-10"),-1E-10), +// DtoR_TEST64(_L("-1E-20"),-1E-20), + DtoR_TEST64(_L("-1E-30"),-1E-30), +// DtoR_TEST64(_L("-1E-40"),-1E-40), + DtoR_TEST64(_L("-1E-50"),-1E-50), + DtoR_TEST64(_L("-1E-60"),-1E-60), + DtoR_TEST64(_L("-1E-70"),-1E-70), + DtoR_TEST64(_L("-1E-80"),-1E-80), + DtoR_TEST64(_L("-1E-90"),-1E-90), + DtoR_TEST64(_L("-1E-98"),-1E-98), + DtoR_TEST64(_L("-1E-99"),-1E-99), +// DtoR_TEST64(_L("-1E-100"),-1E-100), +// DtoR_TEST64(_L("-1E-200"),-1E-200), + DtoR_TEST64(_L("-1E-300"),-1E-300), + DtoR_TEST64(_L("-2.2250738585072015E-308"),-2.2250738585072015E-308), + // + DtoR_TEST64(_L("+1.23"),1.23), + DtoR_TEST64(_L("003.45"),3.45), + DtoR_TEST64(_L("0.0000000000000015"),1.5E-15), +// DtoR_TEST64(_L("1.234e-40"),1.234E-40) + }; + +GLDEF_D TUint size_testd2=sizeof(testd2); + +GLDEF_D DtoR_TEST64 testApprox[]= + { + + DtoR_TEST64(_L("1.23412341234e-11"),1.23412341234E-11), + DtoR_TEST64(_L("0.0000000000123412341234"),1.23412341234E-11), + + // Pow10() exact + DtoR_TEST64(_L("1.2345678901234567E-146"),1.2345678901234567E-146), + + // Pow10() inexact + DtoR_TEST64(_L("1E-40"),1E-40), + DtoR_TEST64(_L("-1E-40"),-1E-40), + DtoR_TEST64(_L("1E60"),1E60), + DtoR_TEST64(_L("-1E60"),-1E60), + DtoR_TEST64(_L("1E-20"),1E-20), + DtoR_TEST64(_L("-1E-20"),-1E-20), + DtoR_TEST64(_L("1E99"),1E99), + DtoR_TEST64(_L("-1E99"),-1E99), + DtoR_TEST64(_L("1.2345678901234567E+299"),1.2345678901234567E+299), + DtoR_TEST64(_L("1.23456789012345E-75"),1.23456789012345E-75), + DtoR_TEST64(_L("1E-100"),1E-100), + DtoR_TEST64(_L("-1E-100"),-1E-100), + DtoR_TEST64(_L("1E-200"),1E-200), + DtoR_TEST64(_L("-1E-200"),-1E-200), + DtoR_TEST64(_L("1.234e-40"),1.234E-40), + DtoR_TEST64(_L("1.23456789012345E+38"),1.23456789012345E+38), + }; + +GLDEF_D TUint size_testApprox=sizeof(testApprox); + +GLDEF_D DtoR_TEST32 testd32[]= + { + DtoR_TEST32(_L("0.29"),0.29f), + // + DtoR_TEST32(_L("0.0"),0.0f), + DtoR_TEST32(_L("1.0"),1.0f), + DtoR_TEST32(_L("10.0"),10.0f), + DtoR_TEST32(_L("100.0"),100.0f), + DtoR_TEST32(_L("1000.0"),1000.0f), + DtoR_TEST32(_L("0.1"),0.1f), + DtoR_TEST32(_L("0.01"),0.01f), + DtoR_TEST32(_L("0.001"),0.001f), + DtoR_TEST32(_L("0.0001"),0.0001f), + // + DtoR_TEST32(_L("9.99999999999999"),10.0f), + DtoR_TEST32(_L("9.9999999"),9.99999999f), + DtoR_TEST32(_L("9.9999"),9.9999f), + // + DtoR_TEST32(_L(".015"),0.015f), + DtoR_TEST32(_L("1.00E-15"),1.0E-15f), + DtoR_TEST32(_L("1.0E-07"),1.0E-7f), + // + DtoR_TEST32(_L("1024.0"),1024.0f), + DtoR_TEST32(_L("1E10"),1E10f), + DtoR_TEST32(_L("1E20"),1E+20f), + DtoR_TEST32(_L("1E30"),1E30f), + DtoR_TEST32(_L("3.40282356E+38"),KMaxTReal32), + // + DtoR_TEST32(_L("-1024.0"),-1024.0f), + DtoR_TEST32(_L("-1E10"),-1E10f), + DtoR_TEST32(_L("-1E20"),-1E20f), + DtoR_TEST32(_L("-1E30"),-1E+30f), + DtoR_TEST32(_L("-3.40282356E+38"),-KMaxTReal32), + // + DtoR_TEST32(_L("1234567.0"),1234567.0f), + DtoR_TEST32(_L("1234567890.0"),1234567890.0f), + DtoR_TEST32(_L("1.234567"),1.234567f), + DtoR_TEST32(_L("1.234567890"),1.234567890f), + DtoR_TEST32(_L("1.23456789012"),1.23456789012f), + DtoR_TEST32(_L("1.23456E+38"),1.23456E+38f), + DtoR_TEST32(_L("1.23456789E+38"),1.23456789E+38f), + DtoR_TEST32(_L("1.23456E-13"),1.23456E-13f), + DtoR_TEST32(_L("1.23456789012E-13"),1.23456789012E-13f), + // + DtoR_TEST32(_L("1E-10"),1E-10f), + DtoR_TEST32(_L("1E-20"),1E-20f), + DtoR_TEST32(_L("1E-30"),1E-30f), + DtoR_TEST32(_L("1.17549436e-38"),1.17549436e-38f), + // + DtoR_TEST32(_L("-1E-10"),-1E-10f), + DtoR_TEST32(_L("-1E-20"),-1E-20f), + DtoR_TEST32(_L("-1E-30"),-1E-30f), + DtoR_TEST32(_L("-1.17549436e-38"),-1.17549436e-38f), + // + DtoR_TEST32(_L("+1.23"),1.23f), + DtoR_TEST32(_L("003.45"),3.45f), + DtoR_TEST32(_L("0.0000000000000015"),1.5E-15f), + DtoR_TEST32(_L("1.234e-4"),1.234E-4f) + }; + +GLDEF_D TUint size_testd32=sizeof(testd32); + +GLDEF_D DtoR_ERR_TEST testerr3[]= + { + DtoR_ERR_TEST(KNullDesC,KErrGeneral), + DtoR_ERR_TEST(_L("E-20"),KErrGeneral), + DtoR_ERR_TEST(_L("1.#INF"),KErrNone), + DtoR_ERR_TEST(_L("1.#NAN"),KErrNone), + DtoR_ERR_TEST(_L("c.fgh"),KErrGeneral), + DtoR_ERR_TEST(_L("xyz"),KErrGeneral), + DtoR_ERR_TEST(_L("1.0E"),KErrNone), + DtoR_ERR_TEST(_L("1.0E2147483648"),KErrOverflow), + DtoR_ERR_TEST(_L("1.234567801234567890E+38"),KErrNone), + DtoR_ERR_TEST(_L("3.456789012345678901E-38"),KErrNone), + DtoR_ERR_TEST(_L("3.4028236E+38"),KErrOverflow), + DtoR_ERR_TEST(_L("1.1754943E-38"),KErrNone), + DtoR_ERR_TEST(_L("1.0E-38"),KErrNone), + DtoR_ERR_TEST(_L("4.0E+38"),KErrOverflow), + DtoR_ERR_TEST(_L("1.0E-39"),KErrNone), + DtoR_ERR_TEST(_L("1.0E+39"),KErrOverflow), + DtoR_ERR_TEST(_L("3.0E40"),KErrOverflow), + DtoR_ERR_TEST(_L("6.9E-46"),KErrUnderflow), + DtoR_ERR_TEST(_L("1.0E-325"),KErrUnderflow), + DtoR_ERR_TEST(_L("2.0E-400"),KErrUnderflow), + DtoR_ERR_TEST(_L("2.0E+400"),KErrOverflow), + }; + +GLDEF_D TUint size_testerr3=sizeof(testerr3); + +GLDEF_D CALC_TEST calctest[]= + { + CALC_TEST(_L("1.23412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234")), + CALC_TEST(_L("0.123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-01")), + CALC_TEST(_L("0.0123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-02")), + CALC_TEST(_L("0.00123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-03")), + CALC_TEST(_L("0.000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-04")), + CALC_TEST(_L("0.0000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-05")), + CALC_TEST(_L("0.00000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-06")), + CALC_TEST(_L("0.000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")), + CALC_TEST(_L("0.0000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-08")), + CALC_TEST(_L("0.00000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-09")), + CALC_TEST(_L("0.000000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-10")), + CALC_TEST(_L("0.0000000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-11")), + CALC_TEST(_L("0.00000000000123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-12")), + CALC_TEST(_L("1.23412341234E-7"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-07")), + CALC_TEST(_L("1.23412341234E-8"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-08")), + CALC_TEST(_L("1.23412341234E-9"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-09")), + CALC_TEST(_L("1.23412341234E-10"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-10")), + CALC_TEST(_L("1.23412341234E-11"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-11")), + CALC_TEST(_L("1.23412341234E-12"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-12")), + CALC_TEST(_L("0.00000000000000"),KRealFormatCalculator,20,12,'.',',',0,_S("0")), + CALC_TEST(_L("0.000000000000009999999999999"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-14")), + CALC_TEST(_L("0.000000000000000000009999999999999"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-20")), + CALC_TEST(_L("999999999999.5"),KRealFormatCalculator,20,12,'.',',',0,_S("1E+12")), + CALC_TEST(_L("999999999999.4"),KRealFormatCalculator,20,12,'.',',',0,_S("999999999999")), + CALC_TEST(_L("1.234123412341"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234")), + CALC_TEST(_L("0.123412341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341234E-01")), + CALC_TEST(_L("0.012341234123"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2341234123E-02")), + CALC_TEST(_L("0.001234123412"),KRealFormatCalculator,20,12,'.',',',0,_S("1.234123412E-03")), + CALC_TEST(_L("0.000123412341"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412341E-04")), + CALC_TEST(_L("0.000012341234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2341234E-05")), + CALC_TEST(_L("0.000001234123"),KRealFormatCalculator,20,12,'.',',',0,_S("1.234123E-06")), + CALC_TEST(_L("0.000000123412"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23412E-07")), + CALC_TEST(_L("0.000000012341"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2341E-08")), + CALC_TEST(_L("0.000000001234"),KRealFormatCalculator,20,12,'.',',',0,_S("1.234E-09")), + CALC_TEST(_L("0.000000000123"),KRealFormatCalculator,20,12,'.',',',0,_S("1.23E-10")), + CALC_TEST(_L("0.000000000012"),KRealFormatCalculator,20,12,'.',',',0,_S("1.2E-11")), + CALC_TEST(_L("0.000000000001"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-12")), + CALC_TEST(_L("0.12341234123"),KRealFormatCalculator,20,12,'.',',',0,_S("0.12341234123")), + CALC_TEST(_L("0.01234123412"),KRealFormatCalculator,20,12,'.',',',0,_S("0.01234123412")), + CALC_TEST(_L("0.00123412341"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00123412341")), + CALC_TEST(_L("0.00012341234"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00012341234")), + CALC_TEST(_L("0.00001234123"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00001234123")), + CALC_TEST(_L("0.00000123412"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000123412")), + CALC_TEST(_L("0.00000012341"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000012341")), + CALC_TEST(_L("0.00000001234"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000001234")), + CALC_TEST(_L("0.00000000123"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000123")), + CALC_TEST(_L("0.00000000012"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000012")), + CALC_TEST(_L("0.00000000001"),KRealFormatCalculator,20,12,'.',',',0,_S("0.00000000001")), + CALC_TEST(_L("0.000000000001"),KRealFormatCalculator,20,12,'.',',',0,_S("1E-12")), + CALC_TEST(_L("-1.234E19"),KRealFormatCalculator,20,12,'.',',',0,_S("-1.234E+19")), + }; + +GLDEF_D TUint size_calctest=sizeof(calctest); + + + + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_fltcl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_fltcl.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,75 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_fltcl.cpp +// Class member functions for T_FLOAT.CPP +// T_FLOAT.CPP split into header files because there seems to be too much static +// data for GCC compiler +// +// + + +#include "t_float.h" + +RtoB_TEST::RtoB_TEST() + { + + num=0.0; + format.iType=KRealFormatGeneral; + format.iWidth=KDefaultRealWidth; + format.iPlaces=0; + TLocale locale; + format.iPoint=locale.DecimalSeparator(); + format.iTriad=locale.ThousandsSeparator(); + format.iTriLen=1; + res=_S("0"); + } + +RtoB_TEST::RtoB_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes) + { + + num=aNum; + format.iType=aType; + format.iWidth=aWidth; + format.iPlaces=aDecimals; + format.iPoint=aPoint; + format.iTriad=aTriad; + format.iTriLen=aTrilen; + res=aRes; + } + +ERR_TEST::ERR_TEST(TReal aNum,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad, TInt aTrilen,const TText* aRes,TInt aErr) + { + + rtob.num=aNum; + rtob.format.iType=aType; + rtob.format.iWidth=aWidth; + rtob.format.iPlaces=aDecimals; + rtob.format.iPoint=aPoint; + rtob.format.iTriad=aTriad; + rtob.format.iTriLen=aTrilen; + rtob.res=aRes; + err=aErr; + } + +CALC_TEST::CALC_TEST(const TDesC& aDes,TInt aType,TInt aWidth,TInt aDecimals,TChar aPoint,TChar aTriad,TInt aTrilen,const TText* aRes) + : iLex(aDes) + { + iFormat.iType=aType; + iFormat.iWidth=aWidth; + iFormat.iPlaces=aDecimals; + iFormat.iPoint=aPoint; + iFormat.iTriad=aTriad; + iFormat.iTriLen=aTrilen; + iRes=aRes; + } diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_i64.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_i64.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1472 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_i64.cpp +// Tests TInt64 +// Overview: +// Test 64-bit integer functionality. +// API Information: +// TInt64. +// Details: +// - Construct TInt64 with specified range of integer, real, high +// and low values and check constructor, copy constructor are as expected. +// - Test all the operators for range of values and check it is as expected. +// - Check the logical shift of specified number of bits is as expected. +// - Check multiplication of 64 bit integer by the specified 64 bit integer +// using MulTop, fast multiplication of 64 bit integer by 10. +// - Verify the 64 bit integer divide and mod results are as expected. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include + +inline TInt __i64multop(TInt64& aX, TInt64& aValue) + { Uint64 __lowResult; \ + Uint64 __highResult; \ + Math::UMul64(aX, aValue, __highResult, __lowResult); \ + aX = static_cast(__highResult); \ + return (__lowResult == UI64LIT(0x0000000000000000)) ? -2 : \ + (__lowResult < UI64LIT(0x8000000000000000)) ? -1 : \ + (__lowResult == UI64LIT(0x8000000000000000)) ? 0 : \ + /*__lowResult > UI64LIT(0x8000000000000000)*/ 1; \ + } + +#define I64MULTOP(x, value) __i64multop(x, (value)) + + +TInt HexMulAdd(TUint8 a1,TUint8 a2,TUint8& answer,TUint8& carry) + { + TUint x1= a1>'9' ? a1-'a'+10 : a1-'0'; + TUint x2= a2>'9' ? a2-'a'+10 : a2-'0'; + TUint a= answer>'9' ? answer-'a'+10 : answer-'0'; + TUint c= carry>'9' ? carry-'a'+10 : carry-'0'; + if (x1>15) return (KErrArgument); + if (x2>15) return (KErrArgument); + if (a>15) return (KErrArgument); + if (c>15) return (KErrArgument); + a+=(x1*x2)+c; + c=a/16; + a=a%16; + a= a>9 ? a-10+'a' : a+'0'; + c= c>9 ? c-10+'a' : c+'0'; + answer=(TUint8)a; + carry=(TUint8)c; + return(KErrNone); + } + +TInt HexMul(TDesC8& a1,TDesC8& a2,TDes8& a3) +// +// Infinite precision hex multiplier +// + { + TInt l1=a1.Length(); + TInt l2=a2.Length(); + TInt l3=l1+l2; + if (a3.MaxLength()= (t << 31)) + { + aDiv += static_cast(1 << 31); + aMod -= t << 31; + } + } + if ((t & UI64LIT(0xffffff0000000000)) == 0) + { + while (aMod >= (t << 23)) + { + aDiv += 1 << 23; + aMod -= t << 23; + } + } + if ((t & UI64LIT(0xffff000000000000)) == 0) + { + while (aMod >= (t << 15)) + { + aDiv += 1 << 15; + aMod -= t << 15; + } + } + if ((t & UI64LIT(0xff00000000000000)) == 0) + { + while (aMod >= (t << 7)) + { + aDiv += 1 << 7; + aMod -= t << 7; + } + } + if ((t & UI64LIT(0xf000000000000000)) == 0) + { + while (aMod >= (t << 3)) + { + aDiv += 1 << 3; + aMod -= t << 3; + } + } + while (aMod >= t) + { + ++aDiv; + aMod -= t; + } + + if (negative) + { + aDiv=-aDiv; + } + + if (aA < 0) + { + aMod =- aMod; + } + } + +LOCAL_C void DivModTest(const TInt64& aA, const TInt64& aB) +// +// Test DivMod against SlowDivMod +// + { + + if (aB!=0) + { + TInt64 n(aA),d(aB); + TInt64 div=0,mod=0,res=0; + + SlowDivMod(n,d,div,mod); + + res = n % d; + n /= d; + + test(n==div); + test(res==mod); + } + } + +LOCAL_C void Test1() + { + // Test the constructors + + // TInt64() + test.Start(_L("Default constructor")); + TInt64 t1; + t1 = 0; // to prevent uninitialised warnings + (void)(t1 > 0); // to prevent unused warnings + + // TInt64(TInt aVal) + test.Next(_L("TInt64(TInt aVal)")); + TInt64 t2(0); + test(I64LOW(t2)==0 && I64HIGH(t2)==0); + TInt64 t3(1); + test(I64LOW(t3)==1 && I64HIGH(t3)==0); + TInt64 t4(KMaxTInt32); + test(I64LOW(t4)==(TUint)KMaxTInt32 && I64HIGH(t4)==0); + TInt64 t5(-1); + test(I64INT(t5)==-1); + test(I64LOW(t5)==KMaxTUint32 && I64HIGH(t5)==KMaxTUint32); + TInt64 t6(KMinTInt32); + test(I64INT(t6)==KMinTInt32); + + // TInt64(TUint aVal) + test.Next(_L("TInt64(TUint aVal)")); + TInt64 t7((TUint)0); + test(I64LOW(t7)==0 && I64HIGH(t7)==0); + TInt64 t8((TUint)1); + test(I64LOW(t8)==1 && I64HIGH(t8)==0); + TInt64 t9(KMaxTUint32); + test(I64LOW(t9)==KMaxTUint32 && I64HIGH(t9)==0); + + // TInt64(TUint aHigh,TUint aLow) + test.Next(_L("TInt64(TUint aHigh,TUint aLow)")); + TInt64 t10 = MAKE_TINT64(0,0); + test(I64LOW(t10)==0 && I64HIGH(t10)==0); + TInt64 t11 = MAKE_TINT64(KMaxTUint32,KMaxTUint32); // highest value stored === (2**64)-1 + test(I64LOW(t11)==KMaxTUint32 && I64HIGH(t11)==KMaxTUint32); + + // TInt64(TReal aVal) + test.Next(_L("TInt64(TReal aVal)")); + + + TInt64 t12((TInt64)1.0); + test(I64LOW(t12)==1 && I64HIGH(t12)==0); + TInt64 t15((TInt64)4.99); + test(I64LOW(t15)==4 && I64HIGH(t15)==0); + + TReal x; + + x = -9.223372036854776831e18; // -2^63 - 2^10 (to ensure rounding outside of TInt64 range) + TInt64 t16((TInt64)x); + test(t16==KMinTInt64); + TInt64 t17((TInt64)0.5); + test(I64LOW(t17)==0 && I64HIGH(t17)==0); + TInt64 t18((TInt64)0.0); + test(I64LOW(t18)==0 && I64HIGH(t18)==0); + TInt64 t19((TInt64)-123325.23411412); + test(I64LOW(t19)==(TUint)(-123325) && I64HIGH(t19)==0xffffffff); + TInt64 t20((TInt64)1.0E-1); + test(I64LOW(t20)==0 && I64HIGH(t20)==0); + + x = 9.223372036854776831e18; // 2^63 + 2^10 (to ensure rounding outside of TInt64 range) + TInt64 t21((TInt64)x); + + // IEEE 754 does not specify the value to be returned when a conversion + // is performed on a value that is outside the range of the target, only + // that an invalid operation exception be raised if the io fp exception + // is not masked. +#if !defined(__TOOLS2__) + // The x86 FPU returns KMin... as the "indefinite number" + test(t21 == KMinTInt64); +#endif + + TReal limit=1048576.0*1048576.0*8192.0; // integers <2^53 in modulus can be represented exactly + TInt64 t22((TInt64)limit); + test(I64LOW(t22)==0 && I64HIGH(t22)==0x00200000); + TInt64 t23((TInt64)(limit-1.0)); + test(I64LOW(t23)==0xffffffff && I64HIGH(t23)==0x001fffff); + TReal i64limit=limit*1024.0; // 2^63 + TInt64 t24((TInt64)i64limit); + + // IEEE 754 does not specify the value to be returned when a conversion + // is performed on a value that is outside the range of the target, only + // that an invalid operation exception be raised if the io fp exception + // is not masked. +#if !defined(__TOOLS2__) + // The x86 FPU returns KMin... as the "indefinite number" + test(t24 == KMinTInt64); +#endif + + TInt64 t25((TInt64)(i64limit-1024.0)); + test(I64LOW(t25)==0xfffffc00 && I64HIGH(t25)==0x7fffffff); + TInt64 t26((TInt64)-i64limit); + test(I64LOW(t26)==0x00000000 && I64HIGH(t26)==0x80000000); + TInt64 t27((TInt64)(1024.0-i64limit)); + test(I64LOW(t27)==0x00000400 && I64HIGH(t27)==0x80000000); + + + TInt i; + TInt64 l; + for (i=-99; i<100; i++) + { + x=1; + l=1; + TReal a(i); + TInt64 b(i); + while (Abs(x)>=")); + r = MAKE_TINT64(3,0); + r>>=1; + test(I64HIGH(r)==1 && I64LOW(r)==0x80000000); + r>>=1; + test(I64HIGH(r)==0 && I64LOW(r)==0xC0000000); + + r = MAKE_TINT64(0x80000000,0); + r>>=(31); + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0); + r>>=(32); + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32); + + r = MAKE_TINT64(0x80000000,0); + r>>=(32); + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0x80000000); + + r = MAKE_TINT64(0x80000000,0); + r>>=63; + test(I64LOW(r)==KMaxTUint32 && I64HIGH(r)==KMaxTUint32); + + r = MAKE_TINT64(KMaxTUint32, 0); + r>>=32; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32); + + // << + test.Next(_L("<<")); + r=1; + TInt64 t = r<<32; + test(I64LOW(t)==0 && I64HIGH(t)==1); + t = t<<31; + test(I64LOW(t)==0 && I64HIGH(t)==0x80000000); + + r=1; + t = r<<31; + test(I64LOW(t)==0x80000000 && I64HIGH(t)==0); + t = t<<32; + test(I64LOW(t)==0 && I64HIGH(t)==0x80000000); + + r=1; + t = r<<63; + test(I64LOW(t)==0 && I64HIGH(t)==0x80000000); + + r=0; + t = r<<32; + test(I64LOW(t)==0 && I64HIGH(t)==0); + + r=0xC0000000; // 1100000.......... + t = r<<1; + test(I64HIGH(t)==1 && I64LOW(t)==0x80000000); // 100000....... + t = t<<1; + test(I64HIGH(t)==3 && I64LOW(t)==0); + t = t<<1; + test(I64HIGH(t)==6 && I64LOW(t)==0); + + r = MAKE_TINT64(0,KMaxTUint32); + t = r<<32; + test(I64LOW(t)==0 && I64HIGH(t)==KMaxTUint32); + + // >> + test.Next(_L(">>")); + r = MAKE_TINT64(3,0); + t = r>>1; + test(I64HIGH(t)==1 && I64LOW(t)==0x80000000); + t = t>>1; + test(I64HIGH(t)==0 && I64LOW(t)==0xC0000000); + + r = MAKE_TINT64(0x80000000,0); + t = r>>(31); + test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==0); + t = t>>(32); + test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32); + t = t>>1; + test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32); + t = t>>16; + test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32); + + r = MAKE_TINT64(0x80000000,0); + t = r>>(32); + test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==0x80000000); + + r = MAKE_TINT64(0x80000000,0); + t = r>>63; + test(I64LOW(t)==KMaxTUint32 && I64HIGH(t)==KMaxTUint32); + + r = MAKE_TINT64(KMaxTUint32, 0); + t = r>>32; + test(I64HIGH(t)==KMaxTUint32 && I64LOW(t)==KMaxTUint32); + + r = MAKE_TINT64(0x40000000,0); + t = r>>30; + test(I64HIGH(t)==1 && I64LOW(t)==0); + t = r>>31; + test(I64HIGH(t)==0 && I64LOW(t)==0x80000000); + t = r>>62; + test(I64HIGH(t)==0 && I64LOW(t)==1); + t = r>>63; + test(I64HIGH(t)==0 && I64LOW(t)==0); + + test.End(); + } + +LOCAL_C void Test3() + { + // Test some more operators + + // unary - + test.Start(_L("unary -")); + TInt64 r=0, x(KMinTInt32); + r=-x; + test(I64INT(r)==KMinTInt32); + + x = MAKE_TINT64(0,0x80000000); + r=-x; + test(I64INT(r)==KMinTInt32); + + // ++ + // post increment + test.Next(_L("++")); + x=-1; + r=x++; + test(I64INT(r)==-1 && I64INT(x)==0); + r=x++; + test(I64INT(r)==0 && I64INT(x)==1); + r=x++; + test(I64INT(r)==1 && I64INT(x)==2); + + x=KMinTInt32; + r=x++; + test(I64INT(r)==KMinTInt32 && I64INT(x)==KMinTInt32+1); + + x=KMaxTUint32; + r=x++; + test(I64INT(r)==(TInt)KMaxTUint32 && I64HIGH(x)==1 && I64LOW(x)==0); + r=x++; + test(I64HIGH(r)==1 && I64LOW(r)==0 && I64HIGH(x)==1 && I64LOW(x)==1); + + // pre increment; + x=-1; + r=++x; + test(I64INT(r)==0 && I64INT(x)==0); + r=++x; + test(I64INT(r)==1 && I64INT(x)==1); + r=++x; + test(I64INT(r)==2 && I64INT(x)==2); + + x=KMinTInt32; + r=++x; + test(I64INT(r)==KMinTInt32+1 && I64INT(x)==KMinTInt32+1); + + x=KMaxTUint32; + r=++x; + test(I64HIGH(r) && I64HIGH(x)==1 && I64LOW(x)==0); + r=x++; + test(I64HIGH(r)==1 && I64LOW(r)==0 && I64HIGH(x)==1 && I64LOW(x)==1); + + + // -- + test.Next(_L("--")); + // post decrement + x=1; + r=x--; + test(I64INT(r)==1 && I64INT(x)==0); + r=x--; + test(I64INT(r)==0 && I64INT(x)==-1); + r=x--; + test(I64INT(r)==-1 && I64INT(x)==-2); + + x=KMinTInt32+1; + r=x--; + test(I64INT(r)==KMinTInt32+1 && I64INT(x)==KMinTInt32); + + x=KMaxTUint32; + x+=1; + r=x--; + test(I64HIGH(r)==1 && I64LOW(r)==0 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32); + r=x--; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32-1); + + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x--; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32 && I64HIGH(x)==KMaxTUint32 && I64LOW(x)==KMaxTUint32-1); + + // pre decrement + x=1; + r=--x; + test(I64INT(r)==0 && I64INT(x)==0); + r=--x; + test(I64INT(r)==-1 && I64INT(x)==-1); + r=--x; + test(I64INT(r)==-2 && I64INT(x)==-2); + + x=KMinTInt32+1; + r=--x; + test(I64INT(r)==KMinTInt32 && I64INT(x)==KMinTInt32); + + x=KMaxTUint32; + x+=1; + r=--x; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32); + r=--x; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1 && I64HIGH(x)==0 && I64LOW(x)==KMaxTUint32-1); + + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=--x; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1 && I64HIGH(x)==KMaxTUint32 && I64LOW(x)==KMaxTUint32-1); + + + + // Binary + + test.Next(_L("Binary +")); + x=KMinTInt32; + r=x+1; + test(I64INT(r)==KMinTInt32+1 && I64INT(x)==KMinTInt32); + + x=-1; + r=x+1; + test(I64INT(r)==0 && I64INT(x)==-1); + x=r+1; + test(I64INT(r)==0 && I64INT(x)==1); + + x=KMaxTUint32; + r=x+KMaxTUint32; + test(I64HIGH(r)==1 && I64LOW(r)==KMaxTUint-1); + + x=KMaxTUint32; + x+=1; + r=x+(-1); + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32); + + TInt64 y(0); + x=KMaxTUint32; + r=x+y; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32); + + y=KMaxTUint32; + r=x+y; + test(I64HIGH(r)==1 && I64LOW(r)==KMaxTUint32-1); + + y=0; + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x+y; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32); + + y=1; + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + x-=1; + r=x+y; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32); + + y=0; + x=KMinTInt32; + r=x+y; + test(I64INT(r)==KMinTInt32); + + y=-1; + x=KMinTInt32; + x+=1; + r=x+y; + test(I64INT(r)==KMinTInt32); + + y=-1; + x=-1; + r=x+y; + test(I64INT(r)==-2); + + y=-1; + x=KMaxTUint32; + r=x+y; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1); + y=-1; + x+=1; + r=x+y; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32); + y=-1; + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x+y; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1); + + y=KMinTInt32; + x=KMaxTUint32; + r=x+y; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-(TUint)KMinTInt32); + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x+y; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0x7fffffff); + + y=KMinTInt32; + x=-(KMinTInt32+1); + x+=1; + r=x+y; + test(I64INT(r)==0); + + + // Binary - + test.Next(_L("Binary -")); + x=KMinTInt32+1; + r=x-1; + test(I64INT(r)==KMinTInt32); + + x=2; + r=x-1; + test(I64INT(r)==1); + x=1; + r=x-1; + test(I64INT(r)==0); + x=0; + r=x-1; + test(I64INT(r)==-1); + + x=KMaxTUint32; + r=x-KMaxTUint32; + test(I64INT(r)==0); + + x=KMaxTUint32; + x+=1; + r=x-1; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32); + + x=KMaxTUint32; + r=x-1; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1); + + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x-1; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1); + + + y=0; + x=KMaxTUint32; + r=x-y; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32); + + y=KMaxTUint32; + r=x-y; + test(I64INT(r)==0); + + x=KMaxTUint32; + x+=1; + y=1; + r=x-1; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32); + x-=1; + r=x-1; + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32-1); + + y=0; + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x-y; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32); + + y=1; + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x-y; + test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32-1); + + y=0; + x=KMinTInt32; + r=x-y; + test(I64INT(r)==KMinTInt32); + + y=1; + x=KMinTInt32; + x+=1; + r=x-y; + test(I64INT(r)==KMinTInt32); + + y=1; + x=1; + r=x-y; + test(I64INT(r)==0); + + y=-1; + x=-1; + r=x-y; + test(I64INT(r)==0); + + x=0; + y=KMinTInt32; + r=x-y; + test(I64INT(r)==KMinTInt32); + + x=KMinTInt32; + y=KMinTInt32; + r=x-y; + test(I64INT(r)==0); + + test.End(); + } + + +LOCAL_C void Test4() +// still more operators + { + // * + test.Start(_L("Binary *")); + TInt64 r(0), x(1), y(0); + r=x*y; + test(I64INT(r)==0); + + y=-1; + r=x*y; + test(I64INT(r)==-1); + + x=-1; + r=x*y; + test(I64INT(r)==1); + + x=KMinTInt32; + r=x*y; + test(I64INT(r)==KMinTInt32); + + y=0; + r=x*y; + test(I64INT(r)==0); + + y=KMinTInt32; + r=x*y; + test(I64LOW(r)==0 && I64HIGH(r)==0x40000000); + + y=KMaxTUint32; + x=KMaxTUint32; + r=x*y; + test(I64LOW(r)==1 && I64HIGH(r)==0xfffffffe); + + + // / + test.Next(_L("Binary /")); + x=5; + y=5; + r=x/y; + test(I64INT(r)==1); + + y=1; + r=x/y; + test(I64INT(r)==5); + + x=-5; + r=x/y; + test(I64INT(r)==-5); + + y=-1; + r=x/y; + test(I64INT(r)==5); + + x=-1; + r=x/y; + test(I64INT(r)==1); + + x=0; + r=x/y; + test(I64INT(r)==0); + + x=KMinTInt32; + y=-1; + r=x/y; + test(I64INT(r)==KMinTInt32); + + x=KMinTInt32; + y=KMinTInt32; + r=x/y; + test(I64INT(r)==1); + + x=KMaxTUint32; + y=KMaxTUint32; + r=x/y; + test(I64INT(r)==1); + + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x/y; + test(I64INT(r)==0); + + y = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + r=x/y; + test(I64INT(r)==1); + + y=KMinTInt32; + r=x/y; + test(I64INT(r)==0); + + x = MAKE_TINT64(4,257629747); + y=KMaxTInt; + r=x/y; + test(I64LOW(r)==8 && I64HIGH(r)==0); + + x = MAKE_TINT64(3452,533254); + x=-x; + x=x/x; + test(x==1); + + // % + test.Next(_L("binary %%")); + x=2341; + y=2340; + test(x%y==1); + y=2; + test(x%y==1); + x = MAKE_TINT64(234893,23494); + test(x%x==0); + test(x%y==0); + x=-x; + y=10; + test(x%y==-2); + test(x%(-y)==-2); + + + // Lsr + test.Next(_L("Lsr")); + + r = MAKE_TINT64(3,0); + I64LSR(r, 1); + test(I64HIGH(r)==1 && I64LOW(r)==0x80000000); + I64LSR(r, 1); + test(I64HIGH(r)==0 && I64LOW(r)==0xC0000000); + + r = MAKE_TINT64(0x80000000,0); + I64LSR(r, 31); + test(I64HIGH(r)==1 && I64LOW(r)==0); + //test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0); + I64LSR(r, 32); + //test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32); + test(I64HIGH(r)==0 && I64LOW(r)==1); + + r = MAKE_TINT64(0x80000000,0); + I64LSR(r, 32); + test(I64HIGH(r)==0 && I64LOW(r)==0x80000000); + //test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==0x80000000); + + r = MAKE_TINT64(0x80000000,0); + I64LSR(r, 63); + test(I64LOW(r)==1 && I64HIGH(r)==0); + //test(I64LOW(r)==KMaxTUint32 && I64HIGH(r)==KMaxTUint32); + + r = MAKE_TINT64(KMaxTUint32, 0); + I64LSR(r, 32); + test(I64HIGH(r)==0 && I64LOW(r)==KMaxTUint32); + //test(I64HIGH(r)==KMaxTUint32 && I64LOW(r)==KMaxTUint32); + + + // Mul10 + test.Next(_L("Mul10")); + const TInt64 KMaxDiv10= KMaxTInt64 / 10; + const TInt64 KStep=MAKE_TINT64(0x003dfe03, 0xf7ea23cd); + for(TInt64 jj=-KMaxDiv10; jj<=KMaxDiv10; jj+=KStep) + { + r=jj; + r *= 10; + test(r==jj*10); + r/=10; + test(r==jj); + } + + r=KMinTInt32/10; + r *= 10; + test(I64INT(r)==(KMinTInt/10)*10); + + r=KMaxTUint32; + r *= 10; + test(I64HIGH(r)==9 && I64LOW(r)==0xFFFFFFF6); + + r/=10; + test(r==MAKE_TINT64(0,KMaxTUint32)); + + + // DivMod + test.Next(_L("DivMod")); + TInt64 seed = MAKE_TINT64(0x0000336a,0xb2001a78); + for (TInt i=0; i<200; i++) + { + TInt o=Math::Rand(seed); + TInt p=Math::Rand(seed); + TInt r=Math::Rand(seed); + TInt q=Math::Rand(seed); + + DivModTest(MAKE_TINT64(0,q), MAKE_TINT64(0,r)); + DivModTest(MAKE_TINT64(r,q), MAKE_TINT64(o,p)); + DivModTest(MAKE_TINT64(p,q), MAKE_TINT64(0,o)); + DivModTest(MAKE_TINT64(0,p), MAKE_TINT64(r,o)); + + DivModTest(-MAKE_TINT64(0,q), -MAKE_TINT64(0,r)); + DivModTest( MAKE_TINT64(0,q), -MAKE_TINT64(0,r)); + DivModTest(-MAKE_TINT64(0,q), MAKE_TINT64(0,r)); + + DivModTest(-MAKE_TINT64(r,q), -MAKE_TINT64(o,p)); + DivModTest( MAKE_TINT64(r,q), -MAKE_TINT64(o,p)); + DivModTest(-MAKE_TINT64(r,q), MAKE_TINT64(o,p)); + + DivModTest(-MAKE_TINT64(0,p), -MAKE_TINT64(r,o)); + DivModTest( MAKE_TINT64(0,p), -MAKE_TINT64(r,o)); + DivModTest(-MAKE_TINT64(0,p), MAKE_TINT64(r,o)); + } + + test.End(); + } + +LOCAL_C void Test5() +// still more operators + { + + // fast multiply by 10 + test.Start(_L("Mul10")); + TInt64 r(0); + r *= 10; + test(I64INT(r)==0); + + r=-1; + r *= 10; + test(I64INT(r)==-10); + + r=KMinTInt32/10; + r *= 10; + test(I64INT(r)==KMinTInt32-(KMinTInt32%10)); + + r=1; + r *= 10; + test(I64INT(r)==10); + + r=KMaxTUint32/10; + r *= 10; + test(I64LOW(r)==(KMaxTUint32-(KMaxTUint%10)) && I64HIGH(r)==0); + + r *= 10; + test(r==TInt64(KMaxTUint32-(KMaxTUint%10))*10); + + r *= 10; + test(r==TInt64(KMaxTUint32-(KMaxTUint%10))*100); + + // Comparisons + test.Next(_L("Comparison operators")); + + // == , !=, <= and >= + test.Next(_L("==, !=, <= and >=")); + r=KMinTInt32; + TInt64 x(KMinTInt32); + TInt64 y(100); + test(r==x && r!=y && r>=x && r<=x); + + r=-1; + x=-1; + test(r==x && r!=y && r>=x && r<=x); + + r=0; + x=0; + test(r==x && r!=y && r>=x && r<=x); + + r=1; + x=1; + test(r==x && r!=y && r>=x && r<=x); + + r=KMaxTUint32; + x=KMaxTUint32; + test(r==x && r!=y && r>=x && r<=x); + + r = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + test(x==r && x!=y && x>=r && x<=r); + + //>=, <=, > and < + test.Next(_L(">=, <=, > and <")); + r=KMinTInt32; + x=KMinTInt32+1; + test(x>r && x>=r && rx && x=x && x<=r); + + r=KMaxTUint32; + x=KMaxTUint32-1; + test(r>x && x=x && x<=r); + + r+=1; + x+=1; + test(r>x && x=x && x<=r); + + r = MAKE_TINT64(KMaxTUint32,KMaxTUint32); + x = MAKE_TINT64(KMaxTUint32,KMaxTUint32-1); + test(r>x && x=x && x<=r); + + r = MAKE_TINT64(0x80000000,0); + x = MAKE_TINT64(KMaxTInt32,KMaxTUint32); + test(rr); + test(x!=r); + test(r<=x); + test(x>=r); + test(r<0 && x>0); + + x = MAKE_TINT64(0x80000000,1); + test(rr && x!=r && r<=x && x>=r); + + r = MAKE_TINT64(KMaxTInt32,KMaxTUint32); + --r; + test(r>x && x=x && x<=r); + + // multiply top bits + test.Next(_L("MulTop")); + r=0; + x=0; + I64MULTOP(r, x); + test(I64INT(r)==0); + + r=1; + x=1; + I64MULTOP(r, x); + test(I64INT(r)==0); + + r = MAKE_TINT64(KMaxTInt,KMaxTUint); + x=2; + I64MULTOP(r, x); + test(I64INT(r)==0); + + r = MAKE_TINT64(KMaxTInt,KMaxTUint); + x=4; + I64MULTOP(r, x); + test(I64INT(r)==1); + + r = MAKE_TINT64(0x80000000,0); + x = MAKE_TINT64(0x80000000,0); + I64MULTOP(r, x); + r>>=32; + test(I64INT(r)==0x40000000); + + r = MAKE_TINT64(0x18763529,0x93263921); + x = MAKE_TINT64(0x0abcdef0,0x647239ea); + TInt64 r2=r; + TInt64 x2=x; + I64MULTOP(r, x2); + I64MULTOP(x, r2); + test(r==x); + +// TInt64(0xac11b680,0x1e603000) * TInt64(0x014a5c20,0xc9d58740) + + TPtrC8 a4=_L8("ac11b6801e603000"); + TPtrC8 a5=_L8("014a5c20c9d58740"); + TBuf8<64> a6; + HexMul(a4,a5,a6); + + x = MAKE_TINT64(0x014a5c20,0xc9d58740); + + r = MAKE_TINT64(0xac11b680,0x1e603000); + y = MAKE_TINT64(0x0963fbc4,0x415c0000); // Expected result (bottom 64 bits) + + r *= x; + + test(r==y); + + r = MAKE_TINT64(0xac11b680,0x1e603000); + y = MAKE_TINT64(0x00de0cc1,0xa89d70dc); // Expected result (top 64 bits) + I64MULTOP(r, x); + test(r==y); + + test.End(); + } + + +GLDEF_C TInt E32Main() + { + test.Title(); + test.Start(_L("Constructors")); + Test1(); + test.Next(_L("Unary operators")); + Test1_2(); + test.Next(_L("Operators 1")); + Test2(); + test.Next(_L("Operators 2")); + Test3(); + test.Next(_L("Operators 3")); + Test4(); + test.Next(_L("Operators 4")); + Test5(); + test.End(); + return(KErrNone); + } diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_i64_2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_i64_2.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,484 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_i64_2.cpp +// Overview: +// Test 64-bit integer functionality. +// API Information: +// TInt64, TUInt64. +// Details: +// - Construct TInt64 and TUInt64 and verify the results. +// - Test the unary and shift operators and check results are as expected. +// - Test the + - * / and % operators, verify results are as expected. +// - Test the + - * / and % operators with random numbers, verify results +// are as expected. +// - Test the conversion of TInt64 to/from TReal. Verify that the results +// are as expected. +// - Test the conversion of TInt64 to/from text. Verify that the results +// are as expected. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include +#include "largeint.h" +#include "../misc/prbs.h" + +typedef TLargeInt<2> I64; +typedef TLargeInt<4> I128; + +RTest test(_L("T_I64_2")); +TUint Seed[2]; + +TUint64 Random64() + { + TUint h = Random(Seed); + TUint l = Random(Seed); + return MAKE_TUINT64(h,l); + } + +#define BOOL(x) ((x)?1:0) + +#define FOREACH(p, table, esize) \ + for(p=table; p<(const TUint32*)((const TUint8*)table+sizeof(table)); p+=esize/sizeof(TUint32)) + +const TUint32 Table1[] = + { + 0x00000000, 0x00000000, + 0x00000001, 0x00000000, + 0x0000cc01, 0x00000000, + 0x00db2701, 0x00000000, + 0xcc9ffcd1, 0x00000000, + 0x00000000, 0xffffffff, + 0xeeeeeeee, 0xffffffff, + 0x04030201, 0x00000055, + 0x04030201, 0x00006655, + 0x04030201, 0x00776655, + 0x04030201, 0x33776655, + 0xf9de6484, 0xb504f333 + }; + +void Test1() + { + test.Next(_L("Unary operators and shifts")); + + const TUint32* p; + FOREACH(p,Table1,8) + { + I64 a(p); + TInt64 b = MAKE_TINT64(p[1], p[0]); + I64 c(b); + test(a==c); + TUint64 d = MAKE_TUINT64(p[1], p[0]); + I64 e(d); + test(a==e); + I64 c2(~b); + I64 c3(-b); + a.Not(); + test(c2==a); + a.Not(); + test(c==a); + a.Neg(); + test(c3==a); + a.Neg(); + test(c==a); + } + FOREACH(p,Table1,8) + { + I64 a(p); + TInt64 s = MAKE_TINT64(p[1], p[0]); + TUint64 u = MAKE_TUINT64(p[1], p[0]); + TInt n; + for (n=0; n<64; ++n) + { + I64 b(a), c(a), d(a); + b.Lsl(n), c.Lsr(n), d.Asr(n); + TInt64 s2 = s<>n; + TUint64 u2 = u<>n; +// test.Printf(_L("s2=%lx\ns3=%lx\n,u2=%lx\n,u3=%lx\n"),s2,s3,u2,u3); + test(b == I64(s2)); + test(b == I64(u2)); + test(c == I64(u3)); + test(d == I64(s3)); + } + } + } + +const TUint32 Table2[] = + { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x05f5e100, 0x00000000, 0x000000cb, 0x00000000, + 0xffffff9c, 0xffffffff, 0x00129cbb, 0x00000000, + 0xffffcd03, 0xffffffff, 0xffff9123, 0xffffffff, + 0xf9de6484, 0xb504f333, 0xf9de6484, 0xb504f333, + 0xf9de6484, 0xb504f333, 0x2168c235, 0xc90fdaa2, + 0xf9de6484, 0xb504f333, 0x000000cb, 0x00000000, + 0xf9de6484, 0xb504f333, 0x800000cb, 0x00000000, + 0xf9de6484, 0xb504f333, 0x000000cb, 0x00000001, + 0xf9de6484, 0xb504f333, 0xfffffed9, 0xffffffff, + 0xf9de6484, 0xb504f333, 0x197383db, 0xffffffff, + 0xf9de6484, 0xb504f333, 0x197383db, 0xffffffec, + 0x38aa3b29, 0x5c17f0bc, 0x000019c7, 0x00000000, + 0x38aa3b29, 0x5c17f0bc, 0x800019c7, 0x00000000, + 0x38aa3b29, 0x5c17f0bc, 0x000019c7, 0x00000003, + 0x38aa3b29, 0x5c17f0bc, 0x197383db, 0xffffffff, + 0x38aa3b29, 0x5c17f0bc, 0x197383db, 0xffffffec, + 0x00123456, 0x00000000, 0x8cb9fc1b, 0x00000000, + 0x00000123, 0x00000000, 0x8cb9fc1b, 0x0000cc9f, + 0xfffffe33, 0xffffffff, 0x8cb9fc1b, 0x0000cc9f + }; + +void Test2(const TUint32* p) + { + I64 a(p), b(p+2); + TInt64 x = MAKE_TINT64(p[1], p[0]); + TInt64 y = MAKE_TINT64(p[3], p[2]); + TUint64 u = MAKE_TUINT64(p[1], p[0]); + TUint64 v = MAKE_TUINT64(p[3], p[2]); + { + I64 c(a); c.Add(b); test(c==I64(x+y)); test(c==I64(u+v)); + test(c==I64(y+x)); test(c==I64(v+u)); + } + { + I64 c(a); c.Sub(b); test(c==I64(x-y)); test(c==I64(u-v)); + I64 d(b); d.Sub(a); test(d==I64(y-x)); test(d==I64(v-u)); + } + { + I64 c(a); c.Mul(b); test(c==I64(x*y)); test(c==I64(u*v)); + test(c==I64(y*x)); test(c==I64(v*u)); + } + { + I128 c = a.LongMultS(b); + TUint32 t[4]; + Math::Mul64(x, y, *(TInt64*)(t+2), *(TUint64*)t); + test(c==I128(t)); + Math::Mul64(y, x, *(TInt64*)(t+2), *(TUint64*)t); + test(c==I128(t)); + } + { + I128 c = a.LongMultU(b); + TUint32 t[4]; + Math::UMul64(u, v, *(TUint64*)(t+2), *(TUint64*)t); + test(c==I128(t)); + Math::UMul64(v, u, *(TUint64*)(t+2), *(TUint64*)t); + test(c==I128(t)); + } + if (y!=0) + { + I64 r; I64 q(a); q.DivS(b,r); + test(q==I64(x/y)); + test(r==I64(x%y)); + TInt64 r2; + TInt64 q2 = Math::DivMod64(x, y, r2); + test(q==I64(q2)); + test(r==I64(r2)); + } + if (x!=0) + { + I64 r; I64 q(b); q.DivS(a,r); + test(q==I64(y/x)); + test(r==I64(y%x)); + TInt64 r2; + TInt64 q2 = Math::DivMod64(y, x, r2); + test(q==I64(q2)); + test(r==I64(r2)); + } + if (v!=0) + { + I64 r; I64 q(a); q.DivU(b,r); + test(q==I64(u/v)); + test(r==I64(u%v)); + TUint64 r2; + TUint64 q2 = Math::UDivMod64(u, v, r2); + test(q==I64(q2)); + test(r==I64(r2)); + } + if (u!=0) + { + I64 r; I64 q(b); q.DivU(a,r); + test(q==I64(v/u)); + test(r==I64(v%u)); + TUint64 r2; + TUint64 q2 = Math::UDivMod64(v, u, r2); + test(q==I64(q2)); + test(r==I64(r2)); + } + { + TInt cmpu = a.CompareU(b); + TInt cmps = a.CompareS(b); + TInt equ = BOOL(u==v); + TInt neu = BOOL(u!=v); + TInt hi = BOOL(u>v); + TInt hs = BOOL(u>=v); + TInt lo = BOOL(uy); + TInt ge = BOOL(x>=y); + TInt lt = BOOL(x0) + test(!equ && hi && hs && !lo && !ls); + else if (cmpu<0) + test(!equ && !hi && !hs && lo && ls); + else + test(equ && !hi && hs && !lo && ls); + if (cmps>0) + test(!eqs && gt && ge && !lt && !le); + else if (cmps<0) + test(!eqs && !gt && !ge && lt && le); + else + test(eqs && !gt && ge && !lt && le); + } + } + +void Test2() + { + test.Next(_L("Test + - * / % (1)")); + const TUint32* p; + FOREACH(p,Table2,16) + { + Test2(p); + } + } + +void Test3() + { + test.Next(_L("Test + - * / % (2)")); + TInt i; + for (i=0; i<100; ++i) + { + TUint32 p[4]; + p[0] = Random(Seed); + p[1] = Random(Seed); + p[2] = Random(Seed); + p[3] = Random(Seed); + Test2(p); + } + } + +void Test4() + { + test.Next(_L("Test conversion to/from TReal")); + TReal x; + TReal limit=1048576.0*1048576.0*8192.0; + TInt64 t22 = (TInt64)limit; + test(t22 == TInt64(1)<<53); + TInt64 t23 = (TInt64)(limit-1.0); + test(t23 == (TInt64(1)<<53)-1); + + + TInt i; + TInt64 l; + for (i=-99; i<100; i++) + { + x=1; + l=1; + TReal a(i); + TInt64 b(i); + while (Abs(x) i64 %lx (%lx)\n"), x, ll, l); + test(ll==l); + ll=0; + ll = (TInt64)x; + test(ll==l); + x*=a; + l*=b; + if (i==1 || i==0 || (i==-1 && l==TInt64(1))) + break; + } + } + + TReal i64limit = 1024.0*limit; + l=MAKE_TINT64(0x7fffffff,0xfffffc00); + x=(TReal)l; + test(x==i64limit-1024.0); + l=MAKE_TINT64(0x80000000,0x00000000); + x=(TReal)l; + test(x==-i64limit); + l=MAKE_TINT64(0x80000000,0x00000400); + x=(TReal)l; + test(x==1024.0-i64limit); + l=MAKE_TINT64(0x00000001,0x00000000); + x=(TReal)l; + test(x==65536.0*65536.0); + l=MAKE_TINT64(0xffffffff,0x00000000); + x=(TReal)l; + test(x==-65536.0*65536.0); + + for (i=-99; i<100; i++) + { + x=1; + l=1; + TReal a(i); + TInt64 b(i); + while (Abs(x) b; + b.Num(u,EHex); + test(b==text); + b.NumUC(u,EHex); + TBuf8<64> uc = text; + uc.UpperCase(); + test(b==uc); + } + lex8.Assign(KTestDec8()); + TInt64 s; + p = TestDecTable; + for (; !lex8.Eos(); lex8.SkipSpace(), p+=2) + { + lex8.Mark(); + test(lex8.Val(s)==KErrNone); + test(s == MAKE_TINT64(p[1], p[0])); + TPtrC8 text = lex8.MarkedToken(); + TBuf8<64> b; + b.Num(s); + test(b==text); + } + + TLex16 lex16; + lex16.Assign(KTestHex16()); + p = TestHexTable; + for (; !lex16.Eos(); lex16.SkipSpace(), p+=2) + { + lex16.Mark(); + test(lex16.Val(u,EHex)==KErrNone); + test(u == MAKE_TINT64(p[1], p[0])); + TPtrC16 text = lex16.MarkedToken(); + TBuf16<64> b; + b.Num(u,EHex); + test(b==text); + b.NumUC(u,EHex); + TBuf16<64> uc = text; + uc.UpperCase(); + test(b==uc); + } + lex16.Assign(KTestDec16()); + p = TestDecTable; + for (; !lex16.Eos(); lex16.SkipSpace(), p+=2) + { + lex16.Mark(); + test(lex16.Val(s)==KErrNone); + test(s == MAKE_TINT64(p[1], p[0])); + TPtrC16 text = lex16.MarkedToken(); + TBuf16<64> b; + b.Num(s); + test(b==text); + } + } + +GLDEF_C TInt E32Main() + { + + Seed[0] = 0xb8aa3b29; + Seed[1] = 0; + + test.Title(); + test.Start(_L("Testing 64 bit integers")); + + Test1(); + Test2(); + Test3(); + Test4(); + Test5(); + + test.End(); + return(KErrNone); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_math.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_math.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2926 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_math.cpp +// T_MATH.CPP - Test routines for the maths functions +// NB When considering the accuracy of the results (i.e. the tolerance used in testApprox()) it +// should be remembered that the results expected are not always given to full precision and so +// the results obtained are mostly as accurate as can be expected. +// Overview: +// Test functionality of the Math library. +// API Information: +// Math. +// Details: +// - Test math's trigonometric, powers, roots, logs, modulo, sqrt, exp, +// Int, Frac, rounding for range of input values are as expected. +// - Test the returned error values are as expected when illegal math's +// operations are done. +// - Check the return value is KErrTotalLossOfPrecision when incorrect values +// is passed to modulo function. +// - Test for success when the same variable for both operands in some +// Math functions are used. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include "t_math.h" +#include "t_vals.h" + +LOCAL_D RTest test(_L("T_MATH")); + +LOCAL_D TInt64 rseed = MAKE_TINT64(123456789,987654321); + +typedef struct + { + TReal num; // input number + TReal res; // expected result + } SQRT_TEST; + +LOCAL_D SQRT_TEST testsqrt[]= + { + {0.0,0.0}, // zero + {KNegZeroTReal64,KNegZeroTReal64}, + {1.0,1.0}, + {.64,.8}, + {.81,.9}, + {9,3}, + {25,5}, + {10000,100}, + {400,20}, + {6.25,2.5}, + {1E-98,1E-49}, + {1E-98,1E-49}, + {1E98,1E49}, + {1.0000000001,1.00000000005} + }; + +typedef struct + { + TReal num; // input number + TReal res; // expected result + } TESTLN; + +LOCAL_D TESTLN testln[]= + { + {.001,-6.9077552789821317}, + {.002,-6.2146080984221917}, + {.023,-3.7722610630529874}, + {.004,-5.5214609178622464}, + {.050,-2.9957322735539910}, + {.100,-2.3025850929940457}, + {.150,-1.8971199848858813}, + {.200,-1.6094379124341004}, + {.250,-1.3862943611198906}, + {.300,-1.2039728043259360}, + {.350,-1.0498221244986777}, + {.400,-0.9162907318741551}, + {.450,-0.7985076962177716}, + {.500,-0.6931471805599453}, + {.550,-0.5978370007556204}, + {.600,-0.5108256237659907}, + {.650,-0.4307829160924543}, + {.700,-0.3566749439387324}, + {.750,-0.2876820724517809}, + {.980,-0.0202027073175194}, + {.985,-0.0151136378100482}, + {.990,-0.0100503358535014}, + {.995,-0.0050125418235443}, + {.088,-2.4304184645039306}, + {1,0} + }; + +typedef struct + { + TReal val; // value for which the exponent is to be found + TReal result; // result + } EXP; + +LOCAL_D EXP testexp[]= + { + {4E-20,1.0}, + {5.4E-20,1.0}, + {0.0,1.0}, + {5E-324,1.0}, + }; + +typedef struct + { + TReal number; // number to be raised to a power + TReal power; // power + TReal result; // result + } POWER; + +LOCAL_D POWER testpow[]= + { + {45,3,91125.0}, + {-2,4,16}, + {2,-3,0.125}, + {-2,3,-8}, + {16,20,1.208925819614628E+24}, + }; + +// Added by AnnW, October 1996 +LOCAL_D const POWER testpowexact[]= + { + {0.0,1.0,0.0}, + {0,7,0}, + {0.0,16.0,0.0}, + {0.0,3.9271E-17,0.0}, + {-2,0,1}, + {1,0,1}, + {1.545243,0,1}, + {4.8,0.0,1.0}, + {195.0,0.0,1.0}, + {1.0E-7,0.0,1.0}, + {1.0,2.0,1.0}, + {1.0,1.0E-6,1.0}, + {1.0,1.0E+10,1.0}, + {-1.0,2.0,1.0}, + {-1.0,1.0000000001E+10,-1.0}, + {-1.0,1.0E+10,1.0}, + {1.593704102953967e+3,1.0,1.593704102953967e+3}, + {1.234567E+50,1.0,1.234567E+50}, + {1.2345678901234567E+146,1.0,1.2345678901234567E+146}, + {-7.6543210987654321E-53,1.0,-7.6543210987654321E-53}, + {0.0,2.0,0.0}, + {KNegZeroTReal64,4.0,0.0}, + {KPosInfTReal64,-2.0,0.0}, + {KNegInfTReal64,-2.0,0.0}, + {2.0,KNegInfTReal64,0.0}, + {-2.0,KNegInfTReal64,0.0}, + {0.5,KPosInfTReal64,0.0}, + {-0.5,KPosInfTReal64,0.0}, + {KPosInfTReal64,-5.0,0.0}, + {KPosInfTReal64,-6.0,0.0}, + {KNegInfTReal64,KNegInfTReal64,0.0}, + {KPosInfTReal64,KNegInfTReal64,0.0}, + }; + +// Check ISO requirements on Pow() +// +typedef struct + { + TReal number; // number to be raised to a power + TReal power; // power + TInt rc; // return value from Pow() + TReal result; // numerical result + } POWERISO; + +const TReal KPosZeroTReal64 = 0.0; + +LOCAL_D const POWERISO testpow_iso[] = + { + // pow(+/-0, y) returns +/-INF and raises the ''divide-by-zero'' + // floating-point exception for y an odd integer < 0 + { KPosZeroTReal64, -3.0, KErrOverflow, KPosInfTReal64 }, // 0 + { KNegZeroTReal64, -3.0, KErrOverflow, KNegInfTReal64 }, // 1 + + // pow(+/-0, y) returns +INF and raises the ''divide-by-zero'' + // floating-point exception for y < 0 and not an odd integer + { KPosZeroTReal64, -2.0, KErrOverflow, KPosInfTReal64 }, // 2 + { KNegZeroTReal64, -2.0, KErrOverflow, KPosInfTReal64 }, // 3 + + // pow(+/-0, y) returns +/-0 for y an odd integer > 0 + { KPosZeroTReal64, 3.0, KErrNone, KPosZeroTReal64 }, // 4 + { KNegZeroTReal64, 3.0, KErrNone, KNegZeroTReal64 }, // 5 + + // pow(+/-0, y) returns +0 for y > 0 and not an odd integer + { KPosZeroTReal64, 2.0, KErrNone, KPosZeroTReal64 }, // 6 + { KNegZeroTReal64, 2.0, KErrNone, KPosZeroTReal64 }, // 7 + + // pow(-1, +/-INF) returns 1 + { -1.0, KPosInfTReal64, KErrNone, 1.0 }, // 8 + { -1.0, KNegInfTReal64, KErrNone, 1.0 }, // 9 + + // pow(+1, y) returns 1 for any y, even a NaN + { 1.0, 1.0, KErrNone, 1.0 }, // 10 + { 1.0, 10.0, KErrNone, 1.0 }, // 11 + { 1.0, -1.0, KErrNone, 1.0 }, // 12 + { 1.0, -10.0, KErrNone, 1.0 }, // 13 + { 1.0, 0.5, KErrNone, 1.0 }, // 14 + { 1.0, -0.5, KErrNone, 1.0 }, // 15 + { 1.0, KPosInfTReal64, KErrNone, 1.0 }, // 16 + { 1.0, KNegInfTReal64, KErrNone, 1.0 }, // 17 + { 1.0, KNaNTReal64, KErrNone, 1.0 }, // 18 + + // pow(x, +/-0) returns 1 for any x, even a NaN + { 1.0, KPosZeroTReal64, KErrNone, 1.0 }, // 19 + { 1.0, KNegZeroTReal64, KErrNone, 1.0 }, // 20 + { 2.0, KPosZeroTReal64, KErrNone, 1.0 }, // 21 + { 2.0, KNegZeroTReal64, KErrNone, 1.0 }, // 22 + { 0.5, KPosZeroTReal64, KErrNone, 1.0 }, // 23 + { 0.5, KNegZeroTReal64, KErrNone, 1.0 }, // 24 + { -1.0, KPosZeroTReal64, KErrNone, 1.0 }, // 25 + { -1.0, KNegZeroTReal64, KErrNone, 1.0 }, // 26 + { -2.0, KPosZeroTReal64, KErrNone, 1.0 }, // 27 + { -2.0, KNegZeroTReal64, KErrNone, 1.0 }, // 28 + { -0.5, KPosZeroTReal64, KErrNone, 1.0 }, // 29 + { -0.5, KNegZeroTReal64, KErrNone, 1.0 }, // 30 + { KPosZeroTReal64, KPosZeroTReal64, KErrNone, 1.0 }, // 31 + { KPosZeroTReal64, KNegZeroTReal64, KErrNone, 1.0 }, // 32 + { KNegZeroTReal64, KPosZeroTReal64, KErrNone, 1.0 }, // 33 + { KNegZeroTReal64, KNegZeroTReal64, KErrNone, 1.0 }, // 34 + { KPosInfTReal64, KPosZeroTReal64, KErrNone, 1.0 }, // 35 + { KPosInfTReal64, KNegZeroTReal64, KErrNone, 1.0 }, // 36 + { KNegInfTReal64, KPosZeroTReal64, KErrNone, 1.0 }, // 37 + { KNegInfTReal64, KNegZeroTReal64, KErrNone, 1.0 }, // 38 + { KNaNTReal64, KPosZeroTReal64, KErrNone, 1.0 }, // 39 + { KNaNTReal64, KNegZeroTReal64, KErrNone, 1.0 }, // 40 + + // pow(x, y) returns a NaN and raises the ''invalid'' floating-point + // exception for finite x < 0 and finite non-integer y + { -1.0, 1.5, KErrArgument, KNaNTReal64 }, // 41 + + // pow(x, -INF) returns +INF for |x| < 1 + { 0.5, KNegInfTReal64, KErrOverflow, KPosInfTReal64 }, // 42 + { -0.5, KNegInfTReal64, KErrOverflow, KPosInfTReal64 }, // 43 + + // pow(x, -INF) returns +0 for |x| > 1 + { 2, KNegInfTReal64, KErrNone, KPosZeroTReal64 }, // 44 + { -2, KNegInfTReal64, KErrNone, KPosZeroTReal64 }, // 45 + { 4.5, KNegInfTReal64, KErrNone, KPosZeroTReal64 }, // 46 + { -4.5, KNegInfTReal64, KErrNone, KPosZeroTReal64 }, // 47 + + // pow(x, +INF) returns +0 for |x| < 1 + { .5, KPosInfTReal64, KErrNone, KPosZeroTReal64 }, // 48 + { -.5, KPosInfTReal64, KErrNone, KPosZeroTReal64 }, // 49 + + // pow(x, +INF) returns +INF for |x| > 1 + { 2, KPosInfTReal64, KErrOverflow, KPosInfTReal64 }, // 50 + { -2, KPosInfTReal64, KErrOverflow, KPosInfTReal64 }, // 51 + { 4.5, KPosInfTReal64, KErrOverflow, KPosInfTReal64 }, // 52 + { -4.5, KPosInfTReal64, KErrOverflow, KPosInfTReal64 }, // 53 + + // pow(-INF, y) returns -0 for y an odd integer < 0 + { KNegInfTReal64, -1, KErrNone, KNegZeroTReal64 }, // 54 + { KNegInfTReal64, -5, KErrNone, KNegZeroTReal64 }, // 55 + + // pow(-INF, y) returns +0 for y < 0 and not an odd integer + { KNegInfTReal64, -2, KErrNone, KPosZeroTReal64 }, // 56 + { KNegInfTReal64, -5.5, KErrNone, KPosZeroTReal64 }, // 57 + + // pow(-INF, y) returns -INF for y an odd integer > 0 + { KNegInfTReal64, 1, KErrOverflow, KNegInfTReal64 }, // 58 + { KNegInfTReal64, 5, KErrOverflow, KNegInfTReal64 }, // 59 + + // pow(-INF, y) returns +INF for y > 0 and not an odd integer + { KNegInfTReal64, 2, KErrOverflow, KPosInfTReal64 }, // 60 + { KNegInfTReal64, 5.5, KErrOverflow, KPosInfTReal64 }, // 61 + + // pow(+INF, y) returns +0 for y < 0 + { KPosInfTReal64, -1, KErrNone, KPosZeroTReal64 }, // 62 + { KPosInfTReal64, -2, KErrNone, KPosZeroTReal64 }, // 63 + { KPosInfTReal64, -5, KErrNone, KPosZeroTReal64 }, // 64 + { KPosInfTReal64, -5.5, KErrNone, KPosZeroTReal64 }, // 65 + + // pow(+INF, y) returns +INF for y > 0 + { KPosInfTReal64, 1, KErrOverflow, KPosInfTReal64 }, // 66 + { KPosInfTReal64, 2, KErrOverflow, KPosInfTReal64 }, // 67 + { KPosInfTReal64, 5, KErrOverflow, KPosInfTReal64 }, // 68 + { KPosInfTReal64, 5.5, KErrOverflow, KPosInfTReal64 }, // 69 + }; + +struct POW10_TEST + { + TInt num; // input number + TReal res; // expected result + }; + +LOCAL_D POW10_TEST pow10teste[]= + { + {300,1.0E300}, + {-162,1.0E-162}, + {-300,1.0E-300}, + {-99,1.0E-99}, +// }; + +//LOCAL_D POW10_TEST pow10testa[]= +// { + {99,1.0E99}, + {283,1.0E283}, + {-89,1.0E-89}, + {-200,1.0E-200}, + {-43,1.0E-43}, + {24,1.0E24}, + {-310,K1EMinus310Real64}, + {-323,K1EMinus323Real64} + }; + +typedef struct + { + TReal num; // input number + TReal res; // expected result + } TESTSINE; + +#pragma warning ( disable : 4204 ) // non-constant aggregate initializer +LOCAL_D TESTSINE testsin[]= + { + {0.5,0.4794255386042029}, // These were found using S3a + {1.2,0.9320390859672263}, + {1.6,0.9995736030415051}, + {28.6,-0.3199399618841981}, + {-18.3,0.5223085896267315}, + {KPi/4,0.7071067811865474}, + {3*KPi/4,0.7071067811865474}, + {5*KPi/4,-0.7071067811865474}, + {-KPi/4,-0.7071067811865474}, + {KPi/3,0.8660254037844387}, + {-KPi/3,-0.8660254037844387}, + {KPi/6,0.5}, + {-KPi/6,-0.5}, + {150*KDegToRad,0.5}, + {210*KDegToRad,-0.5}, +// {KPi+1.0E-15,-7.657143961860984E-16}, // loss of significance will limit accuracy here +// 2*(KPi+1.0E-15),1.5314287923721969e-15} + }; + +typedef struct + { + TReal num; // input number + TReal res; // expected result + } TESTCOSINE; + +LOCAL_D TESTCOSINE testcos[]= + { + {0.5,0.8775825618903727}, // These were found using S3a + {1.2,0.3623577544766734}, + {1.6,-0.0291995223012888}, + {28.6,-0.9474378189567576}, + {-18.3,0.8527565521308730}, + {KPi/4,0.7071067811865474}, + {3*KPi/4,-0.7071067811865474}, + {5*KPi/4,-0.7071067811865474}, + {-KPi/4,0.7071067811865474}, + {KPi/6,0.8660254037844387}, + {5*KPi/6,-0.8660254037844387}, + {KPi/3,0.5}, + {4*KPi/3,-0.5}, + {120*KDegToRad,-0.5}, + {300*KDegToRad,0.5}, + {KPi+1.0E-15,-1.0}, + {2*(KPi+1.0E-15),1.0} + }; + +typedef struct + { + TReal angle; // angle for which the tangent is to be found + TReal result; // result + } TAN; + +LOCAL_D TAN testtan[]= + { + {KPi/4,1.0}, + {-KPi/4,-1.0}, + {45*KDegToRad,1.0}, + {KPi/3,1.732050807568877}, // Added by AnnW - Calculated on S3a + {2*KPi/3,-1.732050807568878}, // + {KPi/6,0.5773502691896257}, // + {-KPi/6,-0.5773502691896257}, // + {89*KDegToRad,57.28996163075913}, // these two should be the same! + {91*KDegToRad,-57.28996163075955}, // + {4E-123,4E-123}, + {-4E-123,-4E-123}, + }; + +typedef struct + { + TReal num; // input number + TReal res; // expected result + } TESTASC; + +LOCAL_D TESTASC testas[]= + { + {.75,.848062078981}, + {.82,.961411018764}, + {.87,1.055202320549}, + {.89,1.097345169523}, + {.90,1.119769514999}, + {.92,1.168080485214}, + {.94,1.222630305522}, + {.96,1.287002217587}, + {.99,1.429256853470}, + {1.0,1.570796326795}, + {0.0,0}, + {-1.0, -90.0*KDegToRad}, + {0.5,30.0*KDegToRad} + }; + +typedef struct + { + TReal num1; // Divisor + TReal num2; // Divand + TReal res; // expected result + } TESTATAN2; + +LOCAL_D TESTATAN2 testat2[]= + { + {5E-49,7E306,0.0}, // underflow, zero returned + {5E49,7E-306,KPiBy2}, // overflow, pi/2 returned + {0.45,0.5,0.732815101787}, + {0.12,0.3,0.380506377112}, + {0.3,0.0,KPiBy2}, // overflow, pi/2 returned + {-0.3,0.0,-KPiBy2}, // overflow, -pi/2 returned + {0.0,0.3,0.0}, + }; +#pragma warning ( default : 4204 ) + +typedef struct + { + TReal num; // input number + TReal res; // expected result + } INT_TEST; + +LOCAL_D INT_TEST testint1[]= + { + {1.0,1.0}, + {1.47934,1.0}, + {-72.86345,-72.0}, + {-734.9999,-734.0}, + {4855.9974,4855.0}, + {232478.35,232478.0}, + {0.029345,0.0}, + {0.9437,0.0}, + {-0.2634,0.0}, + {-0.98976,0.0}, + {32769.36946,32769.0}, + {-32774.997937,-32774.0}, + {8738465.38749,8738465.0}, + {-2348645.34965,-2348645.0}, + {2147483655.7565,2147483655.0}, + {-2147483657.89453,-2147483657.0}, + {2374843546.34E2,2374843546.34E2}, + {34780656.37643E12,34780656.37643E12}, + {-2374843546.34E2,-2374843546.34E2}, + {-34780656.37643E12,-34780656.37643E12}, + {468650.3874E47,468650.3874E47}, + {-4965.5987636E34,-4965.5987636E34}, + }; + +typedef struct + { + TReal num; // input number + TInt16 res; // expected result + } INTI_TEST; + +LOCAL_D INTI_TEST testint2[]= + { + {1.0,1}, + {1.47934,1}, + {-72.86345,-72}, + {-734.9999,-734}, + {4855.9974,4855}, + {0.029345,0}, + {0.9437,0}, + {-0.2634,0}, + {-0.98976,0}, + {3234.56,3234}, + {4698.435,4698}, + {-32767.47658,-32767}, + {32767.9830857,32767}, + {-32768.47658,-32767-1} + }; + +typedef struct + { + TReal num; // input number + TInt32 res; // expected result + } INTL_TEST; + +LOCAL_D INTL_TEST testint3[]= + { + {1.0,1l}, + {1.47934,1l}, + {-72.86345,-72l}, + {-734.9999,-734l}, + {4855.9974,4855l}, + {0.029345,0l}, + {0.9437,0l}, + {-0.2634,0l}, + {-0.98976,0l}, + {3234.56,3234l}, + {4698.435,4698l}, + {-32767.47658,-32767l}, + {32767.9830857,32767l}, + {32769.36946,32769l}, + {-32774.997937,-32774l}, + {64835903.74605,64835903l}, + {-46652024.393,-46652024l}, + {2147483647.34576,2147483647l}, + {-2147483647.9501,-2147483647l}, + {-2147483648.00,0x80000000l}, + {-2147483648.6843,0x80000000l} + }; + +typedef struct + { + TReal num; // input number + TReal res; // expected result + } FRAC_TEST; + +LOCAL_D FRAC_TEST testfrac[]= + { + {0.0,0.0}, + {KNegZeroTReal64,0.0}, + {1.0,0.0}, + {1.47934,.47934}, + {-72.86345,-.86345}, + {-734.9999,-.9999}, + {4855.9974,.9974}, + {232478.35,.35}, + {0.029345,.029345}, + {0.9437,0.9437}, + {-0.2634,-.2634}, + {-0.98976,-.98976}, + {32769.36946,.36946}, + {-32774.997937,-0.997937}, + {8738465.38749,0.38749}, + {-2348645.34965,-0.34965}, + {2147483655.7565,0.7565}, + {-2147483657.89453,-.89453}, + {2374843546.34E2,0.0}, + {34780656.37643E12,0.0}, + {-2374843546.34E2,0.0}, + {-34780656.37643E12,0.0}, + {468650.3874E47,0.0}, + {-4965.5987636E34,0.0} + }; + +typedef struct + { + TReal num; // input number + TReal mod; // modulo + TReal res; // expected result + } MOD_TEST; + +LOCAL_D MOD_TEST testmod[]= + { + {4.0,2.0,0.0}, + {3.0,2.0,1.0}, + {56.847,2.3,1.647}, + {-65.6478,.65,-.6478}, + {-6858.78432,-87.5323,-31.26492}, + {7665.140215,-34.98,4.520215}, + {.4645,1.0,0.4645}, + {-.246,1.0,-.246}, + {1.0,KPosInfTReal64,1.0}, + {1.0,KNegInfTReal64,1.0}, + {1.0E17,8.0,0.0}, + // + {1.0,3.0,1.0}, //0 + {2.0,3.0,2.0}, + {4.0,3.0,1.0}, + {8.0,3.0,2.0}, + {16.0,3.0,1.0}, + {32.0,3.0,2.0}, + {64.0,3.0,1.0}, + {128.0,3.0,2.0}, + {256.0,3.0,1.0}, + {512.0,3.0,2.0}, + {1024.0,3.0,1.0}, //10 + {2048.0,3.0,2.0}, + {4096.0,3.0,1.0}, + {8192.0,3.0,2.0}, + {16384.0,3.0,1.0}, + {32768.0,3.0,2.0}, + {65536.0,3.0,1.0}, + {131072.0,3.0,2.0}, + {262144.0,3.0,1.0}, + {524288.0,3.0,2.0}, + {1048576.0,3.0,1.0}, //20 + {2097152.0,3.0,2.0}, + {4194304.0,3.0,1.0}, + {8388608.0,3.0,2.0}, + {16777216.0,3.0,1.0}, + {33554432.0,3.0,2.0}, + {67108864.0,3.0,1.0}, + {134217728.0,3.0,2.0}, + {268435456.0,3.0,1.0}, + {536870912.0,3.0,2.0}, + {1073741824.0,3.0,1.0}, //30 + {2147483648.0,3.0,2.0}, + {4294967296.0,3.0,1.0}, + {8589934592.0,3.0,2.0}, + {17179869184.0,3.0,1.0}, + {34359738368.0,3.0,2.0}, + {68719476736.0,3.0,1.0}, + {137438953472.0,3.0,2.0}, + {274877906944.0,3.0,1.0}, + {549755813888.0,3.0,2.0}, + {1099511627776.0,3.0,1.0}, //40 + {2199023255552.0,3.0,2.0}, + {4398046511104.0,3.0,1.0}, + {8796093022208.0,3.0,2.0}, + {17592186044416.0,3.0,1.0}, + {35184372088832.0,3.0,2.0}, + {70368744177664.0,3.0,1.0}, + {140737488355328.0,3.0,2.0}, + {281474976710656.0,3.0,1.0}, + {562949953421312.0,3.0,2.0}, + {1125899906842624.0,3.0,1.0}, //50 + {2251799813685248.0,3.0,2.0}, + {4503599627370496.0,3.0,1.0}, + {9007199254740992.0,3.0,2.0}, + {18014398509481984.0,3.0,1.0}, + {6.626176E-34,299792458.0,6.626176E-34}, + {-1.6022E-19,6.022045E23,-1.6022E-19}, + {0.0,2.71828182845904524,0.0} + }; + +// expected result is unused in following - will be zero in all cases +LOCAL_D MOD_TEST testmod2[]= + { + {1.0E17,7.9,0.0}, + {1.0E100,4.0,0.0}, + {KMaxTReal64,5.0,0.0}, + {-KMaxTReal64,5.0,0.0}, + {0.125,1.0E-17,0.0}, + {36028797019963968.0,2.0,0.0}, // 2**55,2**1 + // + {36028797019963968.0,3.0,0.0}, //55 + {72057594039927936.0,3.0,0.0}, + {144115188079855872.0,3.0,0.0}, + {288230376159711744.0,3.0,0.0}, + }; + +TInt testApprox(TReal aFound,TReal aExpect,TReal aTol) +// +// Tests relative error, i.e. whether (aFound-aExpect)/aFound <= aTol +// + { + + TRealX diff,check,l,r,t; + l.Set(aFound); + r.Set(aExpect); + t.Set(aTol); + if (l.Mult(check,t)==KErrUnderflow) + { + l*=TRealX(1.0E20); + r*=TRealX(1.0E20); + } + diff=l-r; + if (diff.IsZero()) + return ETrue; + if (!l.IsZero()) + diff.DivEq(l); + if (Abs(TReal(diff))<=aTol) + return ETrue; + return EFalse; + } + +LOCAL_C void randrng(TReal& pret,TReal& llim,TReal& ulim) +/* +Returns a random number in the range [llim,ulim] +*/ + { + + pret=Math::FRand(rseed); + pret*=ulim-llim; + pret+=llim; + } + +LOCAL_C TReal taylor(TReal x,TInt k) +/* +Evaluate the Taylor series approximation to arc sine up to terms of order k +*/ + //TReal x; // argument + //TInt k; // Highest order term + { + + TInt i,j; + TReal den,num,res,term,di; + + den=1; + num=1; + term=0; + for (i=1;i<=k;i+=2) + { + for (j=2;j0;i--) + { + tot+=TRealX(sign)/TRealX(i); + tot*=xx; + sign=-sign; + } + TReal tot2=(TReal)tot; + test(Math::Ln(res,x)==KErrNone); + test(testApprox(res,tot2,1.0E-15)); + } + } + +LOCAL_C void lntest3() +/* +Test numbers in the range sqrt(.5) to 15/16, using the identity +ln(x)=ln(17x/16)-ln(17/16) +*/ + { + + TReal x,cnstln,cnstlnx,res; + + TReal low=KSqhf; + TReal upp=15.0/16.0; + TReal cnst=17.0/16.0; + test(Math::Ln(cnstln,cnst)==KErrNone); + for (TInt j=0;j<10;j++) + { + randrng(x,low,upp); + test(Math::Ln(res,x)==KErrNone); + TReal num=cnst*x; + test(Math::Ln(cnstlnx,num)==KErrNone); + test(testApprox(res,(cnstlnx-cnstln),1.0E-15)); + } + } + +LOCAL_C void lntest4() +/* +Test numbers in the range 16 to 240 using the identity ln(x*x)=2ln(x) +*/ + { + + TReal cnstlnx,res; + + TReal low=16.0; + TReal upp=240.0; + TReal x=16.0; + test(Math::Ln(res,-1)==KErrArgument); + for (TInt j=0;j<10;j++) + { + randrng(x,low,upp); + TReal num=x*x; + test(Math::Ln(res,num)==KErrNone); + test(Math::Ln(cnstlnx,x)==KErrNone); + test(testApprox(res,2*cnstlnx,1.0E-15)); + } + } + +LOCAL_C void exptest1() +/* +To test exponent for specific values +*/ + { + + TReal res; + + // test errors + test(Math::Exp(res,KNaNTReal64)==KErrArgument); + test(Math::IsNaN(res)); + test(Math::Exp(res,KPosInfTReal64)==KErrOverflow); + test(res==KPosInfTReal64); + test(Math::Exp(res,709.8)==KErrOverflow); + test(res==KPosInfTReal64); + test(Math::Exp(res,KNegInfTReal64)==KErrUnderflow); + test(Math::IsZero(res)); + test(Math::Exp(res,-745.2)==KErrUnderflow); + test(Math::IsZero(res)); + + TInt i=sizeof(testexp)/sizeof(EXP); + for (TInt j=0;j0); + } + +LOCAL_C void tantest3() +/* +To test the identity tan(-x)=-tan(x) on the range [-1.5,1.5] +*/ + { + + TReal x,res,rres; + + TReal low=(-1.5); + TReal upp=1.5; + for (TInt j=0;j<10;j++) + { + randrng(x,low,upp); + test(Math::Tan(res,x)==KErrNone); + x*=(-1); + test(Math::Tan(rres,x)==KErrNone); + test(testApprox(rres,-res,1.0E-15)); + } + } + +LOCAL_C void tantest4() +/* +To test the identity tan(x)=x for x<<1 +*/ + { + + TReal x,res; + + TReal low=1E-90; + TReal upp=1E-10; + for (TInt j=0;j<10;j++) + { + randrng(x,low,upp); + test(Math::Tan(res,x)==KErrNone); + test(testApprox(res,x,1.0E-15)); + } + + // Check some denormals + test(Math::Tan(res,5E-324)==KErrNone); + test(res==5E-324); + test(Math::Tan(res,-1.234567891234E-315)==KErrNone); + test(res==-1.234567891234E-315); + } +/* +LOCAL_C void tantest5() + +// To test that exact results are given for multiples of KPi +// Added by AnnW, October 1996 + + { + + TReal res; + TInt j; + TInt mult=101; // can use up to 32768 + + test(Math::Tan(res,KNegZeroTReal64)==KErrNone); + test(res==KNegZeroTReal64); + + for (j=-(mult-1); j +#include +#include + +struct SReal32 + { + unsigned man:23; + unsigned exp:8; + unsigned sign:1; + }; + +#if defined(__DOUBLE_WORDS_SWAPPED__) +struct SReal64 + { + unsigned msm:20; + unsigned exp:11; + unsigned sign:1; + TUint lsm; + }; +#define DVAL(m0,m1,m2,m3,e) {(TUint)((m0<<16)|m1),e+KExponentBias,0,(TUint)((m2<<16)|m3)} +#else +struct SReal64 + { + TUint lsm; + unsigned msm:20; + unsigned exp:11; + unsigned sign:1; + }; +#define DVAL(m0,m1,m2,m3,e) {(TUint)((m2<<16)|m3),(TUint)((m0<<16)|m1),e+KExponentBias,0} +#endif + +enum TMathPanic + { + EMathDivideByZero, + EMathOverflow, + EMathUnderflow, + EMathBadOperand, + EMathUnknownError + }; + +GLREF_C void Panic(TMathPanic aPanic); diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_math2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_math2.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,25364 @@ +/* +* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* e32test\math\t_math2.cpp +* +*/ + + +/** +Overview: + Test accuracy of functions in the maths library. + +API Information: + Math. + +Details: + - Test division and remainders of specified data is as per IEEE 754 standards. + - Calculate sine, cosine, tangent of specified number and test its accuracy is + as expected. + - Calculate exponential, Logarithm, Square root, Arctangent, Arcsine of + specified number and test its accuracy is as expected. + - Calculate the power of value raised to specified real value is as expected. + +Platforms/Drives/Compatibility: + All + +Assumptions/Requirement/Pre-requisites: + +Failures and causes: + +Base Port information: +*/ + +#include +#include +#include + + +LOCAL_D RTest test(_L("T_MATH2")); + +LOCAL_D TUint32 IEEERemainderTestVectors[]= + { + // IEEE Remainder test vector data - 6 words per test + // dividend high, dividend low, divisor high, divisor low, result high, result low + + // java lang spec tests + 0x7fffffff, 0xffffffff, 0x40080000, 0x00000000, 0x7fffffff, 0xffffffff, + 0x40080000, 0x00000000, 0x7fffffff, 0xffffffff, 0x7fffffff, 0xffffffff, + 0x7ff00000, 0x00000000, 0x40080000, 0x00000000, 0x7fffffff, 0xffffffff, + 0xfff00000, 0x00000000, 0x40080000, 0x00000000, 0x7fffffff, 0xffffffff, + 0x40080000, 0x00000000, 0x00000000, 0x00000000, 0x7fffffff, 0xffffffff, + 0x40080000, 0x00000000, 0x80000000, 0x00000000, 0x7fffffff, 0xffffffff, + 0x40080000, 0x00000000, 0x7ff00000, 0x00000000, 0x40080000, 0x00000000, + 0x40080000, 0x00000000, 0xfff00000, 0x00000000, 0x40080000, 0x00000000, + // Interval tests with first index from -1.000000e+04 to 1.000000e+05 by 4.375340e+02 and second index from -1.000000e+01 to 1.000000e+01 by 3.789500e+00 + 0xc0c38800, 0x00000000, 0xc0240000, 0x00000000, 0x80000000, 0x00000000, + 0xc0c38800, 0x00000000, 0xc018d78d, 0x4fdf3b64, 0xbff1851e, 0xb851f460, + 0xc0c38800, 0x00000000, 0xc0035e35, 0x3f7ced91, 0x3ff26a7e, 0xf9db15a6, + 0xc0c38800, 0x00000000, 0x3ff5e560, 0x4189374c, 0xbfd7b645, 0xa1caa6f0, + 0xc0c38800, 0x00000000, 0x4014a1ca, 0xc083126e, 0x3ff5cac0, 0x83125ca8, + 0xc0c38800, 0x00000000, 0x4021e51e, 0xb851eb85, 0x400a70a3, 0xd70a3b58, + 0xc0c2ad3b, 0xa5e353f8, 0xc0240000, 0x00000000, 0xc003ba5e, 0x353f8000, + 0xc0c2ad3b, 0xa5e353f8, 0xc018d78d, 0x4fdf3b64, 0x3ffb4395, 0x81061640, + 0xc0c2ad3b, 0xa5e353f8, 0xc0035e35, 0x3f7ced91, 0x3fdef9db, 0x22d09a70, + 0xc0c2ad3b, 0xa5e353f8, 0x3ff5e560, 0x4189374c, 0x3fe39581, 0x0624dd20, + 0xc0c2ad3b, 0xa5e353f8, 0x4014a1ca, 0xc083126e, 0x3fddd2f1, 0xa9fb8a40, + 0xc0c2ad3b, 0xa5e353f8, 0x4021e51e, 0xb851eb85, 0x40034ac0, 0x83126984, + 0xc0c1d277, 0x4bc6a7f0, 0xc0240000, 0x00000000, 0xc013ba5e, 0x353f8000, + 0xc0c1d277, 0x4bc6a7f0, 0xc018d78d, 0x4fdf3b64, 0xbffb51eb, 0x851eccb0, + 0xc0c1d277, 0x4bc6a7f0, 0xc0035e35, 0x3f7ced91, 0xbfc76c8b, 0x43964370, + 0xc0c1d277, 0x4bc6a7f0, 0x3ff5e560, 0x4189374c, 0x3fcced91, 0x68727c80, + 0xc0c1d277, 0x4bc6a7f0, 0x4014a1ca, 0xc083126e, 0xbfdb851e, 0xb8525e20, + 0xc0c1d277, 0x4bc6a7f0, 0x4021e51e, 0xb851eb85, 0x3ff849ba, 0x5e352f60, + 0xc0c0f7b2, 0xf1a9fbe8, 0xc0240000, 0x00000000, 0x4004d0e5, 0x60418000, + 0xc0c0f7b2, 0xf1a9fbe8, 0xc018d78d, 0x4fdf3b64, 0x3ff176c8, 0xb4393df0, + 0xc0c0f7b2, 0xf1a9fbe8, 0xc0035e35, 0x3f7ced91, 0xbfeb3333, 0x33336ef0, + 0xc0c0f7b2, 0xf1a9fbe8, 0x3ff5e560, 0x4189374c, 0xbfc47ae1, 0x47ae7b80, + 0xc0c0f7b2, 0xf1a9fbe8, 0x4014a1ca, 0xc083126e, 0xbff5374b, 0xc6a811a0, + 0xc0c0f7b2, 0xf1a9fbe8, 0x4021e51e, 0xb851eb85, 0x3fe3fbe7, 0x6c8b1770, + 0xc0c01cee, 0x978d4fe0, 0xc0240000, 0x00000000, 0x3fc16872, 0xb0200000, + 0xc0c01cee, 0x978d4fe0, 0xc018d78d, 0x4fdf3b64, 0xc0028f5c, 0x28f5d280, + 0xc0c01cee, 0x978d4fe0, 0xc0035e35, 0x3f7ced91, 0x3feced91, 0x68726940, + 0xc0c01cee, 0x978d4fe0, 0x3ff5e560, 0x4189374c, 0xbfe178d4, 0xfdf3dce0, + 0xc0c01cee, 0x978d4fe0, 0x4014a1ca, 0xc083126e, 0xc001c6a7, 0xef9dc5dc, + 0xc0c01cee, 0x978d4fe0, 0x4021e51e, 0xb851eb85, 0xbfd1374b, 0xc6a85fc0, + 0xc0be8454, 0x7ae147b0, 0xc0240000, 0x00000000, 0xc002a3d7, 0x0a3d8000, + 0xc0be8454, 0x7ae147b0, 0xc018d78d, 0x4fdf3b64, 0x3fdea7ef, 0x9db19680, + 0xc0be8454, 0x7ae147b0, 0xc0035e35, 0x3f7ced91, 0x3fce5604, 0x18922cb0, + 0xc0be8454, 0x7ae147b0, 0x3ff5e560, 0x4189374c, 0x3fdbef9d, 0xb22ca770, + 0xc0be8454, 0x7ae147b0, 0x4014a1ca, 0xc083126e, 0x400051eb, 0x851ea1f4, + 0xc0be8454, 0x7ae147b0, 0x4021e51e, 0xb851eb85, 0xbff29999, 0x9999bb98, + 0xc0bccecb, 0xc6a7efa0, 0xc0240000, 0x00000000, 0xc0132f1a, 0x9fbe8000, + 0xc0bccecb, 0xc6a7efa0, 0xc018d78d, 0x4fdf3b64, 0xc00775c2, 0x8f5c3ea8, + 0xc0bccecb, 0xc6a7efa0, 0xc0035e35, 0x3f7ced91, 0xbfdb851e, 0xb852a5d0, + 0xc0bccecb, 0xc6a7efa0, 0x3ff5e560, 0x4189374c, 0x3fa9db22, 0xd0e15b80, + 0xc0bccecb, 0xc6a7efa0, 0x4014a1ca, 0xc083126e, 0x3ff24dd2, 0xf1a9c9d0, + 0xc0bccecb, 0xc6a7efa0, 0x4021e51e, 0xb851eb85, 0xc00072b0, 0x20c4afa0, + 0xc0bb1943, 0x126e9790, 0xc0240000, 0x00000000, 0x4005e76c, 0x8b438000, + 0xc0bb1943, 0x126e9790, 0xc018d78d, 0x4fdf3b64, 0xbfc11687, 0x2b039580, + 0xc0bb1943, 0x126e9790, 0xc0035e35, 0x3f7ced91, 0xbff18d4f, 0xdf3b987e, + 0xc0bb1943, 0x126e9790, 0x3ff5e560, 0x4189374c, 0xbfd578d4, 0xfdf45090, + 0xc0bb1943, 0x126e9790, 0x4014a1ca, 0xc083126e, 0x3fcfbe76, 0xc8b27dc0, + 0xc0bb1943, 0x126e9790, 0x4021e51e, 0xb851eb85, 0xc0079893, 0x74bc8174, + 0xc0b963ba, 0x5e353f80, 0xc0240000, 0x00000000, 0x3fd16872, 0xb0200000, + 0xc0b963ba, 0x5e353f80, 0xc018d78d, 0x4fdf3b64, 0x400552f1, 0xa9fbcbf8, + 0xc0b963ba, 0x5e353f80, 0xc0035e35, 0x3f7ced91, 0x3fe50624, 0xdd2ea734, + 0xc0b963ba, 0x5e353f80, 0x3ff5e560, 0x4189374c, 0x3fe4b439, 0x58100850, + 0xc0b963ba, 0x5e353f80, 0x4014a1ca, 0xc083126e, 0xbfe4bc6a, 0x7efa54c0, + 0xc0b963ba, 0x5e353f80, 0x4021e51e, 0xb851eb85, 0xc00ebe76, 0xc8b45348, + 0xc0b7ae31, 0xa9fbe770, 0xc0240000, 0x00000000, 0xc0018d4f, 0xdf3b8000, + 0xc0b7ae31, 0xa9fbe770, 0xc018d78d, 0x4fdf3b64, 0xbfe7df3b, 0x645a9600, + 0xc0b7ae31, 0xa9fbe770, 0xc0035e35, 0x3f7ced91, 0xbf847ae1, 0x47cdb800, + 0xc0b7ae31, 0xa9fbe770, 0x3ff5e560, 0x4189374c, 0x3fd0b439, 0x580f94a0, + 0xc0b7ae31, 0xa9fbe770, 0x4014a1ca, 0xc083126e, 0xbff8b439, 0x5810a478, + 0xc0b7ae31, 0xa9fbe770, 0x4021e51e, 0xb851eb85, 0x4010d810, 0x624dc47c, + 0xc0b5f8a8, 0xf5c28f60, 0xc0240000, 0x00000000, 0xc012a3d7, 0x0a3d8000, + 0xc0b5f8a8, 0xf5c28f60, 0xc018d78d, 0x4fdf3b64, 0x40006c8b, 0x43955fd0, + 0xc0b5f8a8, 0xf5c28f60, 0xc0035e35, 0x3f7ced91, 0xbfe5a9fb, 0xe76d14f4, + 0xc0b5f8a8, 0xf5c28f60, 0x3ff5e560, 0x4189374c, 0xbfc00000, 0x0001cec0, + 0xc0b5f8a8, 0xf5c28f60, 0x4014a1ca, 0xc083126e, 0xc003851e, 0xb8520f48, + 0xc0b5f8a8, 0xf5c28f60, 0x4021e51e, 0xb851eb85, 0x400a8a3d, 0x70a3b724, + 0xc0b44320, 0x41893750, 0xc0240000, 0x00000000, 0x4006fdf3, 0xb6458000, + 0xc0b44320, 0x41893750, 0xc018d78d, 0x4fdf3b64, 0xbff5bc6a, 0x7efa2350, + 0xc0b44320, 0x41893750, 0xc0035e35, 0x3f7ced91, 0x3ff13b64, 0x5a1c619e, + 0xc0b44320, 0x41893750, 0x3ff5e560, 0x4189374c, 0xbfe05a1c, 0xac08b1b0, + 0xc0b44320, 0x41893750, 0x4014a1ca, 0xc083126e, 0x3ffd26e9, 0x78d4b110, + 0xc0b44320, 0x41893750, 0x4021e51e, 0xb851eb85, 0x4003645a, 0x1cabe550, + 0xc0b28d97, 0x8d4fdf40, 0xc0240000, 0x00000000, 0x3fda1cac, 0x08300000, + 0xc0b28d97, 0x8d4fdf40, 0xc018d78d, 0x4fdf3b64, 0x3ff70c49, 0xba5de750, + 0xc0b28d97, 0x8d4fdf40, 0xc0035e35, 0x3f7ced91, 0x3fda3d70, 0xa3d5ca50, + 0xc0b28d97, 0x8d4fdf40, 0x3ff5e560, 0x4189374c, 0x3fde2d0e, 0x5602fdd0, + 0xc0b28d97, 0x8d4fdf40, 0x4014a1ca, 0xc083126e, 0x3feda1ca, 0xc0826df0, + 0xc0b28d97, 0x8d4fdf40, 0x4021e51e, 0xb851eb85, 0x3ff87ced, 0x916826f8, + 0xc0b0d80e, 0xd9168730, 0xc0240000, 0x00000000, 0xc00076c8, 0xb4398000, + 0xc0b0d80e, 0xd9168730, 0xc018d78d, 0x4fdf3b64, 0xbfff8937, 0x4bc6fba0, + 0xc0b0d80e, 0xd9168730, 0xc0035e35, 0x3f7ced91, 0xbfd072b0, 0x20c5f1d8, + 0xc0b0d80e, 0xd9168730, 0x3ff5e560, 0x4189374c, 0x3fb5e353, 0xf7ca0740, + 0xc0b0d80e, 0xd9168730, 0x4014a1ca, 0xc083126e, 0x3f9eb851, 0xeb6f3800, + 0xc0b0d80e, 0xd9168730, 0x4021e51e, 0xb851eb85, 0x3fe4624d, 0xd2f106a0, + 0xc0ae450c, 0x49ba5e3f, 0xc0240000, 0x00000000, 0xc0121893, 0x74bc7e00, + 0xc0ae450c, 0x49ba5e3f, 0xc018d78d, 0x4fdf3b64, 0x3fea7ef9, 0xdb222e00, + 0xc0ae450c, 0x49ba5e3f, 0xc0035e35, 0x3f7ced91, 0xbfed9168, 0x72b0c700, + 0xc0ae450c, 0x49ba5e3f, 0x3ff5e560, 0x4189374c, 0xbfd33b64, 0x5a1dda30, + 0xc0ae450c, 0x49ba5e3f, 0x4014a1ca, 0xc083126e, 0xbfebb645, 0xa1cb6a70, + 0xc0ae450c, 0x49ba5e3f, 0x4021e51e, 0xb851eb85, 0xbfd06a7e, 0xf9dc6160, + 0xc0aad9fa, 0xe147ae1e, 0xc0240000, 0x00000000, 0x4008147a, 0xe1478800, + 0xc0aad9fa, 0xe147ae1e, 0xc018d78d, 0x4fdf3b64, 0xc004ab02, 0x0c49e1f8, + 0xc0aad9fa, 0xe147ae1e, 0xc0035e35, 0x3f7ced91, 0x3fea8f5c, 0x28f52130, + 0xc0aad9fa, 0xe147ae1e, 0x3ff5e560, 0x4189374c, 0x3fe5d2f1, 0xa9fb5380, + 0xc0aad9fa, 0xe147ae1e, 0x4014a1ca, 0xc083126e, 0xbffc3126, 0xe9792750, + 0xc0aad9fa, 0xe147ae1e, 0x4021e51e, 0xb851eb85, 0xbff26666, 0x6666b400, + 0xc0a76ee9, 0x78d4fdfd, 0xc0240000, 0x00000000, 0x3fe16872, 0xb0203000, + 0xc0a76ee9, 0x78d4fdfd, 0xc018d78d, 0x4fdf3b64, 0x3fcb9581, 0x06227580, + 0xc0a76ee9, 0x78d4fdfd, 0xc0035e35, 0x3f7ced91, 0x3fc4dd2f, 0x1a9d4c70, + 0xc0a76ee9, 0x78d4fdfd, 0x3ff5e560, 0x4189374c, 0x3fd2f1a9, 0xfbe64b00, + 0xc0a76ee9, 0x78d4fdfd, 0x4014a1ca, 0xc083126e, 0x4003ffff, 0xffffd828, + 0xc0a76ee9, 0x78d4fdfd, 0x4021e51e, 0xb851eb85, 0xc0005916, 0x872b27d4, + 0xc0a403d8, 0x10624ddc, 0xc0240000, 0x00000000, 0xbffec083, 0x126ee000, + 0xc0a403d8, 0x10624ddc, 0xc018d78d, 0x4fdf3b64, 0x40081db2, 0x2d0e30a8, + 0xc0a403d8, 0x10624ddc, 0xc0035e35, 0x3f7ced91, 0xbfe020c4, 0x9ba67af8, + 0xc0a403d8, 0x10624ddc, 0x3ff5e560, 0x4189374c, 0xbfb70a3d, 0x70a84400, + 0xc0a403d8, 0x10624ddc, 0x4014a1ca, 0xc083126e, 0x3ff9a9fb, 0xe76c3e38, + 0xc0a403d8, 0x10624ddc, 0x4021e51e, 0xb851eb85, 0xc0077ef9, 0xdb22f5a8, + 0xc0a098c6, 0xa7ef9dbb, 0xc0240000, 0x00000000, 0xc0118d4f, 0xdf3b7600, + 0xc0a098c6, 0xa7ef9dbb, 0xc018d78d, 0x4fdf3b64, 0xbfd96872, 0xb021e680, + 0xc0a098c6, 0xa7ef9dbb, 0xc0035e35, 0x3f7ced91, 0xbff2bc6a, 0x7efa2486, + 0xc0a098c6, 0xa7ef9dbb, 0x3ff5e560, 0x4189374c, 0xbfde76c8, 0xb43a6d00, + 0xc0a098c6, 0xa7ef9dbb, 0x4014a1ca, 0xc083126e, 0x3fe6a7ef, 0x9db19840, + 0xc0a098c6, 0xa7ef9dbb, 0x4021e51e, 0xb851eb85, 0xc00ea4dd, 0x2f1ac37c, + 0xc09a5b6a, 0x7ef9db34, 0xc0240000, 0x00000000, 0x40092b02, 0x0c499800, + 0xc09a5b6a, 0x7ef9db34, 0xc018d78d, 0x4fdf3b64, 0x4003374b, 0xc6a7cc80, + 0xc09a5b6a, 0x7ef9db34, 0xc0035e35, 0x3f7ced91, 0x3fe2a7ef, 0x9db19f24, + 0xc09a5b6a, 0x7ef9db34, 0x3ff5e560, 0x4189374c, 0x3fe0353f, 0x7ced0a18, + 0xc09a5b6a, 0x7ef9db34, 0x4014a1ca, 0xc083126e, 0xbfc81062, 0x4dd52fc0, + 0xc09a5b6a, 0x7ef9db34, 0x4021e51e, 0xb851eb85, 0x4010e4dd, 0x2f1a8e62, + 0xc0938547, 0xae147af2, 0xc0240000, 0x00000000, 0x3fe5c28f, 0x5c287000, + 0xc0938547, 0xae147af2, 0xc018d78d, 0x4fdf3b64, 0xbff026e9, 0x78d541f0, + 0xc0938547, 0xae147af2, 0xc0035e35, 0x3f7ced91, 0xbfb58106, 0x24e17780, + 0xc0938547, 0xae147af2, 0x3ff5e560, 0x4189374c, 0x3fbed916, 0x8726e0c0, + 0xc0938547, 0xae147af2, 0x4014a1ca, 0xc083126e, 0xbff15810, 0x624e1810, + 0xc0938547, 0xae147af2, 0x4021e51e, 0xb851eb85, 0x400aa3d7, 0x0a3d4ef0, + 0xc0895e49, 0xba5e3561, 0xc0240000, 0x00000000, 0xbffc9374, 0xbc6ac200, + 0xc0895e49, 0xba5e3561, 0xc018d78d, 0x4fdf3b64, 0x3ffca1ca, 0xc082ceb0, + 0xc0895e49, 0xba5e3561, 0xc0035e35, 0x3f7ced91, 0xbfe80831, 0x26ea0104, + 0xc0895e49, 0xba5e3561, 0x3ff5e560, 0x4189374c, 0xbfd0fdf3, 0xb646abd0, + 0xc0895e49, 0xba5e3561, 0x4014a1ca, 0xc083126e, 0xbfffae14, 0x7ae18c28, + 0xc0895e49, 0xba5e3561, 0x4021e51e, 0xb851eb85, 0x40037df3, 0xb645801c, + 0xc0776408, 0x3126e9bc, 0xc0240000, 0x00000000, 0xc011020c, 0x49ba6f00, + 0xc0776408, 0x3126e9bc, 0xc018d78d, 0x4fdf3b64, 0xbff9f3b6, 0x45a20e40, + 0xc0776408, 0x3126e9bc, 0xc0035e35, 0x3f7ced91, 0x3ff00c49, 0xba5df196, + 0xc0776408, 0x3126e9bc, 0x3ff5e560, 0x4189374c, 0xbfe4d916, 0x872b87e8, + 0xc0776408, 0x3126e9bc, 0x4014a1ca, 0xc083126e, 0x40024189, 0x374ba4bc, + 0xc0776408, 0x3126e9bc, 0x4021e51e, 0xb851eb85, 0x3ff8b020, 0xc49b6290, + 0x404fa418, 0x9374ba50, 0xc0240000, 0x00000000, 0x400a4189, 0x374ba500, + 0x404fa418, 0x9374ba50, 0xc018d78d, 0x4fdf3b64, 0x3ff2d4fd, 0xf3b60260, + 0x404fa418, 0x9374ba50, 0xc0035e35, 0x3f7ced91, 0x3fd58106, 0x24dc2230, + 0x404fa418, 0x9374ba50, 0x3ff5e560, 0x4189374c, 0x3fd52f1a, 0x9fbd6960, + 0x404fa418, 0x9374ba50, 0x4014a1ca, 0xc083126e, 0x3ff62d0e, 0x5603d560, + 0x404fa418, 0x9374ba50, 0x4021e51e, 0xb851eb85, 0x3fe4c8b4, 0x395789d0, + 0x407f4d0e, 0x56041850, 0xc0240000, 0x00000000, 0x3fea1cac, 0x0830a000, + 0x407f4d0e, 0x56041850, 0xc018d78d, 0x4fdf3b64, 0xc001e041, 0x89376d48, + 0x407f4d0e, 0x56041850, 0xc0035e35, 0x3f7ced91, 0xbfd52f1a, 0x9fbf81f8, + 0x407f4d0e, 0x56041850, 0x3ff5e560, 0x4189374c, 0xbfac28f5, 0xc297d500, + 0x407f4d0e, 0x56041850, 0x4014a1ca, 0xc083126e, 0x3fdf5c28, 0xf5c18520, + 0x407f4d0e, 0x56041850, 0x4021e51e, 0xb851eb85, 0xbfcf3b64, 0x5a1ec600, + 0x408d52cc, 0xccccccab, 0xc0240000, 0x00000000, 0xbffa6666, 0x6666aa00, + 0x408d52cc, 0xccccccab, 0xc018d78d, 0x4fdf3b64, 0x3fe21062, 0x4dd26c20, + 0x408d52cc, 0xccccccab, 0xc0035e35, 0x3f7ced91, 0xbfefef9d, 0xb22d9310, + 0x408d52cc, 0xccccccab, 0x3ff5e560, 0x4189374c, 0xbfdc3958, 0x10635ea0, + 0x408d52cc, 0xccccccab, 0x4014a1ca, 0xc083126e, 0xbfd9fbe7, 0x6c8c4b40, + 0x408d52cc, 0xccccccab, 0x4021e51e, 0xb851eb85, 0xbff23333, 0x33337668, + 0x40957f89, 0x374bc697, 0xc0240000, 0x00000000, 0xc01076c8, 0xb4396900, + 0x40957f89, 0x374bc697, 0xc018d78d, 0x4fdf3b64, 0xc006c6a7, 0xef9dd370, + 0x40957f89, 0x374bc697, 0xc0035e35, 0x3f7ced91, 0x3fe83126, 0xe9785120, + 0x40957f89, 0x374bc697, 0x3ff5e560, 0x4189374c, 0x3fe153f7, 0xced88d48, + 0x40957f89, 0x374bc697, 0x4014a1ca, 0xc083126e, 0xbff4d4fd, 0xf3b686e8, + 0x40957f89, 0x374bc697, 0x4021e51e, 0xb851eb85, 0xc0003f7c, 0xed918a08, + 0x409c55ac, 0x083126d8, 0xc0240000, 0x00000000, 0x400b5810, 0x624db000, + 0x409c55ac, 0x083126d8, 0xc018d78d, 0x4fdf3b64, 0xbfa89374, 0xbc730800, + 0x409c55ac, 0x083126d8, 0xc0035e35, 0x3f7ced91, 0x3fb6c8b4, 0x3953d860, + 0x409c55ac, 0x083126d8, 0x3ff5e560, 0x4189374c, 0x3fc3e76c, 0x8b415d20, + 0x409c55ac, 0x083126d8, 0x4014a1ca, 0xc083126e, 0xc0019581, 0x0624fe80, + 0x409c55ac, 0x083126d8, 0x4021e51e, 0xb851eb85, 0xc0076560, 0x418959dc, + 0x40a195e7, 0x6c8b438d, 0xc0240000, 0x00000000, 0x3fee76c8, 0xb438d000, + 0x40a195e7, 0x6c8b438d, 0xc018d78d, 0x4fdf3b64, 0x4006020c, 0x49ba3d30, + 0x40a195e7, 0x6c8b438d, 0xc0035e35, 0x3f7ced91, 0xbfe27ef9, 0xdb235308, + 0x40a195e7, 0x6c8b438d, 0x3ff5e560, 0x4189374c, 0xbfcd8106, 0x24df5ae0, + 0x40a195e7, 0x6c8b438d, 0x4014a1ca, 0xc083126e, 0x40008312, 0x6e976d50, + 0x40a195e7, 0x6c8b438d, 0x4021e51e, 0xb851eb85, 0xc00e8b43, 0x958127b0, + 0x40a500f8, 0xd4fdf3ae, 0xc0240000, 0x00000000, 0xbff83958, 0x10629000, + 0x40a500f8, 0xd4fdf3ae, 0xc018d78d, 0x4fdf3b64, 0xbfe522d0, 0xe560c120, + 0x40a500f8, 0xd4fdf3ae, 0xc0035e35, 0x3f7ced91, 0x3ff2d0e5, 0x60414a94, + 0x40a500f8, 0xd4fdf3ae, 0x3ff5e560, 0x4189374c, 0xbfe3ba5e, 0x354004b8, + 0x40a500f8, 0xd4fdf3ae, 0x4014a1ca, 0xc083126e, 0x3ff2b020, 0xc49b6888, + 0x40a500f8, 0xd4fdf3ae, 0x4021e51e, 0xb851eb85, 0x4010f1a9, 0xfbe75c48, + 0x40a86c0a, 0x3d70a3cf, 0xc0240000, 0x00000000, 0xc00fd70a, 0x3d70c400, + 0x40a86c0a, 0x3d70a3cf, 0xc018d78d, 0x4fdf3b64, 0x40011ba5, 0xe353d908, + 0x40a86c0a, 0x3d70a3cf, 0xc0035e35, 0x3f7ced91, 0x3fe049ba, 0x5e34c714, + 0x40a86c0a, 0x3d70a3cf, 0x3ff5e560, 0x4189374c, 0x3fd76c8b, 0x439477c0, + 0x40a86c0a, 0x3d70a3cf, 0x4014a1ca, 0xc083126e, 0x3fd16872, 0xb01fd9c0, + 0x40a86c0a, 0x3d70a3cf, 0x4021e51e, 0xb851eb85, 0x400abd70, 0xa3d6eabc, + 0x40abd71b, 0xa5e353f0, 0xc0240000, 0x00000000, 0x400c6e97, 0x8d4fc000, + 0x40abd71b, 0xa5e353f0, 0xc018d78d, 0x4fdf3b64, 0xbff45e35, 0x3f7d28e0, + 0x40abd71b, 0xa5e353f0, 0xc0035e35, 0x3f7ced91, 0xbfc43958, 0x10641c00, + 0x40abd71b, 0xa5e353f0, 0x3ff5e560, 0x4189374c, 0xbf947ae1, 0x47be4400, + 0x40abd71b, 0xa5e353f0, 0x4014a1ca, 0xc083126e, 0xbfe3f7ce, 0xd916f750, + 0x40abd71b, 0xa5e353f0, 0x4021e51e, 0xb851eb85, 0x4003978d, 0x4fdf1ce8, + 0x40af422d, 0x0e560411, 0xc0240000, 0x00000000, 0x3ff16872, 0xb0208800, + 0x40af422d, 0x0e560411, 0xc018d78d, 0x4fdf3b64, 0x3ff86a7e, 0xf9dae9c0, + 0x40af422d, 0x0e560411, 0xc0035e35, 0x3f7ced91, 0xbfea6666, 0x6666d514, + 0x40af422d, 0x0e560411, 0x3ff5e560, 0x4189374c, 0xbfd9fbe7, 0x6c8c4040, + 0x40af422d, 0x0e560411, 0x4014a1ca, 0xc083126e, 0xbff851eb, 0x851eedc0, + 0x40af422d, 0x0e560411, 0x4021e51e, 0xb851eb85, 0x3ff8e353, 0xf7ce9e28, + 0x40b1569f, 0x3b645a19, 0xc0240000, 0x00000000, 0xbff60c49, 0xba5e7000, + 0x40b1569f, 0x3b645a19, 0xc018d78d, 0x4fdf3b64, 0xbffe2b02, 0x0c49f130, + 0x40b1569f, 0x3b645a19, 0xc0035e35, 0x3f7ced91, 0x3fedba5e, 0x353f131c, + 0x40b1569f, 0x3b645a19, 0x3ff5e560, 0x4189374c, 0x3fe272b0, 0x20c42078, + 0x40b1569f, 0x3b645a19, 0x4014a1ca, 0xc083126e, 0xc00353f7, 0xced92fec, + 0x40b1569f, 0x3b645a19, 0x4021e51e, 0xb851eb85, 0x3fe52f1a, 0x9fbe0500, + 0x40b30c27, 0xef9db229, 0xc0240000, 0x00000000, 0xc00ec083, 0x126eb800, + 0x40b30c27, 0xef9db229, 0xc018d78d, 0x4fdf3b64, 0x3fed3b64, 0x5a1c32e0, + 0x40b30c27, 0xef9db229, 0xc0035e35, 0x3f7ced91, 0x3fd0c49b, 0xa5e26a10, + 0x40b30c27, 0xef9db229, 0x3ff5e560, 0x4189374c, 0x3fc8624d, 0xd2ef89e0, + 0x40b30c27, 0xef9db229, 0x4014a1ca, 0xc083126e, 0x3ffd8937, 0x4bc66fc8, + 0x40b30c27, 0xef9db229, 0x4021e51e, 0xb851eb85, 0xbfcda1ca, 0xc0850940, + 0x40b4c1b0, 0xa3d70a39, 0xc0240000, 0x00000000, 0x400d851e, 0xb851c800, + 0x40b4c1b0, 0xa3d70a39, 0xc018d78d, 0x4fdf3b64, 0xc003fbe7, 0x6c8b64c0, + 0x40b4c1b0, 0xa3d70a39, 0xc0035e35, 0x3f7ced91, 0xbfd9eb85, 0x1eb95218, + 0x40b4c1b0, 0xa3d70a39, 0x3ff5e560, 0x4189374c, 0xbfc90624, 0xdd316e20, + 0x40b4c1b0, 0xa3d70a39, 0x4014a1ca, 0xc083126e, 0x3fee6666, 0x6665eb60, + 0x40b4c1b0, 0xa3d70a39, 0x4021e51e, 0xb851eb85, 0xbff20000, 0x000044d0, + 0x40b67739, 0x58106249, 0xc0240000, 0x00000000, 0x3ff39581, 0x06249000, + 0x40b67739, 0x58106249, 0xc018d78d, 0x4fdf3b64, 0x3fd34395, 0x81050480, + 0x40b67739, 0x58106249, 0xc0035e35, 0x3f7ced91, 0xbff126e9, 0x78d54390, + 0x40b67739, 0x58106249, 0x3ff5e560, 0x4189374c, 0xbfe29ba5, 0xe3549988, + 0x40b67739, 0x58106249, 0x4014a1ca, 0xc083126e, 0x3faba5e3, 0x53ef7300, + 0x40b67739, 0x58106249, 0x4021e51e, 0xb851eb85, 0xc00025e3, 0x53f7f43c, + 0x40b82cc2, 0x0c49ba59, 0xc0240000, 0x00000000, 0xbff3df3b, 0x645a7000, + 0x40b82cc2, 0x0c49ba59, 0xc018d78d, 0x4fdf3b64, 0x4008cccc, 0xcccca5e0, + 0x40b82cc2, 0x0c49ba59, 0xc0035e35, 0x3f7ced91, 0x3fe5d2f1, 0xa9fb5110, + 0x40b82cc2, 0x0c49ba59, 0x3ff5e560, 0x4189374c, 0x3fd9a9fb, 0xe76b2e20, + 0x40b82cc2, 0x0c49ba59, 0x4014a1ca, 0xc083126e, 0xbfeaf1a9, 0xfbe7fd00, + 0x40b82cc2, 0x0c49ba59, 0x4021e51e, 0xb851eb85, 0xc0074bc6, 0xa7efc610, + 0x40b9e24a, 0xc0831269, 0xc0240000, 0x00000000, 0xc00da9fb, 0xe76cb800, + 0x40b9e24a, 0xc0831269, 0xc018d78d, 0x4fdf3b64, 0xbfd3ef9d, 0xb22e5cc0, + 0x40b9e24a, 0xc0831269, 0xc0035e35, 0x3f7ced91, 0x3f8eb851, 0xeb5cbf00, + 0x40b9e24a, 0xc0831269, 0x3ff5e560, 0x4189374c, 0x3f8eb851, 0xeb564400, + 0x40b9e24a, 0xc0831269, 0x4014a1ca, 0xc083126e, 0xbffbced9, 0x16877898, + 0x40b9e24a, 0xc0831269, 0x4021e51e, 0xb851eb85, 0xc00e71a9, 0xfbe797e4, + 0x40bb97d3, 0x74bc6a79, 0xc0240000, 0x00000000, 0x400e9ba5, 0xe353c800, + 0x40bb97d3, 0x74bc6a79, 0xc018d78d, 0x4fdf3b64, 0x4003e666, 0x666639b8, + 0x40bb97d3, 0x74bc6a79, 0xc0035e35, 0x3f7ced91, 0xbfe4dd2f, 0x1aa06b18, + 0x40bb97d3, 0x74bc6a79, 0x3ff5e560, 0x4189374c, 0xbfd7be76, 0xc8b5c9e0, + 0x40bb97d3, 0x74bc6a79, 0x4014a1ca, 0xc083126e, 0x40043126, 0xe978ab84, + 0x40bb97d3, 0x74bc6a79, 0x4021e51e, 0xb851eb85, 0x4010fe76, 0xc8b4222e, + 0x40bd4d5c, 0x28f5c289, 0xc0240000, 0x00000000, 0x3ff5c28f, 0x5c289000, + 0x40bd4d5c, 0x28f5c289, 0xc018d78d, 0x4fdf3b64, 0xbfed9168, 0x72b0df00, + 0x40bd4d5c, 0x28f5c289, 0xc0035e35, 0x3f7ced91, 0x3ff1a1ca, 0xc082b68c, + 0x40bd4d5c, 0x28f5c289, 0x3ff5e560, 0x4189374c, 0x3fe39168, 0x72af4ba8, + 0x40bd4d5c, 0x28f5c289, 0x4014a1ca, 0xc083126e, 0x3ffa0c49, 0xba5ddcf0, + 0x40bd4d5c, 0x28f5c289, 0x4021e51e, 0xb851eb85, 0x400ad70a, 0x3d707288, + 0x40bf02e4, 0xdd2f1a99, 0xc0240000, 0x00000000, 0xbff1b22d, 0x0e567000, + 0x40bf02e4, 0xdd2f1a99, 0xc018d78d, 0x4fdf3b64, 0x3ffdffff, 0xffff9b20, + 0x40bf02e4, 0xdd2f1a99, 0xc0035e35, 0x3f7ced91, 0x3fdbd70a, 0x3d6f1e08, + 0x40bf02e4, 0xdd2f1a99, 0x3ff5e560, 0x4189374c, 0x3fccdd2f, 0x1a9c36a0, + 0x40bf02e4, 0xdd2f1a99, 0x4014a1ca, 0xc083126e, 0x3fe76c8b, 0x4394c5b0, + 0x40bf02e4, 0xdd2f1a99, 0x4021e51e, 0xb851eb85, 0x4003b126, 0xe978a0b4, + 0x40c05c36, 0xc8b43955, 0xc0240000, 0x00000000, 0xc00c9374, 0xbc6ab000, + 0x40c05c36, 0xc8b43955, 0xc018d78d, 0x4fdf3b64, 0xbff89581, 0x062537d0, + 0x40c05c36, 0xc8b43955, 0xc0035e35, 0x3f7ced91, 0xbfcdb22d, 0x0e58bc40, + 0x40c05c36, 0xc8b43955, 0x3ff5e560, 0x4189374c, 0xbfc48b43, 0x95844160, + 0x40c05c36, 0xc8b43955, 0x4014a1ca, 0xc083126e, 0xbfc4fdf3, 0xb6483a00, + 0x40c05c36, 0xc8b43955, 0x4021e51e, 0xb851eb85, 0x3ff91687, 0x2b01adc0, + 0x40c136fb, 0x22d0e55d, 0xc0240000, 0x00000000, 0x400fb22d, 0x0e55d000, + 0x40c136fb, 0x22d0e55d, 0xc018d78d, 0x4fdf3b64, 0x3ff43333, 0x3332d2d0, + 0x40c136fb, 0x22d0e55d, 0xc0035e35, 0x3f7ced91, 0xbfecc49b, 0xa5e40d24, + 0x40c136fb, 0x22d0e55d, 0x3ff5e560, 0x4189374c, 0xbfe17ced, 0x91694e58, + 0x40c136fb, 0x22d0e55d, 0x4014a1ca, 0xc083126e, 0xbff0f5c2, 0x8f5c8158, + 0x40c136fb, 0x22d0e55d, 0x4021e51e, 0xb851eb85, 0x3fe59581, 0x06241430, + 0x40c211bf, 0x7ced9165, 0xc0240000, 0x00000000, 0x3ff7ef9d, 0xb22ca000, + 0x40c211bf, 0x7ced9165, 0xc018d78d, 0x4fdf3b64, 0xc0013126, 0xe9790810, + 0x40c211bf, 0x7ced9165, 0xc0035e35, 0x3f7ced91, 0x3feb5c28, 0xf5c1cb0c, + 0x40c211bf, 0x7ced9165, 0x3ff5e560, 0x4189374c, 0x3fdbe76c, 0x8b41c480, + 0x40c211bf, 0x7ced9165, 0x4014a1ca, 0xc083126e, 0xbfff4bc6, 0xa7effb70, + 0x40c211bf, 0x7ced9165, 0x4021e51e, 0xb851eb85, 0xbfcc0831, 0x26eccc80, + 0x40c2ec83, 0xd70a3d6d, 0xc0240000, 0x00000000, 0xbfef0a3d, 0x70a4c000, + 0x40c2ec83, 0xd70a3d6d, 0xc018d78d, 0x4fdf3b64, 0x3fe4cccc, 0xcccbf500, + 0x40c2ec83, 0xd70a3d6d, 0xc0035e35, 0x3f7ced91, 0x3fc81062, 0x4dcfb3e0, + 0x40c2ec83, 0xd70a3d6d, 0x3ff5e560, 0x4189374c, 0x3fa99999, 0x998a4400, + 0x40c2ec83, 0xd70a3d6d, 0x4014a1ca, 0xc083126e, 0x400272b0, 0x20c46a18, + 0x40c2ec83, 0xd70a3d6d, 0x4021e51e, 0xb851eb85, 0xbff1cccc, 0xcccd3d38, + 0x40c3c748, 0x3126e975, 0xc0240000, 0x00000000, 0xc00b7ced, 0x9168b000, + 0x40c3c748, 0x3126e975, 0xc018d78d, 0x4fdf3b64, 0xc006178d, 0x4fdf7438, + 0x40c3c748, 0x3126e975, 0xc0035e35, 0x3f7ced91, 0xbfdea7ef, 0x9db3e238, + 0x40c3c748, 0x3126e975, 0x3ff5e560, 0x4189374c, 0xbfd58106, 0x24df3380, + 0x40c3c748, 0x3126e975, 0x4014a1ca, 0xc083126e, 0x3ff68f5c, 0x28f55a18, + 0x40c3c748, 0x3126e975, 0x4021e51e, 0xb851eb85, 0xc0000c49, 0xba5e7070, + 0x40c4a20c, 0x8b43957d, 0xc0240000, 0x00000000, 0x4010645a, 0x1cabe800, + 0x40c4a20c, 0x8b43957d, 0xc018d78d, 0x4fdf3b64, 0x3fa33333, 0x33244600, + 0x40c4a20c, 0x8b43957d, 0xc0035e35, 0x3f7ced91, 0xbff25604, 0x1893e798, + 0x40c4a20c, 0x8b43957d, 0x3ff5e560, 0x4189374c, 0x3fe4b020, 0xc49a96d8, + 0x40c4a20c, 0x8b43957d, 0x4014a1ca, 0xc083126e, 0x3fe072b0, 0x20c3c000, + 0x40c4a20c, 0x8b43957d, 0x4021e51e, 0xb851eb85, 0xc007322d, 0x0e564244, + 0x40c57cd0, 0xe5604185, 0xc0240000, 0x00000000, 0x3ffa1cac, 0x0830a000, + 0x40c57cd0, 0xe5604185, 0xc018d78d, 0x4fdf3b64, 0x4006b126, 0xe9789668, + 0x40c57cd0, 0xe5604185, 0xc0035e35, 0x3f7ced91, 0x3fe374bc, 0x6a7e0900, + 0x40c57cd0, 0xe5604185, 0x3ff5e560, 0x4189374c, 0x3fd0ac08, 0x3124b1b0, + 0x40c57cd0, 0xe5604185, 0x4014a1ca, 0xc083126e, 0xbfd872b0, 0x20c66860, + 0x40c57cd0, 0xe5604185, 0x4021e51e, 0xb851eb85, 0xc00e5810, 0x624e1418, + 0x40c65795, 0x3f7ced8d, 0xc0240000, 0x00000000, 0xbfeab020, 0xc49cc000, + 0x40c65795, 0x3f7ced8d, 0xc018d78d, 0x4fdf3b64, 0xbfe26666, 0x66676c40, + 0x40c65795, 0x3f7ced8d, 0xc0035e35, 0x3f7ced91, 0xbfae353f, 0x7cfd5140, + 0x40c65795, 0x3f7ced8d, 0x3ff5e560, 0x4189374c, 0xbfc01062, 0x4dd794a0, + 0x40c65795, 0x3f7ced8d, 0x4014a1ca, 0xc083126e, 0xbff472b0, 0x20c51430, + 0x40c65795, 0x3f7ced8d, 0x4021e51e, 0xb851eb85, 0x40110b43, 0x9580e414, + 0x40c73259, 0x99999995, 0xc0240000, 0x00000000, 0xc00a6666, 0x6666b000, + 0x40c73259, 0x99999995, 0xc018d78d, 0x4fdf3b64, 0x4001cac0, 0x83122a40, + 0x40c73259, 0x99999995, 0xc0035e35, 0x3f7ced91, 0xbfe73b64, 0x5a1db328, + 0x40c73259, 0x99999995, 0x3ff5e560, 0x4189374c, 0xbfe05e35, 0x3f7e2328, + 0x40c73259, 0x99999995, 0x4014a1ca, 0xc083126e, 0xc001645a, 0x1cac4724, + 0x40c73259, 0x99999995, 0x4021e51e, 0xb851eb85, 0x400af0a3, 0xd709f654, + 0x40c80d1d, 0xf3b6459d, 0xc0240000, 0x00000000, 0x4010ef9d, 0xb22ce800, + 0x40c80d1d, 0xf3b6459d, 0xc018d78d, 0x4fdf3b64, 0xbff30000, 0x00008e70, + 0x40c80d1d, 0xf3b6459d, 0xc0035e35, 0x3f7ced91, 0x3ff072b0, 0x20c41284, + 0x40c80d1d, 0xf3b6459d, 0x3ff5e560, 0x4189374c, 0x3fde24dd, 0x2f181ae0, + 0x40c80d1d, 0xf3b6459d, 0x4014a1ca, 0xc083126e, 0x4000b439, 0x581020ac, + 0x40c80d1d, 0xf3b6459d, 0x4021e51e, 0xb851eb85, 0x4003cac0, 0x83122480, + 0x40c8e7e2, 0x4dd2f1a5, 0xc0240000, 0x00000000, 0x3ffc49ba, 0x5e34a000, + 0x40c8e7e2, 0x4dd2f1a5, 0xc018d78d, 0x4fdf3b64, 0x3ff9c8b4, 0x39577c30, + 0x40c8e7e2, 0x4dd2f1a5, 0xc0035e35, 0x3f7ced91, 0x3fd71a9f, 0xbe748de8, + 0x40c8e7e2, 0x4dd2f1a5, 0x3ff5e560, 0x4189374c, 0x3fb5c28f, 0x5c1e7b80, + 0x40c8e7e2, 0x4dd2f1a5, 0x4014a1ca, 0xc083126e, 0x3ff3126e, 0x978cc740, + 0x40c8e7e2, 0x4dd2f1a5, 0x4021e51e, 0xb851eb85, 0x3ff949ba, 0x5e34a558, + 0x40c9c2a6, 0xa7ef9dad, 0xc0240000, 0x00000000, 0xbfe65604, 0x1894c000, + 0x40c9c2a6, 0xa7ef9dad, 0xc018d78d, 0x4fdf3b64, 0xbffccccc, 0xcccd66c0, + 0x40c9c2a6, 0xa7ef9dad, 0xc0035e35, 0x3f7ced91, 0xbfd39581, 0x06272e40, + 0x40c9c2a6, 0xa7ef9dad, 0x3ff5e560, 0x4189374c, 0xbfd34395, 0x8108dd20, + 0x40c9c2a6, 0xa7ef9dad, 0x4014a1ca, 0xc083126e, 0x3fd2f1a9, 0xfbe534a0, + 0x40c9c2a6, 0xa7ef9dad, 0x4021e51e, 0xb851eb85, 0x3fe5fbe7, 0x6c8a0360, + 0x40ca9d6b, 0x020c49b5, 0xc0240000, 0x00000000, 0xc0094fdf, 0x3b64b000, + 0x40ca9d6b, 0x020c49b5, 0xc018d78d, 0x4fdf3b64, 0x3feff7ce, 0xd91547c0, + 0x40ca9d6b, 0x020c49b5, 0xc0035e35, 0x3f7ced91, 0xbfef22d0, 0xe5617534, + 0x40ca9d6b, 0x020c49b5, 0x3ff5e560, 0x4189374c, 0x3fe5ced9, 0x1685c208, + 0x40ca9d6b, 0x020c49b5, 0x4014a1ca, 0xc083126e, 0xbfe33333, 0x333459e0, + 0x40ca9d6b, 0x020c49b5, 0x4021e51e, 0xb851eb85, 0xbfca6e97, 0x8d550fc0, + 0x40cb782f, 0x5c28f5bd, 0xc0240000, 0x00000000, 0x40117ae1, 0x47ade800, + 0x40cb782f, 0x5c28f5bd, 0xc018d78d, 0x4fdf3b64, 0xc0034ccc, 0xcccd1f88, + 0x40cb782f, 0x5c28f5bd, 0xc0035e35, 0x3f7ced91, 0x3fe8fdf3, 0xb64462fc, + 0x40cb782f, 0x5c28f5bd, 0x3ff5e560, 0x4189374c, 0x3fd2e978, 0xd4fb0810, + 0x40cb782f, 0x5c28f5bd, 0x4014a1ca, 0xc083126e, 0xbff7ef9d, 0xb22da708, + 0x40cb782f, 0x5c28f5bd, 0x4021e51e, 0xb851eb85, 0xbff19999, 0x999a45a0, + 0x40cc52f3, 0xb645a1c5, 0xc0240000, 0x00000000, 0x3ffe76c8, 0xb438a000, + 0x40cc52f3, 0xb645a1c5, 0xc018d78d, 0x4fdf3b64, 0x3fd8bc6a, 0x7ef72e40, + 0x40cc52f3, 0xb645a1c5, 0xc0035e35, 0x3f7ced91, 0x3fbd2f1a, 0x9fb42740, + 0x40cc52f3, 0xb645a1c5, 0x3ff5e560, 0x4189374c, 0xbfb72b02, 0x0c55cfc0, + 0x40cc52f3, 0xb645a1c5, 0x4014a1ca, 0xc083126e, 0xc00322d0, 0xe5609090, + 0x40cc52f3, 0xb645a1c5, 0x4021e51e, 0xb851eb85, 0xbfffe560, 0x4189e948, + 0x40cd2db8, 0x10624dcd, 0xc0240000, 0x00000000, 0xbfe1fbe7, 0x6c8cc000, + 0x40cd2db8, 0x10624dcd, 0xc018d78d, 0x4fdf3b64, 0xc0083333, 0x33338bb0, + 0x40cd2db8, 0x10624dcd, 0xc0035e35, 0x3f7ced91, 0xbfe1b22d, 0x0e57592c, + 0x40cd2db8, 0x10624dcd, 0x3ff5e560, 0x4189374c, 0xbfde7ef9, 0xdb25eff0, + 0x40cd2db8, 0x10624dcd, 0x4014a1ca, 0xc083126e, 0x3ffdeb85, 0x1eb7ae80, + 0x40cd2db8, 0x10624dcd, 0x4021e51e, 0xb851eb85, 0xc0071893, 0x74bcc678, + 0x40ce087c, 0x6a7ef9d5, 0xc0240000, 0x00000000, 0xc0083958, 0x1062b000, + 0x40ce087c, 0x6a7ef9d5, 0xc018d78d, 0x4fdf3b64, 0xbfcced91, 0x68786600, + 0x40ce087c, 0x6a7ef9d5, 0xc0035e35, 0x3f7ced91, 0x3ff3374b, 0xc6a73f82, + 0x40ce087c, 0x6a7ef9d5, 0x3ff5e560, 0x4189374c, 0x3fe03126, 0xe97738a0, + 0x40ce087c, 0x6a7ef9d5, 0x4014a1ca, 0xc083126e, 0x3fef2b02, 0x0c4868d0, + 0x40ce087c, 0x6a7ef9d5, 0x4021e51e, 0xb851eb85, 0xc00e3e76, 0xc8b4984c, + 0x40cee340, 0xc49ba5dd, 0xc0240000, 0x00000000, 0x40120624, 0xdd2ee800, + 0x40cee340, 0xc49ba5dd, 0xc018d78d, 0x4fdf3b64, 0x40049581, 0x06247ef0, + 0x40cee340, 0xc49ba5dd, 0xc0035e35, 0x3f7ced91, 0x3fe11687, 0x2b00a0f0, + 0x40cee340, 0xc49ba5dd, 0x3ff5e560, 0x4189374c, 0x3fbeb851, 0xeb77d500, + 0x40cee340, 0xc49ba5dd, 0x4014a1ca, 0xc083126e, 0x3fb3f7ce, 0xd90ba500, + 0x40cee340, 0xc49ba5dd, 0x4021e51e, 0xb851eb85, 0x40111810, 0x624da1fa, + 0x40cfbe05, 0x1eb851e5, 0xc0240000, 0x00000000, 0x400051eb, 0x851e5000, + 0x40cfbe05, 0x1eb851e5, 0xc018d78d, 0x4fdf3b64, 0xbfead4fd, 0xf3b7ca20, + 0x40cfbe05, 0x1eb851e5, 0xc0035e35, 0x3f7ced91, 0xbfc10624, 0xdd34f490, + 0x40cfbe05, 0x1eb851e5, 0x3ff5e560, 0x4189374c, 0xbfd10624, 0xdd3286c0, + 0x40cfbe05, 0x1eb851e5, 0x4014a1ca, 0xc083126e, 0xbfea2d0e, 0x56057f90, + 0x40cfbe05, 0x1eb851e5, 0x4021e51e, 0xb851eb85, 0x400b0a3d, 0x70a37220, + 0x40d04c64, 0xbc6a7ef7, 0xc0240000, 0x00000000, 0xbfdb4395, 0x81090000, + 0x40d04c64, 0xbc6a7ef7, 0xc018d78d, 0x4fdf3b64, 0x3fff5e35, 0x3f7c4590, + 0x40d04c64, 0xbc6a7ef7, 0xc0035e35, 0x3f7ced91, 0xbfe99999, 0x999adb38, + 0x40d04c64, 0xbc6a7ef7, 0x3ff5e560, 0x4189374c, 0xbfe4dd2f, 0x1aa14160, + 0x40d04c64, 0xbc6a7ef7, 0x4014a1ca, 0xc083126e, 0xbffb6c8b, 0x439619e0, + 0x40d04c64, 0xbc6a7ef7, 0x4021e51e, 0xb851eb85, 0x4003e45a, 0x1cabb04c, + 0x40d0b9c6, 0xe978d4fb, 0xc0240000, 0x00000000, 0xc00722d0, 0xe560a000, + 0x40d0b9c6, 0xe978d4fb, 0xc018d78d, 0x4fdf3b64, 0xbff7374b, 0xc6a89d60, + 0x40d0b9c6, 0xe978d4fb, 0xc0035e35, 0x3f7ced91, 0x3fee872b, 0x020afcf8, + 0x40d0b9c6, 0xe978d4fb, 0x3ff5e560, 0x4189374c, 0x3fd526e9, 0x78d1de70, + 0x40d0b9c6, 0xe978d4fb, 0x4014a1ca, 0xc083126e, 0x4004624d, 0xd2f15ae0, + 0x40d0b9c6, 0xe978d4fb, 0x4021e51e, 0xb851eb85, 0x3ff97ced, 0x9167bcf0, + 0x40d12729, 0x16872aff, 0xc0240000, 0x00000000, 0x40129168, 0x72aff000, + 0x40d12729, 0x16872aff, 0xc018d78d, 0x4fdf3b64, 0x3ff59168, 0x72af6d40, + 0x40d12729, 0x16872aff, 0xc0035e35, 0x3f7ced91, 0x3fd25e35, 0x3f7a3dc8, + 0x40d12729, 0x16872aff, 0x3ff5e560, 0x4189374c, 0xbfac6a7e, 0xf9f4ec80, + 0x40d12729, 0x16872aff, 0x4014a1ca, 0xc083126e, 0x3ffa6e97, 0x8d4f3ba8, + 0x40d12729, 0x16872aff, 0x4021e51e, 0xb851eb85, 0x3fe6624d, 0xd2f03290, + 0x40d1948b, 0x43958103, 0xc0240000, 0x00000000, 0x40016872, 0xb0206000, + 0x40d1948b, 0x43958103, 0xc018d78d, 0x4fdf3b64, 0xc000820c, 0x49babad8, + 0x40d1948b, 0x43958103, 0xc0035e35, 0x3f7ced91, 0xbfd851eb, 0x85217e60, + 0x40d1948b, 0x43958103, 0x3ff5e560, 0x4189374c, 0xbfdc4189, 0x374f1990, + 0x40d1948b, 0x43958103, 0x4014a1ca, 0xc083126e, 0x3fe83126, 0xe9778320, + 0x40d1948b, 0x43958103, 0x4021e51e, 0xb851eb85, 0xbfc8d4fd, 0xf3bc5300, + 0x40d201ed, 0x70a3d707, 0xc0240000, 0x00000000, 0xbfd28f5c, 0x28f90000, + 0x40d201ed, 0x70a3d707, 0xc018d78d, 0x4fdf3b64, 0x3fe78937, 0x4bc529e0, + 0x40d201ed, 0x70a3d707, 0xc0035e35, 0x3f7ced91, 0xbff0c083, 0x126f4ea2, + 0x40d201ed, 0x70a3d707, 0x3ff5e560, 0x4189374c, 0x3fe14fdf, 0x3b62a3d0, + 0x40d201ed, 0x70a3d707, 0x4014a1ca, 0xc083126e, 0xbfc1eb85, 0x1ebdc440, + 0x40d201ed, 0x70a3d707, 0x4021e51e, 0xb851eb85, 0xbff16666, 0x66672e08, + 0x40d26f4f, 0x9db22d0b, 0xc0240000, 0x00000000, 0xc0060c49, 0xba5ea000, + 0x40d26f4f, 0x9db22d0b, 0xc018d78d, 0x4fdf3b64, 0xc0056872, 0xb0212700, + 0x40d26f4f, 0x9db22d0b, 0xc0035e35, 0x3f7ced91, 0x3fe69fbe, 0x76c73aec, + 0x40d26f4f, 0x9db22d0b, 0x3ff5e560, 0x4189374c, 0x3fc3d70a, 0x3d699740, + 0x40d26f4f, 0x9db22d0b, 0x4014a1ca, 0xc083126e, 0xbff09374, 0xbc6b32a0, + 0x40d26f4f, 0x9db22d0b, 0x4021e51e, 0xb851eb85, 0xbfffb22d, 0x0e56d1b0, + 0x40d2dcb1, 0xcac0830f, 0xc0240000, 0x00000000, 0x40131cac, 0x0830f000, + 0x40d2dcb1, 0xcac0830f, 0xc018d78d, 0x4fdf3b64, 0x3fbf7ced, 0x915bca00, + 0x40d2dcb1, 0xcac0830f, 0xc0035e35, 0x3f7ced91, 0x3fa47ae1, 0x4795cd80, + 0x40d2dcb1, 0xcac0830f, 0x3ff5e560, 0x4189374c, 0xbfcd9168, 0x72b760c0, + 0x40d2dcb1, 0xcac0830f, 0x4014a1ca, 0xc083126e, 0xbffee978, 0xd4feacb8, + 0x40d2dcb1, 0xcac0830f, 0x4021e51e, 0xb851eb85, 0xc006fef9, 0xdb233aac, + 0x40d34a13, 0xf7ced913, 0xc0240000, 0x00000000, 0x40027ef9, 0xdb226000, + 0x40d34a13, 0xf7ced913, 0xc018d78d, 0x4fdf3b64, 0x40076041, 0x8936e3a0, + 0x40d34a13, 0xf7ced913, 0xc0035e35, 0x3f7ced91, 0xbfe41062, 0x4dd4813c, + 0x40d34a13, 0xf7ced913, 0x3ff5e560, 0x4189374c, 0xbfe3be76, 0xc8b61630, + 0x40d34a13, 0xf7ced913, 0x4014a1ca, 0xc083126e, 0x4002a3d7, 0x0a3d1174, + 0x40d34a13, 0xf7ced913, 0x4021e51e, 0xb851eb85, 0xc00e24dd, 0x2f1b0c80, + 0x40d3b776, 0x24dd2f17, 0xc0240000, 0x00000000, 0xbfc3b645, 0xa1d20000, + 0x40d3b776, 0x24dd2f17, 0xc018d78d, 0x4fdf3b64, 0xbfdf53f7, 0xcedc6ec0, + 0x40d3b776, 0x24dd2f17, 0xc0035e35, 0x3f7ced91, 0x3ff20831, 0x26e8ab7a, + 0x40d3b776, 0x24dd2f17, 0x3ff5e560, 0x4189374c, 0x3fd7645a, 0x1ca834d0, + 0x40d3b776, 0x24dd2f17, 0x4014a1ca, 0xc083126e, 0x3ff6f1a9, 0xfbe6a8d0, + 0x40d3b776, 0x24dd2f17, 0x4021e51e, 0xb851eb85, 0x401124dd, 0x2f1a67e0, + 0x40d424d8, 0x51eb851b, 0xc0240000, 0x00000000, 0xc004f5c2, 0x8f5ca000, + 0x40d424d8, 0x51eb851b, 0xc018d78d, 0x4fdf3b64, 0x400279db, 0x22d07778, + 0x40d424d8, 0x51eb851b, 0xc0035e35, 0x3f7ced91, 0x3fdd70a3, 0xd706f1c0, + 0x40d424d8, 0x51eb851b, 0x3ff5e560, 0x4189374c, 0xbf94fdf3, 0xb6847300, + 0x40d424d8, 0x51eb851b, 0x4014a1ca, 0xc083126e, 0x3fe1374b, 0xc6a65d70, + 0x40d424d8, 0x51eb851b, 0x4021e51e, 0xb851eb85, 0x400b23d7, 0x0a3cfdec, + 0x40d4923a, 0x7ef9db1f, 0xc0240000, 0x00000000, 0x4013a7ef, 0x9db1f000, + 0x40d4923a, 0x7ef9db1f, 0xc018d78d, 0x4fdf3b64, 0xbff1a1ca, 0xc083f400, + 0x40d4923a, 0x7ef9db1f, 0xc0035e35, 0x3f7ced91, 0xbfca7ef9, 0xdb2994d0, + 0x40d4923a, 0x7ef9db1f, 0x3ff5e560, 0x4189374c, 0xbfda0418, 0x9378c330, + 0x40d4923a, 0x7ef9db1f, 0x4014a1ca, 0xc083126e, 0xbfd6e978, 0xd5012d80, + 0x40d4923a, 0x7ef9db1f, 0x4021e51e, 0xb851eb85, 0x4003fdf3, 0xb6452c18, + 0x40d4ff9c, 0xac083123, 0xc0240000, 0x00000000, 0x40039581, 0x06246000, + 0x40d4ff9c, 0xac083123, 0xc018d78d, 0x4fdf3b64, 0x3ffb26e9, 0x78d416a0, + 0x40d4ff9c, 0xac083123, 0xc0035e35, 0x3f7ced91, 0xbfebf7ce, 0xd9184348, + 0x40d4ff9c, 0xac083123, 0x3ff5e560, 0x4189374c, 0x3fe26e97, 0x8d4dcf00, + 0x40d4ff9c, 0xac083123, 0x4014a1ca, 0xc083126e, 0xbff41062, 0x4dd3c578, + 0x40d4ff9c, 0xac083123, 0x4021e51e, 0xb851eb85, 0x3ff9b020, 0xc49ab488, + 0x40d56cfe, 0xd9168727, 0xc0240000, 0x00000000, 0xbf926e97, 0x8d900000, + 0x40d56cfe, 0xd9168727, 0xc018d78d, 0x4fdf3b64, 0xbffb6e97, 0x8d50cc50, + 0x40d56cfe, 0xd9168727, 0xc0035e35, 0x3f7ced91, 0x3fec28f5, 0xc28d94e8, + 0x40d56cfe, 0xd9168727, 0x3ff5e560, 0x4189374c, 0x3fc851eb, 0x85164400, + 0x40d56cfe, 0xd9168727, 0x4014a1ca, 0xc083126e, 0xc0013333, 0x33339fc8, + 0x40d56cfe, 0xd9168727, 0x4021e51e, 0xb851eb85, 0x3fe6c8b4, 0x395621c0, + 0x40d5da61, 0x0624dd2b, 0xc0240000, 0x00000000, 0xc003df3b, 0x645aa000, + 0x40d5da61, 0x0624dd2b, 0xc018d78d, 0x4fdf3b64, 0x3ff15a1c, 0xac073e50, + 0x40d5da61, 0x0624dd2b, 0xc0035e35, 0x3f7ced91, 0x3fcb4395, 0x80fedb50, + 0x40d5da61, 0x0624dd2b, 0x3ff5e560, 0x4189374c, 0xbfc91687, 0x2b0ab400, + 0x40d5da61, 0x0624dd2b, 0x4014a1ca, 0xc083126e, 0x4000e560, 0x4188c808, + 0x40d5da61, 0x0624dd2b, 0x4021e51e, 0xb851eb85, 0xbfc73b64, 0x5a249640, + 0x40d647c3, 0x3333332f, 0xc0240000, 0x00000000, 0xc013cccc, 0xcccd1000, + 0x40d647c3, 0x3333332f, 0xc018d78d, 0x4fdf3b64, 0xc0029db2, 0x2d0ed250, + 0x40d647c3, 0x3333332f, 0xc0035e35, 0x3f7ced91, 0xbfdd0e56, 0x041c4e80, + 0x40d647c3, 0x3333332f, 0x3ff5e560, 0x4189374c, 0xbfe29fbe, 0x76caeb00, + 0x40d647c3, 0x3333332f, 0x4014a1ca, 0xc083126e, 0x3ff374bc, 0x6a7e15f8, + 0x40d647c3, 0x3333332f, 0x4021e51e, 0xb851eb85, 0xbff13333, 0x33343670, + 0x40d6b525, 0x60418933, 0xc0240000, 0x00000000, 0x4004ac08, 0x31266000, + 0x40d6b525, 0x60418933, 0xc018d78d, 0x4fdf3b64, 0x3fde353f, 0x7ce99800, + 0x40d6b525, 0x60418933, 0xc0035e35, 0x3f7ced91, 0xbff1ef9d, 0xb22e02aa, + 0x40d6b525, 0x60418933, 0x3ff5e560, 0x4189374c, 0x3fd9a1ca, 0xc07e8b30, + 0x40d6b525, 0x60418933, 0x4014a1ca, 0xc083126e, 0x3fd47ae1, 0x47aa6f80, + 0x40d6b525, 0x60418933, 0x4021e51e, 0xb851eb85, 0xbfff7ef9, 0xdb23da18, + 0x40d72287, 0x8d4fdf37, 0xc0240000, 0x00000000, 0x3fbe353f, 0x7cdc0000, + 0x40d72287, 0x8d4fdf37, 0xc018d78d, 0x4fdf3b64, 0xc0078418, 0x93753e78, + 0x40d72287, 0x8d4fdf37, 0xc0035e35, 0x3f7ced91, 0x3fe44189, 0x3749d2dc, + 0x40d72287, 0x8d4fdf37, 0x3ff5e560, 0x4189374c, 0x3f8db22d, 0x0dc1e600, + 0x40d72287, 0x8d4fdf37, 0x4014a1ca, 0xc083126e, 0xbfe26e97, 0x8d51bc70, + 0x40d72287, 0x8d4fdf37, 0x4021e51e, 0xb851eb85, 0xc006e560, 0x4189bee0, + 0x40d78fe9, 0xba5e353b, 0xc0240000, 0x00000000, 0xc002c8b4, 0x3958a000, + 0x40d78fe9, 0xba5e353b, 0xc018d78d, 0x4fdf3b64, 0xbfc1fbe7, 0x6c939280, + 0x40d78fe9, 0xba5e353b, 0xc0035e35, 0x3f7ced91, 0xbfa16872, 0xb040b380, + 0x40d78fe9, 0xba5e353b, 0x3ff5e560, 0x4189374c, 0xbfd7c6a7, 0xefa26cd0, + 0x40d78fe9, 0xba5e353b, 0x4014a1ca, 0xc083126e, 0xbff78d4f, 0xdf3c5850, + 0x40d78fe9, 0xba5e353b, 0x4021e51e, 0xb851eb85, 0xc00e0b43, 0x958190b4, + 0x40d7fd4b, 0xe76c8b3f, 0xc0240000, 0x00000000, 0xc0134189, 0x374c1000, + 0x40d7fd4b, 0xe76c8b3f, 0xc018d78d, 0x4fdf3b64, 0x4005449b, 0xa5e2cc28, + 0x40d7fd4b, 0xe76c8b3f, 0xc0035e35, 0x3f7ced91, 0xbfe66e97, 0x8d51e94c, + 0x40d7fd4b, 0xe76c8b3f, 0x3ff5e560, 0x4189374c, 0x3fe38d4f, 0xdf38fa30, + 0x40d7fd4b, 0xe76c8b3f, 0x4014a1ca, 0xc083126e, 0xc002f1a9, 0xfbe7e934, + 0x40d7fd4b, 0xe76c8b3f, 0x4021e51e, 0xb851eb85, 0x401131a9, 0xfbe725c6, + 0x40d86aae, 0x147ae143, 0xc0240000, 0x00000000, 0x4005c28f, 0x5c286000, + 0x40d86aae, 0x147ae143, 0xc018d78d, 0x4fdf3b64, 0xbfe81893, 0x74be9540, + 0x40d86aae, 0x147ae143, 0xc0035e35, 0x3f7ced91, 0x3ff0d916, 0x8729f772, + 0x40d86aae, 0x147ae143, 0x3ff5e560, 0x4189374c, 0x3fcccccc, 0xccc2f0c0, + 0x40d86aae, 0x147ae143, 0x4014a1ca, 0xc083126e, 0x3ffe4dd2, 0xf1a8fd38, + 0x40d86aae, 0x147ae143, 0x4021e51e, 0xb851eb85, 0x400b3d70, 0xa3d679b8, + 0x40d8d810, 0x41893747, 0xc0240000, 0x00000000, 0x3fd04189, 0x37470000, + 0x40d8d810, 0x41893747, 0xc018d78d, 0x4fdf3b64, 0x40005e35, 0x3f7c6000, + 0x40d8d810, 0x41893747, 0xc0035e35, 0x3f7ced91, 0x3fd8b439, 0x580c21a0, + 0x40d8d810, 0x41893747, 0x3ff5e560, 0x4189374c, 0xbfc49ba5, 0xe35e0740, + 0x40d8d810, 0x41893747, 0x4014a1ca, 0xc083126e, 0x3fefef9d, 0xb22b0640, + 0x40d8d810, 0x41893747, 0x4021e51e, 0xb851eb85, 0x4004178d, 0x4fdea7e4, + 0x40d94572, 0x6e978d4b, 0xc0240000, 0x00000000, 0xc001b22d, 0x0e56a000, + 0x40d94572, 0x6e978d4b, 0xc018d78d, 0x4fdf3b64, 0xbff5d916, 0x872c22f0, + 0x40d94572, 0x6e978d4b, 0xc0035e35, 0x3f7ced91, 0xbfd1fbe7, 0x6c8f9a88, + 0x40d94572, 0x6e978d4b, 0x3ff5e560, 0x4189374c, 0xbfe18106, 0x24dfbfd0, + 0x40d94572, 0x6e978d4b, 0x4014a1ca, 0xc083126e, 0x3fba1cac, 0x08209080, + 0x40d94572, 0x6e978d4b, 0x4021e51e, 0xb851eb85, 0x3ff9e353, 0xf7cdac20, + 0x40d9b2d4, 0x9ba5e34f, 0xc0240000, 0x00000000, 0xc012b645, 0xa1cb1000, + 0x40d9b2d4, 0x9ba5e34f, 0xc018d78d, 0x4fdf3b64, 0x3ff6ef9d, 0xb22be7b0, + 0x40d9b2d4, 0x9ba5e34f, 0xc0035e35, 0x3f7ced91, 0xbfee5604, 0x1895ab58, + 0x40d9b2d4, 0x9ba5e34f, 0x3ff5e560, 0x4189374c, 0x3fdbdf3b, 0x6454e190, + 0x40d9b2d4, 0x9ba5e34f, 0x4014a1ca, 0xc083126e, 0xbfe96872, 0xb022e220, + 0x40d9b2d4, 0x9ba5e34f, 0x4021e51e, 0xb851eb85, 0x3fe72f1a, 0x9fbc10f0, + 0x40da2036, 0xc8b43953, 0xc0240000, 0x00000000, 0x4006d916, 0x872a6000, + 0x40da2036, 0xc8b43953, 0xc018d78d, 0x4fdf3b64, 0xbfffa5e3, 0x53f8fb40, + 0x40da2036, 0xc8b43953, 0xc0035e35, 0x3f7ced91, 0x3fe9cac0, 0x83102cd8, + 0x40da2036, 0xc8b43953, 0x3ff5e560, 0x4189374c, 0x3fa95810, 0x62232c80, + 0x40da2036, 0xc8b43953, 0x4014a1ca, 0xc083126e, 0xbffb0a3d, 0x70a4eb28, + 0x40da2036, 0xc8b43953, 0x4021e51e, 0xb851eb85, 0xbfc5a1ca, 0xc08cd980, + 0x40da8d98, 0xf5c28f57, 0xc0240000, 0x00000000, 0x3fd8f5c2, 0x8f570000, + 0x40da8d98, 0xf5c28f57, 0xc018d78d, 0x4fdf3b64, 0x3fea45a1, 0xcabe1ec0, + 0x40da8d98, 0xf5c28f57, 0xc0035e35, 0x3f7ced91, 0x3fc1cac0, 0x83093b10, + 0x40da8d98, 0xf5c28f57, 0x3ff5e560, 0x4189374c, 0xbfd58937, 0x4bcc1670, + 0x40da8d98, 0xf5c28f57, 0x4014a1ca, 0xc083126e, 0x40049374, 0xbc69f23c, + 0x40da8d98, 0xf5c28f57, 0x4021e51e, 0xb851eb85, 0xbff10000, 0x00013ed8, + 0x40dafafb, 0x22d0e55b, 0xc0240000, 0x00000000, 0xc0009ba5, 0xe354a000, + 0x40dafafb, 0x22d0e55b, 0xc018d78d, 0x4fdf3b64, 0xc004b958, 0x1062e9c8, + 0x40dafafb, 0x22d0e55b, 0xc0035e35, 0x3f7ced91, 0xbfe0e560, 0x418b8f50, + 0x40dafafb, 0x22d0e55b, 0x3ff5e560, 0x4189374c, 0x3fe4ac08, 0x31242560, + 0x40dafafb, 0x22d0e55b, 0x4014a1ca, 0xc083126e, 0x3ffad0e5, 0x60406a60, + 0x40dafafb, 0x22d0e55b, 0x4021e51e, 0xb851eb85, 0xbfff4bc6, 0xa7f0e280, + 0x40db685d, 0x4fdf3b5f, 0xc0240000, 0x00000000, 0xc0122b02, 0x0c4a1000, + 0x40db685d, 0x4fdf3b5f, 0xc018d78d, 0x4fdf3b64, 0x3fcab020, 0xc491b880, + 0x40db685d, 0x4fdf3b5f, 0xc0035e35, 0x3f7ced91, 0xbff31eb8, 0x51ecb6b2, + 0x40db685d, 0x4fdf3b5f, 0x3ff5e560, 0x4189374c, 0x3fd0a3d7, 0x0a37cec0, + 0x40db685d, 0x4fdf3b5f, 0x4014a1ca, 0xc083126e, 0x3fe8f5c2, 0x8f59e090, + 0x40db685d, 0x4fdf3b5f, 0x4021e51e, 0xb851eb85, 0xc006cbc6, 0xa7f04314, + 0x40dbd5bf, 0x7ced9163, 0xc0240000, 0x00000000, 0x4007ef9d, 0xb22c6000, + 0x40dbd5bf, 0x7ced9163, 0xc018d78d, 0x4fdf3b64, 0x40080f5c, 0x28f520d8, + 0x40dbd5bf, 0x7ced9163, 0xc0035e35, 0x3f7ced91, 0x3fe1e353, 0xf7cc6acc, + 0x40dbd5bf, 0x7ced9163, 0x3ff5e560, 0x4189374c, 0xbfc020c4, 0x9bb15a80, + 0x40dbd5bf, 0x7ced9163, 0x4014a1ca, 0xc083126e, 0xbfbdb22d, 0x0e689d00, + 0x40dbd5bf, 0x7ced9163, 0x4021e51e, 0xb851eb85, 0xc00df1a9, 0xfbe814e8, + 0x40dc4321, 0xa9fbe767, 0xc0240000, 0x00000000, 0x3fe0d4fd, 0xf3b38000, + 0x40dc4321, 0xa9fbe767, 0xc018d78d, 0x4fdf3b64, 0xbfd9db22, 0xd0ea8500, + 0x40dc4321, 0xa9fbe767, 0xc0035e35, 0x3f7ced91, 0xbfbba5e3, 0x540b9a40, + 0x40dc4321, 0xa9fbe767, 0x3ff5e560, 0x4189374c, 0xbfe0624d, 0xd2f494a0, + 0x40dc4321, 0xa9fbe767, 0x4014a1ca, 0xc083126e, 0xbff03126, 0xe97a03e8, + 0x40dc4321, 0xa9fbe767, 0x4021e51e, 0xb851eb85, 0x40113e76, 0xc8b3e3ac, + 0x40dcb083, 0xd70a3d6b, 0xc0240000, 0x00000000, 0xbfff0a3d, 0x70a54000, + 0x40dcb083, 0xd70a3d6b, 0xc018d78d, 0x4fdf3b64, 0x400328f5, 0xc28eb4b0, + 0x40dcb083, 0xd70a3d6b, 0xc0035e35, 0x3f7ced91, 0xbfe8cccc, 0xcccf515c, + 0x40dcb083, 0xd70a3d6b, 0x3ff5e560, 0x4189374c, 0x3fde1cac, 0x082b37f0, + 0x40dcb083, 0xd70a3d6b, 0x4014a1ca, 0xc083126e, 0xbffe872b, 0x020d7e00, + 0x40dcb083, 0xd70a3d6b, 0x4021e51e, 0xb851eb85, 0x400b570a, 0x3d6ff584, + 0x40dd1de6, 0x0418936f, 0xc0240000, 0x00000000, 0xc0119fbe, 0x76c91000, + 0x40dd1de6, 0x0418936f, 0xc018d78d, 0x4fdf3b64, 0xbff04395, 0x81077990, + 0x40dd1de6, 0x0418936f, 0xc0035e35, 0x3f7ced91, 0x3fef53f7, 0xced686d4, + 0x40dd1de6, 0x0418936f, 0x3ff5e560, 0x4189374c, 0x3fb5a1ca, 0xc06aefc0, + 0x40dd1de6, 0x0418936f, 0x4014a1ca, 0xc083126e, 0x4002d4fd, 0xf3b5a8d0, + 0x40dd1de6, 0x0418936f, 0x4021e51e, 0xb851eb85, 0x40043126, 0xe97823b0, + 0x40dd8b48, 0x3126e973, 0xc0240000, 0x00000000, 0x40090624, 0xdd2e6000, + 0x40dd8b48, 0x3126e973, 0xc018d78d, 0x4fdf3b64, 0x3ffc851e, 0xb8509110, + 0x40dd8b48, 0x3126e973, 0xc0035e35, 0x3f7ced91, 0x3fd3f7ce, 0xd9115180, + 0x40dd8b48, 0x3126e973, 0x3ff5e560, 0x4189374c, 0xbfd34bc6, 0xa7f5c010, + 0x40dd8b48, 0x3126e973, 0x4014a1ca, 0xc083126e, 0x3ff753f7, 0xced7d788, + 0x40dd8b48, 0x3126e973, 0x4021e51e, 0xb851eb85, 0x3ffa1687, 0x2b00a3b8, + 0x40ddf8aa, 0x5e353f77, 0xc0240000, 0x00000000, 0x3fe52f1a, 0x9fbb8000, + 0x40ddf8aa, 0x5e353f77, 0xc018d78d, 0x4fdf3b64, 0xbffa1062, 0x4dd451e0, + 0x40ddf8aa, 0x5e353f77, 0xc0035e35, 0x3f7ced91, 0xbfd6b851, 0xeb8a6aa8, + 0x40ddf8aa, 0x5e353f77, 0x3ff5e560, 0x4189374c, 0x3fe5cac0, 0x830f5090, + 0x40ddf8aa, 0x5e353f77, 0x4014a1ca, 0xc083126e, 0x3fe1fbe7, 0x6c88bae0, + 0x40ddf8aa, 0x5e353f77, 0x4021e51e, 0xb851eb85, 0x3fe79581, 0x06220020, + 0x40de660c, 0x8b43957b, 0xc0240000, 0x00000000, 0xbffcdd2f, 0x1aa14000, + 0x40de660c, 0x8b43957b, 0xc018d78d, 0x4fdf3b64, 0x3ff2b851, 0xeb83b8c0, + 0x40de660c, 0x8b43957b, 0xc0035e35, 0x3f7ced91, 0xbff05a1c, 0xac0989b4, + 0x40de660c, 0x8b43957b, 0x3ff5e560, 0x4189374c, 0x3fd2e147, 0xae0e2520, + 0x40de660c, 0x8b43957b, 0x4014a1ca, 0xc083126e, 0xbfd56041, 0x893c72a0, + 0x40de660c, 0x8b43957b, 0x4021e51e, 0xb851eb85, 0xbfc40831, 0x26f51cc0, + 0x40ded36e, 0xb851eb7f, 0xc0240000, 0x00000000, 0xc011147a, 0xe1481000, + 0x40ded36e, 0xb851eb7f, 0xc018d78d, 0x4fdf3b64, 0xc001ee97, 0x8d509518, + 0x40ded36e, 0xb851eb7f, 0xc0035e35, 0x3f7ced91, 0x3fe76c8b, 0x4392c4c8, + 0x40ded36e, 0xb851eb7f, 0x3ff5e560, 0x4189374c, 0xbfb74bc6, 0xa8095b80, + 0x40ded36e, 0xb851eb7f, 0x4014a1ca, 0xc083126e, 0xbff3ae14, 0x7ae296c0, + 0x40ded36e, 0xb851eb7f, 0x4021e51e, 0xb851eb85, 0xbff0cccc, 0xccce4740, + 0x40df40d0, 0xe5604183, 0xc0240000, 0x00000000, 0x400a1cac, 0x08306000, + 0x40df40d0, 0xe5604183, 0xc018d78d, 0x4fdf3b64, 0x3fe1d70a, 0x3d6dc0e0, + 0x40df40d0, 0xe5604183, 0xc0035e35, 0x3f7ced91, 0x3fb0a3d7, 0x0a2735a0, + 0x40df40d0, 0xe5604183, 0x3ff5e560, 0x4189374c, 0xbfde872b, 0x0212d2e0, + 0x40df40d0, 0xe5604183, 0x4014a1ca, 0xc083126e, 0xc001020c, 0x49bb086c, + 0x40df40d0, 0xe5604183, 0x4021e51e, 0xb851eb85, 0xbfff1893, 0x74bdeae8, + 0x40dfae33, 0x126e9787, 0xc0240000, 0x00000000, 0x3fe98937, 0x4bc38000, + 0x40dfae33, 0x126e9787, 0xc018d78d, 0x4fdf3b64, 0xc006d4fd, 0xf3b70140, + 0x40dfae33, 0x126e9787, 0xc0035e35, 0x3f7ced91, 0xbfe34395, 0x8108f760, + 0x40dfae33, 0x126e9787, 0x3ff5e560, 0x4189374c, 0x3fe02d0e, 0x5600c728, + 0x40dfae33, 0x126e9787, 0x4014a1ca, 0xc083126e, 0x40011687, 0x2b015f64, + 0x40dfae33, 0x126e9787, 0x4021e51e, 0xb851eb85, 0xc006b22d, 0x0e56c748, + 0x40e00dca, 0x9fbe76c6, 0xc0240000, 0x00000000, 0xbffab020, 0xc49d0000, + 0x40e00dca, 0x9fbe76c6, 0xc018d78d, 0x4fdf3b64, 0xbfac28f5, 0xc2b6fc00, + 0x40e00dca, 0x9fbe76c6, 0xc0035e35, 0x3f7ced91, 0x3ff26e97, 0x8d4eb068, + 0x40e00dca, 0x9fbe76c6, 0x3ff5e560, 0x4189374c, 0x3fbe978d, 0x4fc84940, + 0x40e00dca, 0x9fbe76c6, 0x4014a1ca, 0xc083126e, 0x3ff3d70a, 0x3d6f84b0, + 0x40e00dca, 0x9fbe76c6, 0x4021e51e, 0xb851eb85, 0xc00dd810, 0x624e791c, + 0x40e0447b, 0xb645a1c8, 0xc0240000, 0x00000000, 0xc0108937, 0x4bc70000, + 0x40e0447b, 0xb645a1c8, 0xc018d78d, 0x4fdf3b64, 0x4005f3b6, 0x45a12960, + 0x40e0447b, 0xb645a1c8, 0xc0035e35, 0x3f7ced91, 0x3fdf0a3d, 0x709f0578, + 0x40e0447b, 0xb645a1c8, 0x3ff5e560, 0x4189374c, 0xbfd10e56, 0x041e69b0, + 0x40e0447b, 0xb645a1c8, 0x4014a1ca, 0xc083126e, 0x3fd60418, 0x93702a60, + 0x40e0447b, 0xb645a1c8, 0x4021e51e, 0xb851eb85, 0x40114b43, 0x9580b192, + 0x40e07b2c, 0xccccccca, 0xc0240000, 0x00000000, 0x400b3333, 0x33328000, + 0x40e07b2c, 0xccccccca, 0xc018d78d, 0x4fdf3b64, 0xbfe55c28, 0xf5c52060, + 0x40e07b2c, 0xccccccca, 0xc0035e35, 0x3f7ced91, 0xbfc74bc6, 0xa7f96d60, + 0x40e07b2c, 0xccccccca, 0x3ff5e560, 0x4189374c, 0xbfe4e147, 0xae1772d8, + 0x40e07b2c, 0xccccccca, 0x4014a1ca, 0xc083126e, 0xbfe1a9fb, 0xe76edf00, + 0x40e07b2c, 0xccccccca, 0x4021e51e, 0xb851eb85, 0x400b70a3, 0xd7099150, + 0x40e0b1dd, 0xe353f7cc, 0xc0240000, 0x00000000, 0x3fede353, 0xf7cc0000, + 0x40e0b1dd, 0xe353f7cc, 0xc018d78d, 0x4fdf3b64, 0x40010d4f, 0xdf3abd38, + 0x40e0b1dd, 0xe353f7cc, 0xc0035e35, 0x3f7ced91, 0xbfeb2b02, 0x0c4c396c, + 0x40e0b1dd, 0xe353f7cc, 0x3ff5e560, 0x4189374c, 0x3fd51eb8, 0x51e57b80, + 0x40e0b1dd, 0xe353f7cc, 0x4014a1ca, 0xc083126e, 0xbff72b02, 0x0c4ae998, + 0x40e0b1dd, 0xe353f7cc, 0x4021e51e, 0xb851eb85, 0x40044ac0, 0x8311bf7c, + 0x40e0e88e, 0xf9db22ce, 0xc0240000, 0x00000000, 0xbff88312, 0x6e990000, + 0x40e0e88e, 0xf9db22ce, 0xc018d78d, 0x4fdf3b64, 0xbff47ae1, 0x47af6880, + 0x40e0e88e, 0xf9db22ce, 0xc0035e35, 0x3f7ced91, 0x3fecf5c2, 0x8f599ec4, + 0x40e0e88e, 0xf9db22ce, 0x3ff5e560, 0x4189374c, 0xbfacac08, 0x31580400, + 0x40e0e88e, 0xf9db22ce, 0x4014a1ca, 0xc083126e, 0xc002c083, 0x126f31d8, + 0x40e0e88e, 0xf9db22ce, 0x4021e51e, 0xb851eb85, 0x3ffa49ba, 0x5e33db50, + 0x40e11f40, 0x10624dd0, 0xc0240000, 0x00000000, 0xc00ffbe7, 0x6c8c0000, + 0x40e11f40, 0x10624dd0, 0xc018d78d, 0x4fdf3b64, 0x3ff84dd2, 0xf1a8a220, + 0x40e11f40, 0x10624dd0, 0xc0035e35, 0x3f7ced91, 0x3fce76c8, 0xb42f02c0, + 0x40e11f40, 0x10624dd0, 0x3ff5e560, 0x4189374c, 0xbfdc49ba, 0x5e3b7c80, + 0x40e11f40, 0x10624dd0, 0x4014a1ca, 0xc083126e, 0x3ffeb020, 0xc49a6bf0, + 0x40e11f40, 0x10624dd0, 0x4021e51e, 0xb851eb85, 0x3fe7fbe7, 0x6c886f50, + 0x40e155f1, 0x26e978d2, 0xc0240000, 0x00000000, 0x400c49ba, 0x5e348000, + 0x40e155f1, 0x26e978d2, 0xc018d78d, 0x4fdf3b64, 0xbffe47ae, 0x147c40d0, + 0x40e155f1, 0x26e978d2, 0xc0035e35, 0x3f7ced91, 0xbfdb74bc, 0x6a843ac8, + 0x40e155f1, 0x26e978d2, 0x3ff5e560, 0x4189374c, 0x3fe14bc6, 0xa7ec7258, + 0x40e155f1, 0x26e978d2, 0x4014a1ca, 0xc083126e, 0x3ff05a1c, 0xac06f1d8, + 0x40e155f1, 0x26e978d2, 0x4021e51e, 0xb851eb85, 0xbfc26e97, 0x8d5b6000, + 0x40e18ca2, 0x3d70a3d4, 0xc0240000, 0x00000000, 0x3ff11eb8, 0x51ea0000, + 0x40e18ca2, 0x3d70a3d4, 0xc018d78d, 0x4fdf3b64, 0x3fed020c, 0x49b793a0, + 0x40e18ca2, 0x3d70a3d4, 0xc0035e35, 0x3f7ced91, 0xbff18937, 0x4bc7fdbc, + 0x40e18ca2, 0x3d70a3d4, 0x3ff5e560, 0x4189374c, 0x3fc3c6a7, 0xef90d160, + 0x40e18ca2, 0x3d70a3d4, 0x4014a1ca, 0xc083126e, 0x3fc020c4, 0x9b9bbe00, + 0x40e18ca2, 0x3d70a3d4, 0x4021e51e, 0xb851eb85, 0xbff09999, 0x999b0fa8, + 0x40e1c353, 0x53f7ced6, 0xc0240000, 0x00000000, 0xbff65604, 0x18950000, + 0x40e1c353, 0x53f7ced6, 0xc018d78d, 0x4fdf3b64, 0xc0040a3d, 0x70a48c90, + 0x40e1c353, 0x53f7ced6, 0xc0035e35, 0x3f7ced91, 0x3fe50e56, 0x0415dcb8, + 0x40e1c353, 0x53f7ced6, 0x3ff5e560, 0x4189374c, 0xbfcda1ca, 0xc09026a0, + 0x40e1c353, 0x53f7ced6, 0x4014a1ca, 0xc083126e, 0xbfe8a3d7, 0x0a4004b0, + 0x40e1c353, 0x53f7ced6, 0x4021e51e, 0xb851eb85, 0xbffee560, 0x418ab350, + 0x40e1fa04, 0x6a7ef9d8, 0xc0240000, 0x00000000, 0xc00ee560, 0x418a0000, + 0x40e1fa04, 0x6a7ef9d8, 0xc018d78d, 0x4fdf3b64, 0x3fd2d0e5, 0x603bc600, + 0x40e1fa04, 0x6a7ef9d8, 0xc0035e35, 0x3f7ced91, 0xbf826e97, 0x8e005700, + 0x40e1fa04, 0x6a7ef9d8, 0x3ff5e560, 0x4189374c, 0xbfe3c28f, 0x5c2c47a8, + 0x40e1fa04, 0x6a7ef9d8, 0x4014a1ca, 0xc083126e, 0xbffaa7ef, 0x9db37c70, + 0x40e1fa04, 0x6a7ef9d8, 0x4021e51e, 0xb851eb85, 0xc0069893, 0x74bd2b7c, + 0x40e230b5, 0x810624da, 0xc0240000, 0x00000000, 0x400d6041, 0x89368000, + 0x40e230b5, 0x810624da, 0xc018d78d, 0x4fdf3b64, 0x4008be76, 0xc8b37e10, + 0x40e230b5, 0x810624da, 0xc0035e35, 0x3f7ced91, 0xbfe5a1ca, 0xc085df70, + 0x40e230b5, 0x810624da, 0x3ff5e560, 0x4189374c, 0x3fd75c28, 0xf5bbd1e0, + 0x40e230b5, 0x810624da, 0x4014a1ca, 0xc083126e, 0xc0047ef9, 0xdb237b44, + 0x40e230b5, 0x810624da, 0x4021e51e, 0xb851eb85, 0xc00dbe76, 0xc8b4fd50, + 0x40e26766, 0x978d4fdc, 0xc0240000, 0x00000000, 0x3ff34bc6, 0xa7ee0000, + 0x40e26766, 0x978d4fdc, 0xc018d78d, 0x4fdf3b64, 0xbfd4624d, 0xd2f79b40, + 0x40e26766, 0x978d4fdc, 0xc0035e35, 0x3f7ced91, 0x3ff13f7c, 0xed8ffc60, + 0x40e26766, 0x978d4fdc, 0x3ff5e560, 0x4189374c, 0xbf958106, 0x254aa200, + 0x40e26766, 0x978d4fdc, 0x4014a1ca, 0xc083126e, 0x3ffb3333, 0x3331d918, + 0x40e26766, 0x978d4fdc, 0x4021e51e, 0xb851eb85, 0x40115810, 0x624d6f78, + 0x40e29e17, 0xae147ade, 0xc0240000, 0x00000000, 0xbff428f5, 0xc2910000, + 0x40e29e17, 0xae147ade, 0xc018d78d, 0x4fdf3b64, 0x4003d810, 0x624d11e8, + 0x40e29e17, 0xae147ade, 0xc0035e35, 0x3f7ced91, 0x3fda4dd2, 0xf1a43558, + 0x40e29e17, 0xae147ade, 0x3ff5e560, 0x4189374c, 0xbfda0c49, 0xba652620, + 0x40e29e17, 0xae147ade, 0x4014a1ca, 0xc083126e, 0x3fe9ba5e, 0x353cbe00, + 0x40e29e17, 0xae147ade, 0x4021e51e, 0xb851eb85, 0x400b8a3d, 0x70a30d1c, + 0x40e2d4c8, 0xc49ba5e0, 0xc0240000, 0x00000000, 0xc00dced9, 0x16880000, + 0x40e2d4c8, 0xc49ba5e0, 0xc018d78d, 0x4fdf3b64, 0xbfedcac0, 0x83157e40, + 0x40e2d4c8, 0xc49ba5e0, 0xc0035e35, 0x3f7ced91, 0xbfd0624d, 0xd2f786d0, + 0x40e2d4c8, 0xc49ba5e0, 0x3ff5e560, 0x4189374c, 0x3fe26a7e, 0xf9d79d88, + 0x40e2d4c8, 0xc49ba5e0, 0x4014a1ca, 0xc083126e, 0xbfb78d4f, 0xdf51b180, + 0x40e2d4c8, 0xc49ba5e0, 0x4021e51e, 0xb851eb85, 0x4004645a, 0x1cab3b48, + 0x40e30b79, 0xdb22d0e2, 0xc0240000, 0x00000000, 0x400e76c8, 0xb4388000, + 0x40e30b79, 0xdb22d0e2, 0xc018d78d, 0x4fdf3b64, 0x3ffde353, 0xf7cd4b80, + 0x40e30b79, 0xdb22d0e2, 0xc0035e35, 0x3f7ced91, 0xbfed8937, 0x4bc9a17c, + 0x40e30b79, 0xdb22d0e2, 0x3ff5e560, 0x4189374c, 0x3fc84189, 0x373d7e20, + 0x40e30b79, 0xdb22d0e2, 0x4014a1ca, 0xc083126e, 0xbfef9db2, 0x2d112a60, + 0x40e30b79, 0xdb22d0e2, 0x4021e51e, 0xb851eb85, 0x3ffa7ced, 0x9166d2e8, + 0x40e3422a, 0xf1a9fbe4, 0xc0240000, 0x00000000, 0x3ff578d4, 0xfdf20000, + 0x40e3422a, 0xf1a9fbe4, 0xc018d78d, 0x4fdf3b64, 0xbff8b22d, 0x0e579770, + 0x40e3422a, 0xf1a9fbe4, 0xc0035e35, 0x3f7ced91, 0x3fea978d, 0x4fdc36b4, + 0x40e3422a, 0xf1a9fbe4, 0x3ff5e560, 0x4189374c, 0xbfc926e9, 0x78e379e0, + 0x40e3422a, 0xf1a9fbe4, 0x4014a1ca, 0xc083126e, 0xbffe24dd, 0x2f1c0f48, + 0x40e3422a, 0xf1a9fbe4, 0x4021e51e, 0xb851eb85, 0x3fe8624d, 0xd2ee5e80, + 0x40e378dc, 0x083126e6, 0xc0240000, 0x00000000, 0xbff1fbe7, 0x6c8d0000, + 0x40e378dc, 0x083126e6, 0xc018d78d, 0x4fdf3b64, 0x3ff41687, 0x2b007330, + 0x40e378dc, 0x083126e6, 0xc0035e35, 0x3f7ced91, 0x3fc4fdf3, 0xb6396280, + 0x40e378dc, 0x083126e6, 0x3ff5e560, 0x4189374c, 0xbfe2a3d7, 0x0a411c78, + 0x40e378dc, 0x083126e6, 0x4014a1ca, 0xc083126e, 0x40030624, 0xdd2e602c, + 0x40e378dc, 0x083126e6, 0x4021e51e, 0xb851eb85, 0xbfc0d4fd, 0xf3c3a340, + 0x40e3af8d, 0x1eb851e8, 0xc0240000, 0x00000000, 0xc00cb851, 0xeb860000, + 0x40e3af8d, 0x1eb851e8, 0xc018d78d, 0x4fdf3b64, 0xc0013f7c, 0xed9237e0, + 0x40e3af8d, 0x1eb851e8, 0xc0035e35, 0x3f7ced91, 0xbfe01893, 0x74bf8574, + 0x40e3af8d, 0x1eb851e8, 0x3ff5e560, 0x4189374c, 0x3fd99999, 0x99922840, + 0x40e3af8d, 0x1eb851e8, 0x4014a1ca, 0xc083126e, 0x3ff7b645, 0xa1c94640, + 0x40e3af8d, 0x1eb851e8, 0x4021e51e, 0xb851eb85, 0xbff06666, 0x66681810, + 0x40e3e63e, 0x353f7cea, 0xc0240000, 0x00000000, 0x400f8d4f, 0xdf3a8000, + 0x40e3e63e, 0x353f7cea, 0xc018d78d, 0x4fdf3b64, 0x3fe49374, 0xbc6735c0, + 0x40e3e63e, 0x353f7cea, 0xc0035e35, 0x3f7ced91, 0xbff2b851, 0xeb86b1c4, + 0x40e3e63e, 0x353f7cea, 0x3ff5e560, 0x4189374c, 0x3f8cac08, 0x30358800, + 0x40e3e63e, 0x353f7cea, 0x4014a1ca, 0xc083126e, 0x3fe2c083, 0x126b9850, + 0x40e3e63e, 0x353f7cea, 0x4021e51e, 0xb851eb85, 0xbffeb22d, 0x0e57bbb8, + 0x40e41cef, 0x4bc6a7ec, 0xc0240000, 0x00000000, 0x3ff7a5e3, 0x53f60000, + 0x40e41cef, 0x4bc6a7ec, 0xc018d78d, 0x4fdf3b64, 0xc00625e3, 0x53f8a408, + 0x40e41cef, 0x4bc6a7ec, 0xc0035e35, 0x3f7ced91, 0x3fe2b020, 0xc49874a8, + 0x40e41cef, 0x4bc6a7ec, 0x3ff5e560, 0x4189374c, 0xbfd7ced9, 0x168ecfc0, + 0x40e41cef, 0x4bc6a7ec, 0x4014a1ca, 0xc083126e, 0xbfd3d70a, 0x3d76b7c0, + 0x40e41cef, 0x4bc6a7ec, 0x4021e51e, 0xb851eb85, 0xc0067ef9, 0xdb23afb0, + 0x40e453a0, 0x624dd2ee, 0xc0240000, 0x00000000, 0xbfef9db2, 0x2d120000, + 0x40e453a0, 0x624dd2ee, 0xc018d78d, 0x4fdf3b64, 0x3f9f3b64, 0x59b0a400, + 0x40e453a0, 0x624dd2ee, 0xc0035e35, 0x3f7ced91, 0xbfb53f7c, 0xedab4b60, + 0x40e453a0, 0x624dd2ee, 0x3ff5e560, 0x4189374c, 0x3fe38937, 0x4bc2c8b8, + 0x40e453a0, 0x624dd2ee, 0x4014a1ca, 0xc083126e, 0xbff34bc6, 0xa7f12808, + 0x40e453a0, 0x624dd2ee, 0x4021e51e, 0xb851eb85, 0xc00da4dd, 0x2f1b8184, + 0x40e48a51, 0x78d4fdf0, 0xc0240000, 0x00000000, 0xc00ba1ca, 0xc0840000, + 0x40e48a51, 0x78d4fdf0, 0xc018d78d, 0x4fdf3b64, 0x4006a2d0, 0xe55f6698, + 0x40e48a51, 0x78d4fdf0, 0xc0035e35, 0x3f7ced91, 0xbfe80000, 0x00034780, + 0x40e48a51, 0x78d4fdf0, 0x3ff5e560, 0x4189374c, 0x3fccbc6a, 0x7eea2ae0, + 0x40e48a51, 0x78d4fdf0, 0x4014a1ca, 0xc083126e, 0xc000d0e5, 0x60425110, + 0x40e48a51, 0x78d4fdf0, 0x4021e51e, 0xb851eb85, 0x401164dd, 0x2f1a2d5e, + 0x40e4c102, 0x8f5c28f2, 0xc0240000, 0x00000000, 0x401051eb, 0x851e4000, + 0x40e4c102, 0x8f5c28f2, 0xc018d78d, 0x4fdf3b64, 0xbfe29fbe, 0x76cc2b80, + 0x40e4c102, 0x8f5c28f2, 0xc0035e35, 0x3f7ced91, 0x3ff01062, 0x4dd14858, + 0x40e4c102, 0x8f5c28f2, 0x3ff5e560, 0x4189374c, 0xbfc4ac08, 0x3136cd20, + 0x40e4c102, 0x8f5c28f2, 0x4014a1ca, 0xc083126e, 0x400147ae, 0x147a16c0, + 0x40e4c102, 0x8f5c28f2, 0x4021e51e, 0xb851eb85, 0x400ba3d7, 0x0a3c88e8, + 0x40e4f7b3, 0xa5e353f4, 0xc0240000, 0x00000000, 0x3ff9d2f1, 0xa9fa0000, + 0x40e4f7b3, 0xa5e353f4, 0xc018d78d, 0x4fdf3b64, 0x4001bc6a, 0x7ef8fa70, + 0x40e4f7b3, 0xa5e353f4, 0xc0035e35, 0x3f7ced91, 0x3fd59168, 0x72a96538, + 0x40e4f7b3, 0xa5e353f4, 0x3ff5e560, 0x4189374c, 0xbfe1851e, 0xb855f148, + 0x40e4f7b3, 0xa5e353f4, 0x4014a1ca, 0xc083126e, 0x3ff43958, 0x1060b368, + 0x40e4f7b3, 0xa5e353f4, 0x4021e51e, 0xb851eb85, 0x40047df3, 0xb644b714, + 0x40e52e64, 0xbc6a7ef6, 0xc0240000, 0x00000000, 0xbfeb4395, 0x810a0000, + 0x40e52e64, 0xbc6a7ef6, 0xc018d78d, 0x4fdf3b64, 0xbff31cac, 0x0832ee10, + 0x40e52e64, 0xbc6a7ef6, 0xc0035e35, 0x3f7ced91, 0xbfd51eb8, 0x51f256f0, + 0x40e52e64, 0xbc6a7ef6, 0x3ff5e560, 0x4189374c, 0x3fdbd70a, 0x3d687ea0, + 0x40e52e64, 0xbc6a7ef6, 0x4014a1ca, 0xc083126e, 0x3fd78d4f, 0xdf34e540, + 0x40e52e64, 0xbc6a7ef6, 0x4021e51e, 0xb851eb85, 0x3ffab020, 0xc499ca80, + 0x40e56515, 0xd2f1a9f8, 0xc0240000, 0x00000000, 0xc00a8b43, 0x95820000, + 0x40e56515, 0xd2f1a9f8, 0xc018d78d, 0x4fdf3b64, 0x3ff9ac08, 0x31251c90, + 0x40e56515, 0xd2f1a9f8, 0xc0035e35, 0x3f7ced91, 0xbfefe76c, 0x8b47098c, + 0x40e56515, 0xd2f1a9f8, 0x3ff5e560, 0x4189374c, 0x3fa91687, 0x2ac01500, + 0x40e56515, 0xd2f1a9f8, 0x4014a1ca, 0xc083126e, 0xbfe0e560, 0x418c8190, + 0x40e56515, 0xd2f1a9f8, 0x4021e51e, 0xb851eb85, 0x3fe8c8b4, 0x39544db0, + 0x40e59bc6, 0xe978d4fa, 0xc0240000, 0x00000000, 0x4010dd2f, 0x1a9f4000, + 0x40e59bc6, 0xe978d4fa, 0xc018d78d, 0x4fdf3b64, 0xbffce978, 0xd4ffc660, + 0x40e59bc6, 0xe978d4fa, 0xc0035e35, 0x3f7ced91, 0x3fe83958, 0x105ecea4, + 0x40e59bc6, 0xe978d4fa, 0x3ff5e560, 0x4189374c, 0xbfd59168, 0x72b87960, + 0x40e59bc6, 0xe978d4fa, 0x4014a1ca, 0xc083126e, 0xbff6c8b4, 0x3959bae0, + 0x40e59bc6, 0xe978d4fa, 0x4021e51e, 0xb851eb85, 0xbfbe76c8, 0xb457cd00, + 0x40e5d277, 0xfffffffc, 0xc0240000, 0x00000000, 0x3ffbffff, 0xfffe0000, + 0x40e5d277, 0xfffffffc, 0xc018d78d, 0x4fdf3b64, 0x3fefbe76, 0xc8b08880, + 0x40e5d277, 0xfffffffc, 0xc0035e35, 0x3f7ced91, 0x3fb70a3d, 0x70878480, + 0x40e5d277, 0xfffffffc, 0x3ff5e560, 0x4189374c, 0x3fe4a7ef, 0x9dadf3e8, + 0x40e5d277, 0xfffffffc, 0x4014a1ca, 0xc083126e, 0xc0028f5c, 0x28f69a7c, + 0x40e5d277, 0xfffffffc, 0x4021e51e, 0xb851eb85, 0xbff03333, 0x33352078, + 0x40e60929, 0x16872afe, 0xc0240000, 0x00000000, 0xbfe6e978, 0xd5020000, + 0x40e60929, 0x16872afe, 0xc018d78d, 0x4fdf3b64, 0xc0035b22, 0xd0e64f58, + 0x40e60929, 0x16872afe, 0xc0035e35, 0x3f7ced91, 0xbfe276c8, 0xb43ced84, + 0x40e60929, 0x16872afe, 0x3ff5e560, 0x4189374c, 0x3fd09ba5, 0xe34b6bd0, + 0x40e60929, 0x16872afe, 0x4014a1ca, 0xc083126e, 0x3fff126e, 0x978b9aa8, + 0x40e60929, 0x16872afe, 0x4021e51e, 0xb851eb85, 0xbffe7ef9, 0xdb24c420, + 0x40e63fda, 0x2d0e5600, 0xc0240000, 0x00000000, 0xc00974bc, 0x6a800000, + 0x40e63fda, 0x2d0e5600, 0xc018d78d, 0x4fdf3b64, 0x3fd849ba, 0x5e2dafc0, + 0x40e63fda, 0x2d0e5600, 0xc0035e35, 0x3f7ced91, 0x3ff2d4fd, 0xf3b47556, + 0x40e63fda, 0x2d0e5600, 0x3ff5e560, 0x4189374c, 0xbfc03126, 0xe98a2060, + 0x40e63fda, 0x2d0e5600, 0x4014a1ca, 0xc083126e, 0x3ff0bc6a, 0x7ef82090, + 0x40e63fda, 0x2d0e5600, 0x4021e51e, 0xb851eb85, 0xc0066560, 0x418a33e4, + 0x40e6768b, 0x43958102, 0xc0240000, 0x00000000, 0x40116872, 0xb0204000, + 0x40e6768b, 0x43958102, 0xc018d78d, 0x4fdf3b64, 0xc0084189, 0x374cbb80, + 0x40e6768b, 0x43958102, 0xc0035e35, 0x3f7ced91, 0x3fe051eb, 0x851b0c98, + 0x40e6768b, 0x43958102, 0x3ff5e560, 0x4189374c, 0xbfe06666, 0x666ac618, + 0x40e6768b, 0x43958102, 0x4014a1ca, 0xc083126e, 0x3fc33333, 0x332533c0, + 0x40e6768b, 0x43958102, 0x4021e51e, 0xb851eb85, 0xc00d8b43, 0x958205b8, + 0x40e6ad3c, 0x5a1cac04, 0xc0240000, 0x00000000, 0x3ffe2d0e, 0x56020000, + 0x40e6ad3c, 0x5a1cac04, 0xc018d78d, 0x4fdf3b64, 0xbfcdd2f1, 0xaa0b6300, + 0x40e6ad3c, 0x5a1cac04, 0xc0035e35, 0x3f7ced91, 0xbfc41893, 0x74cb45f0, + 0x40e6ad3c, 0x5a1cac04, 0x3ff5e560, 0x4189374c, 0x3fde147a, 0xe13ed500, + 0x40e6ad3c, 0x5a1cac04, 0x4014a1ca, 0xc083126e, 0xbfe7df3b, 0x645da740, + 0x40e6ad3c, 0x5a1cac04, 0x4021e51e, 0xb851eb85, 0x401171a9, 0xfbe6eb44, + 0x40e6e3ed, 0x70a3d706, 0xc0240000, 0x00000000, 0xbfe28f5c, 0x28fa0000, + 0x40e6e3ed, 0x70a3d706, 0xc018d78d, 0x4fdf3b64, 0x4004872b, 0x020b4f20, + 0x40e6e3ed, 0x70a3d706, 0xc0035e35, 0x3f7ced91, 0xbfea5e35, 0x3f80af90, + 0x40e6e3ed, 0x70a3d706, 0x3ff5e560, 0x4189374c, 0x3fb58106, 0x24b96400, + 0x40e6e3ed, 0x70a3d706, 0x4014a1ca, 0xc083126e, 0xbffa45a1, 0xcac24db8, + 0x40e6e3ed, 0x70a3d706, 0x4021e51e, 0xb851eb85, 0x400bbd70, 0xa3d604b4, + 0x40e71a9e, 0x872b0208, 0xc0240000, 0x00000000, 0xc0085e35, 0x3f7e0000, + 0x40e71a9e, 0x872b0208, 0xc018d78d, 0x4fdf3b64, 0xbfeb0e56, 0x041c8960, + 0x40e71a9e, 0x872b0208, 0xc0035e35, 0x3f7ced91, 0x3fedc28f, 0x5c2528a0, + 0x40e71a9e, 0x872b0208, 0x3ff5e560, 0x4189374c, 0xbfd353f7, 0xcee22300, + 0x40e71a9e, 0x872b0208, 0x4014a1ca, 0xc083126e, 0xc0044dd2, 0xf1aae3e8, + 0x40e71a9e, 0x872b0208, 0x4021e51e, 0xb851eb85, 0x4004978d, 0x4fde32e0, + 0x40e7514f, 0x9db22d0a, 0xc0240000, 0x00000000, 0x4011f3b6, 0x45a14000, + 0x40e7514f, 0x9db22d0a, 0xc018d78d, 0x4fdf3b64, 0x3fff4189, 0x3749c5f0, + 0x40e7514f, 0x9db22d0a, 0xc0035e35, 0x3f7ced91, 0x3fd0d4fd, 0xf3ae9518, + 0x40e7514f, 0x9db22d0a, 0x3ff5e560, 0x4189374c, 0x3fe5c6a7, 0xef991f18, + 0x40e7514f, 0x9db22d0a, 0x4014a1ca, 0xc083126e, 0x3ffb9581, 0x062307d0, + 0x40e7514f, 0x9db22d0a, 0x4021e51e, 0xb851eb85, 0x3ffae353, 0xf7ccc218, + 0x40e78800, 0xb439580c, 0xc0240000, 0x00000000, 0x40002d0e, 0x56030000, + 0x40e78800, 0xb439580c, 0xc018d78d, 0x4fdf3b64, 0xbff753f7, 0xcedb1d00, + 0x40e78800, 0xb439580c, 0xc0035e35, 0x3f7ced91, 0xbfd9db22, 0xd0ed2710, + 0x40e78800, 0xb439580c, 0x3ff5e560, 0x4189374c, 0x3fd2d916, 0x8721c230, + 0x40e78800, 0xb439580c, 0x4014a1ca, 0xc083126e, 0x3fea7ef9, 0xdb1f1b70, + 0x40e78800, 0xb439580c, 0x4021e51e, 0xb851eb85, 0x3fe92f1a, 0x9fba3ce0, + 0x40e7beb1, 0xcac0830e, 0xc0240000, 0x00000000, 0xbfdc6a7e, 0xf9e40000, + 0x40e7beb1, 0xcac0830e, 0xc018d78d, 0x4fdf3b64, 0x3ff574bc, 0x6a7ceda0, + 0x40e7beb1, 0xcac0830e, 0xc0035e35, 0x3f7ced91, 0xbff122d0, 0xe56238ce, + 0x40e7beb1, 0xcac0830e, 0x3ff5e560, 0x4189374c, 0xbfb76c8b, 0x43bae740, + 0x40e7beb1, 0xcac0830e, 0x4014a1ca, 0xc083126e, 0xbfb16872, 0xb03ec600, + 0x40e7beb1, 0xcac0830e, 0x4021e51e, 0xb851eb85, 0xbfbb4395, 0x81285380, + 0x40e7f562, 0xe147ae10, 0xc0240000, 0x00000000, 0xc00747ae, 0x147c0000, + 0x40e7f562, 0xe147ae10, 0xc018d78d, 0x4fdf3b64, 0xc0009062, 0x4dd3faa8, + 0x40e7f562, 0xe147ae10, 0xc0035e35, 0x3f7ced91, 0x3fe5db22, 0xd0e16694, + 0x40e7f562, 0xe147ae10, 0x3ff5e560, 0x4189374c, 0xbfde8f5c, 0x28ff35d0, + 0x40e7f562, 0xe147ae10, 0x4014a1ca, 0xc083126e, 0xbfeed916, 0x872eccf0, + 0x40e7f562, 0xe147ae10, 0x4021e51e, 0xb851eb85, 0xbff00000, 0x000228e0, + 0x40e82c13, 0xf7ced912, 0xc0240000, 0x00000000, 0x40127ef9, 0xdb224000, + 0x40e82c13, 0xf7ced912, 0xc018d78d, 0x4fdf3b64, 0x3fe74fdf, 0x3b602aa0, + 0x40e82c13, 0xf7ced912, 0xc0035e35, 0x3f7ced91, 0x3f90624d, 0xd2711000, + 0x40e82c13, 0xf7ced912, 0x3ff5e560, 0x4189374c, 0x3fe028f5, 0xc28a95b0, + 0x40e82c13, 0xf7ced912, 0x4014a1ca, 0xc083126e, 0xbffdc28f, 0x5c2ae090, + 0x40e82c13, 0xf7ced912, 0x4021e51e, 0xb851eb85, 0xbffe4bc6, 0xa7f1cc88, + 0x40e862c5, 0x0e560414, 0xc0240000, 0x00000000, 0x40014395, 0x81050000, + 0x40e862c5, 0x0e560414, 0xc018d78d, 0x4fdf3b64, 0xc00576c8, 0xb43a66d0, + 0x40e862c5, 0x0e560414, 0xc0035e35, 0x3f7ced91, 0xbfe4d4fd, 0xf3ba5594, + 0x40e862c5, 0x0e560414, 0x3ff5e560, 0x4189374c, 0x3fbe76c8, 0xb412bd80, + 0x40e862c5, 0x0e560414, 0x4014a1ca, 0xc083126e, 0x4003374b, 0xc6a6f788, + 0x40e862c5, 0x0e560414, 0x4021e51e, 0xb851eb85, 0xc0064bc6, 0xa7f0b818, + 0x40e89976, 0x24dd2f16, 0xc0240000, 0x00000000, 0xbfd3b645, 0xa1d40000, + 0x40e89976, 0x24dd2f16, 0xc018d78d, 0x4fdf3b64, 0x3fbdb22d, 0x0e33d000, + 0x40e89976, 0x24dd2f16, 0xc0035e35, 0x3f7ced91, 0x3ff1a5e3, 0x53f5c14e, + 0x40e89976, 0x24dd2f16, 0x3ff5e560, 0x4189374c, 0xbfd11687, 0x2b0bcca0, + 0x40e89976, 0x24dd2f16, 0x4014a1ca, 0xc083126e, 0x3ff81893, 0x74ba74f8, + 0x40e89976, 0x24dd2f16, 0x4021e51e, 0xb851eb85, 0xc00d71a9, 0xfbe889ec, + 0x40e8d027, 0x3b645a18, 0xc0240000, 0x00000000, 0xc0063126, 0xe97a0000, + 0x40e8d027, 0x3b645a18, 0xc018d78d, 0x4fdf3b64, 0x400751eb, 0x851da3d0, + 0x40e8d027, 0x3b645a18, 0xc0035e35, 0x3f7ced91, 0x3fdbe76c, 0x8b3b4910, + 0x40e8d027, 0x3b645a18, 0x3ff5e560, 0x4189374c, 0xbfe4e560, 0x418e2450, + 0x40e8d027, 0x3b645a18, 0x4014a1ca, 0xc083126e, 0x3fe3851e, 0xb84df5c0, + 0x40e8d027, 0x3b645a18, 0x4021e51e, 0xb851eb85, 0x40117e76, 0xc8b3a92a, + 0x40e906d8, 0x51eb851a, 0xc0240000, 0x00000000, 0x40130a3d, 0x70a34000, + 0x40e906d8, 0x51eb851a, 0xc018d78d, 0x4fdf3b64, 0xbfdfc6a7, 0xefa66d40, + 0x40e906d8, 0x51eb851a, 0xc0035e35, 0x3f7ced91, 0xbfcd9168, 0x72c0e630, + 0x40e906d8, 0x51eb851a, 0x3ff5e560, 0x4189374c, 0x3fd51687, 0x2af81890, + 0x40e906d8, 0x51eb851a, 0x4014a1ca, 0xc083126e, 0xbfd24dd2, 0xf1b1fce0, + 0x40e906d8, 0x51eb851a, 0x4021e51e, 0xb851eb85, 0x400bd70a, 0x3d6f8080, + 0x40e93d89, 0x6872b01c, 0xc0240000, 0x00000000, 0x40025a1c, 0xac070000, + 0x40e93d89, 0x6872b01c, 0xc018d78d, 0x4fdf3b64, 0x40026b85, 0x1eb737a8, + 0x40e93d89, 0x6872b01c, 0xc0035e35, 0x3f7ced91, 0xbfecbc6a, 0x7efe17a0, + 0x40e93d89, 0x6872b01c, 0x3ff5e560, 0x4189374c, 0xbfaced91, 0x68c31b80, + 0x40e93d89, 0x6872b01c, 0x4014a1ca, 0xc083126e, 0xbff2e978, 0xd4fff950, + 0x40e93d89, 0x6872b01c, 0x4021e51e, 0xb851eb85, 0x4004b126, 0xe977aeac, + 0x40e9743a, 0x7ef9db1e, 0xc0240000, 0x00000000, 0xbfc60418, 0x93880000, + 0x40e9743a, 0x7ef9db1e, 0xc018d78d, 0x4fdf3b64, 0xbff1be76, 0xc8b673a0, + 0x40e9743a, 0x7ef9db1e, 0xc0035e35, 0x3f7ced91, 0x3feb645a, 0x1ca7c090, + 0x40e9743a, 0x7ef9db1e, 0x3ff5e560, 0x4189374c, 0xbfdc51eb, 0x8528df70, + 0x40e9743a, 0x7ef9db1e, 0x4014a1ca, 0xc083126e, 0xc0009fbe, 0x76c9b9b4, + 0x40e9743a, 0x7ef9db1e, 0x4021e51e, 0xb851eb85, 0x3ffb1687, 0x2affb9b0, + 0x40e9aaeb, 0x95810620, 0xc0240000, 0x00000000, 0xc0051a9f, 0xbe780000, + 0x40e9aaeb, 0x95810620, 0xc018d78d, 0x4fdf3b64, 0x3ffb0a3d, 0x70a19700, + 0x40e9aaeb, 0x95810620, 0xc0035e35, 0x3f7ced91, 0x3fc83126, 0xe96789f0, + 0x40e9aaeb, 0x95810620, 0x3ff5e560, 0x4189374c, 0x3fe147ae, 0x1475c0e0, + 0x40e9aaeb, 0x95810620, 0x4014a1ca, 0xc083126e, 0x400178d4, 0xfdf2ae1c, + 0x40e9aaeb, 0x95810620, 0x4021e51e, 0xb851eb85, 0x3fe99581, 0x06202c10, + 0x40e9e19c, 0xac083122, 0xc0240000, 0x00000000, 0x40139581, 0x06244000, + 0x40e9e19c, 0xac083122, 0xc018d78d, 0x4fdf3b64, 0xbffb8b43, 0x95834bf0, + 0x40e9e19c, 0xac083122, 0xc0035e35, 0x3f7ced91, 0xbfde978d, 0x4fe7f730, + 0x40e9e19c, 0xac083122, 0x3ff5e560, 0x4189374c, 0x3fc3b645, 0xa1b60b80, + 0x40e9e19c, 0xac083122, 0x4014a1ca, 0xc083126e, 0x3ff49ba5, 0xe351e220, + 0x40e9e19c, 0xac083122, 0x4021e51e, 0xb851eb85, 0xbfb81062, 0x4df8da00, + 0x40ea184d, 0xc28f5c24, 0xc0240000, 0x00000000, 0x400370a3, 0xd7090000, + 0x40ea184d, 0xc28f5c24, 0xc018d78d, 0x4fdf3b64, 0x3ff13d70, 0xa3d4beb0, + 0x40ea184d, 0xc28f5c24, 0xc0035e35, 0x3f7ced91, 0xbff251eb, 0x8520ecd6, + 0x40ea184d, 0xc28f5c24, 0x3ff5e560, 0x4189374c, 0xbfcdb22d, 0x0e6aec80, + 0x40ea184d, 0xc28f5c24, 0x4014a1ca, 0xc083126e, 0x3fd91687, 0x2af9a020, + 0x40ea184d, 0xc28f5c24, 0x4021e51e, 0xb851eb85, 0xbfef9999, 0x999e6290, + 0x40ea4efe, 0xd9168726, 0xc0240000, 0x00000000, 0xbfa26e97, 0x8da00000, + 0x40ea4efe, 0xd9168726, 0xc018d78d, 0x4fdf3b64, 0xc002ac08, 0x31281220, + 0x40ea4efe, 0xd9168726, 0xc0035e35, 0x3f7ced91, 0x3fe37ced, 0x9163fe84, + 0x40ea4efe, 0xd9168726, 0x3ff5e560, 0x4189374c, 0xbfe3c6a7, 0xefa2f920, + 0x40ea4efe, 0xd9168726, 0x4014a1ca, 0xc083126e, 0xbfe020c4, 0x9baa2420, + 0x40ea4efe, 0xd9168726, 0x4021e51e, 0xb851eb85, 0xbffe1893, 0x74bed4f0, + 0x40ea85af, 0xef9db228, 0xc0240000, 0x00000000, 0xc0040418, 0x93760000, + 0x40ea85af, 0xef9db228, 0xc018d78d, 0x4fdf3b64, 0x3fddc28f, 0x5c1f9980, + 0x40ea85af, 0xef9db228, 0xc0035e35, 0x3f7ced91, 0xbfadb22d, 0x0e9df900, + 0x40ea85af, 0xef9db228, 0x3ff5e560, 0x4189374c, 0x3fd753f7, 0xcece6ef0, + 0x40ea85af, 0xef9db228, 0x4014a1ca, 0xc083126e, 0xbff66666, 0x66688c28, + 0x40ea85af, 0xef9db228, 0x4021e51e, 0xb851eb85, 0xc006322d, 0x0e573c4c, + 0x40eabc61, 0x0624dd2a, 0xc0240000, 0x00000000, 0xc013df3b, 0x645ac000, + 0x40eabc61, 0x0624dd2a, 0xc018d78d, 0x4fdf3b64, 0xc007926e, 0x978e7e48, + 0x40eabc61, 0x0624dd2a, 0xc0035e35, 0x3f7ced91, 0xbfe73333, 0x3337bda4, + 0x40eabc61, 0x0624dd2a, 0x3ff5e560, 0x4189374c, 0xbf960418, 0x9420d100, + 0x40eabc61, 0x0624dd2a, 0x4014a1ca, 0xc083126e, 0xc0025e35, 0x3f7e0320, + 0x40eabc61, 0x0624dd2a, 0x4021e51e, 0xb851eb85, 0xc00d5810, 0x624f0e20, + 0x40eaf312, 0x1cac082c, 0xc0240000, 0x00000000, 0x4004872b, 0x020b0000, + 0x40eaf312, 0x1cac082c, 0xc018d78d, 0x4fdf3b64, 0xbfc2e147, 0xae278f80, + 0x40eaf312, 0x1cac082c, 0xc0035e35, 0x3f7ced91, 0x3ff076c8, 0xb4370d46, + 0x40eaf312, 0x1cac082c, 0x3ff5e560, 0x4189374c, 0xbfda147a, 0xe1528910, + 0x40eaf312, 0x1cac082c, 0x4014a1ca, 0xc083126e, 0x3fff74bc, 0x6a7cc960, + 0x40eaf312, 0x1cac082c, 0x4021e51e, 0xb851eb85, 0x40118b43, 0x95806710, + 0x40eb29c3, 0x3333332e, 0xc0240000, 0x00000000, 0x3fb99999, 0x99700000, + 0x40eb29c3, 0x3333332e, 0xc018d78d, 0x4fdf3b64, 0x40053645, 0xa1c98c58, + 0x40eb29c3, 0x3333332e, 0xc0035e35, 0x3f7ced91, 0x3fd72b02, 0x0c4078f0, + 0x40eb29c3, 0x3333332e, 0x3ff5e560, 0x4189374c, 0x3fe26666, 0x6660ec10, + 0x40eb29c3, 0x3333332e, 0x4014a1ca, 0xc083126e, 0x3ff11eb8, 0x51e94f48, + 0x40eb29c3, 0x3333332e, 0x4021e51e, 0xb851eb85, 0x400bf0a3, 0xd708fc4c, + 0x40eb6074, 0x49ba5e30, 0xc0240000, 0x00000000, 0xc002ed91, 0x68740000, + 0x40eb6074, 0x49ba5e30, 0xc018d78d, 0x4fdf3b64, 0xbfe851eb, 0x85239480, + 0x40eb6074, 0x49ba5e30, 0xc0035e35, 0x3f7ced91, 0xbfd3851e, 0xb85b4338, + 0x40eb6074, 0x49ba5e30, 0x3ff5e560, 0x4189374c, 0x3fc83126, 0xe962b840, + 0x40eb6074, 0x49ba5e30, 0x4014a1ca, 0xc083126e, 0x3fc645a1, 0xcaaea980, + 0x40eb6074, 0x49ba5e30, 0x4021e51e, 0xb851eb85, 0x4004cac0, 0x83112a78, + 0x40eb9725, 0x60418932, 0xc0240000, 0x00000000, 0xc01353f7, 0xced9c000, + 0x40eb9725, 0x60418932, 0xc018d78d, 0x4fdf3b64, 0x40004fdf, 0x3b632030, + 0x40eb9725, 0x60418932, 0xc0035e35, 0x3f7ced91, 0xbfef1a9f, 0xbe7b7fb0, + 0x40eb9725, 0x60418932, 0x3ff5e560, 0x4189374c, 0xbfc9374b, 0xc6be3fc0, + 0x40eb9725, 0x60418932, 0x4014a1ca, 0xc083126e, 0xbfe71a9f, 0xbe7b49d0, + 0x40eb9725, 0x60418932, 0x4021e51e, 0xb851eb85, 0x3ffb49ba, 0x5e32b148, + 0x40ebcdd6, 0x76c8b434, 0xc0240000, 0x00000000, 0x40059db2, 0x2d0d0000, + 0x40ebcdd6, 0x76c8b434, 0xc018d78d, 0x4fdf3b64, 0xbff5f5c2, 0x8f5ea290, + 0x40ebcdd6, 0x76c8b434, 0xc0035e35, 0x3f7ced91, 0x3fe90624, 0xdd2a5880, + 0x40ebcdd6, 0x76c8b434, 0x3ff5e560, 0x4189374c, 0xbfe2a7ef, 0x9db7cdf0, + 0x40ebcdd6, 0x76c8b434, 0x4014a1ca, 0xc083126e, 0xbff9e353, 0xf7d11f00, + 0x40ebcdd6, 0x76c8b434, 0x4021e51e, 0xb851eb85, 0x3fe9fbe7, 0x6c861b40, + 0x40ec0487, 0x8d4fdf36, 0xc0240000, 0x00000000, 0x3fce353f, 0x7cd80000, + 0x40ec0487, 0x8d4fdf36, 0xc018d78d, 0x4fdf3b64, 0x3ff6d2f1, 0xa9f96810, + 0x40ec0487, 0x8d4fdf36, 0xc0035e35, 0x3f7ced91, 0x3fbd70a3, 0xd6e3d360, + 0x40ec0487, 0x8d4fdf36, 0x3ff5e560, 0x4189374c, 0x3fd99168, 0x72a4c550, + 0x40ec0487, 0x8d4fdf36, 0x4014a1ca, 0xc083126e, 0xc0041cac, 0x08324c8c, + 0x40ec0487, 0x8d4fdf36, 0x4021e51e, 0xb851eb85, 0xbfb4dd2f, 0x1ac96080, + 0x40ec3b38, 0xa3d70a38, 0xc0240000, 0x00000000, 0xc001d70a, 0x3d720000, + 0x40ec3b38, 0xa3d70a38, 0xc018d78d, 0x4fdf3b64, 0xbfffc28f, 0x5c2b7ae0, + 0x40ec3b38, 0xa3d70a38, 0xc0035e35, 0x3f7ced91, 0xbfe1a9fb, 0xe77163a8, + 0x40ec3b38, 0xa3d70a38, 0x3ff5e560, 0x4189374c, 0x3f8ba5e3, 0x52892a00, + 0x40ec3b38, 0xa3d70a38, 0x4014a1ca, 0xc083126e, 0x3ffbf7ce, 0xd9143688, + 0x40ec3b38, 0xa3d70a38, 0x4021e51e, 0xb851eb85, 0xbfef3333, 0x33387360, + 0x40ec71e9, 0xba5e353a, 0xc0240000, 0x00000000, 0xc012c8b4, 0x3958c000, + 0x40ec71e9, 0xba5e353a, 0xc018d78d, 0x4fdf3b64, 0x3fea0c49, 0xba591f80, + 0x40ec71e9, 0xba5e353a, 0xc0035e35, 0x3f7ced91, 0x3ff33b64, 0x5a1a3a44, + 0x40ec71e9, 0xba5e353a, 0x3ff5e560, 0x4189374c, 0xbfd7d70a, 0x3d7c32b0, + 0x40ec71e9, 0xba5e353a, 0x4014a1ca, 0xc083126e, 0x3feb4395, 0x810178e0, + 0x40ec71e9, 0xba5e353a, 0x4021e51e, 0xb851eb85, 0xbffde560, 0x418bdd58, + 0x40eca89a, 0xd0e5603c, 0xc0240000, 0x00000000, 0x4006b439, 0x580f0000, + 0x40eca89a, 0xd0e5603c, 0xc018d78d, 0x4fdf3b64, 0xc004c7ae, 0x147c2998, + 0x40eca89a, 0xd0e5603c, 0xc0035e35, 0x3f7ced91, 0x3fe11eb8, 0x51e69674, + 0x40eca89a, 0xd0e5603c, 0x3ff5e560, 0x4189374c, 0x3fe3851e, 0xb84c1740, + 0x40eca89a, 0xd0e5603c, 0x4014a1ca, 0xc083126e, 0xbfa6872b, 0x0257b500, + 0x40eca89a, 0xd0e5603c, 0x4021e51e, 0xb851eb85, 0xc0061893, 0x74bdc080, + 0x40ecdf4b, 0xe76c8b3e, 0xc0240000, 0x00000000, 0x3fd7ced9, 0x167c0000, + 0x40ecdf4b, 0xe76c8b3e, 0xc018d78d, 0x4fdf3b64, 0x3fc9cac0, 0x82fdbb80, + 0x40ecdf4b, 0xe76c8b3e, 0xc0035e35, 0x3f7ced91, 0xbfc0e560, 0x419d1e80, + 0x40ecdf4b, 0xe76c8b3e, 0x3ff5e560, 0x4189374c, 0x3fccac08, 0x310f6500, + 0x40ecdf4b, 0xe76c8b3e, 0x4014a1ca, 0xc083126e, 0xbfee147a, 0xe14c6f80, + 0x40ecdf4b, 0xe76c8b3e, 0x4021e51e, 0xb851eb85, 0xc00d3e76, 0xc8b59254, + 0x40ed15fc, 0xfdf3b640, 0xc0240000, 0x00000000, 0xc000c083, 0x12700000, + 0x40ed15fc, 0xfdf3b640, 0xc018d78d, 0x4fdf3b64, 0x40080106, 0x24dbe108, + 0x40ed15fc, 0xfdf3b640, 0xc0035e35, 0x3f7ced91, 0xbfe99168, 0x72b525b4, + 0x40ed15fc, 0xfdf3b640, 0x3ff5e560, 0x4189374c, 0xbfc4bc6a, 0x7f119300, + 0x40ed15fc, 0xfdf3b640, 0x4014a1ca, 0xc083126e, 0xbffd6041, 0x8939b1d8, + 0x40ed15fc, 0xfdf3b640, 0x4021e51e, 0xb851eb85, 0x40119810, 0x624d24f6, + 0x40ed4cae, 0x147ae142, 0xc0240000, 0x00000000, 0xc0123d70, 0xa3d7c000, + 0x40ed4cae, 0x147ae142, 0xc018d78d, 0x4fdf3b64, 0xbfda4dd2, 0xf1b48380, + 0x40ed4cae, 0x147ae142, 0xc0035e35, 0x3f7ced91, 0x3fee8f5c, 0x28f0b27c, + 0x40ed4cae, 0x147ae142, 0x3ff5e560, 0x4189374c, 0xbfe18937, 0x4bcca2c0, + 0x40ed4cae, 0x147ae142, 0x4014a1ca, 0xc083126e, 0x40036872, 0xb01f8ee4, + 0x40ed4cae, 0x147ae142, 0x4021e51e, 0xb851eb85, 0x400c0a3d, 0x70a27818, + 0x40ed835f, 0x2b020c44, 0xc0240000, 0x00000000, 0x4007cac0, 0x83110000, + 0x40ed835f, 0x2b020c44, 0xc018d78d, 0x4fdf3b64, 0x40031a9f, 0xbe7574e0, + 0x40ed835f, 0x2b020c44, 0xc0035e35, 0x3f7ced91, 0x3fd26e97, 0x8d45a8d0, + 0x40ed835f, 0x2b020c44, 0x3ff5e560, 0x4189374c, 0x3fdbced9, 0x167b1bb0, + 0x40ed835f, 0x2b020c44, 0x4014a1ca, 0xc083126e, 0x3ff87ae1, 0x47aba3b0, + 0x40ed835f, 0x2b020c44, 0x4021e51e, 0xb851eb85, 0x4004e45a, 0x1caaa644, + 0x40edba10, 0x41893746, 0xc0240000, 0x00000000, 0x3fe04189, 0x37460000, + 0x40edba10, 0x41893746, 0xc018d78d, 0x4fdf3b64, 0xbff06041, 0x8939f930, + 0x40edba10, 0x41893746, 0xc0035e35, 0x3f7ced91, 0xbfd84189, 0x37561358, + 0x40edba10, 0x41893746, 0x3ff5e560, 0x4189374c, 0x3fa8d4fd, 0xf354fd80, + 0x40edba10, 0x41893746, 0x4014a1ca, 0xc083126e, 0x3fe449ba, 0x5e305330, + 0x40edba10, 0x41893746, 0x4021e51e, 0xb851eb85, 0x3ffb7ced, 0x9165a8e0, + 0x40edf0c1, 0x58106248, 0xc0240000, 0x00000000, 0xbfff53f7, 0xcedc0000, + 0x40edf0c1, 0x58106248, 0xc018d78d, 0x4fdf3b64, 0x3ffc6872, 0xb01e1170, + 0x40edf0c1, 0x58106248, 0xc0035e35, 0x3f7ced91, 0xbff0bc6a, 0x7efc73e0, + 0x40edf0c1, 0x58106248, 0x3ff5e560, 0x4189374c, 0xbfd59999, 0x99a5dc50, + 0x40edf0c1, 0x58106248, 0x4014a1ca, 0xc083126e, 0xbfd0c49b, 0xa5ed4200, + 0x40edf0c1, 0x58106248, 0x4021e51e, 0xb851eb85, 0x3fea624d, 0xd2ec0a70, + 0x40ee2772, 0x6e978d4a, 0xc0240000, 0x00000000, 0xc011b22d, 0x0e56c000, + 0x40ee2772, 0x6e978d4a, 0xc018d78d, 0x4fdf3b64, 0xbffa2d0e, 0x5606d180, + 0x40ee2772, 0x6e978d4a, 0xc0035e35, 0x3f7ced91, 0x3fe6a7ef, 0x9dacf070, + 0x40ee2772, 0x6e978d4a, 0x3ff5e560, 0x4189374c, 0x3fe4a3d7, 0x0a374270, + 0x40ee2772, 0x6e978d4a, 0x4014a1ca, 0xc083126e, 0xbff2872b, 0x020eca98, + 0x40ee2772, 0x6e978d4a, 0x4021e51e, 0xb851eb85, 0xbfb1a9fb, 0xe799e700, + 0x40ee5e23, 0x851eb84c, 0xc0240000, 0x00000000, 0x4008e147, 0xae130000, + 0x40ee5e23, 0x851eb84c, 0xc018d78d, 0x4fdf3b64, 0x3ff29ba5, 0xe3513920, + 0x40ee5e23, 0x851eb84c, 0xc0035e35, 0x3f7ced91, 0x3fa4fdf3, 0xb5f125c0, + 0x40ee5e23, 0x851eb84c, 0x3ff5e560, 0x4189374c, 0x3fd09374, 0xbc5e08e0, + 0x40ee5e23, 0x851eb84c, 0x4014a1ca, 0xc083126e, 0xc0006e97, 0x8d512258, + 0x40ee5e23, 0x851eb84c, 0x4021e51e, 0xb851eb85, 0xbfeecccc, 0xccd28430, + 0x40ee94d4, 0x9ba5e34e, 0xc0240000, 0x00000000, 0x3fe49ba5, 0xe34e0000, + 0x40ee94d4, 0x9ba5e34e, 0xc018d78d, 0x4fdf3b64, 0xc001fced, 0x9169d4e8, + 0x40ee94d4, 0x9ba5e34e, 0xc0035e35, 0x3f7ced91, 0xbfe40831, 0x26eecbb8, + 0x40ee94d4, 0x9ba5e34e, 0x3ff5e560, 0x4189374c, 0xbfc04189, 0x3764e640, + 0x40ee94d4, 0x9ba5e34e, 0x4014a1ca, 0xc083126e, 0x4001a9fb, 0xe76b4578, + 0x40ee94d4, 0x9ba5e34e, 0x4021e51e, 0xb851eb85, 0xbffdb22d, 0x0e58e5c0, + 0x40eecb85, 0xb22d0e50, 0xc0240000, 0x00000000, 0xbffd26e9, 0x78d80000, + 0x40eecb85, 0xb22d0e50, 0xc018d78d, 0x4fdf3b64, 0x3fe19db2, 0x2d08c1a0, + 0x40eecb85, 0xb22d0e50, 0xc0035e35, 0x3f7ced91, 0x3ff20c49, 0xba5b863c, + 0x40eecb85, 0xb22d0e50, 0x3ff5e560, 0x4189374c, 0xbfe06a7e, 0xf9e17790, + 0x40eecb85, 0xb22d0e50, 0x4014a1ca, 0xc083126e, 0x3ff4fdf3, 0xb64310d8, + 0x40eecb85, 0xb22d0e50, 0x4021e51e, 0xb851eb85, 0xc005fef9, 0xdb2444b4, + 0x40ef0236, 0xc8b43952, 0xc0240000, 0x00000000, 0xc01126e9, 0x78d5c000, + 0x40ef0236, 0xc8b43952, 0xc018d78d, 0x4fdf3b64, 0xc006e353, 0xf7d04110, + 0x40ef0236, 0xc8b43952, 0xc0035e35, 0x3f7ced91, 0x3fdd8106, 0x24d25cc8, + 0x40ef0236, 0xc8b43952, 0x3ff5e560, 0x4189374c, 0x3fde0c49, 0xba517210, + 0x40ef0236, 0xc8b43952, 0x4014a1ca, 0xc083126e, 0x3fda9fbe, 0x76be5b00, + 0x40ef0236, 0xc8b43952, 0x4021e51e, 0xb851eb85, 0xc00d24dd, 0x2f1c1688, + 0x40ef38e7, 0xdf3b6454, 0xc0240000, 0x00000000, 0x4009f7ce, 0xd9150000, + 0x40ef38e7, 0xdf3b6454, 0xc018d78d, 0x4fdf3b64, 0xbfafbe76, 0xc90ef000, + 0x40ef38e7, 0xdf3b6454, 0xc0035e35, 0x3f7ced91, 0xbfca5e35, 0x3f92bec0, + 0x40ef38e7, 0xdf3b6454, 0x3ff5e560, 0x4189374c, 0x3fb56041, 0x8903d840, + 0x40ef38e7, 0xdf3b6454, 0x4014a1ca, 0xc083126e, 0xbfdeb851, 0xeb8f8d60, + 0x40ef38e7, 0xdf3b6454, 0x4021e51e, 0xb851eb85, 0x4011a4dd, 0x2f19e2dc, + 0x40ef6f98, 0xf5c28f56, 0xc0240000, 0x00000000, 0x3fe8f5c2, 0x8f560000, + 0x40ef6f98, 0xf5c28f56, 0xc018d78d, 0x4fdf3b64, 0x4005e560, 0x4187c990, + 0x40ef6f98, 0xf5c28f56, 0xc0035e35, 0x3f7ced91, 0xbfebef9d, 0xb2328dc4, + 0x40ef6f98, 0xf5c28f56, 0x3ff5e560, 0x4189374c, 0xbfd35c28, 0xf5cf85f0, + 0x40ef6f98, 0xf5c28f56, 0x4014a1ca, 0xc083126e, 0xbff60418, 0x93775d70, + 0x40ef6f98, 0xf5c28f56, 0x4021e51e, 0xb851eb85, 0x400c23d7, 0x0a3bf3e4, + 0x40efa64a, 0x0c49ba58, 0xc0240000, 0x00000000, 0xbffaf9db, 0x22d40000, + 0x40efa64a, 0x0c49ba58, 0xc018d78d, 0x4fdf3b64, 0xbfe59581, 0x062a9fa0, + 0x40efa64a, 0x0c49ba58, 0xc0035e35, 0x3f7ced91, 0x3fec3126, 0xe9734a6c, + 0x40efa64a, 0x0c49ba58, 0x3ff5e560, 0x4189374c, 0x3fe5c28f, 0x5c226da0, + 0x40efa64a, 0x0c49ba58, 0x4014a1ca, 0xc083126e, 0xc0022d0e, 0x56056bc4, + 0x40efa64a, 0x0c49ba58, 0x4021e51e, 0xb851eb85, 0x4004fdf3, 0xb6442210, + 0x40efdcfb, 0x22d0e55a, 0xc0240000, 0x00000000, 0xc0109ba5, 0xe354c000, + 0x40efdcfb, 0x22d0e55a, 0xc018d78d, 0x4fdf3b64, 0x4000fef9, 0xdb215d68, + 0x40efdcfb, 0x22d0e55a, 0xc0035e35, 0x3f7ced91, 0x3fcb645a, 0x1c95b160, + 0x40efdcfb, 0x22d0e55a, 0x3ff5e560, 0x4189374c, 0x3fd2d0e5, 0x60345f40, + 0x40efdcfb, 0x22d0e55a, 0x4014a1ca, 0xc083126e, 0x3fffd70a, 0x3d6df818, + 0x40efdcfb, 0x22d0e55a, 0x4021e51e, 0xb851eb85, 0x3ffbb020, 0xc498a078, + 0x40f009d6, 0x1cac082e, 0xc0240000, 0x00000000, 0x400b0e56, 0x04170000, + 0x40f009d6, 0x1cac082e, 0xc018d78d, 0x4fdf3b64, 0xbff4978d, 0x4fe22820, + 0x40f009d6, 0x1cac082e, 0xc0035e35, 0x3f7ced91, 0xbfdcfdf3, 0xb650e378, + 0x40f009d6, 0x1cac082e, 0x3ff5e560, 0x4189374c, 0xbfb78d4f, 0xdf707300, + 0x40f009d6, 0x1cac082e, 0x4014a1ca, 0xc083126e, 0x3ff18106, 0x24da7e00, + 0x40f009d6, 0x1cac082e, 0x4021e51e, 0xb851eb85, 0x3feac8b4, 0x3951f9a0, + 0x40f0252e, 0xa7ef9daf, 0xc0240000, 0x00000000, 0x3fed4fdf, 0x3b5e0000, + 0x40f0252e, 0xa7ef9daf, 0xc018d78d, 0x4fdf3b64, 0x3ff83126, 0xe975e280, + 0x40f0252e, 0xa7ef9daf, 0xc0035e35, 0x3f7ced91, 0xbff1eb85, 0x1ebb27e8, + 0x40f0252e, 0xa7ef9daf, 0x3ff5e560, 0x4189374c, 0xbfde978d, 0x4fec98c0, + 0x40f0252e, 0xa7ef9daf, 0x4014a1ca, 0xc083126e, 0x3fc95810, 0x62381f40, + 0x40f0252e, 0xa7ef9daf, 0x4021e51e, 0xb851eb85, 0xbfaced91, 0x68d4db00, + 0x40f04087, 0x33333330, 0xc0240000, 0x00000000, 0xbff8cccc, 0xccd00000, + 0x40f04087, 0x33333330, 0xc018d78d, 0x4fdf3b64, 0xbffe645a, 0x1caf0070, + 0x40f04087, 0x33333330, 0xc0035e35, 0x3f7ced91, 0x3fe449ba, 0x5e2f8860, + 0x40f04087, 0x33333330, 0x3ff5e560, 0x4189374c, 0x3fe024dd, 0x2f13e438, + 0x40f04087, 0x33333330, 0x4014a1ca, 0xc083126e, 0xbfe65604, 0x1898ec60, + 0x40f04087, 0x33333330, 0x4021e51e, 0xb851eb85, 0xbfee6666, 0x666c9500, + 0x40f05bdf, 0xbe76c8b1, 0xc0240000, 0x00000000, 0xc0101062, 0x4dd3c000, + 0x40f05bdf, 0xbe76c8b1, 0xc018d78d, 0x4fdf3b64, 0x3fecc8b4, 0x39521460, + 0x40f05bdf, 0xbe76c8b1, 0xc0035e35, 0x3f7ced91, 0xbfa0e560, 0x41e55b40, + 0x40f05bdf, 0xbe76c8b1, 0x3ff5e560, 0x4189374c, 0x3fbe5604, 0x185d31c0, + 0x40f05bdf, 0xbe76c8b1, 0x4014a1ca, 0xc083126e, 0xbff98106, 0x24dff048, + 0x40f05bdf, 0xbe76c8b1, 0x4021e51e, 0xb851eb85, 0xbffd7ef9, 0xdb25ee28, + 0x40f07738, 0x49ba5e32, 0xc0240000, 0x00000000, 0x400c24dd, 0x2f190000, + 0x40f07738, 0x49ba5e32, 0xc018d78d, 0x4fdf3b64, 0xc0041893, 0x74bdec60, + 0x40f07738, 0x49ba5e32, 0xc0035e35, 0x3f7ced91, 0xbfe66666, 0x666c33c8, + 0x40f07738, 0x49ba5e32, 0x3ff5e560, 0x4189374c, 0xbfd11eb8, 0x51f92f90, + 0x40f07738, 0x49ba5e32, 0x4014a1ca, 0xc083126e, 0xc003eb85, 0x1eb9b530, + 0x40f07738, 0x49ba5e32, 0x4021e51e, 0xb851eb85, 0xc005e560, 0x418ac8e8, + 0x40f09290, 0xd4fdf3b3, 0xc0240000, 0x00000000, 0x3ff0d4fd, 0xf3b30000, + 0x40f09290, 0xd4fdf3b3, 0xc018d78d, 0x4fdf3b64, 0x3fd25e35, 0x3f70c780, + 0x40f09290, 0xd4fdf3b3, 0xc0035e35, 0x3f7ced91, 0x3ff0dd2f, 0x1a9cd234, + 0x40f09290, 0xd4fdf3b3, 0x3ff5e560, 0x4189374c, 0xbfe4e978, 0xd504d5c8, + 0x40f09290, 0xd4fdf3b3, 0x4014a1ca, 0xc083126e, 0x3ffc5a1c, 0xac056540, + 0x40f09290, 0xd4fdf3b3, 0x4021e51e, 0xb851eb85, 0xc00d0b43, 0x95829abc, + 0x40f0ade9, 0x60418934, 0xc0240000, 0x00000000, 0xbff69fbe, 0x76cc0000, + 0x40f0ade9, 0x60418934, 0xc018d78d, 0x4fdf3b64, 0x4008b020, 0xc49a1e40, + 0x40f0ade9, 0x60418934, 0xc0035e35, 0x3f7ced91, 0x3fd8c49b, 0xa5d78ca8, + 0x40f0ade9, 0x60418934, 0x3ff5e560, 0x4189374c, 0x3fd50e56, 0x040ab5a0, + 0x40f0ade9, 0x60418934, 0x4014a1ca, 0xc083126e, 0x3fec0831, 0x26e3d650, + 0x40f0ade9, 0x60418934, 0x4021e51e, 0xb851eb85, 0x4011b1a9, 0xfbe6a0c2, + 0x40f0c941, 0xeb851eb5, 0xc0240000, 0x00000000, 0xc00f0a3d, 0x70a58000, + 0x40f0c941, 0xeb851eb5, 0xc018d78d, 0x4fdf3b64, 0xbfd4d4fd, 0xf3c299c0, + 0x40f0c941, 0xeb851eb5, 0xc0035e35, 0x3f7ced91, 0xbfd1eb85, 0x1ec42f80, + 0x40f0c941, 0xeb851eb5, 0x3ff5e560, 0x4189374c, 0xbfad2f1a, 0xa02e3300, + 0x40f0c941, 0xeb851eb5, 0x4014a1ca, 0xc083126e, 0xbf947ae1, 0x4863bc00, + 0x40f0c941, 0xeb851eb5, 0x4021e51e, 0xb851eb85, 0x400c3d70, 0xa3d56fb0, + 0x40f0e49a, 0x76c8b436, 0xc0240000, 0x00000000, 0x400d3b64, 0x5a1b0000, + 0x40f0e49a, 0x76c8b436, 0xc018d78d, 0x4fdf3b64, 0x4003c9ba, 0x5e33b218, + 0x40f0e49a, 0x76c8b436, 0xc0035e35, 0x3f7ced91, 0xbfee4dd2, 0xf1aff5d4, + 0x40f0e49a, 0x76c8b436, 0x3ff5e560, 0x4189374c, 0xbfdc5a1c, 0xac164260, + 0x40f0e49a, 0x76c8b436, 0x4014a1ca, 0xc083126e, 0xbfed4fdf, 0x3b6a1210, + 0x40f0e49a, 0x76c8b436, 0x4021e51e, 0xb851eb85, 0x4005178d, 0x4fdd9ddc, + 0x40f0fff3, 0x020c49b7, 0xc0240000, 0x00000000, 0x3ff3020c, 0x49b70000, + 0x40f0fff3, 0x020c49b7, 0xc018d78d, 0x4fdf3b64, 0xbfee0418, 0x937afd80, + 0x40f0fff3, 0x020c49b7, 0xc0035e35, 0x3f7ced91, 0x3fe9d2f1, 0xa9f5e25c, + 0x40f0fff3, 0x020c49b7, 0x3ff5e560, 0x4189374c, 0x3fe14395, 0x80ff0f68, + 0x40f0fff3, 0x020c49b7, 0x4014a1ca, 0xc083126e, 0xbffcfdf3, 0xb6488320, + 0x40f0fff3, 0x020c49b7, 0x4021e51e, 0xb851eb85, 0x3ffbe353, 0xf7cb9810, + 0x40f11b4b, 0x8d4fdf38, 0xc0240000, 0x00000000, 0xbff472b0, 0x20c80000, + 0x40f11b4b, 0x8d4fdf38, 0xc018d78d, 0x4fdf3b64, 0x3ffdc6a7, 0xef9a8be0, + 0x40f11b4b, 0x8d4fdf38, 0xc0035e35, 0x3f7ced91, 0x3fc1eb85, 0x1ea01120, + 0x40f11b4b, 0x8d4fdf38, 0x3ff5e560, 0x4189374c, 0x3fc3a5e3, 0x53db45a0, + 0x40f11b4b, 0x8d4fdf38, 0x4014a1ca, 0xc083126e, 0x40039999, 0x99982640, + 0x40f11b4b, 0x8d4fdf38, 0x4021e51e, 0xb851eb85, 0x3feb2f1a, 0x9fb7e8d0, + 0x40f136a4, 0x189374b9, 0xc0240000, 0x00000000, 0xc00df3b6, 0x45a38000, + 0x40f136a4, 0x189374b9, 0xc018d78d, 0x4fdf3b64, 0xbff8ced9, 0x168a5710, + 0x40f136a4, 0x189374b9, 0xc0035e35, 0x3f7ced91, 0xbfe0dd2f, 0x1aa5d9cc, + 0x40f136a4, 0x189374b9, 0x3ff5e560, 0x4189374c, 0xbfcdc28f, 0x5c45b260, + 0x40f136a4, 0x189374b9, 0x4014a1ca, 0xc083126e, 0x3ff8dd2f, 0x1a9cd268, + 0x40f136a4, 0x189374b9, 0x4021e51e, 0xb851eb85, 0xbfa6872b, 0x0275e800, + 0x40f151fc, 0xa3d70a3a, 0xc0240000, 0x00000000, 0x400e51eb, 0x851d0000, + 0x40f151fc, 0xa3d70a3a, 0xc018d78d, 0x4fdf3b64, 0x3ff3f9db, 0x22cdb390, + 0x40f151fc, 0xa3d70a3a, 0xc0035e35, 0x3f7ced91, 0xbff31a9f, 0xbe79dbf0, + 0x40f151fc, 0xa3d70a3a, 0x3ff5e560, 0x4189374c, 0xbfe3cac0, 0x8319aa98, + 0x40f151fc, 0xa3d70a3a, 0x4014a1ca, 0xc083126e, 0x3fe50e56, 0x0412b0a0, + 0x40f151fc, 0xa3d70a3a, 0x4021e51e, 0xb851eb85, 0xbfee0000, 0x0006a5d0, + 0x40f16d55, 0x2f1a9fbb, 0xc0240000, 0x00000000, 0x3ff52f1a, 0x9fbb0000, + 0x40f16d55, 0x2f1a9fbb, 0xc018d78d, 0x4fdf3b64, 0xc0014dd2, 0xf1ab97b0, + 0x40f16d55, 0x2f1a9fbb, 0xc0035e35, 0x3f7ced91, 0x3fe1eb85, 0x1eb22050, + 0x40f16d55, 0x2f1a9fbb, 0x3ff5e560, 0x4189374c, 0x3fd74bc6, 0xa7e10c00, + 0x40f16d55, 0x2f1a9fbb, 0x4014a1ca, 0xc083126e, 0xbfce76c8, 0xb4510e40, + 0x40f16d55, 0x2f1a9fbb, 0x4021e51e, 0xb851eb85, 0xbffd4bc6, 0xa7f2f690, + 0x40f188ad, 0xba5e353c, 0xc0240000, 0x00000000, 0xbff245a1, 0xcac40000, + 0x40f188ad, 0xba5e353c, 0xc018d78d, 0x4fdf3b64, 0x3fe45a1c, 0xac01b680, + 0x40f188ad, 0xba5e353c, 0xc0035e35, 0x3f7ced91, 0xbfbb645a, 0x1cddee20, + 0x40f188ad, 0xba5e353c, 0x3ff5e560, 0x4189374c, 0xbf96872b, 0x02f70000, + 0x40f188ad, 0xba5e353c, 0x4014a1ca, 0xc083126e, 0xbff224dd, 0x2f1d9be0, + 0x40f188ad, 0xba5e353c, 0x4021e51e, 0xb851eb85, 0xc005cbc6, 0xa7f14d1c, + 0x40f1a406, 0x45a1cabd, 0xc0240000, 0x00000000, 0xc00cdd2f, 0x1aa18000, + 0x40f1a406, 0x45a1cabd, 0xc018d78d, 0x4fdf3b64, 0xc0063439, 0x581203d8, + 0x40f1a406, 0x45a1cabd, 0xc0035e35, 0x3f7ced91, 0xbfe8c49b, 0xa5e99bd8, + 0x40f1a406, 0x45a1cabd, 0x3ff5e560, 0x4189374c, 0xbfda1cac, 0x083fec00, + 0x40f1a406, 0x45a1cabd, 0x4014a1ca, 0xc083126e, 0xc0003d70, 0xa3d88afc, + 0x40f1a406, 0x45a1cabd, 0x4021e51e, 0xb851eb85, 0xc00cf1a9, 0xfbe91ef0, + 0x40f1bf5e, 0xd0e5603e, 0xc0240000, 0x00000000, 0x400f6872, 0xb01f0000, + 0x40f1bf5e, 0xd0e5603e, 0xc018d78d, 0x4fdf3b64, 0x3f981062, 0x4d00bc00, + 0x40f1bf5e, 0xd0e5603e, 0xc0035e35, 0x3f7ced91, 0x3fef5c28, 0xf5bc3c58, + 0x40f1bf5e, 0xd0e5603e, 0x3ff5e560, 0x4189374c, 0x3fe2624d, 0xd2ea3a98, + 0x40f1bf5e, 0xd0e5603e, 0x4014a1ca, 0xc083126e, 0x4001db22, 0xd0e3dcd4, + 0x40f1bf5e, 0xd0e5603e, 0x4021e51e, 0xb851eb85, 0x4011be76, 0xc8b35ea8, + 0x40f1dab7, 0x5c28f5bf, 0xc0240000, 0x00000000, 0x3ff75c28, 0xf5bf0000, + 0x40f1dab7, 0x5c28f5bf, 0xc018d78d, 0x4fdf3b64, 0x4006947a, 0xe14606c8, + 0x40f1dab7, 0x5c28f5bf, 0xc0035e35, 0x3f7ced91, 0x3fd40831, 0x26dcbc88, + 0x40f1dab7, 0x5c28f5bf, 0x3ff5e560, 0x4189374c, 0x3fc820c4, 0x9b87f260, + 0x40f1dab7, 0x5c28f5bf, 0x4014a1ca, 0xc083126e, 0x3ff56041, 0x89343f90, + 0x40f1dab7, 0x5c28f5bf, 0x4021e51e, 0xb851eb85, 0x400c570a, 0x3d6eeb7c, + 0x40f1f60f, 0xe76c8b40, 0xc0240000, 0x00000000, 0xbff01893, 0x74c00000, + 0x40f1f60f, 0xe76c8b40, 0xc018d78d, 0x4fdf3b64, 0xbfe2d916, 0x8731aac0, + 0x40f1f60f, 0xe76c8b40, 0xc0035e35, 0x3f7ced91, 0xbfd6a7ef, 0x9dbeffa0, + 0x40f1f60f, 0xe76c8b40, 0x3ff5e560, 0x4189374c, 0xbfc947ae, 0x149905a0, + 0x40f1f60f, 0xe76c8b40, 0x4014a1ca, 0xc083126e, 0x3fdc28f5, 0xc28315e0, + 0x40f1f60f, 0xe76c8b40, 0x4021e51e, 0xb851eb85, 0x40053126, 0xe97719a8, + 0x40f21168, 0x72b020c1, 0xc0240000, 0x00000000, 0xc00bc6a7, 0xef9f8000, + 0x40f21168, 0x72b020c1, 0xc018d78d, 0x4fdf3b64, 0x4001ae14, 0x7adf9aa0, + 0x40f21168, 0x72b020c1, 0xc0035e35, 0x3f7ced91, 0xbff05604, 0x1896aef2, + 0x40f21168, 0x72b020c1, 0x3ff5e560, 0x4189374c, 0xbfe2ac08, 0x312e7f68, + 0x40f21168, 0x72b020c1, 0x4014a1ca, 0xc083126e, 0xbfdd2f1a, 0x9fcad280, + 0x40f21168, 0x72b020c1, 0x4021e51e, 0xb851eb85, 0x3ffc1687, 0x2afe8fa8, + 0x40f22cc0, 0xfdf3b642, 0xc0240000, 0x00000000, 0x40103f7c, 0xed908000, + 0x40f22cc0, 0xfdf3b642, 0xc018d78d, 0x4fdf3b64, 0xbff33958, 0x1065adb0, + 0x40f22cc0, 0xfdf3b642, 0xc0035e35, 0x3f7ced91, 0x3fe774bc, 0x6a787a4c, + 0x40f22cc0, 0xfdf3b642, 0x3ff5e560, 0x4189374c, 0x3fd98937, 0x4bb76260, + 0x40f22cc0, 0xfdf3b642, 0x4014a1ca, 0xc083126e, 0xbff5a1ca, 0xc0862eb8, + 0x40f22cc0, 0xfdf3b642, 0x4021e51e, 0xb851eb85, 0x3feb9581, 0x061dd800, + 0x40f24819, 0x89374bc3, 0xc0240000, 0x00000000, 0x3ff98937, 0x4bc30000, + 0x40f24819, 0x89374bc3, 0xc018d78d, 0x4fdf3b64, 0x3ff98f5c, 0x28f25cf0, + 0x40f24819, 0x89374bc3, 0xc0035e35, 0x3f7ced91, 0x3fb0e560, 0x4154e1c0, + 0x40f24819, 0x89374bc3, 0x3ff5e560, 0x4189374c, 0x3f8a9fbe, 0x74dccc00, + 0x40f24819, 0x89374bc3, 0x4014a1ca, 0xc083126e, 0xc001fbe7, 0x6c8cd468, + 0x40f24819, 0x89374bc3, 0x4021e51e, 0xb851eb85, 0xbfa020c4, 0x9c16f500, + 0x40f26372, 0x147ae144, 0xc0240000, 0x00000000, 0xbfebd70a, 0x3d780000, + 0x40f26372, 0x147ae144, 0xc018d78d, 0x4fdf3b64, 0xbffd0624, 0xdd328600, + 0x40f26372, 0x147ae144, 0xc0035e35, 0x3f7ced91, 0xbfe33b64, 0x5a2341dc, + 0x40f26372, 0x147ae144, 0x3ff5e560, 0x4189374c, 0xbfd7df3b, 0x646995a0, + 0x40f26372, 0x147ae144, 0x4014a1ca, 0xc083126e, 0x40001cac, 0x082f9368, + 0x40f26372, 0x147ae144, 0x4021e51e, 0xb851eb85, 0xbfed9999, 0x99a0b6a0, + 0x40f27eca, 0x9fbe76c5, 0xc0240000, 0x00000000, 0xc00ab020, 0xc49d8000, + 0x40f27eca, 0x9fbe76c5, 0xc018d78d, 0x4fdf3b64, 0x3fef851e, 0xb84b0940, + 0x40f27eca, 0x9fbe76c5, 0xc0035e35, 0x3f7ced91, 0x3ff272b0, 0x20c14b2a, + 0x40f27eca, 0x9fbe76c5, 0x3ff5e560, 0x4189374c, 0x3fe38106, 0x24d565c8, + 0x40f27eca, 0x9fbe76c5, 0x4014a1ca, 0xc083126e, 0x3ff1e353, 0xf7cbacb8, + 0x40f27eca, 0x9fbe76c5, 0x4021e51e, 0xb851eb85, 0xbffd1893, 0x74bffef8, + 0x40f29a23, 0x2b020c46, 0xc0240000, 0x00000000, 0x4010cac0, 0x83118000, + 0x40f29a23, 0x2b020c46, 0xc018d78d, 0x4fdf3b64, 0xc0036978, 0xd4ffaf28, + 0x40f29a23, 0x2b020c46, 0xc0035e35, 0x3f7ced91, 0x3fdf1a9f, 0xbe697080, + 0x40f29a23, 0x2b020c46, 0x3ff5e560, 0x4189374c, 0x3fcc9ba5, 0xe3349f20, + 0x40f29a23, 0x2b020c46, 0x4014a1ca, 0xc083126e, 0x3fcc6a7e, 0xf9c19500, + 0x40f29a23, 0x2b020c46, 0x4021e51e, 0xb851eb85, 0xc005b22d, 0x0e57d150, + 0x40f2b57b, 0xb645a1c7, 0xc0240000, 0x00000000, 0x3ffbb645, 0xa1c70000, + 0x40f2b57b, 0xb645a1c7, 0xc018d78d, 0x4fdf3b64, 0x3fd7d70a, 0x3d62b140, + 0x40f2b57b, 0xb645a1c7, 0xc0035e35, 0x3f7ced91, 0xbfc72b02, 0x0c649750, + 0x40f2b57b, 0xb645a1c7, 0x3ff5e560, 0x4189374c, 0xbfc4cccc, 0xccec58e0, + 0x40f2b57b, 0xb645a1c7, 0x4014a1ca, 0xc083126e, 0xbfe59168, 0x72b68ef0, + 0x40f2b57b, 0xb645a1c7, 0x4021e51e, 0xb851eb85, 0xc00cd810, 0x624fa324, + 0x40f2d0d4, 0x41893748, 0xc0240000, 0x00000000, 0xbfe77ced, 0x91700000, + 0x40f2d0d4, 0x41893748, 0xc018d78d, 0x4fdf3b64, 0xc0084fdf, 0x3b661b50, + 0x40f2d0d4, 0x41893748, 0xc0035e35, 0x3f7ced91, 0xbfeb22d0, 0xe56703e8, + 0x40f2d0d4, 0x41893748, 0x3ff5e560, 0x4189374c, 0xbfe18d4f, 0xdf435438, + 0x40f2d0d4, 0x41893748, 0x4014a1ca, 0xc083126e, 0xbff91eb8, 0x51eec190, + 0x40f2d0d4, 0x41893748, 0x4021e51e, 0xb851eb85, 0x4011cb43, 0x95801c8e, + 0x40f2ec2c, 0xccccccc9, 0xc0240000, 0x00000000, 0xc0099999, 0x999b8000, + 0x40f2ec2c, 0xccccccc9, 0xc018d78d, 0x4fdf3b64, 0xbfceb851, 0xeba16000, + 0x40f2ec2c, 0xccccccc9, 0xc0035e35, 0x3f7ced91, 0x3fecfdf3, 0xb63ed448, + 0x40f2ec2c, 0xccccccc9, 0x3ff5e560, 0x4189374c, 0x3fdbc6a7, 0xef8db8c0, + 0x40f2ec2c, 0xccccccc9, 0x4014a1ca, 0xc083126e, 0xc003ba5e, 0x35411dd4, + 0x40f2ec2c, 0xccccccc9, 0x4021e51e, 0xb851eb85, 0x400c70a3, 0xd7086748, + 0x40f30785, 0x5810624a, 0xc0240000, 0x00000000, 0x40115604, 0x18928000, + 0x40f30785, 0x5810624a, 0xc018d78d, 0x4fdf3b64, 0x400478d4, 0xfdf1ef50, + 0x40f30785, 0x5810624a, 0xc0035e35, 0x3f7ced91, 0x3fce978d, 0x4fc3d8d0, + 0x40f30785, 0x5810624a, 0x3ff5e560, 0x4189374c, 0x3fa89374, 0xbbe9e600, + 0x40f30785, 0x5810624a, 0x4014a1ca, 0xc083126e, 0x3ffcbc6a, 0x7ef693f8, + 0x40f30785, 0x5810624a, 0x4021e51e, 0xb851eb85, 0x40054ac0, 0x83109574, + 0x40f322dd, 0xe353f7cb, 0xc0240000, 0x00000000, 0x3ffde353, 0xf7cb0000, + 0x40f322dd, 0xe353f7cb, 0xc018d78d, 0x4fdf3b64, 0xbfeb47ae, 0x148208a0, + 0x40f322dd, 0xe353f7cb, 0xc0035e35, 0x3f7ced91, 0xbfdb645a, 0x1cb9cfc0, + 0x40f322dd, 0xe353f7cb, 0x3ff5e560, 0x4189374c, 0xbfd5a1ca, 0xc0933f40, + 0x40f322dd, 0xe353f7cb, 0x4014a1ca, 0xc083126e, 0x3feccccc, 0xccc633c0, + 0x40f322dd, 0xe353f7cb, 0x4021e51e, 0xb851eb85, 0x3ffc49ba, 0x5e318740, + 0x40f33e36, 0x6e978d4c, 0xc0240000, 0x00000000, 0xbfe322d0, 0xe5680000, + 0x40f33e36, 0x6e978d4c, 0xc018d78d, 0x4fdf3b64, 0x3fff24dd, 0x2f170650, + 0x40f33e36, 0x6e978d4c, 0xc0035e35, 0x3f7ced91, 0xbff1851e, 0xb85562fa, + 0x40f33e36, 0x6e978d4c, 0x3ff5e560, 0x4189374c, 0x3fe49fbe, 0x76c090f8, + 0x40f33e36, 0x6e978d4c, 0x4014a1ca, 0xc083126e, 0x3f70624d, 0xcf9fc800, + 0x40f33e36, 0x6e978d4c, 0x4021e51e, 0xb851eb85, 0x3febfbe7, 0x6c83c730, + 0x40f3598e, 0xf9db22cd, 0xc0240000, 0x00000000, 0xc0088312, 0x6e998000, + 0x40f3598e, 0xf9db22cd, 0xc018d78d, 0x4fdf3b64, 0xbff770a3, 0xd70ddca0, + 0x40f3598e, 0xf9db22cd, 0xc0035e35, 0x3f7ced91, 0x3fe51687, 0x2afb123c, + 0x40f3598e, 0xf9db22cd, 0x3ff5e560, 0x4189374c, 0x3fd08b43, 0x9570a5f0, + 0x40f3598e, 0xf9db22cd, 0x4014a1ca, 0xc083126e, 0xbfec8b43, 0x9587b4a0, + 0x40f3598e, 0xf9db22cd, 0x4021e51e, 0xb851eb85, 0xbf9374bc, 0x6b700400, + 0x40f374e7, 0x851eb84e, 0xc0240000, 0x00000000, 0x4011e147, 0xae138000, + 0x40f374e7, 0x851eb84e, 0xc018d78d, 0x4fdf3b64, 0x3ff55810, 0x624a2e00, + 0x40f374e7, 0x851eb84e, 0xc0035e35, 0x3f7ced91, 0xbf80624d, 0xd4b2f600, + 0x40f374e7, 0x851eb84e, 0x3ff5e560, 0x4189374c, 0xbfc051eb, 0x853fac20, + 0x40f374e7, 0x851eb84e, 0x4014a1ca, 0xc083126e, 0xbffc9ba5, 0xe3575468, + 0x40f374e7, 0x851eb84e, 0x4021e51e, 0xb851eb85, 0xbfed3333, 0x333ac770, + 0x40f39040, 0x10624dcf, 0xc0240000, 0x00000000, 0x40000831, 0x26e78000, + 0x40f39040, 0x10624dcf, 0xc018d78d, 0x4fdf3b64, 0xc0009eb8, 0x51ed5a78, + 0x40f39040, 0x10624dcf, 0xc0035e35, 0x3f7ced91, 0xbfe59999, 0x99a0a9ec, + 0x40f39040, 0x10624dcf, 0x3ff5e560, 0x4189374c, 0xbfe06e97, 0x8d582908, + 0x40f39040, 0x10624dcf, 0x4014a1ca, 0xc083126e, 0x4003cac0, 0x8310bd9c, + 0x40f39040, 0x10624dcf, 0x4021e51e, 0xb851eb85, 0xbffce560, 0x418d0760, + 0x40f3ab98, 0x9ba5e350, 0xc0240000, 0x00000000, 0xbfdd9168, 0x72c00000, + 0x40f3ab98, 0x9ba5e350, 0xc018d78d, 0x4fdf3b64, 0x3fe71687, 0x2afaab60, + 0x40f3ab98, 0x9ba5e350, 0xc0035e35, 0x3f7ced91, 0x3ff14395, 0x81029722, + 0x40f3ab98, 0x9ba5e350, 0x3ff5e560, 0x4189374c, 0x3fde0418, 0x93640f20, + 0x40f3ab98, 0x9ba5e350, 0x4014a1ca, 0xc083126e, 0x3ff93f7c, 0xed8e0120, + 0x40f3ab98, 0x9ba5e350, 0x4021e51e, 0xb851eb85, 0xc0059893, 0x74be5584, + 0x40f3c6f1, 0x26e978d1, 0xc0240000, 0x00000000, 0xc0076c8b, 0x43978000, + 0x40f3c6f1, 0x26e978d1, 0xc018d78d, 0x4fdf3b64, 0xc005851e, 0xb853c6a0, + 0x40f3c6f1, 0x26e978d1, 0xc0035e35, 0x3f7ced91, 0x3fda5e35, 0x3f6ea060, + 0x40f3c6f1, 0x26e978d1, 0x3ff5e560, 0x4189374c, 0x3fb53f7c, 0xed4e4c80, + 0x40f3c6f1, 0x26e978d1, 0x4014a1ca, 0xc083126e, 0x3fe5d2f1, 0xa9f50e10, + 0x40f3c6f1, 0x26e978d1, 0x4021e51e, 0xb851eb85, 0xc00cbe76, 0xc8b62758, + 0x40f3e249, 0xb22d0e52, 0xc0240000, 0x00000000, 0x40126c8b, 0x43948000, + 0x40f3e249, 0xb22d0e52, 0xc018d78d, 0x4fdf3b64, 0x3fbbe76c, 0x8b07d600, + 0x40f3e249, 0xb22d0e52, 0xc0035e35, 0x3f7ced91, 0xbfd051eb, 0x852d1bc8, + 0x40f3e249, 0xb22d0e52, 0x3ff5e560, 0x4189374c, 0xbfd3645a, 0x1cbce8e0, + 0x40f3e249, 0xb22d0e52, 0x4014a1ca, 0xc083126e, 0xbfcb645a, 0x1cc79880, + 0x40f3e249, 0xb22d0e52, 0x4021e51e, 0xb851eb85, 0x4011d810, 0x624cda74, + 0x40f3fda2, 0x3d70a3d3, 0xc0240000, 0x00000000, 0x40011eb8, 0x51e98000, + 0x40f3fda2, 0x3d70a3d3, 0xc018d78d, 0x4fdf3b64, 0x40074395, 0x81044400, + 0x40f3fda2, 0x3d70a3d3, 0xc0035e35, 0x3f7ced91, 0xbfed8106, 0x24e46bf8, + 0x40f3fda2, 0x3d70a3d3, 0x3ff5e560, 0x4189374c, 0x3fe5be76, 0xc8abbc28, + 0x40f3fda2, 0x3d70a3d3, 0x4014a1ca, 0xc083126e, 0xbff1c28f, 0x5c2c6d28, + 0x40f3fda2, 0x3d70a3d3, 0x4021e51e, 0xb851eb85, 0x400c8a3d, 0x70a1e314, + 0x40f418fa, 0xc8b43954, 0xc0240000, 0x00000000, 0xbfd4dd2f, 0x1ab00000, + 0x40f418fa, 0xc8b43954, 0xc018d78d, 0x4fdf3b64, 0xbfe01cac, 0x0838b5e0, + 0x40f418fa, 0xc8b43954, 0xc0035e35, 0x3f7ced91, 0x3fea9fbe, 0x76c16c38, + 0x40f418fa, 0xc8b43954, 0x3ff5e560, 0x4189374c, 0x3fd2c8b4, 0x3946fc50, + 0x40f418fa, 0xc8b43954, 0x4014a1ca, 0xc083126e, 0xc0000c49, 0xba5ff3a0, + 0x40f418fa, 0xc8b43954, 0x4021e51e, 0xb851eb85, 0x4005645a, 0x1caa1140, + 0x40f43453, 0x53f7ced5, 0xc0240000, 0x00000000, 0xc0065604, 0x18958000, + 0x40f43453, 0x53f7ced5, 0xc018d78d, 0x4fdf3b64, 0x40025d2f, 0x1a9dd7d8, + 0x40f43453, 0x53f7ced5, 0xc0035e35, 0x3f7ced91, 0x3fc51eb8, 0x51ce3890, + 0x40f43453, 0x53f7ced5, 0x3ff5e560, 0x4189374c, 0xbfb7ae14, 0x7b25fec0, + 0x40f43453, 0x53f7ced5, 0x4014a1ca, 0xc083126e, 0x40020c49, 0xba5c7430, + 0x40f43453, 0x53f7ced5, 0x4021e51e, 0xb851eb85, 0x3ffc7ced, 0x91647ed8, + 0x40f44fab, 0xdf3b6456, 0xc0240000, 0x00000000, 0x4012f7ce, 0xd9158000, + 0x40f44fab, 0xdf3b6456, 0xc018d78d, 0x4fdf3b64, 0xbff1db22, 0xd0e93340, + 0x40f44fab, 0xdf3b6456, 0xc0035e35, 0x3f7ced91, 0xbfe01062, 0x4dda4ff0, + 0x40f44fab, 0xdf3b6456, 0x3ff5e560, 0x4189374c, 0xbfde9fbe, 0x76d9fbb0, + 0x40f44fab, 0xdf3b6456, 0x4014a1ca, 0xc083126e, 0x3ff5c28f, 0x5c256e48, + 0x40f44fab, 0xdf3b6456, 0x4021e51e, 0xb851eb85, 0x3fec624d, 0xd2e9b660, + 0x40f46b04, 0x6a7ef9d7, 0xc0240000, 0x00000000, 0x4002353f, 0x7ceb8000, + 0x40f46b04, 0x6a7ef9d7, 0xc018d78d, 0x4fdf3b64, 0x3ffaed91, 0x686ed760, + 0x40f46b04, 0x6a7ef9d7, 0xc0035e35, 0x3f7ced91, 0xbff2b439, 0x58141702, + 0x40f46b04, 0x6a7ef9d7, 0x3ff5e560, 0x4189374c, 0x3fe020c4, 0x9b9d32c0, + 0x40f46b04, 0x6a7ef9d7, 0x4014a1ca, 0xc083126e, 0x3fddb22d, 0x0e47d0c0, + 0x40f46b04, 0x6a7ef9d7, 0x4021e51e, 0xb851eb85, 0xbf7a9fbe, 0x7ac87800, + 0x40f4865c, 0xf5c28f58, 0xc0240000, 0x00000000, 0xbfc851eb, 0x85400000, + 0x40f4865c, 0xf5c28f58, 0xc018d78d, 0x4fdf3b64, 0xbffba7ef, 0x9db60b90, + 0x40f4865c, 0xf5c28f58, 0xc0035e35, 0x3f7ced91, 0x3fe2b851, 0xeb7daa2c, + 0x40f4865c, 0xf5c28f58, 0x3ff5e560, 0x4189374c, 0x3fbe353f, 0x7ca7a600, + 0x40f4865c, 0xf5c28f58, 0x4014a1ca, 0xc083126e, 0xbfdba5e3, 0x540617a0, + 0x40f4865c, 0xf5c28f58, 0x4021e51e, 0xb851eb85, 0xbfeccccc, 0xccd4d840, + 0x40f4a1b5, 0x810624d9, 0xc0240000, 0x00000000, 0xc0053f7c, 0xed938000, + 0x40f4a1b5, 0x810624d9, 0xc018d78d, 0x4fdf3b64, 0x3ff120c4, 0x9ba1ff10, + 0x40f4a1b5, 0x810624d9, 0xc0035e35, 0x3f7ced91, 0xbfb4fdf3, 0xb6819f40, + 0x40f4a1b5, 0x810624d9, 0x3ff5e560, 0x4189374c, 0xbfd126e9, 0x78e69280, + 0x40f4a1b5, 0x810624d9, 0x4014a1ca, 0xc083126e, 0xbff53f7c, 0xed950000, + 0x40f4a1b5, 0x810624d9, 0x4021e51e, 0xb851eb85, 0xbffcb22d, 0x0e5a0fc8, + 0x40f4bd0e, 0x0c49ba5a, 0xc0240000, 0x00000000, 0x40138312, 0x6e968000, + 0x40f4bd0e, 0x0c49ba5a, 0xc018d78d, 0x4fdf3b64, 0xc002ba5e, 0x354171f0, + 0x40f4bd0e, 0x0c49ba5a, 0xc0035e35, 0x3f7ced91, 0xbfe7f7ce, 0xd91e11fc, + 0x40f4bd0e, 0x0c49ba5a, 0x3ff5e560, 0x4189374c, 0xbfe4ed91, 0x687b8740, + 0x40f4bd0e, 0x0c49ba5a, 0x4014a1ca, 0xc083126e, 0xc001cac0, 0x83143d0c, + 0x40f4bd0e, 0x0c49ba5a, 0x4021e51e, 0xb851eb85, 0xc0057ef9, 0xdb24d9b8, + 0x40f4d866, 0x978d4fdb, 0xc0240000, 0x00000000, 0x40034bc6, 0xa7ed8000, + 0x40f4d866, 0x978d4fdb, 0xc018d78d, 0x4fdf3b64, 0x3fdd4fdf, 0x3b549b00, + 0x40f4d866, 0x978d4fdb, 0xc0035e35, 0x3f7ced91, 0x3ff0147a, 0xe143e31a, + 0x40f4d866, 0x978d4fdb, 0x3ff5e560, 0x4189374c, 0x3fd50624, 0xdd1d52b0, + 0x40f4d866, 0x978d4fdb, 0x4014a1ca, 0xc083126e, 0x40004dd2, 0xf1a82ac4, + 0x40f4d866, 0x978d4fdb, 0x4021e51e, 0xb851eb85, 0xc00ca4dd, 0x2f1cab8c, + 0x40f4f3bf, 0x22d0e55c, 0xc0240000, 0x00000000, 0xbfaba5e3, 0x54800000, + 0x40f4f3bf, 0x22d0e55c, 0xc018d78d, 0x4fdf3b64, 0xc007a0c4, 0x9ba7de18, + 0x40f4f3bf, 0x22d0e55c, 0xc0035e35, 0x3f7ced91, 0x3fd5a1ca, 0xc073d040, + 0x40f4f3bf, 0x22d0e55c, 0x3ff5e560, 0x4189374c, 0xbfad70a3, 0xd7994a80, + 0x40f4f3bf, 0x22d0e55c, 0x4014a1ca, 0xc083126e, 0x3ff245a1, 0xcabcdb70, + 0x40f4f3bf, 0x22d0e55c, 0x4021e51e, 0xb851eb85, 0x4011e4dd, 0x2f19985a, + 0x40f50f17, 0xae147add, 0xc0240000, 0x00000000, 0xc00428f5, 0xc2918000, + 0x40f50f17, 0xae147add, 0xc018d78d, 0x4fdf3b64, 0xbfc3c6a7, 0xefbd8c80, + 0x40f50f17, 0xae147add, 0xc0035e35, 0x3f7ced91, 0xbfd50e56, 0x0427ebe8, + 0x40f50f17, 0xae147add, 0x3ff5e560, 0x4189374c, 0xbfdc624d, 0xd303a550, + 0x40f50f17, 0xae147add, 0x4014a1ca, 0xc083126e, 0x3fcf7ced, 0x914b0ac0, + 0x40f50f17, 0xae147add, 0x4021e51e, 0xb851eb85, 0x400ca3d7, 0x0a3b5ee0, + 0x40f52a70, 0x3958105e, 0xc0240000, 0x00000000, 0xc013f1a9, 0xfbe88000, + 0x40f52a70, 0x3958105e, 0xc018d78d, 0x4fdf3b64, 0x400527ef, 0x9db02c88, + 0x40f52a70, 0x3958105e, 0xc0035e35, 0x3f7ced91, 0xbfefdf3b, 0x6461d408, + 0x40f52a70, 0x3958105e, 0x3ff5e560, 0x4189374c, 0x3fe13f7c, 0xed885df0, + 0x40f52a70, 0x3958105e, 0x4014a1ca, 0xc083126e, 0xbfe4cccc, 0xccd43180, + 0x40f52a70, 0x3958105e, 0x4021e51e, 0xb851eb85, 0x40057df3, 0xb6438d0c, + 0x40f545c8, 0xc49ba5df, 0xc0240000, 0x00000000, 0x4004624d, 0xd2ef8000, + 0x40f545c8, 0xc49ba5df, 0xc018d78d, 0x4fdf3b64, 0xbfe88b43, 0x958913c0, + 0x40f545c8, 0xc49ba5df, 0xc0035e35, 0x3f7ced91, 0x3fe84189, 0x37440428, + 0x40f545c8, 0xc49ba5df, 0x3ff5e560, 0x4189374c, 0x3fc39581, 0x06007fc0, + 0x40f545c8, 0xc49ba5df, 0x4014a1ca, 0xc083126e, 0xbff8bc6a, 0x7efd92d8, + 0x40f545c8, 0xc49ba5df, 0x4021e51e, 0xb851eb85, 0x3ffcb020, 0xc4977670, + 0x40f56121, 0x4fdf3b60, 0xc0240000, 0x00000000, 0x3fb4fdf3, 0xb6000000, + 0x40f56121, 0x4fdf3b60, 0xc018d78d, 0x4fdf3b64, 0x40004189, 0x3749c060, + 0x40f56121, 0x4fdf3b60, 0xc0035e35, 0x3f7ced91, 0x3fb74bc6, 0xa7b130a0, + 0x40f56121, 0x4fdf3b60, 0x3ff5e560, 0x4189374c, 0xbfcdd2f1, 0xaa207840, + 0x40f56121, 0x4fdf3b60, 0x4014a1ca, 0xc083126e, 0xc0038937, 0x4bc88678, + 0x40f56121, 0x4fdf3b60, 0x4021e51e, 0xb851eb85, 0x3fecc8b4, 0x394fa590, + 0x40f57c79, 0xdb22d0e1, 0xc0240000, 0x00000000, 0xc003126e, 0x978f8000, + 0x40f57c79, 0xdb22d0e1, 0xc018d78d, 0x4fdf3b64, 0xbff6126e, 0x97916230, + 0x40f57c79, 0xdb22d0e1, 0xc0035e35, 0x3f7ced91, 0xbfe26e97, 0x8d57b800, + 0x40f57c79, 0xdb22d0e1, 0x3ff5e560, 0x4189374c, 0xbfe3ced9, 0x16905c10, + 0x40f57c79, 0xdb22d0e1, 0x4014a1ca, 0xc083126e, 0x3ffd1eb8, 0x51e7c2b0, + 0x40f57c79, 0xdb22d0e1, 0x4021e51e, 0xb851eb85, 0x3f789374, 0xb82f2000, + 0x40f597d2, 0x66666662, 0xc0240000, 0x00000000, 0xc0136666, 0x66678000, + 0x40f597d2, 0x66666662, 0xc018d78d, 0x4fdf3b64, 0x3ff6b645, 0xa1c6a870, + 0x40f597d2, 0x66666662, 0xc0035e35, 0x3f7ced91, 0x3ff2d916, 0x87271018, + 0x40f597d2, 0x66666662, 0x3ff5e560, 0x4189374c, 0x3fd74395, 0x80f3a910, + 0x40f597d2, 0x66666662, 0x4014a1ca, 0xc083126e, 0x3fed9168, 0x72a89130, + 0x40f597d2, 0x66666662, 0x4021e51e, 0xb851eb85, 0xbfec6666, 0x666ee910, + 0x40f5b32a, 0xf1a9fbe3, 0xc0240000, 0x00000000, 0x400578d4, 0xfdf18000, + 0x40f5b32a, 0xf1a9fbe3, 0xc018d78d, 0x4fdf3b64, 0xbfffdf3b, 0x645e3a80, + 0x40f5b32a, 0xf1a9fbe3, 0xc0035e35, 0x3f7ced91, 0x3fe05a1c, 0xac00421c, + 0x40f5b32a, 0xf1a9fbe3, 0x3ff5e560, 0x4189374c, 0xbf970a3d, 0x71cd2f00, + 0x40f5b32a, 0xf1a9fbe3, 0x4014a1ca, 0xc083126e, 0x3f9cac08, 0x3033a000, + 0x40f5b32a, 0xf1a9fbe3, 0x4021e51e, 0xb851eb85, 0xbffc7ef9, 0xdb271830, + 0x40f5ce83, 0x7ced9164, 0xc0240000, 0x00000000, 0x3fcbe76c, 0x8b200000, + 0x40f5ce83, 0x7ced9164, 0xc018d78d, 0x4fdf3b64, 0x3fe9d2f1, 0xa9f3a040, + 0x40f5ce83, 0x7ced9164, 0xc0035e35, 0x3f7ced91, 0xbfc3f7ce, 0xd9366fe0, + 0x40f5ce83, 0x7ced9164, 0x3ff5e560, 0x4189374c, 0xbfda24dd, 0x2f2d4ef0, + 0x40f5ce83, 0x7ced9164, 0x4014a1ca, 0xc083126e, 0xbfebc6a7, 0xefa55730, + 0x40f5ce83, 0x7ced9164, 0x4021e51e, 0xb851eb85, 0xc0056560, 0x418b5dec, + 0x40f5e9dc, 0x083126e5, 0xc0240000, 0x00000000, 0xc001fbe7, 0x6c8d8000, + 0x40f5e9dc, 0x083126e5, 0xc018d78d, 0x4fdf3b64, 0xc004d604, 0x18958968, + 0x40f5e9dc, 0x083126e5, 0xc0035e35, 0x3f7ced91, 0xbfea5604, 0x189b7a0c, + 0x40f5e9dc, 0x083126e5, 0x3ff5e560, 0x4189374c, 0x3fe25e35, 0x3f738920, + 0x40f5e9dc, 0x083126e5, 0x4014a1ca, 0xc083126e, 0xbffc3958, 0x106625b0, + 0x40f5e9dc, 0x083126e5, 0x4021e51e, 0xb851eb85, 0xc00c8b43, 0x95832fc0, + 0x40f60534, 0x9374bc66, 0xc0240000, 0x00000000, 0xc012db22, 0xd0e68000, + 0x40f60534, 0x9374bc66, 0xc018d78d, 0x4fdf3b64, 0x3fc8e560, 0x4167be80, + 0x40f60534, 0x9374bc66, 0xc0035e35, 0x3f7ced91, 0x3fedcac0, 0x830a5e24, + 0x40f60534, 0x9374bc66, 0x3ff5e560, 0x4189374c, 0x3fc81062, 0x4dad2c80, + 0x40f60534, 0x9374bc66, 0x4014a1ca, 0xc083126e, 0x4003fbe7, 0x6c8954f8, + 0x40f60534, 0x9374bc66, 0x4021e51e, 0xb851eb85, 0xc011d893, 0x74bd80ca, + 0x40f6208d, 0x1eb851e7, 0xc0240000, 0x00000000, 0x40068f5c, 0x28f38000, + 0x40f6208d, 0x1eb851e7, 0xc018d78d, 0x4fdf3b64, 0x4007f2b0, 0x20c28138, + 0x40f6208d, 0x1eb851e7, 0xc0035e35, 0x3f7ced91, 0x3fd0e560, 0x41790020, + 0x40f6208d, 0x1eb851e7, 0x3ff5e560, 0x4189374c, 0xbfc95810, 0x6273cb80, + 0x40f6208d, 0x1eb851e7, 0x4014a1ca, 0xc083126e, 0x3ff9a1ca, 0xc07f2fd8, + 0x40f6208d, 0x1eb851e7, 0x4021e51e, 0xb851eb85, 0x400cbd70, 0xa3d4daac, + 0x40f63be5, 0xa9fbe768, 0xc0240000, 0x00000000, 0x3fd6a7ef, 0x9da00000, + 0x40f63be5, 0xa9fbe768, 0xc018d78d, 0x4fdf3b64, 0xbfdac083, 0x127f8200, + 0x40f63be5, 0xa9fbe768, 0xc0035e35, 0x3f7ced91, 0xbfd9cac0, 0x8322bc08, + 0x40f63be5, 0xa9fbe768, 0x3ff5e560, 0x4189374c, 0xbfe2b020, 0xc4a530e0, + 0x40f63be5, 0xa9fbe768, 0x4014a1ca, 0xc083126e, 0x3fe6978d, 0x4fd76b80, + 0x40f63be5, 0xa9fbe768, 0x4021e51e, 0xb851eb85, 0x4005978d, 0x4fdd08d8, + 0x40f6573e, 0x353f7ce9, 0xc0240000, 0x00000000, 0xc000e560, 0x418b8000, + 0x40f6573e, 0x353f7ce9, 0xc018d78d, 0x4fdf3b64, 0x40030c49, 0xba5c1510, + 0x40f6573e, 0x353f7ce9, 0xc0035e35, 0x3f7ced91, 0xbff11eb8, 0x51ef9e0c, + 0x40f6573e, 0x353f7ce9, 0x3ff5e560, 0x4189374c, 0x3fd98106, 0x24c9ff70, + 0x40f6573e, 0x353f7ce9, 0x4014a1ca, 0xc083126e, 0xbfc851eb, 0x853e22c0, + 0x40f6573e, 0x353f7ce9, 0x4021e51e, 0xb851eb85, 0x3ffce353, 0xf7ca6e08, + 0x40f67296, 0xc083126a, 0xc0240000, 0x00000000, 0xc0124fdf, 0x3b658000, + 0x40f67296, 0xc083126a, 0xc018d78d, 0x4fdf3b64, 0xbff07ced, 0x916cb8d0, + 0x40f67296, 0xc083126a, 0xc0035e35, 0x3f7ced91, 0x3fe5e353, 0xf7c69c18, + 0x40f67296, 0xc083126a, 0x3ff5e560, 0x4189374c, 0x3f899999, 0x97306e00, + 0x40f67296, 0xc083126a, 0x4014a1ca, 0xc083126e, 0xbff16041, 0x893b3e70, + 0x40f67296, 0xc083126a, 0x4021e51e, 0xb851eb85, 0x3fed2f1a, 0x9fb594c0, + 0x40f68def, 0x4bc6a7eb, 0xc0240000, 0x00000000, 0x4007a5e3, 0x53f58000, + 0x40f68def, 0x4bc6a7eb, 0xc018d78d, 0x4fdf3b64, 0x3ffc4bc6, 0xa7eb51d0, + 0x40f68def, 0x4bc6a7eb, 0xc0035e35, 0x3f7ced91, 0x3f916872, 0xaf17c080, + 0x40f68def, 0x4bc6a7eb, 0x3ff5e560, 0x4189374c, 0xbfd7e76c, 0x8b56f890, + 0x40f68def, 0x4bc6a7eb, 0x4014a1ca, 0xc083126e, 0xbfffb645, 0xa1ceb888, + 0x40f68def, 0x4bc6a7eb, 0x4021e51e, 0xb851eb85, 0x3f92f1a9, 0xfac9ae00, + 0x40f6a947, 0xd70a3d6c, 0xc0240000, 0x00000000, 0x3fdf5c28, 0xf5b00000, + 0x40f6a947, 0xd70a3d6c, 0xc018d78d, 0x4fdf3b64, 0xbffa49ba, 0x5e399120, + 0x40f6a947, 0xd70a3d6c, 0xc0035e35, 0x3f7ced91, 0xbfe4cccc, 0xccd52010, + 0x40f6a947, 0xd70a3d6c, 0x3ff5e560, 0x4189374c, 0x3fe37ced, 0x915eb450, + 0x40f6a947, 0xd70a3d6c, 0x4014a1ca, 0xc083126e, 0x40023d70, 0xa3d50b8c, + 0x40f6a947, 0xd70a3d6c, 0x4021e51e, 0xb851eb85, 0xbfec0000, 0x0008f9e0, + 0x40f6c4a0, 0x624dd2ed, 0xc0240000, 0x00000000, 0xbfff9db2, 0x2d130000, + 0x40f6c4a0, 0x624dd2ed, 0xc018d78d, 0x4fdf3b64, 0x3ff27ef9, 0xdb1e7980, + 0x40f6c4a0, 0x624dd2ed, 0xc0035e35, 0x3f7ced91, 0x3ff1a9fb, 0xe7685c10, + 0x40f6c4a0, 0x624dd2ed, 0x3ff5e560, 0x4189374c, 0x3fcc8b43, 0x9559d940, + 0x40f6c4a0, 0x624dd2ed, 0x4014a1ca, 0xc083126e, 0x3ff624dd, 0x2f169d00, + 0x40f6c4a0, 0x624dd2ed, 0x4021e51e, 0xb851eb85, 0xbffc4bc6, 0xa7f42098, + 0x40f6dff8, 0xed91686e, 0xc0240000, 0x00000000, 0xc011c49b, 0xa5e48000, + 0x40f6dff8, 0xed91686e, 0xc018d78d, 0x4fdf3b64, 0xc0020b43, 0x958334b8, + 0x40f6dff8, 0xed91686e, 0xc0035e35, 0x3f7ced91, 0x3fdbf7ce, 0xd905b418, + 0x40f6dff8, 0xed91686e, 0x3ff5e560, 0x4189374c, 0xbfc4dd2f, 0x1ac71ec0, + 0x40f6dff8, 0xed91686e, 0x4014a1ca, 0xc083126e, 0x3fdf3b64, 0x5a0c8ba0, + 0x40f6dff8, 0xed91686e, 0x4021e51e, 0xb851eb85, 0xc0054bc6, 0xa7f1e220, + 0x40f6fb51, 0x78d4fdef, 0xc0240000, 0x00000000, 0x4008bc6a, 0x7ef78000, + 0x40f6fb51, 0x78d4fdef, 0xc018d78d, 0x4fdf3b64, 0x3fe1645a, 0x1ca34260, + 0x40f6fb51, 0x78d4fdef, 0xc0035e35, 0x3f7ced91, 0xbfcd70a3, 0xd72c1020, + 0x40f6fb51, 0x78d4fdef, 0x3ff5e560, 0x4189374c, 0xbfe19168, 0x72ba05b0, + 0x40f6fb51, 0x78d4fdef, 0x4014a1ca, 0xc083126e, 0xbfda1cac, 0x08415cc0, + 0x40f6fb51, 0x78d4fdef, 0x4021e51e, 0xb851eb85, 0xc00c71a9, 0xfbe9b3f4, + 0x40f716aa, 0x04189370, 0xc0240000, 0x00000000, 0x3fe40831, 0x26e00000, + 0x40f716aa, 0x04189370, 0xc018d78d, 0x4fdf3b64, 0xc006f1a9, 0xfbe9a0e0, + 0x40f716aa, 0x04189370, 0xc0035e35, 0x3f7ced91, 0xbfecb439, 0x5818e21c, + 0x40f716aa, 0x04189370, 0x3ff5e560, 0x4189374c, 0x3fdbbe76, 0xc8a055d0, + 0x40f716aa, 0x04189370, 0x4014a1ca, 0xc083126e, 0xbff4dd2f, 0x1aa3d148, + 0x40f716aa, 0x04189370, 0x4021e51e, 0xb851eb85, 0xc011cbc6, 0xa7f0c2e4, + 0x40f73202, 0x8f5c28f1, 0xc0240000, 0x00000000, 0xbffd70a3, 0xd70f0000, + 0x40f73202, 0x8f5c28f1, 0xc018d78d, 0x4fdf3b64, 0xbfb1a9fb, 0xe7b37200, + 0x40f73202, 0x8f5c28f1, 0xc0035e35, 0x3f7ced91, 0x3feb6c8b, 0x438cf614, + 0x40f73202, 0x8f5c28f1, 0x3ff5e560, 0x4189374c, 0x3fa851eb, 0x847ece80, + 0x40f73202, 0x8f5c28f1, 0x4014a1ca, 0xc083126e, 0xc0019999, 0x999ba5b0, + 0x40f73202, 0x8f5c28f1, 0x4021e51e, 0xb851eb85, 0x400cd70a, 0x3d6e5678, + 0x40f74d5b, 0x1a9fbe72, 0xc0240000, 0x00000000, 0xc0113958, 0x10638000, + 0x40f74d5b, 0x1a9fbe72, 0xc018d78d, 0x4fdf3b64, 0x4005d70a, 0x3d6e69c0, + 0x40f74d5b, 0x1a9fbe72, 0xc0035e35, 0x3f7ced91, 0x3fc851eb, 0x84fc6000, + 0x40f74d5b, 0x1a9fbe72, 0x3ff5e560, 0x4189374c, 0xbfd5a9fb, 0xe780a230, + 0x40f74d5b, 0x1a9fbe72, 0x4014a1ca, 0xc083126e, 0x40007ef9, 0xdb20c220, + 0x40f74d5b, 0x1a9fbe72, 0x4021e51e, 0xb851eb85, 0x4005b126, 0xe97684a4, + 0x40f768b3, 0xa5e353f3, 0xc0240000, 0x00000000, 0x4009d2f1, 0xa9f98000, + 0x40f768b3, 0xa5e353f3, 0xc018d78d, 0x4fdf3b64, 0xbfe5ced9, 0x16901ee0, + 0x40f768b3, 0xa5e353f3, 0xc0035e35, 0x3f7ced91, 0xbfde872b, 0x021d8c28, + 0x40f768b3, 0xa5e353f3, 0x3ff5e560, 0x4189374c, 0x3fe49ba5, 0xe349df80, + 0x40f768b3, 0xa5e353f3, 0x4014a1ca, 0xc083126e, 0x3ff2a7ef, 0x9dae0a28, + 0x40f768b3, 0xa5e353f3, 0x4021e51e, 0xb851eb85, 0x3ffd1687, 0x2afd65a0, + 0x40f7840c, 0x3126e974, 0xc0240000, 0x00000000, 0x3fe8624d, 0xd2e80000, + 0x40f7840c, 0x3126e974, 0xc018d78d, 0x4fdf3b64, 0x4000f0a3, 0xd707fd98, + 0x40f7840c, 0x3126e974, 0xc0035e35, 0x3f7ced91, 0xbff24dd2, 0xf1ae5214, + 0x40f7840c, 0x3126e974, 0x3ff5e560, 0x4189374c, 0x3fd08312, 0x6e834300, + 0x40f7840c, 0x3126e974, 0x4014a1ca, 0xc083126e, 0x3fd147ae, 0x146a4040, + 0x40f7840c, 0x3126e974, 0x4021e51e, 0xb851eb85, 0x3fed9581, 0x061b83f0, + 0x40f79f64, 0xbc6a7ef5, 0xc0240000, 0x00000000, 0xbffb4395, 0x810b0000, + 0x40f79f64, 0xbc6a7ef5, 0xc018d78d, 0x4fdf3b64, 0xbff4b439, 0x5814e7c0, + 0x40f79f64, 0xbc6a7ef5, 0xc0035e35, 0x3f7ced91, 0x3fe3851e, 0xb8493408, + 0x40f79f64, 0xbc6a7ef5, 0x3ff5e560, 0x4189374c, 0xbfc0624d, 0xd31a7200, + 0x40f79f64, 0xbc6a7ef5, 0x4014a1ca, 0xc083126e, 0xbfe40831, 0x26f1d410, + 0x40f79f64, 0xbc6a7ef5, 0x4021e51e, 0xb851eb85, 0x3f9fbe76, 0xc7879400, + 0x40f7babd, 0x47ae1476, 0xc0240000, 0x00000000, 0xc010ae14, 0x7ae28000, + 0x40f7babd, 0x47ae1476, 0xc018d78d, 0x4fdf3b64, 0x3ff8147a, 0xe14322e0, + 0x40f7babd, 0x47ae1476, 0xc0035e35, 0x3f7ced91, 0xbfad2f1a, 0xa04aa0c0, + 0x40f7babd, 0x47ae1476, 0x3ff5e560, 0x4189374c, 0xbfe072b0, 0x20ceda80, + 0x40f7babd, 0x47ae1476, 0x4014a1ca, 0xc083126e, 0xbff85a1c, 0xac0c6420, + 0x40f7babd, 0x47ae1476, 0x4021e51e, 0xb851eb85, 0xbfeb9999, 0x99a30ab0, + 0x40f7d615, 0xd2f1a9f7, 0xc0240000, 0x00000000, 0x400ae978, 0xd4fb8000, + 0x40f7d615, 0xd2f1a9f7, 0xc018d78d, 0x4fdf3b64, 0xbffe8106, 0x24e1c010, + 0x40f7d615, 0xd2f1a9f7, 0xc0035e35, 0x3f7ced91, 0xbfe72b02, 0x0c528820, + 0x40f7d615, 0xd2f1a9f7, 0x3ff5e560, 0x4189374c, 0x3fddfbe7, 0x6c76ac30, + 0x40f7d615, 0xd2f1a9f7, 0x4014a1ca, 0xc083126e, 0xc0035810, 0x624fef1c, + 0x40f7d615, 0xd2f1a9f7, 0x4021e51e, 0xb851eb85, 0xbffc1893, 0x74c12900, + 0x40f7f16e, 0x5e353f78, 0xc0240000, 0x00000000, 0x3fecbc6a, 0x7ef00000, + 0x40f7f16e, 0x5e353f78, 0xc018d78d, 0x4fdf3b64, 0x3fec8f5c, 0x28ec9520, + 0x40f7f16e, 0x5e353f78, 0xc0035e35, 0x3f7ced91, 0x3ff07ae1, 0x47a9a808, + 0x40f7f16e, 0x5e353f78, 0x3ff5e560, 0x4189374c, 0x3fb51eb8, 0x5198c0c0, + 0x40f7f16e, 0x5e353f78, 0x4014a1ca, 0xc083126e, 0x3ffd8106, 0x24d8f168, + 0x40f7f16e, 0x5e353f78, 0x4021e51e, 0xb851eb85, 0xc005322d, 0x0e586654, + 0x40f80cc6, 0xe978d4f9, 0xc0240000, 0x00000000, 0xbff91687, 0x2b070000, + 0x40f80cc6, 0xe978d4f9, 0xc018d78d, 0x4fdf3b64, 0xc00426e9, 0x78d74c30, + 0x40f80cc6, 0xe978d4f9, 0xc0035e35, 0x3f7ced91, 0x3fd73b64, 0x5a0ae3f8, + 0x40f80cc6, 0xe978d4f9, 0x3ff5e560, 0x4189374c, 0xbfd36c8b, 0x43aa4bd0, + 0x40f80cc6, 0xe978d4f9, 0x4014a1ca, 0xc083126e, 0x3fee5604, 0x188aeea0, + 0x40f80cc6, 0xe978d4f9, 0x4021e51e, 0xb851eb85, 0xc00c5810, 0x62503828, + 0x40f8281f, 0x74bc6a7a, 0xc0240000, 0x00000000, 0xc01022d0, 0xe5618000, + 0x40f8281f, 0x74bc6a7a, 0xc018d78d, 0x4fdf3b64, 0x3fd1eb85, 0x1ea5c900, + 0x40f8281f, 0x74bc6a7a, 0xc0035e35, 0x3f7ced91, 0xbfd374bc, 0x6a90d830, + 0x40f8281f, 0x74bc6a7a, 0x3ff5e560, 0x4189374c, 0x3fe5ba5e, 0x35350ab0, + 0x40f8281f, 0x74bc6a7a, 0x4014a1ca, 0xc083126e, 0x3faa9fbe, 0x763fa700, + 0x40f8281f, 0x74bc6a7a, 0x4021e51e, 0xb851eb85, 0xc011bef9, 0xdb2404fe, + 0x40f84377, 0xfffffffb, 0xc0240000, 0x00000000, 0x400bffff, 0xfffd8000, + 0x40f84377, 0xfffffffb, 0xc018d78d, 0x4fdf3b64, 0x4008a1ca, 0xc080be70, + 0x40f84377, 0xfffffffb, 0xc0035e35, 0x3f7ced91, 0xbfef126e, 0x97964a2c, + 0x40f84377, 0xfffffffb, 0x3ff5e560, 0x4189374c, 0x3fd2c083, 0x12599960, + 0x40f84377, 0xfffffffb, 0x4014a1ca, 0xc083126e, 0xbfeb020c, 0x49c2f9c0, + 0x40f84377, 0xfffffffb, 0x4021e51e, 0xb851eb85, 0x400cf0a3, 0xd707d244, + 0x40f85ed0, 0x8b43957c, 0xc0240000, 0x00000000, 0x3ff08b43, 0x957c0000, + 0x40f85ed0, 0x8b43957c, 0xc018d78d, 0x4fdf3b64, 0xbfd547ae, 0x148d9840, + 0x40f85ed0, 0x8b43957c, 0xc0035e35, 0x3f7ced91, 0x3fe90e56, 0x040f8e04, + 0x40f85ed0, 0x8b43957c, 0x3ff5e560, 0x4189374c, 0xbfb7ced9, 0x16db8a80, + 0x40f85ed0, 0x8b43957c, 0x4014a1ca, 0xc083126e, 0xbffbd70a, 0x3d74f6f8, + 0x40f85ed0, 0x8b43957c, 0x4021e51e, 0xb851eb85, 0x4005cac0, 0x83100070, + // IEEEremainder(6.0,9.0) should be -3.0 + 0x40180000, 0x00000000, 0x40220000, 0x00000000, 0xc0080000, 0x00000000 + }; + +LOCAL_D const TUint32 SineTest[] = + { + 0x00000000,0x00000000, 0x00000000,0x00000000, + 0x3F50624D,0xD2F1A9FC, 0x3F50624D,0xA5218A62, + 0x3F60624D,0xD2F1A9FC, 0x3F60624D,0x1BB12D61, + 0x3F689374,0xBC6A7EFA, 0x3F689372,0x51F0E492, + 0x3F70624D,0xD2F1A9FC, 0x3F70624A,0xF5EFD464, + 0x3F747AE1,0x47AE147B, 0x3F747ADB,0xB006A986, + 0x3F789374,0xBC6A7EFA, 0x3F78936B,0x1284F039, + 0x3F7CAC08,0x3126E979, 0x3F7CABF8,0xD8B2BD8A, + 0x3F80624D,0xD2F1A9FC, 0x3F806242,0x5EEC20C6, + 0x3F826E97,0x8D4FDF3B, 0x3F826E87,0x3E9EE5EC, + 0x3F847AE1,0x47AE147B, 0x3F847ACA,0xE915E807, + 0x3F86872B,0x020C49BA, 0x3F86870D,0x3BF5752C, + 0x3F889374,0xBC6A7EFA, 0x3F88934E,0x14E1F1F4, + 0x3F8A9FBE,0x76C8B439, 0x3F8A9F8D,0x517FDBBB, + 0x3F8CAC08,0x3126E979, 0x3F8CABCA,0xCF73CAE6, + 0x3F8EB851,0xEB851EB8, 0x3F8EB806,0x6C62751D, + 0x3F90624D,0xD2F1A9FC, 0x3F906220,0x02F857C9, + 0x3F916872,0xB020C49C, 0x3F91683B,0xBCE1B89B, + 0x3F926E97,0x8D4FDF3B, 0x3F926E56,0x52BFEA83, + 0x3F9374BC,0x6A7EF9DB, 0x3F93746F,0xB3658E26, + 0x3F947AE1,0x47AE147B, 0x3F947A87,0xCDA55867, + 0x3F958106,0x24DD2F1B, 0x3F95809E,0x90521391, + 0x3F96872B,0x020C49BA, 0x3F9686B3,0xEA3EA071, + 0x3F978D4F,0xDF3B645A, 0x3F978CC7,0xCA3DF77B, + 0x3F989374,0xBC6A7EFA, 0x3F9892DA,0x1F2329E6, + 0x3F999999,0x9999999A, 0x3F9998EA,0xD7C162CE, + 0x3F9A9FBE,0x76C8B439, 0x3F9A9EF9,0xE2EBE852, + 0x3F9BA5E3,0x53F7CED9, 0x3F9BA507,0x2F761CB9, + 0x3F9CAC08,0x3126E979, 0x3F9CAB12,0xAC337F8E, + 0x3F9DB22D,0x0E560419, 0x3F9DB11C,0x47F7AEC1, + 0x3F9EB851,0xEB851EB8, 0x3F9EB723,0xF19667C6, + 0x3F9FBE76,0xC8B43958, 0x3F9FBD29,0x97E388BA, + 0x3FA0624D,0xD2F1A9FC, 0x3FA06196,0x94D988BF, + 0x3FA0E560,0x4189374C, 0x3FA0E497,0x4AEC926B, + 0x3FA16872,0xB020C49C, 0x3FA16796,0xE59504C8, + 0x3FA1EB85,0x1EB851EC, 0x3FA1EA95,0x5C3D15CE, + 0x3FA26E97,0x8D4FDF3B, 0x3FA26D92,0xA64F0E99, + 0x3FA2F1A9,0xFBE76C8B, 0x3FA2F08E,0xBB354BFA, + 0x3FA374BC,0x6A7EF9DB, 0x3FA37389,0x925A3F01, + 0x3FA3F7CE,0xD916872B, 0x3FA3F683,0x23286D94, + 0x3FA47AE1,0x47AE147B, 0x3FA4797B,0x650A72FB, + 0x3FA4FDF3,0xB645A1CB, 0x3FA4FC72,0x4F6B0071, + 0x3FA58106,0x24DD2F1B, 0x3FA57F67,0xD9B4DDB3, + 0x3FA60418,0x9374BC6A, 0x3FA6025B,0xFB52E994, + 0x3FA6872B,0x020C49BA, 0x3FA6854E,0xABB01A88, + 0x3FA70A3D,0x70A3D70A, 0x3FA7083F,0xE2377F36, + 0x3FA78D4F,0xDF3B645A, 0x3FA78B2F,0x96543F09, + 0x3FA81062,0x4DD2F1AA, 0x3FA80E1D,0xBF719ABE, + 0x3FA89374,0xBC6A7EFA, 0x3FA8910A,0x54FAECF6, + 0x3FA91687,0x2B020C4A, 0x3FA913F5,0x4E5BAAC3, + 0x3FA99999,0x9999999A, 0x3FA996DE,0xA2FF643C, + 0x3FAA1CAC,0x083126E9, 0x3FAA19C6,0x4A51C509, + 0x3FAA9FBE,0x76C8B439, 0x3FAA9CAC,0x3BBE94F8, + 0x3FAB22D0,0xE5604189, 0x3FAB1F90,0x6EB1B886, + 0x3FABA5E3,0x53F7CED9, 0x3FABA272,0xDA973174, + 0x3FAC28F5,0xC28F5C29, 0x3FAC2553,0x76DB1F55, + 0x3FACAC08,0x3126E979, 0x3FACA832,0x3AE9C021, + 0x3FAD2F1A,0x9FBE76C9, 0x3FAD2B0F,0x1E2F70BE, + 0x3FADB22D,0x0E560419, 0x3FADADEA,0x1818AD98, + 0x3FAE353F,0x7CED9168, 0x3FAE30C3,0x2012132B, + 0x3FAEB851,0xEB851EB8, 0x3FAEB39A,0x2D885E96, + 0x3FAF3B64,0x5A1CAC08, 0x3FAF366F,0x37E86E2A, + 0x3FAFBE76,0xC8B43958, 0x3FAFB942,0x369F41F9, + 0x3FB020C4,0x9BA5E354, 0x3FB01E09,0x908CFE33, + 0x3FB0624D,0xD2F1A9FC, 0x3FB05F70,0xF762F15C, + 0x3FB0A3D7,0x0A3D70A4, 0x3FB0A0D7,0x4B882ED2, + 0x3FB0E560,0x4189374C, 0x3FB0E23C,0x88B37CF1, + 0x3FB126E9,0x78D4FDF4, 0x3FB123A0,0xAA9BB45E, + 0x3FB16872,0xB020C49C, 0x3FB16503,0xACF7C04C, + 0x3FB1A9FB,0xE76C8B44, 0x3FB1A665,0x8B7E9EC9, + 0x3FB1EB85,0x1EB851EC, 0x3FB1E7C6,0x41E76101, + 0x3FB22D0E,0x56041893, 0x3FB22925,0xCBE92B89, + 0x3FB26E97,0x8D4FDF3B, 0x3FB26A84,0x253B36A8, + 0x3FB2B020,0xC49BA5E3, 0x3FB2ABE1,0x4994CE9A, + 0x3FB2F1A9,0xFBE76C8B, 0x3FB2ED3D,0x34AD53D9, + 0x3FB33333,0x33333333, 0x3FB32E97,0xE23C3B6C, + 0x3FB374BC,0x6A7EF9DB, 0x3FB36FF1,0x4DF90F24, + 0x3FB3B645,0xA1CAC083, 0x3FB3B149,0x739B6DED, + 0x3FB3F7CE,0xD916872B, 0x3FB3F2A0,0x4EDB0C10, + 0x3FB43958,0x10624DD3, 0x3FB433F5,0xDB6FB37E, + 0x3FB47AE1,0x47AE147B, 0x3FB4754A,0x15114416, + 0x3FB4BC6A,0x7EF9DB23, 0x3FB4B69C,0xF777B3EE, + 0x3FB4FDF3,0xB645A1CB, 0x3FB4F7EE,0x7E5B0F9A, + 0x3FB53F7C,0xED916873, 0x3FB5393E,0xA5737A76, + 0x3FB58106,0x24DD2F1B, 0x3FB57A8D,0x68792EEB, + 0x3FB5C28F,0x5C28F5C3, 0x3FB5BBDA,0xC3247EB6, + 0x3FB60418,0x9374BC6A, 0x3FB5FD26,0xB12DD335, + 0x3FB645A1,0xCAC08312, 0x3FB63E71,0x2E4DADAA, + 0x3FB6872B,0x020C49BA, 0x3FB67FBA,0x363CA784, + 0x3FB6C8B4,0x39581062, 0x3FB6C101,0xC4B372A7, + 0x3FB70A3D,0x70A3D70A, 0x3FB70247,0xD56AD9B5, + 0x3FB74BC6,0xA7EF9DB2, 0x3FB7438C,0x641BC055, + 0x3FB78D4F,0xDF3B645A, 0x3FB784CF,0x6C7F2377, + 0x3FB7CED9,0x16872B02, 0x3FB7C610,0xEA4E19A4, + 0x3FB81062,0x4DD2F1AA, 0x3FB80750,0xD941D33D, + 0x3FB851EB,0x851EB852, 0x3FB8488F,0x35139AC9, + 0x3FB89374,0xBC6A7EFA, 0x3FB889CB,0xF97CD539, + 0x3FB8D4FD,0xF3B645A2, 0x3FB8CB07,0x22370233, + 0x3FB91687,0x2B020C4A, 0x3FB90C40,0xAAFBBC56, + 0x3FB95810,0x624DD2F2, 0x3FB94D78,0x8F84B985, + 0x3FB99999,0x9999999A, 0x3FB98EAE,0xCB8BCB2C, + 0x3FB9DB22,0xD0E56042, 0x3FB9CFE3,0x5ACADE8B, + 0x3FBA1CAC,0x083126E9, 0x3FBA1116,0x38FBFCF8, + 0x3FBA5E35,0x3F7CED91, 0x3FBA5247,0x61D94C31, + 0x3FBA9FBE,0x76C8B439, 0x3FBA9376,0xD11D0E97, + 0x3FBAE147,0xAE147AE1, 0x3FBAD4A4,0x8281A37D, + 0x3FBB22D0,0xE5604189, 0x3FBB15D0,0x71C18772, + 0x3FBB645A,0x1CAC0831, 0x3FBB56FA,0x9A975480, + 0x3FBBA5E3,0x53F7CED9, 0x3FBB9822,0xF8BDC27E, + 0x3FBBE76C,0x8B439581, 0x3FBBD949,0x87EFA74D, + 0x3FBC28F5,0xC28F5C29, 0x3FBC1A6E,0x43E7F72B, + 0x3FBC6A7E,0xF9DB22D1, 0x3FBC5B91,0x2861C4F0, + 0x3FBCAC08,0x3126E979, 0x3FBC9CB2,0x3118425C, + 0x3FBCED91,0x6872B021, 0x3FBCDDD1,0x59C6C05D, + 0x3FBD2F1A,0x9FBE76C9, 0x3FBD1EEE,0x9E28AF58, + 0x3FBD70A3,0xD70A3D71, 0x3FBD6009,0xF9F99F6D, + 0x3FBDB22D,0x0E560419, 0x3FBDA123,0x68F540C1, + 0x3FBDF3B6,0x45A1CAC1, 0x3FBDE23A,0xE6D763C6, + 0x3FBE353F,0x7CED9168, 0x3FBE2350,0x6F5BF983, + 0x3FBE76C8,0xB4395810, 0x3FBE6463,0xFE3F13D9, + 0x3FBEB851,0xEB851EB8, 0x3FBEA575,0x8F3CE5CD, + 0x3FBEF9DB,0x22D0E560, 0x3FBEE685,0x1E11C3CD, + 0x3FBF3B64,0x5A1CAC08, 0x3FBF2792,0xA67A23FB, + 0x3FBF7CED,0x916872B0, 0x3FBF689E,0x24329E72, + 0x3FBFBE76,0xC8B43958, 0x3FBFA9A7,0x92F7ED8F, + 0x3FC00000,0x00000000, 0x3FBFEAAE,0xEE86EE36, + 0x3FC020C4,0x9BA5E354, 0x3FC015DA,0x194E500E, + 0x3FC04189,0x374BC6A8, 0x3FC0365B,0xAD7B1308, + 0x3FC0624D,0xD2F1A9FC, 0x3FC056DC,0x31A8631E, + 0x3FC08312,0x6E978D50, 0x3FC0775B,0xA3B4F53A, + 0x3FC0A3D7,0x0A3D70A4, 0x3FC097DA,0x017F903C, + 0x3FC0C49B,0xA5E353F8, 0x3FC0B857,0x48E70D21, + 0x3FC0E560,0x4189374C, 0x3FC0D8D3,0x77CA5721, + 0x3FC10624,0xDD2F1AA0, 0x3FC0F94E,0x8C086BDA, + 0x3FC126E9,0x78D4FDF4, 0x3FC119C8,0x83805B6E, + 0x3FC147AE,0x147AE148, 0x3FC13A41,0x5C1148A8, + 0x3FC16872,0xB020C49C, 0x3FC15AB9,0x139A6923, + 0x3FC18937,0x4BC6A7F0, 0x3FC17B2F,0xA7FB0568, + 0x3FC1A9FB,0xE76C8B44, 0x3FC19BA5,0x17127917, + 0x3FC1CAC0,0x83126E98, 0x3FC1BC19,0x5EC03308, + 0x3FC1EB85,0x1EB851EC, 0x3FC1DC8C,0x7CE3B56F, + 0x3FC20C49,0xBA5E353F, 0x3FC1FCFE,0x6F5C95FF, + 0x3FC22D0E,0x56041893, 0x3FC21D6F,0x340A7E12, + 0x3FC24DD2,0xF1A9FBE7, 0x3FC23DDE,0xC8CD2AC5, + 0x3FC26E97,0x8D4FDF3B, 0x3FC25E4D,0x2B846D23, + 0x3FC28F5C,0x28F5C28F, 0x3FC27EBA,0x5A102A42, + 0x3FC2B020,0xC49BA5E3, 0x3FC29F26,0x52505B6F, + 0x3FC2D0E5,0x60418937, 0x3FC2BF91,0x12250E49, + 0x3FC2F1A9,0xFBE76C8B, 0x3FC2DFFA,0x976E64EB, + 0x3FC3126E,0x978D4FDF, 0x3FC30062,0xE00C960B, + 0x3FC33333,0x33333333, 0x3FC320C9,0xE9DFED22, + 0x3FC353F7,0xCED91687, 0x3FC3412F,0xB2C8CA8C, + 0x3FC374BC,0x6A7EF9DB, 0x3FC36194,0x38A7A3AC, + 0x3FC39581,0x0624DD2F, 0x3FC381F7,0x795D0315, + 0x3FC3B645,0xA1CAC083, 0x3FC3A259,0x72C988A4, + 0x3FC3D70A,0x3D70A3D7, 0x3FC3C2BA,0x22CDE9AD, + 0x3FC3F7CE,0xD916872B, 0x3FC3E319,0x874AF119, + 0x3FC41893,0x74BC6A7F, 0x3FC40377,0x9E217F8A, + 0x3FC43958,0x10624DD3, 0x3FC423D4,0x65328B81, + 0x3FC45A1C,0xAC083127, 0x3FC4442F,0xDA5F2180, + 0x3FC47AE1,0x47AE147B, 0x3FC46489,0xFB88642F, + 0x3FC49BA5,0xE353F7CF, 0x3FC484E2,0xC68F8C7C, + 0x3FC4BC6A,0x7EF9DB23, 0x3FC4A53A,0x3955E9C4, + 0x3FC4DD2F,0x1A9FBE77, 0x3FC4C590,0x51BCE1F1, + 0x3FC4FDF3,0xB645A1CB, 0x3FC4E5E5,0x0DA5F1A2, + 0x3FC51EB8,0x51EB851F, 0x3FC50638,0x6AF2AC4C, + 0x3FC53F7C,0xED916873, 0x3FC5268A,0x6784BC5E, + 0x3FC56041,0x89374BC7, 0x3FC546DB,0x013DE364, + 0x3FC58106,0x24DD2F1B, 0x3FC5672A,0x35FFFA2F, + 0x3FC5A1CA,0xC083126F, 0x3FC58778,0x03ACF0F0, + 0x3FC5C28F,0x5C28F5C3, 0x3FC5A7C4,0x6826CF64, + 0x3FC5E353,0xF7CED917, 0x3FC5C80F,0x614FB4F2, + 0x3FC60418,0x9374BC6A, 0x3FC5E858,0xED09D8D0, + 0x3FC624DD,0x2F1A9FBE, 0x3FC608A1,0x09378A2B, + 0x3FC645A1,0xCAC08312, 0x3FC628E7,0xB3BB3041, + 0x3FC66666,0x66666666, 0x3FC6492C,0xEA774A8E, + 0x3FC6872B,0x020C49BA, 0x3FC66970,0xAB4E70E8, + 0x3FC6A7EF,0x9DB22D0E, 0x3FC689B2,0xF42353AA, + 0x3FC6C8B4,0x39581062, 0x3FC6A9F3,0xC2D8BBCF, + 0x3FC6E978,0xD4FDF3B6, 0x3FC6CA33,0x15518B1D, + 0x3FC70A3D,0x70A3D70A, 0x3FC6EA70,0xE970BC45, + 0x3FC72B02,0x0C49BA5E, 0x3FC70AAD,0x3D196304, + 0x3FC74BC6,0xA7EF9DB2, 0x3FC72AE8,0x0E2EAC4D, + 0x3FC76C8B,0x43958106, 0x3FC74B21,0x5A93DE66, + 0x3FC78D4F,0xDF3B645A, 0x3FC76B59,0x202C5910, + 0x3FC7AE14,0x7AE147AE, 0x3FC78B8F,0x5CDB95A7, + 0x3FC7CED9,0x16872B02, 0x3FC7ABC4,0x0E852747, + 0x3FC7EF9D,0xB22D0E56, 0x3FC7CBF7,0x330CBAF0, + 0x3FC81062,0x4DD2F1AA, 0x3FC7EC28,0xC85617A9, + 0x3FC83126,0xE978D4FE, 0x3FC80C58,0xCC451EA4, + 0x3FC851EB,0x851EB852, 0x3FC82C87,0x3CBDCB5D, + 0x3FC872B0,0x20C49BA6, 0x3FC84CB4,0x17A433C5, + 0x3FC89374,0xBC6A7EFA, 0x3FC86CDF,0x5ADC8860, + 0x3FC8B439,0x5810624E, 0x3FC88D09,0x044B1469, + 0x3FC8D4FD,0xF3B645A2, 0x3FC8AD31,0x11D43DF6, + 0x3FC8F5C2,0x8F5C28F6, 0x3FC8CD57,0x815C861D, + 0x3FC91687,0x2B020C4A, 0x3FC8ED7C,0x50C88914, + 0x3FC9374B,0xC6A7EF9E, 0x3FC90D9F,0x7DFCFE58, + 0x3FC95810,0x624DD2F2, 0x3FC92DC1,0x06DEB8CD, + 0x3FC978D4,0xFDF3B646, 0x3FC94DE0,0xE952A6E4, + 0x3FC99999,0x9999999A, 0x3FC96DFF,0x233DD2BC, + 0x3FC9BA5E,0x353F7CEE, 0x3FC98E1B,0xB2856248, + 0x3FC9DB22,0xD0E56042, 0x3FC9AE36,0x950E976F, + 0x3FC9FBE7,0x6C8B4396, 0x3FC9CE4F,0xC8BED032, + 0x3FCA1CAC,0x083126E9, 0x3FC9EE67,0x4B7B86CE, + 0x3FCA3D70,0xA3D70A3D, 0x3FCA0E7D,0x1B2A51E2, + 0x3FCA5E35,0x3F7CED91, 0x3FCA2E91,0x35B0E48D, + 0x3FCA7EF9,0xDB22D0E5, 0x3FCA4EA3,0x98F50E96, + 0x3FCA9FBE,0x76C8B439, 0x3FCA6EB4,0x42DCBC8D, + 0x3FCAC083,0x126E978D, 0x3FCA8EC3,0x314DF7EE, + 0x3FCAE147,0xAE147AE1, 0x3FCAAED0,0x622EE747, + 0x3FCB020C,0x49BA5E35, 0x3FCACEDB,0xD365CE58, + 0x3FCB22D0,0xE5604189, 0x3FCAEEE5,0x82D90E37, + 0x3FCB4395,0x810624DD, 0x3FCB0EED,0x6E6F2575, + 0x3FCB645A,0x1CAC0831, 0x3FCB2EF3,0x940EB040, + 0x3FCB851E,0xB851EB85, 0x3FCB4EF7,0xF19E6886, + 0x3FCBA5E3,0x53F7CED9, 0x3FCB6EFA,0x85052617, + 0x3FCBC6A7,0xEF9DB22D, 0x3FCB8EFB,0x4C29DECC, + 0x3FCBE76C,0x8B439581, 0x3FCBAEFA,0x44F3A6A6, + 0x3FCC0831,0x26E978D5, 0x3FCBCEF7,0x6D49AFF5, + 0x3FCC28F5,0xC28F5C29, 0x3FCBEEF2,0xC3134B77, + 0x3FCC49BA,0x5E353F7D, 0x3FCC0EEC,0x4437E87F, + 0x3FCC6A7E,0xF9DB22D1, 0x3FCC2EE3,0xEE9F1515, + 0x3FCC8B43,0x95810625, 0x3FCC4ED9,0xC0307E1D, + 0x3FCCAC08,0x3126E979, 0x3FCC6ECD,0xB6D3EF75, + 0x3FCCCCCC,0xCCCCCCCD, 0x3FCC8EBF,0xD071541E, + 0x3FCCED91,0x6872B021, 0x3FCCAEB0,0x0AF0B65A, + 0x3FCD0E56,0x04189375, 0x3FCCCE9E,0x643A3FD2, + 0x3FCD2F1A,0x9FBE76C9, 0x3FCCEE8A,0xDA3639B7, + 0x3FCD4FDF,0x3B645A1D, 0x3FCD0E75,0x6ACD0CEA, + 0x3FCD70A3,0xD70A3D71, 0x3FCD2E5E,0x13E74218, + 0x3FCD9168,0x72B020C5, 0x3FCD4E44,0xD36D81E2, + 0x3FCDB22D,0x0E560419, 0x3FCD6E29,0xA74894FF, + 0x3FCDD2F1,0xA9FBE76D, 0x3FCD8E0C,0x8D61645E, + 0x3FCDF3B6,0x45A1CAC1, 0x3FCDADED,0x83A0F94B, + 0x3FCE147A,0xE147AE14, 0x3FCDCDCC,0x87F07D90, + 0x3FCE353F,0x7CED9168, 0x3FCDEDA9,0x98393B9A, + 0x3FCE5604,0x189374BC, 0x3FCE0D84,0xB2649E9B, + 0x3FCE76C8,0xB4395810, 0x3FCE2D5D,0xD45C32AB, + 0x3FCE978D,0x4FDF3B64, 0x3FCE4D34,0xFC09A4F0, + 0x3FCEB851,0xEB851EB8, 0x3FCE6D0A,0x2756C3BC, + 0x3FCED916,0x872B020C, 0x3FCE8CDD,0x542D7EB4, + 0x3FCEF9DB,0x22D0E560, 0x3FCEACAE,0x8077E6EE, + 0x3FCF1A9F,0xBE76C8B4, 0x3FCECC7D,0xAA202F1C, + 0x3FCF3B64,0x5A1CAC08, 0x3FCEEC4A,0xCF10ABA5, + 0x3FCF5C28,0xF5C28F5C, 0x3FCF0C15,0xED33D2D1, + 0x3FCF7CED,0x916872B0, 0x3FCF2BDF,0x02743CE5, + 0x3FCF9DB2,0x2D0E5604, 0x3FCF4BA6,0x0CBCA44C, + 0x3FCFBE76,0xC8B43958, 0x3FCF6B6B,0x09F7E5B4, + 0x3FCFDF3B,0x645A1CAC, 0x3FCF8B2D,0xF8110036, + 0x3FD00000,0x00000000, 0x3FCFAAEE,0xD4F31577, + 0x3FD01062,0x4DD2F1AA, 0x3FCFCAAD,0x9E8969C8, + 0x3FD020C4,0x9BA5E354, 0x3FCFEA6A,0x52BF6450, + 0x3FD03126,0xE978D4FE, 0x3FD00512,0x77C04793, + 0x3FD04189,0x374BC6A8, 0x3FD014EE,0xB95C4BBE, + 0x3FD051EB,0x851EB852, 0x3FD024C9,0xED29A6DE, + 0x3FD0624D,0xD2F1A9FC, 0x3FD034A4,0x121E52D8, + 0x3FD072B0,0x20C49BA6, 0x3FD0447D,0x27305B4F, + 0x3FD08312,0x6E978D50, 0x3FD05455,0x2B55DDB9, + 0x3FD09374,0xBC6A7EFA, 0x3FD0642C,0x1D85096F, + 0x3FD0A3D7,0x0A3D70A4, 0x3FD07401,0xFCB41FBD, + 0x3FD0B439,0x5810624E, 0x3FD083D6,0xC7D973F6, + 0x3FD0C49B,0xA5E353F8, 0x3FD093AA,0x7DEB6B84, + 0x3FD0D4FD,0xF3B645A2, 0x3FD0A37D,0x1DE07DFA, + 0x3FD0E560,0x4189374C, 0x3FD0B34E,0xA6AF3523, + 0x3FD0F5C2,0x8F5C28F6, 0x3FD0C31F,0x174E2D16, + 0x3FD10624,0xDD2F1AA0, 0x3FD0D2EE,0x6EB4144A, + 0x3FD11687,0x2B020C4A, 0x3FD0E2BC,0xABD7AB9F, + 0x3FD126E9,0x78D4FDF4, 0x3FD0F289,0xCDAFC678, + 0x3FD1374B,0xC6A7EF9E, 0x3FD10255,0xD3334AC8, + 0x3FD147AE,0x147AE148, 0x3FD11220,0xBB593124, + 0x3FD15810,0x624DD2F2, 0x3FD121EA,0x851884D5, + 0x3FD16872,0xB020C49C, 0x3FD131B3,0x2F6863E9, + 0x3FD178D4,0xFDF3B646, 0x3FD1417A,0xB93FFF43, + 0x3FD18937,0x4BC6A7F0, 0x3FD15141,0x21969AB1, + 0x3FD19999,0x9999999A, 0x3FD16106,0x67638CF6, + 0x3FD1A9FB,0xE76C8B44, 0x3FD170CA,0x899E3FE3, + 0x3FD1BA5E,0x353F7CEE, 0x3FD1808D,0x873E3062, + 0x3FD1CAC0,0x83126E98, 0x3FD1904F,0x5F3AEE8C, + 0x3FD1DB22,0xD0E56042, 0x3FD1A010,0x108C1DB7, + 0x3FD1EB85,0x1EB851EC, 0x3FD1AFCF,0x9A29748A, + 0x3FD1FBE7,0x6C8B4396, 0x3FD1BF8D,0xFB0ABD0C, + 0x3FD20C49,0xBA5E353F, 0x3FD1CF4B,0x3227D4B7, + 0x3FD21CAC,0x083126E9, 0x3FD1DF07,0x3E78AC89, + 0x3FD22D0E,0x56041893, 0x3FD1EEC2,0x1EF54914, + 0x3FD23D70,0xA3D70A3D, 0x3FD1FE7B,0xD295C292, + 0x3FD24DD2,0xF1A9FBE7, 0x3FD20E34,0x585244F2, + 0x3FD25E35,0x3F7CED91, 0x3FD21DEB,0xAF230FEE, + 0x3FD26E97,0x8D4FDF3B, 0x3FD22DA1,0xD6007719, + 0x3FD27EF9,0xDB22D0E5, 0x3FD23D56,0xCBE2E1F2, + 0x3FD28F5C,0x28F5C28F, 0x3FD24D0A,0x8FC2CBF6, + 0x3FD29FBE,0x76C8B439, 0x3FD25CBD,0x2098C4AD, + 0x3FD2B020,0xC49BA5E3, 0x3FD26C6E,0x7D5D6FC0, + 0x3FD2C083,0x126E978D, 0x3FD27C1E,0xA5098509, + 0x3FD2D0E5,0x60418937, 0x3FD28BCD,0x9695D0A4, + 0x3FD2E147,0xAE147AE1, 0x3FD29B7B,0x50FB32FD, + 0x3FD2F1A9,0xFBE76C8B, 0x3FD2AB27,0xD332A0E9, + 0x3FD3020C,0x49BA5E35, 0x3FD2BAD3,0x1C3523AE, + 0x3FD3126E,0x978D4FDF, 0x3FD2CA7D,0x2AFBD91B, + 0x3FD322D0,0xE5604189, 0x3FD2DA25,0xFE7FF398, + 0x3FD33333,0x33333333, 0x3FD2E9CD,0x95BABA33, + 0x3FD34395,0x810624DD, 0x3FD2F973,0xEFA588B8, + 0x3FD353F7,0xCED91687, 0x3FD30919,0x0B39CFBC, + 0x3FD3645A,0x1CAC0831, 0x3FD318BC,0xE77114B2, + 0x3FD374BC,0x6A7EF9DB, 0x3FD3285F,0x8344F1FA, + 0x3FD3851E,0xB851EB85, 0x3FD33800,0xDDAF16F5, + 0x3FD39581,0x0624DD2F, 0x3FD347A0,0xF5A94813, + 0x3FD3A5E3,0x53F7CED9, 0x3FD3573F,0xCA2D5EE5, + 0x3FD3B645,0xA1CAC083, 0x3FD366DD,0x5A354A32, + 0x3FD3C6A7,0xEF9DB22D, 0x3FD37679,0xA4BB0E00, + 0x3FD3D70A,0x3D70A3D7, 0x3FD38614,0xA8B8C3AF, + 0x3FD3E76C,0x8B439581, 0x3FD395AE,0x65289A02, + 0x3FD3F7CE,0xD916872B, 0x3FD3A546,0xD904D535, + 0x3FD40831,0x26E978D5, 0x3FD3B4DE,0x0347CF0C, + 0x3FD41893,0x74BC6A7F, 0x3FD3C473,0xE2EBF6E5, + 0x3FD428F5,0xC28F5C29, 0x3FD3D408,0x76EBD1C9, + 0x3FD43958,0x10624DD3, 0x3FD3E39B,0xBE41FA7C, + 0x3FD449BA,0x5E353F7D, 0x3FD3F32D,0xB7E92191, + 0x3FD45A1C,0xAC083127, 0x3FD402BE,0x62DC0D78, + 0x3FD46A7E,0xF9DB22D1, 0x3FD4124D,0xBE159A90, + 0x3FD47AE1,0x47AE147B, 0x3FD421DB,0xC890BB3A, + 0x3FD48B43,0x95810625, 0x3FD43168,0x814877E8, + 0x3FD49BA5,0xE353F7CF, 0x3FD440F3,0xE737EF2D, + 0x3FD4AC08,0x3126E979, 0x3FD4507D,0xF95A55D3, + 0x3FD4BC6A,0x7EF9DB23, 0x3FD46006,0xB6AAF6E7, + 0x3FD4CCCC,0xCCCCCCCD, 0x3FD46F8E,0x1E2533CC, + 0x3FD4DD2F,0x1A9FBE77, 0x3FD47F14,0x2EC4844C, + 0x3FD4ED91,0x6872B021, 0x3FD48E98,0xE78476AA, + 0x3FD4FDF3,0xB645A1CB, 0x3FD49E1C,0x4760AFB2, + 0x3FD50E56,0x04189375, 0x3FD4AD9E,0x4D54EAC9, + 0x3FD51EB8,0x51EB851F, 0x3FD4BD1E,0xF85CFA01, + 0x3FD52F1A,0x9FBE76C9, 0x3FD4CC9E,0x4774C628, + 0x3FD53F7C,0xED916873, 0x3FD4DC1C,0x39984ED8, + 0x3FD54FDF,0x3B645A1D, 0x3FD4EB98,0xCDC3AA8D, + 0x3FD56041,0x89374BC7, 0x3FD4FB14,0x02F306AE, + 0x3FD570A3,0xD70A3D71, 0x3FD50A8D,0xD822A7A6, + 0x3FD58106,0x24DD2F1B, 0x3FD51A06,0x4C4EE8EF, + 0x3FD59168,0x72B020C5, 0x3FD5297D,0x5E743D28, + 0x3FD5A1CA,0xC083126F, 0x3FD538F3,0x0D8F2E23, + 0x3FD5B22D,0x0E560419, 0x3FD54867,0x589C5CF4, + 0x3FD5C28F,0x5C28F5C3, 0x3FD557DA,0x3E988208, + 0x3FD5D2F1,0xA9FBE76D, 0x3FD5674B,0xBE806D32, + 0x3FD5E353,0xF7CED917, 0x3FD576BB,0xD75105BA, + 0x3FD5F3B6,0x45A1CAC1, 0x3FD5862A,0x88074A73, + 0x3FD60418,0x9374BC6A, 0x3FD59597,0xCFA051C9, + 0x3FD6147A,0xE147AE14, 0x3FD5A503,0xAD1949D2, + 0x3FD624DD,0x2F1A9FBE, 0x3FD5B46E,0x1F6F7861, + 0x3FD6353F,0x7CED9168, 0x3FD5C3D7,0x25A03B13, + 0x3FD645A1,0xCAC08312, 0x3FD5D33E,0xBEA90765, + 0x3FD65604,0x189374BC, 0x3FD5E2A4,0xE9876ABF, + 0x3FD66666,0x66666666, 0x3FD5F209,0xA5390A8B, + 0x3FD676C8,0xB4395810, 0x3FD6016C,0xF0BBA442, + 0x3FD6872B,0x020C49BA, 0x3FD610CE,0xCB0D0D7F, + 0x3FD6978D,0x4FDF3B64, 0x3FD6202F,0x332B340E, + 0x3FD6A7EF,0x9DB22D0E, 0x3FD62F8E,0x28141DFE, + 0x3FD6B851,0xEB851EB8, 0x3FD63EEB,0xA8C5E9B3, + 0x3FD6C8B4,0x39581062, 0x3FD64E47,0xB43ECDF4, + 0x3FD6D916,0x872B020C, 0x3FD65DA2,0x497D19FF, + 0x3FD6E978,0xD4FDF3B6, 0x3FD66CFB,0x677F3598, + 0x3FD6F9DB,0x22D0E560, 0x3FD67C53,0x0D43A11A, + 0x3FD70A3D,0x70A3D70A, 0x3FD68BA9,0x39C8F589, + 0x3FD71A9F,0xBE76C8B4, 0x3FD69AFD,0xEC0DE4A3, + 0x3FD72B02,0x0C49BA5E, 0x3FD6AA51,0x231138ED, + 0x3FD73B64,0x5A1CAC08, 0x3FD6B9A2,0xDDD1D5CA, + 0x3FD74BC6,0xA7EF9DB2, 0x3FD6C8F3,0x1B4EB787, + 0x3FD75C28,0xF5C28F5C, 0x3FD6D841,0xDA86F36E, + 0x3FD76C8B,0x43958106, 0x3FD6E78F,0x1A79B7D7, + 0x3FD77CED,0x916872B0, 0x3FD6F6DA,0xDA264C36, + 0x3FD78D4F,0xDF3B645A, 0x3FD70625,0x188C1132, + 0x3FD79DB2,0x2D0E5604, 0x3FD7156D,0xD4AA80AE, + 0x3FD7AE14,0x7AE147AE, 0x3FD724B5,0x0D812DDF, + 0x3FD7BE76,0xC8B43958, 0x3FD733FA,0xC20FC55C, + 0x3FD7CED9,0x16872B02, 0x3FD7433E,0xF1560D2F, + 0x3FD7DF3B,0x645A1CAC, 0x3FD75281,0x9A53E4E3, + 0x3FD7EF9D,0xB22D0E56, 0x3FD761C2,0xBC094599, + 0x3FD80000,0x00000000, 0x3FD77102,0x55764214, + 0x3FD81062,0x4DD2F1AA, 0x3FD78040,0x659B06CF, + 0x3FD820C4,0x9BA5E354, 0x3FD78F7C,0xEB77DA0A, + 0x3FD83126,0xE978D4FE, 0x3FD79EB7,0xE60D1BDC, + 0x3FD84189,0x374BC6A8, 0x3FD7ADF1,0x545B4644, + 0x3FD851EB,0x851EB852, 0x3FD7BD29,0x3562ED39, + 0x3FD8624D,0xD2F1A9FC, 0x3FD7CC5F,0x8824BEBC, + 0x3FD872B0,0x20C49BA6, 0x3FD7DB94,0x4BA182E6, + 0x3FD88312,0x6E978D50, 0x3FD7EAC7,0x7EDA1BFD, + 0x3FD89374,0xBC6A7EFA, 0x3FD7F9F9,0x20CF8681, + 0x3FD8A3D7,0x0A3D70A4, 0x3FD80929,0x3082D93F, + 0x3FD8B439,0x5810624E, 0x3FD81857,0xACF5455F, + 0x3FD8C49B,0xA5E353F8, 0x3FD82784,0x95281678, + 0x3FD8D4FD,0xF3B645A2, 0x3FD836AF,0xE81CB29F, + 0x3FD8E560,0x4189374C, 0x3FD845D9,0xA4D49A78, + 0x3FD8F5C2,0x8F5C28F6, 0x3FD85501,0xCA516945, + 0x3FD90624,0xDD2F1AA0, 0x3FD86428,0x5794D4FB, + 0x3FD91687,0x2B020C4A, 0x3FD8734D,0x4BA0AE4C, + 0x3FD926E9,0x78D4FDF4, 0x3FD88270,0xA576E0C0, + 0x3FD9374B,0xC6A7EF9E, 0x3FD89192,0x641972BD, + 0x3FD947AE,0x147AE148, 0x3FD8A0B2,0x868A859F, + 0x3FD95810,0x624DD2F2, 0x3FD8AFD1,0x0BCC55C4, + 0x3FD96872,0xB020C49C, 0x3FD8BEED,0xF2E13A9E, + 0x3FD978D4,0xFDF3B646, 0x3FD8CE09,0x3ACBA6C4, + 0x3FD98937,0x4BC6A7F0, 0x3FD8DD22,0xE28E2802, + 0x3FD99999,0x9999999A, 0x3FD8EC3A,0xE92B676B, + 0x3FD9A9FB,0xE76C8B44, 0x3FD8FB51,0x4DA62967, + 0x3FD9BA5E,0x353F7CEE, 0x3FD90A66,0x0F014DC6, + 0x3FD9CAC0,0x83126E98, 0x3FD91979,0x2C3FCFD1, + 0x3FD9DB22,0xD0E56042, 0x3FD9288A,0xA464C656, + 0x3FD9EB85,0x1EB851EC, 0x3FD9379A,0x767363BE, + 0x3FD9FBE7,0x6C8B4396, 0x3FD946A8,0xA16EF61D, + 0x3FDA0C49,0xBA5E353F, 0x3FD955B5,0x245AE73D, + 0x3FDA1CAC,0x083126E9, 0x3FD964BF,0xFE3ABCB8, + 0x3FDA2D0E,0x56041893, 0x3FD973C9,0x2E1217FD, + 0x3FDA3D70,0xA3D70A3D, 0x3FD982D0,0xB2E4B66B, + 0x3FDA4DD2,0xF1A9FBE7, 0x3FD991D6,0x8BB6715B, + 0x3FDA5E35,0x3F7CED91, 0x3FD9A0DA,0xB78B3E34, + 0x3FDA6E97,0x8D4FDF3B, 0x3FD9AFDD,0x35672E7B, + 0x3FDA7EF9,0xDB22D0E5, 0x3FD9BEDE,0x044E6FDF, + 0x3FDA8F5C,0x28F5C28F, 0x3FD9CDDD,0x23454C51, + 0x3FDA9FBE,0x76C8B439, 0x3FD9DCDA,0x91502A0F, + 0x3FDAB020,0xC49BA5E3, 0x3FD9EBD6,0x4D738BB8, + 0x3FDAC083,0x126E978D, 0x3FD9FAD0,0x56B41057, + 0x3FDAD0E5,0x60418937, 0x3FDA09C8,0xAC16737C, + 0x3FDAE147,0xAE147AE1, 0x3FDA18BF,0x4C9F8D43, + 0x3FDAF1A9,0xFBE76C8B, 0x3FDA27B4,0x3754526D, + 0x3FDB020C,0x49BA5E35, 0x3FDA36A7,0x6B39D46A, + 0x3FDB126E,0x978D4FDF, 0x3FDA4598,0xE755416D, + 0x3FDB22D0,0xE5604189, 0x3FDA5488,0xAAABE47B, + 0x3FDB3333,0x33333333, 0x3FDA6376,0xB443257D, + 0x3FDB4395,0x810624DD, 0x3FDA7263,0x0320894E, + 0x3FDB53F7,0xCED91687, 0x3FDA814D,0x9649B1CD, + 0x3FDB645A,0x1CAC0831, 0x3FDA9036,0x6CC45DED, + 0x3FDB74BC,0x6A7EF9DB, 0x3FDA9F1D,0x859669C6, + 0x3FDB851E,0xB851EB85, 0x3FDAAE02,0xDFC5CEA5, + 0x3FDB9581,0x0624DD2F, 0x3FDABCE6,0x7A58A31C, + 0x3FDBA5E3,0x53F7CED9, 0x3FDACBC8,0x54551B12, + 0x3FDBB645,0xA1CAC083, 0x3FDADAA8,0x6CC187D6, + 0x3FDBC6A7,0xEF9DB22D, 0x3FDAE986,0xC2A4582C, + 0x3FDBD70A,0x3D70A3D7, 0x3FDAF863,0x5504185D, + 0x3FDBE76C,0x8B439581, 0x3FDB073E,0x22E7724D, + 0x3FDBF7CE,0xD916872B, 0x3FDB1617,0x2B552D85, + 0x3FDC0831,0x26E978D5, 0x3FDB24EE,0x6D542F46, + 0x3FDC1893,0x74BC6A7F, 0x3FDB33C3,0xE7EB7A99, + 0x3FDC28F5,0xC28F5C29, 0x3FDB4297,0x9A223061, + 0x3FDC3958,0x10624DD3, 0x3FDB5169,0x82FF8F67, + 0x3FDC49BA,0x5E353F7D, 0x3FDB6039,0xA18AF470, + 0x3FDC5A1C,0xAC083127, 0x3FDB6F07,0xF4CBDA48, + 0x3FDC6A7E,0xF9DB22D1, 0x3FDB7DD4,0x7BC9D9D6, + 0x3FDC7AE1,0x47AE147B, 0x3FDB8C9F,0x358CAA2B, + 0x3FDC8B43,0x95810625, 0x3FDB9B68,0x211C2090, + 0x3FDC9BA5,0xE353F7CF, 0x3FDBAA2F,0x3D80309B, + 0x3FDCAC08,0x3126E979, 0x3FDBB8F4,0x89C0EC3C, + 0x3FDCBC6A,0x7EF9DB23, 0x3FDBC7B8,0x04E683CD, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FDBD679,0xADF94625, + 0x3FDCDD2F,0x1A9FBE77, 0x3FDBE539,0x8401A0A4, + 0x3FDCED91,0x6872B021, 0x3FDBF3F7,0x86081F48, + 0x3FDCFDF3,0xB645A1CB, 0x3FDC02B3,0xB3156CB9, + 0x3FDD0E56,0x04189375, 0x3FDC116E,0x0A32525C, + 0x3FDD1EB8,0x51EB851F, 0x3FDC2026,0x8A67B863, + 0x3FDD2F1A,0x9FBE76C9, 0x3FDC2EDD,0x32BEA5DA, + 0x3FDD3F7C,0xED916873, 0x3FDC3D92,0x024040BD, + 0x3FDD4FDF,0x3B645A1D, 0x3FDC4C44,0xF7F5CE02, + 0x3FDD6041,0x89374BC7, 0x3FDC5AF6,0x12E8B1AD, + 0x3FDD70A3,0xD70A3D71, 0x3FDC69A5,0x52226EE0, + 0x3FDD8106,0x24DD2F1B, 0x3FDC7852,0xB4ACA7E9, + 0x3FDD9168,0x72B020C5, 0x3FDC86FE,0x39911E54, + 0x3FDDA1CA,0xC083126F, 0x3FDC95A7,0xDFD9B2FA, + 0x3FDDB22D,0x0E560419, 0x3FDCA44F,0xA6906613, + 0x3FDDC28F,0x5C28F5C3, 0x3FDCB2F5,0x8CBF5745, + 0x3FDDD2F1,0xA9FBE76D, 0x3FDCC199,0x9170C5B2, + 0x3FDDE353,0xF7CED917, 0x3FDCD03B,0xB3AF100B, + 0x3FDDF3B6,0x45A1CAC1, 0x3FDCDEDB,0xF284B49F, + 0x3FDE0418,0x9374BC6A, 0x3FDCED7A,0x4CFC516D, + 0x3FDE147A,0xE147AE14, 0x3FDCFC16,0xC220A430, + 0x3FDE24DD,0x2F1A9FBE, 0x3FDD0AB1,0x50FC8A73, + 0x3FDE353F,0x7CED9168, 0x3FDD1949,0xF89B019E, + 0x3FDE45A1,0xCAC08312, 0x3FDD27E0,0xB8072709, + 0x3FDE5604,0x189374BC, 0x3FDD3675,0x8E4C380A, + 0x3FDE6666,0x66666666, 0x3FDD4508,0x7A759204, + 0x3FDE76C8,0xB4395810, 0x3FDD5399,0x7B8EB27D, + 0x3FDE872B,0x020C49BA, 0x3FDD6228,0x90A33724, + 0x3FDE978D,0x4FDF3B64, 0x3FDD70B5,0xB8BEDDEB, + 0x3FDEA7EF,0x9DB22D0E, 0x3FDD7F40,0xF2ED8511, + 0x3FDEB851,0xEB851EB8, 0x3FDD8DCA,0x3E3B2B35, + 0x3FDEC8B4,0x39581062, 0x3FDD9C51,0x99B3EF61, + 0x3FDED916,0x872B020C, 0x3FDDAAD7,0x04641123, + 0x3FDEE978,0xD4FDF3B6, 0x3FDDB95A,0x7D57F094, + 0x3FDEF9DB,0x22D0E560, 0x3FDDC7DC,0x039C0E6C, + 0x3FDF0A3D,0x70A3D70A, 0x3FDDD65B,0x963D0C13, + 0x3FDF1A9F,0xBE76C8B4, 0x3FDDE4D9,0x3447ABAE, + 0x3FDF2B02,0x0C49BA5E, 0x3FDDF354,0xDCC8D032, + 0x3FDF3B64,0x5A1CAC08, 0x3FDE01CE,0x8ECD7D70, + 0x3FDF4BC6,0xA7EF9DB2, 0x3FDE1046,0x4962D82B, + 0x3FDF5C28,0xF5C28F5C, 0x3FDE1EBC,0x0B962620, + 0x3FDF6C8B,0x43958106, 0x3FDE2D2F,0xD474CE1D, + 0x3FDF7CED,0x916872B0, 0x3FDE3BA1,0xA30C580E, + 0x3FDF8D4F,0xDF3B645A, 0x3FDE4A11,0x766A6D0C, + 0x3FDF9DB2,0x2D0E5604, 0x3FDE587F,0x4D9CD76C, + 0x3FDFAE14,0x7AE147AE, 0x3FDE66EB,0x27B182D6, + 0x3FDFBE76,0xC8B43958, 0x3FDE7555,0x03B67C49, + 0x3FDFCED9,0x16872B02, 0x3FDE83BC,0xE0B9F237, + 0x3FDFDF3B,0x645A1CAC, 0x3FDE9222,0xBDCA348C, + 0x3FDFEF9D,0xB22D0E56, 0x3FDEA086,0x99F5B4C2, + 0x3FE00000,0x00000000, 0x3FDEAEE8,0x744B05F0, + 0x3FE00831,0x26E978D5, 0x3FDEBD48,0x4BD8DCDA, + 0x3FE01062,0x4DD2F1AA, 0x3FDECBA6,0x1FAE0FFF, + 0x3FE01893,0x74BC6A7F, 0x3FDEDA01,0xEED997AD, + 0x3FE020C4,0x9BA5E354, 0x3FDEE85B,0xB86A8E0C, + 0x3FE028F5,0xC28F5C29, 0x3FDEF6B3,0x7B702F32, + 0x3FE03126,0xE978D4FE, 0x3FDF0509,0x36F9D92E, + 0x3FE03958,0x10624DD3, 0x3FDF135C,0xEA170C1C, + 0x3FE04189,0x374BC6A8, 0x3FDF21AE,0x93D76A34, + 0x3FE049BA,0x5E353F7D, 0x3FDF2FFE,0x334AB7D7, + 0x3FE051EB,0x851EB852, 0x3FDF3E4B,0xC780DBA3, + 0x3FE05A1C,0xAC083127, 0x3FDF4C97,0x4F89DE80, + 0x3FE0624D,0xD2F1A9FC, 0x3FDF5AE0,0xCA75EBAF, + 0x3FE06A7E,0xF9DB22D1, 0x3FDF6928,0x375550DB, + 0x3FE072B0,0x20C49BA6, 0x3FDF776D,0x95387E29, + 0x3FE07AE1,0x47AE147B, 0x3FDF85B0,0xE330064A, + 0x3FE08312,0x6E978D50, 0x3FDF93F2,0x204C9E83, + 0x3FE08B43,0x95810625, 0x3FDFA231,0x4B9F1EC6, + 0x3FE09374,0xBC6A7EFA, 0x3FDFB06E,0x643881BB, + 0x3FE09BA5,0xE353F7CF, 0x3FDFBEA9,0x6929E4D2, + 0x3FE0A3D7,0x0A3D70A4, 0x3FDFCCE2,0x59848856, + 0x3FE0AC08,0x3126E979, 0x3FDFDB19,0x3459CF74, + 0x3FE0B439,0x5810624E, 0x3FDFE94D,0xF8BB4055, + 0x3FE0BC6A,0x7EF9DB23, 0x3FDFF780,0xA5BA8426, + 0x3FE0C49B,0xA5E353F8, 0x3FE002D8,0x9D34B395, + 0x3FE0CCCC,0xCCCCCCCD, 0x3FE009EF,0xDAECEC66, + 0x3FE0D4FD,0xF3B645A2, 0x3FE01106,0x0B8EF5D4, + 0x3FE0DD2F,0x1A9FBE77, 0x3FE0181B,0x2EA3EAD3, + 0x3FE0E560,0x4189374C, 0x3FE01F2F,0x43B4F7FE, + 0x3FE0ED91,0x6872B021, 0x3FE02642,0x4A4B5BA4, + 0x3FE0F5C2,0x8F5C28F6, 0x3FE02D54,0x41F065CD, + 0x3FE0FDF3,0xB645A1CB, 0x3FE03465,0x2A2D7844, + 0x3FE10624,0xDD2F1AA0, 0x3FE03B75,0x028C069B, + 0x3FE10E56,0x04189375, 0x3FE04283,0xCA959638, + 0x3FE11687,0x2B020C4A, 0x3FE04991,0x81D3BE58, + 0x3FE11EB8,0x51EB851F, 0x3FE0509E,0x27D0281A, + 0x3FE126E9,0x78D4FDF4, 0x3FE057A9,0xBC148E83, + 0x3FE12F1A,0x9FBE76C9, 0x3FE05EB4,0x3E2ABE8D, + 0x3FE1374B,0xC6A7EF9E, 0x3FE065BD,0xAD9C9724, + 0x3FE13F7C,0xED916873, 0x3FE06CC6,0x09F40939, + 0x3FE147AE,0x147AE148, 0x3FE073CD,0x52BB17C2, + 0x3FE14FDF,0x3B645A1D, 0x3FE07AD3,0x877BD7C3, + 0x3FE15810,0x624DD2F2, 0x3FE081D8,0xA7C0705A, + 0x3FE16041,0x89374BC7, 0x3FE088DC,0xB3131AC2, + 0x3FE16872,0xB020C49C, 0x3FE08FDF,0xA8FE225B, + 0x3FE170A3,0xD70A3D71, 0x3FE096E1,0x890BE4B6, + 0x3FE178D4,0xFDF3B646, 0x3FE09DE2,0x52C6D197, + 0x3FE18106,0x24DD2F1B, 0x3FE0A4E2,0x05B96B02, + 0x3FE18937,0x4BC6A7F0, 0x3FE0ABE0,0xA16E453F, + 0x3FE19168,0x72B020C5, 0x3FE0B2DE,0x257006E1, + 0x3FE19999,0x9999999A, 0x3FE0B9DA,0x914968D4, + 0x3FE1A1CA,0xC083126F, 0x3FE0C0D5,0xE485365C, + 0x3FE1A9FB,0xE76C8B44, 0x3FE0C7D0,0x1EAE4D23, + 0x3FE1B22D,0x0E560419, 0x3FE0CEC9,0x3F4F9D3E, + 0x3FE1BA5E,0x353F7CEE, 0x3FE0D5C1,0x45F42936, + 0x3FE1C28F,0x5C28F5C3, 0x3FE0DCB8,0x3227060F, + 0x3FE1CAC0,0x83126E98, 0x3FE0E3AE,0x03735B4F, + 0x3FE1D2F1,0xA9FBE76D, 0x3FE0EAA2,0xB9646305, + 0x3FE1DB22,0xD0E56042, 0x3FE0F196,0x538569D5, + 0x3FE1E353,0xF7CED917, 0x3FE0F888,0xD161CEFA, + 0x3FE1EB85,0x1EB851EC, 0x3FE0FF7A,0x32850452, + 0x3FE1F3B6,0x45A1CAC1, 0x3FE1066A,0x767A8E63, + 0x3FE1FBE7,0x6C8B4396, 0x3FE10D59,0x9CCE0463, + 0x3FE20418,0x9374BC6A, 0x3FE11447,0xA50B1040, + 0x3FE20C49,0xBA5E353F, 0x3FE11B34,0x8EBD6EAA, + 0x3FE2147A,0xE147AE14, 0x3FE12220,0x5970EF16, + 0x3FE21CAC,0x083126E9, 0x3FE1290B,0x04B173CA, + 0x3FE224DD,0x2F1A9FBE, 0x3FE12FF4,0x900AF1DF, + 0x3FE22D0E,0x56041893, 0x3FE136DC,0xFB097151, + 0x3FE2353F,0x7CED9168, 0x3FE13DC4,0x45390CFD, + 0x3FE23D70,0xA3D70A3D, 0x3FE144AA,0x6E25F2B2, + 0x3FE245A1,0xCAC08312, 0x3FE14B8F,0x755C6331, + 0x3FE24DD2,0xF1A9FBE7, 0x3FE15273,0x5A68B238, + 0x3FE25604,0x189374BC, 0x3FE15956,0x1CD74689, + 0x3FE25E35,0x3F7CED91, 0x3FE16037,0xBC3499F4, + 0x3FE26666,0x66666666, 0x3FE16718,0x380D3959, + 0x3FE26E97,0x8D4FDF3B, 0x3FE16DF7,0x8FEDC4B4, + 0x3FE276C8,0xB4395810, 0x3FE174D5,0xC362EF26, + 0x3FE27EF9,0xDB22D0E5, 0x3FE17BB2,0xD1F97EF6, + 0x3FE2872B,0x020C49BA, 0x3FE1828E,0xBB3E4D9F, + 0x3FE28F5C,0x28F5C28F, 0x3FE18969,0x7EBE47D4, + 0x3FE2978D,0x4FDF3B64, 0x3FE19043,0x1C066D89, + 0x3FE29FBE,0x76C8B439, 0x3FE1971B,0x92A3D1FB, + 0x3FE2A7EF,0x9DB22D0E, 0x3FE19DF2,0xE2239BB5, + 0x3FE2B020,0xC49BA5E3, 0x3FE1A4C9,0x0A13049B, + 0x3FE2B851,0xEB851EB8, 0x3FE1AB9E,0x09FF59EE, + 0x3FE2C083,0x126E978D, 0x3FE1B271,0xE175FC57, + 0x3FE2C8B4,0x39581062, 0x3FE1B944,0x90045FEB, + 0x3FE2D0E5,0x60418937, 0x3FE1C016,0x15380C35, + 0x3FE2D916,0x872B020C, 0x3FE1C6E6,0x709E9C3E, + 0x3FE2E147,0xAE147AE1, 0x3FE1CDB5,0xA1C5BE92, + 0x3FE2E978,0xD4FDF3B6, 0x3FE1D483,0xA83B3548, + 0x3FE2F1A9,0xFBE76C8B, 0x3FE1DB50,0x838CD60C, + 0x3FE2F9DB,0x22D0E560, 0x3FE1E21C,0x33488A24, + 0x3FE3020C,0x49BA5E35, 0x3FE1E8E6,0xB6FC4E78, + 0x3FE30A3D,0x70A3D70A, 0x3FE1EFB0,0x0E36339A, + 0x3FE3126E,0x978D4FDF, 0x3FE1F678,0x38845DCD, + 0x3FE31A9F,0xBE76C8B4, 0x3FE1FD3F,0x3575050D, + 0x3FE322D0,0xE5604189, 0x3FE20405,0x04967515, + 0x3FE32B02,0x0C49BA5E, 0x3FE20AC9,0xA5770D68, + 0x3FE33333,0x33333333, 0x3FE2118D,0x17A54159, + 0x3FE33B64,0x5A1CAC08, 0x3FE2184F,0x5AAF9810, + 0x3FE34395,0x810624DD, 0x3FE21F10,0x6E24AC94, + 0x3FE34BC6,0xA7EF9DB2, 0x3FE225D0,0x51932DD0, + 0x3FE353F7,0xCED91687, 0x3FE22C8F,0x0489DE9D, + 0x3FE35C28,0xF5C28F5C, 0x3FE2334C,0x869795C8, + 0x3FE3645A,0x1CAC0831, 0x3FE23A08,0xD74B3E18, + 0x3FE36C8B,0x43958106, 0x3FE240C3,0xF633D658, + 0x3FE374BC,0x6A7EF9DB, 0x3FE2477D,0xE2E0715F, + 0x3FE37CED,0x916872B0, 0x3FE24E36,0x9CE03613, + 0x3FE3851E,0xB851EB85, 0x3FE254EE,0x23C25F74, + 0x3FE38D4F,0xDF3B645A, 0x3FE25BA4,0x77163CA3, + 0x3FE39581,0x0624DD2F, 0x3FE26259,0x966B30EA, + 0x3FE39DB2,0x2D0E5604, 0x3FE2690D,0x8150B3BF, + 0x3FE3A5E3,0x53F7CED9, 0x3FE26FC0,0x375650D3, + 0x3FE3AE14,0x7AE147AE, 0x3FE27671,0xB80BA812, + 0x3FE3B645,0xA1CAC083, 0x3FE27D22,0x03006DAE, + 0x3FE3BE76,0xC8B43958, 0x3FE283D1,0x17C46A26, + 0x3FE3C6A7,0xEF9DB22D, 0x3FE28A7E,0xF5E77A4D, + 0x3FE3CED9,0x16872B02, 0x3FE2912B,0x9CF98F52, + 0x3FE3D70A,0x3D70A3D7, 0x3FE297D7,0x0C8AAEC7, + 0x3FE3DF3B,0x645A1CAC, 0x3FE29E81,0x442AF2A7, + 0x3FE3E76C,0x8B439581, 0x3FE2A52A,0x436A895F, + 0x3FE3EF9D,0xB22D0E56, 0x3FE2ABD2,0x09D9B5D6, + 0x3FE3F7CE,0xD916872B, 0x3FE2B278,0x9708CF71, + 0x3FE40000,0x00000000, 0x3FE2B91D,0xEA88421E, + 0x3FE40831,0x26E978D5, 0x3FE2BFC2,0x03E88E59, + 0x3FE41062,0x4DD2F1AA, 0x3FE2C664,0xE2BA4935, + 0x3FE41893,0x74BC6A7F, 0x3FE2CD06,0x868E1C62, + 0x3FE420C4,0x9BA5E354, 0x3FE2D3A6,0xEEF4C634, + 0x3FE428F5,0xC28F5C29, 0x3FE2DA46,0x1B7F19AC, + 0x3FE43126,0xE978D4FE, 0x3FE2E0E4,0x0BBDFE7E, + 0x3FE43958,0x10624DD3, 0x3FE2E780,0xBF427117, + 0x3FE44189,0x374BC6A8, 0x3FE2EE1C,0x359D82A8, + 0x3FE449BA,0x5E353F7D, 0x3FE2F4B6,0x6E60592B, + 0x3FE451EB,0x851EB852, 0x3FE2FB4F,0x691C2F68, + 0x3FE45A1C,0xAC083127, 0x3FE301E7,0x25625502, + 0x3FE4624D,0xD2F1A9FC, 0x3FE3087D,0xA2C42E77, + 0x3FE46A7E,0xF9DB22D1, 0x3FE30F12,0xE0D3352F, + 0x3FE472B0,0x20C49BA6, 0x3FE315A6,0xDF20F77C, + 0x3FE47AE1,0x47AE147B, 0x3FE31C39,0x9D3F18A8, + 0x3FE48312,0x6E978D50, 0x3FE322CB,0x1ABF50F5, + 0x3FE48B43,0x95810625, 0x3FE3295B,0x57336DAB, + 0x3FE49374,0xBC6A7EFA, 0x3FE32FEA,0x522D511B, + 0x3FE49BA5,0xE353F7CF, 0x3FE33678,0x0B3EF2A9, + 0x3FE4A3D7,0x0A3D70A4, 0x3FE33D04,0x81FA5ECF, + 0x3FE4AC08,0x3126E979, 0x3FE3438F,0xB5F1B728, + 0x3FE4B439,0x5810624E, 0x3FE34A19,0xA6B73279, + 0x3FE4BC6A,0x7EF9DB23, 0x3FE350A2,0x53DD1CB0, + 0x3FE4C49B,0xA5E353F8, 0x3FE35729,0xBCF5D6F5, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FE35DAF,0xE193D7AB, + 0x3FE4D4FD,0xF3B645A2, 0x3FE36434,0xC149AA79, + 0x3FE4DD2F,0x1A9FBE77, 0x3FE36AB8,0x5BA9F04F, + 0x3FE4E560,0x4189374C, 0x3FE3713A,0xB0475F74, + 0x3FE4ED91,0x6872B021, 0x3FE377BB,0xBEB4C383, + 0x3FE4F5C2,0x8F5C28F6, 0x3FE37E3B,0x8684FD7C, + 0x3FE4FDF3,0xB645A1CB, 0x3FE384BA,0x074B03C3, + 0x3FE50624,0xDD2F1AA0, 0x3FE38B37,0x4099E22D, + 0x3FE50E56,0x04189375, 0x3FE391B3,0x3204BA05, + 0x3FE51687,0x2B020C4A, 0x3FE3982D,0xDB1EC212, + 0x3FE51EB8,0x51EB851F, 0x3FE39EA7,0x3B7B46A0, + 0x3FE526E9,0x78D4FDF4, 0x3FE3A51F,0x52ADA986, + 0x3FE52F1A,0x9FBE76C9, 0x3FE3AB96,0x2049622E, + 0x3FE5374B,0xC6A7EF9E, 0x3FE3B20B,0xA3E1FD9A, + 0x3FE53F7C,0xED916873, 0x3FE3B87F,0xDD0B1E6F, + 0x3FE547AE,0x147AE148, 0x3FE3BEF2,0xCB587CF9, + 0x3FE54FDF,0x3B645A1D, 0x3FE3C564,0x6E5DE731, + 0x3FE55810,0x624DD2F2, 0x3FE3CBD4,0xC5AF40C8, + 0x3FE56041,0x89374BC7, 0x3FE3D243,0xD0E0832C, + 0x3FE56872,0xB020C49C, 0x3FE3D8B1,0x8F85BD8E, + 0x3FE570A3,0xD70A3D71, 0x3FE3DF1E,0x013314EC, + 0x3FE578D4,0xFDF3B646, 0x3FE3E589,0x257CC414, + 0x3FE58106,0x24DD2F1B, 0x3FE3EBF2,0xFBF71BAF, + 0x3FE58937,0x4BC6A7F0, 0x3FE3F25B,0x84368246, + 0x3FE59168,0x72B020C5, 0x3FE3F8C2,0xBDCF744A, + 0x3FE59999,0x9999999A, 0x3FE3FF28,0xA8568418, + 0x3FE5A1CA,0xC083126F, 0x3FE4058D,0x43605A06, + 0x3FE5A9FB,0xE76C8B44, 0x3FE40BF0,0x8E81B464, + 0x3FE5B22D,0x0E560419, 0x3FE41252,0x894F6788, + 0x3FE5BA5E,0x353F7CEE, 0x3FE418B3,0x335E5DD0, + 0x3FE5C28F,0x5C28F5C3, 0x3FE41F12,0x8C4397AD, + 0x3FE5CAC0,0x83126E98, 0x3FE42570,0x93942BA8, + 0x3FE5D2F1,0xA9FBE76D, 0x3FE42BCD,0x48E5466C, + 0x3FE5DB22,0xD0E56042, 0x3FE43228,0xABCC2AC7, + 0x3FE5E353,0xF7CED917, 0x3FE43882,0xBBDE31B7, + 0x3FE5EB85,0x1EB851EC, 0x3FE43EDB,0x78B0CA6E, + 0x3FE5F3B6,0x45A1CAC1, 0x3FE44532,0xE1D97A5B, + 0x3FE5FBE7,0x6C8B4396, 0x3FE44B88,0xF6EDDD2D, + 0x3FE60418,0x9374BC6A, 0x3FE451DD,0xB783A4DE, + 0x3FE60C49,0xBA5E353F, 0x3FE45831,0x233099B9, + 0x3FE6147A,0xE147AE14, 0x3FE45E83,0x398A9A60, + 0x3FE61CAC,0x083126E9, 0x3FE464D3,0xFA279BD4, + 0x3FE624DD,0x2F1A9FBE, 0x3FE46B23,0x649DA97A, + 0x3FE62D0E,0x56041893, 0x3FE47171,0x7882E525, + 0x3FE6353F,0x7CED9168, 0x3FE477BE,0x356D871A, + 0x3FE63D70,0xA3D70A3D, 0x3FE47E09,0x9AF3DE19, + 0x3FE645A1,0xCAC08312, 0x3FE48453,0xA8AC4F63, + 0x3FE64DD2,0xF1A9FBE7, 0x3FE48A9C,0x5E2D56C1, + 0x3FE65604,0x189374BC, 0x3FE490E3,0xBB0D868B, + 0x3FE65E35,0x3F7CED91, 0x3FE49729,0xBEE387AF, + 0x3FE66666,0x66666666, 0x3FE49D6E,0x694619B8, + 0x3FE66E97,0x8D4FDF3B, 0x3FE4A3B1,0xB9CC12D4, + 0x3FE676C8,0xB4395810, 0x3FE4A9F3,0xB00C5FDC, + 0x3FE67EF9,0xDB22D0E5, 0x3FE4B034,0x4B9E045B, + 0x3FE6872B,0x020C49BA, 0x3FE4B673,0x8C181A94, + 0x3FE68F5C,0x28F5C28F, 0x3FE4BCB1,0x7111D388, + 0x3FE6978D,0x4FDF3B64, 0x3FE4C2ED,0xFA227700, + 0x3FE69FBE,0x76C8B439, 0x3FE4C929,0x26E16392, + 0x3FE6A7EF,0x9DB22D0E, 0x3FE4CF62,0xF6E60EA5, + 0x3FE6B020,0xC49BA5E3, 0x3FE4D59B,0x69C8047F, + 0x3FE6B851,0xEB851EB8, 0x3FE4DBD2,0x7F1EE843, + 0x3FE6C083,0x126E978D, 0x3FE4E208,0x36827401, + 0x3FE6C8B4,0x39581062, 0x3FE4E83C,0x8F8A78B4, + 0x3FE6D0E5,0x60418937, 0x3FE4EE6F,0x89CEDE4F, + 0x3FE6D916,0x872B020C, 0x3FE4F4A1,0x24E7A3C2, + 0x3FE6E147,0xAE147AE1, 0x3FE4FAD1,0x606CDF00, + 0x3FE6E978,0xD4FDF3B6, 0x3FE50100,0x3BF6BD07, + 0x3FE6F1A9,0xFBE76C8B, 0x3FE5072D,0xB71D81E7, + 0x3FE6F9DB,0x22D0E560, 0x3FE50D59,0xD17988C6, + 0x3FE7020C,0x49BA5E35, 0x3FE51384,0x8AA343E9, + 0x3FE70A3D,0x70A3D70A, 0x3FE519AD,0xE2333CBE, + 0x3FE7126E,0x978D4FDF, 0x3FE51FD5,0xD7C213DC, + 0x3FE71A9F,0xBE76C8B4, 0x3FE525FC,0x6AE8810E, + 0x3FE722D0,0xE5604189, 0x3FE52C21,0x9B3F535A, + 0x3FE72B02,0x0C49BA5E, 0x3FE53245,0x685F7105, + 0x3FE73333,0x33333333, 0x3FE53867,0xD1E1D79D, + 0x3FE73B64,0x5A1CAC08, 0x3FE53E88,0xD75F9BFE, + 0x3FE74395,0x810624DD, 0x3FE544A8,0x7871EA58, + 0x3FE74BC6,0xA7EF9DB2, 0x3FE54AC6,0xB4B20639, + 0x3FE753F7,0xCED91687, 0x3FE550E3,0x8BB94A8E, + 0x3FE75C28,0xF5C28F5C, 0x3FE556FE,0xFD2129B1, + 0x3FE7645A,0x1CAC0831, 0x3FE55D19,0x08832D68, + 0x3FE76C8B,0x43958106, 0x3FE56331,0xAD78F6F4, + 0x3FE774BC,0x6A7EF9DB, 0x3FE56948,0xEB9C3F0F, + 0x3FE77CED,0x916872B0, 0x3FE56F5E,0xC286D5FA, + 0x3FE7851E,0xB851EB85, 0x3FE57573,0x31D2A380, + 0x3FE78D4F,0xDF3B645A, 0x3FE57B86,0x3919A6FD, + 0x3FE79581,0x0624DD2F, 0x3FE58197,0xD7F5F765, + 0x3FE79DB2,0x2D0E5604, 0x3FE587A8,0x0E01C34B, + 0x3FE7A5E3,0x53F7CED9, 0x3FE58DB6,0xDAD750E8, + 0x3FE7AE14,0x7AE147AE, 0x3FE593C4,0x3E10FE20, + 0x3FE7B645,0xA1CAC083, 0x3FE599D0,0x3749408C, + 0x3FE7BE76,0xC8B43958, 0x3FE59FDA,0xC61AA57B, + 0x3FE7C6A7,0xEF9DB22D, 0x3FE5A5E3,0xEA1FD1FF, + 0x3FE7CED9,0x16872B02, 0x3FE5ABEB,0xA2F382F0, + 0x3FE7D70A,0x3D70A3D7, 0x3FE5B1F1,0xF0308CF4, + 0x3FE7DF3B,0x645A1CAC, 0x3FE5B7F6,0xD171DC82, + 0x3FE7E76C,0x8B439581, 0x3FE5BDFA,0x465275EE, + 0x3FE7EF9D,0xB22D0E56, 0x3FE5C3FC,0x4E6D756F, + 0x3FE7F7CE,0xD916872B, 0x3FE5C9FC,0xE95E0F20, + 0x3FE80000,0x00000000, 0x3FE5CFFC,0x16BF8F0D, + 0x3FE80831,0x26E978D5, 0x3FE5D5F9,0xD62D5937, + 0x3FE81062,0x4DD2F1AA, 0x3FE5DBF6,0x2742E999, + 0x3FE81893,0x74BC6A7F, 0x3FE5E1F1,0x099BD432, + 0x3FE820C4,0x9BA5E354, 0x3FE5E7EA,0x7CD3C508, + 0x3FE828F5,0xC28F5C29, 0x3FE5EDE2,0x80868033, + 0x3FE83126,0xE978D4FE, 0x3FE5F3D9,0x144FE1DE, + 0x3FE83958,0x10624DD3, 0x3FE5F9CE,0x37CBDE53, + 0x3FE84189,0x374BC6A8, 0x3FE5FFC1,0xEA9681FE, + 0x3FE849BA,0x5E353F7D, 0x3FE605B4,0x2C4BF175, + 0x3FE851EB,0x851EB852, 0x3FE60BA4,0xFC88697D, + 0x3FE85A1C,0xAC083127, 0x3FE61194,0x5AE83F14, + 0x3FE8624D,0xD2F1A9FC, 0x3FE61782,0x4707DF72, + 0x3FE86A7E,0xF9DB22D1, 0x3FE61D6E,0xC083D016, + 0x3FE872B0,0x20C49BA6, 0x3FE62359,0xC6F8AEC8, + 0x3FE87AE1,0x47AE147B, 0x3FE62943,0x5A0331A0, + 0x3FE88312,0x6E978D50, 0x3FE62F2B,0x7940270E, + 0x3FE88B43,0x95810625, 0x3FE63512,0x244C75E1, + 0x3FE89374,0xBC6A7EFA, 0x3FE63AF7,0x5AC51D4A, + 0x3FE89BA5,0xE353F7CF, 0x3FE640DB,0x1C4734E7, + 0x3FE8A3D7,0x0A3D70A4, 0x3FE646BD,0x686FECC6, + 0x3FE8AC08,0x3126E979, 0x3FE64C9E,0x3EDC8D6D, + 0x3FE8B439,0x5810624E, 0x3FE6527D,0x9F2A77E1, + 0x3FE8BC6A,0x7EF9DB23, 0x3FE6585B,0x88F725A9, + 0x3FE8C49B,0xA5E353F8, 0x3FE65E37,0xFBE028DB, + 0x3FE8CCCC,0xCCCCCCCD, 0x3FE66412,0xF7832C1B, + 0x3FE8D4FD,0xF3B645A2, 0x3FE669EC,0x7B7DF2A9, + 0x3FE8DD2F,0x1A9FBE77, 0x3FE66FC4,0x876E5860, + 0x3FE8E560,0x4189374C, 0x3FE6759B,0x1AF251C0, + 0x3FE8ED91,0x6872B021, 0x3FE67B70,0x35A7EBF8, + 0x3FE8F5C2,0x8F5C28F6, 0x3FE68143,0xD72D4CE4, + 0x3FE8FDF3,0xB645A1CB, 0x3FE68715,0xFF20B31C, + 0x3FE90624,0xDD2F1AA0, 0x3FE68CE6,0xAD2075F5, + 0x3FE90E56,0x04189375, 0x3FE692B5,0xE0CB0587, + 0x3FE91687,0x2B020C4A, 0x3FE69883,0x99BEEABA, + 0x3FE91EB8,0x51EB851F, 0x3FE69E4F,0xD79AC743, + 0x3FE926E9,0x78D4FDF4, 0x3FE6A41A,0x99FD55B2, + 0x3FE92F1A,0x9FBE76C9, 0x3FE6A9E3,0xE0856975, + 0x3FE9374B,0xC6A7EF9E, 0x3FE6AFAB,0xAAD1EEDF, + 0x3FE93F7C,0xED916873, 0x3FE6B571,0xF881EB2C, + 0x3FE947AE,0x147AE148, 0x3FE6BB36,0xC9347C8E, + 0x3FE94FDF,0x3B645A1D, 0x3FE6C0FA,0x1C88DA2B, + 0x3FE95810,0x624DD2F2, 0x3FE6C6BB,0xF21E5429, + 0x3FE96041,0x89374BC7, 0x3FE6CC7C,0x499453B2, + 0x3FE96872,0xB020C49C, 0x3FE6D23B,0x228A5AFC, + 0x3FE970A3,0xD70A3D71, 0x3FE6D7F8,0x7CA0054E, + 0x3FE978D4,0xFDF3B646, 0x3FE6DDB4,0x57750704, + 0x3FE98106,0x24DD2F1B, 0x3FE6E36E,0xB2A92D9D, + 0x3FE98937,0x4BC6A7F0, 0x3FE6E927,0x8DDC5FB7, + 0x3FE99168,0x72B020C5, 0x3FE6EEDE,0xE8AE9D1E, + 0x3FE99999,0x9999999A, 0x3FE6F494,0xC2BFFECD, + 0x3FE9A1CA,0xC083126F, 0x3FE6FA49,0x1BB0B6F7, + 0x3FE9A9FB,0xE76C8B44, 0x3FE6FFFB,0xF321110D, + 0x3FE9B22D,0x0E560419, 0x3FE705AD,0x48B171C2, + 0x3FE9BA5E,0x353F7CEE, 0x3FE70B5D,0x1C025713, + 0x3FE9C28F,0x5C28F5C3, 0x3FE7110B,0x6CB4584E, + 0x3FE9CAC0,0x83126E98, 0x3FE716B8,0x3A682619, + 0x3FE9D2F1,0xA9FBE76D, 0x3FE71C63,0x84BE8A72, + 0x3FE9DB22,0xD0E56042, 0x3FE7220D,0x4B5868C0, + 0x3FE9E353,0xF7CED917, 0x3FE727B5,0x8DD6BDCD, + 0x3FE9EB85,0x1EB851EC, 0x3FE72D5C,0x4BDA9FD7, + 0x3FE9F3B6,0x45A1CAC1, 0x3FE73301,0x85053E8F, + 0x3FE9FBE7,0x6C8B4396, 0x3FE738A5,0x38F7E324, + 0x3FEA0418,0x9374BC6A, 0x3FE73E47,0x6753F043, + 0x3FEA0C49,0xBA5E353F, 0x3FE743E8,0x0FBAE227, + 0x3FEA147A,0xE147AE14, 0x3FE74987,0x31CE4E95, + 0x3FEA1CAC,0x083126E9, 0x3FE74F24,0xCD2FE4E8, + 0x3FEA24DD,0x2F1A9FBE, 0x3FE754C0,0xE1816E16, + 0x3FEA2D0E,0x56041893, 0x3FE75A5B,0x6E64CCB4, + 0x3FEA353F,0x7CED9168, 0x3FE75FF4,0x737BFD01, + 0x3FEA3D70,0xA3D70A3D, 0x3FE7658B,0xF06914E8, + 0x3FEA45A1,0xCAC08312, 0x3FE76B21,0xE4CE4408, + 0x3FEA4DD2,0xF1A9FBE7, 0x3FE770B6,0x504DD3B7, + 0x3FEA5604,0x189374BC, 0x3FE77649,0x328A270E, + 0x3FEA5E35,0x3F7CED91, 0x3FE77BDA,0x8B25BAEB, + 0x3FEA6666,0x66666666, 0x3FE7816A,0x59C325F7, + 0x3FEA6E97,0x8D4FDF3B, 0x3FE786F8,0x9E0518AD, + 0x3FEA76C8,0xB4395810, 0x3FE78C85,0x578E5D61, + 0x3FEA7EF9,0xDB22D0E5, 0x3FE79210,0x8601D846, + 0x3FEA872B,0x020C49BA, 0x3FE7979A,0x29028772, + 0x3FEA8F5C,0x28F5C28F, 0x3FE79D22,0x403382E6, + 0x3FEA978D,0x4FDF3B64, 0x3FE7A2A8,0xCB37FC95, + 0x3FEA9FBE,0x76C8B439, 0x3FE7A82D,0xC9B34065, + 0x3FEAA7EF,0x9DB22D0E, 0x3FE7ADB1,0x3B48B43E, + 0x3FEAB020,0xC49BA5E3, 0x3FE7B333,0x1F9BD806, + 0x3FEAB851,0xEB851EB8, 0x3FE7B8B3,0x765045AE, + 0x3FEAC083,0x126E978D, 0x3FE7BE32,0x3F09B137, + 0x3FEAC8B4,0x39581062, 0x3FE7C3AF,0x796BE8B5, + 0x3FEAD0E5,0x60418937, 0x3FE7C92B,0x251AD459, + 0x3FEAD916,0x872B020C, 0x3FE7CEA5,0x41BA7673, + 0x3FEAE147,0xAE147AE1, 0x3FE7D41D,0xCEEEEB7B, + 0x3FEAE978,0xD4FDF3B6, 0x3FE7D994,0xCC5C6A17, + 0x3FEAF1A9,0xFBE76C8B, 0x3FE7DF0A,0x39A7431F, + 0x3FEAF9DB,0x22D0E560, 0x3FE7E47E,0x1673E1A5, + 0x3FEB020C,0x49BA5E35, 0x3FE7E9F0,0x6266CAF9, + 0x3FEB0A3D,0x70A3D70A, 0x3FE7EF61,0x1D249EB1, + 0x3FEB126E,0x978D4FDF, 0x3FE7F4D0,0x465216AF, + 0x3FEB1A9F,0xBE76C8B4, 0x3FE7FA3D,0xDD940724, + 0x3FEB22D0,0xE5604189, 0x3FE7FFA9,0xE28F5E99, + 0x3FEB2B02,0x0C49BA5E, 0x3FE80514,0x54E925F6, + 0x3FEB3333,0x33333333, 0x3FE80A7D,0x34468083, + 0x3FEB3B64,0x5A1CAC08, 0x3FE80FE4,0x804CABF2, + 0x3FEB4395,0x810624DD, 0x3FE8154A,0x38A10066, + 0x3FEB4BC6,0xA7EF9DB2, 0x3FE81AAE,0x5CE8F073, + 0x3FEB53F7,0xCED91687, 0x3FE82010,0xECCA092C, + 0x3FEB5C28,0xF5C28F5C, 0x3FE82571,0xE7E9F221, + 0x3FEB645A,0x1CAC0831, 0x3FE82AD1,0x4DEE6D6B, + 0x3FEB6C8B,0x43958106, 0x3FE8302F,0x1E7D57AE, + 0x3FEB74BC,0x6A7EF9DB, 0x3FE8358B,0x593CA823, + 0x3FEB7CED,0x916872B0, 0x3FE83AE5,0xFDD27099, + 0x3FEB851E,0xB851EB85, 0x3FE8403F,0x0BE4DD7E, + 0x3FEB8D4F,0xDF3B645A, 0x3FE84596,0x831A35E4, + 0x3FEB9581,0x0624DD2F, 0x3FE84AEC,0x6318DB87, + 0x3FEB9DB2,0x2D0E5604, 0x3FE85040,0xAB874AD4, + 0x3FEBA5E3,0x53F7CED9, 0x3FE85593,0x5C0C1AEC, + 0x3FEBAE14,0x7AE147AE, 0x3FE85AE4,0x744DFDAD, + 0x3FEBB645,0xA1CAC083, 0x3FE86033,0xF3F3BFB6, + 0x3FEBBE76,0xC8B43958, 0x3FE86581,0xDAA4486D, + 0x3FEBC6A7,0xEF9DB22D, 0x3FE86ACE,0x28069A06, + 0x3FEBCED9,0x16872B02, 0x3FE87018,0xDBC1D187, + 0x3FEBD70A,0x3D70A3D7, 0x3FE87561,0xF57D26D0, + 0x3FEBDF3B,0x645A1CAC, 0x3FE87AA9,0x74DFEC9F, + 0x3FEBE76C,0x8B439581, 0x3FE87FEF,0x59919096, + 0x3FEBEF9D,0xB22D0E56, 0x3FE88533,0xA3399B42, + 0x3FEBF7CE,0xD916872B, 0x3FE88A76,0x517FB01F, + 0x3FEC0000,0x00000000, 0x3FE88FB7,0x640B8DA2, + 0x3FEC0831,0x26E978D5, 0x3FE894F6,0xDA850D37, + 0x3FEC1062,0x4DD2F1AA, 0x3FE89A34,0xB494234E, + 0x3FEC1893,0x74BC6A7F, 0x3FE89F70,0xF1E0DF5F, + 0x3FEC20C4,0x9BA5E354, 0x3FE8A4AB,0x92136BEE, + 0x3FEC28F5,0xC28F5C29, 0x3FE8A9E4,0x94D40E90, + 0x3FEC3126,0xE978D4FE, 0x3FE8AF1B,0xF9CB27F5, + 0x3FEC3958,0x10624DD3, 0x3FE8B451,0xC0A133EA, + 0x3FEC4189,0x374BC6A8, 0x3FE8B985,0xE8FEC961, + 0x3FEC49BA,0x5E353F7D, 0x3FE8BEB8,0x728C9A73, + 0x3FEC51EB,0x851EB852, 0x3FE8C3E9,0x5CF3746C, + 0x3FEC5A1C,0xAC083127, 0x3FE8C918,0xA7DC3FCB, + 0x3FEC624D,0xD2F1A9FC, 0x3FE8CE46,0x52F00049, + 0x3FEC6A7E,0xF9DB22D1, 0x3FE8D372,0x5DD7D4E1, + 0x3FEC72B0,0x20C49BA6, 0x3FE8D89C,0xC83CF7D5, + 0x3FEC7AE1,0x47AE147B, 0x3FE8DDC5,0x91C8BEB0, + 0x3FEC8312,0x6E978D50, 0x3FE8E2EC,0xBA249A52, + 0x3FEC8B43,0x95810625, 0x3FE8E812,0x40FA16EF, + 0x3FEC9374,0xBC6A7EFA, 0x3FE8ED36,0x25F2DC1A, + 0x3FEC9BA5,0xE353F7CF, 0x3FE8F258,0x68B8ACC8, + 0x3FECA3D7,0x0A3D70A4, 0x3FE8F779,0x08F56756, + 0x3FECAC08,0x3126E979, 0x3FE8FC98,0x0653058F, + 0x3FECB439,0x5810624E, 0x3FE901B5,0x607B9CB2, + 0x3FECBC6A,0x7EF9DB23, 0x3FE906D1,0x17195D76, + 0x3FECC49B,0xA5E353F8, 0x3FE90BEB,0x29D69412, + 0x3FECCCCC,0xCCCCCCCD, 0x3FE91103,0x985DA841, + 0x3FECD4FD,0xF3B645A2, 0x3FE9161A,0x62591D47, + 0x3FECDD2F,0x1A9FBE77, 0x3FE91B2F,0x877391F9, + 0x3FECE560,0x4189374C, 0x3FE92043,0x0757C0C0, + 0x3FECED91,0x6872B021, 0x3FE92554,0xE1B07FA0, + 0x3FECF5C2,0x8F5C28F6, 0x3FE92A65,0x1628C03F, + 0x3FECFDF3,0xB645A1CB, 0x3FE92F73,0xA46B8FE6, + 0x3FED0624,0xDD2F1AA0, 0x3FE93480,0x8C24178C, + 0x3FED0E56,0x04189375, 0x3FE9398B,0xCCFD9BD8, + 0x3FED1687,0x2B020C4A, 0x3FE93E95,0x66A37D27, + 0x3FED1EB8,0x51EB851F, 0x3FE9439D,0x58C13794, + 0x3FED26E9,0x78D4FDF4, 0x3FE948A3,0xA30262F9, + 0x3FED2F1A,0x9FBE76C9, 0x3FE94DA8,0x4512B2FA, + 0x3FED374B,0xC6A7EF9E, 0x3FE952AB,0x3E9DF706, + 0x3FED3F7C,0xED916873, 0x3FE957AC,0x8F501A5F, + 0x3FED47AE,0x147AE148, 0x3FE95CAC,0x36D5241F, + 0x3FED4FDF,0x3B645A1D, 0x3FE961AA,0x34D9373B, + 0x3FED5810,0x624DD2F2, 0x3FE966A6,0x8908928E, + 0x3FED6041,0x89374BC7, 0x3FE96BA1,0x330F90D9, + 0x3FED6872,0xB020C49C, 0x3FE9709A,0x329AA8CC, + 0x3FED70A3,0xD70A3D71, 0x3FE97591,0x87566D0A, + 0x3FED78D4,0xFDF3B646, 0x3FE97A87,0x30EF8C2E, + 0x3FED8106,0x24DD2F1B, 0x3FE97F7B,0x2F12D0D2, + 0x3FED8937,0x4BC6A7F0, 0x3FE9846D,0x816D2193, + 0x3FED9168,0x72B020C5, 0x3FE9895E,0x27AB8116, + 0x3FED9999,0x9999999A, 0x3FE98E4D,0x217B0E12, + 0x3FEDA1CA,0xC083126F, 0x3FE9933A,0x6E89034D, + 0x3FEDA9FB,0xE76C8B44, 0x3FE99826,0x0E82B7AB, + 0x3FEDB22D,0x0E560419, 0x3FE99D10,0x01159E2C, + 0x3FEDBA5E,0x353F7CEE, 0x3FE9A1F8,0x45EF45F5, + 0x3FEDC28F,0x5C28F5C3, 0x3FE9A6DE,0xDCBD5A54, + 0x3FEDCAC0,0x83126E98, 0x3FE9ABC3,0xC52DA2C6, + 0x3FEDD2F1,0xA9FBE76D, 0x3FE9B0A6,0xFEEE02FE, + 0x3FEDDB22,0xD0E56042, 0x3FE9B588,0x89AC7AE7, + 0x3FEDE353,0xF7CED917, 0x3FE9BA68,0x651726AB, + 0x3FEDEB85,0x1EB851EC, 0x3FE9BF46,0x90DC3EB9, + 0x3FEDF3B6,0x45A1CAC1, 0x3FE9C423,0x0CAA17CA, + 0x3FEDFBE7,0x6C8B4396, 0x3FE9C8FD,0xD82F22E7, + 0x3FEE0418,0x9374BC6A, 0x3FE9CDD6,0xF319ED6B, + 0x3FEE0C49,0xBA5E353F, 0x3FE9D2AE,0x5D19210E, + 0x3FEE147A,0xE147AE14, 0x3FE9D784,0x15DB83E4, + 0x3FEE1CAC,0x083126E9, 0x3FE9DC58,0x1D0FF869, + 0x3FEE24DD,0x2F1A9FBE, 0x3FE9E12A,0x72657D80, + 0x3FEE2D0E,0x56041893, 0x3FE9E5FB,0x158B2E7B, + 0x3FEE353F,0x7CED9168, 0x3FE9EACA,0x06304324, + 0x3FEE3D70,0xA3D70A3D, 0x3FE9EF97,0x44040FBA, + 0x3FEE45A1,0xCAC08312, 0x3FE9F462,0xCEB604FF, + 0x3FEE4DD2,0xF1A9FBE7, 0x3FE9F92C,0xA5F5B037, + 0x3FEE5604,0x189374BC, 0x3FE9FDF4,0xC972BB30, + 0x3FEE5E35,0x3F7CED91, 0x3FEA02BB,0x38DCEC48, + 0x3FEE6666,0x66666666, 0x3FEA077F,0xF3E4266F, + 0x3FEE6E97,0x8D4FDF3B, 0x3FEA0C42,0xFA386930, + 0x3FEE76C8,0xB4395810, 0x3FEA1104,0x4B89D0B4, + 0x3FEE7EF9,0xDB22D0E5, 0x3FEA15C3,0xE78895C8, + 0x3FEE872B,0x020C49BA, 0x3FEA1A81,0xCDE50DE2, + 0x3FEE8F5C,0x28F5C28F, 0x3FEA1F3D,0xFE4FAB27, + 0x3FEE978D,0x4FDF3B64, 0x3FEA23F8,0x7878FC6E, + 0x3FEE9FBE,0x76C8B439, 0x3FEA28B1,0x3C11AD47, + 0x3FEEA7EF,0x9DB22D0E, 0x3FEA2D68,0x48CA8602, + 0x3FEEB020,0xC49BA5E3, 0x3FEA321D,0x9E546BAF, + 0x3FEEB851,0xEB851EB8, 0x3FEA36D1,0x3C606028, + 0x3FEEC083,0x126E978D, 0x3FEA3B83,0x229F8214, + 0x3FEEC8B4,0x39581062, 0x3FEA4033,0x50C30CEE, + 0x3FEED0E5,0x60418937, 0x3FEA44E1,0xC67C5907, + 0x3FEED916,0x872B020C, 0x3FEA498E,0x837CDB8C, + 0x3FEEE147,0xAE147AE1, 0x3FEA4E39,0x87762690, + 0x3FEEE978,0xD4FDF3B6, 0x3FEA52E2,0xD219E90A, + 0x3FEEF1A9,0xFBE76C8B, 0x3FEA578A,0x6319EEDD, + 0x3FEEF9DB,0x22D0E560, 0x3FEA5C30,0x3A2820E1, + 0x3FEF020C,0x49BA5E35, 0x3FEA60D4,0x56F684E0, + 0x3FEF0A3D,0x70A3D70A, 0x3FEA6576,0xB9373DA3, + 0x3FEF126E,0x978D4FDF, 0x3FEA6A17,0x609C8AF3, + 0x3FEF1A9F,0xBE76C8B4, 0x3FEA6EB6,0x4CD8C99E, + 0x3FEF22D0,0xE5604189, 0x3FEA7353,0x7D9E737E, + 0x3FEF2B02,0x0C49BA5E, 0x3FEA77EE,0xF2A01F7E, + 0x3FEF3333,0x33333333, 0x3FEA7C88,0xAB90819B, + 0x3FEF3B64,0x5A1CAC08, 0x3FEA8120,0xA8226AEF, + 0x3FEF4395,0x810624DD, 0x3FEA85B6,0xE808C9B3, + 0x3FEF4BC6,0xA7EF9DB2, 0x3FEA8A4B,0x6AF6A943, + 0x3FEF53F7,0xCED91687, 0x3FEA8EDE,0x309F3225, + 0x3FEF5C28,0xF5C28F5C, 0x3FEA936F,0x38B5AA0E, + 0x3FEF645A,0x1CAC0831, 0x3FEA97FE,0x82ED73E6, + 0x3FEF6C8B,0x43958106, 0x3FEA9C8C,0x0EFA0FCD, + 0x3FEF74BC,0x6A7EF9DB, 0x3FEAA117,0xDC8F1B21, + 0x3FEF7CED,0x916872B0, 0x3FEAA5A1,0xEB605083, + 0x3FEF851E,0xB851EB85, 0x3FEAAA2A,0x3B2187DA, + 0x3FEF8D4F,0xDF3B645A, 0x3FEAAEB0,0xCB86B65A, + 0x3FEF9581,0x0624DD2F, 0x3FEAB335,0x9C43EE8A, + 0x3FEF9DB2,0x2D0E5604, 0x3FEAB7B8,0xAD0D6045, + 0x3FEFA5E3,0x53F7CED9, 0x3FEABC39,0xFD9758C4, + 0x3FEFAE14,0x7AE147AE, 0x3FEAC0B9,0x8D96429D, + 0x3FEFB645,0xA1CAC083, 0x3FEAC537,0x5CBEA5CE, + 0x3FEFBE76,0xC8B43958, 0x3FEAC9B3,0x6AC527BF, + 0x3FEFC6A7,0xEF9DB22D, 0x3FEACE2D,0xB75E8B46, + 0x3FEFCED9,0x16872B02, 0x3FEAD2A6,0x423FB0AF, + 0x3FEFD70A,0x3D70A3D7, 0x3FEAD71D,0x0B1D95BC, + 0x3FEFDF3B,0x645A1CAC, 0x3FEADB92,0x11AD55AF, + 0x3FEFE76C,0x8B439581, 0x3FEAE005,0x55A4294E, + 0x3FEFEF9D,0xB22D0E56, 0x3FEAE476,0xD6B766E4, + 0x3FEFF7CE,0xD916872B, 0x3FEAE8E6,0x949C824C, + 0x3FF00000,0x00000000, 0x3FEAED54,0x8F090CEE, + 0x3FF00418,0x9374BC6A, 0x3FEAF1C0,0xC5B2B5CC, + 0x3FF00831,0x26E978D5, 0x3FEAF62B,0x384F4984, + 0x3FF00C49,0xBA5E353F, 0x3FEAFA93,0xE694B251, + 0x3FF01062,0x4DD2F1AA, 0x3FEAFEFA,0xD038F814, + 0x3FF0147A,0xE147AE14, 0x3FEB035F,0xF4F24059, + 0x3FF01893,0x74BC6A7F, 0x3FEB07C3,0x5476CE5C, + 0x3FF01CAC,0x083126E9, 0x3FEB0C24,0xEE7D0306, + 0x3FF020C4,0x9BA5E354, 0x3FEB1084,0xC2BB5D02, + 0x3FF024DD,0x2F1A9FBE, 0x3FEB14E2,0xD0E878B0, + 0x3FF028F5,0xC28F5C29, 0x3FEB193F,0x18BB1036, + 0x3FF02D0E,0x56041893, 0x3FEB1D99,0x99E9FB7F, + 0x3FF03126,0xE978D4FE, 0x3FEB21F2,0x542C3045, + 0x3FF0353F,0x7CED9168, 0x3FEB2649,0x4738C20D, + 0x3FF03958,0x10624DD3, 0x3FEB2A9E,0x72C6E236, + 0x3FF03D70,0xA3D70A3D, 0x3FEB2EF1,0xD68DDFF6, + 0x3FF04189,0x374BC6A8, 0x3FEB3343,0x72452863, + 0x3FF045A1,0xCAC08312, 0x3FEB3793,0x45A44675, + 0x3FF049BA,0x5E353F7D, 0x3FEB3BE1,0x5062E30F, + 0x3FF04DD2,0xF1A9FBE7, 0x3FEB402D,0x9238C4FE, + 0x3FF051EB,0x851EB852, 0x3FEB4478,0x0ADDD103, + 0x3FF05604,0x189374BC, 0x3FEB48C0,0xBA0A09D2, + 0x3FF05A1C,0xAC083127, 0x3FEB4D07,0x9F75901E, + 0x3FF05E35,0x3F7CED91, 0x3FEB514C,0xBAD8A298, + 0x3FF0624D,0xD2F1A9FC, 0x3FEB5590,0x0BEB9DF6, + 0x3FF06666,0x66666666, 0x3FEB59D1,0x9266FCF5, + 0x3FF06A7E,0xF9DB22D1, 0x3FEB5E11,0x4E035864, + 0x3FF06E97,0x8D4FDF3B, 0x3FEB624F,0x3E796721, + 0x3FF072B0,0x20C49BA6, 0x3FEB668B,0x6381FE24, + 0x3FF076C8,0xB4395810, 0x3FEB6AC5,0xBCD6107D, + 0x3FF07AE1,0x47AE147B, 0x3FEB6EFE,0x4A2EAF62, + 0x3FF07EF9,0xDB22D0E5, 0x3FEB7335,0x0B450A29, + 0x3FF08312,0x6E978D50, 0x3FEB7769,0xFFD26E56, + 0x3FF0872B,0x020C49BA, 0x3FEB7B9D,0x27904798, + 0x3FF08B43,0x95810625, 0x3FEB7FCE,0x82381FD5, + 0x3FF08F5C,0x28F5C28F, 0x3FEB83FE,0x0F839F26, + 0x3FF09374,0xBC6A7EFA, 0x3FEB882B,0xCF2C8BE5, + 0x3FF0978D,0x4FDF3B64, 0x3FEB8C57,0xC0ECCAA8, + 0x3FF09BA5,0xE353F7CF, 0x3FEB9081,0xE47E5E51, + 0x3FF09FBE,0x76C8B439, 0x3FEB94AA,0x399B6806, + 0x3FF0A3D7,0x0A3D70A4, 0x3FEB98D0,0xBFFE273F, + 0x3FF0A7EF,0x9DB22D0E, 0x3FEB9CF5,0x7760F9C6, + 0x3FF0AC08,0x3126E979, 0x3FEBA118,0x5F7E5BBE, + 0x3FF0B020,0xC49BA5E3, 0x3FEBA539,0x7810E7A5, + 0x3FF0B439,0x5810624E, 0x3FEBA958,0xC0D3565D, + 0x3FF0B851,0xEB851EB8, 0x3FEBAD76,0x39807F27, + 0x3FF0BC6A,0x7EF9DB23, 0x3FEBB191,0xE1D357B6, + 0x3FF0C083,0x126E978D, 0x3FEBB5AB,0xB986F426, + 0x3FF0C49B,0xA5E353F8, 0x3FEBB9C3,0xC0568708, + 0x3FF0C8B4,0x39581062, 0x3FEBBDD9,0xF5FD6165, + 0x3FF0CCCC,0xCCCCCCCD, 0x3FEBC1EE,0x5A36F2C1, + 0x3FF0D0E5,0x60418937, 0x3FEBC600,0xECBEC920, + 0x3FF0D4FD,0xF3B645A2, 0x3FEBCA11,0xAD50910E, + 0x3FF0D916,0x872B020C, 0x3FEBCE20,0x9BA8159C, + 0x3FF0DD2F,0x1A9FBE77, 0x3FEBD22D,0xB781406F, + 0x3FF0E147,0xAE147AE1, 0x3FEBD639,0x009819B8, + 0x3FF0E560,0x4189374C, 0x3FEBDA42,0x76A8C845, + 0x3FF0E978,0xD4FDF3B6, 0x3FEBDE4A,0x196F9179, + 0x3FF0ED91,0x6872B021, 0x3FEBE24F,0xE8A8D95D, + 0x3FF0F1A9,0xFBE76C8B, 0x3FEBE653,0xE411229A, + 0x3FF0F5C2,0x8F5C28F6, 0x3FEBEA56,0x0B650E83, + 0x3FF0F9DB,0x22D0E560, 0x3FEBEE56,0x5E615D18, + 0x3FF0FDF3,0xB645A1CB, 0x3FEBF254,0xDCC2ED0C, + 0x3FF1020C,0x49BA5E35, 0x3FEBF651,0x8646BBC4, + 0x3FF10624,0xDD2F1AA0, 0x3FEBFA4C,0x5AA9E564, + 0x3FF10A3D,0x70A3D70A, 0x3FEBFE45,0x59A9A4CB, + 0x3FF10E56,0x04189375, 0x3FEC023C,0x8303539E, + 0x3FF1126E,0x978D4FDF, 0x3FEC0631,0xD6746A45, + 0x3FF11687,0x2B020C4A, 0x3FEC0A25,0x53BA7FFA, + 0x3FF11A9F,0xBE76C8B4, 0x3FEC0E16,0xFA934AC1, + 0x3FF11EB8,0x51EB851F, 0x3FEC1206,0xCABC9F77, + 0x3FF122D0,0xE5604189, 0x3FEC15F4,0xC3F471CE, + 0x3FF126E9,0x78D4FDF4, 0x3FEC19E0,0xE5F8D459, + 0x3FF12B02,0x0C49BA5E, 0x3FEC1DCB,0x3087F889, + 0x3FF12F1A,0x9FBE76C9, 0x3FEC21B3,0xA3602EB7, + 0x3FF13333,0x33333333, 0x3FEC259A,0x3E3FE625, + 0x3FF1374B,0xC6A7EF9E, 0x3FEC297F,0x00E5AD04, + 0x3FF13B64,0x5A1CAC08, 0x3FEC2D61,0xEB103077, + 0x3FF13F7C,0xED916873, 0x3FEC3142,0xFC7E3C99, + 0x3FF14395,0x810624DD, 0x3FEC3522,0x34EEBC7D, + 0x3FF147AE,0x147AE148, 0x3FEC38FF,0x9420BA3B, + 0x3FF14BC6,0xA7EF9DB2, 0x3FEC3CDB,0x19D35EE9, + 0x3FF14FDF,0x3B645A1D, 0x3FEC40B4,0xC5C5F2AA, + 0x3FF153F7,0xCED91687, 0x3FEC448C,0x97B7DCA8, + 0x3FF15810,0x624DD2F2, 0x3FEC4862,0x8F68A322, + 0x3FF15C28,0xF5C28F5C, 0x3FEC4C36,0xAC97EB6A, + 0x3FF16041,0x89374BC7, 0x3FEC5008,0xEF0579EA, + 0x3FF1645A,0x1CAC0831, 0x3FEC53D9,0x5671322A, + 0x3FF16872,0xB020C49C, 0x3FEC57A7,0xE29B16D4, + 0x3FF16C8B,0x43958106, 0x3FEC5B74,0x934349B5, + 0x3FF170A3,0xD70A3D71, 0x3FEC5F3F,0x682A0BC7, + 0x3FF174BC,0x6A7EF9DB, 0x3FEC6308,0x610FBD2F, + 0x3FF178D4,0xFDF3B646, 0x3FEC66CF,0x7DB4DD46, + 0x3FF17CED,0x916872B0, 0x3FEC6A94,0xBDDA0A99, + 0x3FF18106,0x24DD2F1B, 0x3FEC6E58,0x214002F3, + 0x3FF1851E,0xB851EB85, 0x3FEC7219,0xA7A7A359, + 0x3FF18937,0x4BC6A7F0, 0x3FEC75D9,0x50D1E817, + 0x3FF18D4F,0xDF3B645A, 0x3FEC7997,0x1C7FECBB, + 0x3FF19168,0x72B020C5, 0x3FEC7D53,0x0A72EC23, + 0x3FF19581,0x0624DD2F, 0x3FEC810D,0x1A6C4078, + 0x3FF19999,0x9999999A, 0x3FEC84C5,0x4C2D6338, + 0x3FF19DB2,0x2D0E5604, 0x3FEC887B,0x9F77ED36, + 0x3FF1A1CA,0xC083126F, 0x3FEC8C30,0x140D96A6, + 0x3FF1A5E3,0x53F7CED9, 0x3FEC8FE2,0xA9B03713, + 0x3FF1A9FB,0xE76C8B44, 0x3FEC9393,0x6021C573, + 0x3FF1AE14,0x7AE147AE, 0x3FEC9742,0x3724581E, + 0x3FF1B22D,0x0E560419, 0x3FEC9AEF,0x2E7A24DC, + 0x3FF1B645,0xA1CAC083, 0x3FEC9E9A,0x45E580E1, + 0x3FF1BA5E,0x353F7CEE, 0x3FECA243,0x7D28E0D7, + 0x3FF1BE76,0xC8B43958, 0x3FECA5EA,0xD406D8DE, + 0x3FF1C28F,0x5C28F5C3, 0x3FECA990,0x4A421C93, + 0x3FF1C6A7,0xEF9DB22D, 0x3FECAD33,0xDF9D7F12, + 0x3FF1CAC0,0x83126E98, 0x3FECB0D5,0x93DBF2FC, + 0x3FF1CED9,0x16872B02, 0x3FECB475,0x66C08A77, + 0x3FF1D2F1,0xA9FBE76D, 0x3FECB813,0x580E7738, + 0x3FF1D70A,0x3D70A3D7, 0x3FECBBAF,0x67890A81, + 0x3FF1DB22,0xD0E56042, 0x3FECBF49,0x94F3B52A, + 0x3FF1DF3B,0x645A1CAC, 0x3FECC2E1,0xE012079F, + 0x3FF1E353,0xF7CED917, 0x3FECC678,0x48A7B1EE, + 0x3FF1E76C,0x8B439581, 0x3FECCA0C,0xCE7883BE, + 0x3FF1EB85,0x1EB851EC, 0x3FECCD9F,0x71486C5E, + 0x3FF1EF9D,0xB22D0E56, 0x3FECD130,0x30DB7AC0, + 0x3FF1F3B6,0x45A1CAC1, 0x3FECD4BF,0x0CF5DD87, + 0x3FF1F7CE,0xD916872B, 0x3FECD84C,0x055BE300, + 0x3FF1FBE7,0x6C8B4396, 0x3FECDBD7,0x19D1F930, + 0x3FF20000,0x00000000, 0x3FECDF60,0x4A1CADCE, + 0x3FF20418,0x9374BC6A, 0x3FECE2E7,0x9600AE50, + 0x3FF20831,0x26E978D5, 0x3FECE66C,0xFD42C7EB, + 0x3FF20C49,0xBA5E353F, 0x3FECE9F0,0x7FA7E793, + 0x3FF21062,0x4DD2F1AA, 0x3FECED72,0x1CF51A07, + 0x3FF2147A,0xE147AE14, 0x3FECF0F1,0xD4EF8BCD, + 0x3FF21893,0x74BC6A7F, 0x3FECF46F,0xA75C893D, + 0x3FF21CAC,0x083126E9, 0x3FECF7EB,0x94017E7D, + 0x3FF220C4,0x9BA5E354, 0x3FECFB65,0x9AA3F78C, + 0x3FF224DD,0x2F1A9FBE, 0x3FECFEDD,0xBB09A042, + 0x3FF228F5,0xC28F5C29, 0x3FED0253,0xF4F84456, + 0x3FF22D0E,0x56041893, 0x3FED05C8,0x4835CF5D, + 0x3FF23126,0xE978D4FE, 0x3FED093A,0xB4884CD6, + 0x3FF2353F,0x7CED9168, 0x3FED0CAB,0x39B5E826, + 0x3FF23958,0x10624DD3, 0x3FED1019,0xD784EC9F, + 0x3FF23D70,0xA3D70A3D, 0x3FED1386,0x8DBBC585, + 0x3FF24189,0x374BC6A8, 0x3FED16F1,0x5C20FE11, + 0x3FF245A1,0xCAC08312, 0x3FED1A5A,0x427B4171, + 0x3FF249BA,0x5E353F7D, 0x3FED1DC1,0x40915AD3, + 0x3FF24DD2,0xF1A9FBE7, 0x3FED2126,0x562A3562, + 0x3FF251EB,0x851EB852, 0x3FED2489,0x830CDC4E, + 0x3FF25604,0x189374BC, 0x3FED27EA,0xC7007ACC, + 0x3FF25A1C,0xAC083127, 0x3FED2B4A,0x21CC5C20, + 0x3FF25E35,0x3F7CED91, 0x3FED2EA7,0x9337EB98, + 0x3FF2624D,0xD2F1A9FC, 0x3FED3203,0x1B0AB499, + 0x3FF26666,0x66666666, 0x3FED355C,0xB90C6298, + 0x3FF26A7E,0xF9DB22D1, 0x3FED38B4,0x6D04C12C, + 0x3FF26E97,0x8D4FDF3B, 0x3FED3C0A,0x36BBBC01, + 0x3FF272B0,0x20C49BA6, 0x3FED3F5E,0x15F95EEA, + 0x3FF276C8,0xB4395810, 0x3FED42B0,0x0A85D5DC, + 0x3FF27AE1,0x47AE147B, 0x3FED4600,0x14296CF6, + 0x3FF27EF9,0xDB22D0E5, 0x3FED494E,0x32AC9081, + 0x3FF28312,0x6E978D50, 0x3FED4C9A,0x65D7CCF9, + 0x3FF2872B,0x020C49BA, 0x3FED4FE4,0xAD73CF0A, + 0x3FF28B43,0x95810625, 0x3FED532D,0x09496398, + 0x3FF28F5C,0x28F5C28F, 0x3FED5673,0x792177C3, + 0x3FF29374,0xBC6A7EFA, 0x3FED59B7,0xFCC518E9, + 0x3FF2978D,0x4FDF3B64, 0x3FED5CFA,0x93FD74A7, + 0x3FF29BA5,0xE353F7CF, 0x3FED603B,0x3E93D8E4, + 0x3FF29FBE,0x76C8B439, 0x3FED6379,0xFC51B3CB, + 0x3FF2A3D7,0x0A3D70A4, 0x3FED66B6,0xCD0093D9, + 0x3FF2A7EF,0x9DB22D0E, 0x3FED69F1,0xB06A27D5, + 0x3FF2AC08,0x3126E979, 0x3FED6D2A,0xA6583EDF, + 0x3FF2B020,0xC49BA5E3, 0x3FED7061,0xAE94C86B, + 0x3FF2B439,0x5810624E, 0x3FED7396,0xC8E9D44B, + 0x3FF2B851,0xEB851EB8, 0x3FED76C9,0xF52192AC, + 0x3FF2BC6A,0x7EF9DB23, 0x3FED79FB,0x3306541E, + 0x3FF2C083,0x126E978D, 0x3FED7D2A,0x82628997, + 0x3FF2C49B,0xA5E353F8, 0x3FED8057,0xE300C476, + 0x3FF2C8B4,0x39581062, 0x3FED8383,0x54ABB684, + 0x3FF2CCCC,0xCCCCCCCD, 0x3FED86AC,0xD72E31FF, + 0x3FF2D0E5,0x60418937, 0x3FED89D4,0x6A532992, + 0x3FF2D4FD,0xF3B645A2, 0x3FED8CFA,0x0DE5B064, + 0x3FF2D916,0x872B020C, 0x3FED901D,0xC1B0FA13, + 0x3FF2DD2F,0x1A9FBE77, 0x3FED933F,0x85805ABE, + 0x3FF2E147,0xAE147AE1, 0x3FED965F,0x591F4701, + 0x3FF2E560,0x4189374C, 0x3FED997D,0x3C595401, + 0x3FF2E978,0xD4FDF3B6, 0x3FED9C99,0x2EFA3767, + 0x3FF2ED91,0x6872B021, 0x3FED9FB3,0x30CDC76C, + 0x3FF2F1A9,0xFBE76C8B, 0x3FEDA2CB,0x419FFAD4, + 0x3FF2F5C2,0x8F5C28F6, 0x3FEDA5E1,0x613CE8F8, + 0x3FF2F9DB,0x22D0E560, 0x3FEDA8F5,0x8F70C9C5, + 0x3FF2FDF3,0xB645A1CB, 0x3FEDAC07,0xCC07F5C2, + 0x3FF3020C,0x49BA5E35, 0x3FEDAF18,0x16CEE612, + 0x3FF30624,0xDD2F1AA0, 0x3FEDB226,0x6F92347A, + 0x3FF30A3D,0x70A3D70A, 0x3FEDB532,0xD61E9B5E, + 0x3FF30E56,0x04189375, 0x3FEDB83D,0x4A40F5CF, + 0x3FF3126E,0x978D4FDF, 0x3FEDBB45,0xCBC63F81, + 0x3FF31687,0x2B020C4A, 0x3FEDBE4C,0x5A7B94DA, + 0x3FF31A9F,0xBE76C8B4, 0x3FEDC150,0xF62E32EF, + 0x3FF31EB8,0x51EB851F, 0x3FEDC453,0x9EAB778A, + 0x3FF322D0,0xE5604189, 0x3FEDC754,0x53C0E12B, + 0x3FF326E9,0x78D4FDF4, 0x3FEDCA53,0x153C0F0E, + 0x3FF32B02,0x0C49BA5E, 0x3FEDCD4F,0xE2EAC12B, + 0x3FF32F1A,0x9FBE76C9, 0x3FEDD04A,0xBC9AD83E, + 0x3FF33333,0x33333333, 0x3FEDD343,0xA21A55C4, + 0x3FF3374B,0xC6A7EF9E, 0x3FEDD63A,0x93375C07, + 0x3FF33B64,0x5A1CAC08, 0x3FEDD92F,0x8FC02E15, + 0x3FF33F7C,0xED916873, 0x3FEDDC22,0x97832FD2, + 0x3FF34395,0x810624DD, 0x3FEDDF13,0xAA4EE5EC, + 0x3FF347AE,0x147AE148, 0x3FEDE202,0xC7F1F5ED, + 0x3FF34BC6,0xA7EF9DB2, 0x3FEDE4EF,0xF03B2631, + 0x3FF34FDF,0x3B645A1D, 0x3FEDE7DB,0x22F95DF4, + 0x3FF353F7,0xCED91687, 0x3FEDEAC4,0x5FFBA54C, + 0x3FF35810,0x624DD2F2, 0x3FEDEDAB,0xA7112535, + 0x3FF35C28,0xF5C28F5C, 0x3FEDF090,0xF809278C, + 0x3FF36041,0x89374BC7, 0x3FEDF374,0x52B3171B, + 0x3FF3645A,0x1CAC0831, 0x3FEDF655,0xB6DE7F92, + 0x3FF36872,0xB020C49C, 0x3FEDF935,0x245B0D93, + 0x3FF36C8B,0x43958106, 0x3FEDFC12,0x9AF88EAF, + 0x3FF370A3,0xD70A3D71, 0x3FEDFEEE,0x1A86F16F, + 0x3FF374BC,0x6A7EF9DB, 0x3FEE01C7,0xA2D64551, + 0x3FF378D4,0xFDF3B646, 0x3FEE049F,0x33B6BACF, + 0x3FF37CED,0x916872B0, 0x3FEE0774,0xCCF8A362, + 0x3FF38106,0x24DD2F1B, 0x3FEE0A48,0x6E6C7184, + 0x3FF3851E,0xB851EB85, 0x3FEE0D1A,0x17E2B8B3, + 0x3FF38937,0x4BC6A7F0, 0x3FEE0FE9,0xC92C2D74, + 0x3FF38D4F,0xDF3B645A, 0x3FEE12B7,0x8219A558, + 0x3FF39168,0x72B020C5, 0x3FEE1583,0x427C16FD, + 0x3FF39581,0x0624DD2F, 0x3FEE184D,0x0A249A12, + 0x3FF39999,0x9999999A, 0x3FEE1B14,0xD8E4675B, + 0x3FF39DB2,0x2D0E5604, 0x3FEE1DDA,0xAE8CD8AF, + 0x3FF3A1CA,0xC083126F, 0x3FEE209E,0x8AEF6904, + 0x3FF3A5E3,0x53F7CED9, 0x3FEE2360,0x6DDDB46B, + 0x3FF3A9FB,0xE76C8B44, 0x3FEE2620,0x57297815, + 0x3FF3AE14,0x7AE147AE, 0x3FEE28DE,0x46A49254, + 0x3FF3B22D,0x0E560419, 0x3FEE2B9A,0x3C2102A6, + 0x3FF3B645,0xA1CAC083, 0x3FEE2E54,0x3770E9AB, + 0x3FF3BA5E,0x353F7CEE, 0x3FEE310C,0x38668935, + 0x3FF3BE76,0xC8B43958, 0x3FEE33C2,0x3ED44442, + 0x3FF3C28F,0x5C28F5C3, 0x3FEE3676,0x4A8C9F04, + 0x3FF3C6A7,0xEF9DB22D, 0x3FEE3928,0x5B623EE0, + 0x3FF3CAC0,0x83126E98, 0x3FEE3BD8,0x7127EA75, + 0x3FF3CED9,0x16872B02, 0x3FEE3E86,0x8BB0899D, + 0x3FF3D2F1,0xA9FBE76D, 0x3FEE4132,0xAACF256F, + 0x3FF3D70A,0x3D70A3D7, 0x3FEE43DC,0xCE56E842, + 0x3FF3DB22,0xD0E56042, 0x3FEE4684,0xF61B1DB6, + 0x3FF3DF3B,0x645A1CAC, 0x3FEE492B,0x21EF32AA, + 0x3FF3E353,0xF7CED917, 0x3FEE4BCF,0x51A6B54F, + 0x3FF3E76C,0x8B439581, 0x3FEE4E71,0x8515551D, + 0x3FF3EB85,0x1EB851EC, 0x3FEE5111,0xBC0EE2DD, + 0x3FF3EF9D,0xB22D0E56, 0x3FEE53AF,0xF66750AB, + 0x3FF3F3B6,0x45A1CAC1, 0x3FEE564C,0x33F2B1FA, + 0x3FF3F7CE,0xD916872B, 0x3FEE58E6,0x74853B91, + 0x3FF3FBE7,0x6C8B4396, 0x3FEE5B7E,0xB7F34397, + 0x3FF40000,0x00000000, 0x3FEE5E14,0xFE11418C, + 0x3FF40418,0x9374BC6A, 0x3FEE60A9,0x46B3CE56, + 0x3FF40831,0x26E978D5, 0x3FEE633B,0x91AFA43B, + 0x3FF40C49,0xBA5E353F, 0x3FEE65CB,0xDED99EE9, + 0x3FF41062,0x4DD2F1AA, 0x3FEE685A,0x2E06BB78, + 0x3FF4147A,0xE147AE14, 0x3FEE6AE6,0x7F0C186A, + 0x3FF41893,0x74BC6A7F, 0x3FEE6D70,0xD1BEF5B2, + 0x3FF41CAC,0x083126E9, 0x3FEE6FF9,0x25F4B4B2, + 0x3FF420C4,0x9BA5E354, 0x3FEE727F,0x7B82D846, + 0x3FF424DD,0x2F1A9FBE, 0x3FEE7503,0xD23F04BC, + 0x3FF428F5,0xC28F5C29, 0x3FEE7786,0x29FEFFDE, + 0x3FF42D0E,0x56041893, 0x3FEE7A06,0x8298B0F3, + 0x3FF43126,0xE978D4FE, 0x3FEE7C84,0xDBE220C3, + 0x3FF4353F,0x7CED9168, 0x3FEE7F01,0x35B17996, + 0x3FF43958,0x10624DD3, 0x3FEE817B,0x8FDD073B, + 0x3FF43D70,0xA3D70A3D, 0x3FEE83F3,0xEA3B3706, + 0x3FF44189,0x374BC6A8, 0x3FEE866A,0x44A297DB, + 0x3FF445A1,0xCAC08312, 0x3FEE88DE,0x9EE9DA26, + 0x3FF449BA,0x5E353F7D, 0x3FEE8B50,0xF8E7CFE6, + 0x3FF44DD2,0xF1A9FBE7, 0x3FEE8DC1,0x52736CAA, + 0x3FF451EB,0x851EB852, 0x3FEE902F,0xAB63C59C, + 0x3FF45604,0x189374BC, 0x3FEE929C,0x03901177, + 0x3FF45A1C,0xAC083127, 0x3FEE9506,0x5ACFA896, + 0x3FF45E35,0x3F7CED91, 0x3FEE976E,0xB0FA04EE, + 0x3FF4624D,0xD2F1A9FC, 0x3FEE99D5,0x05E6C218, + 0x3FF46666,0x66666666, 0x3FEE9C39,0x596D9D4C, + 0x3FF46A7E,0xF9DB22D1, 0x3FEE9E9B,0xAB66756A, + 0x3FF46E97,0x8D4FDF3B, 0x3FEEA0FB,0xFBA94AF7, + 0x3FF472B0,0x20C49BA6, 0x3FEEA35A,0x4A0E4027, + 0x3FF476C8,0xB4395810, 0x3FEEA5B6,0x966D98D6, + 0x3FF47AE1,0x47AE147B, 0x3FEEA810,0xE09FBA95, + 0x3FF47EF9,0xDB22D0E5, 0x3FEEAA69,0x287D2CA4, + 0x3FF48312,0x6E978D50, 0x3FEEACBF,0x6DDE97FA, + 0x3FF4872B,0x020C49BA, 0x3FEEAF13,0xB09CC744, + 0x3FF48B43,0x95810625, 0x3FEEB165,0xF090A6EA, + 0x3FF48F5C,0x28F5C28F, 0x3FEEB3B6,0x2D934510, + 0x3FF49374,0xBC6A7EFA, 0x3FEEB604,0x677DD19C, + 0x3FF4978D,0x4FDF3B64, 0x3FEEB850,0x9E299E32, + 0x3FF49BA5,0xE353F7CF, 0x3FEEBA9A,0xD1701E3D, + 0x3FF49FBE,0x76C8B439, 0x3FEEBCE3,0x012AE6ED, + 0x3FF4A3D7,0x0A3D70A4, 0x3FEEBF29,0x2D33AF3F, + 0x3FF4A7EF,0x9DB22D0E, 0x3FEEC16D,0x55644FF7, + 0x3FF4AC08,0x3126E979, 0x3FEEC3AF,0x7996C3AB, + 0x3FF4B020,0xC49BA5E3, 0x3FEEC5EF,0x99A526C1, + 0x3FF4B439,0x5810624E, 0x3FEEC82D,0xB569B772, + 0x3FF4B851,0xEB851EB8, 0x3FEECA69,0xCCBED5CC, + 0x3FF4BC6A,0x7EF9DB23, 0x3FEECCA3,0xDF7F03B9, + 0x3FF4C083,0x126E978D, 0x3FEECEDB,0xED84E4F9, + 0x3FF4C49B,0xA5E353F8, 0x3FEED111,0xF6AB3F2C, + 0x3FF4C8B4,0x39581062, 0x3FEED345,0xFACCF9D1, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FEED577,0xF9C51E4B, + 0x3FF4D0E5,0x60418937, 0x3FEED7A7,0xF36ED7DE, + 0x3FF4D4FD,0xF3B645A2, 0x3FEED9D5,0xE7A573B8, + 0x3FF4D916,0x872B020C, 0x3FEEDC01,0xD64460EE, + 0x3FF4DD2F,0x1A9FBE77, 0x3FEEDE2B,0xBF273083, + 0x3FF4E147,0xAE147AE1, 0x3FEEE053,0xA2299567, + 0x3FF4E560,0x4189374C, 0x3FEEE279,0x7F27647A, + 0x3FF4E978,0xD4FDF3B6, 0x3FEEE49D,0x55FC9490, + 0x3FF4ED91,0x6872B021, 0x3FEEE6BF,0x26853E71, + 0x3FF4F1A9,0xFBE76C8B, 0x3FEEE8DE,0xF09D9CDF, + 0x3FF4F5C2,0x8F5C28F6, 0x3FEEEAFC,0xB4220C93, + 0x3FF4F9DB,0x22D0E560, 0x3FEEED18,0x70EF0C45, + 0x3FF4FDF3,0xB645A1CB, 0x3FEEEF32,0x26E13CA9, + 0x3FF5020C,0x49BA5E35, 0x3FEEF149,0xD5D56075, + 0x3FF50624,0xDD2F1AA0, 0x3FEEF35F,0x7DA85C63, + 0x3FF50A3D,0x70A3D70A, 0x3FEEF573,0x1E373732, + 0x3FF50E56,0x04189375, 0x3FEEF784,0xB75F19AA, + 0x3FF5126E,0x978D4FDF, 0x3FEEF994,0x48FD4E9A, + 0x3FF51687,0x2B020C4A, 0x3FEEFBA1,0xD2EF42E0, + 0x3FF51A9F,0xBE76C8B4, 0x3FEEFDAD,0x55128569, + 0x3FF51EB8,0x51EB851F, 0x3FEEFFB6,0xCF44C730, + 0x3FF522D0,0xE5604189, 0x3FEF01BE,0x4163DB47, + 0x3FF526E9,0x78D4FDF4, 0x3FEF03C3,0xAB4DB6D3, + 0x3FF52B02,0x0C49BA5E, 0x3FEF05C7,0x0CE07111, + 0x3FF52F1A,0x9FBE76C9, 0x3FEF07C8,0x65FA4358, + 0x3FF53333,0x33333333, 0x3FEF09C7,0xB679891A, + 0x3FF5374B,0xC6A7EF9E, 0x3FEF0BC4,0xFE3CBFEB, + 0x3FF53B64,0x5A1CAC08, 0x3FEF0DC0,0x3D22877A, + 0x3FF53F7C,0xED916873, 0x3FEF0FB9,0x7309A19D, + 0x3FF54395,0x810624DD, 0x3FEF11B0,0x9FD0F24E, + 0x3FF547AE,0x147AE148, 0x3FEF13A5,0xC3577FAC, + 0x3FF54BC6,0xA7EF9DB2, 0x3FEF1598,0xDD7C7201, + 0x3FF54FDF,0x3B645A1D, 0x3FEF1789,0xEE1F13C2, + 0x3FF553F7,0xCED91687, 0x3FEF1978,0xF51ED191, + 0x3FF55810,0x624DD2F2, 0x3FEF1B65,0xF25B3A41, + 0x3FF55C28,0xF5C28F5C, 0x3FEF1D50,0xE5B3FED5, + 0x3FF56041,0x89374BC7, 0x3FEF1F39,0xCF08F284, + 0x3FF5645A,0x1CAC0831, 0x3FEF2120,0xAE3A0ABB, + 0x3FF56872,0xB020C49C, 0x3FEF2305,0x83275F22, + 0x3FF56C8B,0x43958106, 0x3FEF24E8,0x4DB12996, + 0x3FF570A3,0xD70A3D71, 0x3FEF26C9,0x0DB7C635, + 0x3FF574BC,0x6A7EF9DB, 0x3FEF28A7,0xC31BB357, + 0x3FF578D4,0xFDF3B646, 0x3FEF2A84,0x6DBD9199, + 0x3FF57CED,0x916872B0, 0x3FEF2C5F,0x0D7E23D6, + 0x3FF58106,0x24DD2F1B, 0x3FEF2E37,0xA23E4F31, + 0x3FF5851E,0xB851EB85, 0x3FEF300E,0x2BDF1B11, + 0x3FF58937,0x4BC6A7F0, 0x3FEF31E2,0xAA41B127, + 0x3FF58D4F,0xDF3B645A, 0x3FEF33B5,0x1D475D6D, + 0x3FF59168,0x72B020C5, 0x3FEF3585,0x84D18E2D, + 0x3FF59581,0x0624DD2F, 0x3FEF3753,0xE0C1D3FA, + 0x3FF59999,0x9999999A, 0x3FEF3920,0x30F9E1BE, + 0x3FF59DB2,0x2D0E5604, 0x3FEF3AEA,0x755B8CB0, + 0x3FF5A1CA,0xC083126F, 0x3FEF3CB2,0xADC8CC60, + 0x3FF5A5E3,0x53F7CED9, 0x3FEF3E78,0xDA23BAB0, + 0x3FF5A9FB,0xE76C8B44, 0x3FEF403C,0xFA4E93DF, + 0x3FF5AE14,0x7AE147AE, 0x3FEF41FF,0x0E2BB682, + 0x3FF5B22D,0x0E560419, 0x3FEF43BF,0x159DA38F, + 0x3FF5B645,0xA1CAC083, 0x3FEF457D,0x1086FE57, + 0x3FF5BA5E,0x353F7CEE, 0x3FEF4738,0xFECA8C8B, + 0x3FF5BE76,0xC8B43958, 0x3FEF48F2,0xE04B3641, + 0x3FF5C28F,0x5C28F5C3, 0x3FEF4AAA,0xB4EC05F1, + 0x3FF5C6A7,0xEF9DB22D, 0x3FEF4C60,0x7C902877, + 0x3FF5CAC0,0x83126E98, 0x3FEF4E14,0x371AED1C, + 0x3FF5CED9,0x16872B02, 0x3FEF4FC5,0xE46FC58E, + 0x3FF5D2F1,0xA9FBE76D, 0x3FEF5175,0x847245E9, + 0x3FF5D70A,0x3D70A3D7, 0x3FEF5323,0x170624B5, + 0x3FF5DB22,0xD0E56042, 0x3FEF54CE,0x9C0F3AEC, + 0x3FF5DF3B,0x645A1CAC, 0x3FEF5678,0x137183F4, + 0x3FF5E353,0xF7CED917, 0x3FEF581F,0x7D111DAB, + 0x3FF5E76C,0x8B439581, 0x3FEF59C4,0xD8D24862, + 0x3FF5EB85,0x1EB851EC, 0x3FEF5B68,0x269966E0, + 0x3FF5EF9D,0xB22D0E56, 0x3FEF5D09,0x664AFE66, + 0x3FF5F3B6,0x45A1CAC1, 0x3FEF5EA8,0x97CBB6AC, + 0x3FF5F7CE,0xD916872B, 0x3FEF6045,0xBB0059EB, + 0x3FF5FBE7,0x6C8B4396, 0x3FEF61E0,0xCFCDD4D5, + 0x3FF60000,0x00000000, 0x3FEF6379,0xD619369D, + 0x3FF60418,0x9374BC6A, 0x3FEF6510,0xCDC7B0FA, + 0x3FF60831,0x26E978D5, 0x3FEF66A5,0xB6BE9823, + 0x3FF60C49,0xBA5E353F, 0x3FEF6838,0x90E362D5, + 0x3FF61062,0x4DD2F1AA, 0x3FEF69C9,0x5C1BAA54, + 0x3FF6147A,0xE147AE14, 0x3FEF6B58,0x184D2A6A, + 0x3FF61893,0x74BC6A7F, 0x3FEF6CE4,0xC55DC16F, + 0x3FF61CAC,0x083126E9, 0x3FEF6E6F,0x63337043, + 0x3FF620C4,0x9BA5E354, 0x3FEF6FF7,0xF1B45A56, + 0x3FF624DD,0x2F1A9FBE, 0x3FEF717E,0x70C6C5A4, + 0x3FF628F5,0xC28F5C29, 0x3FEF7302,0xE0511ABF, + 0x3FF62D0E,0x56041893, 0x3FEF7485,0x4039E4C7, + 0x3FF63126,0xE978D4FE, 0x3FEF7605,0x9067D172, + 0x3FF6353F,0x7CED9168, 0x3FEF7783,0xD0C1B10B, + 0x3FF63958,0x10624DD3, 0x3FEF7900,0x012E7675, + 0x3FF63D70,0xA3D70A3D, 0x3FEF7A7A,0x2195372D, + 0x3FF64189,0x374BC6A8, 0x3FEF7BF2,0x31DD2B49, + 0x3FF645A1,0xCAC08312, 0x3FEF7D68,0x31EDAD7C, + 0x3FF649BA,0x5E353F7D, 0x3FEF7EDC,0x21AE3B19, + 0x3FF64DD2,0xF1A9FBE7, 0x3FEF804E,0x0106740F, + 0x3FF651EB,0x851EB852, 0x3FEF81BD,0xCFDE1AF1, + 0x3FF65604,0x189374BC, 0x3FEF832B,0x8E1D14F3, + 0x3FF65A1C,0xAC083127, 0x3FEF8497,0x3BAB69F0, + 0x3FF65E35,0x3F7CED91, 0x3FEF8600,0xD8714466, + 0x3FF6624D,0xD2F1A9FC, 0x3FEF8768,0x6456F17D, + 0x3FF66666,0x66666666, 0x3FEF88CD,0xDF44E102, + 0x3FF66A7E,0xF9DB22D1, 0x3FEF8A31,0x4923A572, + 0x3FF66E97,0x8D4FDF3B, 0x3FEF8B92,0xA1DBF3F3, + 0x3FF672B0,0x20C49BA6, 0x3FEF8CF1,0xE956A458, + 0x3FF676C8,0xB4395810, 0x3FEF8E4F,0x1F7CB126, + 0x3FF67AE1,0x47AE147B, 0x3FEF8FAA,0x44373790, + 0x3FF67EF9,0xDB22D0E5, 0x3FEF9103,0x576F777D, + 0x3FF68312,0x6E978D50, 0x3FEF925A,0x590ED386, + 0x3FF6872B,0x020C49BA, 0x3FEF93AF,0x48FED0FB, + 0x3FF68B43,0x95810625, 0x3FEF9502,0x272917E1, + 0x3FF68F5C,0x28F5C28F, 0x3FEF9652,0xF37772F7, + 0x3FF69374,0xBC6A7EFA, 0x3FEF97A1,0xADD3CFB3, + 0x3FF6978D,0x4FDF3B64, 0x3FEF98EE,0x56283E48, + 0x3FF69BA5,0xE353F7CF, 0x3FEF9A38,0xEC5EF1A6, + 0x3FF69FBE,0x76C8B439, 0x3FEF9B81,0x70623F78, + 0x3FF6A3D7,0x0A3D70A4, 0x3FEF9CC7,0xE21CA02B, + 0x3FF6A7EF,0x9DB22D0E, 0x3FEF9E0C,0x4178AEEB, + 0x3FF6AC08,0x3126E979, 0x3FEF9F4E,0x8E6129A8, + 0x3FF6B020,0xC49BA5E3, 0x3FEFA08E,0xC8C0F114, + 0x3FF6B439,0x5810624E, 0x3FEFA1CC,0xF08308A6, + 0x3FF6B851,0xEB851EB8, 0x3FEFA309,0x0592969A, + 0x3FF6BC6A,0x7EF9DB23, 0x3FEFA443,0x07DAE3F8, + 0x3FF6C083,0x126E978D, 0x3FEFA57A,0xF7475C8C, + 0x3FF6C49B,0xA5E353F8, 0x3FEFA6B0,0xD3C38EEF, + 0x3FF6C8B4,0x39581062, 0x3FEFA7E4,0x9D3B2C85, + 0x3FF6CCCC,0xCCCCCCCD, 0x3FEFA916,0x539A0980, + 0x3FF6D0E5,0x60418937, 0x3FEFAA45,0xF6CC1CDE, + 0x3FF6D4FD,0xF3B645A2, 0x3FEFAB73,0x86BD806F, + 0x3FF6D916,0x872B020C, 0x3FEFAC9F,0x035A70D2, + 0x3FF6DD2F,0x1A9FBE77, 0x3FEFADC8,0x6C8F4D7A, + 0x3FF6E147,0xAE147AE1, 0x3FEFAEEF,0xC24898AD, + 0x3FF6E560,0x4189374C, 0x3FEFB015,0x0472F786, + 0x3FF6E978,0xD4FDF3B6, 0x3FEFB138,0x32FB31F3, + 0x3FF6ED91,0x6872B021, 0x3FEFB259,0x4DCE32BF, + 0x3FF6F1A9,0xFBE76C8B, 0x3FEFB378,0x54D90789, + 0x3FF6F5C2,0x8F5C28F6, 0x3FEFB495,0x4808E0CC, + 0x3FF6F9DB,0x22D0E560, 0x3FEFB5B0,0x274B11DC, + 0x3FF6FDF3,0xB645A1CB, 0x3FEFB6C8,0xF28D10ED, + 0x3FF7020C,0x49BA5E35, 0x3FEFB7DF,0xA9BC770B, + 0x3FF70624,0xDD2F1AA0, 0x3FEFB8F4,0x4CC70027, + 0x3FF70A3D,0x70A3D70A, 0x3FEFBA06,0xDB9A8B0D, + 0x3FF70E56,0x04189375, 0x3FEFBB17,0x5625196D, + 0x3FF7126E,0x978D4FDF, 0x3FEFBC25,0xBC54CFD6, + 0x3FF71687,0x2B020C4A, 0x3FEFBD32,0x0E17F5BF, + 0x3FF71A9F,0xBE76C8B4, 0x3FEFBE3C,0x4B5CF57F, + 0x3FF71EB8,0x51EB851F, 0x3FEFBF44,0x74125C57, + 0x3FF722D0,0xE5604189, 0x3FEFC04A,0x8826DA6B, + 0x3FF726E9,0x78D4FDF4, 0x3FEFC14E,0x878942C9, + 0x3FF72B02,0x0C49BA5E, 0x3FEFC250,0x72288B69, + 0x3FF72F1A,0x9FBE76C9, 0x3FEFC350,0x47F3CD2B, + 0x3FF73333,0x33333333, 0x3FEFC44E,0x08DA43DC, + 0x3FF7374B,0xC6A7EF9E, 0x3FEFC549,0xB4CB4E36, + 0x3FF73B64,0x5A1CAC08, 0x3FEFC643,0x4BB66DDD, + 0x3FF73F7C,0xED916873, 0x3FEFC73A,0xCD8B4769, + 0x3FF74395,0x810624DD, 0x3FEFC830,0x3A39A25E, + 0x3FF747AE,0x147AE148, 0x3FEFC923,0x91B16932, + 0x3FF74BC6,0xA7EF9DB2, 0x3FEFCA14,0xD3E2A94B, + 0x3FF74FDF,0x3B645A1D, 0x3FEFCB04,0x00BD9305, + 0x3FF753F7,0xCED91687, 0x3FEFCBF1,0x183279AE, + 0x3FF75810,0x624DD2F2, 0x3FEFCCDC,0x1A31D38A, + 0x3FF75C28,0xF5C28F5C, 0x3FEFCDC5,0x06AC39D1, + 0x3FF76041,0x89374BC7, 0x3FEFCEAB,0xDD9268B4, + 0x3FF7645A,0x1CAC0831, 0x3FEFCF90,0x9ED53F5A, + 0x3FF76872,0xB020C49C, 0x3FEFD073,0x4A65BFE6, + 0x3FF76C8B,0x43958106, 0x3FEFD153,0xE0350F72, + 0x3FF770A3,0xD70A3D71, 0x3FEFD232,0x60347615, + 0x3FF774BC,0x6A7EF9DB, 0x3FEFD30E,0xCA555EDF, + 0x3FF778D4,0xFDF3B646, 0x3FEFD3E9,0x1E8957E0, + 0x3FF77CED,0x916872B0, 0x3FEFD4C1,0x5CC21225, + 0x3FF78106,0x24DD2F1B, 0x3FEFD597,0x84F161B8, + 0x3FF7851E,0xB851EB85, 0x3FEFD66B,0x97093DA5, + 0x3FF78937,0x4BC6A7F0, 0x3FEFD73D,0x92FBBFF6, + 0x3FF78D4F,0xDF3B645A, 0x3FEFD80D,0x78BB25BA, + 0x3FF79168,0x72B020C5, 0x3FEFD8DB,0x4839CEFF, + 0x3FF79581,0x0624DD2F, 0x3FEFD9A7,0x016A3ED7, + 0x3FF79999,0x9999999A, 0x3FEFDA70,0xA43F1B5A, + 0x3FF79DB2,0x2D0E5604, 0x3FEFDB38,0x30AB2DA4, + 0x3FF7A1CA,0xC083126F, 0x3FEFDBFD,0xA6A161D5, + 0x3FF7A5E3,0x53F7CED9, 0x3FEFDCC1,0x0614C717, + 0x3FF7A9FB,0xE76C8B44, 0x3FEFDD82,0x4EF88F9A, + 0x3FF7AE14,0x7AE147AE, 0x3FEFDE41,0x81401095, + 0x3FF7B22D,0x0E560419, 0x3FEFDEFE,0x9CDEC24C, + 0x3FF7B645,0xA1CAC083, 0x3FEFDFB9,0xA1C84008, + 0x3FF7BA5E,0x353F7CEE, 0x3FEFE072,0x8FF04823, + 0x3FF7BE76,0xC8B43958, 0x3FEFE129,0x674ABBFD, + 0x3FF7C28F,0x5C28F5C3, 0x3FEFE1DE,0x27CBA006, + 0x3FF7C6A7,0xEF9DB22D, 0x3FEFE290,0xD1671BBA, + 0x3FF7CAC0,0x83126E98, 0x3FEFE341,0x641179A4, + 0x3FF7CED9,0x16872B02, 0x3FEFE3EF,0xDFBF275C, + 0x3FF7D2F1,0xA9FBE76D, 0x3FEFE49C,0x4464B58C, + 0x3FF7D70A,0x3D70A3D7, 0x3FEFE546,0x91F6D7ED, + 0x3FF7DB22,0xD0E56042, 0x3FEFE5EE,0xC86A6548, + 0x3FF7DF3B,0x645A1CAC, 0x3FEFE694,0xE7B4577A, + 0x3FF7E353,0xF7CED917, 0x3FEFE738,0xEFC9CB72, + 0x3FF7E76C,0x8B439581, 0x3FEFE7DA,0xE0A00130, + 0x3FF7EB85,0x1EB851EC, 0x3FEFE87A,0xBA2C5BCC, + 0x3FF7EF9D,0xB22D0E56, 0x3FEFE918,0x7C64616E, + 0x3FF7F3B6,0x45A1CAC1, 0x3FEFE9B4,0x273DBB58, + 0x3FF7F7CE,0xD916872B, 0x3FEFEA4D,0xBAAE35DE, + 0x3FF7FBE7,0x6C8B4396, 0x3FEFEAE5,0x36ABC06E, + 0x3FF80000,0x00000000, 0x3FEFEB7A,0x9B2C6D8B, + 0x3FF80418,0x9374BC6A, 0x3FEFEC0D,0xE82672D0, + 0x3FF80831,0x26E978D5, 0x3FEFEC9F,0x1D9028F3, + 0x3FF80C49,0xBA5E353F, 0x3FEFED2E,0x3B600BC1, + 0x3FF81062,0x4DD2F1AA, 0x3FEFEDBB,0x418CBA21, + 0x3FF8147A,0xE147AE14, 0x3FEFEE46,0x300CF615, + 0x3FF81893,0x74BC6A7F, 0x3FEFEECF,0x06D7A4BB, + 0x3FF81CAC,0x083126E9, 0x3FEFEF55,0xC5E3CE4C, + 0x3FF820C4,0x9BA5E354, 0x3FEFEFDA,0x6D289E1C, + 0x3FF824DD,0x2F1A9FBE, 0x3FEFF05C,0xFC9D629E, + 0x3FF828F5,0xC28F5C29, 0x3FEFF0DD,0x74398D62, + 0x3FF82D0E,0x56041893, 0x3FEFF15B,0xD3F4B314, + 0x3FF83126,0xE978D4FE, 0x3FEFF1D8,0x1BC68B81, + 0x3FF8353F,0x7CED9168, 0x3FEFF252,0x4BA6F195, + 0x3FF83958,0x10624DD3, 0x3FEFF2CA,0x638DE359, + 0x3FF83D70,0xA3D70A3D, 0x3FEFF340,0x637381F9, + 0x3FF84189,0x374BC6A8, 0x3FEFF3B4,0x4B5011C0, + 0x3FF845A1,0xCAC08312, 0x3FEFF426,0x1B1BFA1C, + 0x3FF849BA,0x5E353F7D, 0x3FEFF495,0xD2CFC59A, + 0x3FF84DD2,0xF1A9FBE7, 0x3FEFF503,0x726421EC, + 0x3FF851EB,0x851EB852, 0x3FEFF56E,0xF9D1DFE4, + 0x3FF85604,0x189374BC, 0x3FEFF5D8,0x6911F37A, + 0x3FF85A1C,0xAC083127, 0x3FEFF63F,0xC01D73C6, + 0x3FF85E35,0x3F7CED91, 0x3FEFF6A4,0xFEED9B08, + 0x3FF8624D,0xD2F1A9FC, 0x3FEFF708,0x257BC6A1, + 0x3FF86666,0x66666666, 0x3FEFF769,0x33C1771A, + 0x3FF86A7E,0xF9DB22D1, 0x3FEFF7C8,0x29B8501E, + 0x3FF86E97,0x8D4FDF3B, 0x3FEFF825,0x075A1881, + 0x3FF872B0,0x20C49BA6, 0x3FEFF87F,0xCCA0BA3B, + 0x3FF876C8,0xB4395810, 0x3FEFF8D8,0x7986426B, + 0x3FF87AE1,0x47AE147B, 0x3FEFF92F,0x0E04E157, + 0x3FF87EF9,0xDB22D0E5, 0x3FEFF983,0x8A16EA6D, + 0x3FF88312,0x6E978D50, 0x3FEFF9D5,0xEDB6D443, + 0x3FF8872B,0x020C49BA, 0x3FEFFA26,0x38DF3895, + 0x3FF88B43,0x95810625, 0x3FEFFA74,0x6B8AD449, + 0x3FF88F5C,0x28F5C28F, 0x3FEFFAC0,0x85B4876E, + 0x3FF89374,0xBC6A7EFA, 0x3FEFFB0A,0x8757553B, + 0x3FF8978D,0x4FDF3B64, 0x3FEFFB52,0x706E6412, + 0x3FF89BA5,0xE353F7CF, 0x3FEFFB98,0x40F4FD7C, + 0x3FF89FBE,0x76C8B439, 0x3FEFFBDB,0xF8E68E2F, + 0x3FF8A3D7,0x0A3D70A4, 0x3FEFFC1D,0x983EA60A, + 0x3FF8A7EF,0x9DB22D0E, 0x3FEFFC5D,0x1EF8F817, + 0x3FF8AC08,0x3126E979, 0x3FEFFC9A,0x8D115A8A, + 0x3FF8B020,0xC49BA5E3, 0x3FEFFCD5,0xE283C6C3, + 0x3FF8B439,0x5810624E, 0x3FEFFD0F,0x1F4C594F, + 0x3FF8B851,0xEB851EB8, 0x3FEFFD46,0x436751E3, + 0x3FF8BC6A,0x7EF9DB23, 0x3FEFFD7B,0x4ED11363, + 0x3FF8C083,0x126E978D, 0x3FEFFDAE,0x418623DE, + 0x3FF8C49B,0xA5E353F8, 0x3FEFFDDF,0x1B832C90, + 0x3FF8C8B4,0x39581062, 0x3FEFFE0D,0xDCC4F9E2, + 0x3FF8CCCC,0xCCCCCCCD, 0x3FEFFE3A,0x85487B68, + 0x3FF8D0E5,0x60418937, 0x3FEFFE65,0x150AC3E4, + 0x3FF8D4FD,0xF3B645A2, 0x3FEFFE8D,0x8C090947, + 0x3FF8D916,0x872B020C, 0x3FEFFEB3,0xEA40A4AD, + 0x3FF8DD2F,0x1A9FBE77, 0x3FEFFED8,0x2FAF1261, + 0x3FF8E147,0xAE147AE1, 0x3FEFFEFA,0x5C51F1DB, + 0x3FF8E560,0x4189374C, 0x3FEFFF1A,0x702705C1, + 0x3FF8E978,0xD4FDF3B6, 0x3FEFFF38,0x6B2C33E8, + 0x3FF8ED91,0x6872B021, 0x3FEFFF54,0x4D5F8552, + 0x3FF8F1A9,0xFBE76C8B, 0x3FEFFF6E,0x16BF2630, + 0x3FF8F5C2,0x8F5C28F6, 0x3FEFFF85,0xC74965E2, + 0x3FF8F9DB,0x22D0E560, 0x3FEFFF9B,0x5EFCB6F5, + 0x3FF8FDF3,0xB645A1CB, 0x3FEFFFAE,0xDDD7AF26, + 0x3FF9020C,0x49BA5E35, 0x3FEFFFC0,0x43D90760, + 0x3FF90624,0xDD2F1AA0, 0x3FEFFFCF,0x90FF9BBD, + 0x3FF90A3D,0x70A3D70A, 0x3FEFFFDC,0xC54A6B87, + 0x3FF90E56,0x04189375, 0x3FEFFFE7,0xE0B89936, + 0x3FF9126E,0x978D4FDF, 0x3FEFFFF0,0xE3496A70, + 0x3FF91687,0x2B020C4A, 0x3FEFFFF7,0xCCFC480D, + 0x3FF91A9F,0xBE76C8B4, 0x3FEFFFFC,0x9DD0BE11, + 0x3FF91EB8,0x51EB851F, 0x3FEFFFFF,0x55C67BB1, + 0x3FF922D0,0xE5604189, 0x3FEFFFFF,0xF4DD5351, + 0x3FF926E9,0x78D4FDF4, 0x3FEFFFFE,0x7B153A84, + 0x3FF92B02,0x0C49BA5E, 0x3FEFFFFA,0xE86E4A0B, + 0x3FF92F1A,0x9FBE76C9, 0x3FEFFFF5,0x3CE8BDD8, + 0x3FF93333,0x33333333, 0x3FEFFFED,0x7884F50C, + 0x3FF9374B,0xC6A7EF9E, 0x3FEFFFE3,0x9B4371F7, + 0x3FF93B64,0x5A1CAC08, 0x3FEFFFD7,0xA524DA16, + 0x3FF93F7C,0xED916873, 0x3FEFFFC9,0x9629F618, + 0x3FF94395,0x810624DD, 0x3FEFFFB9,0x6E53B1DA, + 0x3FF947AE,0x147AE148, 0x3FEFFFA7,0x2DA31C68, + 0x3FF94BC6,0xA7EF9DB2, 0x3FEFFF92,0xD41967FB, + 0x3FF94FDF,0x3B645A1D, 0x3FEFFF7C,0x61B7E9FF, + 0x3FF953F7,0xCED91687, 0x3FEFFF63,0xD6801B0A, + 0x3FF95810,0x624DD2F2, 0x3FEFFF49,0x327396E5, + 0x3FF95C28,0xF5C28F5C, 0x3FEFFF2C,0x75941C84, + 0x3FF96041,0x89374BC7, 0x3FEFFF0D,0x9FE38E0B, + 0x3FF9645A,0x1CAC0831, 0x3FEFFEEC,0xB163F0CC, + 0x3FF96872,0xB020C49C, 0x3FEFFEC9,0xAA176D48, + 0x3FF96C8B,0x43958106, 0x3FEFFEA4,0x8A004F2D, + 0x3FF970A3,0xD70A3D71, 0x3FEFFE7D,0x51210557, + 0x3FF974BC,0x6A7EF9DB, 0x3FEFFE53,0xFF7C21D0, + 0x3FF978D4,0xFDF3B646, 0x3FEFFE28,0x951459CF, + 0x3FF97CED,0x916872B0, 0x3FEFFDFB,0x11EC85BA, + 0x3FF98106,0x24DD2F1B, 0x3FEFFDCB,0x7607A121, + 0x3FF9851E,0xB851EB85, 0x3FEFFD99,0xC168CAC5, + 0x3FF98937,0x4BC6A7F0, 0x3FEFFD65,0xF4134490, + 0x3FF98D4F,0xDF3B645A, 0x3FEFFD30,0x0E0A739B, + 0x3FF99168,0x72B020C5, 0x3FEFFCF8,0x0F51E02A, + 0x3FF99581,0x0624DD2F, 0x3FEFFCBD,0xF7ED35AF, + 0x3FF99999,0x9999999A, 0x3FEFFC81,0xC7E042C5, + 0x3FF9C28F,0x5C28F5C3, 0x3FEFF9B4,0x9EDEFDF4, + 0x3FF9EB85,0x1EB851EC, 0x3FEFF615,0xE87927FA, + 0x3FFA147A,0xE147AE14, 0x3FEFF1A5,0xBC680174, + 0x3FFA3D70,0xA3D70A3D, 0x3FEFEC64,0x37C17F07, + 0x3FFA6666,0x66666666, 0x3FEFE651,0x7CF78AC8, + 0x3FFA8F5C,0x28F5C28F, 0x3FEFDF6D,0xB3D7227B, + 0x3FFAB851,0xEB851EB8, 0x3FEFD7B9,0x098752C1, + 0x3FFAE147,0xAE147AE1, 0x3FEFCF33,0xB0880F2B, + 0x3FFB0A3D,0x70A3D70A, 0x3FEFC5DD,0xE0B0E74A, + 0x3FFB3333,0x33333333, 0x3FEFBBB7,0xD72F98B6, + 0x3FFB5C28,0xF5C28F5C, 0x3FEFB0C1,0xD6867E1F, + 0x3FFB851E,0xB851EB85, 0x3FEFA4FC,0x268ADB6D, + 0x3FFBAE14,0x7AE147AE, 0x3FEF9867,0x146306FE, + 0x3FFBD70A,0x3D70A3D7, 0x3FEF8B02,0xF284700C, + 0x3FFC0000,0x00000000, 0x3FEF7CD0,0x18B18246, + 0x3FFC28F5,0xC28F5C29, 0x3FEF6DCE,0xE3F766AD, + 0x3FFC51EB,0x851EB852, 0x3FEF5DFF,0xB6ABA1C5, + 0x3FFC7AE1,0x47AE147B, 0x3FEF4D62,0xF8698F23, + 0x3FFCA3D7,0x0A3D70A4, 0x3FEF3BF9,0x160FBA71, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FEF29C2,0x81BD15F0, + 0x3FFCF5C2,0x8F5C28F6, 0x3FEF16BF,0xB2CE0E97, + 0x3FFD1EB8,0x51EB851F, 0x3FEF02F1,0x25D97DD2, + 0x3FFD47AE,0x147AE148, 0x3FEEEE57,0x5CAD7904, + 0x3FFD70A3,0xD70A3D71, 0x3FEED8F2,0xDE4BFED7, + 0x3FFD9999,0x9999999A, 0x3FEEC2C4,0x36E78275, + 0x3FFDC28F,0x5C28F5C3, 0x3FEEABCB,0xF7DF54BE, + 0x3FFDEB85,0x1EB851EC, 0x3FEE940A,0xB7BBEB94, + 0x3FFE147A,0xE147AE14, 0x3FEE7B81,0x122B0754, + 0x3FFE3D70,0xA3D70A3D, 0x3FEE622F,0xA7FBB698, + 0x3FFE6666,0x66666666, 0x3FEE4817,0x1F1A3857, + 0x3FFE8F5C,0x28F5C28F, 0x3FEE2D38,0x228BBC85, + 0x3FFEB851,0xEB851EB8, 0x3FEE1193,0x626A0345, + 0x3FFEE147,0xAE147AE1, 0x3FEDF529,0x93DEDADB, + 0x3FFF0A3D,0x70A3D70A, 0x3FEDD7FB,0x711F7C60, + 0x3FFF3333,0x33333333, 0x3FEDBA09,0xB967C778, + 0x3FFF5C28,0xF5C28F5C, 0x3FED9B55,0x30F55D09, + 0x3FFF851E,0xB851EB85, 0x3FED7BDE,0xA102992C, + 0x3FFFAE14,0x7AE147AE, 0x3FED5BA6,0xD7C16C69, + 0x3FFFD70A,0x3D70A3D7, 0x3FED3AAE,0xA856146C, + 0x40000000,0x00000000, 0x3FED18F6,0xEAD1B446, + 0x4000147A,0xE147AE14, 0x3FECF680,0x7C2CCC6F, + 0x400028F5,0xC28F5C29, 0x3FECD34C,0x3E4192A0, + 0x40003D70,0xA3D70A3D, 0x3FECAF5B,0x17C629B6, + 0x400051EB,0x851EB852, 0x3FEC8AAD,0xF446B9AB, + 0x40006666,0x66666666, 0x3FEC6545,0xC41F67FD, + 0x40007AE1,0x47AE147B, 0x3FEC3F23,0x7C763065, + 0x40008F5C,0x28F5C28F, 0x3FEC1848,0x17349E4E, + 0x4000A3D7,0x0A3D70A4, 0x3FEBF0B4,0x930166FC, + 0x4000B851,0xEB851EB8, 0x3FEBC869,0xF339E4B7, + 0x4000CCCC,0xCCCCCCCD, 0x3FEB9F69,0x3FEB72FB, + 0x4000E147,0xAE147AE1, 0x3FEB75B3,0x85CCAC10, + 0x4000F5C2,0x8F5C28F6, 0x3FEB4B49,0xD63687F1, + 0x40010A3D,0x70A3D70A, 0x3FEB202D,0x471D5CF8, + 0x40011EB8,0x51EB851F, 0x3FEAF45E,0xF309C235, + 0x40013333,0x33333333, 0x3FEAC7DF,0xF91153EA, + 0x400147AE,0x147AE148, 0x3FEA9AB1,0x7CCF5A0D, + 0x40015C28,0xF5C28F5C, 0x3FEA6CD4,0xA65D5148, + 0x400170A3,0xD70A3D71, 0x3FEA3E4A,0xA24B566B, + 0x4001851E,0xB851EB85, 0x3FEA0F14,0xA19874B8, + 0x40019999,0x9999999A, 0x3FE9DF33,0xD9AAD708, + 0x4001AE14,0x7AE147AE, 0x3FE9AEA9,0x8447DC31, + 0x4001C28F,0x5C28F5C3, 0x3FE97D76,0xDF8C0EA5, + 0x4001D70A,0x3D70A3D7, 0x3FE94B9D,0x2DE2FFBF, + 0x4001EB85,0x1EB851EC, 0x3FE9191D,0xB5FF06B6, + 0x40020000,0x00000000, 0x3FE8E5F9,0xC2D0E3A9, + 0x4002147A,0xE147AE14, 0x3FE8B232,0xA37F46B7, + 0x400228F5,0xC28F5C29, 0x3FE87DC9,0xAB5E3B9C, + 0x40023D70,0xA3D70A3D, 0x3FE848C0,0x31E679E5, + 0x400251EB,0x851EB852, 0x3FE81317,0x92AC99F3, + 0x40026666,0x66666666, 0x3FE7DCD1,0x2D582F24, + 0x40027AE1,0x47AE147B, 0x3FE7A5EE,0x659AC72D, + 0x40028F5C,0x28F5C28F, 0x3FE76E70,0xA326CF21, + 0x4002A3D7,0x0A3D70A4, 0x3FE73659,0x51A65E10, + 0x4002B851,0xEB851EB8, 0x3FE6FDA9,0xE0B1E5D3, + 0x4002CCCC,0xCCCCCCCD, 0x3FE6C463,0xC3C6C9E8, + 0x4002E147,0xAE147AE1, 0x3FE68A88,0x723DDCF7, + 0x4002F5C2,0x8F5C28F6, 0x3FE65019,0x6741C4DC, + 0x40030A3D,0x70A3D70A, 0x3FE61518,0x21C545E0, + 0x40031EB8,0x51EB851F, 0x3FE5D986,0x247974F6, + 0x40033333,0x33333333, 0x3FE59D64,0xF5C3D19B, + 0x400347AE,0x147AE148, 0x3FE560B6,0x1FB44749, + 0x40035C28,0xF5C28F5C, 0x3FE5237B,0x2FFB1706, + 0x400370A3,0xD70A3D71, 0x3FE4E5B5,0xB7DEA911, + 0x4003851E,0xB851EB85, 0x3FE4A767,0x4C314729, + 0x40039999,0x9999999A, 0x3FE46891,0x8546BF7C, + 0x4003AE14,0x7AE147AE, 0x3FE42935,0xFEE9F0B6, + 0x4003C28F,0x5C28F5C3, 0x3FE3E956,0x58523F3F, + 0x4003D70A,0x3D70A3D7, 0x3FE3A8F4,0x3418F429, + 0x4003EB85,0x1EB851EC, 0x3FE36811,0x382E85CD, + 0x40040000,0x00000000, 0x3FE326AF,0x0DCFCAB1, + 0x4004147A,0xE147AE14, 0x3FE2E4CF,0x617B169D, + 0x400428F5,0xC28F5C29, 0x3FE2A273,0xE2E54284, + 0x40043D70,0xA3D70A3D, 0x3FE25F9E,0x44EE9F55, + 0x400451EB,0x851EB852, 0x3FE21C50,0x3D97D3E9, + 0x40046666,0x66666666, 0x3FE1D88B,0x85F6A6A5, + 0x40047AE1,0x47AE147B, 0x3FE19451,0xDA2AB2B7, + 0x40048F5C,0x28F5C28F, 0x3FE14FA4,0xF9520997, + 0x4004A3D7,0x0A3D70A4, 0x3FE10A86,0xA57DC0BA, + 0x4004B851,0xEB851EB8, 0x3FE0C4F8,0xA3A66C23, + 0x4004CCCC,0xCCCCCCCD, 0x3FE07EFC,0xBBA085BB, + 0x4004E147,0xAE147AE1, 0x3FE03894,0xB810C219, + 0x4004F5C2,0x8F5C28F6, 0x3FDFE384,0xCCC0A55E, + 0x40050A3D,0x70A3D70A, 0x3FDF550F,0x2D622BFF, + 0x40051EB8,0x51EB851F, 0x3FDEC5CC,0x37A36B9F, + 0x40053333,0x33333333, 0x3FDE35BF,0x96636804, + 0x400547AE,0x147AE148, 0x3FDDA4EC,0xF9AACC0D, + 0x40055C28,0xF5C28F5C, 0x3FDD1358,0x1693BF1F, + 0x400570A3,0xD70A3D71, 0x3FDC8104,0xA73198F8, + 0x4005851E,0xB851EB85, 0x3FDBEDF6,0x6A78754D, + 0x40059999,0x9999999A, 0x3FDB5A31,0x2424A70C, + 0x4005AE14,0x7AE147AE, 0x3FDAC5B8,0x9CA20CAC, + 0x4005C28F,0x5C28F5C3, 0x3FDA3090,0xA0F34560, + 0x4005D70A,0x3D70A3D7, 0x3FD99ABD,0x0298C8A6, + 0x4005EB85,0x1EB851EC, 0x3FD90441,0x9777DFF0, + 0x40060000,0x00000000, 0x3FD86D22,0x39C183FB, + 0x4006147A,0xE147AE14, 0x3FD7D562,0xC7D91D8E, + 0x400628F5,0xC28F5C29, 0x3FD73D07,0x243B2B02, + 0x40063D70,0xA3D70A3D, 0x3FD6A413,0x3563CAEE, + 0x400651EB,0x851EB852, 0x3FD60A8A,0xE5B52C59, + 0x40066666,0x66666666, 0x3FD57072,0x235DE5C8, + 0x40067AE1,0x47AE147B, 0x3FD4D5CC,0xE03F32F1, + 0x40068F5C,0x28F5C28F, 0x3FD43A9F,0x11D31AB2, + 0x4006A3D7,0x0A3D70A4, 0x3FD39EEC,0xB1127CF3, + 0x4006B851,0xEB851EB8, 0x3FD302B9,0xBA5B0A1C, + 0x4006CCCC,0xCCCCCCCD, 0x3FD2660A,0x2D5523D7, + 0x4006E147,0xAE147AE1, 0x3FD1C8E2,0x0CD9A8B6, + 0x4006F5C2,0x8F5C28F6, 0x3FD12B45,0x5ED7AA77, + 0x40070A3D,0x70A3D70A, 0x3FD08D38,0x2C3A108B, + 0x40071EB8,0x51EB851F, 0x3FCFDD7D,0x019A4D22, + 0x40073333,0x33333333, 0x3FCE9FB8,0xD64830E3, + 0x400747AE,0x147AE148, 0x3FCD612B,0xF8FCB783, + 0x40075C28,0xF5C28F5C, 0x3FCC21DE,0x915A1052, + 0x400770A3,0xD70A3D71, 0x3FCAE1D8,0xCBF03CDB, + 0x4007851E,0xB851EB85, 0x3FC9A122,0xDA077FAF, + 0x40079999,0x9999999A, 0x3FC85FC4,0xF16AAB46, + 0x4007AE14,0x7AE147AE, 0x3FC71DC7,0x4C31544D, + 0x4007C28F,0x5C28F5C3, 0x3FC5DB32,0x2889E6C6, + 0x4007D70A,0x3D70A3D7, 0x3FC4980D,0xC883A15C, + 0x4007EB85,0x1EB851EC, 0x3FC35462,0x71D87651, + 0x40080000,0x00000000, 0x3FC21038,0x6DB6D55B, + 0x4008147A,0xE147AE14, 0x3FC0CB98,0x088B5DF8, + 0x400828F5,0xC28F5C29, 0x3FBF0D13,0x2394FA2B, + 0x40083D70,0xA3D70A3D, 0x3FBC822A,0xB773EDC8, + 0x400851EB,0x851EB852, 0x3FB9F687,0x7674BB23, + 0x40086666,0x66666666, 0x3FB76A3A,0x0F20EFBE, + 0x40087AE1,0x47AE147B, 0x3FB4DD53,0x345D2E1A, + 0x40088F5C,0x28F5C28F, 0x3FB24FE3,0x9CFBBF03, + 0x4008A3D7,0x0A3D70A4, 0x3FAF83F8,0x069E0E35, + 0x4008B851,0xEB851EB8, 0x3FAA675A,0x4977CEEC, + 0x4008CCCC,0xCCCCCCCD, 0x3FA54A0F,0x8298102E, + 0x4008E147,0xAE147AE1, 0x3FA02C39,0x36802625, + 0x4008F5C2,0x8F5C28F6, 0x3F961BF1,0xDA877CCC, + 0x40090A3D,0x70A3D70A, 0x3F87BDC0,0xC6B48734, + 0x40091EB8,0x51EB851F, 0x3F5A1812,0x0C2C1274, + 0x40093333,0x33333333, 0xBF8137D1,0xA3EE270D, + 0x400947AE,0x147AE148, 0xBF92D91A,0x59453A07, + 0x40095C28,0xF5C28F5C, 0xBF9D15D0,0x5B0B6F91, + 0x400970A3,0xD70A3D71, 0xBFA3A8E3,0xE02B7A3E, + 0x4009851E,0xB851EB85, 0xBFA8C65E,0xBB8B1A8A, + 0x40099999,0x9999999A, 0xBFADE337,0x39E82D32, + 0x4009AE14,0x7AE147AE, 0xBFB17FA5,0xECD729F6, + 0x4009C28F,0x5C28F5C3, 0xBFB40D3D,0x8F266A95, + 0x4009D70A,0x3D70A3D7, 0xBFB69A51,0xC8890766, + 0x4009EB85,0x1EB851EC, 0xBFB926D1,0xE103632B, + 0x400A0000,0x00000000, 0xBFBBB2AD,0x2464A48C, + 0x400A147A,0xE147AE14, 0xBFBE3DD2,0xE2B42F28, + 0x400A28F5,0xC28F5C29, 0xBFC06419,0x384F7FE2, + 0x400A3D70,0xA3D70A3D, 0xBFC1A8DD,0x93F27504, + 0x400A51EB,0x851EB852, 0xBFC2ED2E,0x33E2DB1E, + 0x400A6666,0x66666666, 0xBFC43102,0xCAB70C87, + 0x400A7AE1,0x47AE147B, 0xBFC57453,0x0E32434A, + 0x400A8F5C,0x28F5C28F, 0xBFC6B716,0xB77AECD3, + 0x400AA3D7,0x0A3D70A4, 0xBFC7F945,0x8350E869, + 0x400AB851,0xEB851EB8, 0xBFC93AD7,0x3243AD13, + 0x400ACCCC,0xCCCCCCCD, 0xBFCA7BC3,0x88E85781, + 0x400AE147,0xAE147AE1, 0xBFCBBC02,0x500F9C99, + 0x400AF5C2,0x8F5C28F6, 0xBFCCFB8B,0x54FBA14D, + 0x400B0A3D,0x70A3D70A, 0xBFCE3A56,0x6995B44A, + 0x400B1EB8,0x51EB851F, 0xBFCF785B,0x64A3EA2C, + 0x400B3333,0x33333333, 0xBFD05AC9,0x10FF4C6C, + 0x400B47AE,0x147AE148, 0xBFD0F8F9,0x4162D949, + 0x400B5C28,0xF5C28F5C, 0xBFD196BA,0x36CAFEC3, + 0x400B70A3,0xD70A3D71, 0xBFD23407,0xE75F1422, + 0x400B851E,0xB851EB85, 0xBFD2D0DE,0x4C39DC04, + 0x400B9999,0x9999999A, 0xBFD36D39,0x6183E89C, + 0x400BAE14,0x7AE147AE, 0xBFD40915,0x268DEB78, + 0x400BC28F,0x5C28F5C3, 0xBFD4A46D,0x9DEAF10F, + 0x400BD70A,0x3D70A3D7, 0xBFD53F3E,0xCD8A8678, + 0x400BEB85,0x1EB851EC, 0xBFD5D984,0xBED2C998, + 0x400C0000,0x00000000, 0xBFD6733B,0x7EBA621F, + 0x400C147A,0xE147AE14, 0xBFD70C5F,0x1DE2639E, + 0x400C28F5,0xC28F5C29, 0xBFD7A4EB,0xB0B01748, + 0x400C3D70,0xA3D70A3D, 0xBFD83CDD,0x4F66AD08, + 0x400C51EB,0x851EB852, 0xBFD8D430,0x1640D38A, + 0x400C6666,0x66666666, 0xBFD96AE0,0x258A35D0, + 0x400C7AE1,0x47AE147B, 0xBFDA00E9,0xA1B8DE9D, + 0x400C8F5C,0x28F5C28F, 0xBFDA9648,0xB386801C, + 0x400CA3D7,0x0A3D70A4, 0xBFDB2AF9,0x8809A00B, + 0x400CB851,0xEB851EB8, 0xBFDBBEF8,0x50CEA6D7, + 0x400CCCCC,0xCCCCCCCD, 0xBFDC5241,0x43F0D1F1, + 0x400CE147,0xAE147AE1, 0xBFDCE4D0,0x9C3307D8, + 0x400CF5C2,0x8F5C28F6, 0xBFDD76A2,0x99188E09, + 0x400D0A3D,0x70A3D70A, 0xBFDE07B3,0x7EFD9F61, + 0x400D1EB8,0x51EB851F, 0xBFDE97FF,0x972FE32A, + 0x400D3333,0x33333333, 0xBFDF2783,0x3006C351, + 0x400D47AE,0x147AE148, 0xBFDFB63A,0x9CFBA20A, + 0x400D5C28,0xF5C28F5C, 0xBFE02211,0x1B60F6AE, + 0x400D70A3,0xD70A3D71, 0xBFE0689B,0x2DAF8872, + 0x400D851E,0xB851EB85, 0xBFE0AEB9,0xB7212221, + 0x400D9999,0x9999999A, 0xBFE0F46A,0xEC2E1B41, + 0x400DAE14,0x7AE147AE, 0xBFE139AD,0x041B4A7D, + 0x400DC28F,0x5C28F5C3, 0xBFE17E7E,0x3905B6F8, + 0x400DD70A,0x3D70A3D7, 0xBFE1C2DC,0xC7EE36C4, + 0x400DEB85,0x1EB851EC, 0xBFE206C6,0xF0C4FA98, + 0x400E0000,0x00000000, 0xBFE24A3A,0xF6750621, + 0x400E147A,0xE147AE14, 0xBFE28D37,0x1EEF94F2, + 0x400E28F5,0xC28F5C29, 0xBFE2CFB9,0xB3376B84, + 0x400E3D70,0xA3D70A3D, 0xBFE311C0,0xFF6C1424, + 0x400E51EB,0x851EB852, 0xBFE3534B,0x52D50789, + 0x400E6666,0x66666666, 0xBFE39456,0xFFECC09D, + 0x400E7AE1,0x47AE147B, 0xBFE3D4E2,0x5C6BBB78, + 0x400E8F5C,0x28F5C28F, 0xBFE414EB,0xC1535EE7, + 0x400EA3D7,0x0A3D70A4, 0xBFE45471,0x8AF8D0AA, + 0x400EB851,0xEB851EB8, 0xBFE49372,0x190FB3A3, + 0x400ECCCC,0xCCCCCCCD, 0xBFE4D1EB,0xCEB4D02B, + 0x400EE147,0xAE147AE1, 0xBFE50FDD,0x1278A5E0, + 0x400EF5C2,0x8F5C28F6, 0xBFE54D44,0x4E69E6F5, + 0x400F0A3D,0x70A3D70A, 0xBFE58A1F,0xF01FDC7F, + 0x400F1EB8,0x51EB851F, 0xBFE5C66E,0x68C4B3BD, + 0x400F3333,0x33333333, 0xBFE6022E,0x2D1FB3CB, + 0x400F47AE,0x147AE148, 0xBFE63D5D,0xB59F5BD3, + 0x400F5C28,0xF5C28F5C, 0xBFE677FB,0x7E636920, + 0x400F70A3,0xD70A3D71, 0xBFE6B206,0x0746C52B, + 0x400F851E,0xB851EB85, 0xBFE6EB7B,0xD3E95B05, + 0x400F9999,0x9999999A, 0xBFE7245B,0x6BB9D440, + 0x400FAE14,0x7AE147AE, 0xBFE75CA3,0x59FF3CB1, + 0x400FC28F,0x5C28F5C3, 0xBFE79452,0x2DE28D2E, + 0x400FD70A,0x3D70A3D7, 0xBFE7CB66,0x7A781CAB, + 0x400FEB85,0x1EB851EC, 0xBFE801DE,0xD6C8F7DB, + 0x40100000,0x00000000, 0xBFE837B9,0xDDDC1EAE, + 0x40100A3D,0x70A3D70A, 0xBFE86CF6,0x2EBFA7DA, + 0x4010147A,0xE147AE14, 0xBFE8A192,0x6C91C9D3, + 0x40101EB8,0x51EB851F, 0xBFE8D58D,0x3E89C943, + 0x401028F5,0xC28F5C29, 0xBFE908E5,0x5000CC81, + 0x40103333,0x33333333, 0xBFE93B99,0x507A942B, + 0x40103D70,0xA3D70A3D, 0xBFE96DA7,0xF3AE183E, + 0x401047AE,0x147AE148, 0xBFE99F0F,0xF18E09C5, + 0x401051EB,0x851EB852, 0xBFE9CFD0,0x065138AD, + 0x40105C28,0xF5C28F5C, 0xBFE9FFE6,0xF27ADDD3, + 0x40106666,0x66666666, 0xBFEA2F53,0x7AE2C8B8, + 0x401070A3,0xD70A3D71, 0xBFEA5E14,0x68BD70F3, + 0x40107AE1,0x47AE147B, 0xBFEA8C28,0x89A3EAE6, + 0x4010851E,0xB851EB85, 0xBFEAB98E,0xAF9BBFE6, + 0x40108F5C,0x28F5C28F, 0xBFEAE645,0xB11EA92E, + 0x40109999,0x9999999A, 0xBFEB124C,0x69222DBC, + 0x4010A3D7,0x0A3D70A4, 0xBFEB3DA1,0xB71F22B8, + 0x4010AE14,0x7AE147AE, 0xBFEB6844,0x7F190E71, + 0x4010B851,0xEB851EB8, 0xBFEB9233,0xA9A56D63, + 0x4010C28F,0x5C28F5C3, 0xBFEBBB6E,0x23F2D970, + 0x4010CCCC,0xCCCCCCCD, 0xBFEBE3F2,0xDFD012D8, + 0x4010D70A,0x3D70A3D7, 0xBFEC0BC0,0xD3B2EB03, + 0x4010E147,0xAE147AE1, 0xBFEC32D6,0xFABF10B3, + 0x4010EB85,0x1EB851EC, 0xBFEC5934,0x54CCBD95, + 0x4010F5C2,0x8F5C28F6, 0xBFEC7ED7,0xE66F44EF, + 0x40110000,0x00000000, 0xBFECA3C0,0xB8FB8370, + 0x40110A3D,0x70A3D70A, 0xBFECC7ED,0xDA8E2FAD, + 0x4011147A,0xE147AE14, 0xBFECEB5E,0x5E120B5D, + 0x40111EB8,0x51EB851F, 0xBFED0E11,0x5B45F51B, + 0x401128F5,0xC28F5C29, 0xBFED3005,0xEEC2DA6D, + 0x40113333,0x33333333, 0xBFED513B,0x3A018A25, + 0x40113D70,0xA3D70A3D, 0xBFED71B0,0x636066AD, + 0x401147AE,0x147AE148, 0xBFED9164,0x9628F84B, + 0x401151EB,0x851EB852, 0xBFEDB057,0x02955F22, + 0x40115C28,0xF5C28F5C, 0xBFEDCE86,0xDDD5A4E3, + 0x40116666,0x66666666, 0xBFEDEBF3,0x6214EDEA, + 0x401170A3,0xD70A3D71, 0xBFEE089B,0xCE7E89BF, + 0x40117AE1,0x47AE147B, 0xBFEE247F,0x6742E2C9, + 0x4011851E,0xB851EB85, 0xBFEE3F9D,0x759C4D2E, + 0x40118F5C,0x28F5C28F, 0xBFEE59F5,0x47D3B49C, + 0x40119999,0x9999999A, 0xBFEE7386,0x314528EF, + 0x4011A3D7,0x0A3D70A4, 0xBFEE8C4F,0x8A64499B, + 0x4011AE14,0x7AE147AE, 0xBFEEA450,0xB0C08FB8, + 0x4011B851,0xEB851EB8, 0xBFEEBB89,0x07097691, + 0x4011C28F,0x5C28F5C3, 0xBFEED1F7,0xF5128298, + 0x4011CCCC,0xCCCCCCCD, 0xBFEEE79C,0xE7D726A9, + 0x4011D70A,0x3D70A3D7, 0xBFEEFC77,0x517E8793, + 0x4011E147,0xAE147AE1, 0xBFEF1086,0xA95F1DA8, + 0x4011EB85,0x1EB851EC, 0xBFEF23CA,0x6C023462, + 0x4011F5C2,0x8F5C28F6, 0xBFEF3642,0x1B2747E8, + 0x40120000,0x00000000, 0xBFEF47ED,0x3DC74080, + 0x40120A3D,0x70A3D70A, 0xBFEF58CB,0x60178BB1, + 0x4012147A,0xE147AE14, 0xBFEF68DC,0x138D1319, + 0x40121EB8,0x51EB851F, 0xBFEF781E,0xEEDF10E9, + 0x401228F5,0xC28F5C29, 0xBFEF8693,0x8E09C1D3, + 0x40123333,0x33333333, 0xBFEF9439,0x9250F48D, + 0x40123D70,0xA3D70A3D, 0xBFEFA110,0xA24276A3, + 0x401247AE,0x147AE148, 0xBFEFAD18,0x69B85EA7, + 0x401251EB,0x851EB852, 0xBFEFB850,0x99DB33A8, + 0x40125C28,0xF5C28F5C, 0xBFEFC2B8,0xE923F1E9, + 0x40126666,0x66666666, 0xBFEFCC51,0x135DECB9, + 0x401270A3,0xD70A3D71, 0xBFEFD518,0xD9A88D75, + 0x40127AE1,0x47AE147B, 0xBFEFDD10,0x0278EF91, + 0x4012851E,0xB851EB85, 0xBFEFE436,0x599B59C0, + 0x40128F5C,0x28F5C28F, 0xBFEFEA8B,0xB0349405, + 0x40129999,0x9999999A, 0xBFEFF00F,0xDCC31ACE, + 0x4012A3D7,0x0A3D70A4, 0xBFEFF4C2,0xBB202EEF, + 0x4012AE14,0x7AE147AE, 0xBFEFF8A4,0x2C80C295, + 0x4012B851,0xEB851EB8, 0xBFEFFBB4,0x17764310, + 0x4012C28F,0x5C28F5C3, 0xBFEFFDF2,0x67EF3F7E, + 0x4012CCCC,0xCCCCCCCD, 0xBFEFFF5F,0x0F37EC52, + 0x4012D70A,0x3D70A3D7, 0xBFEFFFFA,0x03FA83AC, + 0x4012E147,0xAE147AE1, 0xBFEFFFC3,0x423F8286, + 0x4012EB85,0x1EB851EC, 0xBFEFFEBA,0xCB6DC2B5, + 0x4012F5C2,0x8F5C28F6, 0xBFEFFCE0,0xA64A71BA, + 0x40130000,0x00000000, 0xBFEFFA34,0xDEF8E460, + 0x40130A3D,0x70A3D70A, 0xBFEFF6B7,0x86FA4733, + 0x4013147A,0xE147AE14, 0xBFEFF268,0xB52D2BC8, + 0x40131EB8,0x51EB851F, 0xBFEFED48,0x85CCF2DC, + 0x401328F5,0xC28F5C29, 0xBFEFE757,0x1A71134F, + 0x40133333,0x33333333, 0xBFEFE094,0x9A0C3E00, + 0x40133D70,0xA3D70A3D, 0xBFEFD901,0x30EB5E8D, + 0x401347AE,0x147AE148, 0xBFEFD09D,0x10B478FD, + 0x401351EB,0x851EB852, 0xBFEFC768,0x70656469, + 0x40135C28,0xF5C28F5C, 0xBFEFBD63,0x8C52628E, + 0x40136666,0x66666666, 0xBFEFB28E,0xA6249473, + 0x401370A3,0xD70A3D71, 0xBFEFA6EA,0x04D84C19, + 0x40137AE1,0x47AE147B, 0xBFEF9A75,0xF4BB3B4A, + 0x4013851E,0xB851EB85, 0xBFEF8D32,0xC76A7F82, + 0x40138F5C,0x28F5C28F, 0xBFEF7F20,0xD3D08B19, + 0x40139999,0x9999999A, 0xBFEF7040,0x7622EBA4, + 0x4013A3D7,0x0A3D70A4, 0xBFEF6092,0x0FDFEDB0, + 0x4013AE14,0x7AE147AE, 0xBFEF5016,0x07CC1DCA, + 0x4013B851,0xEB851EB8, 0xBFEF3ECC,0xC9EFA709, + 0x4013C28F,0x5C28F5C3, 0xBFEF2CB6,0xC7938F0C, + 0x4013CCCC,0xCCCCCCCD, 0xBFEF19D4,0x773ECF93, + 0x4013D70A,0x3D70A3D7, 0xBFEF0626,0x54B34DB1, + 0x4013E147,0xAE147AE1, 0xBFEEF1AC,0xE0EAAEC8, + 0x4013EB85,0x1EB851EC, 0xBFEEDC68,0xA2130B42, + 0x4013F5C2,0x8F5C28F6, 0xBFEEC65A,0x238B7F41, + 0x40140000,0x00000000, 0xBFEEAF81,0xF5E09933, + 0x40140A3D,0x70A3D70A, 0xBFEE97E0,0xAEC8A688, + 0x4014147A,0xE147AE14, 0xBFEE7F76,0xE91FDE8D, + 0x40141EB8,0x51EB851F, 0xBFEE6645,0x44E46B89, + 0x401428F5,0xC28F5C29, 0xBFEE4C4C,0x6732523C, + 0x40143333,0x33333333, 0xBFEE318C,0xFA3F37C9, + 0x40143D70,0xA3D70A3D, 0xBFEE1607,0xAD560644, + 0x401447AE,0x147AE148, 0xBFEDF9BD,0x34D26FE0, + 0x401451EB,0x851EB852, 0xBFEDDCAE,0x4A1C5102, + 0x40145C28,0xF5C28F5C, 0xBFEDBEDB,0xABA2F11E, + 0x40146666,0x66666666, 0xBFEDA046,0x1CD822BC, + 0x401470A3,0xD70A3D71, 0xBFED80EE,0x662B4296, + 0x40147AE1,0x47AE147B, 0xBFED60D5,0x5504161A, + 0x4014851E,0xB851EB85, 0xBFED3FFB,0xBBBD8930, + 0x40148F5C,0x28F5C28F, 0xBFED1E62,0x71A04BB4, + 0x40149999,0x9999999A, 0xBFECFC0A,0x52DD4E96, + 0x4014A3D7,0x0A3D70A4, 0xBFECD8F4,0x408820D8, + 0x4014AE14,0x7AE147AE, 0xBFECB521,0x20912C71, + 0x4014B851,0xEB851EB8, 0xBFEC9091,0xDDBFD36F, + 0x4014C28F,0x5C28F5C3, 0xBFEC6B47,0x67AC6D4F, + 0x4014CCCC,0xCCCCCCCD, 0xBFEC4542,0xB2BA24D7, + 0x4014D70A,0x3D70A3D7, 0xBFEC1E84,0xB810B668, + 0x4014E147,0xAE147AE1, 0xBFEBF70E,0x75960F2E, + 0x4014EB85,0x1EB851EC, 0xBFEBCEE0,0xEDE7CD32, + 0x4014F5C2,0x8F5C28F6, 0xBFEBA5FD,0x2854A088, + 0x40150000,0x00000000, 0xBFEB7C64,0x30D58DA3, + 0x40150A3D,0x70A3D70A, 0xBFEB5217,0x18071138, + 0x4015147A,0xE147AE14, 0xBFEB2716,0xF32225A8, + 0x40151EB8,0x51EB851F, 0xBFEAFB64,0xDBF52A31, + 0x401528F5,0xC28F5C29, 0xBFEACF01,0xF0DCAC29, + 0x40153333,0x33333333, 0xBFEAA1EF,0x54BC123B, + 0x40153D70,0xA3D70A3D, 0xBFEA742E,0x2EF62A19, + 0x401547AE,0x147AE148, 0xBFEA45BF,0xAB6598A1, + 0x401551EB,0x851EB852, 0xBFEA16A4,0xFA552CD7, + 0x40155C28,0xF5C28F5C, 0xBFE9E6DF,0x50781594, + 0x40156666,0x66666666, 0xBFE9B66F,0xE6E1FA88, + 0x401570A3,0xD70A3D71, 0xBFE98557,0xFAFEF867, + 0x40157AE1,0x47AE147B, 0xBFE95398,0xCE8B80C9, + 0x4015851E,0xB851EB85, 0xBFE92133,0xA78C1D7E, + 0x40158F5C,0x28F5C28F, 0xBFE8EE29,0xD0451817, + 0x40159999,0x9999999A, 0xBFE8BA7C,0x97320570, + 0x4015A3D7,0x0A3D70A4, 0xBFE8862D,0x4EFD35B4, + 0x4015AE14,0x7AE147AE, 0xBFE8513D,0x4E7708CC, + 0x4015B851,0xEB851EB8, 0xBFE81BAD,0xF08D27D0, + 0x4015C28F,0x5C28F5C3, 0xBFE7E580,0x9441A35C, + 0x4015CCCC,0xCCCCCCCD, 0xBFE7AEB6,0x9CA1F74F, + 0x4015D70A,0x3D70A3D7, 0xBFE77751,0x70BDF3CE, + 0x4015E147,0xAE147AE1, 0xBFE73F52,0x7B9E8C3D, + 0x4015EB85,0x1EB851EC, 0xBFE706BB,0x2C3C8C04, + 0x4015F5C2,0x8F5C28F6, 0xBFE6CD8C,0xF57731B3, + 0x40160000,0x00000000, 0xBFE693C9,0x4E0AB057, + 0x40160A3D,0x70A3D70A, 0xBFE65971,0xB08697B7, + 0x4016147A,0xE147AE14, 0xBFE61E87,0x9B442369, + 0x40161EB8,0x51EB851F, 0xBFE5E30C,0x905C7109, + 0x401628F5,0xC28F5C29, 0xBFE5A702,0x159E9E04, + 0x40163333,0x33333333, 0xBFE56A69,0xB485CCD3, + 0x40163D70,0xA3D70A3D, 0xBFE52D44,0xFA2F1262, + 0x401647AE,0x147AE148, 0xBFE4EF95,0x774F4B7F, + 0x401651EB,0x851EB852, 0xBFE4B15C,0xC028DAE9, + 0x40165C28,0xF5C28F5C, 0xBFE4729C,0x6C814FD9, + 0x40166666,0x66666666, 0xBFE43356,0x1796F5BB, + 0x401670A3,0xD70A3D71, 0xBFE3F38B,0x60164D0B, + 0x40167AE1,0x47AE147B, 0xBFE3B33D,0xE80F6DD8, + 0x4016851E,0xB851EB85, 0xBFE3726F,0x54EB53D5, + 0x40168F5C,0x28F5C28F, 0xBFE33121,0x4F6114B4, + 0x40169999,0x9999999A, 0xBFE2EF55,0x836B00B5, + 0x4016A3D7,0x0A3D70A4, 0xBFE2AD0D,0xA03BADFF, + 0x4016AE14,0x7AE147AE, 0xBFE26A4B,0x5832EE95, + 0x4016B851,0xEB851EB8, 0xBFE22710,0x60D2B1C0, + 0x4016C28F,0x5C28F5C3, 0xBFE1E35E,0x72B3D0CB, + 0x4016CCCC,0xCCCCCCCD, 0xBFE19F37,0x497AC7A0, + 0x4016D70A,0x3D70A3D7, 0xBFE15A9C,0xA3CC5935, + 0x4016E147,0xAE147AE1, 0xBFE11590,0x4342208A, + 0x4016EB85,0x1EB851EC, 0xBFE0D013,0xEC5F0E27, + 0x4016F5C2,0x8F5C28F6, 0xBFE08A29,0x6683D2A4, + 0x40170000,0x00000000, 0xBFE043D2,0x7BE3362F, + 0x40170A3D,0x70A3D70A, 0xBFDFFA21,0xF2ECBB9B, + 0x4017147A,0xE147AE14, 0xBFDF6BCD,0x5DE1FCB6, + 0x40171EB8,0x51EB851F, 0xBFDEDCAA,0xDD6AFB2F, + 0x401728F5,0xC28F5C29, 0xBFDE4CBE,0x1B92039D, + 0x40173333,0x33333333, 0xBFDDBC0A,0xC78EDFD8, + 0x40173D70,0xA3D70A3D, 0xBFDD2A94,0x95AEB1CA, + 0x401747AE,0x147AE148, 0xBFDC985F,0x3F3BAC93, + 0x401751EB,0x851EB852, 0xBFDC056E,0x8264AD54, + 0x40175C28,0xF5C28F5C, 0xBFDB71C6,0x2224B35F, + 0x40176666,0x66666666, 0xBFDADD69,0xE62A3979, + 0x401770A3,0xD70A3D71, 0xBFDA485D,0x9ABE7006, + 0x40177AE1,0x47AE147B, 0xBFD9B2A5,0x10AC5952, + 0x4017851E,0xB851EB85, 0xBFD91C44,0x1D27C7C9, + 0x40178F5C,0x28F5C28F, 0xBFD8853E,0x99B43FD2, + 0x40179999,0x9999999A, 0xBFD7ED98,0x640BBD1B, + 0x4017A3D7,0x0A3D70A4, 0xBFD75555,0x5E055C97, + 0x4017AE14,0x7AE147AE, 0xBFD6BC79,0x6D7BEAFC, + 0x4017B851,0xEB851EB8, 0xBFD62308,0x7C345980, + 0x4017C28F,0x5C28F5C3, 0xBFD58906,0x77C41896, + 0x4017CCCC,0xCCCCCCCD, 0xBFD4EE77,0x51775A0A, + 0x4017D70A,0x3D70A3D7, 0xBFD4535E,0xFE373A29, + 0x4017E147,0xAE147AE1, 0xBFD3B7C1,0x766FD1D8, + 0x4017EB85,0x1EB851EC, 0xBFD31BA2,0xB5F63148, + 0x4017F5C2,0x8F5C28F6, 0xBFD27F06,0xBBEE44B0, + 0x40180000,0x00000000, 0xBFD1E1F1,0x8AB0A2C0, + 0x40180A3D,0x70A3D70A, 0xBFD14467,0x27B046A7, + 0x4018147A,0xE147AE14, 0xBFD0A66B,0x9B60357B, + 0x40181EB8,0x51EB851F, 0xBFD00802,0xF1190FF5, + 0x401828F5,0xC28F5C29, 0xBFCED262,0x6DFD22FC, + 0x40183333,0x33333333, 0xBFCD93F4,0xFBC9F8AA, + 0x40183D70,0xA3D70A3D, 0xBFCC54C5,0xB26CE959, + 0x401847AE,0x147AE148, 0xBFCB14DC,0xBDB094F6, + 0x401851EB,0x851EB852, 0xBFC9D442,0x4E2066CE, + 0x40185C28,0xF5C28F5C, 0xBFC892FE,0x98D2E904, + 0x40186666,0x66666666, 0xBFC75119,0xD733FB7B, + 0x401870A3,0xD70A3D71, 0xBFC60E9C,0x46CEED9F, + 0x40187AE1,0x47AE147B, 0xBFC4CB8E,0x29187DE2, + 0x4018851E,0xB851EB85, 0xBFC387F7,0xC338BE5F, + 0x40188F5C,0x28F5C28F, 0xBFC243E1,0x5DD4E279, + 0x40189999,0x9999999A, 0xBFC0FF53,0x44D8F4DA, + 0x4018A3D7,0x0A3D70A4, 0xBFBF74AB,0x8E82F16F, + 0x4018AE14,0x7AE147AE, 0xBFBCE9E2,0x6DC9EB9B, + 0x4018B851,0xEB851EB8, 0xBFBA5E5B,0xD07AE5B3, + 0x4018C28F,0x5C28F5C3, 0xBFB7D228,0x6463BC2E, + 0x4018CCCC,0xCCCCCCCD, 0xBFB54558,0xDBBECD1D, + 0x4018D70A,0x3D70A3D7, 0xBFB2B7FD,0xECC58B58, + 0x4018E147,0xAE147AE1, 0xBFB02A28,0x5142F9F1, + 0x4018EB85,0x1EB851EC, 0xBFAB37D1,0x8C4C1D8D, + 0x4018F5C2,0x8F5C28F6, 0xBFA61AA0,0x1628040A, + 0x40190000,0x00000000, 0xBFA0FCDD,0xC3F512BC, + 0x40190A3D,0x70A3D70A, 0xBF97BD58,0x3A881B26, + 0x4019147A,0xE147AE14, 0xBF8B00B2,0xB1FD4F19, + 0x40191EB8,0x51EB851F, 0xBF6A180F,0xE0F0FDA7, + 0x401928F5,0xC28F5C29, 0x3F7BE9AB,0x04151703, + 0x40193333,0x33333333, 0x3F9137A9,0xC2CB3E7E, + }; + +LOCAL_D const TUint32 CosineTest[] = + { + 0x00000000,0x00000000, 0x3FF00000,0x00000000, + 0x3F50624D,0xD2F1A9FC, 0x3FEFFFFE,0xF390876C, + 0x3F60624D,0xD2F1A9FC, 0x3FEFFFFB,0xCE422F47, + 0x3F689374,0xBC6A7EFA, 0x3FEFFFF6,0x90152C59, + 0x3F70624D,0xD2F1A9FC, 0x3FEFFFEF,0x3909D697, + 0x3F747AE1,0x47AE147B, 0x3FEFFFE5,0xC920A926, + 0x3F789374,0xBC6A7EFA, 0x3FEFFFDA,0x405A425B, + 0x3F7CAC08,0x3126E979, 0x3FEFFFCC,0x9EB763B9, + 0x3F80624D,0xD2F1A9FC, 0x3FEFFFBC,0xE438F1F2, + 0x3F826E97,0x8D4FDF3B, 0x3FEFFFAB,0x10DFF4E7, + 0x3F847AE1,0x47AE147B, 0x3FEFFF97,0x24AD97AA, + 0x3F86872B,0x020C49BA, 0x3FEFFF81,0x1FA32879, + 0x3F889374,0xBC6A7EFA, 0x3FEFFF69,0x01C218C1, + 0x3F8A9FBE,0x76C8B439, 0x3FEFFF4E,0xCB0BFD20, + 0x3F8CAC08,0x3126E979, 0x3FEFFF32,0x7B828D61, + 0x3F8EB851,0xEB851EB8, 0x3FEFFF14,0x1327A47C, + 0x3F90624D,0xD2F1A9FC, 0x3FEFFEF3,0x91FD409A, + 0x3F916872,0xB020C49C, 0x3FEFFED0,0xF8058311, + 0x3F926E97,0x8D4FDF3B, 0x3FEFFEAC,0x4542B064, + 0x3F9374BC,0x6A7EF9DB, 0x3FEFFE85,0x79B73046, + 0x3F947AE1,0x47AE147B, 0x3FEFFE5C,0x95658D96, + 0x3F958106,0x24DD2F1B, 0x3FEFFE31,0x98507662, + 0x3F96872B,0x020C49BA, 0x3FEFFE04,0x827ABBE4, + 0x3F978D4F,0xDF3B645A, 0x3FEFFDD5,0x53E75284, + 0x3F989374,0xBC6A7EFA, 0x3FEFFDA4,0x0C9951D6, + 0x3F999999,0x9999999A, 0x3FEFFD70,0xAC93F49E, + 0x3F9A9FBE,0x76C8B439, 0x3FEFFD3B,0x33DA98C8, + 0x3F9BA5E3,0x53F7CED9, 0x3FEFFD03,0xA270BF6F, + 0x3F9CAC08,0x3126E979, 0x3FEFFCC9,0xF85A0CDB, + 0x3F9DB22D,0x0E560419, 0x3FEFFC8E,0x359A487E, + 0x3F9EB851,0xEB851EB8, 0x3FEFFC50,0x5A355CF6, + 0x3F9FBE76,0xC8B43958, 0x3FEFFC10,0x662F580D, + 0x3FA0624D,0xD2F1A9FC, 0x3FEFFBCE,0x598C6AB9, + 0x3FA0E560,0x4189374C, 0x3FEFFB8A,0x3450E918, + 0x3FA16872,0xB020C49C, 0x3FEFFB43,0xF6814A76, + 0x3FA1EB85,0x1EB851EC, 0x3FEFFAFB,0xA0222947, + 0x3FA26E97,0x8D4FDF3B, 0x3FEFFAB1,0x3138432A, + 0x3FA2F1A9,0xFBE76C8B, 0x3FEFFA64,0xA9C878E6, + 0x3FA374BC,0x6A7EF9DB, 0x3FEFFA16,0x09D7CE6F, + 0x3FA3F7CE,0xD916872B, 0x3FEFF9C5,0x516B6ADF, + 0x3FA47AE1,0x47AE147B, 0x3FEFF972,0x80889878, + 0x3FA4FDF3,0xB645A1CB, 0x3FEFF91D,0x9734C4A8, + 0x3FA58106,0x24DD2F1B, 0x3FEFF8C6,0x95758001, + 0x3FA60418,0x9374BC6A, 0x3FEFF86D,0x7B507E3F, + 0x3FA6872B,0x020C49BA, 0x3FEFF812,0x48CB9646, + 0x3FA70A3D,0x70A3D70A, 0x3FEFF7B4,0xFDECC21E, + 0x3FA78D4F,0xDF3B645A, 0x3FEFF755,0x9ABA1EF7, + 0x3FA81062,0x4DD2F1AA, 0x3FEFF6F4,0x1F39ED28, + 0x3FA89374,0xBC6A7EFA, 0x3FEFF690,0x8B72902C, + 0x3FA91687,0x2B020C4A, 0x3FEFF62A,0xDF6A8EA5, + 0x3FA99999,0x9999999A, 0x3FEFF5C3,0x1B289258, + 0x3FAA1CAC,0x083126E9, 0x3FEFF559,0x3EB3682F, + 0x3FAA9FBE,0x76C8B439, 0x3FEFF4ED,0x4A12003A, + 0x3FAB22D0,0xE5604189, 0x3FEFF47F,0x3D4B6DA8, + 0x3FABA5E3,0x53F7CED9, 0x3FEFF40F,0x1866E6D0, + 0x3FAC28F5,0xC28F5C29, 0x3FEFF39C,0xDB6BC529, + 0x3FACAC08,0x3126E979, 0x3FEFF328,0x8661854B, + 0x3FAD2F1A,0x9FBE76C9, 0x3FEFF2B2,0x194FC6F1, + 0x3FADB22D,0x0E560419, 0x3FEFF239,0x943E4CF8, + 0x3FAE353F,0x7CED9168, 0x3FEFF1BE,0xF734FD5D, + 0x3FAEB851,0xEB851EB8, 0x3FEFF142,0x423BE13B, + 0x3FAF3B64,0x5A1CAC08, 0x3FEFF0C3,0x755B24CF, + 0x3FAFBE76,0xC8B43958, 0x3FEFF042,0x909B1774, + 0x3FB020C4,0x9BA5E354, 0x3FEFEFBF,0x94042BA3, + 0x3FB0624D,0xD2F1A9FC, 0x3FEFEF3A,0x7F9EF6F5, + 0x3FB0A3D7,0x0A3D70A4, 0x3FEFEEB3,0x5374321D, + 0x3FB0E560,0x4189374C, 0x3FEFEE2A,0x0F8CB8ED, + 0x3FB126E9,0x78D4FDF4, 0x3FEFED9E,0xB3F18A54, + 0x3FB16872,0xB020C49C, 0x3FEFED11,0x40ABC85A, + 0x3FB1A9FB,0xE76C8B44, 0x3FEFEC81,0xB5C4B823, + 0x3FB1EB85,0x1EB851EC, 0x3FEFEBF0,0x1345C1EF, + 0x3FB22D0E,0x56041893, 0x3FEFEB5C,0x59387115, + 0x3FB26E97,0x8D4FDF3B, 0x3FEFEAC6,0x87A67408, + 0x3FB2B020,0xC49BA5E3, 0x3FEFEA2E,0x9E999C51, + 0x3FB2F1A9,0xFBE76C8B, 0x3FEFE994,0x9E1BDE93, + 0x3FB33333,0x33333333, 0x3FEFE8F8,0x86375286, + 0x3FB374BC,0x6A7EF9DB, 0x3FEFE85A,0x56F632FA, + 0x3FB3B645,0xA1CAC083, 0x3FEFE7BA,0x1062DDD4, + 0x3FB3F7CE,0xD916872B, 0x3FEFE717,0xB287D411, + 0x3FB43958,0x10624DD3, 0x3FEFE673,0x3D6FB9BE, + 0x3FB47AE1,0x47AE147B, 0x3FEFE5CC,0xB12555FF, + 0x3FB4BC6A,0x7EF9DB23, 0x3FEFE524,0x0DB39309, + 0x3FB4FDF3,0xB645A1CB, 0x3FEFE479,0x53257E27, + 0x3FB53F7C,0xED916873, 0x3FEFE3CC,0x818647B2, + 0x3FB58106,0x24DD2F1B, 0x3FEFE31D,0x98E14314, + 0x3FB5C28F,0x5C28F5C3, 0x3FEFE26C,0x9941E6CA, + 0x3FB60418,0x9374BC6A, 0x3FEFE1B9,0x82B3CC5F, + 0x3FB645A1,0xCAC08312, 0x3FEFE104,0x5542B06B, + 0x3FB6872B,0x020C49BA, 0x3FEFE04D,0x10FA7296, + 0x3FB6C8B4,0x39581062, 0x3FEFDF93,0xB5E71595, + 0x3FB70A3D,0x70A3D70A, 0x3FEFDED8,0x4414BF29, + 0x3FB74BC6,0xA7EF9DB2, 0x3FEFDE1A,0xBB8FB81D, + 0x3FB78D4F,0xDF3B645A, 0x3FEFDD5B,0x1C646C4A, + 0x3FB7CED9,0x16872B02, 0x3FEFDC99,0x669F6A90, + 0x3FB81062,0x4DD2F1AA, 0x3FEFDBD5,0x9A4D64DA, + 0x3FB851EB,0x851EB852, 0x3FEFDB0F,0xB77B301A, + 0x3FB89374,0xBC6A7EFA, 0x3FEFDA47,0xBE35C449, + 0x3FB8D4FD,0xF3B645A2, 0x3FEFD97D,0xAE8A3C69, + 0x3FB91687,0x2B020C4A, 0x3FEFD8B1,0x8885D67F, + 0x3FB95810,0x624DD2F2, 0x3FEFD7E3,0x4C35F398, + 0x3FB99999,0x9999999A, 0x3FEFD712,0xF9A817C1, + 0x3FB9DB22,0xD0E56042, 0x3FEFD640,0x90E9EA0C, + 0x3FBA1CAC,0x083126E9, 0x3FEFD56C,0x1209348F, + 0x3FBA5E35,0x3F7CED91, 0x3FEFD495,0x7D13E45F, + 0x3FBA9FBE,0x76C8B439, 0x3FEFD3BC,0xD2180992, + 0x3FBAE147,0xAE147AE1, 0x3FEFD2E2,0x1123D73D, + 0x3FBB22D0,0xE5604189, 0x3FEFD205,0x3A45A375, + 0x3FBB645A,0x1CAC0831, 0x3FEFD126,0x4D8BE74B, + 0x3FBBA5E3,0x53F7CED9, 0x3FEFD045,0x4B053ECD, + 0x3FBBE76C,0x8B439581, 0x3FEFCF62,0x32C06905, + 0x3FBC28F5,0xC28F5C29, 0x3FEFCE7D,0x04CC47F8, + 0x3FBC6A7E,0xF9DB22D1, 0x3FEFCD95,0xC137E0A5, + 0x3FBCAC08,0x3126E979, 0x3FEFCCAC,0x68125B02, + 0x3FBCED91,0x6872B021, 0x3FEFCBC0,0xF96B01FE, + 0x3FBD2F1A,0x9FBE76C9, 0x3FEFCAD3,0x7551437F, + 0x3FBD70A3,0xD70A3D71, 0x3FEFC9E3,0xDBD4B061, + 0x3FBDB22D,0x0E560419, 0x3FEFC8F2,0x2D04FC74, + 0x3FBDF3B6,0x45A1CAC1, 0x3FEFC7FE,0x68F1FE7B, + 0x3FBE353F,0x7CED9168, 0x3FEFC708,0x8FABB02E, + 0x3FBE76C8,0xB4395810, 0x3FEFC610,0xA1422E33, + 0x3FBEB851,0xEB851EB8, 0x3FEFC516,0x9DC5B825, + 0x3FBEF9DB,0x22D0E560, 0x3FEFC41A,0x8546B08B, + 0x3FBF3B64,0x5A1CAC08, 0x3FEFC31C,0x57D59CDC, + 0x3FBF7CED,0x916872B0, 0x3FEFC21C,0x1583257B, + 0x3FBFBE76,0xC8B43958, 0x3FEFC119,0xBE6015BA, + 0x3FC00000,0x00000000, 0x3FEFC015,0x527D5BD3, + 0x3FC020C4,0x9BA5E354, 0x3FEFBF0E,0xD1EC08ED, + 0x3FC04189,0x374BC6A8, 0x3FEFBE06,0x3CBD5114, + 0x3FC0624D,0xD2F1A9FC, 0x3FEFBCFB,0x93028B40, + 0x3FC08312,0x6E978D50, 0x3FEFBBEE,0xD4CD314D, + 0x3FC0A3D7,0x0A3D70A4, 0x3FEFBAE0,0x022EDFFE, + 0x3FC0C49B,0xA5E353F8, 0x3FEFB9CF,0x1B3956F8, + 0x3FC0E560,0x4189374C, 0x3FEFB8BC,0x1FFE78C7, + 0x3FC10624,0xDD2F1AA0, 0x3FEFB7A7,0x10904AD6, + 0x3FC126E9,0x78D4FDF4, 0x3FEFB68F,0xED00F571, + 0x3FC147AE,0x147AE148, 0x3FEFB576,0xB562C3C5, + 0x3FC16872,0xB020C49C, 0x3FEFB45B,0x69C823DD, + 0x3FC18937,0x4BC6A7F0, 0x3FEFB33E,0x0A43A6A1, + 0x3FC1A9FB,0xE76C8B44, 0x3FEFB21E,0x96E7FFD5, + 0x3FC1CAC0,0x83126E98, 0x3FEFB0FD,0x0FC80618, + 0x3FC1EB85,0x1EB851EC, 0x3FEFAFD9,0x74F6B2E2, + 0x3FC20C49,0xBA5E353F, 0x3FEFAEB3,0xC6872285, + 0x3FC22D0E,0x56041893, 0x3FEFAD8C,0x048C9427, + 0x3FC24DD2,0xF1A9FBE7, 0x3FEFAC62,0x2F1A69C7, + 0x3FC26E97,0x8D4FDF3B, 0x3FEFAB36,0x46442837, + 0x3FC28F5C,0x28F5C28F, 0x3FEFAA08,0x4A1D771C, + 0x3FC2B020,0xC49BA5E3, 0x3FEFA8D8,0x3ABA20EE, + 0x3FC2D0E5,0x60418937, 0x3FEFA7A6,0x182E12F5, + 0x3FC2F1A9,0xFBE76C8B, 0x3FEFA671,0xE28D5D49, + 0x3FC3126E,0x978D4FDF, 0x3FEFA53B,0x99EC32CE, + 0x3FC33333,0x33333333, 0x3FEFA403,0x3E5EE937, + 0x3FC353F7,0xCED91687, 0x3FEFA2C8,0xCFF9F903, + 0x3FC374BC,0x6A7EF9DB, 0x3FEFA18C,0x4ED1FD78, + 0x3FC39581,0x0624DD2F, 0x3FEFA04D,0xBAFBB4A7, + 0x3FC3B645,0xA1CAC083, 0x3FEF9F0D,0x148BFF67, + 0x3FC3D70A,0x3D70A3D7, 0x3FEF9DCA,0x5B97E158, + 0x3FC3F7CE,0xD916872B, 0x3FEF9C85,0x903480DA, + 0x3FC41893,0x74BC6A7F, 0x3FEF9B3E,0xB2772714, + 0x3FC43958,0x10624DD3, 0x3FEF99F5,0xC2753FED, + 0x3FC45A1C,0xAC083127, 0x3FEF98AA,0xC0445A0C, + 0x3FC47AE1,0x47AE147B, 0x3FEF975D,0xABFA26D9, + 0x3FC49BA5,0xE353F7CF, 0x3FEF960E,0x85AC7A78, + 0x3FC4BC6A,0x7EF9DB23, 0x3FEF94BD,0x4D714BC9, + 0x3FC4DD2F,0x1A9FBE77, 0x3FEF936A,0x035EB469, + 0x3FC4FDF3,0xB645A1CB, 0x3FEF9214,0xA78AF0AA, + 0x3FC51EB8,0x51EB851F, 0x3FEF90BD,0x3A0C5F9A, + 0x3FC53F7C,0xED916873, 0x3FEF8F63,0xBAF982FB, + 0x3FC56041,0x89374BC7, 0x3FEF8E08,0x2A68FF45, + 0x3FC58106,0x24DD2F1B, 0x3FEF8CAA,0x88719BA3, + 0x3FC5A1CA,0xC083126F, 0x3FEF8B4A,0xD52A41F1, + 0x3FC5C28F,0x5C28F5C3, 0x3FEF89E9,0x10A9FEBE, + 0x3FC5E353,0xF7CED917, 0x3FEF8885,0x3B080143, + 0x3FC60418,0x9374BC6A, 0x3FEF871F,0x545B9B6C, + 0x3FC624DD,0x2F1A9FBE, 0x3FEF85B7,0x5CBC41CE, + 0x3FC645A1,0xCAC08312, 0x3FEF844D,0x54418BA7, + 0x3FC66666,0x66666666, 0x3FEF82E1,0x3B0332E1, + 0x3FC6872B,0x020C49BA, 0x3FEF8173,0x1119140B, + 0x3FC6A7EF,0x9DB22D0E, 0x3FEF8002,0xD69B2E59, + 0x3FC6C8B4,0x39581062, 0x3FEF7E90,0x8BA1A3A6, + 0x3FC6E978,0xD4FDF3B6, 0x3FEF7D1C,0x3044B86C, + 0x3FC70A3D,0x70A3D70A, 0x3FEF7BA5,0xC49CD3C9, + 0x3FC72B02,0x0C49BA5E, 0x3FEF7A2D,0x48C27F77, + 0x3FC74BC6,0xA7EF9DB2, 0x3FEF78B2,0xBCCE67D1, + 0x3FC76C8B,0x43958106, 0x3FEF7736,0x20D95BCC, + 0x3FC78D4F,0xDF3B645A, 0x3FEF75B7,0x74FC4CF8, + 0x3FC7AE14,0x7AE147AE, 0x3FEF7436,0xB9504F7E, + 0x3FC7CED9,0x16872B02, 0x3FEF72B3,0xEDEE9A1D, + 0x3FC7EF9D,0xB22D0E56, 0x3FEF712F,0x12F0862C, + 0x3FC81062,0x4DD2F1AA, 0x3FEF6FA8,0x286F8F92, + 0x3FC83126,0xE978D4FE, 0x3FEF6E1F,0x2E8554CD, + 0x3FC851EB,0x851EB852, 0x3FEF6C94,0x254B96E7, + 0x3FC872B0,0x20C49BA6, 0x3FEF6B07,0x0CDC397C, + 0x3FC89374,0xBC6A7EFA, 0x3FEF6977,0xE55142B2, + 0x3FC8B439,0x5810624E, 0x3FEF67E6,0xAEC4DB3F, + 0x3FC8D4FD,0xF3B645A2, 0x3FEF6653,0x69514E5D, + 0x3FC8F5C2,0x8F5C28F6, 0x3FEF64BE,0x151109D3, + 0x3FC91687,0x2B020C4A, 0x3FEF6326,0xB21E9DEB, + 0x3FC9374B,0xC6A7EF9E, 0x3FEF618D,0x4094BD75, + 0x3FC95810,0x624DD2F2, 0x3FEF5FF1,0xC08E3DC4, + 0x3FC978D4,0xFDF3B646, 0x3FEF5E54,0x322616AA, + 0x3FC99999,0x9999999A, 0x3FEF5CB4,0x9577627A, + 0x3FC9BA5E,0x353F7CEE, 0x3FEF5B12,0xEA9D5E04, + 0x3FC9DB22,0xD0E56042, 0x3FEF596F,0x31B36894, + 0x3FC9FBE7,0x6C8B4396, 0x3FEF57C9,0x6AD503EF, + 0x3FCA1CAC,0x083126E9, 0x3FEF5621,0x961DD453, + 0x3FCA3D70,0xA3D70A3D, 0x3FEF5477,0xB3A9A074, + 0x3FCA5E35,0x3F7CED91, 0x3FEF52CB,0xC3945179, + 0x3FCA7EF9,0xDB22D0E5, 0x3FEF511D,0xC5F9F2FE, + 0x3FCA9FBE,0x76C8B439, 0x3FEF4F6D,0xBAF6B30E, + 0x3FCAC083,0x126E978D, 0x3FEF4DBB,0xA2A6E224, + 0x3FCAE147,0xAE147AE1, 0x3FEF4C07,0x7D26F327, + 0x3FCB020C,0x49BA5E35, 0x3FEF4A51,0x4A937B6A, + 0x3FCB22D0,0xE5604189, 0x3FEF4899,0x0B0932A8, + 0x3FCB4395,0x810624DD, 0x3FEF46DE,0xBEA4F306, + 0x3FCB645A,0x1CAC0831, 0x3FEF4522,0x6583B90D, + 0x3FCB851E,0xB851EB85, 0x3FEF4363,0xFFC2A3A8, + 0x3FCBA5E3,0x53F7CED9, 0x3FEF41A3,0x8D7EF428, + 0x3FCBC6A7,0xEF9DB22D, 0x3FEF3FE1,0x0ED60E39, + 0x3FCBE76C,0x8B439581, 0x3FEF3E1C,0x83E577E7, + 0x3FCC0831,0x26E978D5, 0x3FEF3C55,0xECCAD99C, + 0x3FCC28F5,0xC28F5C29, 0x3FEF3A8D,0x49A3FE19, + 0x3FCC49BA,0x5E353F7D, 0x3FEF38C2,0x9A8ED278, + 0x3FCC6A7E,0xF9DB22D1, 0x3FEF36F5,0xDFA96629, + 0x3FCC8B43,0x95810625, 0x3FEF3527,0x1911EAF1, + 0x3FCCAC08,0x3126E979, 0x3FEF3356,0x46E6B4E7, + 0x3FCCCCCC,0xCCCCCCCD, 0x3FEF3183,0x69463A71, + 0x3FCCED91,0x6872B021, 0x3FEF2FAE,0x804F1443, + 0x3FCD0E56,0x04189375, 0x3FEF2DD7,0x8C1FFD60, + 0x3FCD2F1A,0x9FBE76C9, 0x3FEF2BFE,0x8CD7D312, + 0x3FCD4FDF,0x3B645A1D, 0x3FEF2A23,0x829594EC, + 0x3FCD70A3,0xD70A3D71, 0x3FEF2846,0x6D7864C9, + 0x3FCD9168,0x72B020C5, 0x3FEF2667,0x4D9F86C4, + 0x3FCDB22D,0x0E560419, 0x3FEF2486,0x232A613F, + 0x3FCDD2F1,0xA9FBE76D, 0x3FEF22A2,0xEE387CD7, + 0x3FCDF3B6,0x45A1CAC1, 0x3FEF20BD,0xAEE9846C, + 0x3FCE147A,0xE147AE14, 0x3FEF1ED6,0x655D4515, + 0x3FCE353F,0x7CED9168, 0x3FEF1CED,0x11B3AE25, + 0x3FCE5604,0x189374BC, 0x3FEF1B01,0xB40CD128, + 0x3FCE76C8,0xB4395810, 0x3FEF1914,0x4C88E1DC, + 0x3FCE978D,0x4FDF3B64, 0x3FEF1724,0xDB483636, + 0x3FCEB851,0xEB851EB8, 0x3FEF1533,0x606B465A, + 0x3FCED916,0x872B020C, 0x3FEF133F,0xDC12AC9B, + 0x3FCEF9DB,0x22D0E560, 0x3FEF114A,0x4E5F257C, + 0x3FCF1A9F,0xBE76C8B4, 0x3FEF0F52,0xB7718FA7, + 0x3FCF3B64,0x5A1CAC08, 0x3FEF0D59,0x176AEBF1, + 0x3FCF5C28,0xF5C28F5C, 0x3FEF0B5D,0x6E6C5D55, + 0x3FCF7CED,0x916872B0, 0x3FEF095F,0xBC9728F3, + 0x3FCF9DB2,0x2D0E5604, 0x3FEF0760,0x020CB60C, + 0x3FCFBE76,0xC8B43958, 0x3FEF055E,0x3EEE8E03, + 0x3FCFDF3B,0x645A1CAC, 0x3FEF035A,0x735E5C56, + 0x3FD00000,0x00000000, 0x3FEF0154,0x9F7DEEA1, + 0x3FD01062,0x4DD2F1AA, 0x3FEEFF4C,0xC36F3499, + 0x3FD020C4,0x9BA5E354, 0x3FEEFD42,0xDF544009, + 0x3FD03126,0xE978D4FE, 0x3FEEFB36,0xF34F44D2, + 0x3FD04189,0x374BC6A8, 0x3FEEF928,0xFF8298E8, + 0x3FD051EB,0x851EB852, 0x3FEEF719,0x0410B44E, + 0x3FD0624D,0xD2F1A9FC, 0x3FEEF507,0x011C3117, + 0x3FD072B0,0x20C49BA6, 0x3FEEF2F2,0xF6C7CB60, + 0x3FD08312,0x6E978D50, 0x3FEEF0DC,0xE5366151, + 0x3FD09374,0xBC6A7EFA, 0x3FEEEEC4,0xCC8AF31A, + 0x3FD0A3D7,0x0A3D70A4, 0x3FEEECAA,0xACE8A2EF, + 0x3FD0B439,0x5810624E, 0x3FEEEA8E,0x8672B506, + 0x3FD0C49B,0xA5E353F8, 0x3FEEE870,0x594C8F97, + 0x3FD0D4FD,0xF3B645A2, 0x3FEEE650,0x2599BAD8, + 0x3FD0E560,0x4189374C, 0x3FEEE42D,0xEB7DE0F9, + 0x3FD0F5C2,0x8F5C28F6, 0x3FEEE209,0xAB1CCE26, + 0x3FD10624,0xDD2F1AA0, 0x3FEEDFE3,0x649A7081, + 0x3FD11687,0x2B020C4A, 0x3FEEDDBB,0x181AD820, + 0x3FD126E9,0x78D4FDF4, 0x3FEEDB90,0xC5C2370D, + 0x3FD1374B,0xC6A7EF9E, 0x3FEED964,0x6DB4E141, + 0x3FD147AE,0x147AE148, 0x3FEED736,0x10174CA3, + 0x3FD15810,0x624DD2F2, 0x3FEED505,0xAD0E1104, + 0x3FD16872,0xB020C49C, 0x3FEED2D3,0x44BDE821, + 0x3FD178D4,0xFDF3B646, 0x3FEED09E,0xD74BAD9A, + 0x3FD18937,0x4BC6A7F0, 0x3FEECE68,0x64DC5EF5, + 0x3FD19999,0x9999999A, 0x3FEECC2F,0xED951B99, + 0x3FD1A9FB,0xE76C8B44, 0x3FEEC9F5,0x719B24CC, + 0x3FD1BA5E,0x353F7CEE, 0x3FEEC7B8,0xF113DDB3, + 0x3FD1CAC0,0x83126E98, 0x3FEEC57A,0x6C24CB49, + 0x3FD1DB22,0xD0E56042, 0x3FEEC339,0xE2F39465, + 0x3FD1EB85,0x1EB851EC, 0x3FEEC0F7,0x55A601B1, + 0x3FD1FBE7,0x6C8B4396, 0x3FEEBEB2,0xC461FDAB, + 0x3FD20C49,0xBA5E353F, 0x3FEEBC6C,0x2F4D94A1, + 0x3FD21CAC,0x083126E9, 0x3FEEBA23,0x968EF4AE, + 0x3FD22D0E,0x56041893, 0x3FEEB7D8,0xFA4C6DB9, + 0x3FD23D70,0xA3D70A3D, 0x3FEEB58C,0x5AAC7174, + 0x3FD24DD2,0xF1A9FBE7, 0x3FEEB33D,0xB7D59355, + 0x3FD25E35,0x3F7CED91, 0x3FEEB0ED,0x11EE8895, + 0x3FD26E97,0x8D4FDF3B, 0x3FEEAE9A,0x691E2832, + 0x3FD27EF9,0xDB22D0E5, 0x3FEEAC45,0xBD8B6AE5, + 0x3FD28F5C,0x28F5C28F, 0x3FEEA9EF,0x0F5D6B26, + 0x3FD29FBE,0x76C8B439, 0x3FEEA796,0x5EBB6524, + 0x3FD2B020,0xC49BA5E3, 0x3FEEA53B,0xABCCB6C8, + 0x3FD2C083,0x126E978D, 0x3FEEA2DE,0xF6B8DFAE, + 0x3FD2D0E5,0x60418937, 0x3FEEA080,0x3FA78123, + 0x3FD2E147,0xAE147AE1, 0x3FEE9E1F,0x86C05E25, + 0x3FD2F1A9,0xFBE76C8B, 0x3FEE9BBC,0xCC2B5B5E, + 0x3FD3020C,0x49BA5E35, 0x3FEE9958,0x10107F22, + 0x3FD3126E,0x978D4FDF, 0x3FEE96F1,0x5297F16D, + 0x3FD322D0,0xE5604189, 0x3FEE9488,0x93E9FBDF, + 0x3FD33333,0x33333333, 0x3FEE921D,0xD42F09BA, + 0x3FD34395,0x810624DD, 0x3FEE8FB1,0x138FA7E2, + 0x3FD353F7,0xCED91687, 0x3FEE8D42,0x523484D6, + 0x3FD3645A,0x1CAC0831, 0x3FEE8AD1,0x904670AE, + 0x3FD374BC,0x6A7EF9DB, 0x3FEE885E,0xCDEE5D1C, + 0x3FD3851E,0xB851EB85, 0x3FEE85EA,0x0B555D66, + 0x3FD39581,0x0624DD2F, 0x3FEE8373,0x48A4A663, + 0x3FD3A5E3,0x53F7CED9, 0x3FEE80FA,0x86058E7B, + 0x3FD3B645,0xA1CAC083, 0x3FEE7E7F,0xC3A18DA3, + 0x3FD3C6A7,0xEF9DB22D, 0x3FEE7C03,0x01A23D59, + 0x3FD3D70A,0x3D70A3D7, 0x3FEE7984,0x403158A2, + 0x3FD3E76C,0x8B439581, 0x3FEE7703,0x7F78BC09, + 0x3FD3F7CE,0xD916872B, 0x3FEE7480,0xBFA2659B, + 0x3FD40831,0x26E978D5, 0x3FEE71FC,0x00D874E1, + 0x3FD41893,0x74BC6A7F, 0x3FEE6F75,0x43452AE5, + 0x3FD428F5,0xC28F5C29, 0x3FEE6CEC,0x8712EA26, + 0x3FD43958,0x10624DD3, 0x3FEE6A61,0xCC6C369E, + 0x3FD449BA,0x5E353F7D, 0x3FEE67D5,0x137BB5B8, + 0x3FD45A1C,0xAC083127, 0x3FEE6546,0x5C6C2E51, + 0x3FD46A7E,0xF9DB22D1, 0x3FEE62B5,0xA76888B5, + 0x3FD47AE1,0x47AE147B, 0x3FEE6022,0xF49BCE9B, + 0x3FD48B43,0x95810625, 0x3FEE5D8E,0x44312B24, + 0x3FD49BA5,0xE353F7CF, 0x3FEE5AF7,0x9653EAD4, + 0x3FD4AC08,0x3126E979, 0x3FEE585E,0xEB2F7B96, + 0x3FD4BC6A,0x7EF9DB23, 0x3FEE55C4,0x42EF6CB2, + 0x3FD4CCCC,0xCCCCCCCD, 0x3FEE5327,0x9DBF6ED0, + 0x3FD4DD2F,0x1A9FBE77, 0x3FEE5088,0xFBCB53F0, + 0x3FD4ED91,0x6872B021, 0x3FEE4DE8,0x5D3F0F6C, + 0x3FD4FDF3,0xB645A1CB, 0x3FEE4B45,0xC246B5F1, + 0x3FD50E56,0x04189375, 0x3FEE48A1,0x2B0E7D7F, + 0x3FD51EB8,0x51EB851F, 0x3FEE45FA,0x97C2BD65, + 0x3FD52F1A,0x9FBE76C9, 0x3FEE4352,0x088FEE3D, + 0x3FD53F7C,0xED916873, 0x3FEE40A7,0x7DA2A9EC, + 0x3FD54FDF,0x3B645A1D, 0x3FEE3DFA,0xF727AB9B, + 0x3FD56041,0x89374BC7, 0x3FEE3B4C,0x754BCFB9, + 0x3FD570A3,0xD70A3D71, 0x3FEE389B,0xF83C13F4, + 0x3FD58106,0x24DD2F1B, 0x3FEE35E9,0x80259736, + 0x3FD59168,0x72B020C5, 0x3FEE3335,0x0D3599A5, + 0x3FD5A1CA,0xC083126F, 0x3FEE307E,0x9F997CA0, + 0x3FD5B22D,0x0E560419, 0x3FEE2DC6,0x377EC2B8, + 0x3FD5C28F,0x5C28F5C3, 0x3FEE2B0B,0xD5130FB1, + 0x3FD5D2F1,0xA9FBE76D, 0x3FEE284F,0x7884287D, + 0x3FD5E353,0xF7CED917, 0x3FEE2591,0x21FFF339, + 0x3FD5F3B6,0x45A1CAC1, 0x3FEE22D0,0xD1B4772D, + 0x3FD60418,0x9374BC6A, 0x3FEE200E,0x87CFDCC3, + 0x3FD6147A,0xE147AE14, 0x3FEE1D4A,0x44806D8A, + 0x3FD624DD,0x2F1A9FBE, 0x3FEE1A84,0x07F49430, + 0x3FD6353F,0x7CED9168, 0x3FEE17BB,0xD25ADC7F, + 0x3FD645A1,0xCAC08312, 0x3FEE14F1,0xA3E1F35C, + 0x3FD65604,0x189374BC, 0x3FEE1225,0x7CB8A6BF, + 0x3FD66666,0x66666666, 0x3FEE0F57,0x5D0DE5B7, + 0x3FD676C8,0xB4395810, 0x3FEE0C87,0x4510C061, + 0x3FD6872B,0x020C49BA, 0x3FEE09B5,0x34F067E8, + 0x3FD6978D,0x4FDF3B64, 0x3FEE06E1,0x2CDC2E80, + 0x3FD6A7EF,0x9DB22D0E, 0x3FEE040B,0x2D038765, + 0x3FD6B851,0xEB851EB8, 0x3FEE0133,0x359606D7, + 0x3FD6C8B4,0x39581062, 0x3FEDFE59,0x46C36215, + 0x3FD6D916,0x872B020C, 0x3FEDFB7D,0x60BB6F5D, + 0x3FD6E978,0xD4FDF3B6, 0x3FEDF89F,0x83AE25E7, + 0x3FD6F9DB,0x22D0E560, 0x3FEDF5BF,0xAFCB9DE3, + 0x3FD70A3D,0x70A3D70A, 0x3FEDF2DD,0xE5441074, + 0x3FD71A9F,0xBE76C8B4, 0x3FEDEFFA,0x2447D7B0, + 0x3FD72B02,0x0C49BA5E, 0x3FEDED14,0x6D076E97, + 0x3FD73B64,0x5A1CAC08, 0x3FEDEA2C,0xBFB37117, + 0x3FD74BC6,0xA7EF9DB2, 0x3FEDE743,0x1C7C9C04, + 0x3FD75C28,0xF5C28F5C, 0x3FEDE457,0x8393CD18, + 0x3FD76C8B,0x43958106, 0x3FEDE169,0xF52A02EB, + 0x3FD77CED,0x916872B0, 0x3FEDDE7A,0x71705CF6, + 0x3FD78D4F,0xDF3B645A, 0x3FEDDB88,0xF8981B8A, + 0x3FD79DB2,0x2D0E5604, 0x3FEDD895,0x8AD29FD1, + 0x3FD7AE14,0x7AE147AE, 0x3FEDD5A0,0x28516BC9, + 0x3FD7BE76,0xC8B43958, 0x3FEDD2A8,0xD1462240, + 0x3FD7CED9,0x16872B02, 0x3FEDCFAF,0x85E286D2, + 0x3FD7DF3B,0x645A1CAC, 0x3FEDCCB4,0x46587DE7, + 0x3FD7EF9D,0xB22D0E56, 0x3FEDC9B7,0x12DA0CAC, + 0x3FD80000,0x00000000, 0x3FEDC6B7,0xEB995912, + 0x3FD81062,0x4DD2F1AA, 0x3FEDC3B6,0xD0C8A9CC, + 0x3FD820C4,0x9BA5E354, 0x3FEDC0B3,0xC29A664A, + 0x3FD83126,0xE978D4FE, 0x3FEDBDAE,0xC14116B4, + 0x3FD84189,0x374BC6A8, 0x3FEDBAA7,0xCCEF63EB, + 0x3FD851EB,0x851EB852, 0x3FEDB79E,0xE5D81782, + 0x3FD8624D,0xD2F1A9FC, 0x3FEDB494,0x0C2E1BBD, + 0x3FD872B0,0x20C49BA6, 0x3FEDB187,0x40247B8B, + 0x3FD88312,0x6E978D50, 0x3FEDAE78,0x81EE6287, + 0x3FD89374,0xBC6A7EFA, 0x3FEDAB67,0xD1BF1CEE, + 0x3FD8A3D7,0x0A3D70A4, 0x3FEDA855,0x2FCA17A5, + 0x3FD8B439,0x5810624E, 0x3FEDA540,0x9C42E02B, + 0x3FD8C49B,0xA5E353F8, 0x3FEDA22A,0x175D249D, + 0x3FD8D4FD,0xF3B645A2, 0x3FED9F11,0xA14CB3B2, + 0x3FD8E560,0x4189374C, 0x3FED9BF7,0x3A457CB3, + 0x3FD8F5C2,0x8F5C28F6, 0x3FED98DA,0xE27B8F7E, + 0x3FD90624,0xDD2F1AA0, 0x3FED95BC,0x9A231C7C, + 0x3FD91687,0x2B020C4A, 0x3FED929C,0x617074A3, + 0x3FD926E9,0x78D4FDF4, 0x3FED8F7A,0x3898096F, + 0x3FD9374B,0xC6A7EF9E, 0x3FED8C56,0x1FCE6CE3, + 0x3FD947AE,0x147AE148, 0x3FED8930,0x1748517E, + 0x3FD95810,0x624DD2F2, 0x3FED8608,0x1F3A8A3F, + 0x3FD96872,0xB020C49C, 0x3FED82DE,0x37DA0A9E, + 0x3FD978D4,0xFDF3B646, 0x3FED7FB2,0x615BE68A, + 0x3FD98937,0x4BC6A7F0, 0x3FED7C84,0x9BF55262, + 0x3FD99999,0x9999999A, 0x3FED7954,0xE7DBA2F8, + 0x3FD9A9FB,0xE76C8B44, 0x3FED7623,0x45444D86, + 0x3FD9BA5E,0x353F7CEE, 0x3FED72EF,0xB464E7B0, + 0x3FD9CAC0,0x83126E98, 0x3FED6FBA,0x35732780, + 0x3FD9DB22,0xD0E56042, 0x3FED6C82,0xC8A4E35E, + 0x3FD9EB85,0x1EB851EC, 0x3FED6949,0x6E301211, + 0x3FD9FBE7,0x6C8B4396, 0x3FED660E,0x264ACABC, + 0x3FDA0C49,0xBA5E353F, 0x3FED62D0,0xF12B44D6, + 0x3FDA1CAC,0x083126E9, 0x3FED5F91,0xCF07D82A, + 0x3FDA2D0E,0x56041893, 0x3FED5C50,0xC016FCD1, + 0x3FDA3D70,0xA3D70A3D, 0x3FED590D,0xC48F4B33, + 0x3FDA4DD2,0xF1A9FBE7, 0x3FED55C8,0xDCA77BFD, + 0x3FDA5E35,0x3F7CED91, 0x3FED5282,0x08966824, + 0x3FDA6E97,0x8D4FDF3B, 0x3FED4F39,0x489308DA, + 0x3FDA7EF9,0xDB22D0E5, 0x3FED4BEE,0x9CD47791, + 0x3FDA8F5C,0x28F5C28F, 0x3FED48A2,0x0591EDF6, + 0x3FDA9FBE,0x76C8B439, 0x3FED4553,0x8302C5E9, + 0x3FDAB020,0xC49BA5E3, 0x3FED4203,0x155E7980, + 0x3FDAC083,0x126E978D, 0x3FED3EB0,0xBCDCA2FE, + 0x3FDAD0E5,0x60418937, 0x3FED3B5C,0x79B4FCD2, + 0x3FDAE147,0xAE147AE1, 0x3FED3806,0x4C1F6191, + 0x3FDAF1A9,0xFBE76C8B, 0x3FED34AE,0x3453CBF7, + 0x3FDB020C,0x49BA5E35, 0x3FED3154,0x328A56DF, + 0x3FDB126E,0x978D4FDF, 0x3FED2DF8,0x46FB3D40, + 0x3FDB22D0,0xE5604189, 0x3FED2A9A,0x71DEDA2B, + 0x3FDB3333,0x33333333, 0x3FED273A,0xB36DA8C6, + 0x3FDB4395,0x810624DD, 0x3FED23D9,0x0BE04448, + 0x3FDB53F7,0xCED91687, 0x3FED2075,0x7B6F67F6, + 0x3FDB645A,0x1CAC0831, 0x3FED1D10,0x0253EF22, + 0x3FDB74BC,0x6A7EF9DB, 0x3FED19A8,0xA0C6D51F, + 0x3FDB851E,0xB851EB85, 0x3FED163F,0x57013548, + 0x3FDB9581,0x0624DD2F, 0x3FED12D4,0x253C4AF5, + 0x3FDBA5E3,0x53F7CED9, 0x3FED0F67,0x0BB17177, + 0x3FDBB645,0xA1CAC083, 0x3FED0BF8,0x0A9A241B, + 0x3FDBC6A7,0xEF9DB22D, 0x3FED0887,0x222FFE1D, + 0x3FDBD70A,0x3D70A3D7, 0x3FED0514,0x52ACBAAD, + 0x3FDBE76C,0x8B439581, 0x3FED019F,0x9C4A34E4, + 0x3FDBF7CE,0xD916872B, 0x3FECFE28,0xFF4267C5, + 0x3FDC0831,0x26E978D5, 0x3FECFAB0,0x7BCF6E38, + 0x3FDC1893,0x74BC6A7F, 0x3FECF736,0x122B8305, + 0x3FDC28F5,0xC28F5C29, 0x3FECF3B9,0xC29100CF, + 0x3FDC3958,0x10624DD3, 0x3FECF03B,0x8D3A6217, + 0x3FDC49BA,0x5E353F7D, 0x3FECECBB,0x7262412E, + 0x3FDC5A1C,0xAC083127, 0x3FECE939,0x72435839, + 0x3FDC6A7E,0xF9DB22D1, 0x3FECE5B5,0x8D18812B, + 0x3FDC7AE1,0x47AE147B, 0x3FECE22F,0xC31CB5C0, + 0x3FDC8B43,0x95810625, 0x3FECDEA8,0x148B0F7A, + 0x3FDC9BA5,0xE353F7CF, 0x3FECDB1E,0x819EC79D, + 0x3FDCAC08,0x3126E979, 0x3FECD793,0x0A93372B, + 0x3FDCBC6A,0x7EF9DB23, 0x3FECD405,0xAFA3D6DF, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FECD076,0x710C3F2D, + 0x3FDCDD2F,0x1A9FBE77, 0x3FECCCE5,0x4F08283A, + 0x3FDCED91,0x6872B021, 0x3FECC952,0x49D369D9, + 0x3FDCFDF3,0xB645A1CB, 0x3FECC5BD,0x61A9FB88, + 0x3FDD0E56,0x04189375, 0x3FECC226,0x96C7F46C, + 0x3FDD1EB8,0x51EB851F, 0x3FECBE8D,0xE9698B4D, + 0x3FDD2F1A,0x9FBE76C9, 0x3FECBAF3,0x59CB1690, + 0x3FDD3F7C,0xED916873, 0x3FECB756,0xE8290C37, + 0x3FDD4FDF,0x3B645A1D, 0x3FECB3B8,0x94C001DA, + 0x3FDD6041,0x89374BC7, 0x3FECB018,0x5FCCACA2, + 0x3FDD70A3,0xD70A3D71, 0x3FECAC76,0x498BE14B, + 0x3FDD8106,0x24DD2F1B, 0x3FECA8D2,0x523A9419, + 0x3FDD9168,0x72B020C5, 0x3FECA52C,0x7A15D8D7, + 0x3FDDA1CA,0xC083126F, 0x3FECA184,0xC15AE2D3, + 0x3FDDB22D,0x0E560419, 0x3FEC9DDB,0x284704DC, + 0x3FDDC28F,0x5C28F5C3, 0x3FEC9A2F,0xAF17B138, + 0x3FDDD2F1,0xA9FBE76D, 0x3FEC9682,0x560A79A8, + 0x3FDDE353,0xF7CED917, 0x3FEC92D3,0x1D5D0F5D, + 0x3FDDF3B6,0x45A1CAC1, 0x3FEC8F22,0x054D42F8, + 0x3FDE0418,0x9374BC6A, 0x3FEC8B6F,0x0E190485, + 0x3FDE147A,0xE147AE14, 0x3FEC87BA,0x37FE6375, + 0x3FDE24DD,0x2F1A9FBE, 0x3FEC8403,0x833B8E9D, + 0x3FDE353F,0x7CED9168, 0x3FEC804A,0xF00ED431, + 0x3FDE45A1,0xCAC08312, 0x3FEC7C90,0x7EB6A1BD, + 0x3FDE5604,0x189374BC, 0x3FEC78D4,0x2F718428, + 0x3FDE6666,0x66666666, 0x3FEC7516,0x027E27A5, + 0x3FDE76C8,0xB4395810, 0x3FEC7155,0xF81B57BB, + 0x3FDE872B,0x020C49BA, 0x3FEC6D94,0x1087FF37, + 0x3FDE978D,0x4FDF3B64, 0x3FEC69D0,0x4C03282F, + 0x3FDEA7EF,0x9DB22D0E, 0x3FEC660A,0xAACBFBF7, + 0x3FDEB851,0xEB851EB8, 0x3FEC6243,0x2D21C324, + 0x3FDEC8B4,0x39581062, 0x3FEC5E79,0xD343E584, + 0x3FDED916,0x872B020C, 0x3FEC5AAE,0x9D71EA19, + 0x3FDEE978,0xD4FDF3B6, 0x3FEC56E1,0x8BEB7717, + 0x3FDEF9DB,0x22D0E560, 0x3FEC5312,0x9EF051DE, + 0x3FDF0A3D,0x70A3D70A, 0x3FEC4F41,0xD6C05EF9, + 0x3FDF1A9F,0xBE76C8B4, 0x3FEC4B6F,0x339BA216, + 0x3FDF2B02,0x0C49BA5E, 0x3FEC479A,0xB5C23E03, + 0x3FDF3B64,0x5A1CAC08, 0x3FEC43C4,0x5D7474AC, + 0x3FDF4BC6,0xA7EF9DB2, 0x3FEC3FEC,0x2AF2A713, + 0x3FDF5C28,0xF5C28F5C, 0x3FEC3C12,0x1E7D554F, + 0x3FDF6C8B,0x43958106, 0x3FEC3836,0x38551E88, + 0x3FDF7CED,0x916872B0, 0x3FEC3458,0x78BAC0EE, + 0x3FDF8D4F,0xDF3B645A, 0x3FEC3078,0xDFEF19BA, + 0x3FDF9DB2,0x2D0E5604, 0x3FEC2C97,0x6E332528, + 0x3FDFAE14,0x7AE147AE, 0x3FEC28B4,0x23C7FE73, + 0x3FDFBE76,0xC8B43958, 0x3FEC24CF,0x00EEDFCF, + 0x3FDFCED9,0x16872B02, 0x3FEC20E8,0x05E92266, + 0x3FDFDF3B,0x645A1CAC, 0x3FEC1CFF,0x32F83E56, + 0x3FDFEF9D,0xB22D0E56, 0x3FEC1914,0x885DCAA8, + 0x3FE00000,0x00000000, 0x3FEC1528,0x065B7D50, + 0x3FE00831,0x26E978D5, 0x3FEC1139,0xAD332B24, + 0x3FE01062,0x4DD2F1AA, 0x3FEC0D49,0x7D26C7DF, + 0x3FE01893,0x74BC6A7F, 0x3FEC0957,0x76786614, + 0x3FE020C4,0x9BA5E354, 0x3FEC0563,0x996A3730, + 0x3FE028F5,0xC28F5C29, 0x3FEC016D,0xE63E8B74, + 0x3FE03126,0xE978D4FE, 0x3FEBFD76,0x5D37D1EF, + 0x3FE03958,0x10624DD3, 0x3FEBF97C,0xFE98987C, + 0x3FE04189,0x374BC6A8, 0x3FEBF581,0xCAA38BBA, + 0x3FE049BA,0x5E353F7D, 0x3FEBF184,0xC19B770F, + 0x3FE051EB,0x851EB852, 0x3FEBED85,0xE3C34499, + 0x3FE05A1C,0xAC083127, 0x3FEBE985,0x315DFD33, + 0x3FE0624D,0xD2F1A9FC, 0x3FEBE582,0xAAAEC86D, + 0x3FE06A7E,0xF9DB22D1, 0x3FEBE17E,0x4FF8EC86, + 0x3FE072B0,0x20C49BA6, 0x3FEBDD78,0x217FCE6A, + 0x3FE07AE1,0x47AE147B, 0x3FEBD970,0x1F86F1AC, + 0x3FE08312,0x6E978D50, 0x3FEBD566,0x4A51F884, + 0x3FE08B43,0x95810625, 0x3FEBD15A,0xA224A3C8, + 0x3FE09374,0xBC6A7EFA, 0x3FEBCD4D,0x2742D2E7, + 0x3FE09BA5,0xE353F7CF, 0x3FEBC93D,0xD9F083E8, + 0x3FE0A3D7,0x0A3D70A4, 0x3FEBC52C,0xBA71D363, + 0x3FE0AC08,0x3126E979, 0x3FEBC119,0xC90AFC7D, + 0x3FE0B439,0x5810624E, 0x3FEBBD05,0x060058E4, + 0x3FE0BC6A,0x7EF9DB23, 0x3FEBB8EE,0x719660C9, + 0x3FE0C49B,0xA5E353F8, 0x3FEBB4D6,0x0C11AADD, + 0x3FE0CCCC,0xCCCCCCCD, 0x3FEBB0BB,0xD5B6EC4E, + 0x3FE0D4FD,0xF3B645A2, 0x3FEBAC9F,0xCECAF8BF, + 0x3FE0DD2F,0x1A9FBE77, 0x3FEBA881,0xF792C244, + 0x3FE0E560,0x4189374C, 0x3FEBA462,0x50535960, + 0x3FE0ED91,0x6872B021, 0x3FEBA040,0xD951ED01, + 0x3FE0F5C2,0x8F5C28F6, 0x3FEB9C1D,0x92D3CA76, + 0x3FE0FDF3,0xB645A1CB, 0x3FEB97F8,0x7D1E5D70, + 0x3FE10624,0xDD2F1AA0, 0x3FEB93D1,0x98772FFB, + 0x3FE10E56,0x04189375, 0x3FEB8FA8,0xE523EA7B, + 0x3FE11687,0x2B020C4A, 0x3FEB8B7E,0x636A53A4, + 0x3FE11EB8,0x51EB851F, 0x3FEB8752,0x1390507A, + 0x3FE126E9,0x78D4FDF4, 0x3FEB8323,0xF5DBE44A, + 0x3FE12F1A,0x9FBE76C9, 0x3FEB7EF4,0x0A9330A3, + 0x3FE1374B,0xC6A7EF9E, 0x3FEB7AC2,0x51FC7558, + 0x3FE13F7C,0xED916873, 0x3FEB768E,0xCC5E1074, + 0x3FE147AE,0x147AE148, 0x3FEB7259,0x79FE7E3C, + 0x3FE14FDF,0x3B645A1D, 0x3FEB6E22,0x5B245923, + 0x3FE15810,0x624DD2F2, 0x3FEB69E9,0x701659CE, + 0x3FE16041,0x89374BC7, 0x3FEB65AE,0xB91B5708, + 0x3FE16872,0xB020C49C, 0x3FEB6172,0x367A45C0, + 0x3FE170A3,0xD70A3D71, 0x3FEB5D33,0xE87A3908, + 0x3FE178D4,0xFDF3B646, 0x3FEB58F3,0xCF62620A, + 0x3FE18106,0x24DD2F1B, 0x3FEB54B1,0xEB7A1006, + 0x3FE18937,0x4BC6A7F0, 0x3FEB506E,0x3D08B04F, + 0x3FE19168,0x72B020C5, 0x3FEB4C28,0xC455CE45, + 0x3FE19999,0x9999999A, 0x3FEB47E1,0x81A91350, + 0x3FE1A1CA,0xC083126F, 0x3FEB4398,0x754A46DB, + 0x3FE1A9FB,0xE76C8B44, 0x3FEB3F4D,0x9F814E51, + 0x3FE1B22D,0x0E560419, 0x3FEB3B01,0x00962D16, + 0x3FE1BA5E,0x353F7CEE, 0x3FEB36B2,0x98D10483, + 0x3FE1C28F,0x5C28F5C3, 0x3FEB3262,0x687A13E3, + 0x3FE1CAC0,0x83126E98, 0x3FEB2E10,0x6FD9B86D, + 0x3FE1D2F1,0xA9FBE76D, 0x3FEB29BC,0xAF386D3F, + 0x3FE1DB22,0xD0E56042, 0x3FEB2567,0x26DECB58, + 0x3FE1E353,0xF7CED917, 0x3FEB210F,0xD7158997, + 0x3FE1EB85,0x1EB851EC, 0x3FEB1CB6,0xC0257CB2, + 0x3FE1F3B6,0x45A1CAC1, 0x3FEB185B,0xE2579735, + 0x3FE1FBE7,0x6C8B4396, 0x3FEB13FF,0x3DF4E979, + 0x3FE20418,0x9374BC6A, 0x3FEB0FA0,0xD346A1A5, + 0x3FE20C49,0xBA5E353F, 0x3FEB0B40,0xA2960BA2, + 0x3FE2147A,0xE147AE14, 0x3FEB06DE,0xAC2C911D, + 0x3FE21CAC,0x083126E9, 0x3FEB027A,0xF053B97E, + 0x3FE224DD,0x2F1A9FBE, 0x3FEAFE15,0x6F5529E3, + 0x3FE22D0E,0x56041893, 0x3FEAF9AE,0x297AA520, + 0x3FE2353F,0x7CED9168, 0x3FEAF545,0x1F0E0BB3, + 0x3FE23D70,0xA3D70A3D, 0x3FEAF0DA,0x50595BC6, + 0x3FE245A1,0xCAC08312, 0x3FEAEC6D,0xBDA6B124, + 0x3FE24DD2,0xF1A9FBE7, 0x3FEAE7FF,0x6740453A, + 0x3FE25604,0x189374BC, 0x3FEAE38F,0x4D706F0E, + 0x3FE25E35,0x3F7CED91, 0x3FEADF1D,0x7081A33B, + 0x3FE26666,0x66666666, 0x3FEADAA9,0xD0BE73ED, + 0x3FE26E97,0x8D4FDF3B, 0x3FEAD634,0x6E7190DD, + 0x3FE276C8,0xB4395810, 0x3FEAD1BD,0x49E5C747, + 0x3FE27EF9,0xDB22D0E5, 0x3FEACD44,0x636601EE, + 0x3FE2872B,0x020C49BA, 0x3FEAC8C9,0xBB3D490D, + 0x3FE28F5C,0x28F5C28F, 0x3FEAC44D,0x51B6C25B, + 0x3FE2978D,0x4FDF3B64, 0x3FEABFCF,0x271DB100, + 0x3FE29FBE,0x76C8B439, 0x3FEABB4F,0x3BBD7593, + 0x3FE2A7EF,0x9DB22D0E, 0x3FEAB6CD,0x8FE18E13, + 0x3FE2B020,0xC49BA5E3, 0x3FEAB24A,0x23D595E4, + 0x3FE2B851,0xEB851EB8, 0x3FEAADC4,0xF7E545CB, + 0x3FE2C083,0x126E978D, 0x3FEAA93E,0x0C5C73E5, + 0x3FE2C8B4,0x39581062, 0x3FEAA4B5,0x618713A5, + 0x3FE2D0E5,0x60418937, 0x3FEAA02A,0xF7B135D0, + 0x3FE2D916,0x872B020C, 0x3FEA9B9E,0xCF270874, + 0x3FE2E147,0xAE147AE1, 0x3FEA9710,0xE834D6E7, + 0x3FE2E978,0xD4FDF3B6, 0x3FEA9281,0x432709C0, + 0x3FE2F1A9,0xFBE76C8B, 0x3FEA8DEF,0xE04A26D3, + 0x3FE2F9DB,0x22D0E560, 0x3FEA895C,0xBFEAD12A, + 0x3FE3020C,0x49BA5E35, 0x3FEA84C7,0xE255C904, + 0x3FE30A3D,0x70A3D70A, 0x3FEA8031,0x47D7EBCB, + 0x3FE3126E,0x978D4FDF, 0x3FEA7B98,0xF0BE3412, + 0x3FE31A9F,0xBE76C8B4, 0x3FEA76FE,0xDD55B98F, + 0x3FE322D0,0xE5604189, 0x3FEA7263,0x0DEBB117, + 0x3FE32B02,0x0C49BA5E, 0x3FEA6DC5,0x82CD6C99, + 0x3FE33333,0x33333333, 0x3FEA6926,0x3C485B15, + 0x3FE33B64,0x5A1CAC08, 0x3FEA6485,0x3AAA089D, + 0x3FE34395,0x810624DD, 0x3FEA5FE2,0x7E401E4C, + 0x3FE34BC6,0xA7EF9DB2, 0x3FEA5B3E,0x07586242, + 0x3FE353F7,0xCED91687, 0x3FEA5697,0xD640B79F, + 0x3FE35C28,0xF5C28F5C, 0x3FEA51EF,0xEB471E7C, + 0x3FE3645A,0x1CAC0831, 0x3FEA4D46,0x46B9B3EA, + 0x3FE36C8B,0x43958106, 0x3FEA489A,0xE8E6B1E8, + 0x3FE374BC,0x6A7EF9DB, 0x3FEA43ED,0xD21C6F63, + 0x3FE37CED,0x916872B0, 0x3FEA3F3F,0x02A9602C, + 0x3FE3851E,0xB851EB85, 0x3FEA3A8E,0x7ADC14F6, + 0x3FE38D4F,0xDF3B645A, 0x3FEA35DC,0x3B033B50, + 0x3FE39581,0x0624DD2F, 0x3FEA3128,0x436D9DA0, + 0x3FE39DB2,0x2D0E5604, 0x3FEA2C72,0x946A231B, + 0x3FE3A5E3,0x53F7CED9, 0x3FEA27BB,0x2E47CFC6, + 0x3FE3AE14,0x7AE147AE, 0x3FEA2302,0x1155C46B, + 0x3FE3B645,0xA1CAC083, 0x3FEA1E47,0x3DE33E97, + 0x3FE3BE76,0xC8B43958, 0x3FEA198A,0xB43F9893, + 0x3FE3C6A7,0xEF9DB22D, 0x3FEA14CC,0x74BA4961, + 0x3FE3CED9,0x16872B02, 0x3FEA100C,0x7FA2E4B4, + 0x3FE3D70A,0x3D70A3D7, 0x3FEA0B4A,0xD5491AEC, + 0x3FE3DF3B,0x645A1CAC, 0x3FEA0687,0x75FCB914, + 0x3FE3E76C,0x8B439581, 0x3FEA01C2,0x620DA8D5, + 0x3FE3EF9D,0xB22D0E56, 0x3FE9FCFB,0x99CBF07A, + 0x3FE3F7CE,0xD916872B, 0x3FE9F833,0x1D87B2E3, + 0x3FE40000,0x00000000, 0x3FE9F368,0xED912F85, + 0x3FE40831,0x26E978D5, 0x3FE9EE9D,0x0A38C262, + 0x3FE41062,0x4DD2F1AA, 0x3FE9E9CF,0x73CEE405, + 0x3FE41893,0x74BC6A7F, 0x3FE9E500,0x2AA4297B, + 0x3FE420C4,0x9BA5E354, 0x3FE9E02F,0x2F094451, + 0x3FE428F5,0xC28F5C29, 0x3FE9DB5C,0x814F028B, + 0x3FE43126,0xE978D4FE, 0x3FE9D688,0x21C64EA1, + 0x3FE43958,0x10624DD3, 0x3FE9D1B2,0x10C02F78, + 0x3FE44189,0x374BC6A8, 0x3FE9CCDA,0x4E8DC860, + 0x3FE449BA,0x5E353F7D, 0x3FE9C800,0xDB80590B, + 0x3FE451EB,0x851EB852, 0x3FE9C325,0xB7E93D88, + 0x3FE45A1C,0xAC083127, 0x3FE9BE48,0xE419EE41, + 0x3FE4624D,0xD2F1A9FC, 0x3FE9B96A,0x6063FFF2, + 0x3FE46A7E,0xF9DB22D1, 0x3FE9B48A,0x2D1923A6, + 0x3FE472B0,0x20C49BA6, 0x3FE9AFA8,0x4A8B26B1, + 0x3FE47AE1,0x47AE147B, 0x3FE9AAC4,0xB90BF2A8, + 0x3FE48312,0x6E978D50, 0x3FE9A5DF,0x78ED8D60, + 0x3FE48B43,0x95810625, 0x3FE9A0F8,0x8A8218E7, + 0x3FE49374,0xBC6A7EFA, 0x3FE99C0F,0xEE1BD37D, + 0x3FE49BA5,0xE353F7CF, 0x3FE99725,0xA40D1791, + 0x3FE4A3D7,0x0A3D70A4, 0x3FE99239,0xACA85BBA, + 0x3FE4AC08,0x3126E979, 0x3FE98D4C,0x084032B1, + 0x3FE4B439,0x5810624E, 0x3FE9885C,0xB7274B4E, + 0x3FE4BC6A,0x7EF9DB23, 0x3FE9836B,0xB9B07081, + 0x3FE4C49B,0xA5E353F8, 0x3FE97E79,0x102E894D, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FE97984,0xBAF498C2, + 0x3FE4D4FD,0xF3B645A2, 0x3FE9748E,0xBA55BDF6, + 0x3FE4DD2F,0x1A9FBE77, 0x3FE96F97,0x0EA53406, + 0x3FE4E560,0x4189374C, 0x3FE96A9D,0xB8365209, + 0x3FE4ED91,0x6872B021, 0x3FE965A2,0xB75C8B0C, + 0x3FE4F5C2,0x8F5C28F6, 0x3FE960A6,0x0C6B6E13, + 0x3FE4FDF3,0xB645A1CB, 0x3FE95BA7,0xB7B6A609, + 0x3FE50624,0xDD2F1AA0, 0x3FE956A7,0xB991F9C5, + 0x3FE50E56,0x04189375, 0x3FE951A6,0x12514BFD, + 0x3FE51687,0x2B020C4A, 0x3FE94CA2,0xC2489B42, + 0x3FE51EB8,0x51EB851F, 0x3FE9479D,0xC9CC0200, + 0x3FE526E9,0x78D4FDF4, 0x3FE94297,0x292FB670, + 0x3FE52F1A,0x9FBE76C9, 0x3FE93D8E,0xE0C80A98, + 0x3FE5374B,0xC6A7EF9E, 0x3FE93884,0xF0E96C44, + 0x3FE53F7C,0xED916873, 0x3FE93379,0x59E86502, + 0x3FE547AE,0x147AE148, 0x3FE92E6C,0x1C199A18, + 0x3FE54FDF,0x3B645A1D, 0x3FE9295D,0x37D1CC85, + 0x3FE55810,0x624DD2F2, 0x3FE9244C,0xAD65D8F4, + 0x3FE56041,0x89374BC7, 0x3FE91F3A,0x7D2AB7BF, + 0x3FE56872,0xB020C49C, 0x3FE91A26,0xA7757CE0, + 0x3FE570A3,0xD70A3D71, 0x3FE91511,0x2C9B57F4, + 0x3FE578D4,0xFDF3B646, 0x3FE90FFA,0x0CF19430, + 0x3FE58106,0x24DD2F1B, 0x3FE90AE1,0x48CD985C, + 0x3FE58937,0x4BC6A7F0, 0x3FE905C6,0xE084E6D1, + 0x3FE59168,0x72B020C5, 0x3FE900AA,0xD46D1D6E, + 0x3FE59999,0x9999999A, 0x3FE8FB8D,0x24DBF597, + 0x3FE5A1CA,0xC083126F, 0x3FE8F66D,0xD227442E, + 0x3FE5A9FB,0xE76C8B44, 0x3FE8F14C,0xDCA4F98C, + 0x3FE5B22D,0x0E560419, 0x3FE8EC2A,0x44AB217D, + 0x3FE5BA5E,0x353F7CEE, 0x3FE8E706,0x0A8FE338, + 0x3FE5C28F,0x5C28F5C3, 0x3FE8E1E0,0x2EA9815D, + 0x3FE5CAC0,0x83126E98, 0x3FE8DCB8,0xB14E59ED, + 0x3FE5D2F1,0xA9FBE76D, 0x3FE8D78F,0x92D4E644, + 0x3FE5DB22,0xD0E56042, 0x3FE8D264,0xD393BB15, + 0x3FE5E353,0xF7CED917, 0x3FE8CD38,0x73E18863, + 0x3FE5EB85,0x1EB851EC, 0x3FE8C80A,0x7415197C, + 0x3FE5F3B6,0x45A1CAC1, 0x3FE8C2DA,0xD48554F2, + 0x3FE5FBE7,0x6C8B4396, 0x3FE8BDA9,0x95893C98, + 0x3FE60418,0x9374BC6A, 0x3FE8B876,0xB777ED7A, + 0x3FE60C49,0xBA5E353F, 0x3FE8B342,0x3AA89FD6, + 0x3FE6147A,0xE147AE14, 0x3FE8AE0C,0x1F72A71B, + 0x3FE61CAC,0x083126E9, 0x3FE8A8D4,0x662D71DF, + 0x3FE624DD,0x2F1A9FBE, 0x3FE8A39B,0x0F3089DC, + 0x3FE62D0E,0x56041893, 0x3FE89E60,0x1AD393E8, + 0x3FE6353F,0x7CED9168, 0x3FE89923,0x896E4FF1, + 0x3FE63D70,0xA3D70A3D, 0x3FE893E5,0x5B5898F4, + 0x3FE645A1,0xCAC08312, 0x3FE88EA5,0x90EA64FE, + 0x3FE64DD2,0xF1A9FBE7, 0x3FE88964,0x2A7BC51E, + 0x3FE65604,0x189374BC, 0x3FE88421,0x2864E567, + 0x3FE65E35,0x3F7CED91, 0x3FE87EDC,0x8AFE0CE3, + 0x3FE66666,0x66666666, 0x3FE87996,0x529F9D93, + 0x3FE66E97,0x8D4FDF3B, 0x3FE8744E,0x7FA21465, + 0x3FE676C8,0xB4395810, 0x3FE86F05,0x125E0933, + 0x3FE67EF9,0xDB22D0E5, 0x3FE869BA,0x0B2C2EB7, + 0x3FE6872B,0x020C49BA, 0x3FE8646D,0x6A65528A, + 0x3FE68F5C,0x28F5C28F, 0x3FE85F1F,0x30625D1D, + 0x3FE6978D,0x4FDF3B64, 0x3FE859CF,0x5D7C51B2, + 0x3FE69FBE,0x76C8B439, 0x3FE8547D,0xF20C4E58, + 0x3FE6A7EF,0x9DB22D0E, 0x3FE84F2A,0xEE6B8BE3, + 0x3FE6B020,0xC49BA5E3, 0x3FE849D6,0x52F35DE8, + 0x3FE6B851,0xEB851EB8, 0x3FE84480,0x1FFD32B6, + 0x3FE6C083,0x126E978D, 0x3FE83F28,0x55E29351, + 0x3FE6C8B4,0x39581062, 0x3FE839CE,0xF4FD236C, + 0x3FE6D0E5,0x60418937, 0x3FE83473,0xFDA6A161, + 0x3FE6D916,0x872B020C, 0x3FE82F17,0x7038E630, + 0x3FE6E147,0xAE147AE1, 0x3FE829B9,0x4D0DE573, + 0x3FE6E978,0xD4FDF3B6, 0x3FE82459,0x947FAD5E, + 0x3FE6F1A9,0xFBE76C8B, 0x3FE81EF8,0x46E866B4, + 0x3FE6F9DB,0x22D0E560, 0x3FE81995,0x64A254C4, + 0x3FE7020C,0x49BA5E35, 0x3FE81430,0xEE07D563, + 0x3FE70A3D,0x70A3D70A, 0x3FE80ECA,0xE37360E6, + 0x3FE7126E,0x978D4FDF, 0x3FE80963,0x453F8A19, + 0x3FE71A9F,0xBE76C8B4, 0x3FE803FA,0x13C6FE3F, + 0x3FE722D0,0xE5604189, 0x3FE7FE8F,0x4F648507, + 0x3FE72B02,0x0C49BA5E, 0x3FE7F922,0xF8730088, + 0x3FE73333,0x33333333, 0x3FE7F3B5,0x0F4D6D3A, + 0x3FE73B64,0x5A1CAC08, 0x3FE7EE45,0x944EE1F2, + 0x3FE74395,0x810624DD, 0x3FE7E8D4,0x87D28FDB, + 0x3FE74BC6,0xA7EF9DB2, 0x3FE7E361,0xEA33C26F, + 0x3FE753F7,0xCED91687, 0x3FE7DDED,0xBBCDDF72, + 0x3FE75C28,0xF5C28F5C, 0x3FE7D877,0xFCFC66ED, + 0x3FE7645A,0x1CAC0831, 0x3FE7D300,0xAE1AF326, + 0x3FE76C8B,0x43958106, 0x3FE7CD87,0xCF85389A, + 0x3FE774BC,0x6A7EF9DB, 0x3FE7C80D,0x619705FB, + 0x3FE77CED,0x916872B0, 0x3FE7C291,0x64AC4424, + 0x3FE7851E,0xB851EB85, 0x3FE7BD13,0xD920F617, + 0x3FE78D4F,0xDF3B645A, 0x3FE7B794,0xBF5138F6, + 0x3FE79581,0x0624DD2F, 0x3FE7B214,0x179943FB, + 0x3FE79DB2,0x2D0E5604, 0x3FE7AC91,0xE2556877, + 0x3FE7A5E3,0x53F7CED9, 0x3FE7A70E,0x1FE211C7, + 0x3FE7AE14,0x7AE147AE, 0x3FE7A188,0xD09BC54F, + 0x3FE7B645,0xA1CAC083, 0x3FE79C01,0xF4DF2275, + 0x3FE7BE76,0xC8B43958, 0x3FE79679,0x8D08E29B, + 0x3FE7C6A7,0xEF9DB22D, 0x3FE790EF,0x9975D91A, + 0x3FE7CED9,0x16872B02, 0x3FE78B64,0x1A82F336, + 0x3FE7D70A,0x3D70A3D7, 0x3FE785D7,0x108D3820, + 0x3FE7DF3B,0x645A1CAC, 0x3FE78048,0x7BF1C8EC, + 0x3FE7E76C,0x8B439581, 0x3FE77AB8,0x5D0DE089, + 0x3FE7EF9D,0xB22D0E56, 0x3FE77526,0xB43ED3BF, + 0x3FE7F7CE,0xD916872B, 0x3FE76F93,0x81E21125, + 0x3FE80000,0x00000000, 0x3FE769FE,0xC655211F, + 0x3FE80831,0x26E978D5, 0x3FE76468,0x81F5A5D4, + 0x3FE81062,0x4DD2F1AA, 0x3FE75ED0,0xB5215B29, + 0x3FE81893,0x74BC6A7F, 0x3FE75937,0x603616BD, + 0x3FE820C4,0x9BA5E354, 0x3FE7539C,0x8391C7E0, + 0x3FE828F5,0xC28F5C29, 0x3FE74E00,0x1F92778E, + 0x3FE83126,0xE978D4FE, 0x3FE74862,0x3496486A, + 0x3FE83958,0x10624DD3, 0x3FE742C2,0xC2FB76B6, + 0x3FE84189,0x374BC6A8, 0x3FE73D21,0xCB20584D, + 0x3FE849BA,0x5E353F7D, 0x3FE7377F,0x4D635C9D, + 0x3FE851EB,0x851EB852, 0x3FE731DB,0x4A230CA3, + 0x3FE85A1C,0xAC083127, 0x3FE72C35,0xC1BE0AE1, + 0x3FE8624D,0xD2F1A9FC, 0x3FE7268E,0xB493135B, + 0x3FE86A7E,0xF9DB22D1, 0x3FE720E6,0x2300FB8E, + 0x3FE872B0,0x20C49BA6, 0x3FE71B3C,0x0D66B26F, + 0x3FE87AE1,0x47AE147B, 0x3FE71590,0x7423405C, + 0x3FE88312,0x6E978D50, 0x3FE70FE3,0x5795C71E, + 0x3FE88B43,0x95810625, 0x3FE70A34,0xB81D81DF, + 0x3FE89374,0xBC6A7EFA, 0x3FE70484,0x9619C525, + 0x3FE89BA5,0xE353F7CF, 0x3FE6FED2,0xF1E9FECA, + 0x3FE8A3D7,0x0A3D70A4, 0x3FE6F91F,0xCBEDB5F7, + 0x3FE8AC08,0x3126E979, 0x3FE6F36B,0x24848B20, + 0x3FE8B439,0x5810624E, 0x3FE6EDB4,0xFC0E37F7, + 0x3FE8BC6A,0x7EF9DB23, 0x3FE6E7FD,0x52EA8F6D, + 0x3FE8C49B,0xA5E353F8, 0x3FE6E244,0x29797DAA, + 0x3FE8CCCC,0xCCCCCCCD, 0x3FE6DC89,0x801B0802, + 0x3FE8D4FD,0xF3B645A2, 0x3FE6D6CD,0x572F4CF4, + 0x3FE8DD2F,0x1A9FBE77, 0x3FE6D10F,0xAF168424, + 0x3FE8E560,0x4189374C, 0x3FE6CB50,0x8830FE4F, + 0x3FE8ED91,0x6872B021, 0x3FE6C58F,0xE2DF254A, + 0x3FE8F5C2,0x8F5C28F6, 0x3FE6BFCD,0xBF817BFA, + 0x3FE8FDF3,0xB645A1CB, 0x3FE6BA0A,0x1E789E4F, + 0x3FE90624,0xDD2F1AA0, 0x3FE6B445,0x00254139, + 0x3FE90E56,0x04189375, 0x3FE6AE7E,0x64E832A7, + 0x3FE91687,0x2B020C4A, 0x3FE6A8B6,0x4D225980, + 0x3FE91EB8,0x51EB851F, 0x3FE6A2EC,0xB934B59A, + 0x3FE926E9,0x78D4FDF4, 0x3FE69D21,0xA9805FB3, + 0x3FE92F1A,0x9FBE76C9, 0x3FE69755,0x1E668970, + 0x3FE9374B,0xC6A7EF9E, 0x3FE69187,0x18487D51, + 0x3FE93F7C,0xED916873, 0x3FE68BB7,0x97879EAE, + 0x3FE947AE,0x147AE148, 0x3FE685E6,0x9C8569AF, + 0x3FE94FDF,0x3B645A1D, 0x3FE68014,0x27A37345, + 0x3FE95810,0x624DD2F2, 0x3FE67A40,0x39436927, + 0x3FE96041,0x89374BC7, 0x3FE6746A,0xD1C711C7, + 0x3FE96872,0xB020C49C, 0x3FE66E93,0xF1904C50, + 0x3FE970A3,0xD70A3D71, 0x3FE668BB,0x9901109B, + 0x3FE978D4,0xFDF3B646, 0x3FE662E1,0xC87B6F2C, + 0x3FE98106,0x24DD2F1B, 0x3FE65D06,0x8061912D, + 0x3FE98937,0x4BC6A7F0, 0x3FE65729,0xC115B861, + 0x3FE99168,0x72B020C5, 0x3FE6514B,0x8AFA3F25, + 0x3FE99999,0x9999999A, 0x3FE64B6B,0xDE719865, + 0x3FE9A1CA,0xC083126F, 0x3FE6458A,0xBBDE4F97, + 0x3FE9A9FB,0xE76C8B44, 0x3FE63FA8,0x23A308B3, + 0x3FE9B22D,0x0E560419, 0x3FE639C4,0x16228031, + 0x3FE9BA5E,0x353F7CEE, 0x3FE633DE,0x93BF8AFD, + 0x3FE9C28F,0x5C28F5C3, 0x3FE62DF7,0x9CDD1674, + 0x3FE9CAC0,0x83126E98, 0x3FE6280F,0x31DE285B, + 0x3FE9D2F1,0xA9FBE76D, 0x3FE62225,0x5325DEDC, + 0x3FE9DB22,0xD0E56042, 0x3FE61C3A,0x0117707C, + 0x3FE9E353,0xF7CED917, 0x3FE6164D,0x3C162C18, + 0x3FE9EB85,0x1EB851EC, 0x3FE6105F,0x048578D9, + 0x3FE9F3B6,0x45A1CAC1, 0x3FE60A6F,0x5AC8D635, + 0x3FE9FBE7,0x6C8B4396, 0x3FE6047E,0x3F43DBE1, + 0x3FEA0418,0x9374BC6A, 0x3FE5FE8B,0xB25A39D1, + 0x3FEA0C49,0xBA5E353F, 0x3FE5F897,0xB46FB82B, + 0x3FEA147A,0xE147AE14, 0x3FE5F2A2,0x45E83747, + 0x3FEA1CAC,0x083126E9, 0x3FE5ECAB,0x6727AFA2, + 0x3FEA24DD,0x2F1A9FBE, 0x3FE5E6B3,0x189231DF, + 0x3FEA2D0E,0x56041893, 0x3FE5E0B9,0x5A8BE6BA, + 0x3FEA353F,0x7CED9168, 0x3FE5DABE,0x2D790F01, + 0x3FEA3D70,0xA3D70A3D, 0x3FE5D4C1,0x91BE0395, + 0x3FEA45A1,0xCAC08312, 0x3FE5CEC3,0x87BF355B, + 0x3FEA4DD2,0xF1A9FBE7, 0x3FE5C8C4,0x0FE12D3A, + 0x3FEA5604,0x189374BC, 0x3FE5C2C3,0x2A888C14, + 0x3FEA5E35,0x3F7CED91, 0x3FE5BCC0,0xD81A0ABD, + 0x3FEA6666,0x66666666, 0x3FE5B6BD,0x18FA79F8, + 0x3FEA6E97,0x8D4FDF3B, 0x3FE5B0B7,0xED8EC26D, + 0x3FEA76C8,0xB4395810, 0x3FE5AAB1,0x563BE4A5, + 0x3FEA7EF9,0xDB22D0E5, 0x3FE5A4A9,0x5366F901, + 0x3FEA872B,0x020C49BA, 0x3FE59E9F,0xE5752FB7, + 0x3FEA8F5C,0x28F5C28F, 0x3FE59895,0x0CCBD0C6, + 0x3FEA978D,0x4FDF3B64, 0x3FE59288,0xC9D03BF4, + 0x3FEA9FBE,0x76C8B439, 0x3FE58C7B,0x1CE7E8C7, + 0x3FEAA7EF,0x9DB22D0E, 0x3FE5866C,0x0678667A, + 0x3FEAB020,0xC49BA5E3, 0x3FE5805B,0x86E75BFC, + 0x3FEAB851,0xEB851EB8, 0x3FE57A49,0x9E9A87E6, + 0x3FEAC083,0x126E978D, 0x3FE57436,0x4DF7C074, + 0x3FEAC8B4,0x39581062, 0x3FE56E21,0x9564F382, + 0x3FEAD0E5,0x60418937, 0x3FE5680B,0x75482680, + 0x3FEAD916,0x872B020C, 0x3FE561F3,0xEE07766F, + 0x3FEAE147,0xAE147AE1, 0x3FE55BDB,0x000917DB, + 0x3FEAE978,0xD4FDF3B6, 0x3FE555C0,0xABB356D1, + 0x3FEAF1A9,0xFBE76C8B, 0x3FE54FA4,0xF16C96D9, + 0x3FEAF9DB,0x22D0E560, 0x3FE54987,0xD19B52F2, + 0x3FEB020C,0x49BA5E35, 0x3FE54369,0x4CA61D8A, + 0x3FEB0A3D,0x70A3D70A, 0x3FE53D49,0x62F3A075, + 0x3FEB126E,0x978D4FDF, 0x3FE53728,0x14EA9CE9, + 0x3FEB1A9F,0xBE76C8B4, 0x3FE53105,0x62F1EB77, + 0x3FEB22D0,0xE5604189, 0x3FE52AE1,0x4D707C02, + 0x3FEB2B02,0x0C49BA5E, 0x3FE524BB,0xD4CD55BC, + 0x3FEB3333,0x33333333, 0x3FE51E94,0xF96F971B, + 0x3FEB3B64,0x5A1CAC08, 0x3FE5186C,0xBBBE75D6, + 0x3FEB4395,0x810624DD, 0x3FE51243,0x1C213EDB, + 0x3FEB4BC6,0xA7EF9DB2, 0x3FE50C18,0x1AFF564B, + 0x3FEB53F7,0xCED91687, 0x3FE505EB,0xB8C03773, + 0x3FEB5C28,0xF5C28F5C, 0x3FE4FFBD,0xF5CB74C1, + 0x3FEB645A,0x1CAC0831, 0x3FE4F98E,0xD288B7C5, + 0x3FEB6C8B,0x43958106, 0x3FE4F35E,0x4F5FC121, + 0x3FEB74BC,0x6A7EF9DB, 0x3FE4ED2C,0x6CB8688B, + 0x3FEB7CED,0x916872B0, 0x3FE4E6F9,0x2AFA9CBE, + 0x3FEB851E,0xB851EB85, 0x3FE4E0C4,0x8A8E637C, + 0x3FEB8D4F,0xDF3B645A, 0x3FE4DA8E,0x8BDBD97E, + 0x3FEB9581,0x0624DD2F, 0x3FE4D457,0x2F4B3274, + 0x3FEB9DB2,0x2D0E5604, 0x3FE4CE1E,0x7544B8FC, + 0x3FEBA5E3,0x53F7CED9, 0x3FE4C7E4,0x5E30CE9A, + 0x3FEBAE14,0x7AE147AE, 0x3FE4C1A8,0xEA77EBB3, + 0x3FEBB645,0xA1CAC083, 0x3FE4BB6C,0x1A829F84, + 0x3FEBBE76,0xC8B43958, 0x3FE4B52D,0xEEB9901D, + 0x3FEBC6A7,0xEF9DB22D, 0x3FE4AEEE,0x67857A5A, + 0x3FEBCED9,0x16872B02, 0x3FE4A8AD,0x854F31DD, + 0x3FEBD70A,0x3D70A3D7, 0x3FE4A26B,0x487FA102, + 0x3FEBDF3B,0x645A1CAC, 0x3FE49C27,0xB17FC8DF, + 0x3FEBE76C,0x8B439581, 0x3FE495E2,0xC0B8C13A, + 0x3FEBEF9D,0xB22D0E56, 0x3FE48F9C,0x7693B882, + 0x3FEBF7CE,0xD916872B, 0x3FE48954,0xD379F3C6, + 0x3FEC0000,0x00000000, 0x3FE4830B,0xD7D4CEB3, + 0x3FEC0831,0x26E978D5, 0x3FE47CC1,0x840DBB8B, + 0x3FEC1062,0x4DD2F1AA, 0x3FE47675,0xD88E431B, + 0x3FEC1893,0x74BC6A7F, 0x3FE47028,0xD5C004B8, + 0x3FEC20C4,0x9BA5E354, 0x3FE469DA,0x7C0CB637, + 0x3FEC28F5,0xC28F5C29, 0x3FE4638A,0xCBDE23E6, + 0x3FEC3126,0xE978D4FE, 0x3FE45D39,0xC59E3084, + 0x3FEC3958,0x10624DD3, 0x3FE456E7,0x69B6D53B, + 0x3FEC4189,0x374BC6A8, 0x3FE45093,0xB892219A, + 0x3FEC49BA,0x5E353F7D, 0x3FE44A3E,0xB29A3B8D, + 0x3FEC51EB,0x851EB852, 0x3FE443E8,0x58395F54, + 0x3FEC5A1C,0xAC083127, 0x3FE43D90,0xA9D9DF81, + 0x3FEC624D,0xD2F1A9FC, 0x3FE43737,0xA7E624EC, + 0x3FEC6A7E,0xF9DB22D1, 0x3FE430DD,0x52C8AEB0, + 0x3FEC72B0,0x20C49BA6, 0x3FE42A81,0xAAEC1220, + 0x3FEC7AE1,0x47AE147B, 0x3FE42424,0xB0BAFAC4, + 0x3FEC8312,0x6E978D50, 0x3FE41DC6,0x64A02A50, + 0x3FEC8B43,0x95810625, 0x3FE41766,0xC706789C, + 0x3FEC9374,0xBC6A7EFA, 0x3FE41105,0xD858D3A1, + 0x3FEC9BA5,0xE353F7CF, 0x3FE40AA3,0x99023F6C, + 0x3FECA3D7,0x0A3D70A4, 0x3FE40440,0x096DD61B, + 0x3FECAC08,0x3126E979, 0x3FE3FDDB,0x2A06C7D8, + 0x3FECB439,0x5810624E, 0x3FE3F774,0xFB385ACB, + 0x3FECBC6A,0x7EF9DB23, 0x3FE3F10D,0x7D6DEB19, + 0x3FECC49B,0xA5E353F8, 0x3FE3EAA4,0xB112EADD, + 0x3FECCCCC,0xCCCCCCCD, 0x3FE3E43A,0x9692E21C, + 0x3FECD4FD,0xF3B645A2, 0x3FE3DDCF,0x2E596EC3, + 0x3FECDD2F,0x1A9FBE77, 0x3FE3D762,0x78D2449D, + 0x3FECE560,0x4189374C, 0x3FE3D0F4,0x76692D4D, + 0x3FECED91,0x6872B021, 0x3FE3CA85,0x278A0847, + 0x3FECF5C2,0x8F5C28F6, 0x3FE3C414,0x8CA0CAC8, + 0x3FECFDF3,0xB645A1CB, 0x3FE3BDA2,0xA6197FD3, + 0x3FED0624,0xDD2F1AA0, 0x3FE3B72F,0x74604821, + 0x3FED0E56,0x04189375, 0x3FE3B0BA,0xF7E15A25, + 0x3FED1687,0x2B020C4A, 0x3FE3AA45,0x310901FC, + 0x3FED1EB8,0x51EB851F, 0x3FE3A3CE,0x2043A16B, + 0x3FED26E9,0x78D4FDF4, 0x3FE39D55,0xC5FDAFD5, + 0x3FED2F1A,0x9FBE76C9, 0x3FE396DC,0x22A3BA36, + 0x3FED374B,0xC6A7EF9E, 0x3FE39061,0x36A2631B, + 0x3FED3F7C,0xED916873, 0x3FE389E5,0x0266629A, + 0x3FED47AE,0x147AE148, 0x3FE38367,0x865C864D, + 0x3FED4FDF,0x3B645A1D, 0x3FE37CE8,0xC2F1B14A, + 0x3FED5810,0x624DD2F2, 0x3FE37668,0xB892DC19, + 0x3FED6041,0x89374BC7, 0x3FE36FE7,0x67AD14B2, + 0x3FED6872,0xB020C49C, 0x3FE36964,0xD0AD7E72, + 0x3FED70A3,0xD70A3D71, 0x3FE362E0,0xF4015215, + 0x3FED78D4,0xFDF3B646, 0x3FE35C5B,0xD215DDB0, + 0x3FED8106,0x24DD2F1B, 0x3FE355D5,0x6B5884A6, + 0x3FED8937,0x4BC6A7F0, 0x3FE34F4D,0xC036BFA7, + 0x3FED9168,0x72B020C5, 0x3FE348C4,0xD11E1CA4, + 0x3FED9999,0x9999999A, 0x3FE3423A,0x9E7C3EC9, + 0x3FEDA1CA,0xC083126F, 0x3FE33BAF,0x28BEDE75, + 0x3FEDA9FB,0xE76C8B44, 0x3FE33522,0x7053C936, + 0x3FEDB22D,0x0E560419, 0x3FE32E94,0x75A8E1BE, + 0x3FEDBA5E,0x353F7CEE, 0x3FE32805,0x392C1FDE, + 0x3FEDC28F,0x5C28F5C3, 0x3FE32174,0xBB4B9080, + 0x3FEDCAC0,0x83126E98, 0x3FE31AE2,0xFC75559A, + 0x3FEDD2F1,0xA9FBE76D, 0x3FE3144F,0xFD17A62F, + 0x3FEDDB22,0xD0E56042, 0x3FE30DBB,0xBDA0CE40, + 0x3FEDE353,0xF7CED917, 0x3FE30726,0x3E7F2ECB, + 0x3FEDEB85,0x1EB851EC, 0x3FE3008F,0x80213DC1, + 0x3FEDF3B6,0x45A1CAC1, 0x3FE2F9F7,0x82F585FC, + 0x3FEDFBE7,0x6C8B4396, 0x3FE2F35E,0x476AA73F, + 0x3FEE0418,0x9374BC6A, 0x3FE2ECC3,0xCDEF5627, + 0x3FEE0C49,0xBA5E353F, 0x3FE2E628,0x16F25C28, + 0x3FEE147A,0xE147AE14, 0x3FE2DF8B,0x22E29786, + 0x3FEE1CAC,0x083126E9, 0x3FE2D8EC,0xF22EFB4B, + 0x3FEE24DD,0x2F1A9FBE, 0x3FE2D24D,0x85468F41, + 0x3FEE2D0E,0x56041893, 0x3FE2CBAC,0xDC986FEF, + 0x3FEE353F,0x7CED9168, 0x3FE2C50A,0xF893CE88, + 0x3FEE3D70,0xA3D70A3D, 0x3FE2BE67,0xD9A7F0EF, + 0x3FEE45A1,0xCAC08312, 0x3FE2B7C3,0x804431A5, + 0x3FEE4DD2,0xF1A9FBE7, 0x3FE2B11D,0xECD7FFCB, + 0x3FEE5604,0x189374BC, 0x3FE2AA77,0x1FD2DF16, + 0x3FEE5E35,0x3F7CED91, 0x3FE2A3CF,0x19A467C5, + 0x3FEE6666,0x66666666, 0x3FE29D25,0xDABC46A2, + 0x3FEE6E97,0x8D4FDF3B, 0x3FE2967B,0x638A3CF0, + 0x3FEE76C8,0xB4395810, 0x3FE28FCF,0xB47E206F, + 0x3FEE7EF9,0xDB22D0E5, 0x3FE28922,0xCE07DB4C, + 0x3FEE872B,0x020C49BA, 0x3FE28274,0xB0976C1C, + 0x3FEE8F5C,0x28F5C28F, 0x3FE27BC5,0x5C9CE5D6, + 0x3FEE978D,0x4FDF3B64, 0x3FE27514,0xD2886FCD, + 0x3FEE9FBE,0x76C8B439, 0x3FE26E63,0x12CA45A4, + 0x3FEEA7EF,0x9DB22D0E, 0x3FE267B0,0x1DD2B74B, + 0x3FEEB020,0xC49BA5E3, 0x3FE260FB,0xF41228F4, + 0x3FEEB851,0xEB851EB8, 0x3FE25A46,0x95F91310, + 0x3FEEC083,0x126E978D, 0x3FE25390,0x03F80243, + 0x3FEEC8B4,0x39581062, 0x3FE24CD8,0x3E7F9760, + 0x3FEED0E5,0x60418937, 0x3FE2461F,0x46008761, + 0x3FEED916,0x872B020C, 0x3FE23F65,0x1AEB9B5C, + 0x3FEEE147,0xAE147AE1, 0x3FE238A9,0xBDB1B084, + 0x3FEEE978,0xD4FDF3B6, 0x3FE231ED,0x2EC3B816, + 0x3FEEF1A9,0xFBE76C8B, 0x3FE22B2F,0x6E92B75D, + 0x3FEEF9DB,0x22D0E560, 0x3FE22470,0x7D8FC7A3, + 0x3FEF020C,0x49BA5E35, 0x3FE21DB0,0x5C2C162C, + 0x3FEF0A3D,0x70A3D70A, 0x3FE216EF,0x0AD8E430, + 0x3FEF126E,0x978D4FDF, 0x3FE2102C,0x8A0786D0, + 0x3FEF1A9F,0xBE76C8B4, 0x3FE20968,0xDA296712, + 0x3FEF22D0,0xE5604189, 0x3FE202A3,0xFBB001DA, + 0x3FEF2B02,0x0C49BA5E, 0x3FE1FBDD,0xEF0CE7DD, + 0x3FEF3333,0x33333333, 0x3FE1F516,0xB4B1BDA1, + 0x3FEF3B64,0x5A1CAC08, 0x3FE1EE4E,0x4D103B71, + 0x3FEF4395,0x810624DD, 0x3FE1E784,0xB89A2D56, + 0x3FEF4BC6,0xA7EF9DB2, 0x3FE1E0B9,0xF7C1730F, + 0x3FEF53F7,0xCED91687, 0x3FE1D9EE,0x0AF8000E, + 0x3FEF5C28,0xF5C28F5C, 0x3FE1D320,0xF2AFDB6A, + 0x3FEF645A,0x1CAC0831, 0x3FE1CC52,0xAF5B1FDC, + 0x3FEF6C8B,0x43958106, 0x3FE1C583,0x416BFBB6, + 0x3FEF74BC,0x6A7EF9DB, 0x3FE1BEB2,0xA954B0DB, + 0x3FEF7CED,0x916872B0, 0x3FE1B7E0,0xE78794BB, + 0x3FEF851E,0xB851EB85, 0x3FE1B10D,0xFC771045, + 0x3FEF8D4F,0xDF3B645A, 0x3FE1AA39,0xE8959FE5, + 0x3FEF9581,0x0624DD2F, 0x3FE1A364,0xAC55D37C, + 0x3FEF9DB2,0x2D0E5604, 0x3FE19C8E,0x482A4E55, + 0x3FEFA5E3,0x53F7CED9, 0x3FE195B6,0xBC85C721, + 0x3FEFAE14,0x7AE147AE, 0x3FE18EDE,0x09DB07EE, + 0x3FEFB645,0xA1CAC083, 0x3FE18804,0x309CEE20, + 0x3FEFBE76,0xC8B43958, 0x3FE18129,0x313E6A68, + 0x3FEFC6A7,0xEF9DB22D, 0x3FE17A4D,0x0C3280BE, + 0x3FEFCED9,0x16872B02, 0x3FE1736F,0xC1EC485B, + 0x3FEFD70A,0x3D70A3D7, 0x3FE16C91,0x52DEEBAD, + 0x3FEFDF3B,0x645A1CAC, 0x3FE165B1,0xBF7DA853, + 0x3FEFE76C,0x8B439581, 0x3FE15ED1,0x083BCF15, + 0x3FEFEF9D,0xB22D0E56, 0x3FE157EF,0x2D8CC3DB, + 0x3FEFF7CE,0xD916872B, 0x3FE1510C,0x2FE3FDA7, + 0x3FF00000,0x00000000, 0x3FE14A28,0x0FB5068C, + 0x3FF00418,0x9374BC6A, 0x3FE14342,0xCD737BA8, + 0x3FF00831,0x26E978D5, 0x3FE13C5C,0x69930D1A, + 0x3FF00C49,0xBA5E353F, 0x3FE13574,0xE4877E00, + 0x3FF01062,0x4DD2F1AA, 0x3FE12E8C,0x3EC4A465, + 0x3FF0147A,0xE147AE14, 0x3FE127A2,0x78BE6947, + 0x3FF01893,0x74BC6A7F, 0x3FE120B7,0x92E8C882, + 0x3FF01CAC,0x083126E9, 0x3FE119CB,0x8DB7D0D5, + 0x3FF020C4,0x9BA5E354, 0x3FE112DE,0x699FA3CC, + 0x3FF024DD,0x2F1A9FBE, 0x3FE10BF0,0x271475C9, + 0x3FF028F5,0xC28F5C29, 0x3FE10500,0xC68A8DED, + 0x3FF02D0E,0x56041893, 0x3FE0FE10,0x4876461C, + 0x3FF03126,0xE978D4FE, 0x3FE0F71E,0xAD4C0AEC, + 0x3FF0353F,0x7CED9168, 0x3FE0F02B,0xF5805BA8, + 0x3FF03958,0x10624DD3, 0x3FE0E938,0x2187CA3B, + 0x3FF03D70,0xA3D70A3D, 0x3FE0E243,0x31D6FB38, + 0x3FF04189,0x374BC6A8, 0x3FE0DB4D,0x26E2A5C0, + 0x3FF045A1,0xCAC08312, 0x3FE0D456,0x011F938E, + 0x3FF049BA,0x5E353F7D, 0x3FE0CD5D,0xC102A0DF, + 0x3FF04DD2,0xF1A9FBE7, 0x3FE0C664,0x6700BC77, + 0x3FF051EB,0x851EB852, 0x3FE0BF69,0xF38EE78C, + 0x3FF05604,0x189374BC, 0x3FE0B86E,0x672235CE, + 0x3FF05A1C,0xAC083127, 0x3FE0B171,0xC22FCD4E, + 0x3FF05E35,0x3F7CED91, 0x3FE0AA74,0x052CE689, + 0x3FF0624D,0xD2F1A9FC, 0x3FE0A375,0x308ECC4E, + 0x3FF06666,0x66666666, 0x3FE09C75,0x44CADBC7, + 0x3FF06A7E,0xF9DB22D1, 0x3FE09574,0x42568460, + 0x3FF06E97,0x8D4FDF3B, 0x3FE08E72,0x29A747D4, + 0x3FF072B0,0x20C49BA6, 0x3FE0876E,0xFB32BA0E, + 0x3FF076C8,0xB4395810, 0x3FE0806A,0xB76E8138, + 0x3FF07AE1,0x47AE147B, 0x3FE07965,0x5ED055A0, + 0x3FF07EF9,0xDB22D0E5, 0x3FE0725E,0xF1CE01BF, + 0x3FF08312,0x6E978D50, 0x3FE06B57,0x70DD6225, + 0x3FF0872B,0x020C49BA, 0x3FE0644E,0xDC74657F, + 0x3FF08B43,0x95810625, 0x3FE05D45,0x35090C80, + 0x3FF08F5C,0x28F5C28F, 0x3FE0563A,0x7B1169E7, + 0x3FF09374,0xBC6A7EFA, 0x3FE04F2E,0xAF03A26B, + 0x3FF0978D,0x4FDF3B64, 0x3FE04821,0xD155ECC0, + 0x3FF09BA5,0xE353F7CF, 0x3FE04113,0xE27E9184, + 0x3FF09FBE,0x76C8B439, 0x3FE03A04,0xE2F3EB3E, + 0x3FF0A3D7,0x0A3D70A4, 0x3FE032F4,0xD32C6653, + 0x3FF0A7EF,0x9DB22D0E, 0x3FE02BE3,0xB39E8101, + 0x3FF0AC08,0x3126E979, 0x3FE024D1,0x84C0CB53, + 0x3FF0B020,0xC49BA5E3, 0x3FE01DBE,0x4709E71F, + 0x3FF0B439,0x5810624E, 0x3FE016A9,0xFAF087F8, + 0x3FF0B851,0xEB851EB8, 0x3FE00F94,0xA0EB732D, + 0x3FF0BC6A,0x7EF9DB23, 0x3FE0087E,0x39717FB8, + 0x3FF0C083,0x126E978D, 0x3FE00166,0xC4F99643, + 0x3FF0C49B,0xA5E353F8, 0x3FDFF49C,0x87F56223, + 0x3FF0C8B4,0x39581062, 0x3FDFE669,0x6DD7B80E, + 0x3FF0CCCC,0xCCCCCCCD, 0x3FDFD834,0x3C886923, + 0x3FF0D0E5,0x60418937, 0x3FDFC9FC,0xF4F5D35F, + 0x3FF0D4FD,0xF3B645A2, 0x3FDFBBC3,0x980E77B4, + 0x3FF0D916,0x872B020C, 0x3FDFAD88,0x26C0FA17, + 0x3FF0DD2F,0x1A9FBE77, 0x3FDF9F4A,0xA1FC2152, + 0x3FF0E147,0xAE147AE1, 0x3FDF910B,0x0AAED712, + 0x3FF0E560,0x4189374C, 0x3FDF82C9,0x61C827BB, + 0x3FF0E978,0xD4FDF3B6, 0x3FDF7485,0xA8374274, + 0x3FF0ED91,0x6872B021, 0x3FDF663F,0xDEEB78FC, + 0x3FF0F1A9,0xFBE76C8B, 0x3FDF57F8,0x06D43FB5, + 0x3FF0F5C2,0x8F5C28F6, 0x3FDF49AE,0x20E12D79, + 0x3FF0F9DB,0x22D0E560, 0x3FDF3B62,0x2E01FBA8, + 0x3FF0FDF3,0xB645A1CB, 0x3FDF2D14,0x2F2685FA, + 0x3FF1020C,0x49BA5E35, 0x3FDF1EC4,0x253ECA8A, + 0x3FF10624,0xDD2F1AA0, 0x3FDF1072,0x113AE9B0, + 0x3FF10A3D,0x70A3D70A, 0x3FDF021D,0xF40B2606, + 0x3FF10E56,0x04189375, 0x3FDEF3C7,0xCE9FE443, + 0x3FF1126E,0x978D4FDF, 0x3FDEE56F,0xA1E9AB41, + 0x3FF11687,0x2B020C4A, 0x3FDED715,0x6ED923D6, + 0x3FF11A9F,0xBE76C8B4, 0x3FDEC8B9,0x365F18DF, + 0x3FF11EB8,0x51EB851F, 0x3FDEBA5A,0xF96C7713, + 0x3FF122D0,0xE5604189, 0x3FDEABFA,0xB8F24D0F, + 0x3FF126E9,0x78D4FDF4, 0x3FDE9D98,0x75E1CB2C, + 0x3FF12B02,0x0C49BA5E, 0x3FDE8F34,0x312C438C, + 0x3FF12F1A,0x9FBE76C9, 0x3FDE80CD,0xEBC329E9, + 0x3FF13333,0x33333333, 0x3FDE7265,0xA69813A9, + 0x3FF1374B,0xC6A7EF9E, 0x3FDE63FB,0x629CB7A9, + 0x3FF13B64,0x5A1CAC08, 0x3FDE558F,0x20C2EE52, + 0x3FF13F7C,0xED916873, 0x3FDE4720,0xE1FCB167, + 0x3FF14395,0x810624DD, 0x3FDE38B0,0xA73C1C14, + 0x3FF147AE,0x147AE148, 0x3FDE2A3E,0x71736AC3, + 0x3FF14BC6,0xA7EF9DB2, 0x3FDE1BCA,0x4194FB23, + 0x3FF14FDF,0x3B645A1D, 0x3FDE0D54,0x18934C04, + 0x3FF153F7,0xCED91687, 0x3FDDFEDB,0xF760FD5B, + 0x3FF15810,0x624DD2F2, 0x3FDDF061,0xDEF0D01B, + 0x3FF15C28,0xF5C28F5C, 0x3FDDE1E5,0xD035A642, + 0x3FF16041,0x89374BC7, 0x3FDDD367,0xCC2282A9, + 0x3FF1645A,0x1CAC0831, 0x3FDDC4E7,0xD3AA8912, + 0x3FF16872,0xB020C49C, 0x3FDDB665,0xE7C0FDFE, + 0x3FF16C8B,0x43958106, 0x3FDDA7E2,0x095946B6, + 0x3FF170A3,0xD70A3D71, 0x3FDD995C,0x3966E91F, + 0x3FF174BC,0x6A7EF9DB, 0x3FDD8AD4,0x78DD8BCB, + 0x3FF178D4,0xFDF3B646, 0x3FDD7C4A,0xC8B0F5C6, + 0x3FF17CED,0x916872B0, 0x3FDD6DBF,0x29D50EA8, + 0x3FF18106,0x24DD2F1B, 0x3FDD5F31,0x9D3DDE63, + 0x3FF1851E,0xB851EB85, 0x3FDD50A2,0x23DF8D56, + 0x3FF18937,0x4BC6A7F0, 0x3FDD4210,0xBEAE641C, + 0x3FF18D4F,0xDF3B645A, 0x3FDD337D,0x6E9ECB99, + 0x3FF19168,0x72B020C5, 0x3FDD24E8,0x34A54CCF, + 0x3FF19581,0x0624DD2F, 0x3FDD1651,0x11B690EA, + 0x3FF19999,0x9999999A, 0x3FDD07B8,0x06C76111, + 0x3FF19DB2,0x2D0E5604, 0x3FDCF91D,0x14CCA677, + 0x3FF1A1CA,0xC083126F, 0x3FDCEA80,0x3CBB6A2B, + 0x3FF1A5E3,0x53F7CED9, 0x3FDCDBE1,0x7F88D525, + 0x3FF1A9FB,0xE76C8B44, 0x3FDCCD40,0xDE2A301A, + 0x3FF1AE14,0x7AE147AE, 0x3FDCBE9E,0x5994E38A, + 0x3FF1B22D,0x0E560419, 0x3FDCAFF9,0xF2BE7790, + 0x3FF1B645,0xA1CAC083, 0x3FDCA153,0xAA9C93F0, + 0x3FF1BA5E,0x353F7CEE, 0x3FDC92AB,0x8224FFEB, + 0x3FF1BE76,0xC8B43958, 0x3FDC8401,0x7A4DA24C, + 0x3FF1C28F,0x5C28F5C3, 0x3FDC7555,0x940C8139, + 0x3FF1C6A7,0xEF9DB22D, 0x3FDC66A7,0xD057C240, + 0x3FF1CAC0,0x83126E98, 0x3FDC57F8,0x3025AA2C, + 0x3FF1CED9,0x16872B02, 0x3FDC4946,0xB46C9D12, + 0x3FF1D2F1,0xA9FBE76D, 0x3FDC3A93,0x5E231E21, + 0x3FF1D70A,0x3D70A3D7, 0x3FDC2BDE,0x2E3FCFAF, + 0x3FF1DB22,0xD0E56042, 0x3FDC1D27,0x25B97310, + 0x3FF1DF3B,0x645A1CAC, 0x3FDC0E6E,0x4586E89F, + 0x3FF1E353,0xF7CED917, 0x3FDBFFB3,0x8E9F2F90, + 0x3FF1E76C,0x8B439581, 0x3FDBF0F7,0x01F96601, + 0x3FF1EB85,0x1EB851EC, 0x3FDBE238,0xA08CC8CB, + 0x3FF1EF9D,0xB22D0E56, 0x3FDBD378,0x6B50B38B, + 0x3FF1F3B6,0x45A1CAC1, 0x3FDBC4B6,0x633CA07B, + 0x3FF1F7CE,0xD916872B, 0x3FDBB5F2,0x8948287A, + 0x3FF1FBE7,0x6C8B4396, 0x3FDBA72C,0xDE6B02E3, + 0x3FF20000,0x00000000, 0x3FDB9865,0x639D0596, + 0x3FF20418,0x9374BC6A, 0x3FDB899C,0x19D624CD, + 0x3FF20831,0x26E978D5, 0x3FDB7AD1,0x020E731F, + 0x3FF20C49,0xBA5E353F, 0x3FDB6C04,0x1D3E2171, + 0x3FF21062,0x4DD2F1AA, 0x3FDB5D35,0x6C5D7ED0, + 0x3FF2147A,0xE147AE14, 0x3FDB4E64,0xF064F881, + 0x3FF21893,0x74BC6A7F, 0x3FDB3F92,0xAA4D19CF, + 0x3FF21CAC,0x083126E9, 0x3FDB30BE,0x9B0E8C1A, + 0x3FF220C4,0x9BA5E354, 0x3FDB21E8,0xC3A216A8, + 0x3FF224DD,0x2F1A9FBE, 0x3FDB1311,0x25009EB5, + 0x3FF228F5,0xC28F5C29, 0x3FDB0437,0xC0232741, + 0x3FF22D0E,0x56041893, 0x3FDAF55C,0x9602D123, + 0x3FF23126,0xE978D4FE, 0x3FDAE67F,0xA798DAD5, + 0x3FF2353F,0x7CED9168, 0x3FDAD7A0,0xF5DEA083, + 0x3FF23958,0x10624DD3, 0x3FDAC8C0,0x81CD9BE1, + 0x3FF23D70,0xA3D70A3D, 0x3FDAB9DE,0x4C5F6434, + 0x3FF24189,0x374BC6A8, 0x3FDAAAFA,0x568DAE24, + 0x3FF245A1,0xCAC08312, 0x3FDA9C14,0xA1524BCD, + 0x3FF249BA,0x5E353F7D, 0x3FDA8D2D,0x2DA72C8B, + 0x3FF24DD2,0xF1A9FBE7, 0x3FDA7E43,0xFC865D0F, + 0x3FF251EB,0x851EB852, 0x3FDA6F59,0x0EEA0729, + 0x3FF25604,0x189374BC, 0x3FDA606C,0x65CC71DB, + 0x3FF25A1C,0xAC083127, 0x3FDA517E,0x0228012A, + 0x3FF25E35,0x3F7CED91, 0x3FDA428D,0xE4F73627, + 0x3FF2624D,0xD2F1A9FC, 0x3FDA339C,0x0F34AEC6, + 0x3FF26666,0x66666666, 0x3FDA24A8,0x81DB25EB, + 0x3FF26A7E,0xF9DB22D1, 0x3FDA15B3,0x3DE57336, + 0x3FF26E97,0x8D4FDF3B, 0x3FDA06BC,0x444E8B19, + 0x3FF272B0,0x20C49BA6, 0x3FD9F7C3,0x96117EA3, + 0x3FF276C8,0xB4395810, 0x3FD9E8C9,0x34297B8F, + 0x3FF27AE1,0x47AE147B, 0x3FD9D9CD,0x1F91CC19, + 0x3FF27EF9,0xDB22D0E5, 0x3FD9CACF,0x5945D705, + 0x3FF28312,0x6E978D50, 0x3FD9BBCF,0xE2411F79, + 0x3FF2872B,0x020C49BA, 0x3FD9ACCE,0xBB7F4501, + 0x3FF28B43,0x95810625, 0x3FD99DCB,0xE5FC0369, + 0x3FF28F5C,0x28F5C28F, 0x3FD98EC7,0x62B332C5, + 0x3FF29374,0xBC6A7EFA, 0x3FD97FC1,0x32A0C746, + 0x3FF2978D,0x4FDF3B64, 0x3FD970B9,0x56C0D144, + 0x3FF29BA5,0xE353F7CF, 0x3FD961AF,0xD00F7D13, + 0x3FF29FBE,0x76C8B439, 0x3FD952A4,0x9F89130D, + 0x3FF2A3D7,0x0A3D70A4, 0x3FD94397,0xC629F767, + 0x3FF2A7EF,0x9DB22D0E, 0x3FD93489,0x44EEAA3C, + 0x3FF2AC08,0x3126E979, 0x3FD92579,0x1CD3C75F, + 0x3FF2B020,0xC49BA5E3, 0x3FD91667,0x4ED60669, + 0x3FF2B439,0x5810624E, 0x3FD90753,0xDBF23A89, + 0x3FF2B851,0xEB851EB8, 0x3FD8F83E,0xC5255295, + 0x3FF2BC6A,0x7EF9DB23, 0x3FD8E928,0x0B6C58D7, + 0x3FF2C083,0x126E978D, 0x3FD8DA0F,0xAFC4731C, + 0x3FF2C49B,0xA5E353F8, 0x3FD8CAF5,0xB32AE287, + 0x3FF2C8B4,0x39581062, 0x3FD8BBDA,0x169D039C, + 0x3FF2CCCC,0xCCCCCCCD, 0x3FD8ACBC,0xDB184E14, + 0x3FF2D0E5,0x60418937, 0x3FD89D9E,0x019A54E8, + 0x3FF2D4FD,0xF3B645A2, 0x3FD88E7D,0x8B20C623, + 0x3FF2D916,0x872B020C, 0x3FD87F5B,0x78A96AF1, + 0x3FF2DD2F,0x1A9FBE77, 0x3FD87037,0xCB32276D, + 0x3FF2E147,0xAE147AE1, 0x3FD86112,0x83B8FAB3, + 0x3FF2E560,0x4189374C, 0x3FD851EB,0xA33BFEAC, + 0x3FF2E978,0xD4FDF3B6, 0x3FD842C3,0x2AB96821, + 0x3FF2ED91,0x6872B021, 0x3FD83399,0x1B2F8687, + 0x3FF2F1A9,0xFBE76C8B, 0x3FD8246D,0x759CC411, + 0x3FF2F5C2,0x8F5C28F6, 0x3FD81540,0x3AFFA57C, + 0x3FF2F9DB,0x22D0E560, 0x3FD80611,0x6C56CA24, + 0x3FF2FDF3,0xB645A1CB, 0x3FD7F6E1,0x0AA0EBCC, + 0x3FF3020C,0x49BA5E35, 0x3FD7E7AF,0x16DCDEB4, + 0x3FF30624,0xDD2F1AA0, 0x3FD7D87B,0x92099163, + 0x3FF30A3D,0x70A3D70A, 0x3FD7C946,0x7D260CBA, + 0x3FF30E56,0x04189375, 0x3FD7BA0F,0xD93173C3, + 0x3FF3126E,0x978D4FDF, 0x3FD7AAD7,0xA72B03BC, + 0x3FF31687,0x2B020C4A, 0x3FD79B9D,0xE81213ED, + 0x3FF31A9F,0xBE76C8B4, 0x3FD78C62,0x9CE615B1, + 0x3FF31EB8,0x51EB851F, 0x3FD77D25,0xC6A6944B, + 0x3FF322D0,0xE5604189, 0x3FD76DE7,0x665334EF, + 0x3FF326E9,0x78D4FDF4, 0x3FD75EA7,0x7CEBB697, + 0x3FF32B02,0x0C49BA5E, 0x3FD74F66,0x0B6FF20E, + 0x3FF32F1A,0x9FBE76C9, 0x3FD74023,0x12DFD9C3, + 0x3FF33333,0x33333333, 0x3FD730DE,0x943B79D4, + 0x3FF3374B,0xC6A7EF9E, 0x3FD72198,0x9082F7E1, + 0x3FF33B64,0x5A1CAC08, 0x3FD71251,0x08B69318, + 0x3FF33F7C,0xED916873, 0x3FD70307,0xFDD6A409, + 0x3FF34395,0x810624DD, 0x3FD6F3BD,0x70E39CAF, + 0x3FF347AE,0x147AE148, 0x3FD6E471,0x62DE0843, + 0x3FF34BC6,0xA7EF9DB2, 0x3FD6D523,0xD4C68B4B, + 0x3FF34FDF,0x3B645A1D, 0x3FD6C5D4,0xC79DE369, + 0x3FF353F7,0xCED91687, 0x3FD6B684,0x3C64E769, + 0x3FF35810,0x624DD2F2, 0x3FD6A732,0x341C8711, + 0x3FF35C28,0xF5C28F5C, 0x3FD697DE,0xAFC5CB30, + 0x3FF36041,0x89374BC7, 0x3FD68889,0xB061D56D, + 0x3FF3645A,0x1CAC0831, 0x3FD67933,0x36F1E059, + 0x3FF36872,0xB020C49C, 0x3FD669DB,0x44773F38, + 0x3FF36C8B,0x43958106, 0x3FD65A81,0xD9F35E15, + 0x3FF370A3,0xD70A3D71, 0x3FD64B26,0xF867C192, + 0x3FF374BC,0x6A7EF9DB, 0x3FD63BCA,0xA0D606F1, + 0x3FF378D4,0xFDF3B646, 0x3FD62C6C,0xD43FE3EA, + 0x3FF37CED,0x916872B0, 0x3FD61D0D,0x93A726B7, + 0x3FF38106,0x24DD2F1B, 0x3FD60DAC,0xE00DB5E2, + 0x3FF3851E,0xB851EB85, 0x3FD5FE4A,0xBA759056, + 0x3FF38937,0x4BC6A7F0, 0x3FD5EEE7,0x23E0CD2E, + 0x3FF38D4F,0xDF3B645A, 0x3FD5DF82,0x1D519BC2, + 0x3FF39168,0x72B020C5, 0x3FD5D01B,0xA7CA437A, + 0x3FF39581,0x0624DD2F, 0x3FD5C0B3,0xC44D23D9, + 0x3FF39999,0x9999999A, 0x3FD5B14A,0x73DCB44E, + 0x3FF39DB2,0x2D0E5604, 0x3FD5A1DF,0xB77B8443, + 0x3FF3A1CA,0xC083126F, 0x3FD59273,0x902C3AED, + 0x3FF3A5E3,0x53F7CED9, 0x3FD58305,0xFEF19758, + 0x3FF3A9FB,0xE76C8B44, 0x3FD57397,0x04CE703A, + 0x3FF3AE14,0x7AE147AE, 0x3FD56426,0xA2C5B3FE, + 0x3FF3B22D,0x0E560419, 0x3FD554B4,0xD9DA6896, + 0x3FF3B645,0xA1CAC083, 0x3FD54541,0xAB0FAB8A, + 0x3FF3BA5E,0x353F7CEE, 0x3FD535CD,0x1768B1C5, + 0x3FF3BE76,0xC8B43958, 0x3FD52657,0x1FE8C7A5, + 0x3FF3C28F,0x5C28F5C3, 0x3FD516DF,0xC59350CB, + 0x3FF3C6A7,0xEF9DB22D, 0x3FD50767,0x096BC829, + 0x3FF3CAC0,0x83126E98, 0x3FD4F7EC,0xEC75BFCF, + 0x3FF3CED9,0x16872B02, 0x3FD4E871,0x6FB4E100, + 0x3FF3D2F1,0xA9FBE76D, 0x3FD4D8F4,0x942CEBFA, + 0x3FF3D70A,0x3D70A3D7, 0x3FD4C976,0x5AE1B809, + 0x3FF3DB22,0xD0E56042, 0x3FD4B9F6,0xC4D73356, + 0x3FF3DF3B,0x645A1CAC, 0x3FD4AA75,0xD31162F3, + 0x3FF3E353,0xF7CED917, 0x3FD49AF3,0x869462AD, + 0x3FF3E76C,0x8B439581, 0x3FD48B6F,0xE064651B, + 0x3FF3EB85,0x1EB851EC, 0x3FD47BEA,0xE185B36A, + 0x3FF3EF9D,0xB22D0E56, 0x3FD46C64,0x8AFCAD6F, + 0x3FF3F3B6,0x45A1CAC1, 0x3FD45CDC,0xDDCDC975, + 0x3FF3F7CE,0xD916872B, 0x3FD44D53,0xDAFD944B, + 0x3FF3FBE7,0x6C8B4396, 0x3FD43DC9,0x8390B113, + 0x3FF40000,0x00000000, 0x3FD42E3D,0xD88BD952, + 0x3FF40418,0x9374BC6A, 0x3FD41EB0,0xDAF3DCC3, + 0x3FF40831,0x26E978D5, 0x3FD40F22,0x8BCDA152, + 0x3FF40C49,0xBA5E353F, 0x3FD3FF92,0xEC1E2314, + 0x3FF41062,0x4DD2F1AA, 0x3FD3F001,0xFCEA741F, + 0x3FF4147A,0xE147AE14, 0x3FD3E06F,0xBF37BC92, + 0x3FF41893,0x74BC6A7F, 0x3FD3D0DC,0x340B3A6C, + 0x3FF41CAC,0x083126E9, 0x3FD3C147,0x5C6A4195, + 0x3FF420C4,0x9BA5E354, 0x3FD3B1B1,0x395A3BAE, + 0x3FF424DD,0x2F1A9FBE, 0x3FD3A219,0xCBE0A823, + 0x3FF428F5,0xC28F5C29, 0x3FD39281,0x15031BF4, + 0x3FF42D0E,0x56041893, 0x3FD382E7,0x15C741C9, + 0x3FF43126,0xE978D4FE, 0x3FD3734B,0xCF32D9C0, + 0x3FF4353F,0x7CED9168, 0x3FD363AF,0x424BB97A, + 0x3FF43958,0x10624DD3, 0x3FD35411,0x7017CBEB, + 0x3FF43D70,0xA3D70A3D, 0x3FD34472,0x599D1168, + 0x3FF44189,0x374BC6A8, 0x3FD334D1,0xFFE19F77, + 0x3FF445A1,0xCAC08312, 0x3FD32530,0x63EBA0DD, + 0x3FF449BA,0x5E353F7D, 0x3FD3158D,0x86C1556D, + 0x3FF44DD2,0xF1A9FBE7, 0x3FD305E9,0x69691219, + 0x3FF451EB,0x851EB852, 0x3FD2F644,0x0CE940BB, + 0x3FF45604,0x189374BC, 0x3FD2E69D,0x7248602A, + 0x3FF45A1C,0xAC083127, 0x3FD2D6F5,0x9A8D0406, + 0x3FF45E35,0x3F7CED91, 0x3FD2C74C,0x86BDD4C7, + 0x3FF4624D,0xD2F1A9FC, 0x3FD2B7A2,0x37E18F8B, + 0x3FF46666,0x66666666, 0x3FD2A7F6,0xAEFF0628, + 0x3FF46A7E,0xF9DB22D1, 0x3FD29849,0xED1D1EF6, + 0x3FF46E97,0x8D4FDF3B, 0x3FD2889B,0xF342D4E1, + 0x3FF472B0,0x20C49BA6, 0x3FD278EC,0xC2773737, + 0x3FF476C8,0xB4395810, 0x3FD2693C,0x5BC169B8, + 0x3FF47AE1,0x47AE147B, 0x3FD2598A,0xC028A462, + 0x3FF47EF9,0xDB22D0E5, 0x3FD249D7,0xF0B43380, + 0x3FF48312,0x6E978D50, 0x3FD23A23,0xEE6B777E, + 0x3FF4872B,0x020C49BA, 0x3FD22A6E,0xBA55E4F0, + 0x3FF48B43,0x95810625, 0x3FD21AB8,0x557B0467, + 0x3FF48F5C,0x28F5C28F, 0x3FD20B00,0xC0E2727B, + 0x3FF49374,0xBC6A7EFA, 0x3FD1FB47,0xFD93DF9E, + 0x3FF4978D,0x4FDF3B64, 0x3FD1EB8E,0x0C971026, + 0x3FF49BA5,0xE353F7CF, 0x3FD1DBD2,0xEEF3DC22, + 0x3FF49FBE,0x76C8B439, 0x3FD1CC16,0xA5B22F62, + 0x3FF4A3D7,0x0A3D70A4, 0x3FD1BC59,0x31DA094A, + 0x3FF4A7EF,0x9DB22D0E, 0x3FD1AC9A,0x94737CE0, + 0x3FF4AC08,0x3126E979, 0x3FD19CDA,0xCE86B099, + 0x3FF4B020,0xC49BA5E3, 0x3FD18D19,0xE11BDE68, + 0x3FF4B439,0x5810624E, 0x3FD17D57,0xCD3B5392, + 0x3FF4B851,0xEB851EB8, 0x3FD16D94,0x93ED70B2, + 0x3FF4BC6A,0x7EF9DB23, 0x3FD15DD0,0x363AA993, + 0x3FF4C083,0x126E978D, 0x3FD14E0A,0xB52B8536, + 0x3FF4C49B,0xA5E353F8, 0x3FD13E44,0x11C89DA8, + 0x3FF4C8B4,0x39581062, 0x3FD12E7C,0x4D1AA008, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FD11EB3,0x682A4C5F, + 0x3FF4D0E5,0x60418937, 0x3FD10EE9,0x640075A8, + 0x3FF4D4FD,0xF3B645A2, 0x3FD0FF1E,0x41A601A1, + 0x3FF4D916,0x872B020C, 0x3FD0EF52,0x0223E8DA, + 0x3FF4DD2F,0x1A9FBE77, 0x3FD0DF84,0xA6833683, + 0x3FF4E147,0xAE147AE1, 0x3FD0CFB6,0x2FCD0879, + 0x3FF4E560,0x4189374C, 0x3FD0BFE6,0x9F0A8F1A, + 0x3FF4E978,0xD4FDF3B6, 0x3FD0B015,0xF5450D4D, + 0x3FF4ED91,0x6872B021, 0x3FD0A044,0x3385D853, + 0x3FF4F1A9,0xFBE76C8B, 0x3FD09071,0x5AD657DA, + 0x3FF4F5C2,0x8F5C28F6, 0x3FD0809D,0x6C4005C5, + 0x3FF4F9DB,0x22D0E560, 0x3FD070C8,0x68CC6E3C, + 0x3FF4FDF3,0xB645A1CB, 0x3FD060F2,0x51852F80, + 0x3FF5020C,0x49BA5E35, 0x3FD0511B,0x2773F9F3, + 0x3FF50624,0xDD2F1AA0, 0x3FD04142,0xEBA28FE9, + 0x3FF50A3D,0x70A3D70A, 0x3FD03169,0x9F1AC5B8, + 0x3FF50E56,0x04189375, 0x3FD0218F,0x42E68185, + 0x3FF5126E,0x978D4FDF, 0x3FD011B3,0xD80FBB52, + 0x3FF51687,0x2B020C4A, 0x3FD001D7,0x5FA07CD0, + 0x3FF51A9F,0xBE76C8B4, 0x3FCFE3F3,0xB545C2CE, + 0x3FF51EB8,0x51EB851F, 0x3FCFC436,0x94422C19, + 0x3FF522D0,0xE5604189, 0x3FCFA477,0x5E4AB298, + 0x3FF526E9,0x78D4FDF4, 0x3FCF84B6,0x1573F632, + 0x3FF52B02,0x0C49BA5E, 0x3FCF64F2,0xBBD2B9B6, + 0x3FF52F1A,0x9FBE76C9, 0x3FCF452D,0x537BE27D, + 0x3FF53333,0x33333333, 0x3FCF2565,0xDE847882, + 0x3FF5374B,0xC6A7EF9E, 0x3FCF059C,0x5F01A605, + 0x3FF53B64,0x5A1CAC08, 0x3FCEE5D0,0xD708B7A3, + 0x3FF53F7C,0xED916873, 0x3FCEC603,0x48AF1BF4, + 0x3FF54395,0x810624DD, 0x3FCEA633,0xB60A63AB, + 0x3FF547AE,0x147AE148, 0x3FCE8662,0x21304130, + 0x3FF54BC6,0xA7EF9DB2, 0x3FCE668E,0x8C3688BE, + 0x3FF54FDF,0x3B645A1D, 0x3FCE46B8,0xF9333000, + 0x3FF553F7,0xCED91687, 0x3FCE26E1,0x6A3C4E2E, + 0x3FF55810,0x624DD2F2, 0x3FCE0707,0xE1681BAA, + 0x3FF55C28,0xF5C28F5C, 0x3FCDE72C,0x60CCF21E, + 0x3FF56041,0x89374BC7, 0x3FCDC74E,0xEA814C15, + 0x3FF5645A,0x1CAC0831, 0x3FCDA76F,0x809BC51F, + 0x3FF56872,0xB020C49C, 0x3FCD878E,0x25331967, + 0x3FF56C8B,0x43958106, 0x3FCD67AA,0xDA5E25D3, + 0x3FF570A3,0xD70A3D71, 0x3FCD47C5,0xA233E7A3, + 0x3FF574BC,0x6A7EF9DB, 0x3FCD27DE,0x7ECB7C8A, + 0x3FF578D4,0xFDF3B646, 0x3FCD07F5,0x723C224C, + 0x3FF57CED,0x916872B0, 0x3FCCE80A,0x7E9D36DE, + 0x3FF58106,0x24DD2F1B, 0x3FCCC81D,0xA60637FF, + 0x3FF5851E,0xB851EB85, 0x3FCCA82E,0xEA8EC355, + 0x3FF58937,0x4BC6A7F0, 0x3FCC883E,0x4E4E960F, + 0x3FF58D4F,0xDF3B645A, 0x3FCC684B,0xD35D8CFB, + 0x3FF59168,0x72B020C5, 0x3FCC4857,0x7BD3A428, + 0x3FF59581,0x0624DD2F, 0x3FCC2861,0x49C8F6FF, + 0x3FF59999,0x9999999A, 0x3FCC0869,0x3F55BFE4, + 0x3FF59DB2,0x2D0E5604, 0x3FCBE86F,0x5E92584F, + 0x3FF5A1CA,0xC083126F, 0x3FCBC873,0xA997386C, + 0x3FF5A5E3,0x53F7CED9, 0x3FCBA876,0x227CF736, + 0x3FF5A9FB,0xE76C8B44, 0x3FCB8876,0xCB5C4A13, + 0x3FF5AE14,0x7AE147AE, 0x3FCB6875,0xA64E04F3, + 0x3FF5B22D,0x0E560419, 0x3FCB4872,0xB56B19ED, + 0x3FF5B645,0xA1CAC083, 0x3FCB286D,0xFACC9958, + 0x3FF5BA5E,0x353F7CEE, 0x3FCB0867,0x788BB16C, + 0x3FF5BE76,0xC8B43958, 0x3FCAE85F,0x30C1AE5E, + 0x3FF5C28F,0x5C28F5C3, 0x3FCAC855,0x2587F9FC, + 0x3FF5C6A7,0xEF9DB22D, 0x3FCAA849,0x58F81BC8, + 0x3FF5CAC0,0x83126E98, 0x3FCA883B,0xCD2BB898, + 0x3FF5CED9,0x16872B02, 0x3FCA682C,0x843C92B1, + 0x3FF5D2F1,0xA9FBE76D, 0x3FCA481B,0x80448964, + 0x3FF5D70A,0x3D70A3D7, 0x3FCA2808,0xC35D992D, + 0x3FF5DB22,0xD0E56042, 0x3FCA07F4,0x4FA1DB4A, + 0x3FF5DF3B,0x645A1CAC, 0x3FC9E7DE,0x272B85DD, + 0x3FF5E353,0xF7CED917, 0x3FC9C7C6,0x4C14EB89, + 0x3FF5E76C,0x8B439581, 0x3FC9A7AC,0xC0787B89, + 0x3FF5EB85,0x1EB851EC, 0x3FC98791,0x8670C154, + 0x3FF5EF9D,0xB22D0E56, 0x3FC96774,0xA01864B5, + 0x3FF5F3B6,0x45A1CAC1, 0x3FC94756,0x0F8A2968, + 0x3FF5F7CE,0xD916872B, 0x3FC92735,0xD6E0EF39, + 0x3FF5FBE7,0x6C8B4396, 0x3FC90713,0xF837B19E, + 0x3FF60000,0x00000000, 0x3FC8E6F0,0x75A987D6, + 0x3FF60418,0x9374BC6A, 0x3FC8C6CB,0x5151A48D, + 0x3FF60831,0x26E978D5, 0x3FC8A6A4,0x8D4B55CF, + 0x3FF60C49,0xBA5E353F, 0x3FC8867C,0x2BB204FE, + 0x3FF61062,0x4DD2F1AA, 0x3FC86652,0x2EA13679, + 0x3FF6147A,0xE147AE14, 0x3FC84626,0x983489B3, + 0x3FF61893,0x74BC6A7F, 0x3FC825F9,0x6A87B8D6, + 0x3FF61CAC,0x083126E9, 0x3FC805CA,0xA7B698D9, + 0x3FF620C4,0x9BA5E354, 0x3FC7E59A,0x51DD1924, + 0x3FF624DD,0x2F1A9FBE, 0x3FC7C568,0x6B1743A5, + 0x3FF628F5,0xC28F5C29, 0x3FC7A534,0xF5813C74, + 0x3FF62D0E,0x56041893, 0x3FC784FF,0xF33741E9, + 0x3FF63126,0xE978D4FE, 0x3FC764C9,0x6655AC3E, + 0x3FF6353F,0x7CED9168, 0x3FC74491,0x50F8EDA7, + 0x3FF63958,0x10624DD3, 0x3FC72457,0xB53D91F2, + 0x3FF63D70,0xA3D70A3D, 0x3FC7041C,0x95403EA2, + 0x3FF64189,0x374BC6A8, 0x3FC6E3DF,0xF31DB28B, + 0x3FF645A1,0xCAC08312, 0x3FC6C3A1,0xD0F2C5F2, + 0x3FF649BA,0x5E353F7D, 0x3FC6A362,0x30DC6A25, + 0x3FF64DD2,0xF1A9FBE7, 0x3FC68321,0x14F7A999, + 0x3FF651EB,0x851EB852, 0x3FC662DE,0x7F61A789, + 0x3FF65604,0x189374BC, 0x3FC6429A,0x7237A00F, + 0x3FF65A1C,0xAC083127, 0x3FC62254,0xEF96E7C3, + 0x3FF65E35,0x3F7CED91, 0x3FC6020D,0xF99CEBD6, + 0x3FF6624D,0xD2F1A9FC, 0x3FC5E1C5,0x926731AF, + 0x3FF66666,0x66666666, 0x3FC5C17B,0xBC13570B, + 0x3FF66A7E,0xF9DB22D1, 0x3FC5A130,0x78BF1191, + 0x3FF66E97,0x8D4FDF3B, 0x3FC580E3,0xCA882EF7, + 0x3FF672B0,0x20C49BA6, 0x3FC56095,0xB38C949B, + 0x3FF676C8,0xB4395810, 0x3FC54046,0x35EA3F9E, + 0x3FF67AE1,0x47AE147B, 0x3FC51FF5,0x53BF4485, + 0x3FF67EF9,0xDB22D0E5, 0x3FC4FFA3,0x0F29CF50, + 0x3FF68312,0x6E978D50, 0x3FC4DF4F,0x6A48231A, + 0x3FF6872B,0x020C49BA, 0x3FC4BEFA,0x67389A35, + 0x3FF68B43,0x95810625, 0x3FC49EA4,0x0819A5C5, + 0x3FF68F5C,0x28F5C28F, 0x3FC47E4C,0x4F09CDDF, + 0x3FF69374,0xBC6A7EFA, 0x3FC45DF3,0x3E27B123, + 0x3FF6978D,0x4FDF3B64, 0x3FC43D98,0xD79204D9, + 0x3FF69BA5,0xE353F7CF, 0x3FC41D3D,0x1D67948F, + 0x3FF69FBE,0x76C8B439, 0x3FC3FCE0,0x11C74233, + 0x3FF6A3D7,0x0A3D70A4, 0x3FC3DC81,0xB6D005B1, + 0x3FF6A7EF,0x9DB22D0E, 0x3FC3BC22,0x0EA0ED0F, + 0x3FF6AC08,0x3126E979, 0x3FC39BC1,0x1B591C0B, + 0x3FF6B020,0xC49BA5E3, 0x3FC37B5E,0xDF17CC33, + 0x3FF6B439,0x5810624E, 0x3FC35AFB,0x5BFC4C87, + 0x3FF6B851,0xEB851EB8, 0x3FC33A96,0x94260190, + 0x3FF6BC6A,0x7EF9DB23, 0x3FC31A30,0x89B46502, + 0x3FF6C083,0x126E978D, 0x3FC2F9C9,0x3EC705D4, + 0x3FF6C49B,0xA5E353F8, 0x3FC2D960,0xB57D87DD, + 0x3FF6C8B4,0x39581062, 0x3FC2B8F6,0xEFF7A3F2, + 0x3FF6CCCC,0xCCCCCCCD, 0x3FC2988B,0xF0552782, + 0x3FF6D0E5,0x60418937, 0x3FC2781F,0xB8B5F4B2, + 0x3FF6D4FD,0xF3B645A2, 0x3FC257B2,0x4B3A01F7, + 0x3FF6D916,0x872B020C, 0x3FC23743,0xAA015A39, + 0x3FF6DD2F,0x1A9FBE77, 0x3FC216D3,0xD72C1C66, + 0x3FF6E147,0xAE147AE1, 0x3FC1F662,0xD4DA7B97, + 0x3FF6E560,0x4189374C, 0x3FC1D5F0,0xA52CBEA6, + 0x3FF6E978,0xD4FDF3B6, 0x3FC1B57D,0x4A434050, + 0x3FF6ED91,0x6872B021, 0x3FC19508,0xC63E6ECC, + 0x3FF6F1A9,0xFBE76C8B, 0x3FC17493,0x1B3ECBEA, + 0x3FF6F5C2,0x8F5C28F6, 0x3FC1541C,0x4B64ECAF, + 0x3FF6F9DB,0x22D0E560, 0x3FC133A4,0x58D17972, + 0x3FF6FDF3,0xB645A1CB, 0x3FC1132B,0x45A52D77, + 0x3FF7020C,0x49BA5E35, 0x3FC0F2B1,0x1400D70B, + 0x3FF70624,0xDD2F1AA0, 0x3FC0D235,0xC6055722, + 0x3FF70A3D,0x70A3D70A, 0x3FC0B1B9,0x5DD3A173, + 0x3FF70E56,0x04189375, 0x3FC0913B,0xDD8CBC13, + 0x3FF7126E,0x978D4FDF, 0x3FC070BD,0x4751BF93, + 0x3FF71687,0x2B020C4A, 0x3FC0503D,0x9D43D699, + 0x3FF71A9F,0xBE76C8B4, 0x3FC02FBC,0xE1843E00, + 0x3FF71EB8,0x51EB851F, 0x3FC00F3B,0x16344474, + 0x3FF722D0,0xE5604189, 0x3FBFDD70,0x7AEA9516, + 0x3FF726E9,0x78D4FDF4, 0x3FBF9C68,0xB2D184CA, + 0x3FF72B02,0x0C49BA5E, 0x3FBF5B5E,0xD8605F8A, + 0x3FF72F1A,0x9FBE76C9, 0x3FBF1A52,0xEFDA4F61, + 0x3FF73333,0x33333333, 0x3FBED944,0xFD82A112, + 0x3FF7374B,0xC6A7EF9E, 0x3FBE9835,0x059CC352, + 0x3FF73B64,0x5A1CAC08, 0x3FBE5723,0x0C6C4704, + 0x3FF73F7C,0xED916873, 0x3FBE160F,0x1634DE6D, + 0x3FF74395,0x810624DD, 0x3FBDD4F9,0x273A5D6D, + 0x3FF747AE,0x147AE148, 0x3FBD93E1,0x43C0B8BA, + 0x3FF74BC6,0xA7EF9DB2, 0x3FBD52C7,0x700C0617, + 0x3FF74FDF,0x3B645A1D, 0x3FBD11AB,0xB0607B8B, + 0x3FF753F7,0xCED91687, 0x3FBCD08E,0x09026F9C, + 0x3FF75810,0x624DD2F2, 0x3FBC8F6E,0x7E365886, + 0x3FF75C28,0xF5C28F5C, 0x3FBC4E4D,0x1440CC73, + 0x3FF76041,0x89374BC7, 0x3FBC0D29,0xCF6680B5, + 0x3FF7645A,0x1CAC0831, 0x3FBBCC04,0xB3EC49FD, + 0x3FF76872,0xB020C49C, 0x3FBB8ADD,0xC6171B93, + 0x3FF76C8B,0x43958106, 0x3FBB49B5,0x0A2C0790, + 0x3FF770A3,0xD70A3D71, 0x3FBB088A,0x84703E15, + 0x3FF774BC,0x6A7EF9DB, 0x3FBAC75E,0x39290D85, + 0x3FF778D4,0xFDF3B646, 0x3FBA8630,0x2C9BE1BB, + 0x3FF77CED,0x916872B0, 0x3FBA4500,0x630E4443, + 0x3FF78106,0x24DD2F1B, 0x3FBA03CE,0xE0C5DB95, + 0x3FF7851E,0xB851EB85, 0x3FB9C29B,0xAA086B4A, + 0x3FF78937,0x4BC6A7F0, 0x3FB98166,0xC31BD354, + 0x3FF78D4F,0xDF3B645A, 0x3FB94030,0x3046103B, + 0x3FF79168,0x72B020C5, 0x3FB8FEF7,0xF5CD3A50, + 0x3FF79581,0x0624DD2F, 0x3FB8BDBE,0x17F785E8, + 0x3FF79999,0x9999999A, 0x3FB87C82,0x9B0B4294, + 0x3FF79DB2,0x2D0E5604, 0x3FB83B45,0x834EDB58, + 0x3FF7A1CA,0xC083126F, 0x3FB7FA06,0xD508D5E6, + 0x3FF7A5E3,0x53F7CED9, 0x3FB7B8C6,0x947FD2D3, + 0x3FF7A9FB,0xE76C8B44, 0x3FB77784,0xC5FA8CD2, + 0x3FF7AE14,0x7AE147AE, 0x3FB73641,0x6DBFD8EA, + 0x3FF7B22D,0x0E560419, 0x3FB6F4FC,0x9016A5AF, + 0x3FF7B645,0xA1CAC083, 0x3FB6B3B6,0x3145FB7E, + 0x3FF7BA5E,0x353F7CEE, 0x3FB6726E,0x5594FBAD, + 0x3FF7BE76,0xC8B43958, 0x3FB63125,0x014AE0CB, + 0x3FF7C28F,0x5C28F5C3, 0x3FB5EFDA,0x38AEFDD5, + 0x3FF7C6A7,0xEF9DB22D, 0x3FB5AE8E,0x0008BE6E, + 0x3FF7CAC0,0x83126E98, 0x3FB56D40,0x5B9FA617, + 0x3FF7CED9,0x16872B02, 0x3FB52BF1,0x4FBB5069, + 0x3FF7D2F1,0xA9FBE76D, 0x3FB4EAA0,0xE0A3704C, + 0x3FF7D70A,0x3D70A3D7, 0x3FB4A94F,0x129FD030, + 0x3FF7DB22,0xD0E56042, 0x3FB467FB,0xE9F85141, + 0x3FF7DF3B,0x645A1CAC, 0x3FB426A7,0x6AF4EBA7, + 0x3FF7E353,0xF7CED917, 0x3FB3E551,0x99DDADB8, + 0x3FF7E76C,0x8B439581, 0x3FB3A3FA,0x7AFABC32, + 0x3FF7EB85,0x1EB851EC, 0x3FB362A2,0x12945172, + 0x3FF7EF9D,0xB22D0E56, 0x3FB32148,0x64F2BDAF, + 0x3FF7F3B6,0x45A1CAC1, 0x3FB2DFED,0x765E6631, + 0x3FF7F7CE,0xD916872B, 0x3FB29E91,0x4B1FC587, + 0x3FF7FBE7,0x6C8B4396, 0x3FB25D33,0xE77F6AC0, + 0x3FF80000,0x00000000, 0x3FB21BD5,0x4FC5F9A7, + 0x3FF80418,0x9374BC6A, 0x3FB1DA75,0x883C2A06, + 0x3FF80831,0x26E978D5, 0x3FB19914,0x952AC790, + 0x3FF80C49,0xBA5E353F, 0x3FB157B2,0x7ADAB1C9, + 0x3FF81062,0x4DD2F1AA, 0x3FB1164F,0x3D94DB50, + 0x3FF8147A,0xE147AE14, 0x3FB0D4EA,0xE1A24A14, + 0x3FF81893,0x74BC6A7F, 0x3FB09385,0x6B4C168F, + 0x3FF81CAC,0x083126E9, 0x3FB0521E,0xDEDB6BFC, + 0x3FF820C4,0x9BA5E354, 0x3FB010B7,0x4099878E, + 0x3FF824DD,0x2F1A9FBE, 0x3FAF9E9D,0x299F715A, + 0x3FF828F5,0xC28F5C29, 0x3FAF1BC9,0xBF8EC052, + 0x3FF82D0E,0x56041893, 0x3FAE98F4,0x4B93E0E9, + 0x3FF83126,0xE978D4FE, 0x3FAE161C,0xD641D9BA, + 0x3FF8353F,0x7CED9168, 0x3FAD9343,0x682BD381, + 0x3FF83958,0x10624DD3, 0x3FAD1068,0x09E51792, + 0x3FF83D70,0xA3D70A3D, 0x3FAC8D8A,0xC4011043, + 0x3FF84189,0x374BC6A8, 0x3FAC0AAB,0x9F134761, + 0x3FF845A1,0xCAC08312, 0x3FAB87CA,0xA3AF669C, + 0x3FF849BA,0x5E353F7D, 0x3FAB04E7,0xDA6935FA, + 0x3FF84DD2,0xF1A9FBE7, 0x3FAA8203,0x4BD49C47, + 0x3FF851EB,0x851EB852, 0x3FA9FF1D,0x00859D82, + 0x3FF85604,0x189374BC, 0x3FA97C35,0x01105B51, + 0x3FF85A1C,0xAC083127, 0x3FA8F94B,0x5609136F, + 0x3FF85E35,0x3F7CED91, 0x3FA87660,0x0804201D, + 0x3FF8624D,0xD2F1A9FC, 0x3FA7F373,0x1F95F690, + 0x3FF86666,0x66666666, 0x3FA77084,0xA5532764, + 0x3FF86A7E,0xF9DB22D1, 0x3FA6ED94,0xA1D05D09, + 0x3FF86E97,0x8D4FDF3B, 0x3FA66AA3,0x1DA25C37, + 0x3FF872B0,0x20C49BA6, 0x3FA5E7B0,0x215E025A, + 0x3FF876C8,0xB4395810, 0x3FA564BB,0xB5984603, + 0x3FF87AE1,0x47AE147B, 0x3FA4E1C5,0xE2E6355C, + 0x3FF87EF9,0xDB22D0E5, 0x3FA45ECE,0xB1DCF690, + 0x3FF88312,0x6E978D50, 0x3FA3DBD6,0x2B11C643, + 0x3FF8872B,0x020C49BA, 0x3FA358DC,0x5719F7FF, + 0x3FF88B43,0x95810625, 0x3FA2D5E1,0x3E8AF4A2, + 0x3FF88F5C,0x28F5C28F, 0x3FA252E4,0xE9FA3AD0, + 0x3FF89374,0xBC6A7EFA, 0x3FA1CFE7,0x61FD5D63, + 0x3FF8978D,0x4FDF3B64, 0x3FA14CE8,0xAF2A03DC, + 0x3FF89BA5,0xE353F7CF, 0x3FA0C9E8,0xDA15E8D0, + 0x3FF89FBE,0x76C8B439, 0x3FA046E7,0xEB56DA59, + 0x3FF8A3D7,0x0A3D70A4, 0x3F9F87CB,0xD7057113, + 0x3FF8A7EF,0x9DB22D0E, 0x3F9E81C5,0xC65EEBAE, + 0x3FF8AC08,0x3126E979, 0x3F9D7BBD,0xB5E62B1A, + 0x3FF8B020,0xC49BA5E3, 0x3F9C75B3,0xB6C7587B, + 0x3FF8B439,0x5810624E, 0x3F9B6FA7,0xDA2EBC5D, + 0x3FF8B851,0xEB851EB8, 0x3F9A699A,0x3148BF98, + 0x3FF8BC6A,0x7EF9DB23, 0x3F99638A,0xCD41E830, + 0x3FF8C083,0x126E978D, 0x3F985D79,0xBF46DA32, + 0x3FF8C49B,0xA5E353F8, 0x3F975767,0x18845494, + 0x3FF8C8B4,0x39581062, 0x3F965152,0xEA273219, + 0x3FF8CCCC,0xCCCCCCCD, 0x3F954B3D,0x455C662C, + 0x3FF8D0E5,0x60418937, 0x3F944526,0x3B50FDC3, + 0x3FF8D4FD,0xF3B645A2, 0x3F933F0D,0xDD321C3D, + 0x3FF8D916,0x872B020C, 0x3F9238F4,0x3C2CFC43, + 0x3FF8DD2F,0x1A9FBE77, 0x3F9132D9,0x696EECA7, + 0x3FF8E147,0xAE147AE1, 0x3F902CBD,0x76255144, + 0x3FF8E560,0x4189374C, 0x3F8E4D40,0xE6FB3FBC, + 0x3FF8E978,0xD4FDF3B6, 0x3F8C4104,0xE54AC206, + 0x3FF8ED91,0x6872B021, 0x3F8A34C7,0x099459CF, + 0x3FF8F1A9,0xFBE76C8B, 0x3F882887,0x76335895, + 0x3FF8F5C2,0x8F5C28F6, 0x3F861C46,0x4D832AA4, + 0x3FF8F9DB,0x22D0E560, 0x3F841003,0xB1DF58D9, + 0x3FF8FDF3,0xB645A1CB, 0x3F8203BF,0xC5A3825E, + 0x3FF9020C,0x49BA5E35, 0x3F7FEEF5,0x5656BCE0, + 0x3FF90624,0xDD2F1AA0, 0x3F7BD669,0x09A56C2F, + 0x3FF90A3D,0x70A3D70A, 0x3F77BDDA,0xE9EACBDB, + 0x3FF90E56,0x04189375, 0x3F73A54B,0x3BDEAFAE, + 0x3FF9126E,0x978D4FDF, 0x3F6F1974,0x8872131E, + 0x3FF91687,0x2B020C4A, 0x3F66E850,0x8F63B9FC, + 0x3FF91A9F,0xBE76C8B4, 0x3F5D6E56,0x2C050A4C, + 0x3FF91EB8,0x51EB851F, 0x3F4A1812,0x96FADBFB, + 0x3FF922D0,0xE5604189, 0xBF2AB223,0x7F755EA9, + 0x3FF926E9,0x78D4FDF4, 0xBF53B891,0xF35E8FB4, + 0x3FF92B02,0x0C49BA5E, 0xBF620D6F,0x15F8BEEA, + 0x3FF92F1A,0x9FBE76C9, 0xBF6A3E94,0x03636E0B, + 0x3FF93333,0x33333333, 0xBF7137DB,0x9C3F8A04, + 0x3FF9374B,0xC6A7EF9E, 0xBF75506C,0x15EDCA44, + 0x3FF93B64,0x5A1CAC08, 0xBF7968FB,0x2A047886, + 0x3FF93F7C,0xED916873, 0xBF7D8188,0x93CBB0FB, + 0x3FF94395,0x810624DD, 0xBF80CD0A,0x0745D3E2, + 0x3FF947AE,0x147AE148, 0xBF82D94E,0xAAC65ABB, + 0x3FF94BC6,0xA7EF9DB2, 0xBF84E592,0x120BA9C8, + 0x3FF94FDF,0x3B645A1D, 0xBF86F1D4,0x1ABA1487, + 0x3FF953F7,0xCED91687, 0xBF88FE14,0xA276036D, + 0x3FF95810,0x624DD2F2, 0xBF8B0A53,0x86E3FA29, + 0x3FF95C28,0xF5C28F5C, 0xBF8D1690,0xA5A895E7, + 0x3FF96041,0x89374BC7, 0xBF8F22CB,0xDC68938C, + 0x3FF9645A,0x1CAC0831, 0xBF909782,0x846466FD, + 0x3FF96872,0xB020C49C, 0xBF919D9E,0x04372227, + 0x3FF96C8B,0x43958106, 0xBF92A3B8,0x5C7F0C11, + 0x3FF970A3,0xD70A3D71, 0xBF93A9D1,0x7C0EC9E7, + 0x3FF974BC,0x6A7EF9DB, 0xBF94AFE9,0x51B91451, + 0x3FF978D4,0xFDF3B646, 0xBF95B5FF,0xCC50BA99, + 0x3FF97CED,0x916872B0, 0xBF96BC14,0xDAA8A1C7, + 0x3FF98106,0x24DD2F1B, 0xBF97C228,0x6B93C7C0, + 0x3FF9851E,0xB851EB85, 0xBF98C83A,0x6DE5426B, + 0x3FF98937,0x4BC6A7F0, 0xBF99CE4A,0xD07042CC, + 0x3FF98D4F,0xDF3B645A, 0xBF9AD459,0x82081429, + 0x3FF99168,0x72B020C5, 0xBF9BDA66,0x71801F27, + 0x3FF99581,0x0624DD2F, 0xBF9CE071,0x8DABE8E9, + 0x3FF99999,0x9999999A, 0xBF9DE67A,0xC55F1633, + 0x3FF9C28F,0x5C28F5C3, 0xBFA41130,0x0D5A577C, + 0x3FF9EB85,0x1EB851EC, 0xBFA92E9F,0x353A306B, + 0x3FFA147A,0xE147AE14, 0xBFAE4B69,0x54DF58F0, + 0x3FFA3D70,0xA3D70A3D, 0xBFB1B3B6,0x7589D014, + 0x3FFA6666,0x66666666, 0xBFB44144,0x3DDAF9D1, + 0x3FFA8F5C,0x28F5C28F, 0xBFB6CE4D,0x484AE8DE, + 0x3FFAB851,0xEB851EB8, 0xBFB95AC0,0xDD274A32, + 0x3FFAE147,0xAE147AE1, 0xBFBBE68E,0x489147C2, + 0x3FFB0A3D,0x70A3D70A, 0xBFBE71A4,0xDAEAFE97, + 0x3FFB3333,0x33333333, 0xBFC07DF9,0xF4A26C86, + 0x3FFB5C28,0xF5C28F5C, 0xBFC1C2B5,0x66E56530, + 0x3FFB851E,0xB851EB85, 0xBFC306FC,0x7418B465, + 0x3FFBAE14,0x7AE147AE, 0xBFC44AC6,0xCF1171A2, + 0x3FFBD70A,0x3D70A3D7, 0xBFC58E0C,0x2DD5E82E, + 0x3FFC0000,0x00000000, 0xBFC6D0C4,0x49D3E98A, + 0x3FFC28F5,0xC28F5C29, 0xBFC812E6,0xE017099D, + 0x3FFC51EB,0x851EB852, 0xBFC9546B,0xB17EC324, + 0x3FFC7AE1,0x47AE147B, 0xBFCA954A,0x82F48311, + 0x3FFCA3D7,0x0A3D70A4, 0xBFCBD57B,0x1DA19971, + 0x3FFCCCCC,0xCCCCCCCD, 0xBFCD14F5,0x4F250E7A, + 0x3FFCF5C2,0x8F5C28F6, 0xBFCE53B0,0xE9C95A58, + 0x3FFD1EB8,0x51EB851F, 0xBFCF91A5,0xC4B9FE6D, + 0x3FFD47AE,0x147AE148, 0xBFD06765,0xDE1C7F43, + 0x3FFD70A3,0xD70A3D71, 0xBFD1058D,0x58EA1C64, + 0x3FFD9999,0x9999999A, 0xBFD1A345,0x464D4D6E, + 0x3FFDC28F,0x5C28F5C3, 0xBFD24089,0x9CA89989, + 0x3FFDEB85,0x1EB851EC, 0xBFD2DD56,0x55540E05, + 0x3FFE147A,0xE147AE14, 0xBFD379A7,0x6CB7A0CC, + 0x3FFE3D70,0xA3D70A3D, 0xBFD41578,0xE2657ED4, + 0x3FFE6666,0x66666666, 0xBFD4B0C6,0xB93445AB, + 0x3FFE8F5C,0x28F5C28F, 0xBFD54B8C,0xF75927C0, + 0x3FFEB851,0xEB851EB8, 0xBFD5E5C7,0xA681FA89, + 0x3FFEE147,0xAE147AE1, 0xBFD67F72,0xD3EF2DE3, + 0x3FFF0A3D,0x70A3D70A, 0xBFD7188A,0x908DAC14, + 0x3FFF3333,0x33333333, 0xBFD7B10A,0xF110A1B0, + 0x3FFF5C28,0xF5C28F5C, 0xBFD848F0,0x0E0B2CC7, + 0x3FFF851E,0xB851EB85, 0xBFD8E036,0x0409F2A9, + 0x3FFFAE14,0x7AE147AE, 0xBFD976D8,0xF3AC9BA9, + 0x3FFFD70A,0x3D70A3D7, 0xBFDA0CD5,0x01BF3419, + 0x40000000,0x00000000, 0xBFDAA226,0x57537205, + 0x4000147A,0xE147AE14, 0xBFDB36C9,0x21D9DED1, + 0x400028F5,0xC28F5C29, 0xBFDBCAB9,0x933AE461, + 0x40003D70,0xA3D70A3D, 0xBFDC5DF3,0xE1EFBCA9, + 0x400051EB,0x851EB852, 0xBFDCF074,0x491B43C0, + 0x40006666,0x66666666, 0xBFDD8237,0x08A2AAED, + 0x40007AE1,0x47AE147B, 0xBFDE1338,0x65460CF2, + 0x40008F5C,0x28F5C28F, 0xBFDEA374,0xA8B8E21F, + 0x4000A3D7,0x0A3D70A4, 0xBFDF32E8,0x21BA545C, + 0x4000B851,0xEB851EB8, 0xBFDFC18F,0x242D71B0, + 0x4000CCCC,0xCCCCCCCD, 0xBFE027B3,0x04989ECA, + 0x4000E147,0xAE147AE1, 0xBFE06E34,0x979C4FBA, + 0x4000F5C2,0x8F5C28F6, 0xBFE0B44A,0x7D111769, + 0x40010A3D,0x70A3D70A, 0xBFE0F9F2,0xE9A7EDAB, + 0x40011EB8,0x51EB851F, 0xBFE13F2C,0x14DF389D, + 0x40013333,0x33333333, 0xBFE183F4,0x390E7C4A, + 0x400147AE,0x147AE148, 0xBFE1C849,0x9371F7D4, + 0x40015C28,0xF5C28F5C, 0xBFE20C2A,0x64362F76, + 0x400170A3,0xD70A3D71, 0xBFE24F94,0xEE836376, + 0x4001851E,0xB851EB85, 0xBFE29287,0x7888F359, + 0x40019999,0x9999999A, 0xBFE2D500,0x4B88AD70, + 0x4001AE14,0x7AE147AE, 0xBFE316FD,0xB3E20A13, + 0x4001C28F,0x5C28F5C3, 0xBFE3587E,0x011D529E, + 0x4001D70A,0x3D70A3D7, 0xBFE3997F,0x85F6B38B, + 0x4001EB85,0x1EB851EC, 0xBFE3DA00,0x986939C2, + 0x40020000,0x00000000, 0xBFE419FF,0x91B9BA6D, + 0x4002147A,0xE147AE14, 0xBFE4597A,0xCE81A573, + 0x400228F5,0xC28F5C29, 0xBFE49870,0xAEB9C1FF, + 0x40023D70,0xA3D70A3D, 0xBFE4D6DF,0x95C4D4E9, + 0x400251EB,0x851EB852, 0xBFE514C5,0xEA7A30E8, + 0x40026666,0x66666666, 0xBFE55222,0x17302FE1, + 0x40027AE1,0x47AE147B, 0xBFE58EF2,0x89C6958F, + 0x40028F5C,0x28F5C28F, 0xBFE5CB35,0xB3B0DAC2, + 0x4002A3D7,0x0A3D70A4, 0xBFE606EA,0x0A00615E, + 0x4002B851,0xEB851EB8, 0xBFE6420E,0x056E9079, + 0x4002CCCC,0xCCCCCCCD, 0xBFE67CA0,0x2266D8B1, + 0x4002E147,0xAE147AE1, 0xBFE6B69E,0xE110A01B, + 0x4002F5C2,0x8F5C28F6, 0xBFE6F008,0xC55915E8, + 0x40030A3D,0x70A3D70A, 0xBFE728DC,0x56FCED22, + 0x40031EB8,0x51EB851F, 0xBFE76118,0x2191FE9D, + 0x40033333,0x33333333, 0xBFE798BA,0xB490D185, + 0x400347AE,0x147AE148, 0xBFE7CFC2,0xA35E0A9E, + 0x40035C28,0xF5C28F5C, 0xBFE8062E,0x8553C1AA, + 0x400370A3,0xD70A3D71, 0xBFE83BFC,0xF5CABCFF, + 0x4003851E,0xB851EB85, 0xBFE8712C,0x942392CF, + 0x40039999,0x9999999A, 0xBFE8A5BC,0x03CFB027, + 0x4003AE14,0x7AE147AE, 0xBFE8D9A9,0xEC5A4526, + 0x4003C28F,0x5C28F5C3, 0xBFE90CF4,0xF9711676, + 0x4003D70A,0x3D70A3D7, 0xBFE93F9B,0xDAED338D, + 0x4003EB85,0x1EB851EC, 0xBFE9719D,0x44DB91B8, + 0x40040000,0x00000000, 0xBFE9A2F7,0xEF858B7D, + 0x4004147A,0xE147AE14, 0xBFE9D3AA,0x9779445D, + 0x400428F5,0xC28F5C29, 0xBFEA03B3,0xFD91F07C, + 0x40043D70,0xA3D70A3D, 0xBFEA3312,0xE7000028, + 0x400451EB,0x851EB852, 0xBFEA61C6,0x1D512F03, + 0x40046666,0x66666666, 0xBFEA8FCC,0x6E78767A, + 0x40047AE1,0x47AE147B, 0xBFEABD24,0xACD5E390, + 0x40048F5C,0x28F5C28F, 0xBFEAE9CD,0xAF3E4F7E, + 0x4004A3D7,0x0A3D70A4, 0xBFEB15C6,0x5102FB4D, + 0x4004B851,0xEB851EB8, 0xBFEB410D,0x71F90DDA, + 0x4004CCCC,0xCCCCCCCD, 0xBFEB6BA1,0xF680F470, + 0x4004E147,0xAE147AE1, 0xBFEB9582,0xC78DA573, + 0x4004F5C2,0x8F5C28F6, 0xBFEBBEAE,0xD2ABC535, + 0x40050A3D,0x70A3D70A, 0xBFEBE725,0x0A08AC8A, + 0x40051EB8,0x51EB851F, 0xBFEC0EE4,0x6479511D, + 0x40053333,0x33333333, 0xBFEC35EB,0xDD810F30, + 0x400547AE,0x147AE148, 0xBFEC5C3A,0x755854C7, + 0x40055C28,0xF5C28F5C, 0xBFEC81CF,0x30F32DDD, + 0x400570A3,0xD70A3D71, 0xBFECA6A9,0x1A07B1B0, + 0x4005851E,0xB851EB85, 0xBFECCAC7,0x3F1450C3, + 0x40059999,0x9999999A, 0xBFECEE28,0xB36603A6, + 0x4005AE14,0x7AE147AE, 0xBFED10CC,0x8F1E5A21, + 0x4005C28F,0x5C28F5C3, 0xBFED32B1,0xEF396AD0, + 0x4005D70A,0x3D70A3D7, 0xBFED53D7,0xF593A2D8, + 0x4005EB85,0x1EB851EC, 0xBFED743D,0xC8EF75BF, + 0x40060000,0x00000000, 0xBFED93E2,0x94FAED14, + 0x4006147A,0xE147AE14, 0xBFEDB2C5,0x8A5517E9, + 0x400628F5,0xC28F5C29, 0xBFEDD0E5,0xDE9359E3, + 0x40063D70,0xA3D70A3D, 0xBFEDEE42,0xCC4699C0, + 0x400651EB,0x851EB852, 0xBFEE0ADB,0x93004F43, + 0x40066666,0x66666666, 0xBFEE26AF,0x7757704A, + 0x40067AE1,0x47AE147B, 0xBFEE41BD,0xC2ED3D08, + 0x40068F5C,0x28F5C28F, 0xBFEE5C05,0xC471EB28, + 0x4006A3D7,0x0A3D70A4, 0xBFEE7586,0xCFA92FDE, + 0x4006B851,0xEB851EB8, 0xBFEE8E40,0x3D6EA89A, + 0x4006CCCC,0xCCCCCCCD, 0xBFEEA631,0x6BBA2275, + 0x4006E147,0xAE147AE1, 0xBFEEBD59,0xBDA3C008, + 0x4006F5C2,0x8F5C28F6, 0xBFEED3B8,0x9B67FDC1, + 0x40070A3D,0x70A3D70A, 0xBFEEE94D,0x726B946E, + 0x40071EB8,0x51EB851F, 0xBFEEFE17,0xB53F3A13, + 0x40073333,0x33333333, 0xBFEF1216,0xDBA340C9, + 0x400747AE,0x147AE148, 0xBFEF254A,0x628B13AA, + 0x40075C28,0xF5C28F5C, 0xBFEF37B1,0xCC2091A6, + 0x400770A3,0xD70A3D71, 0xBFEF494C,0x9FC74636, + 0x4007851E,0xB851EB85, 0xBFEF5A1A,0x6A1F7FBC, + 0x40079999,0x9999999A, 0xBFEF6A1A,0xBD0943B2, + 0x4007AE14,0x7AE147AE, 0xBFEF794D,0x2FA7204B, + 0x4007C28F,0x5C28F5C3, 0xBFEF87B1,0x5E60DBC2, + 0x4007D70A,0x3D70A3D7, 0xBFEF9546,0xEAE600FE, + 0x4007EB85,0x1EB851EC, 0xBFEFA20D,0x7C3049B5, + 0x40080000,0x00000000, 0xBFEFAE04,0xBE85E5D2, + 0x4008147A,0xE147AE14, 0xBFEFB92C,0x637BA02C, + 0x400828F5,0xC28F5C29, 0xBFEFC384,0x21F6E06F, + 0x40083D70,0xA3D70A3D, 0xBFEFCD0B,0xB62F8A36, + 0x400851EB,0x851EB852, 0xBFEFD5C2,0xE1B1B93F, + 0x40086666,0x66666666, 0xBFEFDDA9,0x6B5F5AB4, + 0x40087AE1,0x47AE147B, 0xBFEFE4BF,0x1F71A380, + 0x40088F5C,0x28F5C28F, 0xBFEFEB03,0xCF7A639D, + 0x4008A3D7,0x0A3D70A4, 0xBFEFF077,0x52653661, + 0x4008B851,0xEB851EB8, 0xBFEFF519,0x84788FB0, + 0x4008CCCC,0xCCCCCCCD, 0xBFEFF8EA,0x4756A624, + 0x4008E147,0xAE147AE1, 0xBFEFFBE9,0x81FE3A05, + 0x4008F5C2,0x8F5C28F6, 0xBFEFFE17,0x20CB3931, + 0x40090A3D,0x70A3D70A, 0xBFEFFF73,0x15773FCE, + 0x40091EB8,0x51EB851F, 0xBFEFFFFD,0x5719F5D7, + 0x40093333,0x33333333, 0xBFEFFFB5,0xE2294982, + 0x400947AE,0x147AE148, 0xBFEFFE9C,0xB879866A, + 0x40095C28,0xF5C28F5C, 0xBFEFFCB1,0xE13D499A, + 0x400970A3,0xD70A3D71, 0xBFEFF9F5,0x6905525B, + 0x4009851E,0xB851EB85, 0xBFEFF667,0x61C02FDD, + 0x40099999,0x9999999A, 0xBFEFF207,0xE2B9CBB6, + 0x4009AE14,0x7AE147AE, 0xBFEFECD7,0x089AD12E, + 0x4009C28F,0x5C28F5C3, 0xBFEFE6D4,0xF567F175, + 0x4009D70A,0x3D70A3D7, 0xBFEFE001,0xD08104AF, + 0x4009EB85,0x1EB851EC, 0xBFEFD85D,0xC6A007E8, + 0x400A0000,0x00000000, 0xBFEFCFE9,0x09D7F7F8, + 0x400A147A,0xE147AE14, 0xBFEFC6A3,0xD1938959, + 0x400A28F5,0xC28F5C29, 0xBFEFBC8E,0x5A93BCF9, + 0x400A3D70,0xA3D70A3D, 0xBFEFB1A8,0xE6EE5214, + 0x400A51EB,0x851EB852, 0xBFEFA5F3,0xBE0C1519, + 0x400A6666,0x66666666, 0xBFEF996F,0x2CA70BB6, + 0x400A7AE1,0x47AE147B, 0xBFEF8C1B,0x84C87DF9, + 0x400A8F5C,0x28F5C28F, 0xBFEF7DF9,0x1DC6DCB6, + 0x400AA3D7,0x0A3D70A4, 0xBFEF6F08,0x54438527, + 0x400AB851,0xEB851EB8, 0xBFEF5F49,0x8A2861DA, + 0x400ACCCC,0xCCCCCCCD, 0xBFEF4EBD,0x26A56907, + 0x400AE147,0xAE147AE1, 0xBFEF3D63,0x962DF84F, + 0x400AF5C2,0x8F5C28F6, 0xBFEF2B3D,0x4A760DFE, + 0x400B0A3D,0x70A3D70A, 0xBFEF184A,0xBA6F5FEA, + 0x400B1EB8,0x51EB851F, 0xBFEF048C,0x62464FE5, + 0x400B3333,0x33333333, 0xBFEEF002,0xC35EBE04, + 0x400B47AE,0x147AE148, 0xBFEEDAAE,0x6450B89B, + 0x400B5C28,0xF5C28F5C, 0xBFEEC48F,0xD0E50A38, + 0x400B70A3,0xD70A3D71, 0xBFEEADA7,0x9A11A585, + 0x400B851E,0xB851EB85, 0xBFEE95F6,0x55F5EF4B, + 0x400B9999,0x9999999A, 0xBFEE7D7C,0x9FD6E698, + 0x400BAE14,0x7AE147AE, 0xBFEE643B,0x181B2B33, + 0x400BC28F,0x5C28F5C3, 0xBFEE4A32,0x6446E264, + 0x400BD70A,0x3D70A3D7, 0xBFEE2F63,0x2EF77A47, + 0x400BEB85,0x1EB851EC, 0xBFEE13CE,0x27DF4B9A, + 0x400C0000,0x00000000, 0xBFEDF774,0x03C11A5F, + 0x400C147A,0xE147AE14, 0xBFEDDA55,0x7C6B752D, + 0x400C28F5,0xC28F5C29, 0xBFEDBC73,0x50B3F388, + 0x400C3D70,0xA3D70A3D, 0xBFED9DCE,0x44725339, + 0x400C51EB,0x851EB852, 0xBFED7E67,0x207B74D8, + 0x400C6666,0x66666666, 0xBFED5E3E,0xB29C37A4, + 0x400C7AE1,0x47AE147B, 0xBFED3D55,0xCD9434C8, + 0x400C8F5C,0x28F5C28F, 0xBFED1BAD,0x49105A38, + 0x400CA3D7,0x0A3D70A4, 0xBFECF946,0x01A5653C, + 0x400CB851,0xEB851EB8, 0xBFECD620,0xD8CA3CE2, + 0x400CCCCC,0xCCCCCCCD, 0xBFECB23E,0xB4D22C59, + 0x400CE147,0xAE147AE1, 0xBFEC8DA0,0x80E6FD8F, + 0x400CF5C2,0x8F5C28F6, 0xBFEC6847,0x2D02F3F8, + 0x400D0A3D,0x70A3D70A, 0xBFEC4233,0xADEAA7EE, + 0x400D1EB8,0x51EB851F, 0xBFEC1B66,0xFD26C281, + 0x400D3333,0x33333333, 0xBFEBF3E2,0x18FD9A38, + 0x400D47AE,0x147AE148, 0xBFEBCBA6,0x046CB098, + 0x400D5C28,0xF5C28F5C, 0xBFEBA2B3,0xC72210E8, + 0x400D70A3,0xD70A3D71, 0xBFEB790C,0x6D759014, + 0x400D851E,0xB851EB85, 0xBFEB4EB1,0x0861EE25, + 0x400D9999,0x9999999A, 0xBFEB23A2,0xAD7DD937, + 0x400DAE14,0x7AE147AE, 0xBFEAF7E2,0x76F4D258, + 0x400DC28F,0x5C28F5C3, 0xBFEACB71,0x837FF43F, + 0x400DD70A,0x3D70A3D7, 0xBFEA9E50,0xF65E9C50, + 0x400DEB85,0x1EB851EC, 0xBFEA7081,0xF74EF5D9, + 0x400E0000,0x00000000, 0xBFEA4205,0xB28667F7, + 0x400E147A,0xE147AE14, 0xBFEA12DD,0x58A9E618, + 0x400E28F5,0xC28F5C29, 0xBFE9E30A,0x1EC62384, + 0x400E3D70,0xA3D70A3D, 0xBFE9B28D,0x3E47AA03, + 0x400E51EB,0x851EB852, 0xBFE98167,0xF4F2D3C3, + 0x400E6666,0x66666666, 0xBFE94F9B,0x84DBA8EB, + 0x400E7AE1,0x47AE147B, 0xBFE91D29,0x345DA0C8, + 0x400E8F5C,0x28F5C28F, 0xBFE8EA12,0x4E134713, + 0x400EA3D7,0x0A3D70A4, 0xBFE8B658,0x20CDC53C, + 0x400EB851,0xEB851EB8, 0xBFE881FB,0xFF8C5044, + 0x400ECCCC,0xCCCCCCCD, 0xBFE84CFF,0x41737B03, + 0x400EE147,0xAE147AE1, 0xBFE81763,0x41C46D74, + 0x400EF5C2,0x8F5C28F6, 0xBFE7E129,0x5FD400DB, + 0x400F0A3D,0x70A3D70A, 0xBFE7AA52,0xFF01C167, + 0x400F1EB8,0x51EB851F, 0xBFE772E1,0x86AED527, + 0x400F3333,0x33333333, 0xBFE73AD6,0x6234C8EA, + 0x400F47AE,0x147AE148, 0xBFE70233,0x00DC42ED, + 0x400F5C28,0xF5C28F5C, 0xBFE6C8F8,0xD5D39BEF, + 0x400F70A3,0xD70A3D71, 0xBFE68F29,0x58255E91, + 0x400F851E,0xB851EB85, 0xBFE654C6,0x02AEAD8D, + 0x400F9999,0x9999999A, 0xBFE619D0,0x541590BD, + 0x400FAE14,0x7AE147AE, 0xBFE5DE49,0xCEBF2979, + 0x400FC28F,0x5C28F5C3, 0xBFE5A233,0xF8C5CE47, + 0x400FD70A,0x3D70A3D7, 0xBFE56590,0x5BEF0E57, + 0x400FEB85,0x1EB851EC, 0xBFE52860,0x85A19CDE, + 0x40100000,0x00000000, 0xBFE4EAA6,0x06DB24C1, + 0x40100A3D,0x70A3D70A, 0xBFE4AC62,0x7426049D, + 0x4010147A,0xE147AE14, 0xBFE46D97,0x658EF3A5, + 0x40101EB8,0x51EB851F, 0xBFE42E46,0x769A8F69, + 0x401028F5,0xC28F5C29, 0xBFE3EE71,0x463AD30E, + 0x40103333,0x33333333, 0xBFE3AE19,0x76C477C5, + 0x40103D70,0xA3D70A3D, 0xBFE36D40,0xADE43F5E, + 0x401047AE,0x147AE148, 0xBFE32BE8,0x949428BF, + 0x401051EB,0x851EB852, 0xBFE2EA12,0xD7108EE5, + 0x40105C28,0xF5C28F5C, 0xBFE2A7C1,0x24CD3249, + 0x40106666,0x66666666, 0xBFE264F5,0x306A2D6A, + 0x401070A3,0xD70A3D71, 0xBFE221B0,0xAFA8D471, + 0x40107AE1,0x47AE147B, 0xBFE1DDF5,0x5B60806A, + 0x4010851E,0xB851EB85, 0xBFE199C4,0xEF734612, + 0x40108F5C,0x28F5C28F, 0xBFE15521,0x2AC298E8, + 0x40109999,0x9999999A, 0xBFE1100B,0xCF23DA7C, + 0x4010A3D7,0x0A3D70A4, 0xBFE0CA86,0xA154D68B, + 0x4010AE14,0x7AE147AE, 0xBFE08493,0x68F02BC1, + 0x4010B851,0xEB851EB8, 0xBFE03E33,0xF061A208, + 0x4010C28F,0x5C28F5C3, 0xBFDFEED4,0x09B4DC5B, + 0x4010CCCC,0xCCCCCCCD, 0xBFDF606E,0xEC8AC71D, + 0x4010D70A,0x3D70A3D7, 0xBFDED13C,0x2E762740, + 0x4010E147,0xAE147AE1, 0xBFDE413F,0x79EBB85C, + 0x4010EB85,0x1EB851EC, 0xBFDDB07C,0x7E8BC86A, + 0x4010F5C2,0x8F5C28F6, 0xBFDD1EF6,0xF10A0FDD, + 0x40110000,0x00000000, 0xBFDC8CB2,0x8B1567F5, + 0x40110A3D,0x70A3D70A, 0xBFDBF9B3,0x0B3F60F2, + 0x4011147A,0xE147AE14, 0xBFDB65FC,0x34E3B807, + 0x40111EB8,0x51EB851F, 0xBFDAD191,0xD00FADDB, + 0x401128F5,0xC28F5C29, 0xBFDA3C77,0xA9693E9A, + 0x40113333,0x33333333, 0xBFD9A6B1,0x92163B53, + 0x40113D70,0xA3D70A3D, 0xBFD91043,0x5FA34669, + 0x401147AE,0x147AE148, 0xBFD87930,0xEBEAB2D4, + 0x401151EB,0x851EB852, 0xBFD7E17E,0x14FB478A, + 0x40115C28,0xF5C28F5C, 0xBFD7492E,0xBCFEE6BF, + 0x40116666,0x66666666, 0xBFD6B046,0xCA211AD8, + 0x401170A3,0xD70A3D71, 0xBFD616CA,0x267588BE, + 0x40117AE1,0x47AE147B, 0xBFD57CBC,0xBFDE48F2, + 0x4011851E,0xB851EB85, 0xBFD4E222,0x87F22719, + 0x40118F5C,0x28F5C28F, 0xBFD446FF,0x73E2C9D7, + 0x40119999,0x9999999A, 0xBFD3AB57,0x7C62C2AA, + 0x4011A3D7,0x0A3D70A4, 0xBFD30F2E,0x9D8B8730, + 0x4011AE14,0x7AE147AE, 0xBFD27288,0xD6C35386, + 0x4011B851,0xEB851EB8, 0xBFD1D56A,0x2AA2F7A3, + 0x4011C28F,0x5C28F5C3, 0xBFD137D6,0x9EDB8F5A, + 0x4011CCCC,0xCCCCCCCD, 0xBFD099D2,0x3C1C267C, + 0x4011D70A,0x3D70A3D7, 0xBFCFF6C2,0x1BEE9175, + 0x4011E147,0xAE147AE1, 0xBFCEB90E,0x4590FE71, + 0x4011EB85,0x1EB851EC, 0xBFCD7A91,0x17337707, + 0x4011F5C2,0x8F5C28F6, 0xBFCC3B52,0xB811629D, + 0x40120000,0x00000000, 0xBFCAFB5B,0x54583D6A, + 0x40120A3D,0x70A3D70A, 0xBFC9BAB3,0x1CF209C1, + 0x4012147A,0xE147AE14, 0xBFC87962,0x474FA1B8, + 0x40121EB8,0x51EB851F, 0xBFC73771,0x0D32EB2A, + 0x401228F5,0xC28F5C29, 0xBFC5F4E7,0xAC78F004, + 0x40123333,0x33333333, 0xBFC4B1CE,0x66E3DA72, + 0x40123D70,0xA3D70A3D, 0xBFC36E2D,0x81E4D8C1, + 0x401247AE,0x147AE148, 0xBFC22A0D,0x4665E862, + 0x401251EB,0x851EB852, 0xBFC0E576,0x00938AE2, + 0x40125C28,0xF5C28F5C, 0xBFBF40DF,0xFF4CC8A1, + 0x40126666,0x66666666, 0xBFBCB607,0x2B598DCA, + 0x401270A3,0xD70A3D71, 0xBFBA2A72,0x2EA856AE, + 0x40127AE1,0x47AE147B, 0xBFB79E31,0xB7653184, + 0x4012851E,0xB851EB85, 0xBFB51156,0x781FF707, + 0x40128F5C,0x28F5C28F, 0xBFB283F1,0x275EDDF2, + 0x40129999,0x9999999A, 0xBFAFEC24,0xFE61E5F2, + 0x4012A3D7,0x0A3D70A4, 0xBFAACF96,0x7980F640, + 0x4012AE14,0x7AE147AE, 0xBFA5B258,0x3FCA7E71, + 0x4012B851,0xEB851EB8, 0xBFA0948B,0xD56D9095, + 0x4012C28F,0x5C28F5C3, 0xBF96ECA5,0x847A2F19, + 0x4012CCCC,0xCCCCCCCD, 0xBF895F3A,0x43506A34, + 0x4012D70A,0x3D70A3D7, 0xBF63920C,0xDB9E96D1, + 0x4012E147,0xAE147AE1, 0x3F7F2CA7,0xCBCDF569, + 0x4012EB85,0x1EB851EC, 0x3F920862,0x6DF53129, + 0x4012F5C2,0x8F5C28F6, 0x3F9C4524,0xBB47756D, + 0x40130000,0x00000000, 0x3FA34096,0xE1D37B74, + 0x40130A3D,0x70A3D70A, 0x3FA85E1D,0x3A474690, + 0x4013147A,0xE147AE14, 0x3FAD7B03,0xE0F76592, + 0x40131EB8,0x51EB851F, 0x3FB14B94,0xA9F95981, + 0x401328F5,0xC28F5C29, 0x3FB3D936,0x0B1D182D, + 0x40133333,0x33333333, 0x3FB66655,0x584E4040, + 0x40133D70,0xA3D70A3D, 0x3FB8F2E1,0xD9489BA6, + 0x401347AE,0x147AE148, 0x3FBB7ECA,0xD98A0030, + 0x401351EB,0x851EB852, 0x3FBE09FF,0xA8BFC8DD, + 0x40135C28,0xF5C28F5C, 0x3FC04A37,0xCD9A1B1B, + 0x40136666,0x66666666, 0x3FC18F05,0x051DD6F7, + 0x401370A3,0xD70A3D71, 0x3FC2D35F,0x2A50ED81, + 0x40137AE1,0x47AE147B, 0x3FC4173D,0xEF8B5440, + 0x4013851E,0xB851EB85, 0x3FC55A99,0x0A4D8C16, + 0x40138F5C,0x28F5C28F, 0x3FC69D68,0x3376F6A7, + 0x40139999,0x9999999A, 0x3FC7DFA3,0x277C1664, + 0x4013A3D7,0x0A3D70A4, 0x3FC92141,0xA69CB65C, + 0x4013AE14,0x7AE147AE, 0x3FCA623B,0x7519FA71, + 0x4013B851,0xEB851EB8, 0x3FCBA288,0x5B6C540E, + 0x4013C28F,0x5C28F5C3, 0x3FCCE220,0x26795BF7, + 0x4013CCCC,0xCCCCCCCD, 0x3FCE20FA,0xA7C98E60, + 0x4013D70A,0x3D70A3D7, 0x3FCF5F0F,0xB5BDE9D5, + 0x4013E147,0xAE147AE1, 0x3FD04E2B,0x95E2B697, + 0x4013EB85,0x1EB851EC, 0x3FD0EC64,0x75493A8B, + 0x4013F5C2,0x8F5C28F6, 0x3FD18A2E,0x6C27FB2F, + 0x40140000,0x00000000, 0x3FD22785,0x706B4AD9, + 0x40140A3D,0x70A3D70A, 0x3FD2C465,0x7AF0CC69, + 0x4014147A,0xE147AE14, 0x3FD360CA,0x87A1D8F0, + 0x40141EB8,0x51EB851F, 0x3FD3FCB0,0x958DD15E, + 0x401428F5,0xC28F5C29, 0x3FD49813,0xA7045B45, + 0x40143333,0x33333333, 0x3FD532EF,0xC1AF88E2, + 0x40143D70,0xA3D70A3D, 0x3FD5CD40,0xEEADEA96, + 0x401447AE,0x147AE148, 0x3FD66703,0x3AAC8A13, + 0x401451EB,0x851EB852, 0x3FD70032,0xB600CDE7, + 0x40145C28,0xF5C28F5C, 0x3FD798CB,0x74C24599, + 0x40146666,0x66666666, 0x3FD830C9,0x8EE45C9C, + 0x401470A3,0xD70A3D71, 0x3FD8C829,0x204FF446, + 0x40147AE1,0x47AE147B, 0x3FD95EE6,0x48FCE382, + 0x4014851E,0xB851EB85, 0x3FD9F4FD,0x2D0B5C7E, + 0x40148F5C,0x28F5C28F, 0x3FDA8A69,0xF4DD3682, + 0x40149999,0x9999999A, 0x3FDB1F28,0xCD2F1C3E, + 0x4014A3D7,0x0A3D70A4, 0x3FDBB335,0xE7319D34, + 0x4014AE14,0x7AE147AE, 0x3FDC468D,0x78A22286, + 0x4014B851,0xEB851EB8, 0x3FDCD92B,0xBBE3C55E, + 0x4014C28F,0x5C28F5C3, 0x3FDD6B0C,0xF0180743, + 0x4014CCCC,0xCCCCCCCD, 0x3FDDFC2D,0x59376AEE, + 0x4014D70A,0x3D70A3D7, 0x3FDE8C89,0x4029EE0C, + 0x4014E147,0xAE147AE1, 0x3FDF1C1C,0xF2DF6206, + 0x4014EB85,0x1EB851EC, 0x3FDFAAE4,0xC467A434, + 0x4014F5C2,0x8F5C28F6, 0x3FE01C6E,0x86855A0E, + 0x40150000,0x00000000, 0x3FE06301,0x15305409, + 0x40150A3D,0x70A3D70A, 0x3FE0A928,0x3FB4BF36, + 0x4015147A,0xE147AE14, 0x3FE0EEE2,0x3A5265D1, + 0x40151EB8,0x51EB851F, 0x3FE1342D,0x3C14A22B, + 0x401528F5,0xC28F5C29, 0x3FE17907,0x7EDE1139, + 0x40153333,0x33333333, 0x3FE1BD6F,0x3F7432D5, + 0x40153D70,0xA3D70A3D, 0x3FE20162,0xBD8AF6C1, + 0x401547AE,0x147AE148, 0x3FE244E0,0x3BD036A5, + 0x401551EB,0x851EB852, 0x3FE287E5,0xFFF71C68, + 0x40155C28,0xF5C28F5C, 0x3FE2CA72,0x52C374F4, + 0x40156666,0x66666666, 0x3FE30C83,0x8014EEAA, + 0x401570A3,0xD70A3D71, 0x3FE34E17,0xD6F2439C, + 0x40157AE1,0x47AE147B, 0x3FE38F2D,0xA9944EF5, + 0x4015851E,0xB851EB85, 0x3FE3CFC3,0x4D710DB3, + 0x40158F5C,0x28F5C28F, 0x3FE40FD7,0x1B4689E5, + 0x40159999,0x9999999A, 0x3FE44F67,0x6F25B08C, + 0x4015A3D7,0x0A3D70A4, 0x3FE48E72,0xA87D1193, + 0x4015AE14,0x7AE147AE, 0x3FE4CCF7,0x2A2389F3, + 0x4015B851,0xEB851EB8, 0x3FE50AF3,0x5A62D745, + 0x4015C28F,0x5C28F5C3, 0x3FE54865,0xA30214DE, + 0x4015CCCC,0xCCCCCCCD, 0x3FE5854C,0x715021EB, + 0x4015D70A,0x3D70A3D7, 0x3FE5C1A6,0x362DF0A2, + 0x4015E147,0xAE147AE1, 0x3FE5FD71,0x6618BDD6, + 0x4015EB85,0x1EB851EC, 0x3FE638AC,0x793430FE, + 0x4015F5C2,0x8F5C28F6, 0x3FE67355,0xEB546437, + 0x40160000,0x00000000, 0x3FE6AD6C,0x3C07D448, + 0x40160A3D,0x70A3D70A, 0x3FE6E6ED,0xEEA13805, + 0x4016147A,0xE147AE14, 0x3FE71FD9,0x8A413F1C, + 0x40161EB8,0x51EB851F, 0x3FE7582D,0x99E037F6, + 0x401628F5,0xC28F5C29, 0x3FE78FE8,0xAC579C4B, + 0x40163333,0x33333333, 0x3FE7C709,0x546B8482, + 0x40163D70,0xA3D70A3D, 0x3FE7FD8E,0x28D4012C, + 0x401647AE,0x147AE148, 0x3FE83375,0xC4465AC2, + 0x401651EB,0x851EB852, 0x3FE868BE,0xC57E370F, + 0x40165C28,0xF5C28F5C, 0x3FE89D67,0xCF46A47B, + 0x40166666,0x66666666, 0x3FE8D16F,0x88830A7F, + 0x401670A3,0xD70A3D71, 0x3FE904D4,0x9C37FF65, + 0x40167AE1,0x47AE147B, 0x3FE93795,0xB99402DA, + 0x4016851E,0xB851EB85, 0x3FE969B1,0x93F81D60, + 0x40168F5C,0x28F5C28F, 0x3FE99B26,0xE300641A, + 0x40169999,0x9999999A, 0x3FE9CBF4,0x628C60F3, + 0x4016A3D7,0x0A3D70A4, 0x3FE9FC18,0xD2C75EB5, + 0x4016AE14,0x7AE147AE, 0x3FEA2B92,0xF8309930, + 0x4016B851,0xEB851EB8, 0x3FEA5A61,0x9BA350D2, + 0x4016C28F,0x5C28F5C3, 0x3FEA8883,0x8A5EC1C3, + 0x4016CCCC,0xCCCCCCCD, 0x3FEAB5F7,0x960DFE2A, + 0x4016D70A,0x3D70A3D7, 0x3FEAE2BC,0x94CFAB9D, + 0x4016E147,0xAE147AE1, 0x3FEB0ED1,0x613DA33D, + 0x4016EB85,0x1EB851EC, 0x3FEB3A34,0xDA74748B, + 0x4016F5C2,0x8F5C28F6, 0x3FEB64E5,0xE41ACA96, + 0x40170000,0x00000000, 0x3FEB8EE3,0x6668B394, + 0x40170A3D,0x70A3D70A, 0x3FEBB82C,0x4E2ECA5E, + 0x4017147A,0xE147AE14, 0x3FEBE0BF,0x8CDD41E4, + 0x40171EB8,0x51EB851F, 0x3FEC089C,0x188AD258, + 0x401728F5,0xC28F5C29, 0x3FEC2FC0,0xEBFB87C3, + 0x40173333,0x33333333, 0x3FEC562D,0x06A77223, + 0x40173D70,0xA3D70A3D, 0x3FEC7BDF,0x6CC13689, + 0x401747AE,0x147AE148, 0x3FECA0D7,0x273C8152, + 0x401751EB,0x851EB852, 0x3FECC513,0x43D45928, + 0x40175C28,0xF5C28F5C, 0x3FECE892,0xD51152CB, + 0x40176666,0x66666666, 0x3FED0B54,0xF24FA546, + 0x401770A3,0xD70A3D71, 0x3FED2D58,0xB7C51E91, + 0x40177AE1,0x47AE147B, 0x3FED4E9D,0x4686F85A, + 0x4017851E,0xB851EB85, 0x3FED6F21,0xC48F8CFE, + 0x40178F5C,0x28F5C28F, 0x3FED8EE5,0x5CC3EC4D, + 0x40179999,0x9999999A, 0x3FEDADE7,0x3EF95029, + 0x4017A3D7,0x0A3D70A4, 0x3FEDCC26,0x9FFA70B4, + 0x4017AE14,0x7AE147AE, 0x3FEDE9A2,0xB98CB822, + 0x4017B851,0xEB851EB8, 0x3FEE065A,0xCA7555BF, + 0x4017C28F,0x5C28F5C3, 0x3FEE224E,0x167E3056, + 0x4017CCCC,0xCCCCCCCD, 0x3FEE3D7B,0xE67AB792, + 0x4017D70A,0x3D70A3D7, 0x3FEE57E3,0x884C9480, + 0x4017E147,0xAE147AE1, 0x3FEE7184,0x4EE838D6, + 0x4017EB85,0x1EB851EC, 0x3FEE8A5D,0x92594D06, + 0x4017F5C2,0x8F5C28F6, 0x3FEEA26E,0xAFC6FCE5, + 0x40180000,0x00000000, 0x3FEEB9B7,0x097822F5, + 0x40180A3D,0x70A3D70A, 0x3FEED036,0x06D75201, + 0x4018147A,0xE147AE14, 0x3FEEE5EB,0x1476BD14, + 0x40181EB8,0x51EB851F, 0x3FEEFAD5,0xA413FDAC, + 0x401828F5,0xC28F5C29, 0x3FEF0EF5,0x2C9BB7FF, + 0x40183333,0x33333333, 0x3FEF2249,0x2A2D1D5A, + 0x40183D70,0xA3D70A3D, 0x3FEF34D1,0x1E1D4C62, + 0x401847AE,0x147AE148, 0x3FEF468C,0x8EFA8F33, + 0x401851EB,0x851EB852, 0x3FEF577B,0x088F773D, + 0x40185C28,0xF5C28F5C, 0x3FEF679C,0x1BE5D6E7, + 0x40186666,0x66666666, 0x3FEF76EF,0x5F4998B2, + 0x401870A3,0xD70A3D71, 0x3FEF8574,0x6E4B7400, + 0x40187AE1,0x47AE147B, 0x3FEF932A,0xE9C37F3B, + 0x4018851E,0xB851EB85, 0x3FEFA012,0x77D39F7D, + 0x40188F5C,0x28F5C28F, 0x3FEFAC2A,0xC3E9D57F, + 0x40189999,0x9999999A, 0x3FEFB773,0x7EC267D5, + 0x4018A3D7,0x0A3D70A4, 0x3FEFC1EC,0x5E69EA60, + 0x4018AE14,0x7AE147AE, 0x3FEFCB95,0x1E3F22FC, + 0x4018B851,0xEB851EB8, 0x3FEFD46D,0x7EF4CB3D, + 0x4018C28F,0x5C28F5C3, 0x3FEFDC75,0x46932F4E, + 0x4018CCCC,0xCCCCCCCD, 0x3FEFE3AC,0x4079A9CE, + 0x4018D70A,0x3D70A3D7, 0x3FEFEA12,0x3D5FFCBF, + 0x4018E147,0xAE147AE1, 0x3FEFEFA7,0x1357875E, + 0x4018EB85,0x1EB851EC, 0x3FEFF46A,0x9DCC58F2, + 0x4018F5C2,0x8F5C28F6, 0x3FEFF85C,0xBD862083, + 0x40190000,0x00000000, 0x3FEFFB7D,0x58A8F975, + 0x40190A3D,0x70A3D70A, 0x3FEFFDCC,0x5AB614FE, + 0x4019147A,0xE147AE14, 0x3FEFFF49,0xB48C407A, + 0x40191EB8,0x51EB851F, 0x3FEFFFF5,0x5C68488E, + 0x401928F5,0xC28F5C29, 0x3FEFFFCF,0x4DE53926, + 0x40193333,0x33333333, 0x3FEFFED7,0x89FC7A41, + }; + +LOCAL_D const TUint32 TanTest[] = + { + 0x00000000,0x00000000, 0x00000000,0x00000000, + 0x3F50624D,0xD2F1A9FC, 0x3F50624E,0x2E91EBE4, + 0x3F60624D,0xD2F1A9FC, 0x3F60624F,0x4172CE6E, + 0x3F689374,0xBC6A7EFA, 0x3F689379,0x915EFC1B, + 0x3F70624D,0xD2F1A9FC, 0x3F706253,0x8CF808EE, + 0x3F747AE1,0x47AE147B, 0x3F747AEC,0x77052979, + 0x3F789374,0xBC6A7EFA, 0x3F789388,0x104A218C, + 0x3F7CAC08,0x3126E979, 0x3F7CAC26,0xE23B9B56, + 0x3F80624D,0xD2F1A9FC, 0x3F806264,0xBB27F8B4, + 0x3F826E97,0x8D4FDF3B, 0x3F826EB8,0x2AFFBB68, + 0x3F847AE1,0x47AE147B, 0x3F847B0E,0x05625F97, + 0x3F86872B,0x020C49BA, 0x3F868766,0x8F0E7362, + 0x3F889374,0xBC6A7EFA, 0x3F8893C2,0x0CC3ED54, + 0x3F8A9FBE,0x76C8B439, 0x3F8AA020,0xC3445068, + 0x3F8CAC08,0x3126E979, 0x3F8CAC82,0xF752D022, + 0x3F8EB851,0xEB851EB8, 0x3F8EB8E8,0xEDB4749D, + 0x3F90624D,0xD2F1A9FC, 0x3F9062A9,0x75981F52, + 0x3F916872,0xB020C49C, 0x3F9168E0,0x9A47A5E6, + 0x3F926E97,0x8D4FDF3B, 0x3F926F1A,0x074E7D43, + 0x3F9374BC,0x6A7EF9DB, 0x3F937555,0xDF138724, + 0x3F947AE1,0x47AE147B, 0x3F947B94,0x43FEE9CF, + 0x3F958106,0x24DD2F1B, 0x3F9581D5,0x587A222E, + 0x3F96872B,0x020C49BA, 0x3F968819,0x3EF015D9, + 0x3F978D4F,0xDF3B645A, 0x3F978E60,0x19CD2533, + 0x3F989374,0xBC6A7EFA, 0x3F9894AA,0x0B7F3D7A, + 0x3F999999,0x9999999A, 0x3F999AF7,0x3675EADF, + 0x3F9A9FBE,0x76C8B439, 0x3F9AA147,0xBD226AA2, + 0x3F9BA5E3,0x53F7CED9, 0x3F9BA79B,0xC1F7BD2C, + 0x3F9CAC08,0x3126E979, 0x3F9CADF3,0x676AB82B, + 0x3F9DB22D,0x0E560419, 0x3F9DB44E,0xCFF218B4, + 0x3F9EB851,0xEB851EB8, 0x3F9EBAAE,0x1E06955E, + 0x3F9FBE76,0xC8B43958, 0x3F9FC111,0x7422F073, + 0x3FA0624D,0xD2F1A9FC, 0x3FA063BC,0x7A620502, + 0x3FA0E560,0x4189374C, 0x3FA0E6F2,0x61347911, + 0x3FA16872,0xB020C49C, 0x3FA16A2A,0x7FC97D7E, + 0x3FA1EB85,0x1EB851EC, 0x3FA1ED64,0xE762E589, + 0x3FA26E97,0x8D4FDF3B, 0x3FA270A1,0xA943B7B3, + 0x3FA2F1A9,0xFBE76C8B, 0x3FA2F3E0,0xD6B036D7, + 0x3FA374BC,0x6A7EF9DB, 0x3FA37722,0x80EDEB43, + 0x3FA3F7CE,0xD916872B, 0x3FA3FA66,0xB943ABD4, + 0x3FA47AE1,0x47AE147B, 0x3FA47DAD,0x90F9A717, + 0x3FA4FDF3,0xB645A1CB, 0x3FA500F7,0x19596C62, + 0x3FA58106,0x24DD2F1B, 0x3FA58443,0x63ADF4FC, + 0x3FA60418,0x9374BC6A, 0x3FA60792,0x8143AD38, + 0x3FA6872B,0x020C49BA, 0x3FA68AE4,0x83687D9F, + 0x3FA70A3D,0x70A3D70A, 0x3FA70E39,0x7B6BD410, + 0x3FA78D4F,0xDF3B645A, 0x3FA79191,0x7A9EACEA, + 0x3FA81062,0x4DD2F1AA, 0x3FA814EC,0x92539C35, + 0x3FA89374,0xBC6A7EFA, 0x3FA8984A,0xD3DED6CC, + 0x3FA91687,0x2B020C4A, 0x3FA91BAC,0x50963B88, + 0x3FA99999,0x9999999A, 0x3FA99F11,0x19D15C71, + 0x3FAA1CAC,0x083126E9, 0x3FAA2279,0x40E987EC, + 0x3FAA9FBE,0x76C8B439, 0x3FAAA5E4,0xD739D1F0, + 0x3FAB22D0,0xE5604189, 0x3FAB2953,0xEE1F1D37, + 0x3FABA5E3,0x53F7CED9, 0x3FABACC6,0x96F82475, + 0x3FAC28F5,0xC28F5C29, 0x3FAC303C,0xE3258391, + 0x3FACAC08,0x3126E979, 0x3FACB3B6,0xE409C0E0, + 0x3FAD2F1A,0x9FBE76C9, 0x3FAD3734,0xAB09565F, + 0x3FADB22D,0x0E560419, 0x3FADBAB6,0x498ABAF4, + 0x3FAE353F,0x7CED9168, 0x3FAE3E3B,0xD0F66BAC, + 0x3FAEB851,0xEB851EB8, 0x3FAEC1C5,0x52B6F506, + 0x3FAF3B64,0x5A1CAC08, 0x3FAF4552,0xE038FC2E, + 0x3FAFBE76,0xC8B43958, 0x3FAFC8E4,0x8AEB4849, + 0x3FB020C4,0x9BA5E354, 0x3FB0263D,0x321F65E1, + 0x3FB0624D,0xD2F1A9FC, 0x3FB0680A,0x3ED356CA, + 0x3FB0A3D7,0x0A3D70A4, 0x3FB0A9D9,0x744C294D, + 0x3FB0E560,0x4189374C, 0x3FB0EBAA,0xDB45B370, + 0x3FB126E9,0x78D4FDF4, 0x3FB12D7E,0x7C7CF37B, + 0x3FB16872,0xB020C49C, 0x3FB16F54,0x60B014A5, + 0x3FB1A9FB,0xE76C8B44, 0x3FB1B12C,0x909E73C1, + 0x3FB1EB85,0x1EB851EC, 0x3FB1F307,0x1508A3E8, + 0x3FB22D0E,0x56041893, 0x3FB234E3,0xF6B0732E, + 0x3FB26E97,0x8D4FDF3B, 0x3FB276C3,0x3E58EF50, + 0x3FB2B020,0xC49BA5E3, 0x3FB2B8A4,0xF4C66A65, + 0x3FB2F1A9,0xFBE76C8B, 0x3FB2FA89,0x22BE7F94, + 0x3FB33333,0x33333333, 0x3FB33C6F,0xD10817C8, + 0x3FB374BC,0x6A7EF9DB, 0x3FB37E59,0x086B6E68, + 0x3FB3B645,0xA1CAC083, 0x3FB3C044,0xD1B2160D, + 0x3FB3F7CE,0xD916872B, 0x3FB40233,0x35A6FD3A, + 0x3FB43958,0x10624DD3, 0x3FB44424,0x3D16731E, + 0x3FB47AE1,0x47AE147B, 0x3FB48617,0xF0CE2C49, + 0x3FB4BC6A,0x7EF9DB23, 0x3FB4C80E,0x599D476F, + 0x3FB4FDF3,0xB645A1CB, 0x3FB50A07,0x80545224, + 0x3FB53F7C,0xED916873, 0x3FB54C03,0x6DC54DA3, + 0x3FB58106,0x24DD2F1B, 0x3FB58E02,0x2AC3B38B, + 0x3FB5C28F,0x5C28F5C3, 0x3FB5D003,0xC0247AA7, + 0x3FB60418,0x9374BC6A, 0x3FB61208,0x36BE1BB4, + 0x3FB645A1,0xCAC08312, 0x3FB6540F,0x9768962B, + 0x3FB6872B,0x020C49BA, 0x3FB69619,0xEAFD7506, + 0x3FB6C8B4,0x39581062, 0x3FB6D827,0x3A57D390, + 0x3FB70A3D,0x70A3D70A, 0x3FB71A37,0x8E546231, + 0x3FB74BC6,0xA7EF9DB2, 0x3FB75C4A,0xEFD16B3C, + 0x3FB78D4F,0xDF3B645A, 0x3FB79E61,0x67AED7C2, + 0x3FB7CED9,0x16872B02, 0x3FB7E07A,0xFECE3462, + 0x3FB81062,0x4DD2F1AA, 0x3FB82297,0xBE12B622, + 0x3FB851EB,0x851EB852, 0x3FB864B7,0xAE613F42, + 0x3FB89374,0xBC6A7EFA, 0x3FB8A6DA,0xD8A06415, + 0x3FB8D4FD,0xF3B645A2, 0x3FB8E901,0x45B86FDC, + 0x3FB91687,0x2B020C4A, 0x3FB92B2A,0xFE9369A1, + 0x3FB95810,0x624DD2F2, 0x3FB96D58,0x0C1D1919, + 0x3FB99999,0x9999999A, 0x3FB9AF88,0x77430B80, + 0x3FB9DB22,0xD0E56042, 0x3FB9F1BC,0x48F4987D, + 0x3FBA1CAC,0x083126E9, 0x3FBA33F3,0x8A22E705, + 0x3FBA5E35,0x3F7CED91, 0x3FBA762E,0x43C0F247, + 0x3FBA9FBE,0x76C8B439, 0x3FBAB86C,0x7EC38E8B, + 0x3FBAE147,0xAE147AE1, 0x3FBAFAAE,0x44216E25, + 0x3FBB22D0,0xE5604189, 0x3FBB3CF3,0x9CD3265C, + 0x3FBB645A,0x1CAC0831, 0x3FBB7F3C,0x91D3345E, + 0x3FBBA5E3,0x53F7CED9, 0x3FBBC189,0x2C1E022B, + 0x3FBBE76C,0x8B439581, 0x3FBC03D9,0x74B1EB8D, + 0x3FBC28F5,0xC28F5C29, 0x3FBC462D,0x748F430D, + 0x3FBC6A7E,0xF9DB22D1, 0x3FBC8885,0x34B856E6, + 0x3FBCAC08,0x3126E979, 0x3FBCCAE0,0xBE317607, + 0x3FBCED91,0x6872B021, 0x3FBD0D40,0x1A00F506, + 0x3FBD2F1A,0x9FBE76C9, 0x3FBD4FA3,0x512F3325, + 0x3FBD70A3,0xD70A3D71, 0x3FBD920A,0x6CC69F53, + 0x3FBDB22D,0x0E560419, 0x3FBDD475,0x75D3BD29, + 0x3FBDF3B6,0x45A1CAC1, 0x3FBE16E4,0x756529F6, + 0x3FBE353F,0x7CED9168, 0x3FBE5957,0x748BA1C5, + 0x3FBE76C8,0xB4395810, 0x3FBE9BCE,0x7C5A0467, + 0x3FBEB851,0xEB851EB8, 0x3FBEDE49,0x95E55A7F, + 0x3FBEF9DB,0x22D0E560, 0x3FBF20C8,0xCA44DA93, + 0x3FBF3B64,0x5A1CAC08, 0x3FBF634C,0x2291EE1D, + 0x3FBF7CED,0x916872B0, 0x3FBFA5D3,0xA7E8369F, + 0x3FBFBE76,0xC8B43958, 0x3FBFE85F,0x636592BA, + 0x3FC00000,0x00000000, 0x3FC01577,0xAF1511A5, + 0x3FC020C4,0x9BA5E354, 0x3FC036C1,0xD0AC283F, + 0x3FC04189,0x374BC6A8, 0x3FC0580E,0x1B0A677C, + 0x3FC0624D,0xD2F1A9FC, 0x3FC0795C,0x92C35279, + 0x3FC08312,0x6E978D50, 0x3FC09AAD,0x3C6B97AE, + 0x3FC0A3D7,0x0A3D70A4, 0x3FC0BC00,0x1C991383, + 0x3FC0C49B,0xA5E353F8, 0x3FC0DD55,0x37E2D2E5, + 0x3FC0E560,0x4189374C, 0x3FC0FEAC,0x92E115DB, + 0x3FC10624,0xDD2F1AA0, 0x3FC12006,0x322D5220, + 0x3FC126E9,0x78D4FDF4, 0x3FC14162,0x1A6235B7, + 0x3FC147AE,0x147AE148, 0x3FC162C0,0x501BA989, + 0x3FC16872,0xB020C49C, 0x3FC18420,0xD7F6D401, + 0x3FC18937,0x4BC6A7F0, 0x3FC1A583,0xB6921BA7, + 0x3FC1A9FB,0xE76C8B44, 0x3FC1C6E8,0xF08D29C0, + 0x3FC1CAC0,0x83126E98, 0x3FC1E850,0x8A88ECEC, + 0x3FC1EB85,0x1EB851EC, 0x3FC209BA,0x89279BCC, + 0x3FC20C49,0xBA5E353F, 0x3FC22B26,0xF10CB79E, + 0x3FC22D0E,0x56041893, 0x3FC24C95,0xC6DD0EE9, + 0x3FC24DD2,0xF1A9FBE7, 0x3FC26E07,0x0F3EC01D, + 0x3FC26E97,0x8D4FDF3B, 0x3FC28F7A,0xCED93C3F, + 0x3FC28F5C,0x28F5C28F, 0x3FC2B0F1,0x0A55498E, + 0x3FC2B020,0xC49BA5E3, 0x3FC2D269,0xC65D062F, + 0x3FC2D0E5,0x60418937, 0x3FC2F3E5,0x079BEADC, + 0x3FC2F1A9,0xFBE76C8B, 0x3FC31562,0xD2BECD8E, + 0x3FC3126E,0x978D4FDF, 0x3FC336E3,0x2C73E42D, + 0x3FC33333,0x33333333, 0x3FC35866,0x196AC743, + 0x3FC353F7,0xCED91687, 0x3FC379EB,0x9E5474AA, + 0x3FC374BC,0x6A7EF9DB, 0x3FC39B73,0xBFE35248, + 0x3FC39581,0x0624DD2F, 0x3FC3BCFE,0x82CB30BC, + 0x3FC3B645,0xA1CAC083, 0x3FC3DE8B,0xEBC14E1A, + 0x3FC3D70A,0x3D70A3D7, 0x3FC4001B,0xFF7C58A4, + 0x3FC3F7CE,0xD916872B, 0x3FC421AE,0xC2B47185, + 0x3FC41893,0x74BC6A7F, 0x3FC44344,0x3A232F8C, + 0x3FC43958,0x10624DD3, 0x3FC464DC,0x6A83A1E9, + 0x3FC45A1C,0xAC083127, 0x3FC48677,0x589252F1, + 0x3FC47AE1,0x47AE147B, 0x3FC4A815,0x090D4ADD, + 0x3FC49BA5,0xE353F7CF, 0x3FC4C9B5,0x80B4128D, + 0x3FC4BC6A,0x7EF9DB23, 0x3FC4EB58,0xC447B64F, + 0x3FC4DD2F,0x1A9FBE77, 0x3FC50CFE,0xD88AC8A2, + 0x3FC4FDF3,0xB645A1CB, 0x3FC52EA7,0xC2416505, + 0x3FC51EB8,0x51EB851F, 0x3FC55053,0x863132BB, + 0x3FC53F7C,0xED916873, 0x3FC57202,0x2921679D, + 0x3FC56041,0x89374BC7, 0x3FC593B3,0xAFDACAE2, + 0x3FC58106,0x24DD2F1B, 0x3FC5B568,0x1F27B7F5, + 0x3FC5A1CA,0xC083126F, 0x3FC5D71F,0x7BD42144, + 0x3FC5C28F,0x5C28F5C3, 0x3FC5F8D9,0xCAAD9312, + 0x3FC5E353,0xF7CED917, 0x3FC61A97,0x10833651, + 0x3FC60418,0x9374BC6A, 0x3FC63C57,0x5225D373, + 0x3FC624DD,0x2F1A9FBE, 0x3FC65E1A,0x9467D54F, + 0x3FC645A1,0xCAC08312, 0x3FC67FE0,0xDC1D4BED, + 0x3FC66666,0x66666666, 0x3FC6A1AA,0x2E1BEF6F, + 0x3FC6872B,0x020C49BA, 0x3FC6C376,0x8F3B22EC, + 0x3FC6A7EF,0x9DB22D0E, 0x3FC6E546,0x0453F750, + 0x3FC6C8B4,0x39581062, 0x3FC70718,0x92412E43, + 0x3FC6E978,0xD4FDF3B6, 0x3FC728EE,0x3DDF3D0B, + 0x3FC70A3D,0x70A3D70A, 0x3FC74AC7,0x0C0C4F74, + 0x3FC72B02,0x0C49BA5E, 0x3FC76CA3,0x01A84ABA, + 0x3FC74BC6,0xA7EF9DB2, 0x3FC78E82,0x2394D074, + 0x3FC76C8B,0x43958106, 0x3FC7B064,0x76B54180, + 0x3FC78D4F,0xDF3B645A, 0x3FC7D249,0xFFEEC0F6, + 0x3FC7AE14,0x7AE147AE, 0x3FC7F432,0xC4283716, + 0x3FC7CED9,0x16872B02, 0x3FC8161E,0xC84A543C, + 0x3FC7EF9D,0xB22D0E56, 0x3FC8380E,0x113F93D8, + 0x3FC81062,0x4DD2F1AA, 0x3FC85A00,0xA3F43F66, + 0x3FC83126,0xE978D4FE, 0x3FC87BF6,0x85567163, + 0x3FC851EB,0x851EB852, 0x3FC89DEF,0xBA561850, + 0x3FC872B0,0x20C49BA6, 0x3FC8BFEC,0x47E4F9AD, + 0x3FC89374,0xBC6A7EFA, 0x3FC8E1EC,0x32F6B4F9, + 0x3FC8B439,0x5810624E, 0x3FC903EF,0x8080C6B8, + 0x3FC8D4FD,0xF3B645A2, 0x3FC925F6,0x357A8B73, + 0x3FC8F5C2,0x8F5C28F6, 0x3FC94800,0x56DD42C4, + 0x3FC91687,0x2B020C4A, 0x3FC96A0D,0xE9A41260, + 0x3FC9374B,0xC6A7EF9E, 0x3FC98C1E,0xF2CC091C, + 0x3FC95810,0x624DD2F2, 0x3FC9AE33,0x77542205, + 0x3FC978D4,0xFDF3B646, 0x3FC9D04B,0x7C3D4769, + 0x3FC99999,0x9999999A, 0x3FC9F267,0x068A55EC, + 0x3FC9BA5E,0x353F7CEE, 0x3FCA1486,0x1B401F9E, + 0x3FC9DB22,0xD0E56042, 0x3FCA36A8,0xBF656F12, + 0x3FC9FBE7,0x6C8B4396, 0x3FCA58CE,0xF8030A79, + 0x3FCA1CAC,0x083126E9, 0x3FCA7AF8,0xCA23B6BB, + 0x3FCA3D70,0xA3D70A3D, 0x3FCA9D26,0x3AD43A9A, + 0x3FCA5E35,0x3F7CED91, 0x3FCABF57,0x4F2361D1, + 0x3FCA7EF9,0xDB22D0E5, 0x3FCAE18C,0x0C220035, + 0x3FCA9FBE,0x76C8B439, 0x3FCB03C4,0x76E2F4E0, + 0x3FCAC083,0x126E978D, 0x3FCB2600,0x947B2D57, + 0x3FCAE147,0xAE147AE1, 0x3FCB4840,0x6A01A8B4, + 0x3FCB020C,0x49BA5E35, 0x3FCB6A83,0xFC8F7AD5, + 0x3FCB22D0,0xE5604189, 0x3FCB8CCB,0x513FCF8D, + 0x3FCB4395,0x810624DD, 0x3FCBAF16,0x6D2FEDD5, + 0x3FCB645A,0x1CAC0831, 0x3FCBD165,0x557F3AFF, + 0x3FCB851E,0xB851EB85, 0x3FCBF3B8,0x0F4F3DF4, + 0x3FCBA5E3,0x53F7CED9, 0x3FCC160E,0x9FC3A267, + 0x3FCBC6A7,0xEF9DB22D, 0x3FCC3869,0x0C023C18, + 0x3FCBE76C,0x8B439581, 0x3FCC5AC7,0x59330A10, + 0x3FCC0831,0x26E978D5, 0x3FCC7D29,0x8C8039E5, + 0x3FCC28F5,0xC28F5C29, 0x3FCC9F8F,0xAB162AFC, + 0x3FCC49BA,0x5E353F7D, 0x3FCCC1F9,0xBA2371D7, + 0x3FCC6A7E,0xF9DB22D1, 0x3FCCE467,0xBED8DB56, + 0x3FCC8B43,0x95810625, 0x3FCD06D9,0xBE69700E, + 0x3FCCAC08,0x3126E979, 0x3FCD294F,0xBE0A778F, + 0x3FCCCCCC,0xCCCCCCCD, 0x3FCD4BC9,0xC2F37BC0, + 0x3FCCED91,0x6872B021, 0x3FCD6E47,0xD25E4C2D, + 0x3FCD0E56,0x04189375, 0x3FCD90C9,0xF1870162, + 0x3FCD2F1A,0x9FBE76C9, 0x3FCDB350,0x25AC0046, + 0x3FCD4FDF,0x3B645A1D, 0x3FCDD5DA,0x740DFD78, + 0x3FCD70A3,0xD70A3D71, 0x3FCDF868,0xE1F000B0, + 0x3FCD9168,0x72B020C5, 0x3FCE1AFB,0x74976824, + 0x3FCDB22D,0x0E560419, 0x3FCE3D92,0x314BEBEB, + 0x3FCDD2F1,0xA9FBE76D, 0x3FCE602D,0x1D57A168, + 0x3FCDF3B6,0x45A1CAC1, 0x3FCE82CC,0x3E06FEB6, + 0x3FCE147A,0xE147AE14, 0x3FCEA56F,0x98A8DE18, + 0x3FCE353F,0x7CED9168, 0x3FCEC817,0x328E816C, + 0x3FCE5604,0x189374BC, 0x3FCEEAC3,0x110B959C, + 0x3FCE76C8,0xB4395810, 0x3FCF0D73,0x39763619, + 0x3FCE978D,0x4FDF3B64, 0x3FCF3027,0xB126F057, + 0x3FCEB851,0xEB851EB8, 0x3FCF52E0,0x7D78C747, + 0x3FCED916,0x872B020C, 0x3FCF759D,0xA3C936DE, + 0x3FCEF9DB,0x22D0E560, 0x3FCF985F,0x29783796, + 0x3FCF1A9F,0xBE76C8B4, 0x3FCFBB25,0x13E841F3, + 0x3FCF3B64,0x5A1CAC08, 0x3FCFDDEF,0x687E5213, + 0x3FCF5C28,0xF5C28F5C, 0x3FD0005F,0x1650F59C, + 0x3FCF7CED,0x916872B0, 0x3FD011C8,0xB2DE8DAD, + 0x3FCF9DB2,0x2D0E5604, 0x3FD02334,0x8C9E3F5D, + 0x3FCFBE76,0xC8B43958, 0x3FD034A2,0xA647A1BD, + 0x3FCFDF3B,0x645A1CAC, 0x3FD04613,0x0293969C, + 0x3FD00000,0x00000000, 0x3FD05785,0xA43C4C56, + 0x3FD01062,0x4DD2F1AA, 0x3FD068FA,0x8DFD3FA2, + 0x3FD020C4,0x9BA5E354, 0x3FD07A71,0xC2933D69, + 0x3FD03126,0xE978D4FE, 0x3FD08BEB,0x44BC6495, + 0x3FD04189,0x374BC6A8, 0x3FD09D67,0x173827E8, + 0x3FD051EB,0x851EB852, 0x3FD0AEE5,0x3CC74FD5, + 0x3FD0624D,0xD2F1A9FC, 0x3FD0C065,0xB82BFC56, + 0x3FD072B0,0x20C49BA6, 0x3FD0D1E8,0x8C29A6C9, + 0x3FD08312,0x6E978D50, 0x3FD0E36D,0xBB8523CA, + 0x3FD09374,0xBC6A7EFA, 0x3FD0F4F5,0x4904A512, + 0x3FD0A3D7,0x0A3D70A4, 0x3FD1067F,0x376FBB57, + 0x3FD0B439,0x5810624E, 0x3FD1180B,0x898F582C, + 0x3FD0C49B,0xA5E353F8, 0x3FD1299A,0x422DCFE6, + 0x3FD0D4FD,0xF3B645A2, 0x3FD13B2B,0x6416DB80, + 0x3FD0E560,0x4189374C, 0x3FD14CBE,0xF2179A81, + 0x3FD0F5C2,0x8F5C28F6, 0x3FD15E54,0xEEFE94E6, + 0x3FD10624,0xDD2F1AA0, 0x3FD16FED,0x5D9BBD0B, + 0x3FD11687,0x2B020C4A, 0x3FD18188,0x40C07198, + 0x3FD126E9,0x78D4FDF4, 0x3FD19325,0x9B3F7F6D, + 0x3FD1374B,0xC6A7EF9E, 0x3FD1A4C5,0x6FED2395, + 0x3FD147AE,0x147AE148, 0x3FD1B667,0xC19F0D33, + 0x3FD15810,0x624DD2F2, 0x3FD1C80C,0x932C5F7C, + 0x3FD16872,0xB020C49C, 0x3FD1D9B3,0xE76DB3A6, + 0x3FD178D4,0xFDF3B646, 0x3FD1EB5D,0xC13D1AE0, + 0x3FD18937,0x4BC6A7F0, 0x3FD1FD0A,0x23762050, + 0x3FD19999,0x9999999A, 0x3FD20EB9,0x10F5CB09, + 0x3FD1A9FB,0xE76C8B44, 0x3FD2206A,0x8C9AA009, + 0x3FD1BA5E,0x353F7CEE, 0x3FD2321E,0x9944A439, + 0x3FD1CAC0,0x83126E98, 0x3FD243D5,0x39D55E6C, + 0x3FD1DB22,0xD0E56042, 0x3FD2558E,0x712FD964, + 0x3FD1EB85,0x1EB851EC, 0x3FD2674A,0x4238A5D5, + 0x3FD1FBE7,0x6C8B4396, 0x3FD27908,0xAFD5DC69, + 0x3FD20C49,0xBA5E353F, 0x3FD28AC9,0xBCEF1FD0, + 0x3FD21CAC,0x083126E9, 0x3FD29C8D,0x6C6D9EC4, + 0x3FD22D0E,0x56041893, 0x3FD2AE53,0xC13C1617, + 0x3FD23D70,0xA3D70A3D, 0x3FD2C01C,0xBE46D2C4, + 0x3FD24DD2,0xF1A9FBE7, 0x3FD2D1E8,0x667BB3FC, + 0x3FD25E35,0x3F7CED91, 0x3FD2E3B6,0xBCCA2D3C, + 0x3FD26E97,0x8D4FDF3B, 0x3FD2F587,0xC4234860, + 0x3FD27EF9,0xDB22D0E5, 0x3FD3075B,0x7F79A7BB, + 0x3FD28F5C,0x28F5C28F, 0x3FD31931,0xF1C1882F, + 0x3FD29FBE,0x76C8B439, 0x3FD32B0B,0x1DF0C347, + 0x3FD2B020,0xC49BA5E3, 0x3FD33CE7,0x06FED157, + 0x3FD2C083,0x126E978D, 0x3FD34EC5,0xAFE4CB9A, + 0x3FD2D0E5,0x60418937, 0x3FD360A7,0x1B9D6E52, + 0x3FD2E147,0xAE147AE1, 0x3FD3728B,0x4D251AED, + 0x3FD2F1A9,0xFBE76C8B, 0x3FD38472,0x4779DA2B, + 0x3FD3020C,0x49BA5E35, 0x3FD3965C,0x0D9B5E46, + 0x3FD3126E,0x978D4FDF, 0x3FD3A848,0xA28B0518, + 0x3FD322D0,0xE5604189, 0x3FD3BA38,0x094BDA50, + 0x3FD33333,0x33333333, 0x3FD3CC2A,0x44E29998, + 0x3FD34395,0x810624DD, 0x3FD3DE1F,0x5855B0C8, + 0x3FD353F7,0xCED91687, 0x3FD3F017,0x46AD421F, + 0x3FD3645A,0x1CAC0831, 0x3FD40212,0x12F3266E, + 0x3FD374BC,0x6A7EF9DB, 0x3FD4140F,0xC032EF59, + 0x3FD3851E,0xB851EB85, 0x3FD42610,0x5179E98A, + 0x3FD39581,0x0624DD2F, 0x3FD43813,0xC9D71EF1, + 0x3FD3A5E3,0x53F7CED9, 0x3FD44A1A,0x2C5B5903, + 0x3FD3B645,0xA1CAC083, 0x3FD45C23,0x7C1922F7, + 0x3FD3C6A7,0xEF9DB22D, 0x3FD46E2F,0xBC24CC0D, + 0x3FD3D70A,0x3D70A3D7, 0x3FD4803E,0xEF9469D0, + 0x3FD3E76C,0x8B439581, 0x3FD49251,0x197FDA61, + 0x3FD3F7CE,0xD916872B, 0x3FD4A466,0x3D00C6C1, + 0x3FD40831,0x26E978D5, 0x3FD4B67E,0x5D32A51C, + 0x3FD41893,0x74BC6A7F, 0x3FD4C899,0x7D32BB17, + 0x3FD428F5,0xC28F5C29, 0x3FD4DAB7,0xA0202027, + 0x3FD43958,0x10624DD3, 0x3FD4ECD8,0xC91BBFDE, + 0x3FD449BA,0x5E353F7D, 0x3FD4FEFC,0xFB485C46, + 0x3FD45A1C,0xAC083127, 0x3FD51124,0x39CA903B, + 0x3FD46A7E,0xF9DB22D1, 0x3FD5234E,0x87C8D1C0, + 0x3FD47AE1,0x47AE147B, 0x3FD5357B,0xE86B7466, + 0x3FD48B43,0x95810625, 0x3FD547AC,0x5EDCABA2, + 0x3FD49BA5,0xE353F7CF, 0x3FD559DF,0xEE488D3B, + 0x3FD4AC08,0x3126E979, 0x3FD56C16,0x99DD13A7, + 0x3FD4BC6A,0x7EF9DB23, 0x3FD57E50,0x64CA2078, + 0x3FD4CCCC,0xCCCCCCCD, 0x3FD5908D,0x52417EC4, + 0x3FD4DD2F,0x1A9FBE77, 0x3FD5A2CD,0x6576E593, + 0x3FD4ED91,0x6872B021, 0x3FD5B510,0xA19FFA51, + 0x3FD4FDF3,0xB645A1CB, 0x3FD5C757,0x09F4533D, + 0x3FD50E56,0x04189375, 0x3FD5D9A0,0xA1AD79E4, + 0x3FD51EB8,0x51EB851F, 0x3FD5EBED,0x6C06ED90, + 0x3FD52F1A,0x9FBE76C9, 0x3FD5FE3D,0x6C3E25CC, + 0x3FD53F7C,0xED916873, 0x3FD61090,0xA59294DA, + 0x3FD54FDF,0x3B645A1D, 0x3FD622E7,0x1B45AA3A, + 0x3FD56041,0x89374BC7, 0x3FD63540,0xD09AD524, + 0x3FD570A3,0xD70A3D71, 0x3FD6479D,0xC8D78716, + 0x3FD58106,0x24DD2F1B, 0x3FD659FE,0x07433658, + 0x3FD59168,0x72B020C5, 0x3FD66C61,0x8F276088, + 0x3FD5A1CA,0xC083126F, 0x3FD67EC8,0x63CF8D26, + 0x3FD5B22D,0x0E560419, 0x3FD69132,0x88895028, + 0x3FD5C28F,0x5C28F5C3, 0x3FD6A3A0,0x00A44C8C, + 0x3FD5D2F1,0xA9FBE76D, 0x3FD6B610,0xCF7236EE, + 0x3FD5E353,0xF7CED917, 0x3FD6C884,0xF846D822, + 0x3FD5F3B6,0x45A1CAC1, 0x3FD6DAFC,0x7E780FCE, + 0x3FD60418,0x9374BC6A, 0x3FD6ED77,0x655DD70D, + 0x3FD6147A,0xE147AE14, 0x3FD6FFF5,0xB0524310, + 0x3FD624DD,0x2F1A9FBE, 0x3FD71277,0x62B187BF, + 0x3FD6353F,0x7CED9168, 0x3FD724FC,0x7FD9FA64, + 0x3FD645A1,0xCAC08312, 0x3FD73785,0x0B2C1459, + 0x3FD65604,0x189374BC, 0x3FD74A11,0x080A75AF, + 0x3FD66666,0x66666666, 0x3FD75CA0,0x79D9E7E4, + 0x3FD676C8,0xB4395810, 0x3FD76F33,0x64016095, + 0x3FD6872B,0x020C49BA, 0x3FD781C9,0xC9EA0438, + 0x3FD6978D,0x4FDF3B64, 0x3FD79463,0xAEFF28CF, + 0x3FD6A7EF,0x9DB22D0E, 0x3FD7A701,0x16AE58AE, + 0x3FD6B851,0xEB851EB8, 0x3FD7B9A2,0x04675536, + 0x3FD6C8B4,0x39581062, 0x3FD7CC46,0x7B9C1998, + 0x3FD6D916,0x872B020C, 0x3FD7DEEE,0x7FC0DD9E, + 0x3FD6E978,0xD4FDF3B6, 0x3FD7F19A,0x144C1876, + 0x3FD6F9DB,0x22D0E560, 0x3FD80449,0x3CB68379, + 0x3FD70A3D,0x70A3D70A, 0x3FD816FB,0xFC7B1D03, + 0x3FD71A9F,0xBE76C8B4, 0x3FD829B2,0x57172B3E, + 0x3FD72B02,0x0C49BA5E, 0x3FD83C6C,0x500A3F02, + 0x3FD73B64,0x5A1CAC08, 0x3FD84F29,0xEAD636A7, + 0x3FD74BC6,0xA7EF9DB2, 0x3FD861EB,0x2AFF40E4, + 0x3FD75C28,0xF5C28F5C, 0x3FD874B0,0x140BDFB4, + 0x3FD76C8B,0x43958106, 0x3FD88778,0xA984EB35, + 0x3FD77CED,0x916872B0, 0x3FD89A44,0xEEF5948F, + 0x3FD78D4F,0xDF3B645A, 0x3FD8AD14,0xE7EB68E4, + 0x3FD79DB2,0x2D0E5604, 0x3FD8BFE8,0x97F65436, + 0x3FD7AE14,0x7AE147AE, 0x3FD8D2C0,0x02A8A461, + 0x3FD7BE76,0xC8B43958, 0x3FD8E59B,0x2B970C08, + 0x3FD7CED9,0x16872B02, 0x3FD8F87A,0x1658A591, + 0x3FD7DF3B,0x645A1CAC, 0x3FD90B5C,0xC686F624, + 0x3FD7EF9D,0xB22D0E56, 0x3FD91E43,0x3FBDF0A2, + 0x3FD80000,0x00000000, 0x3FD9312D,0x859BF8B0, + 0x3FD81062,0x4DD2F1AA, 0x3FD9441B,0x9BC1E5B7, + 0x3FD820C4,0x9BA5E354, 0x3FD9570D,0x85D305F4, + 0x3FD83126,0xE978D4FE, 0x3FD96A03,0x47752180, + 0x3FD84189,0x374BC6A8, 0x3FD97CFC,0xE4507D62, + 0x3FD851EB,0x851EB852, 0x3FD98FFA,0x600FDEA8, + 0x3FD8624D,0xD2F1A9FC, 0x3FD9A2FB,0xBE608D7B, + 0x3FD872B0,0x20C49BA6, 0x3FD9B601,0x02F2583B, + 0x3FD88312,0x6E978D50, 0x3FD9C90A,0x317796A1, + 0x3FD89374,0xBC6A7EFA, 0x3FD9DC17,0x4DA52CE3, + 0x3FD8A3D7,0x0A3D70A4, 0x3FD9EF28,0x5B328ED9, + 0x3FD8B439,0x5810624E, 0x3FDA023D,0x5DD9C326, + 0x3FD8C49B,0xA5E353F8, 0x3FDA1556,0x5957666E, + 0x3FD8D4FD,0xF3B645A2, 0x3FDA2873,0x516AAE80, + 0x3FD8E560,0x4189374C, 0x3FDA3B94,0x49D56D94, + 0x3FD8F5C2,0x8F5C28F6, 0x3FDA4EB9,0x465C1580, + 0x3FD90624,0xDD2F1AA0, 0x3FDA61E2,0x4AC5BAF7, + 0x3FD91687,0x2B020C4A, 0x3FDA750F,0x5ADC18CD, + 0x3FD926E9,0x78D4FDF4, 0x3FDA8840,0x7A6B933E, + 0x3FD9374B,0xC6A7EF9E, 0x3FDA9B75,0xAD433B34, + 0x3FD947AE,0x147AE148, 0x3FDAAEAE,0xF734D197, + 0x3FD95810,0x624DD2F2, 0x3FDAC1EC,0x5C14CA9F, + 0x3FD96872,0xB020C49C, 0x3FDAD52D,0xDFBA512B, + 0x3FD978D4,0xFDF3B646, 0x3FDAE873,0x85FF4A1B, + 0x3FD98937,0x4BC6A7F0, 0x3FDAFBBD,0x52C057AB, + 0x3FD99999,0x9999999A, 0x3FDB0F0B,0x49DCDCD8, + 0x3FD9A9FB,0xE76C8B44, 0x3FDB225D,0x6F3700C8, + 0x3FD9BA5E,0x353F7CEE, 0x3FDB35B3,0xC6B3B231, + 0x3FD9CAC0,0x83126E98, 0x3FDB490E,0x543AAAC9, + 0x3FD9DB22,0xD0E56042, 0x3FDB5C6D,0x1BB672BB, + 0x3FD9EB85,0x1EB851EC, 0x3FDB6FD0,0x2114641A, + 0x3FD9FBE7,0x6C8B4396, 0x3FDB8337,0x6844AE63, + 0x3FDA0C49,0xBA5E353F, 0x3FDB96A2,0xF53A59F3, + 0x3FDA1CAC,0x083126E9, 0x3FDBAA12,0xCBEB4B98, + 0x3FDA2D0E,0x56041893, 0x3FDBBD86,0xF050480E, + 0x3FDA3D70,0xA3D70A3D, 0x3FDBD0FF,0x6664F790, + 0x3FDA4DD2,0xF1A9FBE7, 0x3FDBE47C,0x3227E96C, + 0x3FDA5E35,0x3F7CED91, 0x3FDBF7FD,0x579A9793, + 0x3FDA6E97,0x8D4FDF3B, 0x3FDC0B82,0xDAC16A3A, + 0x3FDA7EF9,0xDB22D0E5, 0x3FDC1F0C,0xBFA3BB73, + 0x3FDA8F5C,0x28F5C28F, 0x3FDC329B,0x0A4BDAD1, + 0x3FDA9FBE,0x76C8B439, 0x3FDC462D,0xBEC71112, + 0x3FDAB020,0xC49BA5E3, 0x3FDC59C4,0xE125A3CA, + 0x3FDAC083,0x126E978D, 0x3FDC6D60,0x757AD914, + 0x3FDAD0E5,0x60418937, 0x3FDC8100,0x7FDCFB47, + 0x3FDAE147,0xAE147AE1, 0x3FDC94A5,0x04655CB0, + 0x3FDAF1A9,0xFBE76C8B, 0x3FDCA84E,0x07305B52, + 0x3FDB020C,0x49BA5E35, 0x3FDCBBFB,0x8C5D64A9, + 0x3FDB126E,0x978D4FDF, 0x3FDCCFAD,0x980EF971, + 0x3FDB22D0,0xE5604189, 0x3FDCE364,0x2E6AB175, + 0x3FDB3333,0x33333333, 0x3FDCF71F,0x53993F60, + 0x3FDB4395,0x810624DD, 0x3FDD0ADF,0x0BC67495, + 0x3FDB53F7,0xCED91687, 0x3FDD1EA3,0x5B214507, + 0x3FDB645A,0x1CAC0831, 0x3FDD326C,0x45DBCB1D, + 0x3FDB74BC,0x6A7EF9DB, 0x3FDD4639,0xD02B4B97, + 0x3FDB851E,0xB851EB85, 0x3FDD5A0B,0xFE483977, + 0x3FDB9581,0x0624DD2F, 0x3FDD6DE2,0xD46E39F2, + 0x3FDBA5E3,0x53F7CED9, 0x3FDD81BE,0x56DC2861, + 0x3FDBB645,0xA1CAC083, 0x3FDD959E,0x89D41A41, + 0x3FDBC6A7,0xEF9DB22D, 0x3FDDA983,0x719B6329, + 0x3FDBD70A,0x3D70A3D7, 0x3FDDBD6D,0x127A98D6, + 0x3FDBE76C,0x8B439581, 0x3FDDD15B,0x70BD972D, + 0x3FDBF7CE,0xD916872B, 0x3FDDE54E,0x90B3844F, + 0x3FDC0831,0x26E978D5, 0x3FDDF946,0x76AED4A6, + 0x3FDC1893,0x74BC6A7F, 0x3FDE0D43,0x27054F04, + 0x3FDC28F5,0xC28F5C29, 0x3FDE2144,0xA61010BB, + 0x3FDC3958,0x10624DD3, 0x3FDE354A,0xF82B91C4, + 0x3FDC49BA,0x5E353F7D, 0x3FDE4956,0x21B7A8E6, + 0x3FDC5A1C,0xAC083127, 0x3FDE5D66,0x27178FE3, + 0x3FDC6A7E,0xF9DB22D1, 0x3FDE717B,0x0CB1E7AD, + 0x3FDC7AE1,0x47AE147B, 0x3FDE8594,0xD6F0BC9D, + 0x3FDC8B43,0x95810625, 0x3FDE99B3,0x8A418AB5, + 0x3FDC9BA5,0xE353F7CF, 0x3FDEADD7,0x2B1541DC, + 0x3FDCAC08,0x3126E979, 0x3FDEC1FF,0xBDE04A31, + 0x3FDCBC6A,0x7EF9DB23, 0x3FDED62D,0x471A8851, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FDEEA5F,0xCB3F61B4, + 0x3FDCDD2F,0x1A9FBE77, 0x3FDEFE97,0x4ECDC0FE, + 0x3FDCED91,0x6872B021, 0x3FDF12D3,0xD6481A68, + 0x3FDCFDF3,0xB645A1CB, 0x3FDF2715,0x6634701F, + 0x3FDD0E56,0x04189375, 0x3FDF3B5C,0x031C56B2, + 0x3FDD1EB8,0x51EB851F, 0x3FDF4FA7,0xB18CF984, + 0x3FDD2F1A,0x9FBE76C9, 0x3FDF63F8,0x76171F43, + 0x3FDD3F7C,0xED916873, 0x3FDF784E,0x554F2E61, + 0x3FDD4FDF,0x3B645A1D, 0x3FDF8CA9,0x53CD319E, + 0x3FDD6041,0x89374BC7, 0x3FDFA109,0x762CDC8B, + 0x3FDD70A3,0xD70A3D71, 0x3FDFB56E,0xC10D901B, + 0x3FDD8106,0x24DD2F1B, 0x3FDFC9D9,0x39125F39, + 0x3FDD9168,0x72B020C5, 0x3FDFDE48,0xE2E21362, + 0x3FDDA1CA,0xC083126F, 0x3FDFF2BD,0xC3273145, + 0x3FDDB22D,0x0E560419, 0x3FE0039B,0xEF47FEB7, + 0x3FDDC28F,0x5C28F5C3, 0x3FE00DDB,0x9CE74077, + 0x3FDDD2F1,0xA9FBE76D, 0x3FE0181D,0xECCC470A, + 0x3FDDE353,0xF7CED917, 0x3FE02262,0xE153E292, + 0x3FDDF3B6,0x45A1CAC1, 0x3FE02CAA,0x7CDCCC8D, + 0x3FDE0418,0x9374BC6A, 0x3FE036F4,0xC1C7AA37, + 0x3FDE147A,0xE147AE14, 0x3FE04141,0xB2770EF2, + 0x3FDE24DD,0x2F1A9FBE, 0x3FE04B91,0x514F7EAD, + 0x3FDE353F,0x7CED9168, 0x3FE055E3,0xA0B77055, + 0x3FDE45A1,0xCAC08312, 0x3FE06038,0xA3175044, + 0x3FDE5604,0x189374BC, 0x3FE06A90,0x5AD982B1, + 0x3FDE6666,0x66666666, 0x3FE074EA,0xCA6A662C, + 0x3FDE76C8,0xB4395810, 0x3FE07F47,0xF4385618, + 0x3FDE872B,0x020C49BA, 0x3FE089A7,0xDAB3AD23, + 0x3FDE978D,0x4FDF3B64, 0x3FE0940A,0x804EC7CD, + 0x3FDEA7EF,0x9DB22D0E, 0x3FE09E6F,0xE77E06EA, + 0x3FDEB851,0xEB851EB8, 0x3FE0A8D8,0x12B7D22A, + 0x3FDEC8B4,0x39581062, 0x3FE0B343,0x04749AA5, + 0x3FDED916,0x872B020C, 0x3FE0BDB0,0xBF2EDD67, + 0x3FDEE978,0xD4FDF3B6, 0x3FE0C821,0x45632605, + 0x3FDEF9DB,0x22D0E560, 0x3FE0D294,0x99901134, + 0x3FDF0A3D,0x70A3D70A, 0x3FE0DD0A,0xBE364F5E, + 0x3FDF1A9F,0xBE76C8B4, 0x3FE0E783,0xB5D8A740, + 0x3FDF2B02,0x0C49BA5E, 0x3FE0F1FF,0x82FBF88E, + 0x3FDF3B64,0x5A1CAC08, 0x3FE0FC7E,0x28273E93, + 0x3FDF4BC6,0xA7EF9DB2, 0x3FE106FF,0xA7E392D9, + 0x3FDF5C28,0xF5C28F5C, 0x3FE11184,0x04BC2FD6, + 0x3FDF6C8B,0x43958106, 0x3FE11C0B,0x413E739C, + 0x3FDF7CED,0x916872B0, 0x3FE12695,0x5FF9E286, + 0x3FDF8D4F,0xDF3B645A, 0x3FE13122,0x638029F4, + 0x3FDF9DB2,0x2D0E5604, 0x3FE13BB2,0x4E652305, + 0x3FDFAE14,0x7AE147AE, 0x3FE14645,0x233ED550, + 0x3FDFBE76,0xC8B43958, 0x3FE150DA,0xE4A579AB, + 0x3FDFCED9,0x16872B02, 0x3FE15B73,0x95337CED, + 0x3FDFDF3B,0x645A1CAC, 0x3FE1660F,0x378582BA, + 0x3FDFEF9D,0xB22D0E56, 0x3FE170AD,0xCE3A684C, + 0x3FE00000,0x00000000, 0x3FE17B4F,0x5BF3474A, + 0x3FE00831,0x26E978D5, 0x3FE185F3,0xE353789A, + 0x3FE01062,0x4DD2F1AA, 0x3FE1909B,0x67009737, + 0x3FE01893,0x74BC6A7F, 0x3FE19B45,0xE9A28315, + 0x3FE020C4,0x9BA5E354, 0x3FE1A5F3,0x6DE363FB, + 0x3FE028F5,0xC28F5C29, 0x3FE1B0A3,0xF66FAC6C, + 0x3FE03126,0xE978D4FE, 0x3FE1BB57,0x85F61C90, + 0x3FE03958,0x10624DD3, 0x3FE1C60E,0x1F27C51F, + 0x3FE04189,0x374BC6A8, 0x3FE1D0C7,0xC4B80A54, + 0x3FE049BA,0x5E353F7D, 0x3FE1DB84,0x795CA6E2, + 0x3FE051EB,0x851EB852, 0x3FE1E644,0x3FCDAEED, + 0x3FE05A1C,0xAC083127, 0x3FE1F107,0x1AC5930A, + 0x3FE0624D,0xD2F1A9FC, 0x3FE1FBCD,0x0D01233D, + 0x3FE06A7E,0xF9DB22D1, 0x3FE20696,0x193F9203, + 0x3FE072B0,0x20C49BA6, 0x3FE21162,0x4242775C, + 0x3FE07AE1,0x47AE147B, 0x3FE21C31,0x8ACDD3D6, + 0x3FE08312,0x6E978D50, 0x3FE22703,0xF5A813A5, + 0x3FE08B43,0x95810625, 0x3FE231D9,0x859A11BA, + 0x3FE09374,0xBC6A7EFA, 0x3FE23CB2,0x3D6F1ADC, + 0x3FE09BA5,0xE353F7CF, 0x3FE2478E,0x1FF4F0C9, + 0x3FE0A3D7,0x0A3D70A4, 0x3FE2526D,0x2FFBCD5E, + 0x3FE0AC08,0x3126E979, 0x3FE25D4F,0x705665BE, + 0x3FE0B439,0x5810624E, 0x3FE26834,0xE3D9ED7D, + 0x3FE0BC6A,0x7EF9DB23, 0x3FE2731D,0x8D5E19DA, + 0x3FE0C49B,0xA5E353F8, 0x3FE27E09,0x6FBD24ED, + 0x3FE0CCCC,0xCCCCCCCD, 0x3FE288F8,0x8DD3D0EA, + 0x3FE0D4FD,0xF3B645A2, 0x3FE293EA,0xEA816B5D, + 0x3FE0DD2F,0x1A9FBE77, 0x3FE29EE0,0x88A7D070, + 0x3FE0E560,0x4189374C, 0x3FE2A9D9,0x6B2B6E34, + 0x3FE0ED91,0x6872B021, 0x3FE2B4D5,0x94F347F1, + 0x3FE0F5C2,0x8F5C28F6, 0x3FE2BFD5,0x08E8F977, + 0x3FE0FDF3,0xB645A1CB, 0x3FE2CAD7,0xC9F8BA79, + 0x3FE10624,0xDD2F1AA0, 0x3FE2D5DD,0xDB1161E4, + 0x3FE10E56,0x04189375, 0x3FE2E0E7,0x3F246948, + 0x3FE11687,0x2B020C4A, 0x3FE2EBF3,0xF925F038, + 0x3FE11EB8,0x51EB851F, 0x3FE2F704,0x0C0CBFBA, + 0x3FE126E9,0x78D4FDF4, 0x3FE30217,0x7AD24DB4, + 0x3FE12F1A,0x9FBE76C9, 0x3FE30D2E,0x4872C063, + 0x3FE1374B,0xC6A7EF9E, 0x3FE31848,0x77ECF1D8, + 0x3FE13F7C,0xED916873, 0x3FE32366,0x0C427371, + 0x3FE147AE,0x147AE148, 0x3FE32E87,0x08779164, + 0x3FE14FDF,0x3B645A1D, 0x3FE339AB,0x6F935645, + 0x3FE15810,0x624DD2F2, 0x3FE344D3,0x449F8E97, + 0x3FE16041,0x89374BC7, 0x3FE34FFE,0x8AA8CC5F, + 0x3FE16872,0xB020C49C, 0x3FE35B2D,0x44BE6ABD, + 0x3FE170A3,0xD70A3D71, 0x3FE3665F,0x75F2918C, + 0x3FE178D4,0xFDF3B646, 0x3FE37195,0x215A3904, + 0x3FE18106,0x24DD2F1B, 0x3FE37CCE,0x4A0D2D66, + 0x3FE18937,0x4BC6A7F0, 0x3FE3880A,0xF32612A9, + 0x3FE19168,0x72B020C5, 0x3FE3934B,0x1FC2682D, + 0x3FE19999,0x9999999A, 0x3FE39E8E,0xD3028C79, + 0x3FE1A1CA,0xC083126F, 0x3FE3A9D6,0x1009C0F3, + 0x3FE1A9FB,0xE76C8B44, 0x3FE3B520,0xD9FE2DAD, + 0x3FE1B22D,0x0E560419, 0x3FE3C06F,0x3408E528, + 0x3FE1BA5E,0x353F7CEE, 0x3FE3CBC1,0x2155E829, + 0x3FE1C28F,0x5C28F5C3, 0x3FE3D716,0xA514298B, + 0x3FE1CAC0,0x83126E98, 0x3FE3E26F,0xC275921C, + 0x3FE1D2F1,0xA9FBE76D, 0x3FE3EDCC,0x7CAF047E, + 0x3FE1DB22,0xD0E56042, 0x3FE3F92C,0xD6F8610E, + 0x3FE1E353,0xF7CED917, 0x3FE40490,0xD48C89CE, + 0x3FE1EB85,0x1EB851EC, 0x3FE40FF8,0x78A9665B, + 0x3FE1F3B6,0x45A1CAC1, 0x3FE41B63,0xC68FE7E4, + 0x3FE1FBE7,0x6C8B4396, 0x3FE426D2,0xC1840D26, + 0x3FE20418,0x9374BC6A, 0x3FE43245,0x6CCCE673, + 0x3FE20C49,0xBA5E353F, 0x3FE43DBB,0xCBB499BE, + 0x3FE2147A,0xE147AE14, 0x3FE44935,0xE18866A6, + 0x3FE21CAC,0x083126E9, 0x3FE454B3,0xB198AA90, + 0x3FE224DD,0x2F1A9FBE, 0x3FE46035,0x3F38E4C2, + 0x3FE22D0E,0x56041893, 0x3FE46BBA,0x8DBFBA87, + 0x3FE2353F,0x7CED9168, 0x3FE47743,0xA086FB5A, + 0x3FE23D70,0xA3D70A3D, 0x3FE482D0,0x7AEBA510, + 0x3FE245A1,0xCAC08312, 0x3FE48E61,0x204DE812, + 0x3FE24DD2,0xF1A9FBE7, 0x3FE499F5,0x94112B97, + 0x3FE25604,0x189374BC, 0x3FE4A58D,0xD99C11E9, + 0x3FE25E35,0x3F7CED91, 0x3FE4B129,0xF4587CA9, + 0x3FE26666,0x66666666, 0x3FE4BCC9,0xE7B39125, + 0x3FE26E97,0x8D4FDF3B, 0x3FE4C86D,0xB71DBCA8, + 0x3FE276C8,0xB4395810, 0x3FE4D415,0x660AB8D9, + 0x3FE27EF9,0xDB22D0E5, 0x3FE4DFC0,0xF7F1901F, + 0x3FE2872B,0x020C49BA, 0x3FE4EB70,0x704CA20A, + 0x3FE28F5C,0x28F5C28F, 0x3FE4F723,0xD299A7C4, + 0x3FE2978D,0x4FDF3B64, 0x3FE502DB,0x2259B888, + 0x3FE29FBE,0x76C8B439, 0x3FE50E96,0x63114E21, + 0x3FE2A7EF,0x9DB22D0E, 0x3FE51A55,0x9848496E, + 0x3FE2B020,0xC49BA5E3, 0x3FE52618,0xC589F6EE, + 0x3FE2B851,0xEB851EB8, 0x3FE531DF,0xEE651356, + 0x3FE2C083,0x126E978D, 0x3FE53DAB,0x166BD028, + 0x3FE2C8B4,0x39581062, 0x3FE5497A,0x4133D856, + 0x3FE2D0E5,0x60418937, 0x3FE5554D,0x725654E8, + 0x3FE2D916,0x872B020C, 0x3FE56124,0xAD6FF1AF, + 0x3FE2E147,0xAE147AE1, 0x3FE56CFF,0xF620E1FA, + 0x3FE2E978,0xD4FDF3B6, 0x3FE578DF,0x500CE553, + 0x3FE2F1A9,0xFBE76C8B, 0x3FE584C2,0xBEDB4C46, + 0x3FE2F9DB,0x22D0E560, 0x3FE590AA,0x4636FD2D, + 0x3FE3020C,0x49BA5E35, 0x3FE59C95,0xE9CE7907, + 0x3FE30A3D,0x70A3D70A, 0x3FE5A885,0xAD53E04E, + 0x3FE3126E,0x978D4FDF, 0x3FE5B479,0x947CF7E0, + 0x3FE31A9F,0xBE76C8B4, 0x3FE5C071,0xA3032DE9, + 0x3FE322D0,0xE5604189, 0x3FE5CC6D,0xDCA39ED1, + 0x3FE32B02,0x0C49BA5E, 0x3FE5D86E,0x451F1A3D, + 0x3FE33333,0x33333333, 0x3FE5E472,0xE03A280C, + 0x3FE33B64,0x5A1CAC08, 0x3FE5F07B,0xB1BD0D64, + 0x3FE34395,0x810624DD, 0x3FE5FC88,0xBD73D1C3, + 0x3FE34BC6,0xA7EF9DB2, 0x3FE6089A,0x072E4418, + 0x3FE353F7,0xCED91687, 0x3FE614AF,0x92BFFFE6, + 0x3FE35C28,0xF5C28F5C, 0x3FE620C9,0x6400726E, + 0x3FE3645A,0x1CAC0831, 0x3FE62CE7,0x7ECADFDE, + 0x3FE36C8B,0x43958106, 0x3FE63909,0xE6FE6891, + 0x3FE374BC,0x6A7EF9DB, 0x3FE64530,0xA07E0E4D, + 0x3FE37CED,0x916872B0, 0x3FE6515B,0xAF30B98E, + 0x3FE3851E,0xB851EB85, 0x3FE65D8B,0x17013EDB, + 0x3FE38D4F,0xDF3B645A, 0x3FE669BE,0xDBDE6420, + 0x3FE39581,0x0624DD2F, 0x3FE675F7,0x01BAE614, + 0x3FE39DB2,0x2D0E5604, 0x3FE68233,0x8C8D7DA3, + 0x3FE3A5E3,0x53F7CED9, 0x3FE68E74,0x8050E566, + 0x3FE3AE14,0x7AE147AE, 0x3FE69AB9,0xE103DF1F, + 0x3FE3B645,0xA1CAC083, 0x3FE6A703,0xB2A9393F, + 0x3FE3BE76,0xC8B43958, 0x3FE6B351,0xF947D479, + 0x3FE3C6A7,0xEF9DB22D, 0x3FE6BFA4,0xB8EAA955, + 0x3FE3CED9,0x16872B02, 0x3FE6CBFB,0xF5A0CDD7, + 0x3FE3D70A,0x3D70A3D7, 0x3FE6D857,0xB37D7B26, + 0x3FE3DF3B,0x645A1CAC, 0x3FE6E4B7,0xF698133F, + 0x3FE3E76C,0x8B439581, 0x3FE6F11C,0xC30C26B2, + 0x3FE3EF9D,0xB22D0E56, 0x3FE6FD86,0x1CF97A6A, + 0x3FE3F7CE,0xD916872B, 0x3FE709F4,0x08840D78, + 0x3FE40000,0x00000000, 0x3FE71666,0x89D41EF0, + 0x3FE40831,0x26E978D5, 0x3FE722DD,0xA51633C4, + 0x3FE41062,0x4DD2F1AA, 0x3FE72F59,0x5E7B1CB8, + 0x3FE41893,0x74BC6A7F, 0x3FE73BD9,0xBA37FC4F, + 0x3FE420C4,0x9BA5E354, 0x3FE7485E,0xBC864CCE, + 0x3FE428F5,0xC28F5C29, 0x3FE754E8,0x69A3E641, + 0x3FE43126,0xE978D4FE, 0x3FE76176,0xC5D30490, + 0x3FE43958,0x10624DD3, 0x3FE76E09,0xD55A4D98, + 0x3FE44189,0x374BC6A8, 0x3FE77AA1,0x9C84D752, + 0x3FE449BA,0x5E353F7D, 0x3FE7873E,0x1FA22E03, + 0x3FE451EB,0x851EB852, 0x3FE793DF,0x63065A74, + 0x3FE45A1C,0xAC083127, 0x3FE7A085,0x6B09E838, + 0x3FE4624D,0xD2F1A9FC, 0x3FE7AD30,0x3C09EBF7, + 0x3FE46A7E,0xF9DB22D1, 0x3FE7B9DF,0xDA6809CB, + 0x3FE472B0,0x20C49BA6, 0x3FE7C694,0x4A8A7B9C, + 0x3FE47AE1,0x47AE147B, 0x3FE7D34D,0x90DC1794, + 0x3FE48312,0x6E978D50, 0x3FE7E00B,0xB1CC5692, + 0x3FE48B43,0x95810625, 0x3FE7ECCE,0xB1CF5AB0, + 0x3FE49374,0xBC6A7EFA, 0x3FE7F996,0x955DF5CC, + 0x3FE49BA5,0xE353F7CF, 0x3FE80663,0x60F5B022, + 0x3FE4A3D7,0x0A3D70A4, 0x3FE81335,0x1918CEEE, + 0x3FE4AC08,0x3126E979, 0x3FE8200B,0xC24E5B1B, + 0x3FE4B439,0x5810624E, 0x3FE82CE7,0x612227F9, + 0x3FE4BC6A,0x7EF9DB23, 0x3FE839C7,0xFA24DA03, + 0x3FE4C49B,0xA5E353F8, 0x3FE846AD,0x91EBEDAB, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FE85398,0x2D11BE39, + 0x3FE4D4FD,0xF3B645A2, 0x3FE86087,0xD0358CA9, + 0x3FE4DD2F,0x1A9FBE77, 0x3FE86D7C,0x7FFB86A5, + 0x3FE4E560,0x4189374C, 0x3FE87A76,0x410CCD79, + 0x3FE4ED91,0x6872B021, 0x3FE88775,0x18177D20, + 0x3FE4F5C2,0x8F5C28F6, 0x3FE89479,0x09CEB357, + 0x3FE4FDF3,0xB645A1CB, 0x3FE8A182,0x1AEA96BC, + 0x3FE50624,0xDD2F1AA0, 0x3FE8AE90,0x50285DF9, + 0x3FE50E56,0x04189375, 0x3FE8BBA3,0xAE4A56FB, + 0x3FE51687,0x2B020C4A, 0x3FE8C8BC,0x3A17EE38, + 0x3FE51EB8,0x51EB851F, 0x3FE8D5D9,0xF85DB5FD, + 0x3FE526E9,0x78D4FDF4, 0x3FE8E2FC,0xEDED6DC9, + 0x3FE52F1A,0x9FBE76C9, 0x3FE8F025,0x1F9E09B8, + 0x3FE5374B,0xC6A7EF9E, 0x3FE8FD52,0x924BB9F3, + 0x3FE53F7C,0xED916873, 0x3FE90A85,0x4AD7F238, + 0x3FE547AE,0x147AE148, 0x3FE917BD,0x4E297162, + 0x3FE54FDF,0x3B645A1D, 0x3FE924FA,0xA12C4906, + 0x3FE55810,0x624DD2F2, 0x3FE9323D,0x48D1E51B, + 0x3FE56041,0x89374BC7, 0x3FE93F85,0x4A1113AE, + 0x3FE56872,0xB020C49C, 0x3FE94CD2,0xA9E60CA2, + 0x3FE570A3,0xD70A3D71, 0x3FE95A25,0x6D527983, + 0x3FE578D4,0xFDF3B646, 0x3FE9677D,0x995D7D5B, + 0x3FE58106,0x24DD2F1B, 0x3FE974DB,0x3313BCA1, + 0x3FE58937,0x4BC6A7F0, 0x3FE9823E,0x3F87652F, + 0x3FE59168,0x72B020C5, 0x3FE98FA6,0xC3D03643, + 0x3FE59999,0x9999999A, 0x3FE99D14,0xC50B8893, + 0x3FE5A1CA,0xC083126F, 0x3FE9AA88,0x485C566E, + 0x3FE5A9FB,0xE76C8B44, 0x3FE9B801,0x52EB43E6, + 0x3FE5B22D,0x0E560419, 0x3FE9C57F,0xE9E6A710, + 0x3FE5BA5E,0x353F7CEE, 0x3FE9D304,0x1282904A, + 0x3FE5C28F,0x5C28F5C3, 0x3FE9E08D,0xD1F8D294, + 0x3FE5CAC0,0x83126E98, 0x3FE9EE1D,0x2D890BF7, + 0x3FE5D2F1,0xA9FBE76D, 0x3FE9FBB2,0x2A78ADF7, + 0x3FE5DB22,0xD0E56042, 0x3FEA094C,0xCE13061B, + 0x3FE5E353,0xF7CED917, 0x3FEA16ED,0x1DA9467A, + 0x3FE5EB85,0x1EB851EC, 0x3FEA2493,0x1E928E5D, + 0x3FE5F3B6,0x45A1CAC1, 0x3FEA323E,0xD62BF2F1, + 0x3FE5FBE7,0x6C8B4396, 0x3FEA3FF0,0x49D88802, + 0x3FE60418,0x9374BC6A, 0x3FEA4DA7,0x7F0168C8, + 0x3FE60C49,0xBA5E353F, 0x3FEA5B64,0x7B15C0CC, + 0x3FE6147A,0xE147AE14, 0x3FEA6927,0x438AD4C9, + 0x3FE61CAC,0x083126E9, 0x3FEA76EF,0xDDDC0BB0, + 0x3FE624DD,0x2F1A9FBE, 0x3FEA84BE,0x4F8AF7AD, + 0x3FE62D0E,0x56041893, 0x3FEA9292,0x9E1F5F49, + 0x3FE6353F,0x7CED9168, 0x3FEAA06C,0xCF274691, + 0x3FE63D70,0xA3D70A3D, 0x3FEAAE4C,0xE836F850, + 0x3FE645A1,0xCAC08312, 0x3FEABC32,0xEEE90F5D, + 0x3FE64DD2,0xF1A9FBE7, 0x3FEACA1E,0xE8DE7FF5, + 0x3FE65604,0x189374BC, 0x3FEAD810,0xDBBEA128, + 0x3FE65E35,0x3F7CED91, 0x3FEAE608,0xCD373653, + 0x3FE66666,0x66666666, 0x3FEAF406,0xC2FC78AE, + 0x3FE66E97,0x8D4FDF3B, 0x3FEB020A,0xC2C920EB, + 0x3FE676C8,0xB4395810, 0x3FEB1014,0xD25E70E4, + 0x3FE67EF9,0xDB22D0E5, 0x3FEB1E24,0xF7843D5A, + 0x3FE6872B,0x020C49BA, 0x3FEB2C3B,0x3808F7C5, + 0x3FE68F5C,0x28F5C28F, 0x3FEB3A57,0x99C1B83B, + 0x3FE6978D,0x4FDF3B64, 0x3FEB487A,0x228A475E, + 0x3FE69FBE,0x76C8B439, 0x3FEB56A2,0xD8452863, + 0x3FE6A7EF,0x9DB22D0E, 0x3FEB64D1,0xC0DBA32D, + 0x3FE6B020,0xC49BA5E3, 0x3FEB7306,0xE23DCE72, + 0x3FE6B851,0xEB851EB8, 0x3FEB8142,0x426299F4, + 0x3FE6C083,0x126E978D, 0x3FEB8F83,0xE747D8D7, + 0x3FE6C8B4,0x39581062, 0x3FEB9DCB,0xD6F24BF6, + 0x3FE6D0E5,0x60418937, 0x3FEBAC1A,0x176DAC5E, + 0x3FE6D916,0x872B020C, 0x3FEBBA6E,0xAECCB5CC, + 0x3FE6E147,0xAE147AE1, 0x3FEBC8C9,0xA329314A, + 0x3FE6E978,0xD4FDF3B6, 0x3FEBD72A,0xFAA3FFD7, + 0x3FE6F1A9,0xFBE76C8B, 0x3FEBE592,0xBB652523, + 0x3FE6F9DB,0x22D0E560, 0x3FEBF400,0xEB9BD264, + 0x3FE7020C,0x49BA5E35, 0x3FEC0275,0x917E7138, + 0x3FE70A3D,0x70A3D70A, 0x3FEC10F0,0xB34AAE9D, + 0x3FE7126E,0x978D4FDF, 0x3FEC1F72,0x574585FB, + 0x3FE71A9F,0xBE76C8B4, 0x3FEC2DFA,0x83BB4C49, + 0x3FE722D0,0xE5604189, 0x3FEC3C89,0x3EFFBB3B, + 0x3FE72B02,0x0C49BA5E, 0x3FEC4B1E,0x8F6DFC8D, + 0x3FE73333,0x33333333, 0x3FEC59BA,0x7B68B55E, + 0x3FE73B64,0x5A1CAC08, 0x3FEC685D,0x095A11A4, + 0x3FE74395,0x810624DD, 0x3FEC7706,0x3FB3CFAB, + 0x3FE74BC6,0xA7EF9DB2, 0x3FEC85B6,0x24EF4BB8, + 0x3FE753F7,0xCED91687, 0x3FEC946C,0xBF8D8BB3, + 0x3FE75C28,0xF5C28F5C, 0x3FECA32A,0x16174AEE, + 0x3FE7645A,0x1CAC0831, 0x3FECB1EE,0x2F1D05FE, + 0x3FE76C8B,0x43958106, 0x3FECC0B9,0x113706AD, + 0x3FE774BC,0x6A7EF9DB, 0x3FECCF8A,0xC3057001, + 0x3FE77CED,0x916872B0, 0x3FECDE63,0x4B304A52, + 0x3FE7851E,0xB851EB85, 0x3FECED42,0xB0678F85, + 0x3FE78D4F,0xDF3B645A, 0x3FECFC28,0xF963374B, + 0x3FE79581,0x0624DD2F, 0x3FED0B16,0x2CE34388, + 0x3FE79DB2,0x2D0E5604, 0x3FED1A0A,0x51AFCCC3, + 0x3FE7A5E3,0x53F7CED9, 0x3FED2905,0x6E990EB7, + 0x3FE7AE14,0x7AE147AE, 0x3FED3807,0x8A7774F3, + 0x3FE7B645,0xA1CAC083, 0x3FED4710,0xAC2BA799, + 0x3FE7BE76,0xC8B43958, 0x3FED5620,0xDA9E982C, + 0x3FE7C6A7,0xEF9DB22D, 0x3FED6538,0x1CC18E80, + 0x3FE7CED9,0x16872B02, 0x3FED7456,0x798E35B7, + 0x3FE7D70A,0x3D70A3D7, 0x3FED837B,0xF806A960, + 0x3FE7DF3B,0x645A1CAC, 0x3FED92A8,0x9F3582A4, + 0x3FE7E76C,0x8B439581, 0x3FEDA1DC,0x762DE599, + 0x3FE7EF9D,0xB22D0E56, 0x3FEDB117,0x840B8EA0, + 0x3FE7F7CE,0xD916872B, 0x3FEDC059,0xCFF2DFE2, + 0x3FE80000,0x00000000, 0x3FEDCFA3,0x6110EEEC, + 0x3FE80831,0x26E978D5, 0x3FEDDEF4,0x3E9B9257, + 0x3FE81062,0x4DD2F1AA, 0x3FEDEE4C,0x6FD16F97, + 0x3FE81893,0x74BC6A7F, 0x3FEDFDAB,0xFBFA08DB, + 0x3FE820C4,0x9BA5E354, 0x3FEE0D12,0xEA65CB0C, + 0x3FE828F5,0xC28F5C29, 0x3FEE1C81,0x426E1BE0, + 0x3FE83126,0xE978D4FE, 0x3FEE2BF7,0x0B756811, + 0x3FE83958,0x10624DD3, 0x3FEE3B74,0x4CE731A9, + 0x3FE84189,0x374BC6A8, 0x3FEE4AF9,0x0E381E65, + 0x3FE849BA,0x5E353F7D, 0x3FEE5A85,0x56E6063B, + 0x3FE851EB,0x851EB852, 0x3FEE6A19,0x2E7801FA, + 0x3FE85A1C,0xAC083127, 0x3FEE79B4,0x9C7E79FD, + 0x3FE8624D,0xD2F1A9FC, 0x3FEE8957,0xA8933509, + 0x3FE86A7E,0xF9DB22D1, 0x3FEE9902,0x5A596739, + 0x3FE872B0,0x20C49BA6, 0x3FEEA8B4,0xB97DC10D, + 0x3FE87AE1,0x47AE147B, 0x3FEEB86E,0xCDB67E96, + 0x3FE88312,0x6E978D50, 0x3FEEC830,0x9EC376BE, + 0x3FE88B43,0x95810625, 0x3FEED7FA,0x346E2AAB, + 0x3FE89374,0xBC6A7EFA, 0x3FEEE7CB,0x9689D542, + 0x3FE89BA5,0xE353F7CF, 0x3FEEF7A4,0xCCF37AC9, + 0x3FE8A3D7,0x0A3D70A4, 0x3FEF0785,0xDF91F8A0, + 0x3FE8AC08,0x3126E979, 0x3FEF176E,0xD6561520, + 0x3FE8B439,0x5810624E, 0x3FEF275F,0xB93A8F96, + 0x3FE8BC6A,0x7EF9DB23, 0x3FEF3758,0x9044305A, + 0x3FE8C49B,0xA5E353F8, 0x3FEF4759,0x6381D906, + 0x3FE8CCCC,0xCCCCCCCD, 0x3FEF5762,0x3B0C94D1, + 0x3FE8D4FD,0xF3B645A2, 0x3FEF6773,0x1F07A904, + 0x3FE8DD2F,0x1A9FBE77, 0x3FEF778C,0x17A0A58D, + 0x3FE8E560,0x4189374C, 0x3FEF87AD,0x2D0F75BC, + 0x3FE8ED91,0x6872B021, 0x3FEF97D6,0x67967113, + 0x3FE8F5C2,0x8F5C28F6, 0x3FEFA807,0xCF826C45, + 0x3FE8FDF3,0xB645A1CB, 0x3FEFB841,0x6D2ACA46, + 0x3FE90624,0xDD2F1AA0, 0x3FEFC883,0x48F18D8C, + 0x3FE90E56,0x04189375, 0x3FEFD8CD,0x6B436967, + 0x3FE91687,0x2B020C4A, 0x3FEFE91F,0xDC97D37E, + 0x3FE91EB8,0x51EB851F, 0x3FEFF97A,0xA571156E, + 0x3FE926E9,0x78D4FDF4, 0x3FF004EE,0xE72E2F47, + 0x3FE92F1A,0x9FBE76C9, 0x3FF00D24,0xAFF8EAE6, + 0x3FE9374B,0xC6A7EF9E, 0x3FF0155E,0xB16A55E2, + 0x3FE93F7C,0xED916873, 0x3FF01D9C,0xEFD9966A, + 0x3FE947AE,0x147AE148, 0x3FF025DF,0x6FA369BF, + 0x3FE94FDF,0x3B645A1D, 0x3FF02E26,0x352A2D6A, + 0x3FE95810,0x624DD2F2, 0x3FF03671,0x44D5E886, + 0x3FE96041,0x89374BC7, 0x3FF03EC0,0xA314551D, + 0x3FE96872,0xB020C49C, 0x3FF04714,0x5458E99B, + 0x3FE970A3,0xD70A3D71, 0x3FF04F6C,0x5D1CE251, + 0x3FE978D4,0xFDF3B646, 0x3FF057C8,0xC1DF4B06, + 0x3FE98106,0x24DD2F1B, 0x3FF06029,0x872508A5, + 0x3FE98937,0x4BC6A7F0, 0x3FF0688E,0xB178E2F5, + 0x3FE99168,0x72B020C5, 0x3FF070F8,0x456B8E6B, + 0x3FE99999,0x9999999A, 0x3FF07966,0x4793B60B, + 0x3FE9A1CA,0xC083126F, 0x3FF081D8,0xBC8E055D, + 0x3FE9A9FB,0xE76C8B44, 0x3FF08A4F,0xA8FD327A, + 0x3FE9B22D,0x0E560419, 0x3FF092CB,0x118A0829, + 0x3FE9BA5E,0x353F7CEE, 0x3FF09B4A,0xFAE37011, + 0x3FE9C28F,0x5C28F5C3, 0x3FF0A3CF,0x69BE7D01, + 0x3FE9CAC0,0x83126E98, 0x3FF0AC58,0x62D67549, + 0x3FE9D2F1,0xA9FBE76D, 0x3FF0B4E5,0xEAECDD2E, + 0x3FE9DB22,0xD0E56042, 0x3FF0BD78,0x06C9816D, + 0x3FE9E353,0xF7CED917, 0x3FF0C60E,0xBB3A81D5, + 0x3FE9EB85,0x1EB851EC, 0x3FF0CEAA,0x0D145BF9, + 0x3FE9F3B6,0x45A1CAC1, 0x3FF0D74A,0x0131F5F4, + 0x3FE9FBE7,0x6C8B4396, 0x3FF0DFEE,0x9C74A944, + 0x3FEA0418,0x9374BC6A, 0x3FF0E897,0xE3C44DB9, + 0x3FEA0C49,0xBA5E353F, 0x3FF0F145,0xDC0F4484, + 0x3FEA147A,0xE147AE14, 0x3FF0F9F8,0x8A4A834B, + 0x3FEA1CAC,0x083126E9, 0x3FF102AF,0xF3719F65, + 0x3FEA24DD,0x2F1A9FBE, 0x3FF10B6C,0x1C86D920, + 0x3FEA2D0E,0x56041893, 0x3FF1142D,0x0A932724, + 0x3FEA353F,0x7CED9168, 0x3FF11CF2,0xC2A641F1, + 0x3FEA3D70,0xA3D70A3D, 0x3FF125BD,0x49D6AF6A, + 0x3FEA45A1,0xCAC08312, 0x3FF12E8C,0xA541CE7E, + 0x3FEA4DD2,0xF1A9FBE7, 0x3FF13760,0xDA0BE2EE, + 0x3FEA5604,0x189374BC, 0x3FF14039,0xED60211D, + 0x3FEA5E35,0x3F7CED91, 0x3FF14917,0xE470BA09, + 0x3FEA6666,0x66666666, 0x3FF151FA,0xC476E74D, + 0x3FEA6E97,0x8D4FDF3B, 0x3FF15AE2,0x92B2F74A, + 0x3FEA76C8,0xB4395810, 0x3FF163CF,0x546C595C, + 0x3FEA7EF9,0xDB22D0E5, 0x3FF16CC1,0x0EF1AA33, + 0x3FEA872B,0x020C49BA, 0x3FF175B7,0xC798C03D, + 0x3FEA8F5C,0x28F5C28F, 0x3FF17EB3,0x83BEB831, + 0x3FEA978D,0x4FDF3B64, 0x3FF187B4,0x48C801B0, + 0x3FEA9FBE,0x76C8B439, 0x3FF190BA,0x1C206BFF, + 0x3FEAA7EF,0x9DB22D0E, 0x3FF199C5,0x033B32DE, + 0x3FEAB020,0xC49BA5E3, 0x3FF1A2D5,0x03930B7A, + 0x3FEAB851,0xEB851EB8, 0x3FF1ABEA,0x22AA317A, + 0x3FEAC083,0x126E978D, 0x3FF1B504,0x660A7423, + 0x3FEAC8B4,0x39581062, 0x3FF1BE23,0xD345439D, + 0x3FEAD0E5,0x60418937, 0x3FF1C748,0x6FF3BE53, + 0x3FEAD916,0x872B020C, 0x3FF1D072,0x41B6BE68, + 0x3FEAE147,0xAE147AE1, 0x3FF1D9A1,0x4E36E755, + 0x3FEAE978,0xD4FDF3B6, 0x3FF1E2D5,0x9B24B399, + 0x3FEAF1A9,0xFBE76C8B, 0x3FF1EC0F,0x2E388287, + 0x3FEAF9DB,0x22D0E560, 0x3FF1F54E,0x0D32A638, + 0x3FEB020C,0x49BA5E35, 0x3FF1FE92,0x3DDB7193, + 0x3FEB0A3D,0x70A3D70A, 0x3FF207DB,0xC6034677, + 0x3FEB126E,0x978D4FDF, 0x3FF2112A,0xAB82A3FF, + 0x3FEB1A9F,0xBE76C8B4, 0x3FF21A7E,0xF43A34EA, + 0x3FEB22D0,0xE5604189, 0x3FF223D8,0xA612DE1C, + 0x3FEB2B02,0x0C49BA5E, 0x3FF22D37,0xC6FDCD41, + 0x3FEB3333,0x33333333, 0x3FF2369C,0x5CF4878D, + 0x3FEB3B64,0x5A1CAC08, 0x3FF24006,0x6DF8F8A1, + 0x3FEB4395,0x810624DD, 0x3FF24976,0x00158186, + 0x3FEB4BC6,0xA7EF9DB2, 0x3FF252EB,0x195D07D1, + 0x3FEB53F7,0xCED91687, 0x3FF25C65,0xBFEB04E2, + 0x3FEB5C28,0xF5C28F5C, 0x3FF265E5,0xF9E39549, + 0x3FEB645A,0x1CAC0831, 0x3FF26F6B,0xCD738845, + 0x3FEB6C8B,0x43958106, 0x3FF278F7,0x40D06F6A, + 0x3FEB74BC,0x6A7EF9DB, 0x3FF28288,0x5A38AE65, + 0x3FEB7CED,0x916872B0, 0x3FF28C1F,0x1FF38AE8, + 0x3FEB851E,0xB851EB85, 0x3FF295BB,0x98513CAD, + 0x3FEB8D4F,0xDF3B645A, 0x3FF29F5D,0xC9AAFDAC, + 0x3FEB9581,0x0624DD2F, 0x3FF2A905,0xBA631A61, + 0x3FEB9DB2,0x2D0E5604, 0x3FF2B2B3,0x70E50246, + 0x3FEBA5E3,0x53F7CED9, 0x3FF2BC66,0xF3A55868, + 0x3FEBAE14,0x7AE147AE, 0x3FF2C620,0x49220420, + 0x3FEBB645,0xA1CAC083, 0x3FF2CFDF,0x77E241F7, + 0x3FEBBE76,0xC8B43958, 0x3FF2D9A4,0x8676B4A3, + 0x3FEBC6A7,0xEF9DB22D, 0x3FF2E36F,0x7B797639, + 0x3FEBCED9,0x16872B02, 0x3FF2ED40,0x5D8E2973, + 0x3FEBD70A,0x3D70A3D7, 0x3FF2F717,0x33620B2C, + 0x3FEBDF3B,0x645A1CAC, 0x3FF300F4,0x03AC03F8, + 0x3FEBE76C,0x8B439581, 0x3FF30AD6,0xD52CB9E5, + 0x3FEBEF9D,0xB22D0E56, 0x3FF314BF,0xAEAEA264, + 0x3FEBF7CE,0xD916872B, 0x3FF31EAE,0x9706145C, + 0x3FEC0000,0x00000000, 0x3FF328A3,0x95115A5E, + 0x3FEC0831,0x26E978D5, 0x3FF3329E,0xAFB8C508, + 0x3FEC1062,0x4DD2F1AA, 0x3FF33C9F,0xEDEEBD8E, + 0x3FEC1893,0x74BC6A7F, 0x3FF346A7,0x56AFD869, + 0x3FEC20C4,0x9BA5E354, 0x3FF350B4,0xF102E838, + 0x3FEC28F5,0xC28F5C29, 0x3FF35AC8,0xC3F910BF, + 0x3FEC3126,0xE978D4FE, 0x3FF364E2,0xD6ADDA1D, + 0x3FEC3958,0x10624DD3, 0x3FF36F03,0x30474420, + 0x3FEC4189,0x374BC6A8, 0x3FF37929,0xD7F5D9D1, + 0x3FEC49BA,0x5E353F7D, 0x3FF38356,0xD4F4C522, + 0x3FEC51EB,0x851EB852, 0x3FF38D8A,0x2E89E2C9, + 0x3FEC5A1C,0xAC083127, 0x3FF397C3,0xEC05D651, + 0x3FEC624D,0xD2F1A9FC, 0x3FF3A204,0x14C41E4A, + 0x3FEC6A7E,0xF9DB22D1, 0x3FF3AC4A,0xB02B28B1, + 0x3FEC72B0,0x20C49BA6, 0x3FF3B697,0xC5AC6780, + 0x3FEC7AE1,0x47AE147B, 0x3FF3C0EB,0x5CC46571, + 0x3FEC8312,0x6E978D50, 0x3FF3CB45,0x7CFADAED, + 0x3FEC8B43,0x95810625, 0x3FF3D5A6,0x2DE2C329, + 0x3FEC9374,0xBC6A7EFA, 0x3FF3E00D,0x771A7177, + 0x3FEC9BA5,0xE353F7CF, 0x3FF3EA7B,0x604BA6C3, + 0x3FECA3D7,0x0A3D70A4, 0x3FF3F4EF,0xF12BA744, + 0x3FECAC08,0x3126E979, 0x3FF3FF6B,0x317B505E, + 0x3FECB439,0x5810624E, 0x3FF409ED,0x29072EB4, + 0x3FECBC6A,0x7EF9DB23, 0x3FF41475,0xDFA7946B, + 0x3FECC49B,0xA5E353F8, 0x3FF41F05,0x5D40AFA9, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF4299B,0xA9C2A138, + 0x3FECD4FD,0xF3B645A2, 0x3FF43438,0xCD29936D, + 0x3FECDD2F,0x1A9FBE77, 0x3FF43EDC,0xCF7DD138, + 0x3FECE560,0x4189374C, 0x3FF44987,0xB8D3DD6F, + 0x3FECED91,0x6872B021, 0x3FF45439,0x914C8A4D, + 0x3FECF5C2,0x8F5C28F6, 0x3FF45EF2,0x61151124, + 0x3FECFDF3,0xB645A1CB, 0x3FF469B2,0x30672A4F, + 0x3FED0624,0xDD2F1AA0, 0x3FF47479,0x0789254D, + 0x3FED0E56,0x04189375, 0x3FF47F46,0xEECE0123, + 0x3FED1687,0x2B020C4A, 0x3FF48A1B,0xEE9584EB, + 0x3FED1EB8,0x51EB851F, 0x3FF494F8,0x0F4C58A5, + 0x3FED26E9,0x78D4FDF4, 0x3FF49FDB,0x596C1E38, + 0x3FED2F1A,0x9FBE76C9, 0x3FF4AAC5,0xD57B8AB6, + 0x3FED374B,0xC6A7EF9E, 0x3FF4B5B7,0x8C0E7FD6, + 0x3FED3F7C,0xED916873, 0x3FF4C0B0,0x85C625AE, + 0x3FED47AE,0x147AE148, 0x3FF4CBB0,0xCB5104A3, + 0x3FED4FDF,0x3B645A1D, 0x3FF4D6B8,0x656B1F99, + 0x3FED5810,0x624DD2F2, 0x3FF4E1C7,0x5CDE0E65, + 0x3FED6041,0x89374BC7, 0x3FF4ECDD,0xBA811873, + 0x3FED6872,0xB020C49C, 0x3FF4F7FB,0x87394FB5, + 0x3FED70A3,0xD70A3D71, 0x3FF50320,0xCBF9ABCC, + 0x3FED78D4,0xFDF3B646, 0x3FF50E4D,0x91C32570, + 0x3FED8106,0x24DD2F1B, 0x3FF51981,0xE1A4D220, + 0x3FED8937,0x4BC6A7F0, 0x3FF524BD,0xC4BC000B, + 0x3FED9168,0x72B020C5, 0x3FF53001,0x4434523D, + 0x3FED9999,0x9999999A, 0x3FF53B4C,0x6947DD19, + 0x3FEDA1CA,0xC083126F, 0x3FF5469F,0x3D3F4306, + 0x3FEDA9FB,0xE76C8B44, 0x3FF551F9,0xC971D170, + 0x3FEDB22D,0x0E560419, 0x3FF55D5C,0x17459E02, + 0x3FEDBA5E,0x353F7CEE, 0x3FF568C6,0x302FA431, + 0x3FEDC28F,0x5C28F5C3, 0x3FF57438,0x1DB3E303, + 0x3FEDCAC0,0x83126E98, 0x3FF57FB1,0xE9657B27, + 0x3FEDD2F1,0xA9FBE76D, 0x3FF58B33,0x9CE6CD4D, + 0x3FEDDB22,0xD0E56042, 0x3FF596BD,0x41E998CF, + 0x3FEDE353,0xF7CED917, 0x3FF5A24E,0xE22F1A9E, + 0x3FEDEB85,0x1EB851EC, 0x3FF5ADE8,0x87882C79, + 0x3FEDF3B6,0x45A1CAC1, 0x3FF5B98A,0x3BD5647A, + 0x3FEDFBE7,0x6C8B4396, 0x3FF5C534,0x090734DD, + 0x3FEE0418,0x9374BC6A, 0x3FF5D0E5,0xF91E0C29, + 0x3FEE0C49,0xBA5E353F, 0x3FF5DCA0,0x162A7597, + 0x3FEE147A,0xE147AE14, 0x3FF5E862,0x6A4D39CE, + 0x3FEE1CAC,0x083126E9, 0x3FF5F42C,0xFFB77FEF, + 0x3FEE24DD,0x2F1A9FBE, 0x3FF5FFFF,0xE0AAEEF5, + 0x3FEE2D0E,0x56041893, 0x3FF60BDB,0x1779CF5C, + 0x3FEE353F,0x7CED9168, 0x3FF617BE,0xAE872D27, + 0x3FEE3D70,0xA3D70A3D, 0x3FF623AA,0xB046FA33, + 0x3FEE45A1,0xCAC08312, 0x3FF62F9F,0x273E30DA, + 0x3FEE4DD2,0xF1A9FBE7, 0x3FF63B9C,0x1E02F6F9, + 0x3FEE5604,0x189374BC, 0x3FF647A1,0x9F3CC13D, + 0x3FEE5E35,0x3F7CED91, 0x3FF653AF,0xB5A476D1, + 0x3FEE6666,0x66666666, 0x3FF65FC6,0x6C04955F, + 0x3FEE6E97,0x8D4FDF3B, 0x3FF66BE5,0xCD39556F, + 0x3FEE76C8,0xB4395810, 0x3FF6780D,0xE430CF1D, + 0x3FEE7EF9,0xDB22D0E5, 0x3FF6843E,0xBBEB1F29, + 0x3FEE872B,0x020C49BA, 0x3FF69078,0x5F7A8C68, + 0x3FEE8F5C,0x28F5C28F, 0x3FF69CBA,0xDA03AD8D, + 0x3FEE978D,0x4FDF3B64, 0x3FF6A906,0x36BD8F54, + 0x3FEE9FBE,0x76C8B439, 0x3FF6B55A,0x80F1DB0C, + 0x3FEEA7EF,0x9DB22D0E, 0x3FF6C1B7,0xC3FCFD81, + 0x3FEEB020,0xC49BA5E3, 0x3FF6CE1E,0x0B4E4E46, + 0x3FEEB851,0xEB851EB8, 0x3FF6DA8D,0x62683765, + 0x3FEEC083,0x126E978D, 0x3FF6E705,0xD4E05D6F, + 0x3FEEC8B4,0x39581062, 0x3FF6F387,0x6E5FC7F9, + 0x3FEED0E5,0x60418937, 0x3FF70012,0x3AA30A73, + 0x3FEED916,0x872B020C, 0x3FF70CA6,0x457A6D70, + 0x3FEEE147,0xAE147AE1, 0x3FF71943,0x9ACA1855, + 0x3FEEE978,0xD4FDF3B6, 0x3FF725EA,0x468A3B70, + 0x3FEEF1A9,0xFBE76C8B, 0x3FF7329A,0x54C73A77, + 0x3FEEF9DB,0x22D0E560, 0x3FF73F53,0xD1A1D77C, + 0x3FEF020C,0x49BA5E35, 0x3FF74C16,0xC94F5E46, + 0x3FEF0A3D,0x70A3D70A, 0x3FF758E3,0x4819D01E, + 0x3FEF126E,0x978D4FDF, 0x3FF765B9,0x5A601009, + 0x3FEF1A9F,0xBE76C8B4, 0x3FF77299,0x0C960F77, + 0x3FEF22D0,0xE5604189, 0x3FF77F82,0x6B44FB5F, + 0x3FEF2B02,0x0C49BA5E, 0x3FF78C75,0x830B69D7, + 0x3FEF3333,0x33333333, 0x3FF79972,0x609D881A, + 0x3FEF3B64,0x5A1CAC08, 0x3FF7A679,0x10C54907, + 0x3FEF4395,0x810624DD, 0x3FF7B389,0xA0629420, + 0x3FEF4BC6,0xA7EF9DB2, 0x3FF7C0A4,0x1C6B74F2, + 0x3FEF53F7,0xCED91687, 0x3FF7CDC8,0x91EC4B0A, + 0x3FEF5C28,0xF5C28F5C, 0x3FF7DAF7,0x0E07FA5D, + 0x3FEF645A,0x1CAC0831, 0x3FF7E82F,0x9DF81C2B, + 0x3FEF6C8B,0x43958106, 0x3FF7F572,0x4F0D306E, + 0x3FEF74BC,0x6A7EF9DB, 0x3FF802BF,0x2EAECFBA, + 0x3FEF7CED,0x916872B0, 0x3FF81016,0x4A5BDDAF, + 0x3FEF851E,0xB851EB85, 0x3FF81D77,0xAFAABBE4, + 0x3FEF8D4F,0xDF3B645A, 0x3FF82AE3,0x6C497D5E, + 0x3FEF9581,0x0624DD2F, 0x3FF83859,0x8DFE1A8A, + 0x3FEF9DB2,0x2D0E5604, 0x3FF845DA,0x22A6A5C3, + 0x3FEFA5E3,0x53F7CED9, 0x3FF85365,0x38398065, + 0x3FEFAE14,0x7AE147AE, 0x3FF860FA,0xDCC59064, + 0x3FEFB645,0xA1CAC083, 0x3FF86E9B,0x1E727679, + 0x3FEFBE76,0xC8B43958, 0x3FF87C46,0x0B80C4DB, + 0x3FEFC6A7,0xEF9DB22D, 0x3FF889FB,0xB24A368C, + 0x3FEFCED9,0x16872B02, 0x3FF897BC,0x2141E735, + 0x3FEFD70A,0x3D70A3D7, 0x3FF8A587,0x66F48B9B, + 0x3FEFDF3B,0x645A1CAC, 0x3FF8B35D,0x9208AAA9, + 0x3FEFE76C,0x8B439581, 0x3FF8C13E,0xB13ED714, + 0x3FEFEF9D,0xB22D0E56, 0x3FF8CF2A,0xD371E995, + 0x3FEFF7CE,0xD916872B, 0x3FF8DD22,0x07973BCA, + 0x3FF00000,0x00000000, 0x3FF8EB24,0x5CBEE3A6, + 0x3FF00418,0x9374BC6A, 0x3FF8F931,0xE213EF8D, + 0x3FF00831,0x26E978D5, 0x3FF9074A,0xA6DCA317, + 0x3FF00C49,0xBA5E353F, 0x3FF9156E,0xBA7AB45C, + 0x3FF01062,0x4DD2F1AA, 0x3FF9239E,0x2C6B8A10, + 0x3FF0147A,0xE147AE14, 0x3FF931D9,0x0C487A1C, + 0x3FF01893,0x74BC6A7F, 0x3FF9401F,0x69C70909, + 0x3FF01CAC,0x083126E9, 0x3FF94E71,0x54B929F1, + 0x3FF020C4,0x9BA5E354, 0x3FF95CCE,0xDD0D7F4C, + 0x3FF024DD,0x2F1A9FBE, 0x3FF96B38,0x12CF9C33, + 0x3FF028F5,0xC28F5C29, 0x3FF979AD,0x0628469C, + 0x3FF02D0E,0x56041893, 0x3FF9882D,0xC75DBA05, + 0x3FF03126,0xE978D4FE, 0x3FF996BA,0x66D3EB15, + 0x3FF0353F,0x7CED9168, 0x3FF9A552,0xF50CCBC0, + 0x3FF03958,0x10624DD3, 0x3FF9B3F7,0x82A8905D, + 0x3FF03D70,0xA3D70A3D, 0x3FF9C2A8,0x2065F540, + 0x3FF04189,0x374BC6A8, 0x3FF9D164,0xDF228554, + 0x3FF045A1,0xCAC08312, 0x3FF9E02D,0xCFDAE13D, + 0x3FF049BA,0x5E353F7D, 0x3FF9EF03,0x03AB0771, + 0x3FF04DD2,0xF1A9FBE7, 0x3FF9FDE4,0x8BCE9CF0, + 0x3FF051EB,0x851EB852, 0x3FFA0CD2,0x79A136F0, + 0x3FF05604,0x189374BC, 0x3FFA1BCC,0xDE9EA52B, + 0x3FF05A1C,0xAC083127, 0x3FFA2AD3,0xCC633D2C, + 0x3FF05E35,0x3F7CED91, 0x3FFA39E7,0x54AC263A, + 0x3FF0624D,0xD2F1A9FC, 0x3FFA4907,0x8957A654, + 0x3FF06666,0x66666666, 0x3FFA5834,0x7C656FC7, + 0x3FF06A7E,0xF9DB22D1, 0x3FFA676E,0x3FF6EFDF, + 0x3FF06E97,0x8D4FDF3B, 0x3FFA76B4,0xE64F9E32, + 0x3FF072B0,0x20C49BA6, 0x3FFA8608,0x81D54D12, + 0x3FF076C8,0xB4395810, 0x3FFA9569,0x25107A9E, + 0x3FF07AE1,0x47AE147B, 0x3FFAA4D6,0xE2ACA2FD, + 0x3FF07EF9,0xDB22D0E5, 0x3FFAB451,0xCD78933E, + 0x3FF08312,0x6E978D50, 0x3FFAC3D9,0xF866BD6A, + 0x3FF0872B,0x020C49BA, 0x3FFAD36F,0x768D8D41, + 0x3FF08B43,0x95810625, 0x3FFAE312,0x5B27BE2F, + 0x3FF08F5C,0x28F5C28F, 0x3FFAF2C2,0xB994B1EF, + 0x3FF09374,0xBC6A7EFA, 0x3FFB0280,0xA558C872, + 0x3FF0978D,0x4FDF3B64, 0x3FFB124C,0x321DB876, + 0x3FF09BA5,0xE353F7CF, 0x3FFB2225,0x73B2E96B, + 0x3FF09FBE,0x76C8B439, 0x3FFB320C,0x7E0DCE0C, + 0x3FF0A3D7,0x0A3D70A4, 0x3FFB4201,0x654A404D, + 0x3FF0A7EF,0x9DB22D0E, 0x3FFB5204,0x3DAADE06, + 0x3FF0AC08,0x3126E979, 0x3FFB6215,0x1B9966F8, + 0x3FF0B020,0xC49BA5E3, 0x3FFB7234,0x13A71B98, + 0x3FF0B439,0x5810624E, 0x3FFB8261,0x3A8D1D37, + 0x3FF0B851,0xEB851EB8, 0x3FFB929C,0xA52CCEFB, + 0x3FF0BC6A,0x7EF9DB23, 0x3FFBA2E6,0x68903840, + 0x3FF0C083,0x126E978D, 0x3FFBB33E,0x99EA67C9, + 0x3FF0C49B,0xA5E353F8, 0x3FFBC3A5,0x4E97D862, + 0x3FF0C8B4,0x39581062, 0x3FFBD41A,0x9C1ED667, + 0x3FF0CCCC,0xCCCCCCCD, 0x3FFBE49E,0x982FE6AF, + 0x3FF0D0E5,0x60418937, 0x3FFBF531,0x58A62E72, + 0x3FF0D4FD,0xF3B645A2, 0x3FFC05D2,0xF387DC99, + 0x3FF0D916,0x872B020C, 0x3FFC1683,0x7F069411, + 0x3FF0DD2F,0x1A9FBE77, 0x3FFC2743,0x117FD78D, + 0x3FF0E147,0xAE147AE1, 0x3FFC3811,0xC17D7652, + 0x3FF0E560,0x4189374C, 0x3FFC48EF,0xA5B5FA8A, + 0x3FF0E978,0xD4FDF3B6, 0x3FFC59DC,0xD50D1894, + 0x3FF0ED91,0x6872B021, 0x3FFC6AD9,0x66941FEF, + 0x3FF0F1A9,0xFBE76C8B, 0x3FFC7BE5,0x718A6D2F, + 0x3FF0F5C2,0x8F5C28F6, 0x3FFC8D01,0x0D5DDD90, + 0x3FF0F9DB,0x22D0E560, 0x3FFC9E2C,0x51AB439E, + 0x3FF0FDF3,0xB645A1CB, 0x3FFCAF67,0x563EDD7E, + 0x3FF1020C,0x49BA5E35, 0x3FFCC0B2,0x3314CC67, + 0x3FF10624,0xDD2F1AA0, 0x3FFCD20D,0x00598DB4, + 0x3FF10A3D,0x70A3D70A, 0x3FFCE377,0xD66A7535, + 0x3FF10E56,0x04189375, 0x3FFCF4F2,0xCDD6292B, + 0x3FF1126E,0x978D4FDF, 0x3FFD067D,0xFF5D1F81, + 0x3FF11687,0x2B020C4A, 0x3FFD1819,0x83F21CC6, + 0x3FF11A9F,0xBE76C8B4, 0x3FFD29C5,0x74BAB466, + 0x3FF11EB8,0x51EB851F, 0x3FFD3B81,0xEB0FCAB1, + 0x3FF122D0,0xE5604189, 0x3FFD4D4F,0x007E182F, + 0x3FF126E9,0x78D4FDF4, 0x3FFD5F2C,0xCEC6AEC9, + 0x3FF12B02,0x0C49BA5E, 0x3FFD711B,0x6FDF804E, + 0x3FF12F1A,0x9FBE76C9, 0x3FFD831A,0xFDF3E6DA, + 0x3FF13333,0x33333333, 0x3FFD952B,0x93652E99, + 0x3FF1374B,0xC6A7EF9E, 0x3FFDA74D,0x4ACB2185, + 0x3FF13B64,0x5A1CAC08, 0x3FFDB980,0x3EF49488, + 0x3FF13F7C,0xED916873, 0x3FFDCBC4,0x8AE7F6A5, + 0x3FF14395,0x810624DD, 0x3FFDDE1A,0x49E3E18E, + 0x3FF147AE,0x147AE148, 0x3FFDF081,0x975FAC51, + 0x3FF14BC6,0xA7EF9DB2, 0x3FFE02FA,0x8F0BFF84, + 0x3FF14FDF,0x3B645A1D, 0x3FFE1585,0x4CD36B87, + 0x3FF153F7,0xCED91687, 0x3FFE2821,0xECDB005E, + 0x3FF15810,0x624DD2F2, 0x3FFE3AD0,0x8B82E7B1, + 0x3FF15C28,0xF5C28F5C, 0x3FFE4D91,0x45670063, + 0x3FF16041,0x89374BC7, 0x3FFE6064,0x375F7C69, + 0x3FF1645A,0x1CAC0831, 0x3FFE7349,0x7E818049, + 0x3FF16872,0xB020C49C, 0x3FFE8641,0x381FC4D8, + 0x3FF16C8B,0x43958106, 0x3FFE994B,0x81CB3ABD, + 0x3FF170A3,0xD70A3D71, 0x3FFEAC68,0x7953B03F, + 0x3FF174BC,0x6A7EF9DB, 0x3FFEBF98,0x3CC878DF, + 0x3FF178D4,0xFDF3B646, 0x3FFED2DA,0xEA791759, + 0x3FF17CED,0x916872B0, 0x3FFEE630,0xA0F5E974, + 0x3FF18106,0x24DD2F1B, 0x3FFEF999,0x7F10D655, + 0x3FF1851E,0xB851EB85, 0x3FFF0D15,0xA3DDFEA9, + 0x3FF18937,0x4BC6A7F0, 0x3FFF20A5,0x2EB46F5F, + 0x3FF18D4F,0xDF3B645A, 0x3FFF3448,0x3F2ED658, + 0x3FF19168,0x72B020C5, 0x3FFF47FE,0xF52C39AB, + 0x3FF19581,0x0624DD2F, 0x3FFF5BC9,0x70D0B0F5, + 0x3FF19999,0x9999999A, 0x3FFF6FA7,0xD286214E, + 0x3FF19DB2,0x2D0E5604, 0x3FFF839A,0x3AFCFB5D, + 0x3FF1A1CA,0xC083126F, 0x3FFF97A0,0xCB2CFC21, + 0x3FF1A5E3,0x53F7CED9, 0x3FFFABBB,0xA455EFEE, + 0x3FF1A9FB,0xE76C8B44, 0x3FFFBFEA,0xE800782E, + 0x3FF1AE14,0x7AE147AE, 0x3FFFD42E,0xB7FED370, + 0x3FF1B22D,0x0E560419, 0x3FFFE887,0x366DA849, + 0x3FF1B645,0xA1CAC083, 0x3FFFFCF4,0x85B4D293, + 0x3FF1BA5E,0x353F7CEE, 0x400008BB,0x644419CE, + 0x3FF1BE76,0xC8B43958, 0x40001307,0x10F44261, + 0x3FF1C28F,0x5C28F5C3, 0x40001D5D,0x5A92168C, + 0x3FF1C6A7,0xEF9DB22D, 0x400027BE,0x52EC0CBF, + 0x3FF1CAC0,0x83126E98, 0x4000322A,0x0BF84BF6, + 0x3FF1CED9,0x16872B02, 0x40003CA0,0x97D51AA2, + 0x3FF1D2F1,0xA9FBE76D, 0x40004722,0x08C94F2B, + 0x3FF1D70A,0x3D70A3D7, 0x400051AE,0x7144C1CC, + 0x3FF1DB22,0xD0E56042, 0x40005C45,0xE3E0C018, + 0x3FF1DF3B,0x645A1CAC, 0x400066E8,0x736081D4, + 0x3FF1E353,0xF7CED917, 0x40007196,0x32B19F91, + 0x3FF1E76C,0x8B439581, 0x40007C4F,0x34EC8AA9, + 0x3FF1EB85,0x1EB851EC, 0x40008713,0x8D550704, + 0x3FF1EF9D,0xB22D0E56, 0x400091E3,0x4F5AA64E, + 0x3FF1F3B6,0x45A1CAC1, 0x40009CBE,0x8E9944FF, + 0x3FF1F7CE,0xD916872B, 0x4000A7A5,0x5ED988E5, + 0x3FF1FBE7,0x6C8B4396, 0x4000B297,0xD411618C, + 0x3FF20000,0x00000000, 0x4000BD96,0x02648A36, + 0x3FF20418,0x9374BC6A, 0x4000C89F,0xFE250DBC, + 0x3FF20831,0x26E978D5, 0x4000D3B5,0xDBD3CC1A, + 0x3FF20C49,0xBA5E353F, 0x4000DED7,0xB02101CD, + 0x3FF21062,0x4DD2F1AA, 0x4000EA05,0x8FECD124, + 0x3FF2147A,0xE147AE14, 0x4000F53F,0x9047CD42, + 0x3FF21893,0x74BC6A7F, 0x40010085,0xC6738737, + 0x3FF21CAC,0x083126E9, 0x40010BD8,0x47E31CD3, + 0x3FF220C4,0x9BA5E354, 0x40011737,0x2A3BC9A4, + 0x3FF224DD,0x2F1A9FBE, 0x400122A2,0x835579BD, + 0x3FF228F5,0xC28F5C29, 0x40012E1A,0x693B5EB6, + 0x3FF22D0E,0x56041893, 0x4001399E,0xF22C8685, + 0x3FF23126,0xE978D4FE, 0x40014530,0x349C74A5, + 0x3FF2353F,0x7CED9168, 0x400150CE,0x4733BD25, + 0x3FF23958,0x10624DD3, 0x40015C79,0x40D0A212, + 0x3FF23D70,0xA3D70A3D, 0x40016831,0x3887B2E3, + 0x3FF24189,0x374BC6A8, 0x400173F6,0x45A46E4E, + 0x3FF245A1,0xCAC08312, 0x40017FC8,0x7FA9E62D, + 0x3FF249BA,0x5E353F7D, 0x40018BA7,0xFE5365E8, + 0x3FF24DD2,0xF1A9FBE7, 0x40019794,0xD9951AFD, + 0x3FF251EB,0x851EB852, 0x4001A38F,0x299CC01A, + 0x3FF25604,0x189374BC, 0x4001AF97,0x06D24A7A, + 0x3FF25A1C,0xAC083127, 0x4001BBAC,0x89D899D9, + 0x3FF25E35,0x3F7CED91, 0x4001C7CF,0xCB8E2AC1, + 0x3FF2624D,0xD2F1A9FC, 0x4001D400,0xE50DCB8B, + 0x3FF26666,0x66666666, 0x4001E03F,0xEFAF53C9, + 0x3FF26A7E,0xF9DB22D1, 0x4001EC8D,0x05085E7D, + 0x3FF26E97,0x8D4FDF3B, 0x4001F8E8,0x3EED06C9, + 0x3FF272B0,0x20C49BA6, 0x40020551,0xB770A787, + 0x3FF276C8,0xB4395810, 0x400211C9,0x88E69D73, + 0x3FF27AE1,0x47AE147B, 0x40021E4F,0xCDE30C53, + 0x3FF27EF9,0xDB22D0E5, 0x40022AE4,0xA13BA6C4, + 0x3FF28312,0x6E978D50, 0x40023788,0x1E087927, + 0x3FF2872B,0x020C49BA, 0x4002443A,0x5FA4B744, + 0x3FF28B43,0x95810625, 0x400250FB,0x81AF8D26, + 0x3FF28F5C,0x28F5C28F, 0x40025DCB,0xA00CF2D0, + 0x3FF29374,0xBC6A7EFA, 0x40026AAA,0xD6E6833D, + 0x3FF2978D,0x4FDF3B64, 0x40027799,0x42AC5654, + 0x3FF29BA5,0xE353F7CF, 0x40028497,0x0015DE48, + 0x3FF29FBE,0x76C8B439, 0x400291A4,0x2C22C803, + 0x3FF2A3D7,0x0A3D70A4, 0x40029EC0,0xE41BDF1C, + 0x3FF2A7EF,0x9DB22D0E, 0x4002ABED,0x4593F4F3, + 0x3FF2AC08,0x3126E979, 0x4002B929,0x6E68CB7A, + 0x3FF2B020,0xC49BA5E3, 0x4002C675,0x7CC4033E, + 0x3FF2B439,0x5810624E, 0x4002D3D1,0x8F1C0D3A, + 0x3FF2B851,0xEB851EB8, 0x4002E13D,0xC4352012, + 0x3FF2BC6A,0x7EF9DB23, 0x4002EEBA,0x3B223132, + 0x3FF2C083,0x126E978D, 0x4002FC47,0x1345F173, + 0x3FF2C49B,0xA5E353F8, 0x400309E4,0x6C53CDC9, + 0x3FF2C8B4,0x39581062, 0x40031792,0x6650F39F, + 0x3FF2CCCC,0xCCCCCCCD, 0x40032551,0x21955956, + 0x3FF2D0E5,0x60418937, 0x40033320,0xBECCCA94, + 0x3FF2D4FD,0xF3B645A2, 0x40034101,0x5EF7F8E5, + 0x3FF2D916,0x872B020C, 0x40034EF3,0x236D9048, + 0x3FF2DD2F,0x1A9FBE77, 0x40035CF6,0x2DDB5033, + 0x3FF2E147,0xAE147AE1, 0x40036B0A,0xA04728B4, + 0x3FF2E560,0x4189374C, 0x40037930,0x9D105C24, + 0x3FF2E978,0xD4FDF3B6, 0x40038768,0x46F0A521, + 0x3FF2ED91,0x6872B021, 0x400395B1,0xC0FD614D, + 0x3FF2F1A9,0xFBE76C8B, 0x4003A40D,0x2EA8C076, + 0x3FF2F5C2,0x8F5C28F6, 0x4003B27A,0xB3C2F8A9, + 0x3FF2F9DB,0x22D0E560, 0x4003C0FA,0x747B7EDE, + 0x3FF2FDF3,0xB645A1CB, 0x4003CF8C,0x956244C4, + 0x3FF3020C,0x49BA5E35, 0x4003DE31,0x3B68FB49, + 0x3FF30624,0xDD2F1AA0, 0x4003ECE8,0x8BE45A6D, + 0x3FF30A3D,0x70A3D70A, 0x4003FBB2,0xAC8D6E08, + 0x3FF30E56,0x04189375, 0x40040A8F,0xC382E810, + 0x3FF3126E,0x978D4FDF, 0x4004197F,0xF74A77F5, + 0x3FF31687,0x2B020C4A, 0x40042883,0x6ED227B6, + 0x3FF31A9F,0xBE76C8B4, 0x4004379A,0x5171BE48, + 0x3FF31EB8,0x51EB851F, 0x400446C4,0xC6EC27DB, + 0x3FF322D0,0xE5604189, 0x40045602,0xF770E3B0, + 0x3FF326E9,0x78D4FDF4, 0x40046555,0x0B9D7803, + 0x3FF32B02,0x0C49BA5E, 0x400474BB,0x2C7EEBBB, + 0x3FF32F1A,0x9FBE76C9, 0x40048435,0x8393466A, + 0x3FF33333,0x33333333, 0x400493C4,0x3ACB164D, + 0x3FF3374B,0xC6A7EF9E, 0x4004A367,0x7C8AFCD3, + 0x3FF33B64,0x5A1CAC08, 0x4004B31F,0x73AD4166, + 0x3FF33F7C,0xED916873, 0x4004C2EC,0x4B836AFA, + 0x3FF34395,0x810624DD, 0x4004D2CE,0x2FD7E01A, + 0x3FF347AE,0x147AE148, 0x4004E2C5,0x4CEF8DFA, + 0x3FF34BC6,0xA7EF9DB2, 0x4004F2D1,0xCF8B964F, + 0x3FF34FDF,0x3B645A1D, 0x400502F3,0xE4EB046D, + 0x3FF353F7,0xCED91687, 0x4005132B,0xBACC8971, + 0x3FF35810,0x624DD2F2, 0x40052379,0x7F703FF9, + 0x3FF35C28,0xF5C28F5C, 0x400533DD,0x61997726, + 0x3FF36041,0x89374BC7, 0x40054457,0x9090858A, + 0x3FF3645A,0x1CAC0831, 0x400554E8,0x3C24A39D, + 0x3FF36872,0xB020C49C, 0x4005658F,0x94ADCE68, + 0x3FF36C8B,0x43958106, 0x4005764D,0xCB0EB214, + 0x3FF370A3,0xD70A3D71, 0x40058723,0x10B69CF9, + 0x3FF374BC,0x6A7EF9DB, 0x4005980F,0x97A37ADE, + 0x3FF378D4,0xFDF3B646, 0x4005A913,0x9263D914, + 0x3FF37CED,0x916872B0, 0x4005BA2F,0x3418F31D, + 0x3FF38106,0x24DD2F1B, 0x4005CB62,0xB078C87A, + 0x3FF3851E,0xB851EB85, 0x4005DCAE,0x3BD03B67, + 0x3FF38937,0x4BC6A7F0, 0x4005EE12,0x0B053920, + 0x3FF38D4F,0xDF3B645A, 0x4005FF8E,0x5398EB60, + 0x3FF39168,0x72B020C5, 0x40061123,0x4BA9F3E2, + 0x3FF39581,0x0624DD2F, 0x400622D1,0x29F6B16E, + 0x3FF39999,0x9999999A, 0x40063498,0x25DF8F4F, + 0x3FF39DB2,0x2D0E5604, 0x40064678,0x77695EC4, + 0x3FF3A1CA,0xC083126F, 0x40065872,0x573FBB41, + 0x3FF3A5E3,0x53F7CED9, 0x40066A85,0xFEB77915, + 0x3FF3A9FB,0xE76C8B44, 0x40067CB3,0xA7D11F49, + 0x3FF3AE14,0x7AE147AE, 0x40068EFB,0x8D3B6C6B, + 0x3FF3B22D,0x0E560419, 0x4006A15D,0xEA55E6F0, + 0x3FF3B645,0xA1CAC083, 0x4006B3DA,0xFB337900, + 0x3FF3BA5E,0x353F7CEE, 0x4006C672,0xFC9D1859, + 0x3FF3BE76,0xC8B43958, 0x4006D926,0x2C147A13, + 0x3FF3C28F,0x5C28F5C3, 0x4006EBF4,0xC7D6D2FC, + 0x3FF3C6A7,0xEF9DB22D, 0x4006FEDF,0x0EDFA455, + 0x3FF3CAC0,0x83126E98, 0x400711E5,0x40EB95B4, + 0x3FF3CED9,0x16872B02, 0x40072507,0x9E7B5BC7, + 0x3FF3D2F1,0xA9FBE76D, 0x40073846,0x68D6ACD2, + 0x3FF3D70A,0x3D70A3D7, 0x40074BA1,0xE20F4298, + 0x3FF3DB22,0xD0E56042, 0x40075F1A,0x4D03EA90, + 0x3FF3DF3B,0x645A1CAC, 0x400772AF,0xED63A422, + 0x3FF3E353,0xF7CED917, 0x40078663,0x07B0CDC9, + 0x3FF3E76C,0x8B439581, 0x40079A33,0xE14460D8, + 0x3FF3EB85,0x1EB851EC, 0x4007AE22,0xC0513CC9, + 0x3FF3EF9D,0xB22D0E56, 0x4007C22F,0xEBE781D4, + 0x3FF3F3B6,0x45A1CAC1, 0x4007D65B,0xABF7FBBF, + 0x3FF3F7CE,0xD916872B, 0x4007EAA6,0x49579C9B, + 0x3FF3FBE7,0x6C8B4396, 0x4007FF10,0x0DC30874, + 0x3FF40000,0x00000000, 0x40081399,0x43E231A8, + 0x3FF40418,0x9374BC6A, 0x40082842,0x374C06DE, + 0x3FF40831,0x26E978D5, 0x40083D0B,0x348A3289, + 0x3FF40C49,0xBA5E353F, 0x400851F4,0x891CEC8B, + 0x3FF41062,0x4DD2F1AA, 0x400866FE,0x837EDE83, + 0x3FF4147A,0xE147AE14, 0x40087C29,0x73291ACF, + 0x3FF41893,0x74BC6A7F, 0x40089175,0xA8972725, + 0x3FF41CAC,0x083126E9, 0x4008A6E3,0x754B1AB1, + 0x3FF420C4,0x9BA5E354, 0x4008BC73,0x2BD1D0B6, + 0x3FF424DD,0x2F1A9FBE, 0x4008D225,0x1FC72F8A, + 0x3FF428F5,0xC28F5C29, 0x4008E7F9,0xA5DA8510, + 0x3FF42D0E,0x56041893, 0x4008FDF1,0x13D2F873, + 0x3FF43126,0xE978D4FE, 0x4009140B,0xC094125B, + 0x3FF4353F,0x7CED9168, 0x40092A4A,0x04225B61, + 0x3FF43958,0x10624DD3, 0x400940AC,0x37A81204, + 0x3FF43D70,0xA3D70A3D, 0x40095732,0xB579F7E5, + 0x3FF44189,0x374BC6A8, 0x40096DDD,0xD91C3795, + 0x3FF445A1,0xCAC08312, 0x400984AD,0xFF4762CE, + 0x3FF449BA,0x5E353F7D, 0x40099BA3,0x85ED8A53, + 0x3FF44DD2,0xF1A9FBE7, 0x4009B2BE,0xCC3F6F68, + 0x3FF451EB,0x851EB852, 0x4009CA00,0x32B1D025, + 0x3FF45604,0x189374BC, 0x4009E168,0x1B02CE9D, + 0x3FF45A1C,0xAC083127, 0x4009F8F6,0xE83F7414, + 0x3FF45E35,0x3F7CED91, 0x400A10AC,0xFEC9505D, + 0x3FF4624D,0xD2F1A9FC, 0x400A288A,0xC45C369E, + 0x3FF46666,0x66666666, 0x400A4090,0xA0141789, + 0x3FF46A7E,0xF9DB22D1, 0x400A58BE,0xFA72FA71, + 0x3FF46E97,0x8D4FDF3B, 0x400A7116,0x3D671537, + 0x3FF472B0,0x20C49BA6, 0x400A8996,0xD4510492, + 0x3FF476C8,0xB4395810, 0x400AA241,0x2C0A24B2, + 0x3FF47AE1,0x47AE147B, 0x400ABB15,0xB2EB0BC6, + 0x3FF47EF9,0xDB22D0E5, 0x400AD414,0xD8D22683, + 0x3FF48312,0x6E978D50, 0x400AED3F,0x0F2A7825, + 0x3FF4872B,0x020C49BA, 0x400B0694,0xC8F27E26, + 0x3FF48B43,0x95810625, 0x400B2016,0x7AC33932, + 0x3FF48F5C,0x28F5C28F, 0x400B39C4,0x9AD75B88, + 0x3FF49374,0xBC6A7EFA, 0x400B539F,0xA1129E82, + 0x3FF4978D,0x4FDF3B64, 0x400B6DA8,0x07093F60, + 0x3FF49BA5,0xE353F7CF, 0x400B87DE,0x4807A52B, + 0x3FF49FBE,0x76C8B439, 0x400BA242,0xE11A2FDA, + 0x3FF4A3D7,0x0A3D70A4, 0x400BBCD6,0x511532A0, + 0x3FF4A7EF,0x9DB22D0E, 0x400BD799,0x189D1996, + 0x3FF4AC08,0x3126E979, 0x400BF28B,0xBA2EBCAE, + 0x3FF4B020,0xC49BA5E3, 0x400C0DAE,0xBA27E04F, + 0x3FF4B439,0x5810624E, 0x400C2902,0x9ECFE57D, + 0x3FF4B851,0xEB851EB8, 0x400C4487,0xF060AA00, + 0x3FF4BC6A,0x7EF9DB23, 0x400C603F,0x390F9A90, + 0x3FF4C083,0x126E978D, 0x400C7C29,0x0516F77B, + 0x3FF4C49B,0xA5E353F8, 0x400C9845,0xE2BF4DE6, + 0x3FF4C8B4,0x39581062, 0x400CB496,0x62692628, + 0x3FF4CCCC,0xCCCCCCCD, 0x400CD11B,0x1696E97E, + 0x3FF4D0E5,0x60418937, 0x400CEDD4,0x93F6FFAE, + 0x3FF4D4FD,0xF3B645A2, 0x400D0AC3,0x716E26E0, + 0x3FF4D916,0x872B020C, 0x400D27E8,0x4822065B, + 0x3FF4DD2F,0x1A9FBE77, 0x400D4543,0xB383FE9C, + 0x3FF4E147,0xAE147AE1, 0x400D62D6,0x515C3767, + 0x3FF4E560,0x4189374C, 0x400D80A0,0xC1D4EE7D, + 0x3FF4E978,0xD4FDF3B6, 0x400D9EA3,0xA78607A6, + 0x3FF4ED91,0x6872B021, 0x400DBCDF,0xA780E0CC, + 0x3FF4F1A9,0xFBE76C8B, 0x400DDB55,0x695C6B08, + 0x3FF4F5C2,0x8F5C28F6, 0x400DFA05,0x97418B64, + 0x3FF4F9DB,0x22D0E560, 0x400E18F0,0xDDF7C44F, + 0x3FF4FDF3,0xB645A1CB, 0x400E3817,0xECF22ABC, + 0x3FF5020C,0x49BA5E35, 0x400E577B,0x765CA7F1, + 0x3FF50624,0xDD2F1AA0, 0x400E771C,0x2F298B1D, + 0x3FF50A3D,0x70A3D70A, 0x400E96FA,0xCF1F6BF5, + 0x3FF50E56,0x04189375, 0x400EB718,0x10E7617A, + 0x3FF5126E,0x978D4FDF, 0x400ED774,0xB21B8E48, + 0x3FF51687,0x2B020C4A, 0x400EF811,0x735605CC, + 0x3FF51A9F,0xBE76C8B4, 0x400F18EF,0x18400BD9, + 0x3FF51EB8,0x51EB851F, 0x400F3A0E,0x67A1B218, + 0x3FF522D0,0xE5604189, 0x400F5B70,0x2B71D507, + 0x3FF526E9,0x78D4FDF4, 0x400F7D15,0x30E67C26, + 0x3FF52B02,0x0C49BA5E, 0x400F9EFE,0x48859F26, + 0x3FF52F1A,0x9FBE76C9, 0x400FC12C,0x463653FE, + 0x3FF53333,0x33333333, 0x400FE3A0,0x015267D0, + 0x3FF5374B,0xC6A7EF9E, 0x4010032D,0x2A5C3365, + 0x3FF53B64,0x5A1CAC08, 0x401014AE,0x0F6F0A85, + 0x3FF53F7C,0xED916873, 0x40102653,0x20F1AE7C, + 0x3FF54395,0x810624DD, 0x4010381C,0xD1D2DAA4, + 0x3FF547AE,0x147AE148, 0x40104A0B,0x96EA01A9, + 0x3FF54BC6,0xA7EF9DB2, 0x40105C1F,0xE7017E18, + 0x3FF54FDF,0x3B645A1D, 0x40106E5A,0x3AE104C6, + 0x3FF553F7,0xCED91687, 0x401080BB,0x0D585A62, + 0x3FF55810,0x624DD2F2, 0x40109342,0xDB4A4ED0, + 0x3FF55C28,0xF5C28F5C, 0x4010A5F2,0x23B7FFC0, + 0x3FF56041,0x89374BC7, 0x4010B8C9,0x67CC6532, + 0x3FF5645A,0x1CAC0831, 0x4010CBC9,0x2AE8299D, + 0x3FF56872,0xB020C49C, 0x4010DEF1,0xF2ADD07B, + 0x3FF56C8B,0x43958106, 0x4010F244,0x470E2D14, + 0x3FF570A3,0xD70A3D71, 0x401105C0,0xB2552C86, + 0x3FF574BC,0x6A7EF9DB, 0x40111967,0xC136F4FD, + 0x3FF578D4,0xFDF3B646, 0x40112D3A,0x02DD5D51, + 0x3FF57CED,0x916872B0, 0x40114138,0x08F5BF25, + 0x3FF58106,0x24DD2F1B, 0x40115562,0x67BF26EC, + 0x3FF5851E,0xB851EB85, 0x401169B9,0xB618E425, + 0x3FF58937,0x4BC6A7F0, 0x40117E3E,0x8D917D68, + 0x3FF58D4F,0xDF3B645A, 0x401192F1,0x8A760AC4, + 0x3FF59168,0x72B020C5, 0x4011A7D3,0x4BE1FA47, + 0x3FF59581,0x0624DD2F, 0x4011BCE4,0x73CF4167, + 0x3FF59999,0x9999999A, 0x4011D225,0xA726FF61, + 0x3FF59DB2,0x2D0E5604, 0x4011E797,0x8DD29388, + 0x3FF5A1CA,0xC083126F, 0x4011FD3A,0xD2CD2BD7, + 0x3FF5A5E3,0x53F7CED9, 0x40121310,0x2435CF05, + 0x3FF5A9FB,0xE76C8B44, 0x40122918,0x3361E6B9, + 0x3FF5AE14,0x7AE147AE, 0x40123F53,0xB4F04D66, + 0x3FF5B22D,0x0E560419, 0x401255C3,0x60DCE4B2, + 0x3FF5B645,0xA1CAC083, 0x40126C67,0xF294B850, + 0x3FF5BA5E,0x353F7CEE, 0x40128342,0x290AB27C, + 0x3FF5BE76,0xC8B43958, 0x40129A52,0xC6CCE64E, + 0x3FF5C28F,0x5C28F5C3, 0x4012B19A,0x921A7586, + 0x3FF5C6A7,0xEF9DB22D, 0x4012C91A,0x54FA1658, + 0x3FF5CAC0,0x83126E98, 0x4012E0D2,0xDD513F32, + 0x3FF5CED9,0x16872B02, 0x4012F8C4,0xFCFBFD80, + 0x3FF5D2F1,0xA9FBE76D, 0x401310F1,0x89E57DD2, + 0x3FF5D70A,0x3D70A3D7, 0x40132959,0x5E214ABF, + 0x3FF5DB22,0xD0E56042, 0x401341FD,0x58054982, + 0x3FF5DF3B,0x645A1CAC, 0x40135ADE,0x5A447A11, + 0x3FF5E353,0xF7CED917, 0x401373FD,0x4C0A8235, + 0x3FF5E76C,0x8B439581, 0x40138D5B,0x191809DE, + 0x3FF5EB85,0x1EB851EC, 0x4013A6F8,0xB1DFF0D6, + 0x3FF5EF9D,0xB22D0E56, 0x4013C0D7,0x0BA5649C, + 0x3FF5F3B6,0x45A1CAC1, 0x4013DAF7,0x209ADF11, + 0x3FF5F7CE,0xD916872B, 0x4013F559,0xF002157C, + 0x3FF5FBE7,0x6C8B4396, 0x40141000,0x7E4CE12E, + 0x3FF60000,0x00000000, 0x40142AEB,0xD53F29E4, + 0x3FF60418,0x9374BC6A, 0x4014461D,0x0411DBFE, + 0x3FF60831,0x26E978D5, 0x40146195,0x1F96F391, + 0x3FF60C49,0xBA5E353F, 0x40147D55,0x425EA69B, + 0x3FF61062,0x4DD2F1AA, 0x4014995E,0x8CDDB91C, + 0x3FF6147A,0xE147AE14, 0x4014B5B2,0x2595055E, + 0x3FF61893,0x74BC6A7F, 0x4014D251,0x393A4498, + 0x3FF61CAC,0x083126E9, 0x4014EF3C,0xFAE222ED, + 0x3FF620C4,0x9BA5E354, 0x40150C76,0xA42BAC08, + 0x3FF624DD,0x2F1A9FBE, 0x401529FF,0x756D1C53, + 0x3FF628F5,0xC28F5C29, 0x401547D8,0xB5E22530, + 0x3FF62D0E,0x56041893, 0x40156603,0xB3DBB13B, + 0x3FF63126,0xE978D4FE, 0x40158481,0xC4F13842, + 0x3FF6353F,0x7CED9168, 0x4015A354,0x4633B13C, + 0x3FF63958,0x10624DD3, 0x4015C27C,0x9C62332A, + 0x3FF63D70,0xA3D70A3D, 0x4015E1FC,0x3420549C, + 0x3FF64189,0x374BC6A8, 0x401601D4,0x822E5C34, + 0x3FF645A1,0xCAC08312, 0x40162207,0x03A35366, + 0x3FF649BA,0x5E353F7D, 0x40164295,0x3E290F61, + 0x3FF64DD2,0xF1A9FBE7, 0x40166380,0xC03A4314, + 0x3FF651EB,0x851EB852, 0x401684CB,0x2162B00A, + 0x3FF65604,0x189374BC, 0x4016A676,0x02818ACE, + 0x3FF65A1C,0xAC083127, 0x4016C883,0x0E0E2A9E, + 0x3FF65E35,0x3F7CED91, 0x4016EAF3,0xF85F1B27, + 0x3FF6624D,0xD2F1A9FC, 0x40170DCA,0x7FF3AA2E, + 0x3FF66666,0x66666666, 0x40173108,0x6DC00A35, + 0x3FF66A7E,0xF9DB22D1, 0x401754AF,0x957C2654, + 0x3FF66E97,0x8D4FDF3B, 0x401778C1,0xD5F542E9, + 0x3FF672B0,0x20C49BA6, 0x40179D41,0x196289FF, + 0x3FF676C8,0xB4395810, 0x4017C22F,0x55BCA1C1, + 0x3FF67AE1,0x47AE147B, 0x4017E78E,0x8D186EF6, + 0x3FF67EF9,0xDB22D0E5, 0x40180D60,0xCE0524CC, + 0x3FF68312,0x6E978D50, 0x401833A8,0x33EDC75A, + 0x3FF6872B,0x020C49BA, 0x40185A66,0xE77E457D, + 0x3FF68B43,0x95810625, 0x4018819F,0x1F0C5326, + 0x3FF68F5C,0x28F5C28F, 0x4018A953,0x1F042CA2, + 0x3FF69374,0xBC6A7EFA, 0x4018D185,0x3A596FF2, + 0x3FF6978D,0x4FDF3B64, 0x4018FA37,0xD2FC391A, + 0x3FF69BA5,0xE353F7CF, 0x4019236D,0x5A52B2FB, + 0x3FF69FBE,0x76C8B439, 0x40194D28,0x51B74E7B, + 0x3FF6A3D7,0x0A3D70A4, 0x4019776B,0x4AFBD6A0, + 0x3FF6A7EF,0x9DB22D0E, 0x4019A238,0xE8F198B5, + 0x3FF6AC08,0x3126E979, 0x4019CD93,0xDFF6DCE6, + 0x3FF6B020,0xC49BA5E3, 0x4019F97E,0xF689EC5D, + 0x3FF6B439,0x5810624E, 0x401A25FD,0x05E1E7BF, + 0x3FF6B851,0xEB851EB8, 0x401A5310,0xFA8DB1C8, + 0x3FF6BC6A,0x7EF9DB23, 0x401A80BD,0xD5193815, + 0x3FF6C083,0x126E978D, 0x401AAF06,0xAAB96578, + 0x3FF6C49B,0xA5E353F8, 0x401ADDEE,0xA5FF0FFB, + 0x3FF6C8B4,0x39581062, 0x401B0D79,0x07913660, + 0x3FF6CCCC,0xCCCCCCCD, 0x401B3DA9,0x26EEE877, + 0x3FF6D0E5,0x60418937, 0x401B6E82,0x733937B1, + 0x3FF6D4FD,0xF3B645A2, 0x401BA008,0x74059580, + 0x3FF6D916,0x872B020C, 0x401BD23E,0xCA3907D4, + 0x3FF6DD2F,0x1A9FBE77, 0x401C0529,0x30ECA4DD, + 0x3FF6E147,0xAE147AE1, 0x401C38CB,0x7E5BCAA8, + 0x3FF6E560,0x4189374C, 0x401C6D29,0xA4DC90E3, + 0x3FF6E978,0xD4FDF3B6, 0x401CA247,0xB3E2F74E, + 0x3FF6ED91,0x6872B021, 0x401CD829,0xD90F5DFE, + 0x3FF6F1A9,0xFBE76C8B, 0x401D0ED4,0x6148D9C4, + 0x3FF6F5C2,0x8F5C28F6, 0x401D464B,0xB9E402E1, + 0x3FF6F9DB,0x22D0E560, 0x401D7E94,0x71D6E229, + 0x3FF6FDF3,0xB645A1CB, 0x401DB7B3,0x3AFAAE13, + 0x3FF7020C,0x49BA5E35, 0x401DF1AC,0xEB5C1051, + 0x3FF70624,0xDD2F1AA0, 0x401E2C86,0x7E9ABB51, + 0x3FF70A3D,0x70A3D70A, 0x401E6845,0x17591FAE, + 0x3FF70E56,0x04189375, 0x401EA4EE,0x00BD21EC, + 0x3FF7126E,0x978D4FDF, 0x401EE286,0xB002BB55, + 0x3FF71687,0x2B020C4A, 0x401F2114,0xC62182EE, + 0x3FF71A9F,0xBE76C8B4, 0x401F609E,0x118627FD, + 0x3FF71EB8,0x51EB851F, 0x401FA128,0x8FE0FC01, + 0x3FF722D0,0xE5604189, 0x401FE2BA,0x700AB8B3, + 0x3FF726E9,0x78D4FDF4, 0x402012AD,0x0A0062E4, + 0x3FF72B02,0x0C49BA5E, 0x40203487,0x097D29BD, + 0x3FF72F1A,0x9FBE76C9, 0x402056EE,0x9DCBDC90, + 0x3FF73333,0x33333333, 0x402079E7,0x4B16CDC3, + 0x3FF7374B,0xC6A7EF9E, 0x40209D74,0xB396BE46, + 0x3FF73B64,0x5A1CAC08, 0x4020C19A,0x98D6B6DE, + 0x3FF73F7C,0xED916873, 0x4020E65C,0xDD0860BB, + 0x3FF74395,0x810624DD, 0x40210BBF,0x8469D982, + 0x3FF747AE,0x147AE148, 0x402131C6,0xB6BE124A, + 0x3FF74BC6,0xA7EF9DB2, 0x40215876,0xC0D8DA07, + 0x3FF74FDF,0x3B645A1D, 0x40217FD4,0x163FCA28, + 0x3FF753F7,0xCED91687, 0x4021A7E3,0x52E16021, + 0x3FF75810,0x624DD2F2, 0x4021D0A9,0x3CE3A865, + 0x3FF75C28,0xF5C28F5C, 0x4021FA2A,0xC68BF6EF, + 0x3FF76041,0x89374BC7, 0x4022246D,0x10414757, + 0x3FF7645A,0x1CAC0831, 0x40224F75,0x6AAAFA55, + 0x3FF76872,0xB020C49C, 0x40227B49,0x58EDC96E, + 0x3FF76C8B,0x43958106, 0x4022A7EE,0x9308EA7D, + 0x3FF770A3,0xD70A3D71, 0x4022D56B,0x08558594, + 0x3FF774BC,0x6A7EF9DB, 0x402303C4,0xE22AC6C2, + 0x3FF778D4,0xFDF3B646, 0x40233302,0x86A90528, + 0x3FF77CED,0x916872B0, 0x4023632A,0x9BAEA747, + 0x3FF78106,0x24DD2F1B, 0x40239444,0x09F9A4BE, + 0x3FF7851E,0xB851EB85, 0x4023C656,0x0078BD2B, + 0x3FF78937,0x4BC6A7F0, 0x4023F967,0xF7CFBE5B, + 0x3FF78D4F,0xDF3B645A, 0x40242D81,0xB6127661, + 0x3FF79168,0x72B020C5, 0x402462AB,0x52BA3CFC, + 0x3FF79581,0x0624DD2F, 0x402498ED,0x3ADA4F51, + 0x3FF79999,0x9999999A, 0x4024D050,0x359796D5, + 0x3FF79DB2,0x2D0E5604, 0x402508DD,0x68E8D431, + 0x3FF7A1CA,0xC083126F, 0x4025429E,0x5EA496D3, + 0x3FF7A5E3,0x53F7CED9, 0x40257D9D,0x09E2DDE0, + 0x3FF7A9FB,0xE76C8B44, 0x4025B9E3,0xCCB8C57B, + 0x3FF7AE14,0x7AE147AE, 0x4025F77D,0x7E552FCC, + 0x3FF7B22D,0x0E560419, 0x40263675,0x7185FB0F, + 0x3FF7B645,0xA1CAC083, 0x402676D7,0x7BAE00BA, + 0x3FF7BA5E,0x353F7CEE, 0x4026B8AF,0xFC34DDB8, + 0x3FF7BE76,0xC8B43958, 0x4026FC0B,0xE47A5416, + 0x3FF7C28F,0x5C28F5C3, 0x402740F8,0xC05804E9, + 0x3FF7C6A7,0xEF9DB22D, 0x40278784,0xBF3D406E, + 0x3FF7CAC0,0x83126E98, 0x4027CFBE,0xBDF1CDC7, + 0x3FF7CED9,0x16872B02, 0x402819B6,0x510DC5D5, + 0x3FF7D2F1,0xA9FBE76D, 0x4028657B,0xD0360274, + 0x3FF7D70A,0x3D70A3D7, 0x4028B320,0x622E27CE, + 0x3FF7DB22,0xD0E56042, 0x402902B6,0x09D306F7, + 0x3FF7DF3B,0x645A1CAC, 0x4029544F,0xB411FB8E, + 0x3FF7E353,0xF7CED917, 0x4029A801,0x46F40A2C, + 0x3FF7E76C,0x8B439581, 0x4029FDDF,0xB1D5DF96, + 0x3FF7EB85,0x1EB851EC, 0x402A5600,0xFEE87CC2, + 0x3FF7EF9D,0xB22D0E56, 0x402AB07C,0x66194F9A, + 0x3FF7F3B6,0x45A1CAC1, 0x402B0D6A,0x6183D30F, + 0x3FF7F7CE,0xD916872B, 0x402B6CE4,0xC3928B1A, + 0x3FF7FBE7,0x6C8B4396, 0x402BCF06,0xCEF96E07, + 0x3FF80000,0x00000000, 0x402C33ED,0x50B88777, + 0x3FF80418,0x9374BC6A, 0x402C9BB6,0xBC5B04B9, + 0x3FF80831,0x26E978D5, 0x402D0683,0x4AACE61B, + 0x3FF80C49,0xBA5E353F, 0x402D7475,0x1B28737E, + 0x3FF81062,0x4DD2F1AA, 0x402DE5B0,0x58645F01, + 0x3FF8147A,0xE147AE14, 0x402E5A5B,0x5FD45A8A, + 0x3FF81893,0x74BC6A7F, 0x402ED29E,0xED38037E, + 0x3FF81CAC,0x083126E9, 0x402F4EA6,0x4A1F86AC, + 0x3FF820C4,0x9BA5E354, 0x402FCE9F,0x81FA9192, + 0x3FF824DD,0x2F1A9FBE, 0x4030295D,0xCD9A9B13, + 0x3FF828F5,0xC28F5C29, 0x40306D97,0x6AFBE05E, + 0x3FF82D0E,0x56041893, 0x4030B418,0x7899336B, + 0x3FF83126,0xE978D4FE, 0x4030FCFE,0xBB5A5C79, + 0x3FF8353F,0x7CED9168, 0x4031486A,0x0795A4CD, + 0x3FF83958,0x10624DD3, 0x4031967C,0x6F7E64B2, + 0x3FF83D70,0xA3D70A3D, 0x4031E75A,0x7691C5A3, + 0x3FF84189,0x374BC6A8, 0x40323B2B,0x4AA50407, + 0x3FF845A1,0xCAC08312, 0x40329219,0x0350BF75, + 0x3FF849BA,0x5E353F7D, 0x4032EC50,0xE8915934, + 0x3FF84DD2,0xF1A9FBE7, 0x40334A03,0xC195B7AC, + 0x3FF851EB,0x851EB852, 0x4033AB66,0x2CDD1001, + 0x3FF85604,0x189374BC, 0x403410B1,0x02F2AFC1, + 0x3FF85A1C,0xAC083127, 0x40347A21,0xC54DB1CD, + 0x3FF85E35,0x3F7CED91, 0x4034E7FB,0x1B1BC6AF, + 0x3FF8624D,0xD2F1A9FC, 0x40355A85,0x5E0C0EAF, + 0x3FF86666,0x66666666, 0x4035D20F,0x398C1887, + 0x3FF86A7E,0xF9DB22D1, 0x40364EEE,0x5F58ED6F, + 0x3FF86E97,0x8D4FDF3B, 0x4036D180,0x54CCD600, + 0x3FF872B0,0x20C49BA6, 0x40375A2B,0x5CF5AC4F, + 0x3FF876C8,0xB4395810, 0x4037E95F,0x8445CAB8, + 0x3FF87AE1,0x47AE147B, 0x40387F97,0xD3A3ADE9, + 0x3FF87EF9,0xDB22D0E5, 0x40391D5B,0xB1C5123A, + 0x3FF88312,0x6E978D50, 0x4039C340,0x7B2FEC60, + 0x3FF8872B,0x020C49BA, 0x403A71EB,0x5B002FB7, + 0x3FF88B43,0x95810625, 0x403B2A13,0x70C4AD0A, + 0x3FF88F5C,0x28F5C28F, 0x403BEC84,0x52863AFE, + 0x3FF89374,0xBC6A7EFA, 0x403CBA20,0xFD83A86E, + 0x3FF8978D,0x4FDF3B64, 0x403D93E7,0x4C907AB9, + 0x3FF89BA5,0xE353F7CF, 0x403E7AF4,0x109C659E, + 0x3FF89FBE,0x76C8B439, 0x403F7087,0xEF168952, + 0x3FF8A3D7,0x0A3D70A4, 0x40403B06,0x9992D105, + 0x3FF8A7EF,0x9DB22D0E, 0x4040C68F,0x6560B76D, + 0x3FF8AC08,0x3126E979, 0x40415BC8,0x5C49746A, + 0x3FF8B020,0xC49BA5E3, 0x4041FBBD,0x2C3DE2D8, + 0x3FF8B439,0x5810624E, 0x4042A7A1,0x7856581D, + 0x3FF8B851,0xEB851EB8, 0x404360D8,0x977FD248, + 0x3FF8BC6A,0x7EF9DB23, 0x404428FF,0x32E960E5, + 0x3FF8C083,0x126E978D, 0x404501F7,0x5151C17F, + 0x3FF8C49B,0xA5E353F8, 0x4045EDF7,0x8DDBBBDF, + 0x3FF8C8B4,0x39581062, 0x4046EF9E,0x7F0969A7, + 0x3FF8CCCC,0xCCCCCCCD, 0x40480A0B,0xB6C0C707, + 0x3FF8D0E5,0x60418937, 0x40494100,0x561299FA, + 0x3FF8D4FD,0xF3B645A2, 0x404A990A,0x07280BDB, + 0x3FF8D916,0x872B020C, 0x404C17BC,0x74780F7A, + 0x3FF8DD2F,0x1A9FBE77, 0x404DC3FF,0x4723BB31, + 0x3FF8E147,0xAE147AE1, 0x404FA679,0xC53F8565, + 0x3FF8E560,0x4189374C, 0x4050E515,0x09F5A46E, + 0x3FF8E978,0xD4FDF3B6, 0x40521E9F,0x20CB9352, + 0x3FF8ED91,0x6872B021, 0x40538929,0x8A49520B, + 0x3FF8F1A9,0xFBE76C8B, 0x4055312A,0x80BABBCC, + 0x3FF8F5C2,0x8F5C28F6, 0x405727B6,0x362EE236, + 0x3FF8F9DB,0x22D0E560, 0x405984DA,0x19D34704, + 0x3FF8FDF3,0xB645A1CB, 0x405C6B93,0x9B7A3844, + 0x3FF9020C,0x49BA5E35, 0x40600869,0xF1D75740, + 0x3FF90624,0xDD2F1AA0, 0x4062645A,0x6E205DA5, + 0x3FF90A3D,0x70A3D70A, 0x406590AD,0x07938A7E, + 0x3FF90E56,0x04189375, 0x406A0FB8,0x9921391A, + 0x3FF9126E,0x978D4FDF, 0x40707694,0x7D81C7BF, + 0x3FF91687,0x2B020C4A, 0x407659C6,0xE87561F1, + 0x3FF91A9F,0xBE76C8B4, 0x40816587,0x20AEECD5, + 0x3FF91EB8,0x51EB851F, 0x40939F0F,0xF737E7F3, + 0x3FF922D0,0xE5604189, 0xC0B32DD3,0x70F4C17F, + 0x3FF926E9,0x78D4FDF4, 0xC089F651,0xAC5B68ED, + 0x3FF92B02,0x0C49BA5E, 0xC07C5C97,0xCA7AE7B0, + 0x3FF92F1A,0x9FBE76C9, 0xC0738240,0x074B6B17, + 0x3FF93333,0x33333333, 0xC06DBC58,0x5E7C6259, + 0x3FF9374B,0xC6A7EF9E, 0xC0680572,0x5CC5B468, + 0x3FF93B64,0x5A1CAC08, 0xC064262B,0x0B50C86F, + 0x3FF93F7C,0xED916873, 0xC0615A19,0xF21D0FA4, + 0x3FF94395,0x810624DD, 0xC05E7935,0x593189CB, + 0x3FF947AE,0x147AE148, 0xC05B298C,0x8D46CFC5, + 0x3FF94BC6,0xA7EF9DB2, 0xC0588008,0x8B1BA75E, + 0x3FF94FDF,0x3B645A1D, 0xC056502C,0x58DA5128, + 0x3FF953F7,0xCED91687, 0xC0547C0F,0xF41BCFAF, + 0x3FF95810,0x624DD2F2, 0xC052EEDA,0xB5F98D4F, + 0x3FF95C28,0xF5C28F5C, 0xC0519992,0xDC47E516, + 0x3FF96041,0x89374BC7, 0xC050712F,0x48B6624D, + 0x3FF9645A,0x1CAC0831, 0xC04EDAC0,0x87B87325, + 0x3FF96872,0xB020C49C, 0xC04D0F89,0x993D2403, + 0x3FF96C8B,0x43958106, 0xC04B76C5,0x6C89F0F0, + 0x3FF970A3,0xD70A3D71, 0xC04A0892,0x76263F1D, + 0x3FF974BC,0x6A7EF9DB, 0xC048BE9E,0x9B8B207B, + 0x3FF978D4,0xFDF3B646, 0xC04793C9,0x021CB2DB, + 0x3FF97CED,0x916872B0, 0xC04683DD,0x52183947, + 0x3FF98106,0x24DD2F1B, 0xC0458B60,0xBFC12676, + 0x3FF9851E,0xB851EB85, 0xC044A76B,0xB6D06F42, + 0x3FF98937,0x4BC6A7F0, 0xC043D58C,0xA5DFE44C, + 0x3FF98D4F,0xDF3B645A, 0xC04313B1,0x79C9CA32, + 0x3FF99168,0x72B020C5, 0xC0426016,0x107854F3, + 0x3FF99581,0x0624DD2F, 0xC041B936,0x6794B439, + 0x3FF99999,0x9999999A, 0xC0411DC3,0xA1F73BEA, + 0x3FF9C28F,0x5C28F5C3, 0xC0397EA7,0x960E5A09, + 0x3FF9EB85,0x1EB851EC, 0xC0344EAA,0x092D3149, + 0x3FFA147A,0xE147AE14, 0xC030DF00,0xB784AFBC, + 0x3FFA3D70,0xA3D70A3D, 0xC02CDAA2,0xFD8020CA, + 0x3FFA6666,0x66666666, 0xC02932D2,0xD5A0CCB7, + 0x3FFA8F5C,0x28F5C28F, 0xC0265C71,0x18986042, + 0x3FFAB851,0xEB851EB8, 0xC0241828,0x47401DE0, + 0x3FFAE147,0xAE147AE1, 0xC0223DD5,0xB025AC2B, + 0x3FFB0A3D,0x70A3D70A, 0xC020B2CE,0x67522C38, + 0x3FFB3333,0x33333333, 0xC01EC952,0x123D33F2, + 0x3FFB5C28,0xF5C28F5C, 0xC01C8C8D,0x2706C27A, + 0x3FFB851E,0xB851EB85, 0xC01A9C19,0x0EC19308, + 0x3FFBAE14,0x7AE147AE, 0xC018E994,0x2E7A9555, + 0x3FFBD70A,0x3D70A3D7, 0xC0176A03,0x3F52E80D, + 0x3FFC0000,0x00000000, 0xC01614DE,0x7972B0BB, + 0x3FFC28F5,0xC28F5C29, 0xC014E36B,0xC0AD26C4, + 0x3FFC51EB,0x851EB852, 0xC013D04A,0xC375EFA4, + 0x3FFC7AE1,0x47AE147B, 0xC012D722,0x55D37577, + 0x3FFCA3D7,0x0A3D70A4, 0xC011F464,0x6B624FDA, + 0x3FFCCCCC,0xCCCCCCCD, 0xC0112521,0xC7CA80BD, + 0x3FFCF5C2,0x8F5C28F6, 0xC01066E8,0xCC881F7F, + 0x3FFD1EB8,0x51EB851F, 0xC00F6F58,0x89958315, + 0x3FFD47AE,0x147AE148, 0xC00E2B60,0x0DB74600, + 0x3FFD70A3,0xD70A3D71, 0xC00CFEF3,0xCD5EE04E, + 0x3FFD9999,0x9999999A, 0xC00BE78B,0xC91E1650, + 0x3FFDC28F,0x5C28F5C3, 0xC00AE2F9,0x9ED055CC, + 0x3FFDEB85,0x1EB851EC, 0xC009EF59,0x8FDC25B9, + 0x3FFE147A,0xE147AE14, 0xC0090B06,0x6F617168, + 0x3FFE3D70,0xA3D70A3D, 0xC008348F,0xD530F01A, + 0x3FFE6666,0x66666666, 0xC0076AB2,0x1A0DF38B, + 0x3FFE8F5C,0x28F5C28F, 0xC006AC4F,0xBEDC1F14, + 0x3FFEB851,0xEB851EB8, 0xC005F86B,0xF5F91262, + 0x3FFEE147,0xAE147AE1, 0xC0054E26,0x1635E74B, + 0x3FFF0A3D,0x70A3D70A, 0xC004ACB5,0xCB251BE2, + 0x3FFF3333,0x33333333, 0xC0041367,0xDFC9C347, + 0x3FFF5C28,0xF5C28F5C, 0xC003819B,0x87E3E8DF, + 0x3FFF851E,0xB851EB85, 0xC002F6C0,0x11A68542, + 0x3FFFAE14,0x7AE147AE, 0xC0027252,0xEDFA8CC6, + 0x3FFFD70A,0x3D70A3D7, 0xC001F3DE,0x00DB394C, + 0x40000000,0x00000000, 0xC0017AF6,0x2E0950F8, + 0x4000147A,0xE147AE14, 0xC001073A,0x18777A95, + 0x400028F5,0xC28F5C29, 0xC0009851,0x0C882451, + 0x40003D70,0xA3D70A3D, 0xC0002DEA,0x0E9606EB, + 0x400051EB,0x851EB852, 0xBFFF8F76,0x10BA6B13, + 0x40006666,0x66666666, 0xBFFECB00,0x21842076, + 0x40007AE1,0x47AE147B, 0xBFFE0DF5,0x946081BC, + 0x40008F5C,0x28F5C28F, 0xBFFD57E3,0xA8CD66A0, + 0x4000A3D7,0x0A3D70A4, 0xBFFCA860,0x9E09CA5B, + 0x4000B851,0xEB851EB8, 0xBFFBFF0A,0xD52E814F, + 0x4000CCCC,0xCCCCCCCD, 0xBFFB5B88,0x0C6F419E, + 0x4000E147,0xAE147AE1, 0xBFFABD84,0xB03FE6A3, + 0x4000F5C2,0x8F5C28F6, 0xBFFA24B3,0x3F939F84, + 0x40010A3D,0x70A3D70A, 0xBFF990CB,0xC0D1EB78, + 0x40011EB8,0x51EB851F, 0xBFF9018B,0x45734C5E, + 0x40013333,0x33333333, 0xBFF876B3,0x7A80440D, + 0x400147AE,0x147AE148, 0xBFF7F00A,0x446ABF38, + 0x40015C28,0xF5C28F5C, 0xBFF76D59,0x64EE63D0, + 0x400170A3,0xD70A3D71, 0xBFF6EE6E,0x29D0CD96, + 0x4001851E,0xB851EB85, 0xBFF67319,0x2380E0BE, + 0x40019999,0x9999999A, 0xBFF5FB2D,0xE2B500EB, + 0x4001AE14,0x7AE147AE, 0xBFF58682,0xBC440B6B, + 0x4001C28F,0x5C28F5C3, 0xBFF514F0,0x928D1D1F, + 0x4001D70A,0x3D70A3D7, 0xBFF4A652,0xA3D70C9D, + 0x4001EB85,0x1EB851EC, 0xBFF43A86,0x5D228F65, + 0x40020000,0x00000000, 0xBFF3D16B,0x30F9ADCF, + 0x4002147A,0xE147AE14, 0xBFF36AE2,0x71D4C753, + 0x400228F5,0xC28F5C29, 0xBFF306CF,0x2FB9489E, + 0x40023D70,0xA3D70A3D, 0xBFF2A516,0x18C090EC, + 0x400251EB,0x851EB852, 0xBFF2459D,0x5C3E9543, + 0x40026666,0x66666666, 0xBFF1E84C,0x9047C337, + 0x40027AE1,0x47AE147B, 0xBFF18D0C,0x995C9E9A, + 0x40028F5C,0x28F5C28F, 0xBFF133C7,0x9407BAC9, + 0x4002A3D7,0x0A3D70A4, 0xBFF0DC68,0xC04018F0, + 0x4002B851,0xEB851EB8, 0xBFF086DC,0x6E66BD32, + 0x4002CCCC,0xCCCCCCCD, 0xBFF0330F,0xEDBA860A, + 0x4002E147,0xAE147AE1, 0xBFEFC1E2,0xF84221F4, + 0x4002F5C2,0x8F5C28F6, 0xBFEF20E0,0x6E4D9304, + 0x40030A3D,0x70A3D70A, 0xBFEE82F8,0x1C366935, + 0x40031EB8,0x51EB851F, 0xBFEDE80B,0x6A625622, + 0x40033333,0x33333333, 0xBFED4FFD,0x331A1C6C, + 0x400347AE,0x147AE148, 0xBFECBAB1,0xAC5A320E, + 0x40035C28,0xF5C28F5C, 0xBFEC280E,0x53339FE0, + 0x400370A3,0xD70A3D71, 0xBFEB97F9,0xD89C7A0F, + 0x4003851E,0xB851EB85, 0xBFEB0A5C,0x0F924FE5, + 0x40039999,0x9999999A, 0xBFEA7F1D,0xDC73A18D, + 0x4003AE14,0x7AE147AE, 0xBFE9F629,0x2577D856, + 0x4003C28F,0x5C28F5C3, 0xBFE96F68,0xC42F6A54, + 0x4003D70A,0x3D70A3D7, 0xBFE8EAC8,0x77F7CAEA, + 0x4003EB85,0x1EB851EC, 0xBFE86834,0xD9508D7E, + 0x40040000,0x00000000, 0xBFE7E79B,0x4E00BB15, + 0x4004147A,0xE147AE14, 0xBFE768E9,0xFDFCCC3A, + 0x400428F5,0xC28F5C29, 0xBFE6EC0F,0xC8FF094F, + 0x40043D70,0xA3D70A3D, 0xBFE670FC,0x3CC5423D, + 0x400451EB,0x851EB852, 0xBFE5F79F,0x8BE7E214, + 0x40046666,0x66666666, 0xBFE57FEA,0x853F5E3C, + 0x40047AE1,0x47AE147B, 0xBFE509CE,0x8BCDE2E4, + 0x40048F5C,0x28F5C28F, 0xBFE4953D,0x8F23EECD, + 0x4004A3D7,0x0A3D70A4, 0xBFE4222A,0x04374B8F, + 0x4004B851,0xEB851EB8, 0xBFE3B086,0xDEA47CAD, + 0x4004CCCC,0xCCCCCCCD, 0xBFE34047,0x8A535B2B, + 0x4004E147,0xAE147AE1, 0xBFE2D15F,0xE57823E1, + 0x4004F5C2,0x8F5C28F6, 0xBFE263C4,0x3AEAC051, + 0x40050A3D,0x70A3D70A, 0xBFE1F769,0x3CCE8ACA, + 0x40051EB8,0x51EB851F, 0xBFE18C43,0xFF853AF4, + 0x40053333,0x33333333, 0xBFE12249,0xF4E80DBB, + 0x400547AE,0x147AE148, 0xBFE0B970,0xE7C29638, + 0x40055C28,0xF5C28F5C, 0xBFE051AE,0xF78AFB49, + 0x400570A3,0xD70A3D71, 0xBFDFD5F5,0x28A7639E, + 0x4005851E,0xB851EB85, 0xBFDF0A94,0xF5E6187B, + 0x40059999,0x9999999A, 0xBFDE412B,0x62BA7143, + 0x4005AE14,0x7AE147AE, 0xBFDD79A7,0x065B07EC, + 0x4005C28F,0x5C28F5C3, 0xBFDCB3F6,0xFCB7E02F, + 0x4005D70A,0x3D70A3D7, 0xBFDBF00A,0xE038BC8B, + 0x4005EB85,0x1EB851EC, 0xBFDB2DD2,0xC3C97C79, + 0x40060000,0x00000000, 0xBFDA6D3F,0x2D2FBDDF, + 0x4006147A,0xE147AE14, 0xBFD9AE41,0x0FA54A23, + 0x400628F5,0xC28F5C29, 0xBFD8F0C9,0xC6B32406, + 0x40063D70,0xA3D70A3D, 0xBFD834CB,0x11494F1D, + 0x400651EB,0x851EB852, 0xBFD77A37,0x0D0FA9A0, + 0x40066666,0x66666666, 0xBFD6C100,0x31EC6D8F, + 0x40067AE1,0x47AE147B, 0xBFD60919,0x4DBD22FB, + 0x40068F5C,0x28F5C28F, 0xBFD55275,0x803F0213, + 0x4006A3D7,0x0A3D70A4, 0xBFD49D08,0x3723F05E, + 0x4006B851,0xEB851EB8, 0xBFD3E8C5,0x2A51724F, + 0x4006CCCC,0xCCCCCCCD, 0xBFD335A0,0x58471083, + 0x4006E147,0xAE147AE1, 0xBFD2838E,0x02A9D7B2, + 0x4006F5C2,0x8F5C28F6, 0xBFD1D282,0xAAF2BADC, + 0x40070A3D,0x70A3D70A, 0xBFD12273,0x0F3DC1BE, + 0x40071EB8,0x51EB851F, 0xBFD07354,0x27380945, + 0x40073333,0x33333333, 0xBFCF8A36,0x4255739F, + 0x400747AE,0x147AE148, 0xBFCE2F7A,0xBE425D06, + 0x40075C28,0xF5C28F5C, 0xBFCCD660,0xE8514668, + 0x400770A3,0xD70A3D71, 0xBFCB7ED4,0x434FA4BA, + 0x4007851E,0xB851EB85, 0xBFCA28C0,0xA99A06CD, + 0x40079999,0x9999999A, 0xBFC8D412,0x482234DD, + 0x4007AE14,0x7AE147AE, 0xBFC780B5,0x999C9D3F, + 0x4007C28F,0x5C28F5C3, 0xBFC62E97,0x61D274B1, + 0x4007D70A,0x3D70A3D7, 0xBFC4DDA4,0xA9161384, + 0x4007EB85,0x1EB851EC, 0xBFC38DCA,0xB7D7307D, + 0x40080000,0x00000000, 0xBFC23EF7,0x1254B86F, + 0x4008147A,0xE147AE14, 0xBFC0F117,0x746A1536, + 0x400828F5,0xC28F5C29, 0xBFBF4833,0x9AEBA09F, + 0x40083D70,0xA3D70A3D, 0xBFBCAFD8,0x78AF1E09, + 0x400851EB,0x851EB852, 0xBFBA18FA,0x1706F131, + 0x40086666,0x66666666, 0xBFB78375,0x5A525376, + 0x40087AE1,0x47AE147B, 0xBFB4EF27,0x6ED8C87F, + 0x40088F5C,0x28F5C28F, 0xBFB25BED,0xC15B774D, + 0x4008A3D7,0x0A3D70A4, 0xBFAF934B,0xEF861D63, + 0x4008B851,0xEB851EB8, 0xBFAA705B,0xD3CDC956, + 0x4008CCCC,0xCCCCCCCD, 0xBFA54EC7,0x34D41690, + 0x4008E147,0xAE147AE1, 0xBFA02E4A,0x5F565CE2, + 0x4008F5C2,0x8F5C28F6, 0xBF961D43,0xB310503E, + 0x40090A3D,0x70A3D70A, 0xBF87BE29,0x54AD5EB0, + 0x40091EB8,0x51EB851F, 0xBF5A1814,0x37675567, + 0x40093333,0x33333333, 0x3F8137F9,0x856D6E41, + 0x400947AE,0x147AE148, 0x3F92D9EB,0xA4F62313, + 0x40095C28,0xF5C28F5C, 0x3F9D18D1,0xB72C1B1B, + 0x400970A3,0xD70A3D71, 0x3FA3AC9A,0xBFF3086B, + 0x4009851E,0xB851EB85, 0x3FA8CDCE,0xE9FD6569, + 0x40099999,0x9999999A, 0x3FADF048,0xF9266060, + 0x4009AE14,0x7AE147AE, 0x3FB18A26,0x67EEAFBE, + 0x4009C28F,0x5C28F5C3, 0x3FB41D0F,0x50D2CBD6, + 0x4009D70A,0x3D70A3D7, 0x3FB6B101,0x80A79C58, + 0x4009EB85,0x1EB851EC, 0x3FB9461F,0x77AD405C, + 0x400A0000,0x00000000, 0x3FBBDC8B,0xF445936C, + 0x400A147A,0xE147AE14, 0x3FBE7469,0xFA596046, + 0x400A28F5,0xC28F5C29, 0x3FC086EE,0x6D6E387C, + 0x400A3D70,0xA3D70A3D, 0x3FC1D484,0x1DB9FC33, + 0x400A51EB,0x851EB852, 0x3FC32308,0x0F2175C4, + 0x400A6666,0x66666666, 0x3FC4728C,0x74EFFCF3, + 0x400A7AE1,0x47AE147B, 0x3FC5C323,0xB8BC7E0F, + 0x400A8F5C,0x28F5C28F, 0x3FC714E0,0x7E93E585, + 0x400AA3D7,0x0A3D70A4, 0x3FC867D5,0xA93E50A7, + 0x400AB851,0xEB851EB8, 0x3FC9BC16,0x5EA125B4, + 0x400ACCCC,0xCCCCCCCD, 0x3FCB11B6,0x0C40508C, + 0x400AE147,0xAE147AE1, 0x3FCC68C8,0x6BE0F671, + 0x400AF5C2,0x8F5C28F6, 0x3FCDC161,0x885012CC, + 0x400B0A3D,0x70A3D70A, 0x3FCF1B95,0xC24F8827, + 0x400B1EB8,0x51EB851F, 0x3FD03BBC,0xEAD62A78, + 0x400B3333,0x33333333, 0x3FD0EA91,0x6F405CD1, + 0x400B47AE,0x147AE148, 0x3FD19A53,0x2F52A3EA, + 0x400B5C28,0xF5C28F5C, 0x3FD24B0D,0x21A9FA95, + 0x400B70A3,0xD70A3D71, 0x3FD2FCCA,0x75803EAD, + 0x400B851E,0xB851EB85, 0x3FD3AF96,0x95B4C42B, + 0x400B9999,0x9999999A, 0x3FD4637D,0x2BF3206B, + 0x400BAE14,0x7AE147AE, 0x3FD5188A,0x23FA1C89, + 0x400BC28F,0x5C28F5C3, 0x3FD5CEC9,0xAF04DD47, + 0x400BD70A,0x3D70A3D7, 0x3FD68648,0x47586C2C, + 0x400BEB85,0x1EB851EC, 0x3FD73F12,0xB3F7F1AE, + 0x400C0000,0x00000000, 0x3FD7F936,0x0C8212A7, + 0x400C147A,0xE147AE14, 0x3FD8B4BF,0xBD3A0CE3, + 0x400C28F5,0xC28F5C29, 0x3FD971BD,0x8B3F572C, + 0x400C3D70,0xA3D70A3D, 0x3FDA303D,0x98F6B846, + 0x400C51EB,0x851EB852, 0x3FDAF04E,0x6AA7F9CC, + 0x400C6666,0x66666666, 0x3FDBB1FE,0xEB539007, + 0x400C7AE1,0x47AE147B, 0x3FDC755E,0x71C3CB76, + 0x400C8F5C,0x28F5C28F, 0x3FDD3A7C,0xC5DD64C3, + 0x400CA3D7,0x0A3D70A4, 0x3FDE016A,0x2633799A, + 0x400CB851,0xEB851EB8, 0x3FDECA37,0x4DE35722, + 0x400CCCCC,0xCCCCCCCD, 0x3FDF94F5,0x7ABCC018, + 0x400CE147,0xAE147AE1, 0x3FE030DB,0x39DDD7B5, + 0x400CF5C2,0x8F5C28F6, 0x3FE09846,0x47EC7B6E, + 0x400D0A3D,0x70A3D70A, 0x3FE100C5,0x5E9BBD7C, + 0x400D1EB8,0x51EB851F, 0x3FE16A62,0x445A1E5C, + 0x400D3333,0x33333333, 0x3FE1D527,0x12EFEA2B, + 0x400D47AE,0x147AE148, 0x3FE2411E,0x3BB441CA, + 0x400D5C28,0xF5C28F5C, 0x3FE2AE52,0x8BFE46FB, + 0x400D70A3,0xD70A3D71, 0x3FE31CCF,0x31D68FC4, + 0x400D851E,0xB851EB85, 0x3FE38C9F,0xC0ED5649, + 0x400D9999,0x9999999A, 0x3FE3FDD0,0x37DA3554, + 0x400DAE14,0x7AE147AE, 0x3FE4706D,0x05AAA22E, + 0x400DC28F,0x5C28F5C3, 0x3FE4E483,0x0FC4C04C, + 0x400DD70A,0x3D70A3D7, 0x3FE55A1F,0xB8249E6D, + 0x400DEB85,0x1EB851EC, 0x3FE5D150,0xE3FA6D5E, + 0x400E0000,0x00000000, 0x3FE64A25,0x02B0CA3B, + 0x400E147A,0xE147AE14, 0x3FE6C4AB,0x1562CFC7, + 0x400E28F5,0xC28F5C29, 0x3FE740F2,0xB6CA47FE, + 0x400E3D70,0xA3D70A3D, 0x3FE7BF0C,0x23AF0ED3, + 0x400E51EB,0x851EB852, 0x3FE83F08,0x43E17FCE, + 0x400E6666,0x66666666, 0x3FE8C0F8,0xB3CAA42E, + 0x400E7AE1,0x47AE147B, 0x3FE944EF,0xCE9DCB31, + 0x400E8F5C,0x28F5C28F, 0x3FE9CB00,0xB9383FC0, + 0x400EA3D7,0x0A3D70A4, 0x3FEA533F,0x6DBCF6E1, + 0x400EB851,0xEB851EB8, 0x3FEADDC0,0xC7FB5569, + 0x400ECCCC,0xCCCCCCCD, 0x3FEB6A9A,0x92B193F9, + 0x400EE147,0xAE147AE1, 0x3FEBF9E3,0x95BCD327, + 0x400EF5C2,0x8F5C28F6, 0x3FEC8BB3,0xA54AAA88, + 0x400F0A3D,0x70A3D70A, 0x3FED2023,0xB221E225, + 0x400F1EB8,0x51EB851F, 0x3FEDB74D,0xDB1A2351, + 0x400F3333,0x33333333, 0x3FEE514D,0x7FDCC3DA, + 0x400F47AE,0x147AE148, 0x3FEEEE3F,0x550B6B09, + 0x400F5C28,0xF5C28F5C, 0x3FEF8E41,0x79EC34DB, + 0x400F70A3,0xD70A3D71, 0x3FF018B9,0xC7DF1AD3, + 0x400F851E,0xB851EB85, 0x3FF06BFB,0x696E6D99, + 0x400F9999,0x9999999A, 0x3FF0C0F7,0x1AEE59E4, + 0x400FAE14,0x7AE147AE, 0x3FF117BF,0x3F6853A1, + 0x400FC28F,0x5C28F5C3, 0x3FF17067,0x3375E0EE, + 0x400FD70A,0x3D70A3D7, 0x3FF1CB03,0x5E5CAFC7, + 0x400FEB85,0x1EB851EC, 0x3FF227A9,0x4495F7D8, + 0x40100000,0x00000000, 0x3FF2866F,0x9BE4DE13, + 0x40100A3D,0x70A3D70A, 0x3FF2E76E,0x6123A1FA, + 0x4010147A,0xE147AE14, 0x3FF34ABE,0xEFF3F3ED, + 0x40101EB8,0x51EB851F, 0x3FF3B07C,0x1C84085B, + 0x401028F5,0xC28F5C29, 0x3FF418C2,0x4F9FE0DA, + 0x40103333,0x33333333, 0x3FF483AF,0xA54CF833, + 0x40103D70,0xA3D70A3D, 0x3FF4F164,0x0E361CC1, + 0x401047AE,0x147AE148, 0x3FF56201,0x7435F6EE, + 0x401051EB,0x851EB852, 0x3FF5D5AB,0xE258A65E, + 0x40105C28,0xF5C28F5C, 0x3FF64C89,0xB0B83EB8, + 0x40106666,0x66666666, 0x3FF6C6C3,0xB4A4F47E, + 0x401070A3,0xD70A3D71, 0x3FF74485,0x7598C740, + 0x40107AE1,0x47AE147B, 0x3FF7C5FD,0x6787B78C, + 0x4010851E,0xB851EB85, 0x3FF84B5D,0x2B318524, + 0x40108F5C,0x28F5C28F, 0x3FF8D4D9,0xD530FF49, + 0x40109999,0x9999999A, 0x3FF962AC,0x3C9FB267, + 0x4010A3D7,0x0A3D70A4, 0x3FF9F511,0x5243D841, + 0x4010AE14,0x7AE147AE, 0x3FFA8C4A,0x8162B618, + 0x4010B851,0xEB851EB8, 0x3FFB289E,0x1B7BF881, + 0x4010C28F,0x5C28F5C3, 0x3FFBCA57,0xD0645308, + 0x4010CCCC,0xCCCCCCCD, 0x3FFC71C9,0x34701778, + 0x4010D70A,0x3D70A3D7, 0x3FFD1F4A,0x56A3619E, + 0x4010E147,0xAE147AE1, 0x3FFDD33A,0x692EF174, + 0x4010EB85,0x1EB851EC, 0x3FFE8E00,0x7EE183CE, + 0x4010F5C2,0x8F5C28F6, 0x3FFF500C,0x60A89856, + 0x40110000,0x00000000, 0x40000CEB,0xBF628F31, + 0x40110A3D,0x70A3D70A, 0x400075F3,0x00FEB2B6, + 0x4011147A,0xE147AE14, 0x4000E364,0x00EE10ED, + 0x40111EB8,0x51EB851F, 0x4001558D,0x72FE0A92, + 0x401128F5,0xC28F5C29, 0x4001CCC5,0x7CC15EC5, + 0x40113333,0x33333333, 0x4002496A,0x9CA760A9, + 0x40113D70,0xA3D70A3D, 0x4002CBE4,0xB388298E, + 0x401147AE,0x147AE148, 0x400354A6,0x36CB66E9, + 0x401151EB,0x851EB852, 0x4003E42D,0x929899F0, + 0x40115C28,0xF5C28F5C, 0x40047B06,0xC51868FC, + 0x40116666,0x66666666, 0x400519CD,0x3DCCEF9A, + 0x401170A3,0xD70A3D71, 0x4005C12E,0x0E879FEB, + 0x40117AE1,0x47AE147B, 0x400671EA,0x7EAC4FD2, + 0x4011851E,0xB851EB85, 0x40072CDB,0x1575275A, + 0x40118F5C,0x28F5C28F, 0x4007F2F3,0x350E3F18, + 0x40119999,0x9999999A, 0x4008C545,0x66FDBDEC, + 0x4011A3D7,0x0A3D70A4, 0x4009A508,0x82E370F9, + 0x4011AE14,0x7AE147AE, 0x400A939D,0xE3D5A677, + 0x4011B851,0xEB851EB8, 0x400B9298,0xEF70163E, + 0x4011C28F,0x5C28F5C3, 0x400CA3C8,0x455D4218, + 0x4011CCCC,0xCCCCCCCD, 0x400DC941,0x089849E0, + 0x4011D70A,0x3D70A3D7, 0x400F056C,0xD78A2EDB, + 0x4011E147,0xAE147AE1, 0x40102D8D,0x9CAF3190, + 0x4011EB85,0x1EB851EC, 0x4010E6CB,0xC599C19C, + 0x4011F5C2,0x8F5C28F6, 0x4011B062,0x6BDC4851, + 0x40120000,0x00000000, 0x40128CA0,0xC62BF595, + 0x40120A3D,0x70A3D70A, 0x40137E4A,0xE22E6BDD, + 0x4012147A,0xE147AE14, 0x401488B8,0x020BC6EA, + 0x40121EB8,0x51EB851F, 0x4015AFFA,0xF7407ABD, + 0x401228F5,0xC28F5C29, 0x4016F918,0x89139216, + 0x40123333,0x33333333, 0x40186A51,0xF4A4BCE8, + 0x40123D70,0xA3D70A3D, 0x401A0B8C,0xC23408C5, + 0x401247AE,0x147AE148, 0x401BE6E6,0x5B418FD1, + 0x401251EB,0x851EB852, 0x401E098A,0x83E8B7AB, + 0x40125C28,0xF5C28F5C, 0x40204279,0x7C85C3DD, + 0x40126666,0x66666666, 0x4021B868,0xD80B4C11, + 0x401270A3,0xD70A3D71, 0x4023770D,0x3005D2D4, + 0x40127AE1,0x47AE147B, 0x40259602,0x7F4B226B, + 0x4012851E,0xB851EB85, 0x4028385B,0x1B77EDE6, + 0x40128F5C,0x28F5C28F, 0x402B948A,0x80D7055A, + 0x40129999,0x9999999A, 0x403001F6,0xA713EF1D, + 0x4012A3D7,0x0A3D70A4, 0x4033120D,0x6E567C5F, + 0x4012AE14,0x7AE147AE, 0x403793B0,0x14CFE6DD, + 0x4012B851,0xEB851EB8, 0x403EDD28,0xA291F23C, + 0x4012C28F,0x5C28F5C3, 0x40465424,0x9701608D, + 0x4012CCCC,0xCCCCCCCD, 0x40542D9D,0xE890C6A9, + 0x4012D70A,0x3D70A3D7, 0x407A2967,0xB8BA248E, + 0x4012E147,0xAE147AE1, 0xC0606C59,0x52D96EAC, + 0x4012EB85,0x1EB851EC, 0xC04C636C,0xD62A6257, + 0x4012F5C2,0x8F5C28F6, 0xC0421AA6,0xF169ED66, + 0x40130000,0x00000000, 0xC03A934E,0x58D7CC85, + 0x40130A3D,0x70A3D70A, 0xC034FCD7,0xD2DC29C4, + 0x4013147A,0xE147AE14, 0xC03156AD,0x56671A8A, + 0x40131EB8,0x51EB851F, 0xC02D8930,0x0597B53B, + 0x401328F5,0xC28F5C29, 0xC029B7C0,0x1A22AC84, + 0x40133333,0x33333333, 0xC026C50D,0xC43253B3, + 0x40133D70,0xA3D70A3D, 0xC0246CA3,0xCECE8128, + 0x401347AE,0x147AE148, 0xC022837F,0x4AE886B8, + 0x401351EB,0x851EB852, 0xC020ED3E,0x254228AF, + 0x40135C28,0xF5C28F5C, 0xC01F2CC7,0xB61F8BFB, + 0x40136666,0x66666666, 0xC01CE23B,0xE0FADD61, + 0x401370A3,0xD70A3D71, 0xC01AE6B1,0x8CE5AA9C, + 0x40137AE1,0x47AE147B, 0xC0192B1E,0xD5C27D9D, + 0x4013851E,0xB851EB85, 0xC017A410,0x99DC50C6, + 0x40138F5C,0x28F5C28F, 0xC01648A7,0xD51B1884, + 0x40139999,0x9999999A, 0xC01511E9,0xB3C687CB, + 0x4013A3D7,0x0A3D70A4, 0xC013FA45,0x0FCBE1B5, + 0x4013AE14,0x7AE147AE, 0xC012FD3B,0x55E7BA64, + 0x4013B851,0xEB851EB8, 0xC0121721,0x6F136D8C, + 0x4013C28F,0x5C28F5C3, 0xC01144F1,0x4B5C7084, + 0x4013CCCC,0xCCCCCCCD, 0xC0108427,0x27EA8A1F, + 0x4013D70A,0x3D70A3D7, 0xC00FA54E,0x7E67A867, + 0x4013E147,0xAE147AE1, 0xC00E5D53,0x340A0A6A, + 0x4013EB85,0x1EB851EC, 0xC00D2D54,0xCE016933, + 0x4013F5C2,0x8F5C28F6, 0xC00C12BB,0x68F3A9E7, + 0x40140000,0x00000000, 0xC00B0B4B,0x739BBB07, + 0x40140A3D,0x70A3D70A, 0xC00A1516,0x2C226A73, + 0x4014147A,0xE147AE14, 0xC0092E6D,0x23F265CB, + 0x40141EB8,0x51EB851F, 0xC00855D8,0x1F563A3F, + 0x401428F5,0xC28F5C29, 0xC0078A0C,0xCFDDA8E4, + 0x40143333,0x33333333, 0xC006C9E8,0x07199B18, + 0x40143D70,0xA3D70A3D, 0xC0061468,0x15E5C4AB, + 0x401447AE,0x147AE148, 0xC00568A8,0x1D6B1E39, + 0x401451EB,0x851EB852, 0xC004C5DC,0x23D3F339, + 0x40145C28,0xF5C28F5C, 0xC0042B4D,0xC86A9F1B, + 0x40146666,0x66666666, 0xC0039859,0x7A58D5D2, + 0x401470A3,0xD70A3D71, 0xC0030C6C,0x1B083445, + 0x40147AE1,0x47AE147B, 0xC0028700,0xF9A84E4C, + 0x4014851E,0xB851EB85, 0xC00207A0,0x18E8E15E, + 0x40148F5C,0x28F5C28F, 0xC0018DDC,0xB2C28011, + 0x40149999,0x9999999A, 0xC0011953,0xF06083E8, + 0x4014A3D7,0x0A3D70A4, 0xC000A9AB,0xCE054241, + 0x4014AE14,0x7AE147AE, 0xC0003E92,0x242E5A61, + 0x4014B851,0xEB851EB8, 0xBFFFAF77,0xA0CB2BDF, + 0x4014C28F,0x5C28F5C3, 0xBFFEE9C7,0xF233E017, + 0x4014CCCC,0xCCCCCCCD, 0xBFFE2B96,0xD13EA593, + 0x4014D70A,0x3D70A3D7, 0xBFFD746F,0xF826A0D3, + 0x4014E147,0xAE147AE1, 0xBFFCC3E8,0x46D108A5, + 0x4014EB85,0x1EB851EC, 0xBFFC199C,0xE08DA66F, + 0x4014F5C2,0x8F5C28F6, 0xBFFB7532,0x63919678, + 0x40150000,0x00000000, 0xBFFAD654,0x36D2B404, + 0x40150A3D,0x70A3D70A, 0xBFFA3CB3,0xEB67679B, + 0x4015147A,0xE147AE14, 0xBFF9A808,0xAEF79B2F, + 0x40151EB8,0x51EB851F, 0xBFF9180E,0xCD24004B, + 0x401528F5,0xC28F5C29, 0xBFF88C87,0x3E13753C, + 0x40153333,0x33333333, 0xBFF80537,0x409587B1, + 0x40153D70,0xA3D70A3D, 0xBFF781E7,0xFE7EC38B, + 0x401547AE,0x147AE148, 0xBFF70266,0x3A11352C, + 0x401551EB,0x851EB852, 0xBFF68682,0x036A98E0, + 0x40155C28,0xF5C28F5C, 0xBFF60E0E,0x75132642, + 0x40156666,0x66666666, 0xBFF598E1,0x76E4A597, + 0x401570A3,0xD70A3D71, 0xBFF526D3,0x869A3A55, + 0x40157AE1,0x47AE147B, 0xBFF4B7BF,0x856EAB69, + 0x4015851E,0xB851EB85, 0xBFF44B82,0x8A416B2B, + 0x40158F5C,0x28F5C28F, 0xBFF3E1FB,0xB7CAA946, + 0x40159999,0x9999999A, 0xBFF37B0C,0x1674A47B, + 0x4015A3D7,0x0A3D70A4, 0xBFF31696,0x717C9515, + 0x4015AE14,0x7AE147AE, 0xBFF2B47F,0x37081E28, + 0x4015B851,0xEB851EB8, 0xBFF254AC,0x5AE577BD, + 0x4015C28F,0x5C28F5C3, 0xBFF1F705,0x3BB4A007, + 0x4015CCCC,0xCCCCCCCD, 0xBFF19B72,0x8A3F0291, + 0x4015D70A,0x3D70A3D7, 0xBFF141DE,0x32C947CD, + 0x4015E147,0xAE147AE1, 0xBFF0EA33,0x4830863E, + 0x4015EB85,0x1EB851EC, 0xBFF0945D,0xF0A8ED4E, + 0x4015F5C2,0x8F5C28F6, 0xBFF0404B,0x53F8523F, + 0x40160000,0x00000000, 0xBFEFDBD3,0x1615B07A, + 0x40160A3D,0x70A3D70A, 0xBFEF3A4F,0x2186A1B7, + 0x4016147A,0xE147AE14, 0xBFEE9BEA,0x67D7E721, + 0x40161EB8,0x51EB851F, 0xBFEE0086,0x145D7263, + 0x401628F5,0xC28F5C29, 0xBFED6804,0xC7FE16EE, + 0x40163333,0x33333333, 0xBFECD24A,0x82C132C9, + 0x40163D70,0xA3D70A3D, 0xBFEC3F3C,0x8EF2141B, + 0x401647AE,0x147AE148, 0xBFEBAEC1,0x6DB7F4D2, + 0x401651EB,0x851EB852, 0xBFEB20C0,0xC50475AA, + 0x40165C28,0xF5C28F5C, 0xBFEA9523,0x4EBD3E38, + 0x40166666,0x66666666, 0xBFEA0BD2,0xC907E03E, + 0x401670A3,0xD70A3D71, 0xBFE984B9,0xE7A1523E, + 0x40167AE1,0x47AE147B, 0xBFE8FFC4,0x462C55D1, + 0x4016851E,0xB851EB85, 0xBFE87CDE,0x5B63EA04, + 0x40168F5C,0x28F5C28F, 0xBFE7FBF5,0x6D208C16, + 0x40169999,0x9999999A, 0xBFE77CF7,0x85207F68, + 0x4016A3D7,0x0A3D70A4, 0xBFE6FFD3,0x6684AB8F, + 0x4016AE14,0x7AE147AE, 0xBFE68478,0x83F4D287, + 0x4016B851,0xEB851EB8, 0xBFE60AD6,0xF65EFAB5, + 0x4016C28F,0x5C28F5C3, 0xBFE592DF,0x7446E4A5, + 0x4016CCCC,0xCCCCCCCD, 0xBFE51C83,0x499B4CC8, + 0x4016D70A,0x3D70A3D7, 0xBFE4A7B4,0x50078A21, + 0x4016E147,0xAE147AE1, 0xBFE43464,0xE7B8DBC0, + 0x4016EB85,0x1EB851EC, 0xBFE3C287,0xF08F63B2, + 0x4016F5C2,0x8F5C28F6, 0xBFE35210,0xC3B36E38, + 0x40170000,0x00000000, 0xBFE2E2F3,0x2D88343E, + 0x40170A3D,0x70A3D70A, 0xBFE27523,0x67F5CE4C, + 0x4017147A,0xE147AE14, 0xBFE20896,0x15048503, + 0x40171EB8,0x51EB851F, 0xBFE19D40,0x39C41C69, + 0x401728F5,0xC28F5C29, 0xBFE13317,0x397A1CF1, + 0x40173333,0x33333333, 0xBFE0CA10,0xD11279EF, + 0x40173D70,0xA3D70A3D, 0xBFE06223,0x12CE4C3B, + 0x401747AE,0x147AE148, 0xBFDFF688,0xC4594A0F, + 0x401751EB,0x851EB852, 0xBFDF2AD6,0xE0138D02, + 0x40175C28,0xF5C28F5C, 0xBFDE611E,0x6DE2A27D, + 0x40176666,0x66666666, 0xBFDD994D,0xEF40685C, + 0x401770A3,0xD70A3D71, 0xBFDCD354,0x6B66C789, + 0x40177AE1,0x47AE147B, 0xBFDC0F21,0x69012494, + 0x4017851E,0xB851EB85, 0xBFDB4CA4,0xE82CA40C, + 0x40178F5C,0x28F5C28F, 0xBFDA8BCF,0x5CC26F7F, + 0x40179999,0x9999999A, 0xBFD9CC91,0xA8E776FC, + 0x4017A3D7,0x0A3D70A4, 0xBFD90EDD,0x17DD78C2, + 0x4017AE14,0x7AE147AE, 0xBFD852A3,0x59115C7C, + 0x4017B851,0xEB851EB8, 0xBFD797D6,0x7B6332C0, + 0x4017C28F,0x5C28F5C3, 0xBFD6DE68,0xE8A4629E, + 0x4017CCCC,0xCCCCCCCD, 0xBFD6264D,0x6148C8A4, + 0x4017D70A,0x3D70A3D7, 0xBFD56F76,0xF847BBD0, + 0x4017E147,0xAE147AE1, 0xBFD4B9D9,0x0F2A1F35, + 0x4017EB85,0x1EB851EC, 0xBFD40567,0x5242D07B, + 0x4017F5C2,0x8F5C28F6, 0xBFD35215,0xB50EEE4E, + 0x40180000,0x00000000, 0xBFD29FD8,0x6EBB95BE, + 0x40180A3D,0x70A3D70A, 0xBFD1EEA3,0xF6CEDB3D, + 0x4018147A,0xE147AE14, 0xBFD13E6D,0x01F1E224, + 0x40181EB8,0x51EB851F, 0xBFD08F28,0x7EDA1559, + 0x401828F5,0xC28F5C29, 0xBFCFC197,0x269F3F77, + 0x40183333,0x33333333, 0xBFCE6697,0x329EB7B0, + 0x40183D70,0xA3D70A3D, 0xBFCD0D3C,0x388D19B7, + 0x401847AE,0x147AE148, 0xBFCBB571,0xACCD8DC5, + 0x401851EB,0x851EB852, 0xBFCA5F23,0x5C2106DA, + 0x40185C28,0xF5C28F5C, 0xBFC90A3D,0x66A5E076, + 0x40186666,0x66666666, 0xBFC7B6AC,0x3AFF3643, + 0x401870A3,0xD70A3D71, 0xBFC6645C,0x91A15744, + 0x40187AE1,0x47AE147B, 0xBFC5133B,0x6840D861, + 0x4018851E,0xB851EB85, 0xBFC3C335,0xFD61E310, + 0x40188F5C,0x28F5C28F, 0xBFC27439,0xCC057B7F, + 0x40189999,0x9999999A, 0xBFC12634,0x87728D50, + 0x4018A3D7,0x0A3D70A4, 0xBFBFB228,0x2E314F16, + 0x4018AE14,0x7AE147AE, 0xBFBD198D,0x2514C2E4, + 0x4018B851,0xEB851EB8, 0xBFBA8274,0x7B1AF1B0, + 0x4018C28F,0x5C28F5C3, 0xBFB7ECBB,0x087D8E67, + 0x4018CCCC,0xCCCCCCCD, 0xBFB5583D,0xEE907AF9, + 0x4018D70A,0x3D70A3D7, 0xBFB2C4DA,0x904E42B0, + 0x4018E147,0xAE147AE1, 0xBFB0326E,0x8B01AE21, + 0x4018EB85,0x1EB851EC, 0xBFAB41AF,0x5E1229DA, + 0x4018F5C2,0x8F5C28F6, 0xBFA61FE7,0xF160582C, + 0x40190000,0x00000000, 0xBFA0FF43,0x123A338E, + 0x40190A3D,0x70A3D70A, 0xBF97BEFA,0x7D36BBC6, + 0x4019147A,0xE147AE14, 0xBF8B014C,0x890D5442, + 0x40191EB8,0x51EB851F, 0xBF6A1818,0x8DDF1E5A, + 0x401928F5,0xC28F5C29, 0x3F7BE9D5,0x7E31634E, + 0x40193333,0x33333333, 0x3F913849,0x4AF2A746, + }; + +LOCAL_D const TUint32 ExpTest[] = + { + 0xC0000000,0x00000000, 0x3FC152AA,0xA3BF81CC, + 0xBFFFD70A,0x3D70A3D7, 0x3FC17F3C,0x56E69205, + 0xBFFFAE14,0x7AE147AE, 0x3FC1AC40,0xB56ABECC, + 0xBFFF851E,0xB851EB85, 0x3FC1D9B8,0xE652C462, + 0xBFFF5C28,0xF5C28F5C, 0x3FC207A6,0x139C6D76, + 0xBFFF3333,0x33333333, 0x3FC23609,0x6A44340F, + 0xBFFF0A3D,0x70A3D70A, 0x3FC264E4,0x1A4CF61B, + 0xBFFEE147,0xAE147AE1, 0x3FC29437,0x56C7BDD5, + 0xBFFEB851,0xEB851EB8, 0x3FC2C404,0x55DB9E2B, + 0xBFFE8F5C,0x28F5C28F, 0x3FC2F44C,0x50CDA35E, + 0xBFFE6666,0x66666666, 0x3FC32510,0x8408D817, + 0xBFFE3D70,0xA3D70A3D, 0x3FC35652,0x2F265F15, + 0xBFFE147A,0xE147AE14, 0x3FC38812,0x94F5A1B7, + 0xBFFDEB85,0x1EB851EC, 0x3FC3BA52,0xFB849391, + 0xBFFDC28F,0x5C28F5C3, 0x3FC3ED14,0xAC280B4D, + 0xBFFD9999,0x9999999A, 0x3FC42058,0xF38430F0, + 0xBFFD70A3,0xD70A3D71, 0x3FC45421,0x219501EA, + 0xBFFD47AE,0x147AE148, 0x3FC4886E,0x89B6EAFE, + 0xBFFD1EB8,0x51EB851F, 0x3FC4BD42,0x82AF7851, + 0xBFFCF5C2,0x8F5C28F6, 0x3FC4F29E,0x66B61BD1, + 0xBFFCCCCC,0xCCCCCCCD, 0x3FC52883,0x937D0A33, + 0xBFFCA3D7,0x0A3D70A4, 0x3FC55EF3,0x6A3A2EBA, + 0xBFFC7AE1,0x47AE147B, 0x3FC595EF,0x4FB0360C, + 0xBFFC51EB,0x851EB852, 0x3FC5CD78,0xAC37B046, + 0xBFFC28F5,0xC28F5C29, 0x3FC60590,0xEBC84A91, + 0xBFFC0000,0x00000000, 0x3FC63E39,0x7E022073, + 0xBFFBD70A,0x3D70A3D7, 0x3FC67773,0xD637251A, + 0xBFFBAE14,0x7AE147AE, 0x3FC6B141,0x6B74A4E0, + 0xBFFB851E,0xB851EB85, 0x3FC6EBA3,0xB88CDF38, + 0xBFFB5C28,0xF5C28F5C, 0x3FC7269C,0x3C20B964, + 0xBFFB3333,0x33333333, 0x3FC7622C,0x78A98A07, + 0xBFFB0A3D,0x70A3D70A, 0x3FC79E55,0xF482FDFE, + 0xBFFAE147,0xAE147AE1, 0x3FC7DB1A,0x39F516A4, + 0xBFFAB851,0xEB851EB8, 0x3FC8187A,0xD73E41CB, + 0xBFFA8F5C,0x28F5C28F, 0x3FC85679,0x5E9D8BB1, + 0xBFFA6666,0x66666666, 0x3FC89517,0x665CEB31, + 0xBFFA3D70,0xA3D70A3D, 0x3FC8D456,0x88DBA86F, + 0xBFFA147A,0xE147AE14, 0x3FC91438,0x6498DE48, + 0xBFF9EB85,0x1EB851EC, 0x3FC954BE,0x9C3E16C7, + 0xBFF9C28F,0x5C28F5C3, 0x3FC995EA,0xD6AA02F2, + 0xBFF99999,0x9999999A, 0x3FC9D7BE,0xBEFB4E15, + 0xBFF970A3,0xD70A3D71, 0x3FCA1A3C,0x049B8D00, + 0xBFF947AE,0x147AE148, 0x3FCA5D64,0x5B4A4953, + 0xBFF91EB8,0x51EB851F, 0x3FCAA139,0x7B282942, + 0xBFF8F5C2,0x8F5C28F6, 0x3FCAE5BD,0x20C23400, + 0xBFF8CCCC,0xCCCCCCCD, 0x3FCB2AF1,0x0D1D3336, + 0xBFF8A3D7,0x0A3D70A4, 0x3FCB70D7,0x05C131B3, + 0xBFF87AE1,0x47AE147B, 0x3FCBB770,0xD4C517B9, + 0xBFF851EB,0x851EB852, 0x3FCBFEC0,0x48DA6523, + 0xBFF828F5,0xC28F5C29, 0x3FCC46C7,0x355909C1, + 0xBFF80000,0x00000000, 0x3FCC8F87,0x724B5C1D, + 0xBFF7D70A,0x3D70A3D7, 0x3FCCD902,0xDC7A2F1B, + 0xBFF7AE14,0x7AE147AE, 0x3FCD233B,0x557906A1, + 0xBFF7851E,0xB851EB85, 0x3FCD6E32,0xC3B26BB0, + 0xBFF75C28,0xF5C28F5C, 0x3FCDB9EB,0x12746030, + 0xBFF73333,0x33333333, 0x3FCE0666,0x31FCF2C8, + 0xBFF70A3D,0x70A3D70A, 0x3FCE53A6,0x1786F313, + 0xBFF6E147,0xAE147AE1, 0x3FCEA1AC,0xBD56C680, + 0xBFF6B851,0xEB851EB8, 0x3FCEF07C,0x22C75E39, + 0xBFF68F5C,0x28F5C28F, 0x3FCF4016,0x4C574E67, + 0xBFF66666,0x66666666, 0x3FCF907D,0x43B60715, + 0xBFF63D70,0xA3D70A3D, 0x3FCFE1B3,0x17D12F2E, + 0xBFF6147A,0xE147AE14, 0x3FD019DC,0xEE7110E0, + 0xBFF5EB85,0x1EB851EC, 0x3FD04349,0xD63DC704, + 0xBFF5C28F,0x5C28F5C3, 0x3FD06D21,0x52CB9D41, + 0xBFF59999,0x9999999A, 0x3FD09764,0x7651F5AD, + 0xBFF570A3,0xD70A3D71, 0x3FD0C214,0x55C9B65A, + 0xBFF547AE,0x147AE148, 0x3FD0ED32,0x08F46082, + 0xBFF51EB8,0x51EB851F, 0x3FD118BE,0xAA6339F2, + 0xBFF4F5C2,0x8F5C28F6, 0x3FD144BB,0x577E88E7, + 0xBFF4CCCC,0xCCCCCCCD, 0x3FD17129,0x308CE281, + 0xBFF4A3D7,0x0A3D70A4, 0x3FD19E09,0x58BA8C05, + 0xBFF47AE1,0x47AE147B, 0x3FD1CB5C,0xF620EF1F, + 0xBFF451EB,0x851EB852, 0x3FD1F925,0x31CE214D, + 0xBFF428F5,0xC28F5C29, 0x3FD22763,0x37CC7EAB, + 0xBFF40000,0x00000000, 0x3FD25618,0x372A584F, + 0xBFF3D70A,0x3D70A3D7, 0x3FD28545,0x6201B66B, + 0xBFF3AE14,0x7AE147AE, 0x3FD2B4EB,0xED802E61, + 0xBFF3851E,0xB851EB85, 0x3FD2E50D,0x11EECCFF, + 0xBFF35C28,0xF5C28F5C, 0x3FD315AA,0x0ABA1522, + 0xBFF33333,0x33333333, 0x3FD346C4,0x167A12DF, + 0xBFF30A3D,0x70A3D70A, 0x3FD3785C,0x76FA8377, + 0xBFF2E147,0xAE147AE1, 0x3FD3AA74,0x7143124B, + 0xBFF2B851,0xEB851EB8, 0x3FD3DD0D,0x4D9FAAFC, + 0xBFF28F5C,0x28F5C28F, 0x3FD41028,0x57A8E0F5, + 0xBFF26666,0x66666666, 0x3FD443C6,0xDE4C6C98, + 0xBFF23D70,0xA3D70A3D, 0x3FD477EA,0x33D5BE3C, + 0xBFF2147A,0xE147AE14, 0x3FD4AC93,0xADF6A741, + 0xBFF1EB85,0x1EB851EC, 0x3FD4E1C4,0xA5D0196A, + 0xBFF1C28F,0x5C28F5C3, 0x3FD5177E,0x77FAFCB5, + 0xBFF19999,0x9999999A, 0x3FD54DC2,0x84911BF1, + 0xBFF170A3,0xD70A3D71, 0x3FD58492,0x2F36284C, + 0xBFF147AE,0x147AE148, 0x3FD5BBEE,0xDF20D40E, + 0xBFF11EB8,0x51EB851F, 0x3FD5F3D9,0xFF2404C6, + 0xBFF0F5C2,0x8F5C28F6, 0x3FD62C54,0xFDB81D17, + 0xBFF0CCCC,0xCCCCCCCD, 0x3FD66561,0x4D045E75, + 0xBFF0A3D7,0x0A3D70A4, 0x3FD69F00,0x62E862FE, + 0xBFF07AE1,0x47AE147B, 0x3FD6D933,0xB905AFB6, + 0xBFF051EB,0x851EB852, 0x3FD713FC,0xCCC95F67, + 0xBFF028F5,0xC28F5C29, 0x3FD74F5D,0x1F75E65B, + 0xBFF00000,0x00000000, 0x3FD78B56,0x362CEF38, + 0xBFEFAE14,0x7AE147AE, 0x3FD7C7E9,0x99F9513C, + 0xBFEF5C28,0xF5C28F5C, 0x3FD80518,0xD7D9201A, + 0xBFEF0A3D,0x70A3D70A, 0x3FD842E5,0x80C7D5BA, + 0xBFEEB851,0xEB851EB8, 0x3FD88151,0x29C89622, + 0xBFEE6666,0x66666666, 0x3FD8C05D,0x6BF08DC0, + 0xBFEE147A,0xE147AE14, 0x3FD9000B,0xE4716A6D, + 0xBFEDC28F,0x5C28F5C3, 0x3FD9405E,0x34A3EF55, + 0xBFED70A3,0xD70A3D71, 0x3FD98156,0x0212A425, + 0xBFED1EB8,0x51EB851F, 0x3FD9C2F4,0xF6849FA4, + 0xBFECCCCC,0xCCCCCCCD, 0x3FDA053C,0xC0086E1E, + 0xBFEC7AE1,0x47AE147B, 0x3FDA482F,0x10FF13D7, + 0xBFEC28F5,0xC28F5C29, 0x3FDA8BCD,0xA0272BCD, + 0xBFEBD70A,0x3D70A3D7, 0x3FDAD01A,0x28A8231C, + 0xBFEB851E,0xB851EB85, 0x3FDB1516,0x6A1D9143, + 0xBFEB3333,0x33333333, 0x3FDB5AC4,0x28A2AD9E, + 0xBFEAE147,0xAE147AE1, 0x3FDBA125,0x2CDDE255, + 0xBFEA8F5C,0x28F5C28F, 0x3FDBE83B,0x440C7D1A, + 0xBFEA3D70,0xA3D70A3D, 0x3FDC3008,0x400E7DF6, + 0xBFE9EB85,0x1EB851EC, 0x3FDC788D,0xF7728474, + 0xBFE99999,0x9999999A, 0x3FDCC1CE,0x4581DB88, + 0xBFE947AE,0x147AE148, 0x3FDD0BCB,0x0A4CA463, + 0xBFE8F5C2,0x8F5C28F6, 0x3FDD5686,0x2AB620A0, + 0xBFE8A3D7,0x0A3D70A4, 0x3FDDA201,0x90811C13, + 0xBFE851EB,0x851EB852, 0x3FDDEE3F,0x2A5C767A, + 0xBFE80000,0x00000000, 0x3FDE3B40,0xEBEFCD7E, + 0xBFE7AE14,0x7AE147AE, 0x3FDE8908,0xCDE84743, + 0xBFE75C28,0xF5C28F5C, 0x3FDED798,0xCE057DDF, + 0xBFE70A3D,0x70A3D70A, 0x3FDF26F2,0xEF268C13, + 0xBFE6B851,0xEB851EB8, 0x3FDF7719,0x39573B94, + 0xBFE66666,0x66666666, 0x3FDFC80D,0xB9DD5542, + 0xBFE6147A,0xE147AE14, 0x3FE00CE9,0x41A309CC, + 0xBFE5C28F,0x5C28F5C3, 0x3FE03634,0xD6B9DBDD, + 0xBFE570A3,0xD70A3D71, 0x3FE05FEA,0xAAD5A0BE, + 0xBFE51EB8,0x51EB851F, 0x3FE08A0B,0xCF512550, + 0xBFE4CCCC,0xCCCCCCCD, 0x3FE0B499,0x584682EA, + 0xBFE47AE1,0x47AE147B, 0x3FE0DF94,0x5C9630CE, + 0xBFE428F5,0xC28F5C29, 0x3FE10AFD,0xF5EE27D7, + 0xBFE3D70A,0x3D70A3D7, 0x3FE136D7,0x40D1187E, + 0xBFE3851E,0xB851EB85, 0x3FE16321,0x5C9DB371, + 0xBFE33333,0x33333333, 0x3FE18FDD,0x6B9604E3, + 0xBFE2E147,0xAE147AE1, 0x3FE1BD0C,0x92E6E2D2, + 0xBFE28F5C,0x28F5C28F, 0x3FE1EAAF,0xFAAF6E5C, + 0xBFE23D70,0xA3D70A3D, 0x3FE218C8,0xCE08A877, + 0xBFE1EB85,0x1EB851EC, 0x3FE24758,0x3B0D1A19, + 0xBFE19999,0x9999999A, 0x3FE2765F,0x72E0901C, + 0xBFE147AE,0x147AE148, 0x3FE2A5DF,0xA9B7EB07, + 0xBFE0F5C2,0x8F5C28F6, 0x3FE2D5DA,0x16E102ED, + 0xBFE0A3D7,0x0A3D70A4, 0x3FE3064F,0xF4CA9F9D, + 0xBFE051EB,0x851EB852, 0x3FE33742,0x810C854E, + 0xBFE00000,0x00000000, 0x3FE368B2,0xFC6F960A, + 0xBFDF5C28,0xF5C28F5C, 0x3FE39AA2,0xAAF607F6, + 0xBFDEB851,0xEB851EB8, 0x3FE3CD12,0xD3E3B0C7, + 0xBFDE147A,0xE147AE14, 0x3FE40004,0xC1C6668C, + 0xBFDD70A3,0xD70A3D71, 0x3FE43379,0xC27E7600, + 0xBFDCCCCC,0xCCCCCCCD, 0x3FE46773,0x27472EA9, + 0xBFDC28F5,0xC28F5C29, 0x3FE49BF2,0x44BF84EF, + 0xBFDB851E,0xB851EB85, 0x3FE4D0F8,0x72F2CA6E, + 0xBFDAE147,0xAE147AE1, 0x3FE50687,0x0D617CB6, + 0xBFDA3D70,0xA3D70A3D, 0x3FE53C9F,0x730A2AB1, + 0xBFD99999,0x9999999A, 0x3FE57343,0x067270EE, + 0xBFD8F5C2,0x8F5C28F6, 0x3FE5AA73,0x2DB00D0E, + 0xBFD851EB,0x851EB852, 0x3FE5E231,0x52720888, + 0xBFD7AE14,0x7AE147AE, 0x3FE61A7E,0xE209FAFF, + 0xBFD70A3D,0x70A3D70A, 0x3FE6535D,0x4D756470, + 0xBFD66666,0x66666666, 0x3FE68CCE,0x09671F71, + 0xBFD5C28F,0x5C28F5C3, 0x3FE6C6D2,0x8E50EBB5, + 0xBFD51EB8,0x51EB851F, 0x3FE7016C,0x586D1129, + 0xBFD47AE1,0x47AE147B, 0x3FE73C9C,0xE7C81BCE, + 0xBFD3D70A,0x3D70A3D7, 0x3FE77865,0xC04AB0AB, + 0xBFD33333,0x33333333, 0x3FE7B4C8,0x69C37C05, + 0xBFD28F5C,0x28F5C28F, 0x3FE7F1C6,0x6FF13921, + 0xBFD1EB85,0x1EB851EC, 0x3FE82F61,0x628CD3D9, + 0xBFD147AE,0x147AE148, 0x3FE86D9A,0xD553A443, + 0xBFD0A3D7,0x0A3D70A4, 0x3FE8AC74,0x6011C4A6, + 0xBFD00000,0x00000000, 0x3FE8EBEF,0x9EAC820B, + 0xBFCEB851,0xEB851EB8, 0x3FE92C0E,0x312CE7A9, + 0xBFCD70A3,0xD70A3D71, 0x3FE96CD1,0xBBCA6572, + 0xBFCC28F5,0xC28F5C29, 0x3FE9AE3B,0xE6F59209, + 0xBFCAE147,0xAE147AE1, 0x3FE9F04E,0x5F630862, + 0xBFC99999,0x9999999A, 0x3FEA330A,0xD6166159, + 0xBFC851EB,0x851EB852, 0x3FEA7673,0x006D4985, + 0xBFC70A3D,0x70A3D70A, 0x3FEABA88,0x982AB390, + 0xBFC5C28F,0x5C28F5C3, 0x3FEAFF4D,0x5B82275F, + 0xBFC47AE1,0x47AE147B, 0x3FEB44C3,0x0D232E50, + 0xBFC33333,0x33333333, 0x3FEB8AEB,0x7444DCE0, + 0xBFC1EB85,0x1EB851EC, 0x3FEBD1C8,0x5CB179FC, + 0xBFC0A3D7,0x0A3D70A4, 0x3FEC195B,0x96D2444E, + 0xBFBEB851,0xEB851EB8, 0x3FEC61A6,0xF7BB55D8, + 0xBFBC28F5,0xC28F5C29, 0x3FECAAAC,0x5937A61E, + 0xBFB99999,0x9999999A, 0x3FECF46D,0x99D52B3A, + 0xBFB70A3D,0x70A3D70A, 0x3FED3EEC,0x9CF11A26, + 0xBFB47AE1,0x47AE147B, 0x3FED8A2B,0x4AC44685, + 0xBFB1EB85,0x1EB851EC, 0x3FEDD62B,0x906FA24C, + 0xBFAEB851,0xEB851EB8, 0x3FEE22EF,0x6008DD87, + 0xBFA99999,0x9999999A, 0x3FEE7078,0xB0A726A6, + 0xBFA47AE1,0x47AE147B, 0x3FEEBEC9,0x7E700B8D, + 0xBF9EB851,0xEB851EB8, 0x3FEF0DE3,0xCAA47BCF, + 0xBF947AE1,0x47AE147B, 0x3FEF5DC9,0x9BADEC5B, + 0xBF847AE1,0x47AE147B, 0x3FEFAE7C,0xFD2B9CFE, + 0x00000000,0x00000000, 0x3FF00000,0x00000000, + 0x3F847AE1,0x47AE147B, 0x3FF0292A,0x5D2F2226, + 0x3F947AE1,0x47AE147B, 0x3FF052BE,0xA3EC0132, + 0x3F9EB851,0xEB851EB8, 0x3FF07CBD,0xE4B58641, + 0x3FA47AE1,0x47AE147B, 0x3FF0A729,0x32C7B125, + 0x3FA99999,0x9999999A, 0x3FF0D201,0xA422A433, + 0x3FAEB851,0xEB851EB8, 0x3FF0FD48,0x5191C228, + 0x3FB1EB85,0x1EB851EC, 0x3FF128FE,0x56B2DE6A, + 0x3FB47AE1,0x47AE147B, 0x3FF15524,0xD1FD7FBD, + 0x3FB70A3D,0x70A3D70A, 0x3FF181BC,0xE4CA35AD, + 0x3FB99999,0x9999999A, 0x3FF1AEC7,0xB35A00D4, + 0x3FBC28F5,0xC28F5C29, 0x3FF1DC46,0x64DDCE2D, + 0x3FBEB851,0xEB851EB8, 0x3FF20A3A,0x237E05AC, + 0x3FC0A3D7,0x0A3D70A4, 0x3FF238A4,0x1C622C3F, + 0x3FC1EB85,0x1EB851EC, 0x3FF26785,0x7FB8997E, + 0x3FC33333,0x33333333, 0x3FF296DF,0x80BE4122, + 0x3FC47AE1,0x47AE147B, 0x3FF2C6B3,0x55C69097, + 0x3FC5C28F,0x5C28F5C3, 0x3FF2F702,0x384360B7, + 0x3FC70A3D,0x70A3D70A, 0x3FF327CD,0x64CCFC08, + 0x3FC851EB,0x851EB852, 0x3FF35916,0x1B2A3990, + 0x3FC99999,0x9999999A, 0x3FF38ADD,0x9E58AC8D, + 0x3FCAE147,0xAE147AE1, 0x3FF3BD25,0x3494E939, + 0x3FCC28F5,0xC28F5C29, 0x3FF3EFEE,0x2762DED6, + 0x3FCD70A3,0xD70A3D71, 0x3FF42339,0xC3964733, + 0x3FCEB851,0xEB851EB8, 0x3FF45709,0x595B2BEA, + 0x3FD00000,0x00000000, 0x3FF48B5E,0x3C3E8186, + 0x3FD0A3D7,0x0A3D70A4, 0x3FF4C039,0xC336D8D3, + 0x3FD147AE,0x147AE148, 0x3FF4F59D,0x48AD2681, + 0x3FD1EB85,0x1EB851EC, 0x3FF52B8A,0x2A85A16B, + 0x3FD28F5C,0x28F5C28F, 0x3FF56201,0xCA28B7A4, + 0x3FD33333,0x33333333, 0x3FF59905,0x8C8C1A96, + 0x3FD3D70A,0x3D70A3D7, 0x3FF5D096,0xDA3BE264, + 0x3FD47AE1,0x47AE147B, 0x3FF608B7,0x1F63C8D5, + 0x3FD51EB8,0x51EB851F, 0x3FF64167,0xCBD87BF5, + 0x3FD5C28F,0x5C28F5C3, 0x3FF67AAA,0x532108BD, + 0x3FD66666,0x66666666, 0x3FF6B480,0x2C805DEC, + 0x3FD70A3D,0x70A3D70A, 0x3FF6EEEA,0xD2FEE75F, + 0x3FD7AE14,0x7AE147AE, 0x3FF729EB,0xC574421D, + 0x3FD851EB,0x851EB852, 0x3FF76584,0x86910958, + 0x3FD8F5C2,0x8F5C28F6, 0x3FF7A1B6,0x9CE8BCB1, + 0x3FD99999,0x9999999A, 0x3FF7DE83,0x92FBBFE0, + 0x3FDA3D70,0xA3D70A3D, 0x3FF81BEC,0xF741742B, + 0x3FDAE147,0xAE147AE1, 0x3FF859F4,0x5C326BCB, + 0x3FDB851E,0xB851EB85, 0x3FF8989B,0x5852B794, + 0x3FDC28F5,0xC28F5C29, 0x3FF8D7E3,0x863C4F1C, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FF917CE,0x84A993B5, + 0x3FDD70A3,0xD70A3D71, 0x3FF9585D,0xF67FEE5D, + 0x3FDE147A,0xE147AE14, 0x3FF99993,0x82DA8915, + 0x3FDEB851,0xEB851EB8, 0x3FF9DB70,0xD51523C0, + 0x3FDF5C28,0xF5C28F5C, 0x3FFA1DF7,0x9CD704E5, + 0x3FE00000,0x00000000, 0x3FFA6129,0x8E1E069C, + 0x3FE051EB,0x851EB852, 0x3FFAA508,0x6149BFDE, + 0x3FE0A3D7,0x0A3D70A4, 0x3FFAE995,0xD326CA98, + 0x3FE0F5C2,0x8F5C28F6, 0x3FFB2ED3,0xA4FA26B9, + 0x3FE147AE,0x147AE148, 0x3FFB74C3,0x9C8CBA8F, + 0x3FE19999,0x9999999A, 0x3FFBBB67,0x8436F0B5, + 0x3FE1EB85,0x1EB851EC, 0x3FFC02C1,0x2AEC73F0, + 0x3FE23D70,0xA3D70A3D, 0x3FFC4AD2,0x6448092F, + 0x3FE28F5C,0x28F5C28F, 0x3FFC939D,0x08978818, + 0x3FE2E147,0xAE147AE1, 0x3FFCDD22,0xF4E7F250, + 0x3FE33333,0x33333333, 0x3FFD2766,0x0B11A9EF, + 0x3FE3851E,0xB851EB85, 0x3FFD7268,0x31C4C757, + 0x3FE3D70A,0x3D70A3D7, 0x3FFDBE2B,0x54958EC8, + 0x3FE428F5,0xC28F5C29, 0x3FFE0AB1,0x64090605, + 0x3FE47AE1,0x47AE147B, 0x3FFE57FC,0x55A1AA5A, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FFEA60E,0x23EC4752, + 0x3FE51EB8,0x51EB851F, 0x3FFEF4E8,0xCE8CEE7A, + 0x3FE570A3,0xD70A3D71, 0x3FFF448E,0x5A4C107E, + 0x3FE5C28F,0x5C28F5C3, 0x3FFF9500,0xD123B7FC, + 0x3FE6147A,0xE147AE14, 0x3FFFE642,0x424CE65B, + 0x3FE66666,0x66666666, 0x40001C2A,0x61268987, + 0x3FE6B851,0xEB851EB8, 0x4000459D,0x3581E6C0, + 0x3FE70A3D,0x70A3D70A, 0x40006F7A,0xADDC4114, + 0x3FE75C28,0xF5C28F5C, 0x400099C3,0xDC94317C, + 0x3FE7AE14,0x7AE147AE, 0x4000C479,0xD6CA39D0, + 0x3FE80000,0x00000000, 0x4000EF9D,0xB467DCF8, + 0x3FE851EB,0x851EB852, 0x40011B30,0x9026C95C, + 0x3FE8A3D7,0x0A3D70A4, 0x40014733,0x879815CE, + 0x3FE8F5C2,0x8F5C28F6, 0x400173A7,0xBB2B9101, + 0x3FE947AE,0x147AE148, 0x4001A08E,0x4E3723E4, + 0x3FE99999,0x9999999A, 0x4001CDE8,0x66FE46E9, + 0x3FE9EB85,0x1EB851EC, 0x4001FBB7,0x2EB98A8C, + 0x3FEA3D70,0xA3D70A3D, 0x400229FB,0xD19E3331, + 0x3FEA8F5C,0x28F5C28F, 0x400258B7,0x7EE5E89E, + 0x3FEAE147,0xAE147AE1, 0x400287EB,0x68D67933, + 0x3FEB3333,0x33333333, 0x4002B798,0xC4C9B11F, + 0x3FEB851E,0xB851EB85, 0x4002E7C0,0xCB3545C2, + 0x3FEBD70A,0x3D70A3D7, 0x40031864,0xB7B2D56E, + 0x3FEC28F5,0xC28F5C29, 0x40034985,0xC907FBBC, + 0x3FEC7AE1,0x47AE147B, 0x40037B25,0x412E7AAA, + 0x3FECCCCC,0xCCCCCCCD, 0x4003AD44,0x655C78BC, + 0x3FED1EB8,0x51EB851F, 0x4003DFE4,0x7E0CD449, + 0x3FED70A3,0xD70A3D71, 0x40041306,0xD7078C43, + 0x3FEDC28F,0x5C28F5C3, 0x400446AC,0xBF6A3E8D, + 0x3FEE147A,0xE147AE14, 0x40047AD7,0x89B0BC3E, + 0x3FEE6666,0x66666666, 0x4004AF88,0x8BBDB3F0, + 0x3FEEB851,0xEB851EB8, 0x4004E4C1,0x1EE37254, + 0x3FEF0A3D,0x70A3D70A, 0x40051A82,0x9FECB951, + 0x3FEF5C28,0xF5C28F5C, 0x400550CE,0x6F25ADE5, + 0x3FEFAE14,0x7AE147AE, 0x400587A5,0xF064DCF9, + 0x3FF00000,0x00000000, 0x4005BF0A,0x8B145769, + 0x3FF028F5,0xC28F5C29, 0x4005F6FD,0xAA3AE580, + 0x3FF051EB,0x851EB852, 0x40062F80,0xBC85521F, + 0x3FF07AE1,0x47AE147B, 0x40066895,0x344FCDCC, + 0x3FF0A3D7,0x0A3D70A4, 0x4006A23C,0x87AF69E8, + 0x3FF0CCCC,0xCCCCCCCD, 0x4006DC78,0x307BAC49, + 0x3FF0F5C2,0x8F5C28F6, 0x40071749,0xAC583B7E, + 0x3FF11EB8,0x51EB851F, 0x400752B2,0x7CBEA3E9, + 0x3FF147AE,0x147AE148, 0x40078EB4,0x2708360B, + 0x3FF170A3,0xD70A3D71, 0x4007CB50,0x3477FE27, + 0x3FF19999,0x9999999A, 0x40080888,0x3244D593, + 0x3FF1C28F,0x5C28F5C3, 0x4008465D,0xB1A38DEB, + 0x3FF1EB85,0x1EB851EC, 0x400884D2,0x47D13670, + 0x3FF2147A,0xE147AE14, 0x4008C3E7,0x8E1D7BCF, + 0x3FF23D70,0xA3D70A3D, 0x4009039F,0x21F522A8, + 0x3FF26666,0x66666666, 0x400943FA,0xA4EC9CF1, + 0x3FF28F5C,0x28F5C28F, 0x400984FB,0xBCCABAAD, + 0x3FF2B851,0xEB851EB8, 0x4009C6A4,0x13937614, + 0x3FF2E147,0xAE147AE1, 0x400A08F5,0x5792DB8E, + 0x3FF30A3D,0x70A3D70A, 0x400A4BF1,0x3B680DB1, + 0x3FF33333,0x33333333, 0x400A8F99,0x761065A4, + 0x3FF35C28,0xF5C28F5C, 0x400AD3EF,0xC2F2B016, + 0x3FF3851E,0xB851EB85, 0x400B18F5,0xE1EA8727, + 0x3FF3AE14,0x7AE147AE, 0x400B5EAD,0x9753C982, + 0x3FF3D70A,0x3D70A3D7, 0x400BA518,0xAC162EFB, + 0x3FF40000,0x00000000, 0x400BEC38,0xEDB0FAF0, + 0x3FF428F5,0xC28F5C29, 0x400C3410,0x2E46CCCA, + 0x3FF451EB,0x851EB852, 0x400C7CA0,0x44A98EDF, + 0x3FF47AE1,0x47AE147B, 0x400CC5EB,0x0C66840E, + 0x3FF4A3D7,0x0A3D70A4, 0x400D0FF2,0x65D27452, + 0x3FF4CCCC,0xCCCCCCCD, 0x400D5AB8,0x3615F8B4, + 0x3FF4F5C2,0x8F5C28F6, 0x400DA63E,0x6739E6DA, + 0x3FF51EB8,0x51EB851F, 0x400DF286,0xE833DC89, + 0x3FF547AE,0x147AE148, 0x400E3F93,0xACF2EB74, + 0x3FF570A3,0xD70A3D71, 0x400E8D66,0xAE6C659C, + 0x3FF59999,0x9999999A, 0x400EDC01,0xEAA8CAA6, + 0x3FF5C28F,0x5C28F5C3, 0x400F2B67,0x64D0D670, + 0x3FF5EB85,0x1EB851EC, 0x400F7B99,0x253AB13B, + 0x3FF6147A,0xE147AE14, 0x400FCC99,0x397741C6, + 0x3FF63D70,0xA3D70A3D, 0x40100F34,0xDA2FD0DB, + 0x3FF66666,0x66666666, 0x40103886,0x57115A47, + 0x3FF68F5C,0x28F5C28F, 0x40106242,0x222970CF, + 0x3FF6B851,0xEB851EB8, 0x40108C69,0x4CF9F8AE, + 0x3FF6E147,0xAE147AE1, 0x4010B6FC,0xEBC48723, + 0x3FF70A3D,0x70A3D70A, 0x4010E1FE,0x159174EF, + 0x3FF73333,0x33333333, 0x40110D6D,0xE4370309, + 0x3FF75C28,0xF5C28F5C, 0x4011394D,0x746091A9, + 0x3FF7851E,0xB851EB85, 0x4011659D,0xE595E9E7, + 0x3FF7AE14,0x7AE147AE, 0x40119260,0x5A429A20, + 0x3FF7D70A,0x3D70A3D7, 0x4011BF95,0xF7BD6542, + 0x3FF80000,0x00000000, 0x4011ED3F,0xE64FC541, + 0x3FF828F5,0xC28F5C29, 0x40121B5F,0x513D80D6, + 0x3FF851EB,0x851EB852, 0x401249F5,0x66CC54C7, + 0x3FF87AE1,0x47AE147B, 0x40127903,0x584BB0E9, + 0x3FF8A3D7,0x0A3D70A4, 0x4012A88A,0x5A1C88FD, + 0x3FF8CCCC,0xCCCCCCCD, 0x4012D88B,0xA3B939BD, + 0x3FF8F5C2,0x8F5C28F6, 0x40130908,0x6FBD8222, + 0x3FF91EB8,0x51EB851F, 0x40133A01,0xFBEE9144, + 0x3FF947AE,0x147AE148, 0x40136B79,0x894328E3, + 0x3FF970A3,0xD70A3D71, 0x40139D70,0x5BEBD4E2, + 0x3FF99999,0x9999999A, 0x4013CFE7,0xBB5B37EC, + 0x3FF9C28F,0x5C28F5C3, 0x401402E0,0xF24E6D6E, + 0x3FF9EB85,0x1EB851EC, 0x4014365D,0x4ED58120, + 0x3FFA147A,0xE147AE14, 0x40146A5E,0x225BFC5B, + 0x3FFA3D70,0xA3D70A3D, 0x40149EE4,0xC1B18972, + 0x3FFA6666,0x66666666, 0x4014D3F2,0x8512AD3E, + 0x3FFA8F5C,0x28F5C28F, 0x40150988,0xC831971D, + 0x3FFAB851,0xEB851EB8, 0x40153FA8,0xEA3F07A7, + 0x3FFAE147,0xAE147AE1, 0x40157654,0x4DF34E3C, + 0x3FFB0A3D,0x70A3D70A, 0x4015AD8C,0x59975DBF, + 0x3FFB3333,0x33333333, 0x4015E552,0x770DF8A7, + 0x3FFB5C28,0xF5C28F5C, 0x40161DA8,0x13DCF4AB, + 0x3FFB851E,0xB851EB85, 0x4016568E,0xA1369647, + 0x3FFBAE14,0x7AE147AE, 0x40169007,0x94030451, + 0x3FFBD70A,0x3D70A3D7, 0x4016CA14,0x64E9D3DF, + 0x3FFC0000,0x00000000, 0x401704B6,0x905BACBF, + 0x3FFC28F5,0xC28F5C29, 0x40173FEF,0x969C06BB, + 0x3FFC51EB,0x851EB852, 0x40177BC0,0xFBCAFFF1, + 0x3FFC7AE1,0x47AE147B, 0x4017B82C,0x47EF4C73, + 0x3FFCA3D7,0x0A3D70A4, 0x4017F533,0x07003F80, + 0x3FFCCCCC,0xCCCCCCCD, 0x401832D6,0xC8EFEE85, + 0x3FFCF5C2,0x8F5C28F6, 0x40187119,0x21B56E3B, + 0x3FFD1EB8,0x51EB851F, 0x4018AFFB,0xA9572A1B, + 0x3FFD47AE,0x147AE148, 0x4018EF7F,0xFBF55668, + 0x3FFD70A3,0xD70A3D71, 0x40192FA7,0xB9D47D23, + 0x3FFD9999,0x9999999A, 0x40197074,0x87682618, + 0x3FFDC28F,0x5C28F5C3, 0x4019B1E8,0x0D5D9A61, + 0x3FFDEB85,0x1EB851EC, 0x4019F403,0xF8A6C392, + 0x3FFE147A,0xE147AE14, 0x401A36C9,0xFA8526E1, + 0x3FFE3D70,0xA3D70A3D, 0x401A7A3B,0xC894FC97, + 0x3FFE6666,0x66666666, 0x401ABE5B,0x1CD863F6, + 0x3FFE8F5C,0x28F5C28F, 0x401B0329,0xB5C2B407, + 0x3FFEB851,0xEB851EB8, 0x401B48A9,0x5643E976, + 0x3FFEE147,0xAE147AE1, 0x401B8EDB,0xC5D431E1, + 0x3FFF0A3D,0x70A3D70A, 0x401BD5C2,0xD07F94D4, + 0x3FFF3333,0x33333333, 0x401C1D60,0x46F1BAC1, + 0x3FFF5C28,0xF5C28F5C, 0x401C65B5,0xFE81D254, + 0x3FFF851E,0xB851EB85, 0x401CAEC5,0xD13E944E, + 0x3FFFAE14,0x7AE147AE, 0x401CF891,0x9DFA665C, + 0x3FFFD70A,0x3D70A3D7, 0x401D431B,0x48579D1C, + 0x40000000,0x00000000, 0x401D8E64,0xB8D4DDAE, + 0x4000147A,0xE147AE14, 0x401DDA6F,0xDCD99F23, + 0x400028F5,0xC28F5C29, 0x401E273E,0xA6C2CC1C, + 0x40003D70,0xA3D70A3D, 0x401E74D3,0x0DEF84D2, + 0x400051EB,0x851EB852, 0x401EC32F,0x0ECE021B, + 0x40006666,0x66666666, 0x401F1254,0xAAE89965, + 0x40007AE1,0x47AE147B, 0x401F6245,0xE8F2E25E, + 0x40008F5C,0x28F5C28F, 0x401FB304,0xD4D6FE42, + 0x4000A3D7,0x0A3D70A4, 0x40200249,0xBFE180C0, + 0x4000B851,0xEB851EB8, 0x40202B7A,0x001B3FD8, + 0x4000CCCC,0xCCCCCCCD, 0x40205514,0x39081D4F, + 0x4000E147,0xAE147AE1, 0x40207F19,0x7B4DFA21, + 0x4000F5C2,0x8F5C28F6, 0x4020A98A,0xDA50324D, + 0x40010A3D,0x70A3D70A, 0x4020D469,0x6C36A98D, + 0x40011EB8,0x51EB851F, 0x4020FFB6,0x49F4EA56, + 0x40013333,0x33333333, 0x40212B72,0x8F51570E, + 0x400147AE,0x147AE148, 0x4021579F,0x5AEC6DDB, + 0x40015C28,0xF5C28F5C, 0x4021843D,0xCE481F09, + 0x400170A3,0xD70A3D71, 0x4021B14F,0x0DCF366E, + 0x4001851E,0xB851EB85, 0x4021DED4,0x40DCD7C4, + 0x40019999,0x9999999A, 0x40220CCE,0x91C40E5F, + 0x4001AE14,0x7AE147AE, 0x40223B3F,0x2DD7703A, + 0x4001C28F,0x5C28F5C3, 0x40226A27,0x4570D4CE, + 0x4001D70A,0x3D70A3D7, 0x40229988,0x0BF91F9C, + 0x4001EB85,0x1EB851EC, 0x4022C962,0xB7F01EE4, + 0x40020000,0x00000000, 0x4022F9B8,0x82F47E81, + 0x4002147A,0xE147AE14, 0x40232A8A,0xA9CBCF4D, + 0x400228F5,0xC28F5C29, 0x40235BDA,0x6C6AA323, + 0x40023D70,0xA3D70A3D, 0x40238DA9,0x0DFCBDB6, + 0x400251EB,0x851EB852, 0x4023BFF7,0xD4ED5A92, + 0x40026666,0x66666666, 0x4023F2C8,0x0AEF884D, + 0x40027AE1,0x47AE147B, 0x4024261A,0xFD069950, + 0x40028F5C,0x28F5C28F, 0x402459F1,0xFB8EAA38, + 0x4002A3D7,0x0A3D70A4, 0x40248E4E,0x5A453E51, + 0x4002B851,0xEB851EB8, 0x4024C331,0x7051F208, + 0x4002CCCC,0xCCCCCCCD, 0x4024F89C,0x984F43EC, + 0x4002E147,0xAE147AE1, 0x40252E91,0x3053741D, + 0x4002F5C2,0x8F5C28F6, 0x40256510,0x99F97ABC, + 0x40030A3D,0x70A3D70A, 0x40259C1C,0x3A6A153E, + 0x40031EB8,0x51EB851F, 0x4025D3B5,0x7A64EB33, + 0x40033333,0x33333333, 0x40260BDD,0xC649CA68, + 0x400347AE,0x147AE148, 0x40264496,0x8E21FAFC, + 0x40035C28,0xF5C28F5C, 0x40267DE1,0x45A9AB42, + 0x400370A3,0xD70A3D71, 0x4026B7BF,0x64597414, + 0x4003851E,0xB851EB85, 0x4026F232,0x656FF56E, + 0x40039999,0x9999999A, 0x40272D3B,0xC7FB8BF6, + 0x4003AE14,0x7AE147AE, 0x402768DD,0x0EE41F51, + 0x4003C28F,0x5C28F5C3, 0x4027A517,0xC0F509E1, + 0x4003D70A,0x3D70A3D7, 0x4027E1ED,0x68E719CB, + 0x4003EB85,0x1EB851EC, 0x40281F5F,0x956AABF2, + 0x40040000,0x00000000, 0x40285D6F,0xD931E0BB, + 0x4004147A,0xE147AE14, 0x40289C1F,0xCAFAEB45, + 0x400428F5,0xC28F5C29, 0x4028DB71,0x059A7B04, + 0x40043D70,0xA3D70A3D, 0x40291B65,0x2806402E, + 0x400451EB,0x851EB852, 0x40295BFD,0xD55F8B4D, + 0x40046666,0x66666666, 0x40299D3C,0xB4FE07FD, + 0x40047AE1,0x47AE147B, 0x4029DF23,0x727A9378, + 0x40048F5C,0x28F5C28F, 0x402A21B3,0xBDBA2ECC, + 0x4004A3D7,0x0A3D70A4, 0x402A64EF,0x4AF90D74, + 0x4004B851,0xEB851EB8, 0x402AA8D7,0xD2D5C02B, + 0x4004CCCC,0xCCCCCCCD, 0x402AED6F,0x125C7CB5, + 0x4004E147,0xAE147AE1, 0x402B32B6,0xCB128270, + 0x4004F5C2,0x8F5C28F6, 0x402B78B0,0xC3019C73, + 0x40050A3D,0x70A3D70A, 0x402BBF5E,0xC4C3C10E, + 0x40051EB8,0x51EB851F, 0x402C06C2,0x9F8ECF68, + 0x40053333,0x33333333, 0x402C4EDE,0x27406B1D, + 0x400547AE,0x147AE148, 0x402C97B3,0x3469F697, + 0x40055C28,0xF5C28F5C, 0x402CE143,0xA45CABFA, + 0x400570A3,0xD70A3D71, 0x402D2B91,0x5935D56E, + 0x4005851E,0xB851EB85, 0x402D769E,0x39EB24A0, + 0x40059999,0x9999999A, 0x402DC26C,0x32572A3E, + 0x4005AE14,0x7AE147AE, 0x402E0EFD,0x3345ED44, + 0x4005C28F,0x5C28F5C3, 0x402E5C53,0x3281A2F8, + 0x4005D70A,0x3D70A3D7, 0x402EAA70,0x2ADF8753, + 0x4005EB85,0x1EB851EC, 0x402EF956,0x1C4CD6C1, + 0x40060000,0x00000000, 0x402F4907,0x0BDBE8FD, + 0x4006147A,0xE147AE14, 0x402F9985,0x03D16DE2, + 0x400628F5,0xC28F5C29, 0x402FEAD2,0x13B1CC22, + 0x40063D70,0xA3D70A3D, 0x40301E78,0x28275135, + 0x400651EB,0x851EB852, 0x403047F0,0xE9EA35AF, + 0x40066666,0x66666666, 0x403071D4,0x5EEC2242, + 0x40067AE1,0x47AE147B, 0x40309C23,0x99B2EC67, + 0x40068F5C,0x28F5C28F, 0x4030C6DF,0xAF86B764, + 0x4006A3D7,0x0A3D70A4, 0x4030F209,0xB8790D89, + 0x4006B851,0xEB851EB8, 0x40311DA2,0xCF6C0BA0, + 0x4006CCCC,0xCCCCCCCD, 0x403149AC,0x12199EE6, + 0x4006E147,0xAE147AE1, 0x40317626,0xA11AD589, + 0x4006F5C2,0x8F5C28F6, 0x4031A313,0x9FEF4212, + 0x40070A3D,0x70A3D70A, 0x4031D074,0x350471BF, + 0x40071EB8,0x51EB851F, 0x4031FE49,0x89BD761F, + 0x40073333,0x33333333, 0x40322C94,0xCA7A81FE, + 0x400747AE,0x147AE148, 0x40325B57,0x26A09A06, + 0x40075C28,0xF5C28F5C, 0x40328A91,0xD0A15904, + 0x400770A3,0xD70A3D71, 0x4032BA45,0xFE02C84D, + 0x4007851E,0xB851EB85, 0x4032EA74,0xE7674C2F, + 0x40079999,0x9999999A, 0x40331B1F,0xC895A4EB, + 0x4007AE14,0x7AE147AE, 0x40334C47,0xE081041C, + 0x4007C28F,0x5C28F5C3, 0x40337DEE,0x71513717, + 0x4007D70A,0x3D70A3D7, 0x4033B014,0xC06AE622, + 0x4007EB85,0x1EB851EC, 0x4033E2BC,0x1677E90A, + 0x40080000,0x00000000, 0x403415E5,0xBF6FB106, + 0x4008147A,0xE147AE14, 0x40344993,0x0A9FC85A, + 0x400828F5,0xC28F5C29, 0x40347DC5,0x4AB467CB, + 0x40083D70,0xA3D70A3D, 0x4034B27D,0xD5C12220, + 0x400851EB,0x851EB852, 0x4034E7BE,0x0549A60D, + 0x40086666,0x66666666, 0x40351D87,0x364A9682, + 0x40087AE1,0x47AE147B, 0x403553DA,0xC94279E3, + 0x40088F5C,0x28F5C28F, 0x40358ABA,0x223AC012, + 0x4008A3D7,0x0A3D70A4, 0x4035C226,0xA8D0DFDF, + 0x4008B851,0xEB851EB8, 0x4035FA21,0xC83F8BB7, + 0x4008CCCC,0xCCCCCCCD, 0x403632AC,0xEF67FE3D, + 0x4008E147,0xAE147AE1, 0x40366BC9,0x90DB5E95, + 0x4008F5C2,0x8F5C28F6, 0x4036A579,0x22E43D0D, + 0x40090A3D,0x70A3D70A, 0x4036DFBD,0x1F902804, + 0x40091EB8,0x51EB851F, 0x40371A97,0x04B9599C, + 0x40093333,0x33333333, 0x40375608,0x54107E2E, + 0x400947AE,0x147AE148, 0x40379212,0x9326940E, + 0x40095C28,0xF5C28F5C, 0x4037CEB7,0x4B76E48B, + 0x400970A3,0xD70A3D71, 0x40380BF8,0x0A7116BF, + 0x4009851E,0xB851EB85, 0x403849D6,0x61835C2A, + 0x40099999,0x9999999A, 0x40388853,0xE624B794, + 0x4009AE14,0x7AE147AE, 0x4038C772,0x31DF5E46, + 0x4009C28F,0x5C28F5C3, 0x40390732,0xE25B3419, + 0x4009D70A,0x3D70A3D7, 0x40394797,0x99686251, + 0x4009EB85,0x1EB851EC, 0x403988A1,0xFD0A09EE, + 0x400A0000,0x00000000, 0x4039CA53,0xB781114B, + 0x400A147A,0xE147AE14, 0x403A0CAE,0x77570DB5, + 0x400A28F5,0xC28F5C29, 0x403A4FB3,0xEF6948FE, + 0x400A3D70,0xA3D70A3D, 0x403A9365,0xD6F3E365, + 0x400A51EB,0x851EB852, 0x403AD7C5,0xE99D1243, + 0x400A6666,0x66666666, 0x403B1CD5,0xE7807B7B, + 0x400A7AE1,0x47AE147B, 0x403B6297,0x953AAE4F, + 0x400A8F5C,0x28F5C28F, 0x403BA90C,0xBBF4B98A, + 0x400AA3D7,0x0A3D70A4, 0x403BF037,0x296FDFAD, + 0x400AB851,0xEB851EB8, 0x403C3818,0xB0116903, + 0x400ACCCC,0xCCCCCCCD, 0x403C80B3,0x26EE9453, + 0x400AE147,0xAE147AE1, 0x403CCA08,0x69D8A616, + 0x400AF5C2,0x8F5C28F6, 0x403D141A,0x596916ED, + 0x400B0A3D,0x70A3D70A, 0x403D5EEA,0xDB0DE12F, + 0x400B1EB8,0x51EB851F, 0x403DAA7B,0xD915EE62, + 0x400B3333,0x33333333, 0x403DF6CF,0x42BDA468, + 0x400B47AE,0x147AE148, 0x403E43E7,0x0C3B933A, + 0x400B5C28,0xF5C28F5C, 0x403E91C5,0x2ECD4305, + 0x400B70A3,0xD70A3D71, 0x403EE06B,0xA8C42370, + 0x400B851E,0xB851EB85, 0x403F2FDC,0x7D929BF4, + 0x400B9999,0x9999999A, 0x403F8019,0xB5D93E09, + 0x400BAE14,0x7AE147AE, 0x403FD125,0x5F741909, + 0x400BC28F,0x5C28F5C3, 0x40401180,0xC6C4184F, + 0x400BD70A,0x3D70A3D7, 0x40403AD8,0x2C488AC8, + 0x400BEB85,0x1EB851EC, 0x40406499,0xEF3750EC, + 0x400C0000,0x00000000, 0x40408EC7,0x21396BDB, + 0x400C147A,0xE147AE14, 0x4040B960,0xD6B7F267, + 0x400C28F5,0xC28F5C29, 0x4040E468,0x26E32487, + 0x400C3D70,0xA3D70A3D, 0x40410FDE,0x2BB99109, + 0x400C51EB,0x851EB852, 0x40413BC4,0x020F4DBB, + 0x400C6666,0x66666666, 0x4041681A,0xC99541FD, + 0x400C7AE1,0x47AE147B, 0x404194E3,0xA4E08449, + 0x400C8F5C,0x28F5C28F, 0x4041C21F,0xB971CA7A, + 0x400CA3D7,0x0A3D70A4, 0x4041EFD0,0x2FBCED67, + 0x400CB851,0xEB851EB8, 0x40421DF6,0x33307FA8, + 0x400CCCCC,0xCCCCCCCD, 0x40424C92,0xF23D7807, + 0x400CE147,0xAE147AE1, 0x40427BA7,0x9E5EEF8A, + 0x400CF5C2,0x8F5C28F6, 0x4042AB35,0x6C21F382, + 0x400D0A3D,0x70A3D70A, 0x4042DB3D,0x932D6BA4, + 0x400D1EB8,0x51EB851F, 0x40430BC1,0x4E4A148C, + 0x400D3333,0x33333333, 0x40433CC1,0xDB6A8EA8, + 0x400D47AE,0x147AE148, 0x40436E40,0x7BB38202, + 0x400D5C28,0xF5C28F5C, 0x4043A03E,0x7383D6DB, + 0x400D70A3,0xD70A3D71, 0x4043D2BD,0x0A7D0388, + 0x400D851E,0xB851EB85, 0x404405BD,0x8B8B6F8F, + 0x400D9999,0x9999999A, 0x40443941,0x44EEEC81, + 0x400DAE14,0x7AE147AE, 0x40446D49,0x8843446C, + 0x400DC28F,0x5C28F5C3, 0x4044A1D7,0xAA88DE86, + 0x400DD70A,0x3D70A3D7, 0x4044D6ED,0x042D79E9, + 0x400DEB85,0x1EB851EC, 0x40450C8A,0xF114FEE5, + 0x400E0000,0x00000000, 0x404542B2,0xD0A266E7, + 0x400E147A,0xE147AE14, 0x40457966,0x05C0BB62, + 0x400E28F5,0xC28F5C29, 0x4045B0A5,0xF6EC2BD1, + 0x400E3D70,0xA3D70A3D, 0x4045E874,0x0E3B3B0A, + 0x400E51EB,0x851EB852, 0x404620D1,0xB9680458, + 0x400E6666,0x66666666, 0x404659C0,0x69D9983C, + 0x400E7AE1,0x47AE147B, 0x40469341,0x94AD7170, + 0x400E8F5C,0x28F5C28F, 0x4046CD56,0xB2C10218, + 0x400EA3D7,0x0A3D70A4, 0x40470801,0x40BB59B3, + 0x400EB851,0xEB851EB8, 0x40474342,0xBF16E3A7, + 0x400ECCCC,0xCCCCCCCD, 0x40477F1C,0xB22B3F1E, + 0x400EE147,0xAE147AE1, 0x4047BB90,0xA2372FF6, + 0x400EF5C2,0x8F5C28F6, 0x4047F8A0,0x1B6AA983, + 0x400F0A3D,0x70A3D70A, 0x4048364C,0xADF0F2EC, + 0x400F1EB8,0x51EB851F, 0x40487497,0xEDFAE5D6, + 0x400F3333,0x33333333, 0x4048B383,0x73C9473C, + 0x400F47AE,0x147AE148, 0x4048F310,0xDBB73B11, + 0x400F5C28,0xF5C28F5C, 0x40493341,0xC644D297, + 0x400F70A3,0xD70A3D71, 0x40497417,0xD821B614, + 0x400F851E,0xB851EB85, 0x4049B594,0xBA37E9C0, + 0x400F9999,0x9999999A, 0x4049F7BA,0x19B6AE9A, + 0x400FAE14,0x7AE147AE, 0x404A3A89,0xA81D7F0D, + 0x400FC28F,0x5C28F5C3, 0x404A7E05,0x1B472802, + 0x400FD70A,0x3D70A3D7, 0x404AC22E,0x2D74FE5B, + 0x400FEB85,0x1EB851EC, 0x404B0706,0x9D5A3169, + 0x40100000,0x00000000, 0x404B4C90,0x2E273A58, + 0x40100A3D,0x70A3D70A, 0x404B92CC,0xA795693B, + 0x4010147A,0xE147AE14, 0x404BD9BD,0xD5F28FA1, + 0x40101EB8,0x51EB851F, 0x404C2165,0x8A2CC94E, + 0x401028F5,0xC28F5C29, 0x404C69C5,0x99DE631E, + 0x40103333,0x33333333, 0x404CB2DF,0xDF59E0CA, + 0x40103D70,0xA3D70A3D, 0x404CFCB6,0x39B62159, + 0x401047AE,0x147AE148, 0x404D474A,0x8CDAA2F8, + 0x401051EB,0x851EB852, 0x404D929E,0xC18BE631, + 0x40105C28,0xF5C28F5C, 0x404DDEB4,0xC577F152, + 0x40106666,0x66666666, 0x404E2B8E,0x8B42F3B6, + 0x401070A3,0xD70A3D71, 0x404E792E,0x0A9409BD, + 0x40107AE1,0x47AE147B, 0x404EC795,0x40222178, + 0x4010851E,0xB851EB85, 0x404F16C6,0x2DC100C3, + 0x40108F5C,0x28F5C28F, 0x404F66C2,0xDA6E6C99, + 0x40109999,0x9999999A, 0x404FB78D,0x525F726F, + 0x4010A3D7,0x0A3D70A4, 0x40500493,0xD386E9C7, + 0x4010AE14,0x7AE147AE, 0x40502DC9,0xF7A2C99F, + 0x4010B851,0xEB851EB8, 0x4050576A,0x239953C7, + 0x4010C28F,0x5C28F5C3, 0x40508175,0x683766BB, + 0x4010CCCC,0xCCCCCCCD, 0x4050ABEC,0xD907C034, + 0x4010D70A,0x3D70A3D7, 0x4050D6D1,0x8C5A0B0E, + 0x4010E147,0xAE147AE1, 0x40510224,0x9B49FF2F, + 0x4010EB85,0x1EB851EC, 0x40512DE7,0x21C693D2, + 0x4010F5C2,0x8F5C28F6, 0x40515A1A,0x3E99444B, + 0x40110000,0x00000000, 0x405186BF,0x136D679D, + 0x40110A3D,0x70A3D70A, 0x4051B3D6,0xC4D79ACF, + 0x4011147A,0xE147AE14, 0x4051E162,0x7A5D3E69, + 0x40111EB8,0x51EB851F, 0x40520F63,0x5E7C0733, + 0x401128F5,0xC28F5C29, 0x40523DDA,0x9EB1A260, + 0x40113333,0x33333333, 0x40526CC9,0x6B836D7D, + 0x40113D70,0xA3D70A3D, 0x40529C30,0xF8864221, + 0x401147AE,0x147AE148, 0x4052CC12,0x7C6655BC, + 0x401151EB,0x851EB852, 0x4052FC6F,0x30EF2D8B, + 0x40115C28,0xF5C28F5C, 0x40532D48,0x5313A73C, + 0x40116666,0x66666666, 0x40535E9F,0x22F61600, + 0x401170A3,0xD70A3D71, 0x40539074,0xE3F074A9, + 0x40117AE1,0x47AE147B, 0x4053C2CA,0xDC9CACB0, + 0x4011851E,0xB851EB85, 0x4053F5A2,0x56DCF2C8, + 0x40118F5C,0x28F5C28F, 0x405428FC,0x9FE438B9, + 0x40119999,0x9999999A, 0x40545CDB,0x083EB514, + 0x4011A3D7,0x0A3D70A4, 0x4054913E,0xE3DA80C1, + 0x4011AE14,0x7AE147AE, 0x4054C629,0x8A104AE3, + 0x4011B851,0xEB851EB8, 0x4054FB9C,0x55AC22F0, + 0x4011C28F,0x5C28F5C3, 0x40553198,0xA4F65988, + 0x4011CCCC,0xCCCCCCCD, 0x4055681F,0xD9BC77FE, + 0x4011D70A,0x3D70A3D7, 0x40559F33,0x595A4F2F, + 0x4011E147,0xAE147AE1, 0x4055D6D4,0x8CC31D6A, + 0x4011EB85,0x1EB851EC, 0x40560F04,0xE08ACC09, + 0x4011F5C2,0x8F5C28F6, 0x405647C5,0xC4EF44AC, + 0x40120000,0x00000000, 0x40568118,0xADE1DEAA, + 0x40120A3D,0x70A3D70A, 0x4056BAFF,0x1310E498, + 0x4012147A,0xE147AE14, 0x4056F57A,0x6FF1325D, + 0x40121EB8,0x51EB851F, 0x4057308C,0x43C7EC0F, + 0x401228F5,0xC28F5C29, 0x40576C36,0x11B44DAC, + 0x40123333,0x33333333, 0x4057A879,0x60B9944F, + 0x40123D70,0xA3D70A3D, 0x4057E557,0xBBC900A6, + 0x401247AE,0x147AE148, 0x405822D2,0xB1CBF352, + 0x401251EB,0x851EB852, 0x405860EB,0xD5AE2320, + 0x40125C28,0xF5C28F5C, 0x40589FA4,0xBE67EDC9, + 0x40126666,0x66666666, 0x4058DEFF,0x0708C2FF, + 0x401270A3,0xD70A3D71, 0x40591EFC,0x4EC1AA6A, + 0x40127AE1,0x47AE147B, 0x40595F9E,0x38EFE497, + 0x4012851E,0xB851EB85, 0x4059A0E6,0x6D27A779, + 0x40128F5C,0x28F5C28F, 0x4059E2D6,0x973EF64F, + 0x40129999,0x9999999A, 0x405A2570,0x67589596, + 0x4012A3D7,0x0A3D70A4, 0x405A68B5,0x91EF1AFE, + 0x4012AE14,0x7AE147AE, 0x405AACA7,0xCFE01A19, + 0x4012B851,0xEB851EB8, 0x405AF148,0xDE776D8B, + 0x4012C28F,0x5C28F5C3, 0x405B369A,0x7F7A9D67, + 0x4012CCCC,0xCCCCCCCD, 0x405B7C9E,0x793462BB, + 0x4012D70A,0x3D70A3D7, 0x405BC356,0x968048FC, + 0x4012E147,0xAE147AE1, 0x405C0AC4,0xA6D66D21, + 0x4012EB85,0x1EB851EC, 0x405C52EA,0x7E575B17, + 0x4012F5C2,0x8F5C28F6, 0x405C9BC9,0xF5D80998, + 0x40130000,0x00000000, 0x405CE564,0xEAEDF51C, + 0x40130A3D,0x70A3D70A, 0x405D2FBD,0x3FFB59AA, + 0x4013147A,0xE147AE14, 0x405D7AD4,0xDC3B8C3D, + 0x40131EB8,0x51EB851F, 0x405DC6AD,0xABCF73F4, + 0x401328F5,0xC28F5C29, 0x405E1349,0x9FCA232E, + 0x40133333,0x33333333, 0x405E60AA,0xAE3D9163, + 0x40133D70,0xA3D70A3D, 0x405EAED2,0xD2477568, + 0x401347AE,0x147AE148, 0x405EFDC4,0x0C1E40F5, + 0x401351EB,0x851EB852, 0x405F4D80,0x611E3D66, + 0x40135C28,0xF5C28F5C, 0x405F9E09,0xDBD6CA7E, + 0x40136666,0x66666666, 0x405FEF62,0x8C17BEFD, + 0x401370A3,0xD70A3D71, 0x406020C6,0x437F75E2, + 0x40137AE1,0x47AE147B, 0x40604A44,0xF382E0C9, + 0x4013851E,0xB851EB85, 0x4060742E,0x66078D17, + 0x40138F5C,0x28F5C28F, 0x40609E83,0xADBA925B, + 0x40139999,0x9999999A, 0x4060C945,0xE00BBAFC, + 0x4013A3D7,0x0A3D70A4, 0x4060F476,0x15349E61, + 0x4013AE14,0x7AE147AE, 0x40612015,0x683FCD86, + 0x4013B851,0xEB851EB8, 0x40614C24,0xF71011E5, + 0x4013C28F,0x5C28F5C3, 0x406178A5,0xE267BF15, + 0x4013CCCC,0xCCCCCCCD, 0x4061A599,0x4DF01723, + 0x4013D70A,0x3D70A3D7, 0x4061D300,0x6040C226, + 0x4013E147,0xAE147AE1, 0x406200DC,0x42E758CC, + 0x4013EB85,0x1EB851EC, 0x40622F2E,0x226F027B, + 0x4013F5C2,0x8F5C28F6, 0x40625DF7,0x2E6826E3, + 0x40140000,0x00000000, 0x40628D38,0x9970338F, + 0x3FE00000,0x00000000, 0x3FFA6129,0x8E1E069C, + 0x3FF00000,0x00000000, 0x4005BF0A,0x8B145769, + 0x3FF80000,0x00000000, 0x4011ED3F,0xE64FC541, + 0x40000000,0x00000000, 0x401D8E64,0xB8D4DDAE, + 0x40040000,0x00000000, 0x40285D6F,0xD931E0BB, + 0x40080000,0x00000000, 0x403415E5,0xBF6FB106, + 0x400C0000,0x00000000, 0x40408EC7,0x21396BDB, + 0x40100000,0x00000000, 0x404B4C90,0x2E273A58, + 0x40120000,0x00000000, 0x40568118,0xADE1DEAA, + 0x40140000,0x00000000, 0x40628D38,0x9970338F, + 0x40160000,0x00000000, 0x406E9624,0x4F21BBF6, + 0x40180000,0x00000000, 0x407936DC,0x5690C08F, + 0x401A0000,0x00000000, 0x4084C922,0x10816C89, + 0x401C0000,0x00000000, 0x40912288,0x5AAEDDAA, + 0x401E0000,0x00000000, 0x409C402B,0x6EB1F6AD, + 0x40200000,0x00000000, 0x40A749EA,0x7D470C6E, + 0x40210000,0x00000000, 0x40B332C4,0xD2B7C4A1, + 0x40220000,0x00000000, 0x40BFA715,0x7C470F82, + 0x40230000,0x00000000, 0x40CA17DD,0x08C11DC1, + 0x40240000,0x00000000, 0x40D5829D,0xCF950560, + 0x40250000,0x00000000, 0x40E1BB70,0x15E84D3B, + 0x40260000,0x00000000, 0x40ED3C44,0x88EE4F7F, + 0x40270000,0x00000000, 0x40F819BC,0x560F6113, + 0x40280000,0x00000000, 0x4103DE16,0x54D37C9A, + 0x40290000,0x00000000, 0x411060C5,0x2565BA66, + 0x402A0000,0x00000000, 0x411B00B5,0x916AC955, + 0x402B0000,0x00000000, 0x41264290,0xBD5CAD8B, + 0x402C0000,0x00000000, 0x413259AC,0x48BF05D7, + 0x402D0000,0x00000000, 0x413E4127,0x437732B7, + 0x402E0000,0x00000000, 0x4148F0CC,0xAFAD2A87, + 0x402F0000,0x00000000, 0x41548F60,0x9E7B6BBE, + 0x40300000,0x00000000, 0x4160F2EB,0xD0A80020, + 0x40308000,0x00000000, 0x416BF1AB,0xEDB9FCBA, + 0x40310000,0x00000000, 0x41770934,0x8C0EA4F9, + 0x40318000,0x00000000, 0x4182FD6C,0x832E3C72, + 0x40320000,0x00000000, 0x418F4F22,0x091940BD, + 0x40328000,0x00000000, 0x4199CF5C,0x2F003C7E, + 0x40330000,0x00000000, 0x41A546D8,0xF9ED26E1, + 0x40338000,0x00000000, 0x41B18A2A,0xAE0AA052, + 0x40340000,0x00000000, 0x41BCEB08,0x8B68E804, + 0x40348000,0x00000000, 0x41C7D6C4,0xF0BCDD5C, + 0x40350000,0x00000000, 0x41D3A6E1,0xFD9EECFD, + 0x40358000,0x00000000, 0x41E03343,0x00327298, + 0x40360000,0x00000000, 0x41EAB5AD,0xB9C43600, + 0x40368000,0x00000000, 0x41F604B6,0x8CF05F66, + 0x40370000,0x00000000, 0x420226AF,0x33B1FDC1, + 0x40378000,0x00000000, 0x420DED16,0x5E84FAD6, + 0x40380000,0x00000000, 0x4218AB7F,0xB5475FB7, + 0x40388000,0x00000000, 0x4224563F,0xA7B34AF7, + 0x40390000,0x00000000, 0x4230C3D3,0x920962C9, + 0x40398000,0x00000000, 0x423BA406,0x8AAC2B6E, + 0x403A0000,0x00000000, 0x4246C932,0x696A6B5D, + 0x403A8000,0x00000000, 0x4252C8A8,0x6D70C9E9, + 0x403B0000,0x00000000, 0x425EF822,0xF7F6731D, + 0x403B8000,0x00000000, 0x426987A4,0xCAEED87A, + 0x403C0000,0x00000000, 0x42750BBA,0x3796379A, + 0x403C8000,0x00000000, 0x4281596E,0x2E20ED6C, + 0x403D0000,0x00000000, 0x428C9AAE,0x4631C056, + 0x403D8000,0x00000000, 0x42979487,0x9E85B948, + 0x403E0000,0x00000000, 0x42A37047,0x0AEC28ED, + 0x403E8000,0x00000000, 0x42B0063F,0x4E687BA2, + 0x403F0000,0x00000000, 0x42BA6B76,0x5D8CDF6D, + 0x403F8000,0x00000000, 0x42C5C788,0x39D357DD, + 0x40400000,0x00000000, 0x42D1F43F,0xCC4B662C, + 0x40404000,0x00000000, 0x42DD99EF,0x101DF23C, + 0x40408000,0x00000000, 0x42E866F3,0x4A725782, + 0x4040C000,0x00000000, 0x42F41DBD,0x6E3E063E, + 0x40410000,0x00000000, 0x4300953E,0x2F3A1EF7, + 0x40414000,0x00000000, 0x430B5738,0xE777C243, + 0x40418000,0x00000000, 0x431689E2,0x21BC8D5B, + 0x4041C000,0x00000000, 0x43229476,0xF5A23301, + 0x40420000,0x00000000, 0x432EA215,0xA1D20D76, + 0x40424000,0x00000000, 0x433940B4,0xACC4E544, + 0x40428000,0x00000000, 0x4344D13F,0xBB1A001A, + 0x4042C000,0x00000000, 0x43512939,0x19C201E5, + 0x40430000,0x00000000, 0x435C4B33,0x4617CC67, + 0x40434000,0x00000000, 0x43675302,0x5A61BFE5, + 0x40438000,0x00000000, 0x43733A43,0xD282A519, + 0x4043C000,0x00000000, 0x437FB371,0x61577EDD, + 0x40440000,0x00000000, 0x438A220D,0x397972EB, + 0x40444000,0x00000000, 0x43958B03,0xE6797728, + 0x40448000,0x00000000, 0x43A1C25C,0x88DF6862, + 0x4044C000,0x00000000, 0x43AD47AE,0xCF343BC7, + 0x40450000,0x00000000, 0x43B82325,0x58201159, + 0x40454000,0x00000000, 0x43C3E5D8,0x3907A3DC, + 0x40458000,0x00000000, 0x43D0672A,0x3C9EB871, + 0x4045C000,0x00000000, 0x43DB0B40,0xACA0085D, + 0x40460000,0x00000000, 0x43E64B41,0xC6D37832, + 0x40464000,0x00000000, 0x43F260D6,0x845DA877, + 0x40468000,0x00000000, 0x43FE4CF7,0x66FE49BE, + 0x4046C000,0x00000000, 0x4408FA89,0xAACDC2F3, + 0x40470000,0x00000000, 0x44149767,0xBC0483E3, + 0x40474000,0x00000000, 0x4420F989,0xF8A5B043, + 0x40478000,0x00000000, 0x442BFC95,0x1EB8BB76, + 0x4047C000,0x00000000, 0x44371233,0x24E55FF0, + 0x40480000,0x00000000, 0x444304D6,0xAECA254B, + 0x40484000,0x00000000, 0x444F5B5B,0x96E0E83F, + 0x40488000,0x00000000, 0x4459D970,0x10884251, + 0x4048C000,0x00000000, 0x44654F27,0xBA858A92, + 0x40490000,0x00000000, 0x44719103,0xE4080B45, + 0x40494000,0x00000000, 0x447CF653,0x19C5751A, + 0x40498000,0x00000000, 0x4487E013,0xCD114461, + 0x4049C000,0x00000000, 0x4493AE8E,0x53C5C183, + 0x404A0000,0x00000000, 0x44A03996,0x528E074C, + 0x404A4000,0x00000000, 0x44AAC01B,0x892A053E, + 0x404A8000,0x00000000, 0x44B60D4F,0x6FDAC731, + 0x404AC000,0x00000000, 0x44C22DC5,0x86AA59DC, + 0x404B0000,0x00000000, 0x44CDF8C5,0xAF17BA3B, + 0x404B4000,0x00000000, 0x44D8B521,0xA1575C36, + 0x404B8000,0x00000000, 0x44E45E30,0x76D61699, + 0x404BC000,0x00000000, 0x44F0CA5F,0x56995724, + 0x404C0000,0x00000000, 0x44FBAED1,0x6A6E0DA7, + 0x404C4000,0x00000000, 0x4506D218,0x043213F2, + 0x404C8000,0x00000000, 0x4512CFFD,0xFEBDE1A1, + 0x404CC000,0x00000000, 0x451F043A,0x8DE1068B, + 0x404D0000,0x00000000, 0x4529919C,0xABEFCB69, + 0x404D4000,0x00000000, 0x453513F1,0xE2BAE577, + 0x404D8000,0x00000000, 0x45416034,0x5C9953E3, + 0x404DC000,0x00000000, 0x454CA5D9,0x74C7236B, + 0x404E0000,0x00000000, 0x45579DBC,0x9DC53C66, + 0x404E4000,0x00000000, 0x456377DE,0x0EEA46D4, + 0x404E8000,0x00000000, 0x45700C81,0x0D464097, + 0x404EC000,0x00000000, 0x457A75C7,0x328A6C4A, + 0x404F0000,0x00000000, 0x4585D009,0x394C5C27, + 0x404F4000,0x00000000, 0x4591FB42,0x6DEF2C39, + 0x404F8000,0x00000000, 0x459DA57D,0xE8F107A8, + 0x404FC000,0x00000000, 0x45A8707A,0x72A1734B, + 0x40500000,0x00000000, 0x45B42598,0x2CF597CD, + 0x40502000,0x00000000, 0x45C09BB7,0xC3748815, + 0x40504000,0x00000000, 0x45CB61E5,0xCA3A5E31, + 0x40506000,0x00000000, 0x45D692AF,0x03E6F5B0, + 0x40508000,0x00000000, 0x45E29BB8,0x25DFCF87, + 0x4050A000,0x00000000, 0x45EEAE0B,0x9E421D1C, + 0x4050C000,0x00000000, 0x45F94A90,0xDB0D6FE2, + 0x4050E000,0x00000000, 0x4604D960,0x90EF2239, + 0x40510000,0x00000000, 0x46112FEC,0x759586FD, + 0x40512000,0x00000000, 0x461C563F,0x6C1356B4, + 0x40514000,0x00000000, 0x46275C1D,0xC469E3AF, + 0x40516000,0x00000000, 0x463341C5,0xBF963CE7, + 0x40518000,0x00000000, 0x463FBFD2,0x19C43B04, + 0x4051A000,0x00000000, 0x464A2C41,0x6493BA80, + 0x4051C000,0x00000000, 0x4655936D,0x44E1A146, + 0x4051E000,0x00000000, 0x4661C94B,0xAFE692C7, + 0x40520000,0x00000000, 0x466D531D,0x8A7EE79C, + 0x40522000,0x00000000, 0x46782C92,0x06CD1D60, + 0x40524000,0x00000000, 0x4683ED9D,0x24A2D51B, + 0x40526000,0x00000000, 0x46906D91,0xD30DCDE0, + 0x40528000,0x00000000, 0x469B15CF,0xE5B6E17B, + 0x4052A000,0x00000000, 0x46A653F6,0x35117C78, + 0x4052C000,0x00000000, 0x46B26803,0x8C2C0E00, + 0x4052E000,0x00000000, 0x46BE58CC,0x27502323, + 0x40530000,0x00000000, 0x46C9044A,0x73545D48, + 0x40532000,0x00000000, 0x46D49F71,0xFBFC0AD9, + 0x40534000,0x00000000, 0x46E1002A,0xB6218B38, + 0x40536000,0x00000000, 0x46EC0782,0x925582B3, + 0x40538000,0x00000000, 0x46F71B35,0x40CBF921, + 0x4053A000,0x00000000, 0x47030C43,0xBF8CCA52, + 0x4053C000,0x00000000, 0x470F6799,0xEA9C414A, + 0x4053E000,0x00000000, 0x4719E387,0xE16485E8, + 0x40540000,0x00000000, 0x47255779,0xB984F3EB, + 0x40542000,0x00000000, 0x473197DF,0xC6928977, + 0x40544000,0x00000000, 0x473D01A2,0x10C44AA4, + 0x40546000,0x00000000, 0x4747E966,0x4BCC6BD3, + 0x40548000,0x00000000, 0x4753B63D,0xA8E91210, + 0x4054A000,0x00000000, 0x47603FEC,0x1D2F9220, + 0x4054C000,0x00000000, 0x476ACA8D,0x6B0116B8, + 0x4054E000,0x00000000, 0x477615EB,0xAE1E65D3, + 0x40550000,0x00000000, 0x478234DE,0x9E0C74E9, + 0x40552000,0x00000000, 0x478E0479,0x8FA440E0, + 0x40554000,0x00000000, 0x4798BEC7,0x503CA477, + 0x40556000,0x00000000, 0x47A46624,0x5FB1A8AC, + 0x40558000,0x00000000, 0x47B0D0ED,0xA9796B90, + 0x4055A000,0x00000000, 0x47BBB9A0,0x80F78D1D, + 0x4055C000,0x00000000, 0x47C6DB01,0x18477245, + 0x4055E000,0x00000000, 0x47D2D756,0x6D26536B, + 0x40560000,0x00000000, 0x47DF1056,0xDC7BF22D, + 0x40562000,0x00000000, 0x47E99B98,0x7155FE28, + 0x40564000,0x00000000, 0x47F51C2C,0xC3433801, + 0x40566000,0x00000000, 0x480166FD,0x3030B0D9, + 0x40568000,0x00000000, 0x480CB108,0xFFBEC164, + 0x4056A000,0x00000000, 0x4817A6F5,0x355242DC, + 0x4056C000,0x00000000, 0x48237F78,0x0991B584, + 0x4056E000,0x00000000, 0x483012C5,0x3D8D219E, + 0x40570000,0x00000000, 0x483A801C,0x0EA8AC4D, + 0x40572000,0x00000000, 0x4845D88D,0x8ACAC826, + 0x40574000,0x00000000, 0x48520247,0xCC4C46C1, + 0x40576000,0x00000000, 0x485DB111,0x451085D5, + 0x40578000,0x00000000, 0x48687A05,0x53328015, + 0x4057A000,0x00000000, 0x48742D75,0xFCC87AD2, + 0x4057C000,0x00000000, 0x4880A233,0xDEE4F9BB, + 0x4057E000,0x00000000, 0x488B6C96,0xD80F107F, + 0x40580000,0x00000000, 0x48969B7F,0x55B808BA, + 0x40582000,0x00000000, 0x48A2A2FC,0x2B43BE44, + 0x40584000,0x00000000, 0x48AEBA06,0x4644060A, + 0x40586000,0x00000000, 0x48B95470,0xE2EA9DB8, + 0x40588000,0x00000000, 0x48C4E184,0x933D9364, + 0x4058A000,0x00000000, 0x48D136A2,0x6F2E8B18, + 0x4058C000,0x00000000, 0x48DC614F,0xE2531841, + 0x4058E000,0x00000000, 0x48E7653C,0xBCC25D25, + 0x40590000,0x00000000, 0x48F3494A,0x9B171BF5, + 0x40592000,0x00000000, 0x48FFCC37,0xA76F9E76, + 0x40594000,0x00000000, 0x490A3679,0x8B9D969B, + 0x40596000,0x00000000, 0x49159BD9,0xEC154EC8, + 0x40598000,0x00000000, 0x4921D03D,0x8C0C04AF, + 0x4059A000,0x00000000, 0x492D5E90,0xBC8BD761, + 0x4059C000,0x00000000, 0x49383602,0x6385C974, + 0x4059E000,0x00000000, 0x4943F565,0x18D3D2F8, + 0x405A0000,0x00000000, 0x495073FB,0xE9AC901D, + 0x405A2000,0x00000000, 0x495B2063,0x3E4AD321, + 0x405A4000,0x00000000, 0x49665CAE,0x0969F286, + 0x405A6000,0x00000000, 0x49726F33,0x6141DA0F, + 0x405A8000,0x00000000, 0x497E64A5,0x8639CAE8, + 0x405AA000,0x00000000, 0x49890E0F,0x0ABD0B2B, + 0x405AC000,0x00000000, 0x4994A77F,0x5F9B50F9, + 0x405AE000,0x00000000, 0x49A106CE,0x0A1DD99B, + 0x405B0000,0x00000000, 0x49AC1274,0x4A3A28E3, + 0x405B2000,0x00000000, 0x49B7243A,0xE1217BC2, + 0x405B4000,0x00000000, 0x49C313B3,0xB6978E85, + 0x405B6000,0x00000000, 0x49CF73DD,0x06286A13, + 0x405B8000,0x00000000, 0x49D9EDA3,0xA31E587E, + 0x405BA000,0x00000000, 0x49E55FCE,0xF82F9F2A, + 0x405BC000,0x00000000, 0x49F19EBE,0x56B56453, + 0x405BE000,0x00000000, 0x49FD0CF5,0x721E1715, + 0x405C0000,0x00000000, 0x4A07F2BC,0x6E599B7E, + 0x405C2000,0x00000000, 0x4A13BDEF,0xFE345805, + 0x405C4000,0x00000000, 0x4A204644,0x610DF2FF, + 0x405C6000,0x00000000, 0x4A2AD503,0x60E07179, + 0x405C8000,0x00000000, 0x4A361E8B,0x490AC4E6, + 0x405CA000,0x00000000, 0x4A423BFA,0x7AECE97D, + 0x405CC000,0x00000000, 0x4A4E1032,0x01F299B3, + 0x405CE000,0x00000000, 0x4A58C870,0xC36F2A0F, + 0x405D0000,0x00000000, 0x4A646E1B,0x637BEAF5, + 0x405D2000,0x00000000, 0x4A70D77E,0x8BA91AFA, + 0x405D4000,0x00000000, 0x4A7BC473,0xCFEDE104, + 0x405D6000,0x00000000, 0x4A86E3ED,0xA705C221, + 0x405D8000,0x00000000, 0x4A92DEB1,0xB9C85E2D, + 0x405DA000,0x00000000, 0x4A9F1C77,0xE59F267F, + 0x405DC000,0x00000000, 0x4AA9A598,0x1CA67D10, + 0x405DE000,0x00000000, 0x4AB5246A,0xDA6FE687, + 0x405E0000,0x00000000, 0x4AC16DC8,0xA9EF670B, + 0x405E2000,0x00000000, 0x4ACCBC3C,0xE8CC8037, + 0x405E4000,0x00000000, 0x4AD7B031,0x66942309, + 0x405E6000,0x00000000, 0x4AE38714,0xFC0AAE39, + 0x405E8000,0x00000000, 0x4AF0190B,0xE03150A7, + 0x405EA000,0x00000000, 0x4AFA8A74,0xF37A3B89, + 0x405EC000,0x00000000, 0x4B05E115,0x2F9A8119, + 0x405EE000,0x00000000, 0x4B12094F,0xE8744FC6, + 0x405F0000,0x00000000, 0x4B1DBCA9,0x263F8487, + 0x405F2000,0x00000000, 0x4B288393,0xED995AD5, + 0x405F4000,0x00000000, 0x4B343556,0xDEE93BEE, + 0x405F6000,0x00000000, 0x4B40A8B2,0x828828F5, + 0x405F8000,0x00000000, 0x4B4B774C,0x12967DFA, + 0x405FA000,0x00000000, 0x4B56A453,0x18873D6F, + 0x405FC000,0x00000000, 0x4B62AA43,0x06E922C2, + 0x405FE000,0x00000000, 0x4B6EC605,0x9BAA9964, + 0x40600000,0x00000000, 0x4B795E54,0xC5DD4217, + 0x40601000,0x00000000, 0x4B84E9AB,0xC3428FC2, + 0x40602000,0x00000000, 0x4B913D5B,0x07929253, + 0x40603000,0x00000000, 0x4B9C6C64,0xAA863BD3, + 0x40604000,0x00000000, 0x4BA76E5F,0x44CE9C2F, + 0x40605000,0x00000000, 0x4BB350D2,0x662A4469, + 0x40606000,0x00000000, 0x4BBFD8A2,0x0C3CC006, + 0x40607000,0x00000000, 0x4BCA40B5,0xB025449B, + 0x40608000,0x00000000, 0x4BD5A449,0xDD5CCAB9, + 0x40609000,0x00000000, 0x4BE1D732,0x1E5E5FE0, + 0x4060A000,0x00000000, 0x4BED6A08,0x67193D6C, + 0x4060B000,0x00000000, 0x4BF83F76,0x6FB9E947, + 0x4060C000,0x00000000, 0x4C03FD30,0x16C9D64C, + 0x4060D000,0x00000000, 0x4C107A68,0x8174F605, + 0x4060E000,0x00000000, 0x4C1B2AFA,0xB7F7FC66, + 0x4060F000,0x00000000, 0x4C266569,0x453096F6, + 0x40610000,0x00000000, 0x4C327666,0x04B71D6D, + 0x40611000,0x00000000, 0x4C3E7083,0x85890112, + 0x40612000,0x00000000, 0x4C4917D7,0x728472A7, + 0x40613000,0x00000000, 0x4C54AF8F,0xE81C20F2, + 0x40614000,0x00000000, 0x4C610D73,0xF59D48DF, + 0x40615000,0x00000000, 0x4C6C1D6A,0x48112ABF, + 0x40616000,0x00000000, 0x4C772D44,0x07457C1D, + 0x40617000,0x00000000, 0x4C831B26,0x950C45E2, + 0x40618000,0x00000000, 0x4C8F8024,0xEB633B1D, + 0x40619000,0x00000000, 0x4C99F7C3,0x573FA4E3, + 0x4061A000,0x00000000, 0x4CA56827,0x77CA4725, + 0x4061B000,0x00000000, 0x4CB1A59F,0x957C4DA5, + 0x4061C000,0x00000000, 0x4CBD184D,0x3F8C34F5, + 0x4061D000,0x00000000, 0x4CC7FC16,0x3624A908, + 0x4061E000,0x00000000, 0x4CD3C5A5,0x54D381AF, + 0x4061F000,0x00000000, 0x4CE04C9F,0x1F206A37, + 0x40620000,0x00000000, 0x4CEADF7D,0x6C5FBB7A, + 0x40621000,0x00000000, 0x4CF6272E,0x41EFF102, + 0x40622000,0x00000000, 0x4D024319,0x1E60BE32, + 0x40623000,0x00000000, 0x4D0E1BEF,0x07CB81B3, + 0x40624000,0x00000000, 0x4D18D21D,0xFC67715A, + 0x40625000,0x00000000, 0x4D247615,0x836B4039, + 0x40626000,0x00000000, 0x4D30DE11,0xFE284410, + 0x40627000,0x00000000, 0x4D3BCF4B,0x58F6E506, + 0x40628000,0x00000000, 0x4D46ECDD,0xB1C8C6E7, + 0x40629000,0x00000000, 0x4D52E60F,0xE5C2B091, + 0x4062A000,0x00000000, 0x4D5F289D,0xAB234C40, + 0x4062B000,0x00000000, 0x4D69AF9B,0xAF66EC63, + 0x4062C000,0x00000000, 0x4D752CAC,0x29822593, + 0x4062D000,0x00000000, 0x4D817496,0xCADE4071, + 0x4062E000,0x00000000, 0x4D8CC775,0x31A4F011, + 0x4062F000,0x00000000, 0x4D97B971,0x32F2BF9C, + 0x40630000,0x00000000, 0x4DA38EB4,0xE77DDDDD, + 0x40631000,0x00000000, 0x4DB01F54,0xF6275EFD, + 0x40632000,0x00000000, 0x4DBA94D1,0xE2925340, + 0x40633000,0x00000000, 0x4DC5E9A0,0x2907EDDB, + 0x40634000,0x00000000, 0x4DD2105A,0xC3794C20, + 0x40635000,0x00000000, 0x4DDDC845,0x8E41CB9F, + 0x40636000,0x00000000, 0x4DE88D26,0x434A71B6, + 0x40637000,0x00000000, 0x4DF43D3A,0xD48ADF74, + 0x40638000,0x00000000, 0x4E00AF33,0xAF5B2D7A, + 0x40639000,0x00000000, 0x4E0B8205,0x7B71EE1D, + 0x4063A000,0x00000000, 0x4E16AD2A,0x4DAC90E3, + 0x4063B000,0x00000000, 0x4E22B18C,0xB9EB8F14, + 0x4063C000,0x00000000, 0x4E2ED209,0xA0495E91, + 0x4063D000,0x00000000, 0x4E39683C,0x8566C699, + 0x4063E000,0x00000000, 0x4E44F1D6,0x223BCF5A, + 0x4063F000,0x00000000, 0x4E514416,0x3FC786E6, + 0x40640000,0x00000000, 0x4E5C777D,0xC65C9488, + 0x40641000,0x00000000, 0x4E677785,0x5DF29B7F, + 0x40642000,0x00000000, 0x4E73585D,0x21F52AD4, + 0x40643000,0x00000000, 0x4E7FE511,0x4A0F7329, + 0x40644000,0x00000000, 0x4E8A4AF5,0xD3B99D59, + 0x40645000,0x00000000, 0x4E95ACBD,0x1A00E054, + 0x40646000,0x00000000, 0x4EA1DE29,0x67ECAFCC, + 0x40647000,0x00000000, 0x4EAD7584,0x8BE5FA4C, + 0x40648000,0x00000000, 0x4EB848EE,0x2CD9E02A, + 0x40649000,0x00000000, 0x4EC404FE,0x1FB48E53, + 0x4064A000,0x00000000, 0x4ED080D7,0x9B61580F, + 0x4064B000,0x00000000, 0x4EDB3596,0x545B1D51, + 0x4064C000,0x00000000, 0x4EE66E27,0xE9B9AB09, + 0x4064D000,0x00000000, 0x4EF27D9B,0x77A45640, + 0x4064E000,0x00000000, 0x4EFE7C66,0x270C39F4, + 0x4064F000,0x00000000, 0x4F0921A3,0xAC27CE67, + 0x40650000,0x00000000, 0x4F14B7A3,0x96B8BFF6, + 0x40651000,0x00000000, 0x4F21141C,0x79A2EB78, + 0x40652000,0x00000000, 0x4F2C2864,0x8D85AB83, + 0x40653000,0x00000000, 0x4F373650,0xB49817C0, + 0x40654000,0x00000000, 0x4F43229C,0x5C0D358F, + 0x40655000,0x00000000, 0x4F4F8C71,0x9C2B477D, + 0x40656000,0x00000000, 0x4F5A01E6,0xFF52EFB1, + 0x40657000,0x00000000, 0x4F657083,0x399A257D, + 0x40658000,0x00000000, 0x4F71AC83,0x83F35FBD, + 0x40659000,0x00000000, 0x4F7D23A9,0x7AC8AB1E, + 0x4065A000,0x00000000, 0x4F880573,0xA499F824, + 0x4065B000,0x00000000, 0x4F93CD5D,0xADF2F278, + 0x4065C000,0x00000000, 0x4FA052FC,0x585E98A2, + 0x4065D000,0x00000000, 0x4FAAE9FB,0x8F1739DF, + 0x4065E000,0x00000000, 0x4FB62FD4,0x9A1E79F8, + 0x4065F000,0x00000000, 0x4FC24A3A,0x897D65CA, + 0x40660000,0x00000000, 0x4FCE27B0,0xA2F86833, + 0x40661000,0x00000000, 0x4FD8DBCE,0xFC9E91B7, + 0x40662000,0x00000000, 0x4FE47E12,0xC0B6846F, + 0x40663000,0x00000000, 0x4FF0E4A8,0x01F72969, + 0x40664000,0x00000000, 0x4FFBDA27,0x1DB91986, + 0x40665000,0x00000000, 0x5006F5D1,0x39ECCBC1, + 0x40666000,0x00000000, 0x5012ED70,0xF2346931, + 0x40667000,0x00000000, 0x501F34C8,0x2EE1C4BE, + 0x40668000,0x00000000, 0x5029B9A3,0x2B1D8885, + 0x40669000,0x00000000, 0x503534F0,0xB1BBA718, + 0x4066A000,0x00000000, 0x50417B67,0x94066E66, + 0x4066B000,0x00000000, 0x504CD2B1,0xDBFD4B90, + 0x4066C000,0x00000000, 0x5057C2B4,0x9BD687CA, + 0x4066D000,0x00000000, 0x50639657,0xCD14652F, + 0x4066E000,0x00000000, 0x507025A0,0x80643D67, + 0x4066F000,0x00000000, 0x507A9F32,0xDD84CA29, + 0x40670000,0x00000000, 0x5085F22E,0x785FF70E, + 0x40671000,0x00000000, 0x50921768,0x5E6DABA5, + 0x40672000,0x00000000, 0x509DD3E6,0x7EDBD369, + 0x40673000,0x00000000, 0x50A896BC,0x55BAC44C, + 0x40674000,0x00000000, 0x50B44521,0xDEE0E199, + 0x40675000,0x00000000, 0x50C0B5B7,0x665B81D4, + 0x40676000,0x00000000, 0x50CB8CC3,0x14434B52, + 0x40677000,0x00000000, 0x50D6B604,0xF6808676, + 0x40678000,0x00000000, 0x50E2B8D9,0x45670408, + 0x40679000,0x00000000, 0x50EEDE12,0x55F49388, + 0x4067A000,0x00000000, 0x50F97228,0x23092B4D, + 0x4067B000,0x00000000, 0x5104FA03,0xB1678640, + 0x4067C000,0x00000000, 0x51114AD4,0x18D3B94C, + 0x4067D000,0x00000000, 0x511C829B,0x37869E1B, + 0x4067E000,0x00000000, 0x512780AF,0x0992E0C5, + 0x4067F000,0x00000000, 0x51335FEA,0xCF9DB657, + 0x40680000,0x00000000, 0x513FF185,0x62CC483E, + 0x40681000,0x00000000, 0x514A5539,0xF7EA156F, + 0x40682000,0x00000000, 0x5155B533,0xA34ADB32, + 0x40683000,0x00000000, 0x5161E523,0x69C669BA, + 0x40684000,0x00000000, 0x516D8105,0x2CB19D0C, + 0x40685000,0x00000000, 0x51785269,0x9C56A145, + 0x40686000,0x00000000, 0x51840CCF,0x34C420DE, + 0x40687000,0x00000000, 0x51908749,0x386C7074, + 0x40688000,0x00000000, 0x519B4036,0x1511970E, + 0x40689000,0x00000000, 0x51A676E9,0xF859F4DC, + 0x4068A000,0x00000000, 0x51B284D3,0xBB227032, + 0x4068B000,0x00000000, 0x51BE884D,0x6C929E71, + 0x4068C000,0x00000000, 0x51C92B73,0xB924EDF1, + 0x4068D000,0x00000000, 0x51D4BFBA,0x6CABEDF1, + 0x4068E000,0x00000000, 0x51E11AC7,0x97323903, + 0x4068F000,0x00000000, 0x51EC3363,0x1C437534, + 0x40690000,0x00000000, 0x51F73F60,0xEA79F5B9, + 0x40691000,0x00000000, 0x52032A15,0x0CBD140C, + 0x40692000,0x00000000, 0x520F98C3,0x1A5FDD25, + 0x40693000,0x00000000, 0x521A0C0E,0x9CE35791, + 0x40694000,0x00000000, 0x522578E2,0x3EE4F2D2, + 0x40695000,0x00000000, 0x5231B36A,0x23271D9A, + 0x40696000,0x00000000, 0x523D2F0A,0x258E2D01, + 0x40697000,0x00000000, 0x52480ED4,0xBB267ACE, + 0x40698000,0x00000000, 0x5253D519,0x0ABF8313, + 0x40699000,0x00000000, 0x5260595C,0x0DC07FCA, + 0x4069A000,0x00000000, 0x526AF47D,0xCA9FD133, + 0x4069B000,0x00000000, 0x5276387E,0x52E77303, + 0x4069C000,0x00000000, 0x5282515E,0xBD58BF5C, + 0x4069D000,0x00000000, 0x528E3376,0xD5436F25, + 0x4069E000,0x00000000, 0x5298E583,0xC58E35C4, + 0x4069F000,0x00000000, 0x52A48613,0x1C950CED, + 0x406A0000,0x00000000, 0x52B0EB40,0x981671AC, + 0x406A1000,0x00000000, 0x52BBE507,0x1FDBA3DE, + 0x406A2000,0x00000000, 0x52C6FEC8,0x40CEA3D5, + 0x406A3000,0x00000000, 0x52D2F4D4,0xE03D16C2, + 0x406A4000,0x00000000, 0x52DF40F7,0x72B4AA1B, + 0x406A5000,0x00000000, 0x52E9C3AE,0x9151263B, + 0x406A6000,0x00000000, 0x52F53D38,0x745E9AA6, + 0x406A7000,0x00000000, 0x5301823B,0x067189D1, + 0x406A8000,0x00000000, 0x530CDDF2,0xE98B780D, + 0x406A9000,0x00000000, 0x5317CBFB,0xA2A87780, + 0x406AA000,0x00000000, 0x53239DFD,0xADF7D8F2, + 0x406AB000,0x00000000, 0x53302BEE,0x7FDD3C52, + 0x406AC000,0x00000000, 0x533AA997,0xE5E614A7, + 0x406AD000,0x00000000, 0x5345FAC0,0x1EF00751, + 0x406AE000,0x00000000, 0x53521E78,0xBA644953, + 0x406AF000,0x00000000, 0x535DDF8B,0xF9D2C4D9, + 0x406B0000,0x00000000, 0x5368A056,0x265FE3CE, + 0x406B1000,0x00000000, 0x53744D0B,0xFF1F369E, + 0x406B2000,0x00000000, 0x5380BC3D,0xA8870386, + 0x406B3000,0x00000000, 0x538B9784,0xDEAD232E, + 0x406B4000,0x00000000, 0x5396BEE3,0x145C2812, + 0x406B5000,0x00000000, 0x53A2C028,0xAA77F150, + 0x406B6000,0x00000000, 0x53AEEA1F,0xBE812D0F, + 0x406B7000,0x00000000, 0x53B97C17,0xA0470700, + 0x406B8000,0x00000000, 0x53C50234,0x720464C9, + 0x406B9000,0x00000000, 0x53D15194,0x93BDE06C, + 0x406BA000,0x00000000, 0x53DC8DBC,0xFFB57D24, + 0x406BB000,0x00000000, 0x53E789DC,0x49147CE7, + 0x406BC000,0x00000000, 0x53F3677B,0x704A40D8, + 0x406BD000,0x00000000, 0x53FFFDFE,0x58588CD5, + 0x406BE000,0x00000000, 0x540A5F82,0x1E46BD6C, + 0x406BF000,0x00000000, 0x5415BDAD,0x7A848783, + 0x406C0000,0x00000000, 0x5421EC20,0x24FB6CEF, + 0x406C1000,0x00000000, 0x542D8C8A,0x4B3C6378, + 0x406C2000,0x00000000, 0x54385BE8,0xBFA1AFCE, + 0x406C3000,0x00000000, 0x544414A3,0x57292A80, + 0x406C4000,0x00000000, 0x54508DBD,0x59915B4F, + 0x406C5000,0x00000000, 0x545B4AD9,0xFBB96C33, + 0x406C6000,0x00000000, 0x54667FAF,0x7266BF9B, + 0x406C7000,0x00000000, 0x54728C0E,0xD04AC49C, + 0x406C8000,0x00000000, 0x547E9439,0x57EC0C43, + 0x406C9000,0x00000000, 0x54893547,0x9AFA35DE, + 0x406CA000,0x00000000, 0x5494C7D4,0x6B30E5B0, + 0x406CB000,0x00000000, 0x54A12175,0x4F4F0E6B, + 0x406CC000,0x00000000, 0x54AC3E65,0xF5F6F8E0, + 0x406CD000,0x00000000, 0x54B74874,0xAA4C46C5, + 0x406CE000,0x00000000, 0x54C33190,0xA83F0958, + 0x406CF000,0x00000000, 0x54CFA519,0x67E1052B, + 0x406D0000,0x00000000, 0x54DA163A,0x317C9571, + 0x406D1000,0x00000000, 0x54E58144,0x88F0E6EE, + 0x406D2000,0x00000000, 0x54F1BA53,0x74247313, + 0x406D3000,0x00000000, 0x54FD3A6F,0x41981AEB, + 0x406D4000,0x00000000, 0x55081839,0x7B37B180, + 0x406D5000,0x00000000, 0x5513DCD7,0x6C6681AC, + 0x406D6000,0x00000000, 0x55205FBE,0x403E820D, + 0x406D7000,0x00000000, 0x552AFF04,0x209305AC, + 0x406D8000,0x00000000, 0x5536412B,0x6D9C72F9, + 0x406D9000,0x00000000, 0x55425885,0xBB09167F, + 0x406DA000,0x00000000, 0x554E3F41,0xA0776B59, + 0x406DB000,0x00000000, 0x5558EF3C,0x58B09B93, + 0x406DC000,0x00000000, 0x55648E16,0x983EA89A, + 0x406DD000,0x00000000, 0x5570F1DB,0xC18727B4, + 0x406DE000,0x00000000, 0x557BEFEB,0x61064EA1, + 0x406DF000,0x00000000, 0x558707C2,0xC7CBAA81, + 0x406E0000,0x00000000, 0x5592FC3B,0xB0FCB841, + 0x406E1000,0x00000000, 0x559F4D2B,0x7876CF99, + 0x406E2000,0x00000000, 0x55A9CDBD,0xE38932E0, + 0x406E3000,0x00000000, 0x55B54583,0x72ADAD98, + 0x406E4000,0x00000000, 0x55C18911,0x2329934D, + 0x406E5000,0x00000000, 0x55CCE938,0x5C0605DB, + 0x406E6000,0x00000000, 0x55D7D546,0x48D217A1, + 0x406E7000,0x00000000, 0x55E3A5A6,0x8B524219, + 0x406E8000,0x00000000, 0x55F0323E,0xF5880BF3, + 0x406E9000,0x00000000, 0x55FAB400,0xFD4B4509, + 0x406EA000,0x00000000, 0x56060355,0x1E060B72, + 0x406EB000,0x00000000, 0x5612258B,0xD8706B78, + 0x406EC000,0x00000000, 0x561DEB36,0x00EC79D4, + 0x406ED000,0x00000000, 0x5628A9F3,0xB6AFF351, + 0x406EE000,0x00000000, 0x563454F9,0x367A4B04, + 0x406EF000,0x00000000, 0x5640C2C6,0x76DBF332, + 0x406F0000,0x00000000, 0x564BA24A,0xDC52A6B6, + 0x406F1000,0x00000000, 0x5656C7C4,0xA8990654, + 0x406F2000,0x00000000, 0x5662C77A,0xEA3B35AC, + 0x406F3000,0x00000000, 0x566EF631,0xDBC4D70C, + 0x406F4000,0x00000000, 0x5679860A,0xFEA3876D, + 0x406F5000,0x00000000, 0x56850A68,0x655197B6, + 0x406F6000,0x00000000, 0x56915857,0xB18D19C4, + 0x406F7000,0x00000000, 0x569C98E3,0x209AFF5B, + 0x406F8000,0x00000000, 0x56A7930D,0x1DDD0C34, + 0x406F9000,0x00000000, 0x56B36F0F,0x0521972A, + 0x406FA000,0x00000000, 0x56C0053E,0x164D25FF, + 0x406FB000,0x00000000, 0x56CA69CE,0x48604213, + 0x406FC000,0x00000000, 0x56D5C62A,0xA0F8323A, + 0x406FD000,0x00000000, 0x56E1F31F,0x9A9C02D7, + 0x406FE000,0x00000000, 0x56ED9813,0xE9473A60, + 0x406FF000,0x00000000, 0x56F8656B,0x982D1F44, + 0x40700000,0x00000000, 0x57041C7A,0x8814BEBA, + 0x40700800,0x00000000, 0x57109433,0xFFCB96CA, + 0x40701000,0x00000000, 0x571B5582,0x09F140FD, + 0x40701800,0x00000000, 0x57268878,0x5935DBB2, + 0x40702000,0x00000000, 0x5732934C,0xB8371AB4, + 0x40702800,0x00000000, 0x573EA029,0xEAE91642, + 0x40703000,0x00000000, 0x57493F1F,0x5326A019, + 0x40703800,0x00000000, 0x5754CFF1,0x93835D18, + 0x40704000,0x00000000, 0x57612825,0xA2FDAE13, + 0x40704800,0x00000000, 0x576C496D,0x1C4D4EDC, + 0x40705000,0x00000000, 0x5777518B,0xF570C588, + 0x40705800,0x00000000, 0x5783390F,0x2FB6AF23, + 0x40706000,0x00000000, 0x578FB174,0x868F8418, + 0x40706800,0x00000000, 0x579A2069,0xBEAAFCC1, + 0x40707000,0x00000000, 0x57A589AA,0x1904B8FD, + 0x40707800,0x00000000, 0x57B1C13F,0x77F8B4FD, + 0x40708000,0x00000000, 0x57BD45D8,0xD0A28247, + 0x40708800,0x00000000, 0x57C821A1,0xE63BAB6A, + 0x40709000,0x00000000, 0x57D3E498,0xD415B213, + 0x40709800,0x00000000, 0x57E06622,0xF0D162C7, + 0x4070A000,0x00000000, 0x57EB098E,0x928AFB64, + 0x4070A800,0x00000000, 0x57F649DB,0xEB8F9483, + 0x4070B000,0x00000000, 0x58025FAF,0x83A52372, + 0x4070B800,0x00000000, 0x580E4B11,0x065FE4C8, + 0x4070C000,0x00000000, 0x5818F8F8,0xB78094E9, + 0x4070C800,0x00000000, 0x5824961D,0x34EBA01D, + 0x4070D000,0x00000000, 0x5830F879,0x7F4ABAB9, + 0x4070D800,0x00000000, 0x583BFAD3,0xE2E189D8, + 0x4070E000,0x00000000, 0x584710C0,0xD041C387, + 0x4070E800,0x00000000, 0x585303A5,0x6593BD1F, + 0x4070F000,0x00000000, 0x585F5964,0x4203C1DE, + 0x4070F800,0x00000000, 0x5869D7D1,0x234DB4A9, + 0x40710000,0x00000000, 0x58754DD1,0xADEC0B48, + 0x40710800,0x00000000, 0x58818FE9,0xEB38F352, + 0x40711000,0x00000000, 0x588CF482,0x35243089, + 0x40711800,0x00000000, 0x5897DE94,0x8FBD7E39, + 0x40712000,0x00000000, 0x58A3AD52,0x664E1DF7, + 0x40712800,0x00000000, 0x58B03891,0xE25ABC6B, + 0x40713000,0x00000000, 0x58BABE6E,0x254A0BCA, + 0x40713800,0x00000000, 0x58C60BED,0x76F072A2, + 0x40714000,0x00000000, 0x58D22CA1,0xB9A5C3DF, + 0x40714800,0x00000000, 0x58DDF6E4,0x95EF7D77, + 0x40715000,0x00000000, 0x58E8B395,0x0821A800, + 0x40715800,0x00000000, 0x58F45CE9,0x862703BA, + 0x40716000,0x00000000, 0x5900C951,0xD258F4BF, + 0x40716800,0x00000000, 0x590BAD15,0x0ED7AA99, + 0x40717000,0x00000000, 0x5916D0A9,0xB49138CB, + 0x40717800,0x00000000, 0x5922CED0,0x05CE1F1A, + 0x40718000,0x00000000, 0x592F0248,0xAF95F4C5, + 0x40718800,0x00000000, 0x59399002,0x3FA2717D, + 0x40719000,0x00000000, 0x5945129F,0x8C8EC869, + 0x40719800,0x00000000, 0x59515F1D,0x7348E98B, + 0x4071A000,0x00000000, 0x595CA40D,0x9BE99BD8, + 0x4071A800,0x00000000, 0x59679C41,0x8952B69E, + 0x4071B000,0x00000000, 0x597376A5,0x8F4AF93B, + 0x4071B800,0x00000000, 0x59800B7F,0x70BC2748, + 0x4071C000,0x00000000, 0x598A741E,0x77C7EC9D, + 0x4071C800,0x00000000, 0x5995CEAB,0x17F0A943, + 0x4071D000,0x00000000, 0x59A1FA21,0xCBB8DF30, + 0x4071D800,0x00000000, 0x59ADA3A2,0x0893BDDD, + 0x4071E000,0x00000000, 0x59B86EF2,0x276B93A5, + 0x4071E800,0x00000000, 0x59C42454,0xC8B8682D, + 0x4071F000,0x00000000, 0x59D09AAD,0x2C170340, + 0x4071F800,0x00000000, 0x59DB602E,0x41585B8E, + 0x40720000,0x00000000, 0x59E69144,0xAE1D9F07, + 0x40720800,0x00000000, 0x59F29A8D,0x7401A7B4, + 0x40721000,0x00000000, 0x59FEAC1F,0x275B04AF, + 0x40721800,0x00000000, 0x5A0948FA,0xE329BC12, + 0x40722000,0x00000000, 0x5A14D811,0xE6DF8552, + 0x40722800,0x00000000, 0x5A212ED8,0x9342BFFD, + 0x40723000,0x00000000, 0x5A2C5478,0x90F4370C, + 0x40723800,0x00000000, 0x5A375AA6,0xCD49B6C7, + 0x40724000,0x00000000, 0x5A434090,0xA44810F8, + 0x40724800,0x00000000, 0x5A4FBDD4,0x784CDA28, + 0x40725000,0x00000000, 0x5A5A2A9D,0x45FB7BB3, + 0x40725800,0x00000000, 0x5A659212,0xF0679FBC, + 0x40726000,0x00000000, 0x5A71C82E,0x2FB1A15B, + 0x40726800,0x00000000, 0x5A7D5146,0xD46A1DE3, + 0x40727000,0x00000000, 0x5A882B0D,0xFDA106AA, + 0x40727800,0x00000000, 0x5A93EC5D,0x42FB4DED, + 0x40728000,0x00000000, 0x5AA06C8A,0x20724675, + 0x40728800,0x00000000, 0x5AAB141D,0x22227699, + 0x40729000,0x00000000, 0x5AB6528F,0xCE13764B, + 0x40729800,0x00000000, 0x5AC266DC,0x18440B4A, + 0x4072A000,0x00000000, 0x5ACE56E5,0x08C916D8, + 0x4072A800,0x00000000, 0x5AD902B8,0xE3798770, + 0x4072B000,0x00000000, 0x5AE49E26,0xF3D4B60A, + 0x4072B800,0x00000000, 0x5AF0FF19,0xD262FE79, + 0x4072C000,0x00000000, 0x5AFC05C0,0xA7166B4A, + 0x4072C800,0x00000000, 0x5B0719C2,0x5B8F5B4A, + 0x4072D000,0x00000000, 0x5B130B11,0xFF23056A, + 0x4072D800,0x00000000, 0x5B1F65A1,0xD137C73F, + 0x4072E000,0x00000000, 0x5B29E1E8,0x52274ADB, + 0x4072E800,0x00000000, 0x5B355623,0x275D5D3E, + 0x4072F000,0x00000000, 0x5B4196C5,0x5FAA7A5C, + 0x4072F800,0x00000000, 0x5B4CFFD0,0x769DDF27, + 0x40730000,0x00000000, 0x5B57E7E6,0x78D54EB5, + 0x40730800,0x00000000, 0x5B63B501,0x40165E6B, + 0x40731000,0x00000000, 0x5B703EE7,0x474BBDF2, + 0x40731800,0x00000000, 0x5B7AC8DF,0x5F78B7CA, + 0x40732000,0x00000000, 0x5B861489,0x2AFE2EA5, + 0x40732800,0x00000000, 0x5B9233BA,0x5F186FF8, + 0x40733000,0x00000000, 0x5B9E0297,0xBAA30C57, + 0x40733800,0x00000000, 0x5BA8BD3A,0x1C2C4952, + 0x40734000,0x00000000, 0x5BB464DC,0xEF5ABE49, + 0x40734800,0x00000000, 0x5BC0CFDF,0xBBFD0F84, + 0x40735000,0x00000000, 0x5BCBB7E3,0x77E0A776, + 0x40735800,0x00000000, 0x5BD6D992,0x399F5E26, + 0x40736000,0x00000000, 0x5BE2D627,0xFE4E6AF9, + 0x40736800,0x00000000, 0x5BEF0E64,0x3BCBA12A, + 0x40737000,0x00000000, 0x5BF999FD,0x64C82181, + 0x40737800,0x00000000, 0x5C051AD9,0xE8FC1D15, + 0x40738000,0x00000000, 0x5C1165E5,0xD9F93ADE, + 0x40738800,0x00000000, 0x5C1CAF3C,0x7354735A, + 0x40739000,0x00000000, 0x5C27A579,0x8CDC2FF0, + 0x40739800,0x00000000, 0x5C337E3F,0x0FEE1A43, + 0x4073A000,0x00000000, 0x5C4011C3,0x3C6D0DB8, + 0x4073A800,0x00000000, 0x5C4A7E72,0xAE0FA2EF, + 0x4073B000,0x00000000, 0x5C55D72E,0xE0B93BB4, + 0x4073B800,0x00000000, 0x5C620126,0xB9632031, + 0x4073C000,0x00000000, 0x5C6DAF34,0xAAE43996, + 0x4073C800,0x00000000, 0x5C78787C,0x6ED041A6, + 0x4073D000,0x00000000, 0x5C842C32,0x1A4628C7, + 0x4073D800,0x00000000, 0x5C90A128,0xDF6FE365, + 0x4073E000,0x00000000, 0x5C9B6ADE,0xA38EA430, + 0x4073E800,0x00000000, 0x5CA69A14,0x7274E527, + 0x4073F000,0x00000000, 0x5CB2A1D1,0x04C50F06, + 0x4073F800,0x00000000, 0x5CBEB819,0x0F13D572, + 0x40740000,0x00000000, 0x5CC952DA,0x4C83AF00, + 0x40740800,0x00000000, 0x5CD4E035,0x66820AFE, + 0x40741000,0x00000000, 0x5CE1358E,0x212351EF, + 0x40741800,0x00000000, 0x5CEC5F88,0x559A191C, + 0x40742000,0x00000000, 0x5CF763C5,0x3339E998, + 0x40742800,0x00000000, 0x5D034815,0x0717AC6A, + 0x40743000,0x00000000, 0x5D0FCA39,0x3EFB439C, + 0x40743800,0x00000000, 0x5D1A34D4,0xC8FB9B73, + 0x40744000,0x00000000, 0x5D259A7F,0x106151AC, + 0x40744800,0x00000000, 0x5D31CF1F,0x9C5D5F7E, + 0x40745000,0x00000000, 0x5D3D5CB9,0x4EAC5631, + 0x40745800,0x00000000, 0x5D48347D,0xC2D6F085, + 0x40746000,0x00000000, 0x5D53F424,0xBA4604DF, + 0x40746800,0x00000000, 0x5D6072F3,0xD01AB2DA, + 0x40747000,0x00000000, 0x5D6B1EAF,0xD0F4DBEE, + 0x40747800,0x00000000, 0x5D765B47,0x167B3B33, + 0x40748000,0x00000000, 0x5D826E0B,0x79FD6017, + 0x40748800,0x00000000, 0x5D8E62BD,0xA97FF0A3, + 0x40749000,0x00000000, 0x5D990C7C,0xDE176CFA, + 0x40749800,0x00000000, 0x5DA4A633,0xD6332716, + 0x4074A000,0x00000000, 0x5DB105BC,0xBBD22B5D, + 0x4074A800,0x00000000, 0x5DBC10B1,0xAF4EAEB5, + 0x4074B000,0x00000000, 0x5DC722C7,0x6B1366FE, + 0x4074B800,0x00000000, 0x5DD31281,0x7ECBE1FD, + 0x4074C000,0x00000000, 0x5DDF71E4,0x27EFE008, + 0x4074C800,0x00000000, 0x5DE9EC03,0x719F2E06, + 0x4074D000,0x00000000, 0x5DF55E77,0xE045CB62, + 0x4074D800,0x00000000, 0x5E019DA3,0x81896117, + 0x4074E000,0x00000000, 0x5E0D0B23,0x222BA489, + 0x4074E800,0x00000000, 0x5E17F13C,0x0584BA1A, + 0x4074F000,0x00000000, 0x5E23BCB3,0x19D66A0E, + 0x4074F800,0x00000000, 0x5E30453F,0x2551E0F6, + 0x40750000,0x00000000, 0x5E3AD354,0xAD6E368F, + 0x40750800,0x00000000, 0x5E461D28,0x3B7EB40A, + 0x40751000,0x00000000, 0x5E523AD5,0xC9DCF903, + 0x40751800,0x00000000, 0x5E5E0E4F,0x70CF14C8, + 0x40752000,0x00000000, 0x5E68C6E2,0xF447B147, + 0x40752800,0x00000000, 0x5E746CD3,0x734B5106, + 0x40753000,0x00000000, 0x5E80D670,0x34C7AE68, + 0x40753800,0x00000000, 0x5E8BC2B6,0x1912BA16, + 0x40754000,0x00000000, 0x5E96E27E,0x391E9C6C, + 0x40754800,0x00000000, 0x5EA2DD82,0xD4DA463E, + 0x40755000,0x00000000, 0x5EAF1A84,0x823DAF20, + 0x40755800,0x00000000, 0x5EB9A3FC,0x6F998B6E, + 0x40756000,0x00000000, 0x5EC52317,0x7BDA38EC, + 0x40756800,0x00000000, 0x5ED16CB0,0xE6A65FE5, + 0x40757000,0x00000000, 0x5EDCBA6F,0xA88F5082, + 0x40757800,0x00000000, 0x5EE7AEB5,0x29E0B800, + 0x40758000,0x00000000, 0x5EF385DB,0x883320EE, + 0x40758800,0x00000000, 0x5F001809,0x7A53FBF1, + 0x40759000,0x00000000, 0x5F0A88CA,0xECC9E7DB, + 0x40759800,0x00000000, 0x5F15DFB5,0xFC9DB9FF, + 0x4075A000,0x00000000, 0x5F22082E,0x64AC4EB5, + 0x4075A800,0x00000000, 0x5F2DBACB,0xD1FBA904, + 0x4075B000,0x00000000, 0x5F38820A,0x6FCEEEED, + 0x4075B800,0x00000000, 0x5F443412,0x7DF079F0, + 0x4075C000,0x00000000, 0x5F50A7A7,0x1AD2DC6D, + 0x4075C800,0x00000000, 0x5F5B7593,0x3234A58E, + 0x4075D000,0x00000000, 0x5F66A2E7,0xA7930F81, + 0x4075D800,0x00000000, 0x5F72A917,0x6B9C6272, + 0x4075E000,0x00000000, 0x5F7EC417,0xA3E63C6A, + 0x4075E800,0x00000000, 0x5F895CBD,0x90B53415, + 0x4075F000,0x00000000, 0x5F94E85C,0x13A81660, + 0x4075F800,0x00000000, 0x5FA13C46,0x4DA4D7A0, + 0x40760000,0x00000000, 0x5FAC6A9C,0x6BEE04C8, + 0x40760800,0x00000000, 0x5FB76CE7,0x28A4B79A, + 0x40761000,0x00000000, 0x5FC34F9C,0x594A7140, + 0x40761800,0x00000000, 0x5FCFD6A2,0xDC7DB8FE, + 0x40762000,0x00000000, 0x5FDA3F10,0x49398066, + 0x40762800,0x00000000, 0x5FE5A2EE,0x7A3A0542, + 0x40763000,0x00000000, 0x5FF1D613,0xBF0A8036, + 0x40763800,0x00000000, 0x5FFD6830,0x4127418E, + 0x40764000,0x00000000, 0x60083DF1,0x374D259D, + 0x40764800,0x00000000, 0x6013FBEF,0x3B24FCBE, + 0x40765000,0x00000000, 0x60207960,0x00C48F27, + 0x40765800,0x00000000, 0x602B2946,0xA09E30A3, + 0x40766000,0x00000000, 0x60366401,0xC61A8A8A, + 0x40766800,0x00000000, 0x6042753D,0xA9E92116, + 0x40767000,0x00000000, 0x604E6E9A,0xEA52153A, + 0x40767800,0x00000000, 0x60591644,0xA8D6D3B2, + 0x40768000,0x00000000, 0x6064AE43,0xDD40AA42, + 0x40768800,0x00000000, 0x60710C62,0x3C9ADE9F, + 0x40769000,0x00000000, 0x607C1BA6,0xFD34B612, + 0x40769800,0x00000000, 0x60872BD0,0x002D64E0, + 0x4076A000,0x00000000, 0x609319F3,0xE5B014A7, + 0x4076A800,0x00000000, 0x609F7E2B,0x4809C6C3, + 0x4076B000,0x00000000, 0x60A9F622,0x833F3047, + 0x4076B800,0x00000000, 0x60B566CF,0xD9E9FC30, + 0x4076C000,0x00000000, 0x60C1A484,0x51E14885, + 0x4076C800,0x00000000, 0x60CD167A,0x3986BF89, + 0x4076D000,0x00000000, 0x60D7FA95,0x37377F3C, + 0x4076D800,0x00000000, 0x60E3C467,0xF4BA1C5E, + 0x4076E000,0x00000000, 0x60F04B99,0x7D645645, + 0x4076E800,0x00000000, 0x60FADDCE,0x10C21481, + 0x4076F000,0x00000000, 0x610625CA,0xA9C1FA57, + 0x4076F800,0x00000000, 0x611241F3,0xFB085438, + 0x40770000,0x00000000, 0x611E1A0B,0xBA3C3728, + 0x40770800,0x00000000, 0x6128D08F,0x91EC4CA1, + 0x40771000,0x00000000, 0x613474CD,0x132F0B40, + 0x40771800,0x00000000, 0x6140DD03,0x3DB8A011, + 0x40772000,0x00000000, 0x614BCD8C,0xF413A3B1, + 0x40772800,0x00000000, 0x6156EB6D,0xB46AA12E, + 0x40773000,0x00000000, 0x6162E4E0,0x8A904D9A, + 0x40773800,0x00000000, 0x616F26A9,0x84C4A9C3, + 0x40774000,0x00000000, 0x6179ADFF,0x619C3B18, + 0x40774800,0x00000000, 0x61852B58,0x466A3C55, + 0x40775000,0x00000000, 0x6191737E,0x9A5911FE, + 0x40775800,0x00000000, 0x619CC5A7,0x3D4EA81B, + 0x40776000,0x00000000, 0x61A7B7F4,0x61C81AEE, + 0x40776800,0x00000000, 0x61B38D7A,0xF942A789, + 0x40777000,0x00000000, 0x61C01E52,0x2B6573E7, + 0x40777800,0x00000000, 0x61CA9327,0x3589DB5E, + 0x40778000,0x00000000, 0x61D5E840,0x6CEA7625, + 0x40778800,0x00000000, 0x61E20F38,0xCEA65E67, + 0x40779000,0x00000000, 0x61EDC667,0x7F9DB7B8, + 0x40779800,0x00000000, 0x61F88B9C,0x2BDBF24A, + 0x4077A000,0x00000000, 0x62043BF5,0xF4EA4CBB, + 0x4077A800,0x00000000, 0x6210AE27,0xDF3CF630, + 0x4077B000,0x00000000, 0x621B804B,0xEEEB8CFA, + 0x4077B800,0x00000000, 0x6226ABBE,0x4ED00596, + 0x4077C000,0x00000000, 0x6232B060,0xA9A32244, + 0x4077C800,0x00000000, 0x623ED01A,0xE7A5A3AF, + 0x4077D000,0x00000000, 0x624966A4,0xB13F9CBC, + 0x4077D800,0x00000000, 0x6254F085,0xEF8F4B92, + 0x4077E000,0x00000000, 0x62614301,0x19CD2ADB, + 0x4077E800,0x00000000, 0x626C75B4,0xD59FB21D, + 0x4077F000,0x00000000, 0x6277760C,0xAEEE052E, + 0x4077F800,0x00000000, 0x62835726,0x9C05C1A3, + 0x40780000,0x00000000, 0x628FE311,0x52B7EF6B, + 0x40780800,0x00000000, 0x629A494F,0xC843EA66, + 0x40781000,0x00000000, 0x62A5AB61,0x2F3A7119, + 0x40781800,0x00000000, 0x62B1DD0A,0x98C7FDF5, + 0x40782000,0x00000000, 0x62BD73AB,0xAD99A482, + 0x40782800,0x00000000, 0x62C84768,0x5C73F22A, + 0x40783000,0x00000000, 0x62D403BC,0xC6C7D1BC, + 0x40783800,0x00000000, 0x62E07FCE,0xB36A2422, + 0x40784000,0x00000000, 0x62EB33E1,0x92BB1ADE, + 0x40784800,0x00000000, 0x62F66CBF,0xDE45903B, + 0x40785000,0x00000000, 0x63027C72,0xA91FBAD6, + 0x40785800,0x00000000, 0x630E7A7C,0xCD0DDBF0, + 0x40786000,0x00000000, 0x63192010,0x4534DE5E, + 0x40786800,0x00000000, 0x6324B657,0x0A37710D, + 0x40787000,0x00000000, 0x6331130A,0x55C01A76, + 0x40787800,0x00000000, 0x633C26A0,0x927389D6, + 0x40788000,0x00000000, 0x634734DC,0x1C3D5C6C, + 0x40788800,0x00000000, 0x63532169,0x34F1D05D, + 0x40789000,0x00000000, 0x635F8A77,0x3363F085, + 0x40789800,0x00000000, 0x636A0045,0x8891BD7C, + 0x4078A000,0x00000000, 0x63756F2B,0x158F14E4, + 0x4078A800,0x00000000, 0x6381AB67,0xD1BE3A25, + 0x4078B000,0x00000000, 0x638D21D5,0xBE691B49, + 0x4078B800,0x00000000, 0x639803F2,0x0F59EAF6, + 0x4078C000,0x00000000, 0x63A3CC1F,0xD1EDC5F0, + 0x4078C800,0x00000000, 0x63B051F6,0x507AAF34, + 0x4078D000,0x00000000, 0x63BAE84B,0x8B0C7D2A, + 0x4078D800,0x00000000, 0x63C62E70,0x77187C44, + 0x4078E000,0x00000000, 0x63D24914,0xF3AFE2F6, + 0x4078E800,0x00000000, 0x63DE25CC,0x98B3C61A, + 0x4078F000,0x00000000, 0x63E8DA3F,0xF6931B1B, + 0x4078F800,0x00000000, 0x63F47CC9,0xD03CB571, + 0x40790000,0x00000000, 0x6400E398,0xD7D01704, + 0x40790800,0x00000000, 0x640BD868,0x0A89CA2B, + 0x40791000,0x00000000, 0x6416F460,0xACDFA1C0, + 0x40791800,0x00000000, 0x6422EC41,0x208F8DA4, + 0x40792000,0x00000000, 0x642F32D3,0x4539D4B2, + 0x40792800,0x00000000, 0x6439B806,0x3C56546A, + 0x40793000,0x00000000, 0x6445339C,0x49EDC516, + 0x40793800,0x00000000, 0x64517A4E,0xF61A71E3, + 0x40794000,0x00000000, 0x645CD0E3,0x3347995C, + 0x40794800,0x00000000, 0x6467C137,0x35FAB153, + 0x40795000,0x00000000, 0x6473951D,0x6445BC31, + 0x40795800,0x00000000, 0x6480249D,0x50965708, + 0x40796000,0x00000000, 0x648A9D87,0x89E33ADB, + 0x40796800,0x00000000, 0x6495F0CE,0x32EC43E9, + 0x40797000,0x00000000, 0x64A21645,0xF863ADE5, + 0x40797800,0x00000000, 0x64ADD207,0xB58EC19A, + 0x40798000,0x00000000, 0x64B89531,0xA46C33ED, + 0x40798800,0x00000000, 0x64C443DC,0x80670A14, + 0x40799000,0x00000000, 0x64D0B4AB,0x2DAB9B53, + 0x40799800,0x00000000, 0x64DB8B08,0xDB552AA9, + 0x4079A000,0x00000000, 0x64E6B498,0x6984352D, + 0x4079A800,0x00000000, 0x64F2B7AC,0xBFF53D7B, + 0x4079B000,0x00000000, 0x64FEDC22,0xDC262BD7, + 0x4079B800,0x00000000, 0x6509708F,0xAFA4D0D6, + 0x4079C000,0x00000000, 0x6514F8B2,0xFB75CAB5, + 0x4079C800,0x00000000, 0x652149BE,0x86A28BA9, + 0x4079D000,0x00000000, 0x652C80D1,0x945F81B6, + 0x4079D800,0x00000000, 0x65377F35,0xC77A41A9, + 0x4079E000,0x00000000, 0x65435EB3,0xD06F7247, + 0x4079E800,0x00000000, 0x654FEF84,0xA38E58E1, + 0x4079F000,0x00000000, 0x655A5393,0x47AA34FD, + 0x4079F800,0x00000000, 0x6565B3D7,0x30ABCC28, + 0x407A0000,0x00000000, 0x6571E404,0x2AA53CFD, + 0x407A0800,0x00000000, 0x657D7F2B,0x95C2F20A, + 0x407A1000,0x00000000, 0x658850E3,0x33BC3230, + 0x407A1800,0x00000000, 0x65940B8D,0x5E5E9699, + 0x407A2000,0x00000000, 0x65A0863F,0xE9061C49, + 0x407A2800,0x00000000, 0x65AB3E80,0xA8E8E1E0, + 0x407A3000,0x00000000, 0x65B67581,0x6050FD04, + 0x407A3800,0x00000000, 0x65C283AA,0x78BA0762, + 0x407A4000,0x00000000, 0x65CE8663,0x5382509D, + 0x407A4800,0x00000000, 0x65D929DF,0xB4AF4491, + 0x407A5000,0x00000000, 0x65E4BE6D,0x5E5227A4, + 0x407A5800,0x00000000, 0x65F119B5,0x08454638, + 0x407A6000,0x00000000, 0x65FC319E,0x70B6D934, + 0x407A6800,0x00000000, 0x66073DEB,0xC0A3DE92, + 0x407A7000,0x00000000, 0x661328E1,0x6DB3B964, + 0x407A7800,0x00000000, 0x661F96C7,0xEBDD8D31, + 0x407A8000,0x00000000, 0x662A0A6C,0x8321DB88, + 0x407A8800,0x00000000, 0x66357789,0x947AB9AF, + 0x407A9000,0x00000000, 0x6641B24E,0x022CA821, + 0x407A9800,0x00000000, 0x664D2D35,0xB28D4F79, + 0x407AA000,0x00000000, 0x66580D52,0x8F58D861, + 0x407AA800,0x00000000, 0x6663D3DA,0xB29E2C9A, + 0x407AB000,0x00000000, 0x66705855,0x9F8CDDBD, + 0x407AB800,0x00000000, 0x667AF2CD,0x1DE63B75, + 0x407AC000,0x00000000, 0x66863719,0xA4D337E8, + 0x407AC800,0x00000000, 0x66925038,0xB4E972E6, + 0x407AD000,0x00000000, 0x669E3192,0x0DFFC6D5, + 0x407AD800,0x00000000, 0x66A8E3F4,0x23B5AFA3, + 0x407AE000,0x00000000, 0x66B484C9,0xABAB9169, + 0x407AE800,0x00000000, 0x66C0EA31,0x040EA9CE, + 0x407AF000,0x00000000, 0x66CBE347,0x5E1C3855, + 0x407AF800,0x00000000, 0x66D6FD57,0x23DA5B6B, + 0x407B0000,0x00000000, 0x66E2F3A4,0x97F7830C, + 0x407B0800,0x00000000, 0x66EF3F01,0xC5772C56, + 0x407B1000,0x00000000, 0x66F9C211,0x014E93A7, + 0x407B1800,0x00000000, 0x67053BE3,0x87A6EE8B, + 0x407B2000,0x00000000, 0x67118121,0xFAF407D4, + 0x407B2800,0x00000000, 0x671CDC23,0x8C2FEE27, + 0x407B3000,0x00000000, 0x6727CA7D,0xA7E1607C, + 0x407B3800,0x00000000, 0x67339CC2,0xCA65E103, + 0x407B4000,0x00000000, 0x67402AEA,0xEADBE65C, + 0x407B4800,0x00000000, 0x674AA7EB,0xEB6A6159, + 0x407B5000,0x00000000, 0x6755F95F,0x4FF07902, + 0x407B5800,0x00000000, 0x67621D55,0xE2F706F3, + 0x407B6000,0x00000000, 0x676DDDAC,0x7593D338, + 0x407B6800,0x00000000, 0x67789ECA,0xDAF52DA2, + 0x407B7000,0x00000000, 0x67844BC6,0x219A92EF, + 0x407B7800,0x00000000, 0x6790BB31,0x071C996E, + 0x407B8000,0x00000000, 0x679B95C9,0xF913F1F2, + 0x407B8800,0x00000000, 0x67A6BD75,0xF908928D, + 0x407B9000,0x00000000, 0x67B2BEFB,0xAFAF11F3, + 0x407B9800,0x00000000, 0x67BEE82F,0x833CAC46, + 0x407BA000,0x00000000, 0x67C97A7E,0x8D674EEE, + 0x407BA800,0x00000000, 0x67D500E3,0x389A3022, + 0x407BB000,0x00000000, 0x67E1507E,0x952BA07A, + 0x407BB800,0x00000000, 0x67EC8BF2,0xA9DE7D02, + 0x407BC000,0x00000000, 0x67F78862,0x73AE678C, + 0x407BC800,0x00000000, 0x68036643,0xF7ADCA9D, + 0x407BD000,0x00000000, 0x680FFBFC,0xD0E62482, + 0x407BD800,0x00000000, 0x681A5DDA,0xC8FC57A6, + 0x407BE000,0x00000000, 0x6825BC50,0x7FD7CDEF, + 0x407BE800,0x00000000, 0x6831EB00,0x75B20B87, + 0x407BF000,0x00000000, 0x683D8AAF,0xFB634BD5, + 0x407BF800,0x00000000, 0x68485A61,0xBE9751BD, + 0x407C0000,0x00000000, 0x68541361,0x0319D4CC, + 0x407C0800,0x00000000, 0x68608CB3,0xA29383FA, + 0x407C1000,0x00000000, 0x686B4923,0xE4C56E4A, + 0x407C1800,0x00000000, 0x68767E46,0x4D9206AA, + 0x407C2000,0x00000000, 0x68828AE5,0x19D14E71, + 0x407C2800,0x00000000, 0x688E924E,0x7F7F33E7, + 0x407C3000,0x00000000, 0x689933B2,0xF8C452EC, + 0x407C3800,0x00000000, 0x68A4C686,0xDACBF512, + 0x407C4000,0x00000000, 0x68B12062,0x552E2E87, + 0x407C4800,0x00000000, 0x68BC3CA0,0x99AAFA5B, + 0x407C5000,0x00000000, 0x68C746FE,0xEEC205E9, + 0x407C5800,0x00000000, 0x68D3305C,0x9118E579, + 0x407C6000,0x00000000, 0x68DFA31D,0x735687C6, + 0x407C6800,0x00000000, 0x68EA1497,0x747B2A87, + 0x407C7000,0x00000000, 0x68F57FEB,0x57F30DEA, + 0x407C7800,0x00000000, 0x6901B936,0xE4396D73, + 0x407C8000,0x00000000, 0x690D389A,0x17AEA099, + 0x407C8800,0x00000000, 0x691816B6,0xB8A1B10D, + 0x407C9000,0x00000000, 0x6923DB98,0x97F88BA3, + 0x407C9800,0x00000000, 0x69305EB7,0x6B9334AD, + 0x407CA000,0x00000000, 0x693AFD52,0xCAE8B9E7, + 0x407CA800,0x00000000, 0x69463FC6,0x3443AEEF, + 0x407CB000,0x00000000, 0x6952575F,0x3FCB3E2D, + 0x407CB800,0x00000000, 0x695E3D5C,0x1BEAF167, + 0x407CC000,0x00000000, 0x6968EDAC,0x1ACE3095, + 0x407CC800,0x00000000, 0x69748CCC,0xA6B35A83, + 0x407CD000,0x00000000, 0x6980F0CB,0xC375532D, + 0x407CD800,0x00000000, 0x698BEE2A,0xF0729E31, + 0x407CE000,0x00000000, 0x69970651,0x1AB813A2, + 0x407CE800,0x00000000, 0x69A2FB0A,0xF1E81ABF, + 0x407CF000,0x00000000, 0x69AF4B35,0x0757662A, + 0x407CF800,0x00000000, 0x69B9CC1F,0xB20C4DA0, + 0x407D0000,0x00000000, 0x69C5442E,0x00D851D5, + 0x407D0800,0x00000000, 0x69D187F7,0xA9EFC3BE, + 0x407D1000,0x00000000, 0x69DCE768,0x49BE1B4F, + 0x407D1800,0x00000000, 0x69E7D3C7,0xB8E59AA0, + 0x407D2000,0x00000000, 0x69F3A46B,0x2CCD0C40, + 0x407D2800,0x00000000, 0x6A00313A,0xFB2BC2B2, + 0x407D3000,0x00000000, 0x6A0AB254,0x5BB447C1, + 0x407D3800,0x00000000, 0x6A1601F3,0xC544ED4F, + 0x407D4000,0x00000000, 0x6A222468,0x8F739E9B, + 0x407D4800,0x00000000, 0x6A2DE955,0xC172AA02, + 0x407D5000,0x00000000, 0x6A38A867,0xD0ECEB08, + 0x407D5800,0x00000000, 0x6A4453B2,0xD9B94076, + 0x407D6000,0x00000000, 0x6A50C1B9,0x6C8E2131, + 0x407D6800,0x00000000, 0x6A5BA08F,0x49CAF990, + 0x407D7000,0x00000000, 0x6A66C656,0xFEB698A8, + 0x407D7800,0x00000000, 0x6A72C64D,0x79ED6C91, + 0x407D8000,0x00000000, 0x6A7EF440,0xDEBEB36B, + 0x407D8800,0x00000000, 0x6A898471,0x4C0A2C79, + 0x407D9000,0x00000000, 0x6A950916,0xA83B9497, + 0x407D9800,0x00000000, 0x6AA15741,0x466F7649, + 0x407DA000,0x00000000, 0x6AAC9718,0x17CE5687, + 0x407DA800,0x00000000, 0x6AB79192,0xB4EFFCBC, + 0x407DB000,0x00000000, 0x6AC36DD7,0x12E784FD, + 0x407DB800,0x00000000, 0x6AD0043C,0xEE529F72, + 0x407DC000,0x00000000, 0x6ADA6826,0x4DCAE606, + 0x407DC800,0x00000000, 0x6AE5C4CD,0x1E08AEAC, + 0x407DD000,0x00000000, 0x6AF1F1FF,0x7AFEA1EC, + 0x407DD800,0x00000000, 0x6AFD9638,0xE03B828E, + 0x407DE000,0x00000000, 0x6B0863E3,0xFE774D18, + 0x407DE800,0x00000000, 0x6B141B37,0xB62A8CB7, + 0x407DF000,0x00000000, 0x6B209329,0xE10DC999, + 0x407DF800,0x00000000, 0x6B2B53CB,0x47EF4A57, + 0x407E0000,0x00000000, 0x6B36870E,0xA75E682D, + 0x407E0800,0x00000000, 0x6B429222,0x8D7F458D, + 0x407E1000,0x00000000, 0x6B4E9E3E,0x52D4FB85, + 0x407E1800,0x00000000, 0x6B593D8A,0x12F2EB54, + 0x407E2000,0x00000000, 0x6B64CEA3,0x80E07B71, + 0x407E2800,0x00000000, 0x6B712712,0x3D7F0572, + 0x407E3000,0x00000000, 0x6B7C47A7,0x0EFCEABA, + 0x407E3800,0x00000000, 0x6B875015,0xA7F976E9, + 0x407E4000,0x00000000, 0x6B9337DA,0xA044DC04, + 0x407E4800,0x00000000, 0x6B9FAF77,0xCBAF86A5, + 0x407E5000,0x00000000, 0x6BAA1EC6,0x5E29E512, + 0x407E5800,0x00000000, 0x6BB58850,0x613EB443, + 0x407E6000,0x00000000, 0x6BC1C022,0x78F1CE0F, + 0x407E6800,0x00000000, 0x6BCD4402,0xEF89003C, + 0x407E7000,0x00000000, 0x6BD8201E,0x8CA26D36, + 0x407E7800,0x00000000, 0x6BE3E359,0x832A93EF, + 0x407E8000,0x00000000, 0x6BF0651B,0xB58667C7, + 0x407E8800,0x00000000, 0x6BFB07DC,0x93AE02E5, + 0x407E9000,0x00000000, 0x6C064876,0x26BBE6CD, + 0x407E9800,0x00000000, 0x6C125E88,0x956BEB90, + 0x407EA000,0x00000000, 0x6C1E492A,0xC440B0F6, + 0x407EA800,0x00000000, 0x6C28F767,0xDD5757F4, + 0x407EB000,0x00000000, 0x6C3494D2,0xC28C45D0, + 0x407EB800,0x00000000, 0x6C40F769,0x17057235, + 0x407EC000,0x00000000, 0x6C4BF912,0xC335512C, + 0x407EC800,0x00000000, 0x6C570F4E,0x92D69839, + 0x407ED000,0x00000000, 0x6C630274,0x2F81B217, + 0x407ED800,0x00000000, 0x6C6F576D,0x0CB5F103, + 0x407EE000,0x00000000, 0x6C79D632,0x50176FF6, + 0x407EE800,0x00000000, 0x6C854C7B,0xB6C5060A, + 0x407EF000,0x00000000, 0x6C918ED0,0x0417FD64, + 0x407EF800,0x00000000, 0x6C9CF2B1,0x6DA940DA, + 0x407F0000,0x00000000, 0x6CA7DD15,0x6A715F16, + 0x407F0800,0x00000000, 0x6CB3AC16,0x8CA5A886, + 0x407F1000,0x00000000, 0x6CC0378D,0x827BECBD, + 0x407F1800,0x00000000, 0x6CCABCC0,0xDC56851E, + 0x407F2000,0x00000000, 0x6CD60A8B,0x9437FB07, + 0x407F2800,0x00000000, 0x6CE22B7D,0xFEED1560, + 0x407F3000,0x00000000, 0x6CEDF503,0x9AF1B491, + 0x407F3800,0x00000000, 0x6CF8B208,0x87CA09CA, + 0x407F4000,0x00000000, 0x6D045BA2,0xA9F7E439, + 0x407F4800,0x00000000, 0x6D10C844,0x5EFEC68E, + 0x407F5000,0x00000000, 0x6D1BAB58,0xCF1DFBE2, + 0x407F5800,0x00000000, 0x6D26CF3B,0x7BE8495B, + 0x407F6000,0x00000000, 0x6D32CDA2,0x1FCD896D, + 0x407F6800,0x00000000, 0x6D3F0056,0xF082870F, + 0x407F7000,0x00000000, 0x6D498E67,0xED111611, + 0x407F7800,0x00000000, 0x6D55114D,0x4B998D6B, + 0x407F8000,0x00000000, 0x6D615E06,0x9B7580CA, + 0x407F8800,0x00000000, 0x6D6CA241,0xDFE16A1F, + 0x407F9000,0x00000000, 0x6D779AC6,0x8CA512B5, + 0x407F9800,0x00000000, 0x6D83756D,0x2343CED1, + 0x407FA000,0x00000000, 0x6D900A7D,0xE459292B, + 0x407FA800,0x00000000, 0x6D9A7275,0xD7A7102B, + 0x407FB000,0x00000000, 0x6DA5CD4D,0x0C89278C, + 0x407FB800,0x00000000, 0x6DB1F901,0x3B9BA2D2, + 0x407FC000,0x00000000, 0x6DBDA1C6,0x460D161E, + 0x407FC800,0x00000000, 0x6DC86D69,0xF4CEB104, + 0x407FD000,0x00000000, 0x6DD42311,0x78C235D2, + 0x407FD800,0x00000000, 0x6DE099A2,0xA570BDB7, + 0x407FE000,0x00000000, 0x6DEB5E76,0xD405A221, + 0x407FE800,0x00000000, 0x6DF68FDA,0x6F0C61F9, + 0x407FF000,0x00000000, 0x6E029962,0xD4DE103D, + 0x407FF800,0x00000000, 0x6E0EAA32,0xCF54D288, + 0x40800000,0x00000000, 0x6E194765,0x04BA852E, + 0x40800400,0x00000000, 0x6E24D6C3,0x51CBD815, + 0x40800800,0x00000000, 0x6E312DC4,0xC23C62A5, + 0x40800C00,0x00000000, 0x6E3C52B1,0xD25A4F42, + 0x40801000,0x00000000, 0x6E47592F,0xEDAC601F, + 0x40801400,0x00000000, 0x6E533F5B,0x9C5B963F, + 0x40801800,0x00000000, 0x6E5FBBD6,0xF6C9EBDB, + 0x40801C00,0x00000000, 0x6E6A28F9,0x41BAE076, + 0x40802000,0x00000000, 0x6E7590B8,0xB1A4CEF4, + 0x40802400,0x00000000, 0x6E81C710,0xC163770A, + 0x40802800,0x00000000, 0x6E8D4F70,0x3BD90D4D, + 0x40802C00,0x00000000, 0x6E98298A,0x0CC993FD, + 0x40803000,0x00000000, 0x6EA3EB1D,0x75626C30, + 0x40803400,0x00000000, 0x6EB06B82,0x7E5F8BE7, + 0x40803800,0x00000000, 0x6EBB126A,0x79D0C0EA, + 0x40803C00,0x00000000, 0x6EC65129,0x7D8E68F2, + 0x40804000,0x00000000, 0x6ED265B4,0xB6E28EA1, + 0x40804400,0x00000000, 0x6EDE54FE,0x08CD240F, + 0x40804800,0x00000000, 0x6EE90127,0x6CCC73A1, + 0x40804C00,0x00000000, 0x6EF49CDC,0x006F0249, + 0x40805000,0x00000000, 0x6F00FE08,0xFFC0CA7A, + 0x40805400,0x00000000, 0x6F0C03FE,0xD80D4C64, + 0x40805800,0x00000000, 0x6F17184F,0x8D943F98, + 0x40805C00,0x00000000, 0x6F2309E0,0x51E51706, + 0x40806000,0x00000000, 0x6F2F63A9,0xD76EF559, + 0x40806400,0x00000000, 0x6F39E048,0xDCF8814D, + 0x40806800,0x00000000, 0x6F4554CC,0xAAB0A066, + 0x40806C00,0x00000000, 0x6F5195AB,0x0A777488, + 0x40807000,0x00000000, 0x6F5CFDFE,0xF9A92A43, + 0x40807400,0x00000000, 0x6F67E666,0xBDEF3A8F, + 0x40807800,0x00000000, 0x6F73B3C4,0xEB1A94F3, + 0x40807C00,0x00000000, 0x6F803DE2,0x81C2C541, + 0x40808000,0x00000000, 0x6F8AC731,0x6EE74ED5, + 0x40808400,0x00000000, 0x6F961326,0xBE187EEF, + 0x40808800,0x00000000, 0x6FA23296,0x32777761, + 0x40808C00,0x00000000, 0x6FAE00B6,0x03D812F2, + 0x40809000,0x00000000, 0x6FB8BBAD,0x0103B9D8, + 0x40809400,0x00000000, 0x6FC46395,0x938BC85A, + 0x40809800,0x00000000, 0x6FD0CED1,0xDF6D80DD, + 0x40809C00,0x00000000, 0x6FDBB626,0x8AB15726, + 0x4080A000,0x00000000, 0x6FE6D823,0x71F82D97, + 0x4080A400,0x00000000, 0x6FF2D4F9,0xA26D13FE, + 0x4080A800,0x00000000, 0x6FFF0C71,0xBA5F2499, + 0x4080AC00,0x00000000, 0x70099862,0x72004FAD, + 0x4080B000,0x00000000, 0x70151987,0x23F42CBE, + 0x4080B400,0x00000000, 0x702164CE,0x95459A8C, + 0x4080B800,0x00000000, 0x702CAD70,0x03CABD3E, + 0x4080BC00,0x00000000, 0x7037A3FD,0xFC3446C2, + 0x4080C000,0x00000000, 0x70437D06,0x29EA48C6, + 0x4080C400,0x00000000, 0x705010C1,0x4B7A6398, + 0x4080C800,0x00000000, 0x705A7CC9,0x6822A2C7, + 0x4080CC00,0x00000000, 0x7065D5D0,0x4CA472DF, + 0x4080D000,0x00000000, 0x70720005,0xB89A1B4E, + 0x4080D400,0x00000000, 0x707DAD58,0x2E9A35EF, + 0x4080D800,0x00000000, 0x708876F3,0xA3109AEE, + 0x4080DC00,0x00000000, 0x70942AEE,0x4C12BEDA, + 0x4080E000,0x00000000, 0x70A0A01D,0xF0B89337, + 0x4080E400,0x00000000, 0x70AB6926,0x8AA843DD, + 0x4080E800,0x00000000, 0x70B698A9,0xA5F2BA1D, + 0x4080EC00,0x00000000, 0x70C2A0A5,0xF1084035, + 0x4080F000,0x00000000, 0x70CEB62B,0xF6D099A4, + 0x4080F400,0x00000000, 0x70D95143,0xCF9B2D9B, + 0x4080F800,0x00000000, 0x70E4DEE6,0x4ECAA3C2, + 0x4080FC00,0x00000000, 0x70F13479,0xE46B4387, + 0x40810000,0x00000000, 0x70FC5DC0,0xE57174A2, + 0x40810400,0x00000000, 0x7107624D,0xC13D7A61, + 0x40810800,0x00000000, 0x711346DF,0x86817F67, + 0x40810C00,0x00000000, 0x711FC83A,0xF687D56B, + 0x40811000,0x00000000, 0x712A3330,0x20BB8CF2, + 0x40811400,0x00000000, 0x71359924,0x4A6CFFEF, + 0x40811800,0x00000000, 0x7141CE01,0xBE9C7EC8, + 0x40811C00,0x00000000, 0x714D5AE1,0xFE5C1450, + 0x40812000,0x00000000, 0x715832F9,0x3A863BA1, + 0x40812400,0x00000000, 0x7163F2E4,0x6FCEB111, + 0x40812800,0x00000000, 0x717071EB,0xC718172C, + 0x40812C00,0x00000000, 0x717B1CFC,0x7EEC3ECE, + 0x40813000,0x00000000, 0x718659E0,0x3A0E42FE, + 0x40813400,0x00000000, 0x71926CE3,0xA546A7ED, + 0x40813800,0x00000000, 0x719E60D5,0xEB5D1CE2, + 0x40813C00,0x00000000, 0x71A90AEA,0xCAA96599, + 0x40814000,0x00000000, 0x71B4A4E8,0x6194B8FD, + 0x40814400,0x00000000, 0x71C104AB,0x7EA98433, + 0x40814800,0x00000000, 0x71CC0EEF,0x30A430E4, + 0x40814C00,0x00000000, 0x71D72154,0x0C4FE8F3, + 0x40815000,0x00000000, 0x71E3114F,0x5A338843, + 0x40815400,0x00000000, 0x71EF6FEB,0x695F5590, + 0x40815800,0x00000000, 0x71F9EA63,0x5A38A191, + 0x40815C00,0x00000000, 0x72055D20,0xDDDF347F, + 0x40816000,0x00000000, 0x72119C88,0xBE195116, + 0x40816400,0x00000000, 0x721D0950,0xEF764EBD, + 0x40816800,0x00000000, 0x7227EFBB,0xB4CA4749, + 0x40816C00,0x00000000, 0x7233BB76,0x4957255B, + 0x40817000,0x00000000, 0x72404439,0xF9F70D32, + 0x40817400,0x00000000, 0x724AD1A6,0x14FD78EA, + 0x40817800,0x00000000, 0x72561BC5,0x4435D88C, + 0x40817C00,0x00000000, 0x726239B1,0x2B273C87, + 0x40818000,0x00000000, 0x726E0C6C,0xFDED96E2, + 0x40818400,0x00000000, 0x7278C555,0x3E11BDA3, + 0x40818800,0x00000000, 0x72846B8B,0x97AAAFC3, + 0x40818C00,0x00000000, 0x7290D561,0xEED9AB01, + 0x40819000,0x00000000, 0x729BC0F8,0x7E2A0DC0, + 0x40819400,0x00000000, 0x72A6E10E,0xE24155A0, + 0x40819800,0x00000000, 0x72B2DC54,0x02EA2744, + 0x40819C00,0x00000000, 0x72BF1891,0x3E2C4157, + 0x4081A000,0x00000000, 0x72C9A260,0xDC5CB4DD, + 0x4081A400,0x00000000, 0x72D521C4,0x328C01A7, + 0x4081A800,0x00000000, 0x72E16B99,0x34E80525, + 0x4081AC00,0x00000000, 0x72ECB8A2,0x853DFF35, + 0x4081B000,0x00000000, 0x72F7AD39,0x0504C236, + 0x4081B400,0x00000000, 0x730384A2,0x280306F7, + 0x4081B800,0x00000000, 0x73101707,0x24AA620B, + 0x4081BC00,0x00000000, 0x731A8721,0x00D00771, + 0x4081C000,0x00000000, 0x7325DE56,0xDFA64C4A, + 0x4081C400,0x00000000, 0x7332070C,0xF30B8316, + 0x4081C800,0x00000000, 0x733DB8EE,0x9BA5C134, + 0x4081CC00,0x00000000, 0x73488081,0x0AB0B92E, + 0x4081D000,0x00000000, 0x735432CE,0x314E8E01, + 0x4081D400,0x00000000, 0x7360A69B,0xC3E1DF74, + 0x4081D800,0x00000000, 0x736B73DA,0x6D77A018, + 0x4081DC00,0x00000000, 0x7376A17C,0x4D68BC80, + 0x4081E000,0x00000000, 0x7382A7EB,0xE318D57A, + 0x4081E400,0x00000000, 0x738EC229,0xCB1AE773, + 0x4081E800,0x00000000, 0x73995B26,0x751587AC, + 0x4081EC00,0x00000000, 0x73A4E70C,0x7919F2DB, + 0x4081F000,0x00000000, 0x73B13B31,0xA5110B69, + 0x4081F400,0x00000000, 0x73BC68D4,0x49F14F90, + 0x4081F800,0x00000000, 0x73C76B6F,0x24100909, + 0x4081FC00,0x00000000, 0x73D34E66,0x5FDB74E5, + 0x40820000,0x00000000, 0x73DFD4A3,0xCCCC1D98, + 0x40820400,0x00000000, 0x73EA3D6A,0xFCB9F5F4, + 0x40820800,0x00000000, 0x73F5A193,0x2CDF6917, + 0x40820C00,0x00000000, 0x7401D4F5,0x71AB6520, + 0x40821000,0x00000000, 0x740D6658,0x38D00FAB, + 0x40821400,0x00000000, 0x74183C6C,0x174809B6, + 0x40821800,0x00000000, 0x7423FAAE,0x739E7564, + 0x40821C00,0x00000000, 0x74307857,0x90A9E11D, + 0x40822000,0x00000000, 0x743B2792,0xA49C67FC, + 0x40822400,0x00000000, 0x7446629A,0x5D8F06F0, + 0x40822800,0x00000000, 0x74527415,0x61B0251F, + 0x40822C00,0x00000000, 0x745E6CB2,0x6DBE2191, + 0x40823000,0x00000000, 0x746914B1,0xF86AA42E, + 0x40823400,0x00000000, 0x7474ACF7,0xE7370D42, + 0x40823800,0x00000000, 0x74810B50,0x94C22C64, + 0x40823C00,0x00000000, 0x748C19E3,0xCEA445EB, + 0x40824000,0x00000000, 0x74972A5C,0x1068FC7E, + 0x40824400,0x00000000, 0x74A318C1,0x498EB572, + 0x40824800,0x00000000, 0x74AF7C31,0xC464AE3D, + 0x40824C00,0x00000000, 0x74B9F481,0xC9618A2A, + 0x40825000,0x00000000, 0x74C56578,0x51955475, + 0x40825400,0x00000000, 0x74D1A369,0x20092344, + 0x40825800,0x00000000, 0x74DD14A7,0x50C9D177, + 0x40825C00,0x00000000, 0x74E7F914,0x506E2D4B, + 0x40826000,0x00000000, 0x74F3C32A,0xA887226F, + 0x40826400,0x00000000, 0x75004A93,0xEC0FE5E0, + 0x40826800,0x00000000, 0x750ADC1E,0xD0307635, + 0x40826C00,0x00000000, 0x75162467,0x27DFEA55, + 0x40827000,0x00000000, 0x752240CE,0xEA1148AE, + 0x40827400,0x00000000, 0x752E1828,0x8AFAC41B, + 0x40827800,0x00000000, 0x7538CF01,0x406C6A50, + 0x40827C00,0x00000000, 0x75447384,0xB78AD64D, + 0x40828000,0x00000000, 0x7550DBF4,0x8E430396, + 0x40828400,0x00000000, 0x755BCBCE,0xAB2DC675, + 0x40828800,0x00000000, 0x7566E9FD,0xCE1F593A, + 0x40828C00,0x00000000, 0x7572E3B1,0x42634DFA, + 0x40829000,0x00000000, 0x757F24B5,0x7DC24AC4, + 0x40829400,0x00000000, 0x7589AC63,0x2DABB909, + 0x40829800,0x00000000, 0x75952A04,0x78A2186A, + 0x40829C00,0x00000000, 0x75A17266,0x7B65695A, + 0x4082A000,0x00000000, 0x75ACC3D9,0x65EF8971, + 0x4082A400,0x00000000, 0x75B7B677,0xA87E3AA0, + 0x4082A800,0x00000000, 0x75C38C41,0x1EB69117, + 0x4082AC00,0x00000000, 0x75D01D4F,0x70DD9723, + 0x4082B000,0x00000000, 0x75DA917C,0xA34244DC, + 0x4082B400,0x00000000, 0x75E5E6E0,0xC6DAF0F6, + 0x4082B800,0x00000000, 0x75F20E16,0xEC01BCA6, + 0x4082BC00,0x00000000, 0x75FDC489,0x8EF34728, + 0x4082C000,0x00000000, 0x76088A12,0x2D234B39, + 0x4082C400,0x00000000, 0x76143AB1,0x29A8811A, + 0x4082C800,0x00000000, 0x7620AD1C,0x1FE99A69, + 0x4082CC00,0x00000000, 0x762B7E92,0x7E14C9FD, + 0x4082D000,0x00000000, 0x7636AA52,0x66C63B13, + 0x4082D400,0x00000000, 0x7642AF34,0xAC2B3E94, + 0x4082D800,0x00000000, 0x764ECE2C,0x4E0708BD, + 0x4082DC00,0x00000000, 0x7659650C,0xF6AACCA5, + 0x4082E000,0x00000000, 0x7664EF35,0xD1F7558F, + 0x4082E400,0x00000000, 0x767141EC,0x053383AD, + 0x4082E800,0x00000000, 0x767C73EC,0x01897D05, + 0x4082EC00,0x00000000, 0x76877494,0x1787DA24, + 0x4082F000,0x00000000, 0x769355F0,0x298EC67C, + 0x4082F400,0x00000000, 0x769FE111,0x7B7A5B2A, + 0x4082F800,0x00000000, 0x76AA47A9,0xD744C255, + 0x4082FC00,0x00000000, 0x76B5AA05,0x5A44AC6A, + 0x40830000,0x00000000, 0x76C1DBEB,0xDB9F1388, + 0x40830400,0x00000000, 0x76CD71D2,0xECF3A7E2, + 0x40830800,0x00000000, 0x76D845E2,0xA47F335B, + 0x40830C00,0x00000000, 0x76E4027B,0x82014252, + 0x40831000,0x00000000, 0x76F07EC5,0xDC0F22CC, + 0x40831400,0x00000000, 0x76FB322C,0xEC7DC8B9, + 0x40831800,0x00000000, 0x77066B57,0xE964CB61, + 0x40831C00,0x00000000, 0x77127B49,0xED376130, + 0x40832000,0x00000000, 0x771E7893,0x91BE6C6F, + 0x40832400,0x00000000, 0x77291E7C,0xF78D3A3B, + 0x40832800,0x00000000, 0x7734B50A,0x92901CE5, + 0x40832C00,0x00000000, 0x774111F8,0x430DB506, + 0x40833000,0x00000000, 0x774C24DC,0xB3B87927, + 0x40833400,0x00000000, 0x77573367,0x9B3F6BA0, + 0x40833800,0x00000000, 0x77632036,0x2118BF56, + 0x40833C00,0x00000000, 0x776F887C,0xEA5D5675, + 0x40834000,0x00000000, 0x7779FEA4,0x2BFD8E3D, + 0x40834400,0x00000000, 0x77856DD3,0x07181121, + 0x40834800,0x00000000, 0x7791AA4C,0x3152E3C8, + 0x40834C00,0x00000000, 0x779D2002,0x1F5D81DE, + 0x40835000,0x00000000, 0x77A80270,0x92472297, + 0x40835400,0x00000000, 0x77B3CAE2,0x09D6C9EF, + 0x40835800,0x00000000, 0x77C050F0,0x5904D117, + 0x40835C00,0x00000000, 0x77CAE69B,0xA21858AB, + 0x40836000,0x00000000, 0x77D62D0C,0x6A6719E7, + 0x40836400,0x00000000, 0x77E247EF,0x704AEBCE, + 0x40836800,0x00000000, 0x77EE23E8,0xACC8D097, + 0x40836C00,0x00000000, 0x77F8D8B1,0x098CA7F7, + 0x40837000,0x00000000, 0x78047B80,0xF462F0F4, + 0x40837400,0x00000000, 0x7810E289,0xBEA9AD0F, + 0x40837800,0x00000000, 0x781BD6A9,0x1362CCAD, + 0x40837C00,0x00000000, 0x7826F2F0,0x36EE57E4, + 0x40838000,0x00000000, 0x7832EB11,0x61F782B7, + 0x40838400,0x00000000, 0x783F30DE,0x7AFA66D3, + 0x40838800,0x00000000, 0x7849B669,0x677367A7, + 0x40838C00,0x00000000, 0x78553247,0xF777FAA3, + 0x40839000,0x00000000, 0x78617936,0x69C6D744, + 0x40839400,0x00000000, 0x786CCF14,0xA7945FBE, + 0x40839800,0x00000000, 0x7877BFB9,0xE808F200, + 0x40839C00,0x00000000, 0x788393E3,0x0F2DE2A5, + 0x4083A000,0x00000000, 0x7890239A,0x3108D4F3, + 0x4083A400,0x00000000, 0x789A9BDC,0x510CFF1B, + 0x4083A800,0x00000000, 0x78A5EF6E,0x038F1FC9, + 0x4083AC00,0x00000000, 0x78B21523,0xA48F156A, + 0x4083B000,0x00000000, 0x78BDD029,0x0A47075C, + 0x4083B400,0x00000000, 0x78C893A7,0x0BDD21E0, + 0x4083B800,0x00000000, 0x78D44297,0x3653EDCD, + 0x4083BC00,0x00000000, 0x78E0B39F,0x05CD1ED9, + 0x4083C000,0x00000000, 0x78EB894E,0xBE21778C, + 0x4083C400,0x00000000, 0x78F6B32B,0xF3638E04, + 0x4083C800,0x00000000, 0x7902B680,0x4D5B58B3, + 0x4083CC00,0x00000000, 0x790EDA33,0x816900C0, + 0x4083D000,0x00000000, 0x79196EF7,0x55DCCC33, + 0x4083D400,0x00000000, 0x7924F762,0x5AA0D80D, + 0x4083D800,0x00000000, 0x793148A9,0x05D8DBEA, + 0x4083DC00,0x00000000, 0x793C7F08,0x0DEA4282, + 0x4083E000,0x00000000, 0x79477DBC,0x9D0946AF, + 0x4083E400,0x00000000, 0x79535D7C,0xE4C13674, + 0x4083E800,0x00000000, 0x795FED84,0x0476E1BE, + 0x4083EC00,0x00000000, 0x796A51EC,0xB1EB3496, + 0x4083F000,0x00000000, 0x7975B27A,0xD3E5EC3A, + 0x4083F400,0x00000000, 0x7981E2E4,0xFD86DD3C, + 0x4083F800,0x00000000, 0x798D7D52,0x1C8633E3, + 0x4083FC00,0x00000000, 0x79984F5C,0xE39C7D74, + 0x40840000,0x00000000, 0x79A40A4B,0x9C27178A, + 0x40840400,0x00000000, 0x79B08536,0xAA427701, + 0x40840800,0x00000000, 0x79BB3CCB,0x582D8E5D, + 0x40840C00,0x00000000, 0x79C67418,0xDEE42BB3, + 0x40841000,0x00000000, 0x79D28281,0x48F52492, + 0x40841400,0x00000000, 0x79DE8479,0x592CEC4E, + 0x40841800,0x00000000, 0x79E9284B,0xC98EC768, + 0x40841C00,0x00000000, 0x79F4BD20,0x64DA8058, + 0x40842000,0x00000000, 0x7A0118A2,0x8A8F752B, + 0x40842400,0x00000000, 0x7A0C2FD9,0xE18C5EF9, + 0x40842800,0x00000000, 0x7A173C76,0xAE33B12E, + 0x40842C00,0x00000000, 0x7A2327AD,0xE1F437F9, + 0x40843000,0x00000000, 0x7A2F94CC,0xDD28600F, + 0x40843400,0x00000000, 0x7A3A08CA,0x83979AE6, + 0x40843800,0x00000000, 0x7A457630,0xFFACFA49, + 0x40843C00,0x00000000, 0x7A51B131,0xF302F3F3, + 0x40844000,0x00000000, 0x7A5D2B61,0x5CEBDBE2, + 0x40844400,0x00000000, 0x7A680BD0,0x7BC1EB66, + 0x40844800,0x00000000, 0x7A73D29C,0x6E72CED5, + 0x40844C00,0x00000000, 0x7A80574F,0x41CDB148, + 0x40845000,0x00000000, 0x7A8AF11C,0x8C4DD193, + 0x40845400,0x00000000, 0x7A9635B5,0x0D1C5038, + 0x40845800,0x00000000, 0x7AA24F12,0xBEE9E227, + 0x40845C00,0x00000000, 0x7AAE2FAD,0x6521A4D3, + 0x40846000,0x00000000, 0x7AB8E264,0x9AEBF1DA, + 0x40846400,0x00000000, 0x7AC48380,0x4F6A2E06, + 0x40846800,0x00000000, 0x7AD0E921,0x810E2DE5, + 0x40846C00,0x00000000, 0x7ADBE187,0xB87010B4, + 0x40847000,0x00000000, 0x7AE6FBE6,0x1E0AF908, + 0x40847400,0x00000000, 0x7AF2F274,0x62C63023, + 0x40847800,0x00000000, 0x7AFF3D0C,0x37AE7434, + 0x40847C00,0x00000000, 0x7B09C073,0x8B3A6478, + 0x40848000,0x00000000, 0x7B153A8E,0xB04FAF7C, + 0x40848400,0x00000000, 0x7B218009,0x0115C67D, + 0x40848800,0x00000000, 0x7B2CDA54,0x4BE2308C, + 0x40848C00,0x00000000, 0x7B37C8FF,0xC50DB704, + 0x40849000,0x00000000, 0x7B439B87,0xFA926B13, + 0x40849400,0x00000000, 0x7B5029E7,0x66214D24, + 0x40849800,0x00000000, 0x7B5AA640,0x0BC477DC, + 0x40849C00,0x00000000, 0x7B65F7FE,0x97101993, + 0x4084A000,0x00000000, 0x7B721C33,0x1DC645E8, + 0x4084A400,0x00000000, 0x7B7DDBCD,0x0F65F1F0, + 0x4084A800,0x00000000, 0x7B889D3F,0xA8539F82, + 0x4084AC00,0x00000000, 0x7B944A80,0x5884A1BD, + 0x4084B000,0x00000000, 0x7BA0BA24,0x768A2A6F, + 0x4084B400,0x00000000, 0x7BAB940F,0x2F4001E1, + 0x4084B800,0x00000000, 0x7BB6BC08,0xF49993F9, + 0x4084BC00,0x00000000, 0x7BC2BDCE,0xC7C56FDF, + 0x4084C000,0x00000000, 0x7BCEE63F,0x67158979, + 0x4084C400,0x00000000, 0x7BD978E5,0x942DECA5, + 0x4084C800,0x00000000, 0x7BE4FF92,0x145502B2, + 0x4084CC00,0x00000000, 0x7BF14F68,0xA807AA17, + 0x4084D000,0x00000000, 0x7BFC8A28,0x70C48E4E, + 0x4084D400,0x00000000, 0x7C0786E8,0xB5F932C9, + 0x4084D800,0x00000000, 0x7C13650C,0x9298F9CA, + 0x4084DC00,0x00000000, 0x7C1FF9FB,0x69A6C20B, + 0x4084E000,0x00000000, 0x7C2A5C33,0x8E3D2B1E, + 0x4084E400,0x00000000, 0x7C35BAF3,0x9B0CCB5A, + 0x4084E800,0x00000000, 0x7C41E9E0,0xD8727F6B, + 0x4084EC00,0x00000000, 0x7C4D88D5,0xC947B945, + 0x4084F000,0x00000000, 0x7C5858DA,0xD6113CE5, + 0x4084F400,0x00000000, 0x7C64121E,0xC3406B6B, + 0x4084F800,0x00000000, 0x7C708BA9,0xFC3EDA5B, + 0x4084FC00,0x00000000, 0x7C7B476D,0xE9498794, + 0x40850000,0x00000000, 0x7C867CDD,0x3F624846, + 0x40850400,0x00000000, 0x7C9289BB,0x7602A557, + 0x40850800,0x00000000, 0x7C9E9063,0xC5D944BE, + 0x40850C00,0x00000000, 0x7CA9321E,0x6FED805D, + 0x40851000,0x00000000, 0x7CB4C539,0x5F514AE2, + 0x40851400,0x00000000, 0x7CC11F4F,0x6C4B292A, + 0x40851800,0x00000000, 0x7CCC3ADB,0x59CC32B6, + 0x40851C00,0x00000000, 0x7CD74589,0x4AA6D19C, + 0x40852000,0x00000000, 0x7CE32F28,0x8D4422DA, + 0x40852400,0x00000000, 0x7CEFA121,0x9EA597F3, + 0x40852800,0x00000000, 0x7CFA12F4,0xD1BB3776, + 0x40852C00,0x00000000, 0x7D057E92,0x3C9A1ED2, + 0x40853000,0x00000000, 0x7D11B81A,0x66261DE4, + 0x40853400,0x00000000, 0x7D1D36C5,0x0B300837, + 0x40853800,0x00000000, 0x7D281534,0x0E4BDA5E, + 0x40853C00,0x00000000, 0x7D33DA59,0xD7885985, + 0x40854000,0x00000000, 0x7D405DB0,0xA762C9AC, + 0x40854400,0x00000000, 0x7D4AFBA1,0x906A31C7, + 0x40854800,0x00000000, 0x7D563E61,0x1150F9CC, + 0x40854C00,0x00000000, 0x7D625638,0xD704546A, + 0x40855000,0x00000000, 0x7D6E3B76,0xB5CFDC19, + 0x40855400,0x00000000, 0x7D78EC1B,0xF604569E, + 0x40855800,0x00000000, 0x7D848B82,0xC9D83550, + 0x40855C00,0x00000000, 0x7D90EFBB,0xD67170B8, + 0x40856000,0x00000000, 0x7D9BEC6A,0x9BFD27F8, + 0x40856400,0x00000000, 0x7DA704DF,0x84D26C33, + 0x40856800,0x00000000, 0x7DB2F9DA,0x45EF311F, + 0x40856C00,0x00000000, 0x7DBF493E,0xB5B90A9E, + 0x40857000,0x00000000, 0x7DC9CA81,0x9A87EBC5, + 0x40857400,0x00000000, 0x7DD542D8,0xA46BBBDB, + 0x40857800,0x00000000, 0x7DE186DE,0x425C1646, + 0x40857C00,0x00000000, 0x7DECE598,0x548F5530, + 0x40858000,0x00000000, 0x7DF7D249,0x40F5E537, + 0x40858400,0x00000000, 0x7E03A32F,0xE20E0DF7, + 0x40858800,0x00000000, 0x7E103037,0x111C911B, + 0x40858C00,0x00000000, 0x7E1AB0A7,0xD4FD8EA4, + 0x40859000,0x00000000, 0x7E260092,0x82ABA144, + 0x40859400,0x00000000, 0x7E322345,0x58BA71EC, + 0x40859800,0x00000000, 0x7E3DE775,0xA015A7E4, + 0x40859C00,0x00000000, 0x7E48A6DC,0x03FCB84B, + 0x4085A000,0x00000000, 0x7E54526C,0x916EE2BF, + 0x4085A400,0x00000000, 0x7E60C0AC,0x731EDDEE, + 0x4085A800,0x00000000, 0x7E6B9ED3,0xD3136570, + 0x4085AC00,0x00000000, 0x7E76C4E9,0x6BC1B23B, + 0x4085B000,0x00000000, 0x7E82C520,0x1C863F21, + 0x4085B400,0x00000000, 0x7E8EF250,0x00E213E6, + 0x4085B800,0x00000000, 0x7E9982D7,0xB3212B2C, + 0x4085BC00,0x00000000, 0x7EA507C5,0x0052DA3B, + 0x4085C000,0x00000000, 0x7EB1562A,0xECC6EAB2, + 0x4085C400,0x00000000, 0x7EBC954D,0x2BC9F7BC, + 0x4085C800,0x00000000, 0x7EC79018,0x63BD0DEC, + 0x4085CC00,0x00000000, 0x7ED36C9F,0x343CB85C, + 0x4085D000,0x00000000, 0x7EE0033B,0xD677E517, + 0x4085D400,0x00000000, 0x7EEA667E,0x6DCB2072, + 0x4085D800,0x00000000, 0x7EF5C36F,0xB1036D55, + 0x4085DC00,0x00000000, 0x7F01F0DF,0x6D72215E, + 0x4085E000,0x00000000, 0x7F0D945D,0xF4F8EC8E, + 0x4085E400,0x00000000, 0x7F18625C,0x7D4F56C2, + 0x4085E800,0x00000000, 0x7F2419F4,0xF87E2B37, + 0x4085EC00,0x00000000, 0x7F30921F,0xD2FFAB7C, + 0x4085F000,0x00000000, 0x7F3B5214,0xA170249D, + 0x4085F400,0x00000000, 0x7F4685A5,0x0C34C6AA, + 0x4085F800,0x00000000, 0x7F5290F8,0x75798760, + 0x4085FC00,0x00000000, 0x7F5E9C52,0xD993CE57, + 0x40860000,0x00000000, 0x7F693BF4,0xEC282EFB, + 0x40860400,0x00000000, 0x7F74CD55,0x83300AD2, + 0x40860800,0x00000000, 0x7F8125FE,0xE944F2C3, + 0x40860C00,0x00000000, 0x7F8C45E1,0x1E24D6E6, + 0x40861000,0x00000000, 0x7F974E9F,0x71FA5B35, + 0x40861400,0x00000000, 0x7FA336A6,0x242BF518, + 0x40861800,0x00000000, 0x7FAFAD7B,0x30B5865E, + 0x40861C00,0x00000000, 0x7FBA1D23,0x17F485AA, + 0x40862000,0x00000000, 0x7FC586F6,0xBF260CF1, + 0x40862400,0x00000000, 0x7FD1BF05,0x8BC994AD, + 0x40862800,0x00000000, 0x7FDD422D,0x2BE5DC9B, + 0xBFE00000,0x00000000, 0x3FE368B2,0xFC6F960A, + 0xBFF00000,0x00000000, 0x3FD78B56,0x362CEF38, + 0xBFF80000,0x00000000, 0x3FCC8F87,0x724B5C1D, + 0xC0000000,0x00000000, 0x3FC152AA,0xA3BF81CC, + 0xC0040000,0x00000000, 0x3FB50385,0xC094F425, + 0xC0080000,0x00000000, 0x3FA97DB0,0xCCCEB0AF, + 0xC00C0000,0x00000000, 0x3F9EEC10,0x18E4FF66, + 0xC0100000,0x00000000, 0x3F92C155,0xB8213CF4, + 0xC0120000,0x00000000, 0x3F86C050,0x4695C417, + 0xC0140000,0x00000000, 0x3F7B993F,0xE00D5376, + 0xC0160000,0x00000000, 0x3F70BD4A,0x5ACA7728, + 0xC0180000,0x00000000, 0x3F644E51,0xF113D4D6, + 0xC01A0000,0x00000000, 0x3F58A1E1,0x8A954FFA, + 0xC01C0000,0x00000000, 0x3F4DE16B,0x9C24A98F, + 0xC01E0000,0x00000000, 0x3F421F9B,0xA40F31D5, + 0xC0200000,0x00000000, 0x3F35FC21,0x041027AD, + 0xC0210000,0x00000000, 0x3F2AAB43,0xFB3940A1, + 0xC0220000,0x00000000, 0x3F202CF2,0x2526545A, + 0xC0230000,0x00000000, 0x3F139F38,0xA5498FE2, + 0xC0240000,0x00000000, 0x3F07CD79,0xB5647C9B, + 0xC0250000,0x00000000, 0x3EFCDFC2,0x63F6A0BA, + 0xC0260000,0x00000000, 0x3EF18354,0x238F6764, + 0xC0270000,0x00000000, 0x3EE53E8D,0x76780B04, + 0xC0280000,0x00000000, 0x3ED9C54C,0x3B43BC8B, + 0xC0290000,0x00000000, 0x3ECF42ED,0x3F68E690, + 0xC02A0000,0x00000000, 0x3EC2F605,0x3B981D98, + 0xC02B0000,0x00000000, 0x3EB70039,0x74E945DF, + 0xC02C0000,0x00000000, 0x3EABE6C6,0xFDB01612, + 0xC02D0000,0x00000000, 0x3EA0EC50,0x3D2696E8, + 0xC02E0000,0x00000000, 0x3E94875C,0xA227EC38, + 0xC02F0000,0x00000000, 0x3E88E713,0x8077168D, + 0xC0300000,0x00000000, 0x3E7E355B,0xBAEE85CB, + 0xC0308000,0x00000000, 0x3E725284,0xD838EF8C, + 0xC0310000,0x00000000, 0x3E6639E3,0x175A689D, + 0xC0318000,0x00000000, 0x3E5AF62E,0x927C4664, + 0xC0320000,0x00000000, 0x3E505A62,0x8C699FA1, + 0xC0328000,0x00000000, 0x3E43D657,0x76D812BC, + 0xC0330000,0x00000000, 0x3E381056,0xFF2C5772, + 0xC0338000,0x00000000, 0x3E2D30DE,0xB5F04C13, + 0xC0340000,0x00000000, 0x3E21B486,0x55F37267, + 0xC0348000,0x00000000, 0x3E157A3A,0xFEED00AB, + 0xC0350000,0x00000000, 0x3E0A0DB0,0xD0DDB3EC, + 0xC0358000,0x00000000, 0x3DFF9ABE,0x68B14E81, + 0xC0360000,0x00000000, 0x3DF32B48,0xBF117DA2, + 0xC0368000,0x00000000, 0x3DE740D6,0x2BB76E50, + 0xC0370000,0x00000000, 0x3DDC3527,0xE433FAB1, + 0xC0378000,0x00000000, 0x3DD11BDA,0x375761F2, + 0xC0380000,0x00000000, 0x3DC4C107,0x8FE9228A, + 0xC0388000,0x00000000, 0x3DB92D07,0xD6F15A44, + 0xC0390000,0x00000000, 0x3DAE8A37,0xA45FC32E, + 0xC0398000,0x00000000, 0x3DA285FD,0x102F8A43, + 0xC03A0000,0x00000000, 0x3D967852,0xA7007E42, + 0xC03A8000,0x00000000, 0x3D8B41EB,0x9CA96642, + 0xC03B0000,0x00000000, 0x3D808852,0x98767E9A, + 0xC03B8000,0x00000000, 0x3D740E11,0x1F58FA5B, + 0xC03C0000,0x00000000, 0x3D6853F0,0x1D6D53BA, + 0xC03C8000,0x00000000, 0x3D5D82DE,0xE15411B1, + 0xC03D0000,0x00000000, 0x3D51E642,0xBAEB84A0, + 0xC03D8000,0x00000000, 0x3D45B690,0x2BC47821, + 0xC03E0000,0x00000000, 0x3D3A56E0,0xC2AC7F75, + 0xC03E8000,0x00000000, 0x3D2FF386,0x4232B407, + 0xC03F0000,0x00000000, 0x3D236121,0xE24D3BBA, + 0xC03F8000,0x00000000, 0x3D178228,0x63549FCE, + 0xC0400000,0x00000000, 0x3D0C8464,0xF7616468, + 0xC0404000,0x00000000, 0x3D014BE9,0xBC6D7C42, + 0xC0408000,0x00000000, 0x3CF4FB54,0x7C775DA8, + 0xC040C000,0x00000000, 0x3CE973C0,0xB00B76CB, + 0xC0410000,0x00000000, 0x3CDEE001,0xEED62AA0, + 0xC0414000,0x00000000, 0x3CD2BA05,0xDDB1DAE4, + 0xC0418000,0x00000000, 0x3CC6B771,0x9A59F0E0, + 0xC041C000,0x00000000, 0x3CBB8E7D,0x68ED96BA, + 0xC0420000,0x00000000, 0x3CB0B6C3,0xAFDDE064, + 0xC0424000,0x00000000, 0x3CA44667,0x51C2BBE8, + 0xC0428000,0x00000000, 0x3C989847,0x1FCA6055, + 0xC042C000,0x00000000, 0x3C8DD5C5,0x66301EC8, + 0xC0430000,0x00000000, 0x3C82188A,0xD6AE3303, + 0xC0434000,0x00000000, 0x3C75F38E,0xD3EB9BDB, + 0xC0438000,0x00000000, 0x3C6AA0DE,0x4BF35B38, + 0xC043C000,0x00000000, 0x3C6026A3,0xC0738CFF, + 0xC0440000,0x00000000, 0x3C539792,0x499B1A24, + 0xC0444000,0x00000000, 0x3C47C432,0x199DF55A, + 0xC0448000,0x00000000, 0x3C3CD480,0xA1B74820, + 0xC044C000,0x00000000, 0x3C317C80,0x438BE74E, + 0xC0450000,0x00000000, 0x3C253645,0x2EE2F75C, + 0xC0454000,0x00000000, 0x3C19BB40,0x33CAA3AE, + 0xC0458000,0x00000000, 0x3C0F36BD,0x37F42F3E, + 0xC045C000,0x00000000, 0x3C02EEA0,0xD6E74738, + 0xC0460000,0x00000000, 0x3BF6F741,0xDE1748EC, + 0xC0464000,0x00000000, 0x3BEBDBE6,0x4CF27CD4, + 0xC0468000,0x00000000, 0x3BE0E5B7,0x3D1FF53D, + 0xC046C000,0x00000000, 0x3BD47F5B,0xC5D1A914, + 0xC0470000,0x00000000, 0x3BC8DD5E,0x1BB09D7E, + 0xC0474000,0x00000000, 0x3BBE2994,0xCB989E2F, + 0xC0478000,0x00000000, 0x3BB24B60,0x31B49BDA, + 0xC047C000,0x00000000, 0x3BA63138,0xD37A798A, + 0xC0480000,0x00000000, 0x3B9AEBAB,0xAE3A41B5, + 0xC0484000,0x00000000, 0x3B905402,0x70B1952E, + 0xC0488000,0x00000000, 0x3B83CE9B,0x9DE78F85, + 0xC048C000,0x00000000, 0x3B7806F5,0x5208CE4F, + 0xC0490000,0x00000000, 0x3B6D257D,0x547E083F, + 0xC0494000,0x00000000, 0x3B61AD9F,0x47F3722A, + 0xC0498000,0x00000000, 0x3B5571DB,0x733A9D61, + 0xC049C000,0x00000000, 0x3B4A0388,0x9042C921, + 0xC04A0000,0x00000000, 0x3B3F8E6C,0x24B5592E, + 0xC04A4000,0x00000000, 0x3B3323CF,0x966C2424, + 0xC04A8000,0x00000000, 0x3B2737C5,0x645114B5, + 0xC04AC000,0x00000000, 0x3B1C2A28,0xA4F0A533, + 0xC04B0000,0x00000000, 0x3B11152E,0xAEB73C08, + 0xC04B4000,0x00000000, 0x3B04B8F0,0x3815586B, + 0xC04B8000,0x00000000, 0x3AF92337,0x2C67A074, + 0xC04BC000,0x00000000, 0x3AEE7E4F,0x9FBB7321, + 0xC04C0000,0x00000000, 0x3AE27EC4,0x58C65E3C, + 0xC04C4000,0x00000000, 0x3AD66F90,0x0BC28643, + 0xC04C8000,0x00000000, 0x3ACB374B,0x315F87C1, + 0xC04CC000,0x00000000, 0x3AC081E0,0x93F5C945, + 0xC04D0000,0x00000000, 0x3AB4063F,0x8CC8BB98, + 0xC04D4000,0x00000000, 0x3AA84A74,0x15B285CB, + 0xC04D8000,0x00000000, 0x3A9D775D,0x87DA854D, + 0xC04DC000,0x00000000, 0x3A91DF48,0x490E49C9, + 0xC04E0000,0x00000000, 0x3A85AE19,0x1A99585A, + 0xC04E4000,0x00000000, 0x3A7A4C9B,0xF9A78412, + 0xC04E8000,0x00000000, 0x3A6FE711,0x6182E9CC, + 0xC04EC000,0x00000000, 0x3A635993,0xBB5E3AAB, + 0xC04F0000,0x00000000, 0x3A5778FE,0x2497184C, + 0xC04F4000,0x00000000, 0x3A4C7946,0xD3C1F04A, + 0xC04F8000,0x00000000, 0x3A41452B,0x7723AED2, + 0xC04FC000,0x00000000, 0x3A34F326,0x69FE335C, + 0xC0500000,0x00000000, 0x3A2969D4,0x7321E4CC, + 0xC0502000,0x00000000, 0x3A1ED3F8,0x77F42B71, + 0xC0504000,0x00000000, 0x3A12B2B8,0xDD05B318, + 0xC0506000,0x00000000, 0x3A06AE96,0x635D4B6B, + 0xC0508000,0x00000000, 0x39FB83BF,0x23A9A9EB, + 0xC050A000,0x00000000, 0x39F0B03F,0x90454DE5, + 0xC050C000,0x00000000, 0x39E43E7F,0xC88B8056, + 0xC050E000,0x00000000, 0x39D88EB0,0x7370563C, + 0xC0510000,0x00000000, 0x39CDCA23,0xBAE16424, + 0xC0512000,0x00000000, 0x39C2117C,0xCA7BA9B9, + 0xC0514000,0x00000000, 0x39B5EAFF,0xFB34BA31, + 0xC0516000,0x00000000, 0x39AA967C,0xAA5D5A0C, + 0xC0518000,0x00000000, 0x39A02057,0xD1245CEB, + 0xC051A000,0x00000000, 0x39938FEE,0xE9697020, + 0xC051C000,0x00000000, 0x3987BAEE,0x1BFFA80B, + 0xC051E000,0x00000000, 0x397CC943,0x42F43262, + 0xC0520000,0x00000000, 0x397175AF,0x0CF60EC5, + 0xC0522000,0x00000000, 0x39652E00,0x21EB2A50, + 0xC0524000,0x00000000, 0x3959B138,0x170D6BFE, + 0xC0526000,0x00000000, 0x394F2A91,0xF0E029BF, + 0xC0528000,0x00000000, 0x3942E73F,0x53FBA844, + 0xC052A000,0x00000000, 0x3936EE4D,0xC63B3CDC, + 0xC052C000,0x00000000, 0x392BD109,0xD9D94BDA, + 0xC052E000,0x00000000, 0x3920DF20,0xCF930023, + 0xC0530000,0x00000000, 0x3914775E,0x0840BFDD, + 0xC0532000,0x00000000, 0x3908D3AC,0x7FDF6990, + 0xC0534000,0x00000000, 0x38FE1DD2,0x73AA8A4A, + 0xC0536000,0x00000000, 0x38F2443E,0x541BADB8, + 0xC0538000,0x00000000, 0x38E62891,0xF06B3450, + 0xC053A000,0x00000000, 0x38DAE12C,0xE30B1D65, + 0xC053C000,0x00000000, 0x38D04DA4,0xD1452919, + 0xC053E000,0x00000000, 0x38C3C6E2,0xC8D491E3, + 0xC0540000,0x00000000, 0x38B7FD97,0x4D372E45, + 0xC0542000,0x00000000, 0x38AD1A20,0x62DC07E6, + 0xC0544000,0x00000000, 0x38A1A6BA,0xEADB4FD1, + 0xC0546000,0x00000000, 0x3895697F,0x2B378F40, + 0xC0548000,0x00000000, 0x3889F964,0x45648B9F, + 0xC054A000,0x00000000, 0x387F821E,0xAE730856, + 0xC054C000,0x00000000, 0x38731C59,0x57A47DE2, + 0xC054E000,0x00000000, 0x38672EB8,0x25B2B8BA, + 0xC0550000,0x00000000, 0x385C1F2D,0xAF3B6A46, + 0xC0552000,0x00000000, 0x38510E85,0xBFCA7EB3, + 0xC0554000,0x00000000, 0x3844B0DC,0x07CABF98, + 0xC0556000,0x00000000, 0x3839196A,0x5575168A, + 0xC0558000,0x00000000, 0x382E726C,0x3F64D0FE, + 0xC055A000,0x00000000, 0x3822778E,0x721B447B, + 0xC055C000,0x00000000, 0x381666D0,0xDAD2961D, + 0xC055E000,0x00000000, 0x380B2CAE,0xEAAB824A, + 0xC0560000,0x00000000, 0x38007B71,0x12BC1FFE, + 0xC0562000,0x00000000, 0x37F3FE71,0x068E4512, + 0xC0564000,0x00000000, 0x37E840FB,0xC08FDC8A, + 0xC0566000,0x00000000, 0x37DD6BE0,0xAAA7DE99, + 0xC0568000,0x00000000, 0x37D1D850,0x8FA8246A, + 0xC056A000,0x00000000, 0x37C5A5A5,0x56491736, + 0xC056C000,0x00000000, 0x37BA425B,0x317EEACD, + 0xC056E000,0x00000000, 0x37AFDAA1,0x5C0B3550, + 0xC0570000,0x00000000, 0x37A35208,0x867C2683, + 0xC0572000,0x00000000, 0x37976FD7,0x788F3169, + 0xC0574000,0x00000000, 0x378C6E2D,0x05BBC000, + 0xC0576000,0x00000000, 0x37813E6F,0xD2DB521B, + 0xC0578000,0x00000000, 0x3774EAFB,0x87EAB0F2, + 0xC057A000,0x00000000, 0x37695FEC,0x148F4BA7, + 0xC057C000,0x00000000, 0x375EC7F3,0xB269EFA8, + 0xC057E000,0x00000000, 0x3752AB6E,0xB5004409, + 0xC0580000,0x00000000, 0x3746A5BE,0xA046B42E, + 0xC0582000,0x00000000, 0x373B7905,0x0E9EE533, + 0xC0584000,0x00000000, 0x3730A9BD,0xFB02D240, + 0xC0586000,0x00000000, 0x3724369B,0x543A1A8B, + 0xC0588000,0x00000000, 0x3718851D,0x84118908, + 0xC058A000,0x00000000, 0x370DBE86,0x98733444, + 0xC058C000,0x00000000, 0x37020A71,0x7E64A9BD, + 0xC058E000,0x00000000, 0x36F5E274,0x789E0327, + 0xC0590000,0x00000000, 0x36EA8C1F,0x14E2AF5D, + 0xC0592000,0x00000000, 0x36E01A0E,0x5643644F, + 0xC0594000,0x00000000, 0x36D3884E,0x838AEA68, + 0xC0596000,0x00000000, 0x36C7B1AD,0xBB20821C, + 0xC0598000,0x00000000, 0x36BCBE0A,0x45F75EB1, + 0xC059A000,0x00000000, 0x36B16EE0,0x7EC4343B, + 0xC059C000,0x00000000, 0x36A525BE,0x4E4E601D, + 0xC059E000,0x00000000, 0x3699A733,0xE3852834, + 0xC05A0000,0x00000000, 0x368F1E6B,0x68529E33, + 0xC05A2000,0x00000000, 0x3682DFE0,0xB1B59FFF, + 0xC05A4000,0x00000000, 0x3676E55D,0x2BF838A7, + 0xC05A6000,0x00000000, 0x366BC631,0xA2BD4340, + 0xC05A8000,0x00000000, 0x3660D88C,0xF37F00DD, + 0xC05AA000,0x00000000, 0x36546F63,0x683DC7B6, + 0xC05AC000,0x00000000, 0x3648C9FE,0xAB89B876, + 0xC05AE000,0x00000000, 0x363E1214,0xB15A0B71, + 0xC05B0000,0x00000000, 0x36323D1F,0x3E5834A0, + 0xC05B2000,0x00000000, 0x36261FEE,0x6CDB7090, + 0xC05B4000,0x00000000, 0x361AD6B2,0x2F55DB42, + 0xC05B6000,0x00000000, 0x36104749,0xAD2C4A4B, + 0xC05B8000,0x00000000, 0x3603BF2C,0xF6722E46, + 0xC05BA000,0x00000000, 0x35F7F43C,0xEF4A6E74, + 0xC05BC000,0x00000000, 0x35ED0EC7,0xDF4F7BD4, + 0xC05BE000,0x00000000, 0x35E19FD9,0x3D9E7785, + 0xC05C0000,0x00000000, 0x35D56126,0x259E093C, + 0xC05C2000,0x00000000, 0x35C9EF43,0xEEB7C3F7, + 0xC05C4000,0x00000000, 0x35BF75D6,0x040AEFF6, + 0xC05C6000,0x00000000, 0x35B314E6,0x0197C223, + 0xC05C8000,0x00000000, 0x35A725AE,0x6E7B9D35, + 0xC05CA000,0x00000000, 0x359C1437,0x01686511, + 0xC05CC000,0x00000000, 0x359107DF,0x698DA211, + 0xC05CE000,0x00000000, 0x3584A8CA,0xFDCE846A, + 0xC05D0000,0x00000000, 0x35790FA1,0x509BD50D, + 0xC05D2000,0x00000000, 0x356E668D,0x818C96D5, + 0xC05D4000,0x00000000, 0x3562705B,0x5B153FB8, + 0xC05D6000,0x00000000, 0x35565E15,0x12DBD252, + 0xC05D8000,0x00000000, 0x354B2216,0xC6EFDAC1, + 0xC05DA000,0x00000000, 0x35407504,0x13CEB8D6, + 0xC05DC000,0x00000000, 0x3533F6A5,0x8B795DE3, + 0xC05DE000,0x00000000, 0x35283787,0x1C944DAC, + 0xC05E0000,0x00000000, 0x351D6068,0x47FC727A, + 0xC05E2000,0x00000000, 0x3511D15B,0x8DA98E36, + 0xC05E4000,0x00000000, 0x35059D34,0xDD8A5473, + 0xC05E6000,0x00000000, 0x34FA381E,0x68A32600, + 0xC05E8000,0x00000000, 0x34EFCE36,0x2FE6E7D0, + 0xC05EA000,0x00000000, 0x34E34A80,0x428105AF, + 0xC05EC000,0x00000000, 0x34D766B4,0x5DD84F18, + 0xC05EE000,0x00000000, 0x34CC6317,0x8B9E3CB0, + 0xC05F0000,0x00000000, 0x34C137B6,0xCE8E052C, + 0xC05F2000,0x00000000, 0x34B4E2D3,0xD4FE8E61, + 0xC05F4000,0x00000000, 0x34A95607,0x92D19314, + 0xC05F6000,0x00000000, 0x349EBBF3,0x9C631BF2, + 0xC05F8000,0x00000000, 0x3492A427,0x64857B19, + 0xC05FA000,0x00000000, 0x34869CEA,0x4FBD922A, + 0xC05FC000,0x00000000, 0x347B6E4F,0x282B43F4, + 0xC05FE000,0x00000000, 0x3470A33E,0xEF18E303, + 0xC0600000,0x00000000, 0x34642EB9,0xF39AFB0B, + 0xC0601000,0x00000000, 0x34587B8E,0x5038E1C3, + 0xC0602000,0x00000000, 0x344DB2ED,0xFD20FA7C, + 0xC0603000,0x00000000, 0x34420368,0xF156B202, + 0xC0604000,0x00000000, 0x3435D9EC,0x4ADA7938, + 0xC0605000,0x00000000, 0x342A81C5,0x89EF6B20, + 0xC0606000,0x00000000, 0x342013C7,0x4EDBA307, + 0xC0607000,0x00000000, 0x341380B1,0x16D6559C, + 0xC0608000,0x00000000, 0x3407A870,0xF597FDBD, + 0xC0609000,0x00000000, 0x33FCB2D5,0xA90B7702, + 0xC060A000,0x00000000, 0x33F16814,0x97ED15B3, + 0xC060B000,0x00000000, 0x33E51D7F,0xB2CAD2A2, + 0xC060C000,0x00000000, 0x33D99D33,0x97AB8371, + 0xC060D000,0x00000000, 0x33CF1249,0x9C720D9D, + 0xC060E000,0x00000000, 0x33C2D884,0xEEF5FDCB, + 0xC060F000,0x00000000, 0x33B6DC70,0x0DF1DB4B, + 0xC0610000,0x00000000, 0x33ABBB5D,0xA5F7C823, + 0xC0611000,0x00000000, 0x33A0D1FB,0xA7E3A4C0, + 0xC0612000,0x00000000, 0x3394676B,0xE491D129, + 0xC0613000,0x00000000, 0x3388C054,0x9D365B29, + 0xC0614000,0x00000000, 0x337E065B,0x82DD95A0, + 0xC0615000,0x00000000, 0x33723602,0xEF54AC69, + 0xC0616000,0x00000000, 0x3366174E,0x477A895F, + 0xC0617000,0x00000000, 0x335ACC3B,0x91821C8E, + 0xC0618000,0x00000000, 0x335040F1,0x036F4863, + 0xC0619000,0x00000000, 0x3343B77A,0x2593EE6B, + 0xC061A000,0x00000000, 0x3337EAE6,0x36D6144E, + 0xC061B000,0x00000000, 0x332D0373,0xC81E4174, + 0xC061C000,0x00000000, 0x332198FA,0x3F30BE25, + 0xC061D000,0x00000000, 0x331558D0,0x6128BD4E, + 0xC061E000,0x00000000, 0x3309E527,0x8AB1D4CF, + 0xC061F000,0x00000000, 0x32FF6992,0x239E5EF6, + 0xC0620000,0x00000000, 0x32F30D75,0x9323998C, + 0xC0621000,0x00000000, 0x32E71CA8,0x3D4B8E80, + 0xC0622000,0x00000000, 0x32DC0944,0x99CC578E, + 0xC0623000,0x00000000, 0x32D1013B,0xAAFD836F, + 0xC0624000,0x00000000, 0x32C4A0BD,0x18E64DF7, + 0xC0625000,0x00000000, 0x32B905DC,0x1C5E896B, + 0xC0626000,0x00000000, 0x32AE5AB3,0x64643354, + 0xC0627000,0x00000000, 0x32A2692B,0x129BC035, + 0xC0628000,0x00000000, 0x3296555C,0xB289E44B, + 0xC0629000,0x00000000, 0x328B1782,0xC48FB740, + 0xC062A000,0x00000000, 0x32806E99,0x96332BA1, + 0xC062B000,0x00000000, 0x3273EEDD,0x1A5A43C3, + 0xC062C000,0x00000000, 0x32682E16,0x284F5EC5, + 0xC062D000,0x00000000, 0x325D54F4,0x5E194458, + 0xC062E000,0x00000000, 0x3251CA69,0x42036ABB, + 0xC062F000,0x00000000, 0x324594C7,0xAF143039, + 0xC0630000,0x00000000, 0x323A2DE5,0x9D8543CC, + 0xC0631000,0x00000000, 0x322FC1CF,0xDB320F7E, + 0xC0632000,0x00000000, 0x322342FA,0xEE475139, + 0xC0633000,0x00000000, 0x32175D94,0xD30E6053, + 0xC0634000,0x00000000, 0x320C5806,0x63B97826, + 0xC0635000,0x00000000, 0x32013100,0x6935CD61, + 0xC0636000,0x00000000, 0x31F4DAAF,0x4FFBFFB3, + 0xC0637000,0x00000000, 0x31E94C26,0xEC673952, + 0xC0638000,0x00000000, 0x31DEAFF8,0x340C0B95, + 0xC0639000,0x00000000, 0x31D29CE2,0xEA79B46A, + 0xC063A000,0x00000000, 0x31C69419,0x7069D2BB, + 0xC063B000,0x00000000, 0x31BB639D,0x6EAD6486, + 0xC063C000,0x00000000, 0x31B09CC2,0x6B8A5898, + 0xC063D000,0x00000000, 0x31A426DB,0xA57B0A42, + 0xC063E000,0x00000000, 0x31987202,0xD671DAE5, + 0xC063F000,0x00000000, 0x318DA759,0xE726D293, + 0xC0640000,0x00000000, 0x3181FC63,0x223FAC81, + 0xC0641000,0x00000000, 0x3175D167,0x709DA0B4, + 0xC0642000,0x00000000, 0x316A7770,0x07F03AC8, + 0xC0643000,0x00000000, 0x31600D82,0xB9F87871, + 0xC0644000,0x00000000, 0x31537916,0xA222F236, + 0xC0645000,0x00000000, 0x31479F37,0xC9FE21AD, + 0xC0646000,0x00000000, 0x313CA7A5,0x6A7BCFC8, + 0xC0647000,0x00000000, 0x3131614B,0x5767D89A, + 0xC0648000,0x00000000, 0x31251544,0x4E1F3930, + 0xC0649000,0x00000000, 0x31199337,0x31FAC105, + 0xC064A000,0x00000000, 0x310F062C,0x8B65B198, + 0xC064B000,0x00000000, 0x3102D12C,0x0A9E0104, + 0xC064C000,0x00000000, 0x30F6D386,0x6ACC4B97, + 0xC064D000,0x00000000, 0x30EBB08D,0xE1E2E463, + 0xC064E000,0x00000000, 0x30E0CB6C,0xEBC0FD13, + 0xC064F000,0x00000000, 0x30D45F77,0x7C0665F8, + 0xC0650000,0x00000000, 0x30C8B6AE,0x536CB5AF, + 0xC0651000,0x00000000, 0x30BDFAA6,0xE66C4F31, + 0xC0652000,0x00000000, 0x30B22EE9,0x65FBFD1B, + 0xC0653000,0x00000000, 0x30A60EB1,0x7EF85D0D, + 0xC0654000,0x00000000, 0x309AC1C9,0x07F821BE, + 0xC0655000,0x00000000, 0x30903A9A,0xD316D390, + 0xC0656000,0x00000000, 0x3083AFCA,0x550DD136, + 0xC0657000,0x00000000, 0x3077E193,0x226E335D, + 0xC0658000,0x00000000, 0x306CF824,0x1B8EE293, + 0xC0659000,0x00000000, 0x3061921D,0xEE86611D, + 0xC065A000,0x00000000, 0x3055507D,0xDC92DC42, + 0xC065B000,0x00000000, 0x3049DB0F,0x17C8BAA3, + 0xC065C000,0x00000000, 0x303F5D53,0x0B4F5EDD, + 0xC065D000,0x00000000, 0x30330608,0x0B261DF1, + 0xC065E000,0x00000000, 0x302713A5,0x90C2E245, + 0xC065F000,0x00000000, 0x301BFE56,0x76BCAA44, + 0xC0660000,0x00000000, 0x3010FA9A,0x8317651F, + 0xC0661000,0x00000000, 0x300498B2,0x57D83DE3, + 0xC0662000,0x00000000, 0x2FF8FC1A,0xB74075B7, + 0xC0663000,0x00000000, 0x2FEE4EDD,0xE61DC97E, + 0xC0664000,0x00000000, 0x2FE261FD,0x9796A399, + 0xC0665000,0x00000000, 0x2FD64CA7,0xB888FA1D, + 0xC0666000,0x00000000, 0x2FCB0CF2,0xE1EEDED3, + 0xC0667000,0x00000000, 0x2FC06831,0x98EF71D5, + 0xC0668000,0x00000000, 0x2FB3E717,0xB201AAD5, + 0xC0669000,0x00000000, 0x2FA824A8,0xE2512510, + 0xC066A000,0x00000000, 0x2F9D4984,0xEB4005E2, + 0xC066B000,0x00000000, 0x2F91C379,0xABA70739, + 0xC066C000,0x00000000, 0x2F858C5D,0xC99E4AE4, + 0xC066D000,0x00000000, 0x2F7A23B0,0xCE96EDDA, + 0xC066E000,0x00000000, 0x2F6FB56E,0x5C09773B, + 0xC066F000,0x00000000, 0x2F633B78,0x88A9F49B, + 0xC0670000,0x00000000, 0x2F575478,0xD6CDDEE7, + 0xC0671000,0x00000000, 0x2F4C4CF9,0x8C5E2C92, + 0xC0672000,0x00000000, 0x2F412A4C,0xA1CD1638, + 0xC0673000,0x00000000, 0x2F34D28D,0xF7A5B4DC, + 0xC0674000,0x00000000, 0x2F29424A,0x1FCF52E8, + 0xC0675000,0x00000000, 0x2F1EA401,0x7791D026, + 0xC0676000,0x00000000, 0x2F1295A1,0x45C1BAB3, + 0xC0677000,0x00000000, 0x2F068B4C,0x00F3E95D, + 0xC0678000,0x00000000, 0x2EFB58EF,0xE08487FC, + 0xC0679000,0x00000000, 0x2EF09648,0x6F5A6E1A, + 0xC067A000,0x00000000, 0x2EE41F00,0x68A7A854, + 0xC067B000,0x00000000, 0x2ED8687B,0x15488026, + 0xC067C000,0x00000000, 0x2ECD9BCA,0x54C1887C, + 0xC067D000,0x00000000, 0x2EC1F560,0x100DEE0F, + 0xC067E000,0x00000000, 0x2EB5C8E5,0xE89B7F87, + 0xC067F000,0x00000000, 0x2EAA6D1E,0x8D526902, + 0xC0680000,0x00000000, 0x2EA00740,0x96A5A34C, + 0xC0681000,0x00000000, 0x2E93717F,0x24487465, + 0xC0682000,0x00000000, 0x2E879602,0x36EB8104, + 0xC0683000,0x00000000, 0x2E7C9C79,0x889467B5, + 0xC0684000,0x00000000, 0x2E715A84,0xBC2C099D, + 0xC0685000,0x00000000, 0x2E650D0C,0x1F0AC85B, + 0xC0686000,0x00000000, 0x2E59893E,0xB0EDBC2F, + 0xC0687000,0x00000000, 0x2E4EFA14,0x33557C10, + 0xC0688000,0x00000000, 0x2E42C9D6,0x038F58D1, + 0xC0689000,0x00000000, 0x2E36CAA0,0x412C37F9, + 0xC068A000,0x00000000, 0x2E2BA5C2,0x54D94663, + 0xC068B000,0x00000000, 0x2E20C4E0,0xBE177EE0, + 0xC068C000,0x00000000, 0x2E145786,0x2D6588F1, + 0xC068D000,0x00000000, 0x2E08AD0B,0xCCB4BEE1, + 0xC068E000,0x00000000, 0x2DFDEEF6,0xDA3E109F, + 0xC068F000,0x00000000, 0x2DF227D2,0xA1397AC6, + 0xC0690000,0x00000000, 0x2DE60618,0x12054CFA, + 0xC0691000,0x00000000, 0x2DDAB75A,0x9120CA42, + 0xC0692000,0x00000000, 0x2DD03447,0x1B2BFC6C, + 0xC0693000,0x00000000, 0x2DC3A81D,0x83B44A7F, + 0xC0694000,0x00000000, 0x2DB7D843,0xB0A76D0D, + 0xC0695000,0x00000000, 0x2DACECD8,0xD7E89519, + 0xC0696000,0x00000000, 0x2DA18B44,0x4A94063D, + 0xC0697000,0x00000000, 0x2D95482E,0x96981584, + 0xC0698000,0x00000000, 0x2D89D0FA,0x94730B8E, + 0xC0699000,0x00000000, 0x2D7F5118,0xB940B387, + 0xC069A000,0x00000000, 0x2D72FE9D,0x687DDA2E, + 0xC069B000,0x00000000, 0x2D670AA6,0x6782774A, + 0xC069C000,0x00000000, 0x2D5BF36C,0x968F6C0E, + 0xC069D000,0x00000000, 0x2D50F3FB,0xF0D8EE55, + 0xC069E000,0x00000000, 0x2D4490AA,0xB96AF02F, + 0xC069F000,0x00000000, 0x2D38F25D,0x1FC57078, + 0xC06A0000,0x00000000, 0x2D2E430D,0x04EC3068, + 0xC06A1000,0x00000000, 0x2D225AD2,0xE8EE34BD, + 0xC06A2000,0x00000000, 0x2D1643F6,0x2385C65C, + 0xC06A3000,0x00000000, 0x2D0B0267,0x1D71B93D, + 0xC06A4000,0x00000000, 0x2D0061CC,0x1B09E660, + 0xC06A5000,0x00000000, 0x2CF3DF55,0x5140BD7A, + 0xC06A6000,0x00000000, 0x2CE81B3F,0x492A453B, + 0xC06A7000,0x00000000, 0x2CDD3E19,0xEDB316C4, + 0xC06A8000,0x00000000, 0x2CD1BC8C,0xC9861A79, + 0xC06A9000,0x00000000, 0x2CC583F7,0x2BE0C4D9, + 0xC06AA000,0x00000000, 0x2CBA197F,0xFA4A691E, + 0xC06AB000,0x00000000, 0x2CAFA911,0xB08AA648, + 0xC06AC000,0x00000000, 0x2CA333F9,0x10844D90, + 0xC06AD000,0x00000000, 0x2C974B60,0x67B3CF3B, + 0xC06AE000,0x00000000, 0x2C8C41F1,0x03DDBC48, + 0xC06AF000,0x00000000, 0x2C81239B,0x774EB129, + 0xC06B0000,0x00000000, 0x2C74CA6F,0xCABED982, + 0xC06B1000,0x00000000, 0x2C693871,0x2B898A72, + 0xC06B2000,0x00000000, 0x2C5E980F,0x65223146, + 0xC06B3000,0x00000000, 0x2C528E62,0x7542C714, + 0xC06B4000,0x00000000, 0x2C468282,0x0004CF81, + 0xC06B5000,0x00000000, 0x2C3B4E46,0x7C1091DF, + 0xC06B6000,0x00000000, 0x2C308FD0,0xF98CC130, + 0xC06B7000,0x00000000, 0x2C241728,0x3BEEACF1, + 0xC06B8000,0x00000000, 0x2C185EF7,0x0B496E3E, + 0xC06B9000,0x00000000, 0x2C0D903F,0x442E9815, + 0xC06BA000,0x00000000, 0x2C01EE5F,0xB9B0362F, + 0xC06BB000,0x00000000, 0x2BF5C067,0xB1889D0C, + 0xC06BC000,0x00000000, 0x2BEA62D1,0x1883DD7F, + 0xC06BD000,0x00000000, 0x2BE00100,0xE3EF418F, + 0xC06BE000,0x00000000, 0x2BD369EA,0x9C1F03D9, + 0xC06BF000,0x00000000, 0x2BC78CD0,0x3AF93AF7, + 0xC06C0000,0x00000000, 0x2BBC9152,0x01A1E776, + 0xC06C1000,0x00000000, 0x2BB153C0,0xC5319C86, + 0xC06C2000,0x00000000, 0x2BA504D7,0x244D31C8, + 0xC06C3000,0x00000000, 0x2B997F4A,0x12FFE7E6, + 0xC06C4000,0x00000000, 0x2B8EEE00,0x926A16FA, + 0xC06C5000,0x00000000, 0x2B82C282,0xD8AC23F6, + 0xC06C6000,0x00000000, 0x2B76C1BD,0x8FB6D644, + 0xC06C7000,0x00000000, 0x2B6B9AFA,0xFD3640C5, + 0xC06C8000,0x00000000, 0x2B60BE57,0x1DE802D5, + 0xC06C9000,0x00000000, 0x2B544F97,0xF779B5BB, + 0xC06CA000,0x00000000, 0x2B48A36D,0x07970034, + 0xC06CB000,0x00000000, 0x2B3DE34B,0x5C8B6436, + 0xC06CC000,0x00000000, 0x2B3220BE,0x9FF8E556, + 0xC06CD000,0x00000000, 0x2B25FD81,0xFF523D5A, + 0xC06CE000,0x00000000, 0x2B1AACF0,0x2B65943F, + 0xC06CF000,0x00000000, 0x2B102DF5,0xDAB833D6, + 0xC06D0000,0x00000000, 0x2B03A073,0xB05C42E7, + 0xC06D1000,0x00000000, 0x2AF7CEF7,0xE016F071, + 0xC06D2000,0x00000000, 0x2AECE191,0xFB733AC4, + 0xC06D3000,0x00000000, 0x2AE1846D,0x524EBB8E, + 0xC06D4000,0x00000000, 0x2AD53FE2,0x8DF496F2, + 0xC06D5000,0x00000000, 0x2AC9C6E9,0xFF27F70A, + 0xC06D6000,0x00000000, 0x2ABF44E3,0x2B95DAE1, + 0xC06D7000,0x00000000, 0x2AB2F735,0xAA09C9F6, + 0xC06D8000,0x00000000, 0x2AA701AA,0xC02BB536, + 0xC06D9000,0x00000000, 0x2A9BE886,0xF79B51D1, + 0xC06DA000,0x00000000, 0x2A90ED5F,0xF3402AFB, + 0xC06DB000,0x00000000, 0x2A8488A6,0x3C657B08, + 0xC06DC000,0x00000000, 0x2A78E8A3,0x5471E469, + 0xC06DD000,0x00000000, 0x2A6E3740,0xBF02F2F0, + 0xC06DE000,0x00000000, 0x2A6253AB,0x058B2B8A, + 0xC06DF000,0x00000000, 0x2A563B47,0xF22D7FE0, + 0xC06E0000,0x00000000, 0x2A4AF7DF,0x757D4EB7, + 0xC06E1000,0x00000000, 0x2A405B69,0x1B894584, + 0xC06E2000,0x00000000, 0x2A33D795,0xF6E91C26, + 0xC06E3000,0x00000000, 0x2A2811D9,0x5B6BF328, + 0xC06E4000,0x00000000, 0x2A1D32B3,0x63B58467, + 0xC06E5000,0x00000000, 0x2A11B5A2,0x9A92C4A3, + 0xC06E6000,0x00000000, 0x2A057B93,0xD4943E4D, + 0xC06E7000,0x00000000, 0x29FA0F53,0x1F12959C, + 0xC06E8000,0x00000000, 0x29EF9CB9,0xD6D3DFFE, + 0xC06E9000,0x00000000, 0x29E32C7C,0x84B22BEA, + 0xC06EA000,0x00000000, 0x29D7424B,0x845DC019, + 0xC06EB000,0x00000000, 0x29CC36EC,0xC88A317E, + 0xC06EC000,0x00000000, 0x29C11CEC,0xE8B5D57F, + 0xC06ED000,0x00000000, 0x29B4C254,0xC80B14D0, + 0xC06EE000,0x00000000, 0x29A92E9C,0x0E16205F, + 0xC06EF000,0x00000000, 0x299E8C21,0xFAEBAC57, + 0xC06F0000,0x00000000, 0x29928726,0x77E280EB, + 0xC06F1000,0x00000000, 0x298679BB,0x6C46044F, + 0xC06F2000,0x00000000, 0x297B43A1,0x3FB207F5, + 0xC06F3000,0x00000000, 0x2970895C,0x092551E4, + 0xC06F4000,0x00000000, 0x29640F53,0x1E1E6723, + 0xC06F5000,0x00000000, 0x29585576,0xB701D2B1, + 0xC06F6000,0x00000000, 0x294D84B8,0xB3AC2CDB, + 0xC06F7000,0x00000000, 0x2941E762,0x1E15AEF0, + 0xC06F8000,0x00000000, 0x2935B7EC,0xCA1A01D7, + 0xC06F9000,0x00000000, 0x292A5887,0xA7F31CB0, + 0xC06FA000,0x00000000, 0x291FF587,0x41C3A08D, + 0xC06FB000,0x00000000, 0x29136259,0x087F3B99, + 0xC06FC000,0x00000000, 0x290783A1,0xD4C0FAA7, + 0xC06FD000,0x00000000, 0x28FC862E,0xD3F1A170, + 0xC06FE000,0x00000000, 0x28F14CFF,0x7170EC0D, + 0xC06FF000,0x00000000, 0x28E4FCA5,0x5CA6A3F9, + 0xC0700000,0x00000000, 0x28D97559,0x56AD4E9C, + 0xC0700800,0x00000000, 0x28CEE1F1,0xA6CCE40D, + 0xC0701000,0x00000000, 0x28C2BB32,0x88D6F0AD, + 0xC0701800,0x00000000, 0x28B6B8DE,0x5511E382, + 0xC0702000,0x00000000, 0x28AB9037,0xD955CA2E, + 0xC0702800,0x00000000, 0x28A0B7D0,0x0A33C517, + 0xC0703000,0x00000000, 0x289447AC,0xD90DE0A6, + 0xC0703800,0x00000000, 0x288899D2,0x029C957A, + 0xC0704000,0x00000000, 0x287DD7A4,0x6B8D85D6, + 0xC0704800,0x00000000, 0x287219AD,0x6126686B, + 0xC0705000,0x00000000, 0x2865F4EF,0x4590950A, + 0xC0705800,0x00000000, 0x285AA289,0xD5309C57, + 0xC0706000,0x00000000, 0x285027A7,0x10C54ACD, + 0xC0706800,0x00000000, 0x284398CC,0xD9DB17AA, + 0xC0707000,0x00000000, 0x2837C5AF,0xAF527A12, + 0xC0707800,0x00000000, 0x282CD64F,0x847760ED, + 0xC0708000,0x00000000, 0x28217D99,0x04ABF72C, + 0xC0708800,0x00000000, 0x28153799,0xC1650CA8, + 0xC0709000,0x00000000, 0x2809BCDD,0x565F45B5, + 0xC0709800,0x00000000, 0x27FF38B2,0x60730C9A, + 0xC070A000,0x00000000, 0x27F2EFD0,0xCEA959AA, + 0xC070A800,0x00000000, 0x27E6F8B2,0x99608C61, + 0xC070B000,0x00000000, 0x27DBDDA5,0x9837B646, + 0xC070B800,0x00000000, 0x27D0E6C6,0x894B8B8D, + 0xC070C000,0x00000000, 0x27C480A4,0xDF8F6E9C, + 0xC070C800,0x00000000, 0x27B8DEED,0x53CAD040, + 0xC070D000,0x00000000, 0x27AE2B79,0x12964F75, + 0xC070D800,0x00000000, 0x27A24C85,0xEC56ACC8, + 0xC070E000,0x00000000, 0x2796329D,0x232DE199, + 0xC070E800,0x00000000, 0x278AED5B,0xE87747B3, + 0xC070F000,0x00000000, 0x27805508,0x9974ACB1, + 0xC070F800,0x00000000, 0x2773CFD9,0xA1CCDD2B, + 0xC0710000,0x00000000, 0x27680877,0x17A7F1BB, + 0xC0710800,0x00000000, 0x275D2751,0x4B8B09AA, + 0xC0711000,0x00000000, 0x2751AEBB,0x1DBF8F18, + 0xC0711800,0x00000000, 0x27457333,0xC271D71A, + 0xC0712000,0x00000000, 0x273A052A,0x3B62EE2A, + 0xC0712800,0x00000000, 0x272F9066,0xCD042388, + 0xC0713000,0x00000000, 0x27232502,0xE40FD165, + 0xC0713800,0x00000000, 0x2717393A,0x2B69CA7C, + 0xC0714000,0x00000000, 0x270C2BEC,0xD8B63E07, + 0xC0714800,0x00000000, 0x27011640,0xF4FE2032, + 0xC0715000,0x00000000, 0x26F4BA3C,0xEE4E8949, + 0xC0715800,0x00000000, 0x26E924CA,0xC5F5EABB, + 0xC0716000,0x00000000, 0x26DE8039,0x371D7439, + 0xC0716800,0x00000000, 0x26D27FED,0x4C86FDAB, + 0xC0717000,0x00000000, 0x26C670F8,0x44618C78, + 0xC0717800,0x00000000, 0x26BB3900,0x29CA11FD, + 0xC0718000,0x00000000, 0x26B082E9,0x9D288282, + 0xC0718800,0x00000000, 0x26A40781,0x0E059D23, + 0xC0719000,0x00000000, 0x26984BFA,0x16FF6B94, + 0xC0719800,0x00000000, 0x268D7936,0xA17921AD, + 0xC071A000,0x00000000, 0x2681E067,0x3C2DECBD, + 0xC071A800,0x00000000, 0x2675AF75,0x31053785, + 0xC071B000,0x00000000, 0x266A4E42,0x3A0F478C, + 0xC071B800,0x00000000, 0x265FE911,0x991456DD, + 0xC071C000,0x00000000, 0x26535ACA,0x684229D8, + 0xC071C800,0x00000000, 0x26477A77,0x02DCF6E6, + 0xC071D000,0x00000000, 0x263C7B0F,0xFDD19182, + 0xC071D800,0x00000000, 0x26314640,0xBFE2B9B4, + 0xC071E000,0x00000000, 0x2624F476,0xC6D7CA23, + 0xC071E800,0x00000000, 0x26196B6C,0x7A729201, + 0xC071F000,0x00000000, 0x260ED5E7,0x6EA7FC79, + 0xC071F800,0x00000000, 0x2602B3E5,0x12F2BC7A, + 0xC0720000,0x00000000, 0x25F6B002,0x8FE3A3B8, + 0xC0720800,0x00000000, 0x25EB8578,0xE7947D03, + 0xC0721000,0x00000000, 0x25E0B14B,0x81FC651F, + 0xC0721800,0x00000000, 0x25D43FC4,0xD0ED7682, + 0xC0722000,0x00000000, 0x25C8903A,0xBC4F2CB1, + 0xC0722800,0x00000000, 0x25BDCC02,0x057E62AB, + 0xC0723000,0x00000000, 0x25B2129E,0xE3AE9B2D, + 0xC0723800,0x00000000, 0x25A5EC5F,0xE3723D57, + 0xC0724000,0x00000000, 0x259A9827,0x8CEC9D6A, + 0xC0724800,0x00000000, 0x2590215A,0xBC5D724B, + 0xC0725000,0x00000000, 0x25839128,0xFF069A6E, + 0xC0725800,0x00000000, 0x2577BC6B,0x1CF053B3, + 0xC0726000,0x00000000, 0x256CCB11,0x713E403A, + 0xC0726800,0x00000000, 0x256176C7,0x60A1971F, + 0xC0727000,0x00000000, 0x25552F54,0x2FA6A0CE, + 0xC0727800,0x00000000, 0x2549B2D4,0x98915917, + 0xC0728000,0x00000000, 0x253F2C86,0x55FD39E2, + 0xC0728800,0x00000000, 0x2532E86E,0xD53C662C, + 0xC0729000,0x00000000, 0x2526EFBD,0xF1C3759B, + 0xC0729800,0x00000000, 0x251BD2C8,0x76BC99AE, + 0xC072A000,0x00000000, 0x2510E02F,0xB1F9E4EF, + 0xC072A800,0x00000000, 0x250478A6,0xA1B0D4E6, + 0xC072B000,0x00000000, 0x24F8D53B,0x1C55C677, + 0xC072B800,0x00000000, 0x24EE1FB5,0xFDDB3799, + 0xC072C000,0x00000000, 0x24E24563,0x9C3A49F7, + 0xC072C800,0x00000000, 0x24D629F5,0xB5352A54, + 0xC072D000,0x00000000, 0x24CAE2DC,0x74C5EC9D, + 0xC072D800,0x00000000, 0x24C04EAA,0x93D39A5F, + 0xC072E000,0x00000000, 0x24B3C820,0x50BE8C92, + 0xC072E800,0x00000000, 0x24A7FF18,0x7C70929F, + 0xC072F000,0x00000000, 0x249D1BF3,0xA3780EA3, + 0xC072F800,0x00000000, 0x2491A7D6,0x51FF6C45, + 0xC0730000,0x00000000, 0x24856AD6,0xF4332E86, + 0xC0730800,0x00000000, 0x2479FB05,0x4DAF8837, + 0xC0731000,0x00000000, 0x246F8418,0x913B2B95, + 0xC0731800,0x00000000, 0x24631D8C,0x2D79F179, + 0xC0732000,0x00000000, 0x2457302C,0x5B769158, + 0xC0732800,0x00000000, 0x244C20F1,0x32B53B17, + 0xC0733000,0x00000000, 0x24410F97,0x9B2393BD, + 0xC0733800,0x00000000, 0x2434B228,0x3C4DD490, + 0xC0734000,0x00000000, 0x24291AFD,0x51AA54F3, + 0xC0734800,0x00000000, 0x241E7455,0x17E77100, + 0xC0735000,0x00000000, 0x241278B6,0xF216C0AD, + 0xC0735800,0x00000000, 0x24066838,0x8701F200, + 0xC0736000,0x00000000, 0x23FB2E63,0x38BA7970, + 0xC0736800,0x00000000, 0x23F07C79,0xB49B176B, + 0xC0737000,0x00000000, 0x23E3FFB2,0x0A738C27, + 0xC0737800,0x00000000, 0x23D84281,0x29D08755, + 0xC0738000,0x00000000, 0x23CD6DB9,0x0BD50085, + 0xC0738800,0x00000000, 0x23C1D96F,0x12E8EE34, + 0xC0739000,0x00000000, 0x23B5A700,0xE5004888, + 0xC0739800,0x00000000, 0x23AA4400,0xCD481B54, + 0xC073A000,0x00000000, 0x239FDCA0,0xCBEB1B9C, + 0xC073A800,0x00000000, 0x2393533E,0xBA414FC2, + 0xC073B000,0x00000000, 0x2387714F,0xC3E7F204, + 0xC073B800,0x00000000, 0x237C6FF5,0x7D905CBB, + 0xC073C000,0x00000000, 0x23713F84,0xAF802D9D, + 0xC073C800,0x00000000, 0x2364EC4B,0x61A1CBF8, + 0xC073D000,0x00000000, 0x23596183,0x7CCCEACD, + 0xC073D800,0x00000000, 0x234EC9E1,0xE82630A2, + 0xC073E000,0x00000000, 0x2342AC9A,0x75E2F3FA, + 0xC073E800,0x00000000, 0x2336A72A,0x3ED2E1B6, + 0xC073F000,0x00000000, 0x232B7ABE,0x264F972D, + 0xC073F800,0x00000000, 0x2320AAC9,0x8443E592, + 0xC0740000,0x00000000, 0x231437DF,0xDDE45C6A, + 0xC0740800,0x00000000, 0x230886A7,0x333905C3, + 0xC0741000,0x00000000, 0x22FDC064,0x289898E4, + 0xC0741800,0x00000000, 0x22F20B93,0x267E8023, + 0xC0742000,0x00000000, 0x22E5E3D3,0xD7A9A1CD, + 0xC0742800,0x00000000, 0x22DA8DC9,0x5104F056, + 0xC0743000,0x00000000, 0x22D01B10,0xDC8B3B1D, + 0xC0743800,0x00000000, 0x22C38988,0x1EB5111E, + 0xC0744000,0x00000000, 0x22B7B32A,0x2787541B, + 0xC0744800,0x00000000, 0x22ACBFD7,0xC011BC66, + 0xC0745000,0x00000000, 0x22A16FF8,0x6525E12C, + 0xC0745800,0x00000000, 0x22952711,0xD776FB6B, + 0xC0746000,0x00000000, 0x2289A8CF,0xC4372B65, + 0xC0746800,0x00000000, 0x227F205F,0x0A5A0D1B, + 0xC0747000,0x00000000, 0x2272E10F,0xBCA33CB4, + 0xC0747800,0x00000000, 0x2266E6CC,0xC7F771FA, + 0xC0748000,0x00000000, 0x225BC7EF,0x9182A19B, + 0xC0748800,0x00000000, 0x2250D99B,0x6C4A704B, + 0xC0749000,0x00000000, 0x224470AB,0x81923181, + 0xC0749800,0x00000000, 0x2238CB8C,0xAC98ED11, + 0xC074A000,0x00000000, 0x222E13F7,0x7F074FF1, + 0xC074A800,0x00000000, 0x22223E44,0x14200125, + 0xC074B000,0x00000000, 0x22162151,0xA6F21C90, + 0xC074B800,0x00000000, 0x220AD861,0x18D0259C, + 0xC074C000,0x00000000, 0x2200484F,0x09ADEDE8, + 0xC074C800,0x00000000, 0x21F3C06A,0x02912BE9, + 0xC074D000,0x00000000, 0x21E7F5BD,0x8858B612, + 0xC074D800,0x00000000, 0x21DD109A,0x69C1A855, + 0xC074E000,0x00000000, 0x21D1A0F4,0x3645B77A, + 0xC074E800,0x00000000, 0x21C5627D,0x68926316, + 0xC074F000,0x00000000, 0x21B9F0E4,0x546D1388, + 0xC074F800,0x00000000, 0x21AF77CF,0x21996E13, + 0xC0750000,0x00000000, 0x21A31618,0x5FCDB131, + 0xC0750800,0x00000000, 0x21972722,0x13234163, + 0xC0751000,0x00000000, 0x218C15F9,0xD4DB28FE, + 0xC0751800,0x00000000, 0x218108F0,0xDA2297F6, + 0xC0752000,0x00000000, 0x2174AA16,0xB0CE0F41, + 0xC0752800,0x00000000, 0x21691133,0xAFB55F9B, + 0xC0753000,0x00000000, 0x215E6875,0x9B7A3FAE, + 0xC0753800,0x00000000, 0x21527183,0x6778BB0A, + 0xC0754000,0x00000000, 0x21465F7C,0x32D2440B, + 0xC0754800,0x00000000, 0x213B23CA,0x6AE5A946, + 0xC0755000,0x00000000, 0x2130760C,0x4E8236F6, + 0xC0755800,0x00000000, 0x2123F7E6,0x1237E838, + 0xC0756000,0x00000000, 0x2118390B,0xEE040482, + 0xC0756800,0x00000000, 0x210D623F,0xF1000232, + 0xC0757000,0x00000000, 0x2101D279,0xA1371C02, + 0xC0757800,0x00000000, 0x20F59E8F,0xE4C1BFF5, + 0xC0758000,0x00000000, 0x20EA39C3,0x600DF153, + 0xC0758800,0x00000000, 0x20DFD034,0xD86321A1, + 0xC0759000,0x00000000, 0x20D34BB5,0xFD56A155, + 0xC0759800,0x00000000, 0x20C7682C,0x167D3998, + 0xC075A000,0x00000000, 0x20BC64DF,0x517D5120, + 0xC075A800,0x00000000, 0x20B138CB,0x3F42D666, + 0xC075B000,0x00000000, 0x20A4E423,0x2BC64D77, + 0xC075B800,0x00000000, 0x2099579E,0x5C3A2881, + 0xC075C000,0x00000000, 0x208EBDE1,0x117307D4, + 0xC075C800,0x00000000, 0x2082A552,0xB08B72C1, + 0xC075D000,0x00000000, 0x20769E55,0x6086EEE2, + 0xC075D800,0x00000000, 0x206B7007,0x93E4F9D5, + 0xC075E000,0x00000000, 0x2060A44A,0x100CAC19, + 0xC075E800,0x00000000, 0x20542FFD,0xFEBEEF96, + 0xC075F000,0x00000000, 0x20487D17,0x65E4F251, + 0xC075F800,0x00000000, 0x203DB4CA,0xD3177775, + 0xC0760000,0x00000000, 0x2032048A,0x2883850B, + 0xC0760800,0x00000000, 0x2025DB4B,0x20E9B007, + 0xC0761000,0x00000000, 0x201A836F,0x1FE58BBE, + 0xC0761800,0x00000000, 0x201014C9,0x705995C1, + 0xC0762000,0x00000000, 0x200381EA,0x37BD35B3, + 0xC0762800,0x00000000, 0x1FF7A9EC,0xCDAEDEDF, + 0xC0763000,0x00000000, 0x1FECB4A2,0x6F3C63F6, + 0xC0763800,0x00000000, 0x1FE1692C,0x112F82B6, + 0xC0764000,0x00000000, 0x1FD51ED2,0xB794422F, + 0xC0764800,0x00000000, 0x1FC99ECE,0xD7CA4F47, + 0xC0765000,0x00000000, 0x1FBF143C,0x7BAFE995, + 0xC0765800,0x00000000, 0x1FB2D9B3,0x83BE9AA2, + 0xC0766000,0x00000000, 0x1FA6DDDF,0x1AA00AA3, + 0xC0766800,0x00000000, 0x1F9BBD1A,0xE6E318A9, + 0xC0767000,0x00000000, 0x1F90D309,0xB73CCAE2, + 0xC0767800,0x00000000, 0x1F8468B3,0x7DFC8176, + 0xC0768000,0x00000000, 0x1F78C1E2,0x031AFD5F, + 0xC0768800,0x00000000, 0x1F6E083D,0x9450EFC6, + 0xC0769000,0x00000000, 0x1F623727,0x52F23CC1, + 0xC0769800,0x00000000, 0x1F5618B0,0xF713FE42, + 0xC076A000,0x00000000, 0x1F4ACDE9,0xD2FD7A56, + 0xC076A800,0x00000000, 0x1F4041F5,0xFA0BE761, + 0xC076B000,0x00000000, 0x1F33B8B6,0xB6183219, + 0xC076B800,0x00000000, 0x1F27EC66,0x39F3CAA8, + 0xC076C000,0x00000000, 0x1F1D0545,0x9CAD9872, + 0xC076C800,0x00000000, 0x1F119A14,0xC98634C6, + 0xC076D000,0x00000000, 0x1F055A27,0x1E4A125D, + 0xC076D800,0x00000000, 0x1EF9E6C7,0x4E10DA04, + 0xC076E000,0x00000000, 0x1EEF6B8A,0x7C401BE2, + 0xC076E800,0x00000000, 0x1EE30EA7,0x79E8A6FA, + 0xC076F000,0x00000000, 0x1ED71E1B,0x510F90E2, + 0xC076F800,0x00000000, 0x1ECC0B06,0xBD7CAEEA, + 0xC0770000,0x00000000, 0x1EC1024C,0xB0F7F9E9, + 0xC0770800,0x00000000, 0x1EB4A208,0x4A94CCBB, + 0xC0771000,0x00000000, 0x1EA9076D,0xDE99A035, + 0xC0771800,0x00000000, 0x1E9E5C9A,0xC00731EE, + 0xC0772000,0x00000000, 0x1E926A52,0xAB944B6C, + 0xC0772800,0x00000000, 0x1E8656C3,0x467E16A9, + 0xC0773000,0x00000000, 0x1E7B1935,0xBEAEADB3, + 0xC0773800,0x00000000, 0x1E706FA1,0x69E36941, + 0xC0774000,0x00000000, 0x1E63F01D,0x2422DC00, + 0xC0774800,0x00000000, 0x1E582F9A,0x62295194, + 0xC0775000,0x00000000, 0x1E4D56CB,0x4F3B0E14, + 0xC0775800,0x00000000, 0x1E41CB86,0xE60948B4, + 0xC0776000,0x00000000, 0x1E359622,0x2F00A953, + 0xC0776800,0x00000000, 0x1E2A2F89,0xF0D1BEA5, + 0xC0777000,0x00000000, 0x1E1FC3CD,0xBC9858C5, + 0xC0777800,0x00000000, 0x1E134430,0x305C8533, + 0xC0778000,0x00000000, 0x1E075F0B,0xF938A647, + 0xC0778800,0x00000000, 0x1DFC59CD,0x77E86566, + 0xC0779000,0x00000000, 0x1DF13214,0x6E24A8F9, + 0xC0779800,0x00000000, 0x1DE4DBFE,0x24076EBF, + 0xC077A000,0x00000000, 0x1DD94DBD,0x1738B12B, + 0xC077A800,0x00000000, 0x1DCEB1E4,0xE8BAC000, + 0xC077B000,0x00000000, 0x1DC29E0D,0xC1D08325, + 0xC077B800,0x00000000, 0x1DB69583,0xF3A7A302, + 0xC077C000,0x00000000, 0x1DAB6555,0x2EB32927, + 0xC077C800,0x00000000, 0x1DA09DCD,0x2459813C, + 0xC077D000,0x00000000, 0x1D94281F,0x324A0531, + 0xC077D800,0x00000000, 0x1D88738B,0x52DE5579, + 0xC077E000,0x00000000, 0x1D7DA936,0x0336FDCE, + 0xC077E800,0x00000000, 0x1D71FD83,0xE8AB82AC, + 0xC077F000,0x00000000, 0x1D65D2C5,0xBDE5D77A, + 0xC077F800,0x00000000, 0x1D5A7918,0xF7FB03C7, + 0xC0780000,0x00000000, 0x1D500E84,0x76D3D23E, + 0xC0780800,0x00000000, 0x1D437A4F,0x48F6360D, + 0xC0781000,0x00000000, 0x1D37A0B3,0x0DFEE42C, + 0xC0781800,0x00000000, 0x1D2CA971,0x7D096FFB, + 0xC0782000,0x00000000, 0x1D216262,0x63B5908B, + 0xC0782800,0x00000000, 0x1D151696,0xCEBD1847, + 0xC0783000,0x00000000, 0x1D0994D1,0xD1C4EF99, + 0xC0783800,0x00000000, 0x1CFF081E,0xA825EB44, + 0xC0784000,0x00000000, 0x1CF2D25A,0x296FAD56, + 0xC0784800,0x00000000, 0x1CE6D4F4,0xE8615096, + 0xC0785000,0x00000000, 0x1CDBB24A,0x7537EE42, + 0xC0785800,0x00000000, 0x1CD0CC7A,0x91D0F5EE, + 0xC0786000,0x00000000, 0x1CC460BE,0x95B93B11, + 0xC0786800,0x00000000, 0x1CB8B83B,0x1E6343C8, + 0xC0787000,0x00000000, 0x1CADFC88,0x3BEF20CE, + 0xC0787800,0x00000000, 0x1CA2300D,0x579BD371, + 0xC0788000,0x00000000, 0x1C961013,0xA44A98A8, + 0xC0788800,0x00000000, 0x1C8AC376,0xA1B611AE, + 0xC0789000,0x00000000, 0x1C803B9F,0x63F62777, + 0xC0789800,0x00000000, 0x1C73B106,0x6A278B32, + 0xC078A000,0x00000000, 0x1C67E312,0x8FD5CD18, + 0xC078A800,0x00000000, 0x1C5CF9F5,0x3A824D16, + 0xC078B000,0x00000000, 0x1C519338,0x0AB510C9, + 0xC078B800,0x00000000, 0x1C4551D4,0x141558C6, + 0xC078C000,0x00000000, 0x1C39DCAE,0x3910BF72, + 0xC078C800,0x00000000, 0x1C2F5F4A,0x9F51208F, + 0xC078D000,0x00000000, 0x1C230739,0x7AA8DA7C, + 0xC078D800,0x00000000, 0x1C171518,0x13DBBF70, + 0xC078E000,0x00000000, 0x1C0C0017,0xEAEF1AA2, + 0xC078E800,0x00000000, 0x1C00FBAB,0x1EA0EBAF, + 0xC078F000,0x00000000, 0x1BF499FD,0x08681AF2, + 0xC078F800,0x00000000, 0x1BE8FDAB,0xDCDA40F4, + 0xC0790000,0x00000000, 0x1BDE50C4,0x83C04DCD, + 0xC0790800,0x00000000, 0x1BD26324,0xBD513DE8, + 0xC0791000,0x00000000, 0x1BC64E0D,0xC0B1829F, + 0xC0791800,0x00000000, 0x1BBB0EA5,0x327933E8, + 0xC0792000,0x00000000, 0x1BB06939,0x05C49814, + 0xC0792800,0x00000000, 0x1BA3E857,0x3F05089B, + 0xC0793000,0x00000000, 0x1B98262C,0x84D06CB5, + 0xC0793800,0x00000000, 0x1B8D4B5B,0x24C7B9DD, + 0xC0794000,0x00000000, 0x1B81C496,0xE050B08F, + 0xC0794800,0x00000000, 0x1B758DB7,0xC2749068, + 0xC0795000,0x00000000, 0x1B6A2554,0x7E0513F7, + 0xC0795800,0x00000000, 0x1B5FB76B,0x76A76D99, + 0xC0796000,0x00000000, 0x1B533CAD,0x522DD473, + 0xC0796800,0x00000000, 0x1B4755EF,0x6AB69B91, + 0xC0797000,0x00000000, 0x1B3C4EBF,0xEF2238B1, + 0xC0797800,0x00000000, 0x1B312B60,0x3B20006F, + 0xC0798000,0x00000000, 0x1B24D3DC,0x4927CBDA, + 0xC0798800,0x00000000, 0x1B1943DF,0xAC478133, + 0xC0799000,0x00000000, 0x1B0EA5ED,0x6C2A4D75, + 0xC0799800,0x00000000, 0x1B0296CB,0xA896DE1B, + 0xC079A000,0x00000000, 0x1AF68CB5,0xF6DD5C08, + 0xC079A800,0x00000000, 0x1AEB5AA6,0xF5194C12, + 0xC079B000,0x00000000, 0x1AE09752,0xC02D903D, + 0xC079B800,0x00000000, 0x1AD42043,0x7752EA23, + 0xC079C000,0x00000000, 0x1AC86A02,0xF8B1239C, + 0xC079C800,0x00000000, 0x1ABD9DA5,0xB733DB96, + 0xC079D000,0x00000000, 0x1AB1F680,0x65E4BCB1, + 0xC079D800,0x00000000, 0x1AA5CA43,0xAD52093F, + 0xC079E000,0x00000000, 0x1A9A6EC6,0xD7B289DD, + 0xC079E800,0x00000000, 0x1A900841,0xEF05A000, + 0xC079F000,0x00000000, 0x1A8372B7,0x5137B3C5, + 0xC079F800,0x00000000, 0x1A77977C,0xE70FE08C, + 0xC07A0000,0x00000000, 0x1A6C9E44,0xE7C4C3CF, + 0xC07A0800,0x00000000, 0x1A615B9B,0x5BAF86C5, + 0xC07A1000,0x00000000, 0x1A550E5E,0x1BB09E26, + 0xC07A1800,0x00000000, 0x1A498AD8,0xB0A1CF33, + 0xC07A2000,0x00000000, 0x1A3EFC05,0x8DE3E67A, + 0xC07A2800,0x00000000, 0x1A32CB03,0xAC981201, + 0xC07A3000,0x00000000, 0x1A26CC0E,0x2FDFDC75, + 0xC07A3800,0x00000000, 0x1A1BA77E,0x3ADBB65A, + 0xC07A4000,0x00000000, 0x1A10C5ED,0xFB075673, + 0xC07A4800,0x00000000, 0x1A0458CC,0xC7924DAB, + 0xC07A5000,0x00000000, 0x19F8AE97,0xFCF99F91, + 0xC07A5800,0x00000000, 0x19EDF0D7,0x74199EE5, + 0xC07A6000,0x00000000, 0x19E228F6,0x210807EB, + 0xC07A6800,0x00000000, 0x19D60779,0xAD463813, + 0xC07A7000,0x00000000, 0x19CAB907,0x8362B189, + 0xC07A7800,0x00000000, 0x19C0354B,0x4675AF48, + 0xC07A8000,0x00000000, 0x19B3A959,0x1D939844, + 0xC07A8800,0x00000000, 0x19A7D9C2,0x88934804, + 0xC07A9000,0x00000000, 0x199CEEA9,0x4186E084, + 0xC07A9800,0x00000000, 0x19918C5D,0xF8C6E08D, + 0xC07AA000,0x00000000, 0x19854984,0x48AFD169, + 0xC07AA800,0x00000000, 0x1979D299,0x13E3413F, + 0xC07AB000,0x00000000, 0x196F530F,0x88EF2209, + 0xC07AB800,0x00000000, 0x1962FFCE,0x60ECC469, + 0xC07AC000,0x00000000, 0x19570C18,0x5A2895CC, + 0xC07AC800,0x00000000, 0x194BF52D,0x5B886049, + 0xC07AD000,0x00000000, 0x1940F50C,0x221B0447, + 0xC07AD800,0x00000000, 0x193491F4,0xE90E823E, + 0xC07AE000,0x00000000, 0x1928F3ED,0xA8FB0088, + 0xC07AE800,0x00000000, 0x191E44F2,0xE4D84D72, + 0xC07AF000,0x00000000, 0x19125BF9,0x9B97CBCC, + 0xC07AF800,0x00000000, 0x1906455B,0xA0192538, + 0xC07B0000,0x00000000, 0x18FB0418,0xC4A989D9, + 0xC07B0800,0x00000000, 0x18F062D3,0x212C0EB6, + 0xC07B1000,0x00000000, 0x18E3E094,0x61AF856E, + 0xC07B1800,0x00000000, 0x18D81CC2,0x5489E384, + 0xC07B2000,0x00000000, 0x18CD3FEF,0x6FE84946, + 0xC07B2800,0x00000000, 0x18C1BDA9,0x8EFEF969, + 0xC07B3000,0x00000000, 0x18B58550,0x9DD58108, + 0xC07B3800,0x00000000, 0x18AA1B23,0x061A1D4C, + 0xC07B4000,0x00000000, 0x189FAB0E,0x04ADC91C, + 0xC07B4800,0x00000000, 0x1893352D,0x61A5DA76, + 0xC07B5000,0x00000000, 0x18874CD6,0x69940799, + 0xC07B5800,0x00000000, 0x187C43B6,0xB57C1253, + 0xC07B6000,0x00000000, 0x187124AE,0xA52F9DDC, + 0xC07B6800,0x00000000, 0x1864CBBD,0x99EA7C91, + 0xC07B7000,0x00000000, 0x18593A06,0x19E62B15, + 0xC07B7800,0x00000000, 0x184E99FA,0x99EF5A94, + 0xC07B8000,0x00000000, 0x18428F8C,0x63C3AB07, + 0xC07B8800,0x00000000, 0x183683EB,0x68D0FDDF, + 0xC07B9000,0x00000000, 0x182B4FFC,0xE5772C07, + 0xC07B9800,0x00000000, 0x182090DA,0xE28C66EE, + 0xC07BA000,0x00000000, 0x1814186A,0xCCA762E8, + 0xC07BA800,0x00000000, 0x1808607E,0x55E9E22B, + 0xC07BB000,0x00000000, 0x17FD9219,0xED4B7068, + 0xC07BB800,0x00000000, 0x17F1EF7F,0x9F1DE17B, + 0xC07BC000,0x00000000, 0x17E5C1C4,0xEDE2B7E9, + 0xC07BC800,0x00000000, 0x17DA6478,0xBD79EC79, + 0xC07BD000,0x00000000, 0x17D00201,0xD7FB0DB5, + 0xC07BD800,0x00000000, 0x17C36B22,0x4F59C3FC, + 0xC07BE000,0x00000000, 0x17B78E4A,0x577ADCB4, + 0xC07BE800,0x00000000, 0x17AC931C,0xADBAECD1, + 0xC07BF000,0x00000000, 0x17A154D6,0xF815489C, + 0xC07BF800,0x00000000, 0x17950628,0x9D2E715B, + 0xC07C0000,0x00000000, 0x178980E3,0x72DC48AD, + 0xC07C0800,0x00000000, 0x177EEFF1,0x2B12679C, + 0xC07C1000,0x00000000, 0x1772C3B0,0x0C19D57A, + 0xC07C1800,0x00000000, 0x1766C32A,0xEFC0CE56, + 0xC07C2000,0x00000000, 0x175B9CB6,0x3629A932, + 0xC07C2800,0x00000000, 0x1750BF63,0xF1E0B51D, + 0xC07C3000,0x00000000, 0x174450DE,0x12522184, + 0xC07C3800,0x00000000, 0x1738A4F8,0x9D6682A0, + 0xC07C4000,0x00000000, 0x172DE52B,0x3B08D7C9, + 0xC07C4800,0x00000000, 0x172221E1,0xAE2288C8, + 0xC07C5000,0x00000000, 0x1715FEE3,0x10B7ABB4, + 0xC07C5800,0x00000000, 0x170AAE9C,0x766CBE8F, + 0xC07C6000,0x00000000, 0x17002EF9,0xA093E03C, + 0xC07C6800,0x00000000, 0x16F3A1AE,0xCF312F2D, + 0xC07C7000,0x00000000, 0x16E7D076,0x22C153BF, + 0xC07C7800,0x00000000, 0x16DCE361,0xB00318E2, + 0xC07C8000,0x00000000, 0x16D18586,0x92B0A160, + 0xC07C8800,0x00000000, 0x16C54137,0xBAD595D3, + 0xC07C9000,0x00000000, 0x16B9C887,0xDCFF7642, + 0xC07C9800,0x00000000, 0x16AF46D9,0x373D8059, + 0xC07CA000,0x00000000, 0x16A2F866,0x2B934E56, + 0xC07CA800,0x00000000, 0x1697031C,0x229765A2, + 0xC07CB000,0x00000000, 0x168BEA47,0x0D9F1A19, + 0xC07CB800,0x00000000, 0x1680EE6F,0xBA643F6D, + 0xC07CC000,0x00000000, 0x167489EF,0xEB4F052E, + 0xC07CC800,0x00000000, 0x1668EA33,0x418031DC, + 0xC07CD000,0x00000000, 0x165E3925,0xE1829EDA, + 0xC07CD800,0x00000000, 0x165254D1,0x45509B7D, + 0xC07CE000,0x00000000, 0x16463CAC,0xE362200E, + 0xC07CE800,0x00000000, 0x163AF990,0x73A49DF8, + 0xC07CF000,0x00000000, 0x16305C6F,0xBB2079C6, + 0xC07CF800,0x00000000, 0x1623D8D4,0x8AF3DFF3, + 0xC07D0000,0x00000000, 0x1618135B,0xCFE6D2E6, + 0xC07D0800,0x00000000, 0x160D3488,0x2EDFADD0, + 0xC07D1000,0x00000000, 0x1601B6BE,0xF106327D, + 0xC07D1800,0x00000000, 0x15F57CEC,0xBFDC06DF, + 0xC07D2000,0x00000000, 0x15EA10F5,0x8783A1BE, + 0xC07D2800,0x00000000, 0x15DF9EB5,0x64C99073, + 0xC07D3000,0x00000000, 0x15D32DB0,0x5DA054BB, + 0xC07D3800,0x00000000, 0x15C743C0,0xF46E62F0, + 0xC07D4000,0x00000000, 0x15BC38B1,0xC947E18A, + 0xC07D4800,0x00000000, 0x15B11DFF,0xAB4EA833, + 0xC07D5000,0x00000000, 0x15A4C3A2,0x15131439, + 0xC07D5800,0x00000000, 0x15993030,0x5E94D732, + 0xC07D6000,0x00000000, 0x158E8E0C,0x7038478F, + 0xC07D6800,0x00000000, 0x1582884F,0xF23C7F91, + 0xC07D7000,0x00000000, 0x15767B24,0x482BF236, + 0xC07D7800,0x00000000, 0x156B4556,0xFE2D34BC, + 0xC07D8000,0x00000000, 0x15608A65,0x8A79F58B, + 0xC07D8800,0x00000000, 0x15541095,0x3115AB5F, + 0xC07D9000,0x00000000, 0x154856FD,0x6915A764, + 0xC07D9800,0x00000000, 0x153D8692,0xA3BBCB8C, + 0xC07DA000,0x00000000, 0x1531E881,0x934609FB, + 0xC07DA800,0x00000000, 0x1525B949,0x7E4CD748, + 0xC07DB000,0x00000000, 0x151A5A2E,0xA7BF96DD, + 0xC07DB800,0x00000000, 0x150FF788,0x61811243, + 0xC07DC000,0x00000000, 0x15036390,0x4234EF34, + 0xC07DC800,0x00000000, 0x14F7851B,0x5DD96D4B, + 0xC07DD000,0x00000000, 0x14EC87F8,0xCD392224, + 0xC07DD800,0x00000000, 0x14E14E15,0x37DF2040, + 0xC07DE000,0x00000000, 0x14D4FDF6,0x51F6AC5A, + 0xC07DE800,0x00000000, 0x14C976F2,0x16F04E25, + 0xC07DF000,0x00000000, 0x14BEE3E1,0x7DDAB2DD, + 0xC07DF800,0x00000000, 0x14B2BC5F,0x46D77414, + 0xC07E0000,0x00000000, 0x14A6BA4B,0x26A9CD8A, + 0xC07E0800,0x00000000, 0x149B91F2,0x657DA318, + 0xC07E1000,0x00000000, 0x1490B8DC,0x755E3E18, + 0xC07E1800,0x00000000, 0x148448F2,0x74C3978A, + 0xC07E2000,0x00000000, 0x14789B5C,0xFE32F146, + 0xC07E2800,0x00000000, 0x146DD983,0x8EF5EAD3, + 0xC07E3000,0x00000000, 0x14621ACF,0xFDD7705B, + 0xC07E3800,0x00000000, 0x1455F64F,0xCD50456B, + 0xC07E4000,0x00000000, 0x144AA435,0x793E3BEE, + 0xC07E4800,0x00000000, 0x144028AA,0x715A7BE0, + 0xC07E5000,0x00000000, 0x14339A07,0x7DD59A6E, + 0xC07E5800,0x00000000, 0x1427C72D,0x5CF59618, + 0xC07E6000,0x00000000, 0x141CD81E,0x843F67F6, + 0xC07E6800,0x00000000, 0x14117EB1,0xD767B8A6, + 0xC07E7000,0x00000000, 0x140538EE,0x69433DD8, + 0xC07E7800,0x00000000, 0x13F9BE7A,0x92DD0E81, + 0xC07E8000,0x00000000, 0x13EF3AA7,0xA8605559, + 0xC07E8800,0x00000000, 0x13E2F100,0xD97BD28A, + 0xC07E9000,0x00000000, 0x13D6FA23,0x6BCA0954, + 0xC07E9800,0x00000000, 0x13CBDF64,0xFF8A8827, + 0xC07EA000,0x00000000, 0x13C0E7D5,0xE67AFD77, + 0xC07EA800,0x00000000, 0x13B481EE,0x0DF12057, + 0xC07EB000,0x00000000, 0x13A8E07C,0xA4EEBBE2, + 0xC07EB800,0x00000000, 0x139E2D5D,0x77F36390, + 0xC07EC000,0x00000000, 0x13924DAB,0xB964C046, + 0xC07EC800,0x00000000, 0x13863401,0x893A18D9, + 0xC07ED000,0x00000000, 0x137AEF0C,0x3DCFFEFB, + 0xC07ED800,0x00000000, 0x1370560E,0xD2A8E719, + 0xC07EE000,0x00000000, 0x1363D117,0xB9A41B90, + 0xC07EE800,0x00000000, 0x135809F8,0xF578E6C5, + 0xC07EF000,0x00000000, 0x134D2925,0x5FF1867D, + 0xC07EF800,0x00000000, 0x1341AFD7,0x0558D446, + 0xC07F0000,0x00000000, 0x1335748C,0x27412D46, + 0xC07F0800,0x00000000, 0x132A06CC,0x00B50348, + 0xC07F1000,0x00000000, 0x131F9261,0x9519A49B, + 0xC07F1800,0x00000000, 0x13132636,0x44F972B2, + 0xC07F2000,0x00000000, 0x13073AAF,0x09E3B05D, + 0xC07F2800,0x00000000, 0x12FC2DB1,0x28D83D3D, + 0xC07F3000,0x00000000, 0x12F11753,0x4C78AC15, + 0xC07F3800,0x00000000, 0x12E4BB89,0xB965A182, + 0xC07F4000,0x00000000, 0x12D9265E,0x78D4438D, + 0xC07F4800,0x00000000, 0x12CE8222,0xED342A1E, + 0xC07F5000,0x00000000, 0x12C28116,0x52E75F7D, + 0xC07F5800,0x00000000, 0x12B67260,0x9398284A, + 0xC07F6000,0x00000000, 0x12AB3AB5,0x3D9C73EB, + 0xC07F6800,0x00000000, 0x12A083F2,0xB6FA8E98, + 0xC07F7000,0x00000000, 0x129408C2,0xA36C769C, + 0xC07F7800,0x00000000, 0x12884D80,0x30C21A26, + 0xC07F8000,0x00000000, 0x127D7B0F,0xD8C3ABB6, + 0xC07F8800,0x00000000, 0x1271E186,0x414CB986, + 0xC07F9000,0x00000000, 0x1265B0D1,0x5D45DC40, + 0xC07F9800,0x00000000, 0x125A4FE8,0x94F290DE, + 0xC07FA000,0x00000000, 0x124FEB11,0xF0C5BE05, + 0xC07FA800,0x00000000, 0x12435C01,0x28A2311F, + 0xC07FB000,0x00000000, 0x12377BEF,0xF8C5B2B3, + 0xC07FB800,0x00000000, 0x122C7CD9,0x448D446D, + 0xC07FC000,0x00000000, 0x12214756,0x1A05BEB0, + 0xC07FC800,0x00000000, 0x1214F5C7,0x38C9E64F, + 0xC07FD000,0x00000000, 0x12096D04,0x9B5A68FF, + 0xC07FD800,0x00000000, 0x11FED7D6,0x8466C3F4, + 0xC07FE000,0x00000000, 0x11F2B511,0x5BB3D972, + 0xC07FE800,0x00000000, 0x11E6B16E,0xD3410867, + 0xC07FF000,0x00000000, 0x11DB8732,0xC7342422, + 0xC07FF800,0x00000000, 0x11D0B257,0x848180E7, + 0xC0800000,0x00000000, 0x11C44109,0xEDB20931, + 0xC0800400,0x00000000, 0x11B891C5,0x1DE88206, + 0xC0800800,0x00000000, 0x11ADCDE0,0x6E1AA8B3, + 0xC0800C00,0x00000000, 0x11A213C1,0x0F134487, + 0xC0801000,0x00000000, 0x1195EDBF,0xE1C1D991, + 0xC0801400,0x00000000, 0x118A99D2,0x8A41CB19, + 0xC0801800,0x00000000, 0x1180225D,0xB7D3A3C5, + 0xC0801C00,0x00000000, 0x11739263,0x285698FB, + 0xC0802000,0x00000000, 0x1167BDE8,0x35C64224, + 0xC0802400,0x00000000, 0x115CCCDF,0xBC84EAE3, + 0xC0802800,0x00000000, 0x115177DF,0xC5E1F3B3, + 0xC0802C00,0x00000000, 0x114530A8,0x52B5DF63, + 0xC0803000,0x00000000, 0x1139B471,0x33F452F4, + 0xC0803400,0x00000000, 0x112F2E7A,0xDA7C746B, + 0xC0803800,0x00000000, 0x1122E99E,0x69861BD4, + 0xC0803C00,0x00000000, 0x1116F12E,0x3462E3C8, + 0xC0804000,0x00000000, 0x110BD487,0x2FA2901F, + 0xC0804400,0x00000000, 0x1100E13E,0xA55E0328, + 0xC0804800,0x00000000, 0x10F479EF,0x4FBCCA24, + 0xC0804C00,0x00000000, 0x10E8D6C9,0xD1CC1958, + 0xC0805000,0x00000000, 0x10DE2199,0xA65F706A, + 0xC0805400,0x00000000, 0x10D24688,0xF6BDBA31, + 0xC0805800,0x00000000, 0x10C62B59,0x904F3938, + 0xC0805C00,0x00000000, 0x10BAE48C,0x2191DB9B, + 0xC0806000,0x00000000, 0x10B04FB0,0x66CCC58F, + 0xC0806400,0x00000000, 0x10A3C95D,0xEC92B164, + 0xC0806800,0x00000000, 0x10980099,0xC3D259DE, + 0xC0806C00,0x00000000, 0x108D1DC7,0x01621F8F, + 0xC0807000,0x00000000, 0x1081A8F1,0xCAE9C04F, + 0xC0807400,0x00000000, 0x10756C2E,0xD2BE7F0D, + 0xC0807800,0x00000000, 0x1069FCA6,0x70223E80, + 0xC0807C00,0x00000000, 0x105F8612,0x93BDA225, + 0xC0808000,0x00000000, 0x10531EBF,0x168DD58E, + 0xC0808400,0x00000000, 0x104731A0,0xA8927CAC, + 0xC0808800,0x00000000, 0x103C22B4,0xD28063BD, + 0xC0808C00,0x00000000, 0x103110A9,0x87A99BAF, + 0xC0809000,0x00000000, 0x1024B374,0x85A6AE4A, + 0xC0809400,0x00000000, 0x10191C90,0x6725C394, + 0xC0809800,0x00000000, 0x100E763E,0x0F12CD39, + 0xC0809C00,0x00000000, 0x100279DF,0x84AABC7F, + 0xC080A000,0x00000000, 0x0FF669A0,0x49C014B6, + 0xC080A400,0x00000000, 0x0FEB3017,0xA2269916, + 0xC080A800,0x00000000, 0x0FE07D82,0x6712E6B6, + 0xC080AC00,0x00000000, 0x0FD400F3,0x227AEEB9, + 0xC080B000,0x00000000, 0x0FC84406,0xAB7D71AE, + 0xC080B400,0x00000000, 0x0FBD6F91,0x8AA27EBD, + 0xC080B800,0x00000000, 0x0FB1DA8D,0xA821DDAD, + 0xC080BC00,0x00000000, 0x0FA5A85C,0x8983BC92, + 0xC080C000,0x00000000, 0x0F9A45A6,0x83827EA0, + 0xC080C400,0x00000000, 0x0F8FDEA0,0x5BDE75C9, + 0xC080C800,0x00000000, 0x0F835475,0x017AF871, + 0xC080CC00,0x00000000, 0x0F7772C8,0x26DA58D4, + 0xC080D000,0x00000000, 0x0F6C71BE,0x1205DD8D, + 0xC080D400,0x00000000, 0x0F614099,0x9D823B94, + 0xC080D800,0x00000000, 0x0F54ED9B,0x506932EF, + 0xC080DC00,0x00000000, 0x0F49631A,0xFE97B9B1, + 0xC080E000,0x00000000, 0x0F3ECBD0,0x3CE14DD8, + 0xC080E400,0x00000000, 0x0F32ADC6,0x49926059, + 0xC080E800,0x00000000, 0x0F26A895,0xF42D3418, + 0xC080EC00,0x00000000, 0x0F1B7C77,0x59AA4FF6, + 0xC080F000,0x00000000, 0x0F10ABD5,0x1E4C7042, + 0xC080F400,0x00000000, 0x0F043924,0x7BE94843, + 0xC080F800,0x00000000, 0x0EF88830,0xFB115D59, + 0xC080FC00,0x00000000, 0x0EEDC241,0xD6B1932C, + 0xC0810000,0x00000000, 0x0EE20CB4,0xE0C2F693, + 0xC0810400,0x00000000, 0x0ED5E533,0x4CBEBEC8, + 0xC0810800,0x00000000, 0x0ECA8F73,0xA7E2AB8F, + 0xC0810C00,0x00000000, 0x0EC01C13,0x7309D953, + 0xC0811000,0x00000000, 0x0EB38AC1,0xCD8A5E11, + 0xC0811400,0x00000000, 0x0EA7B4A6,0xABCA1802, + 0xC0811800,0x00000000, 0x0E9CC1A5,0x571D69E9, + 0xC0811C00,0x00000000, 0x0E917110,0x5D1587A6, + 0xC0812000,0x00000000, 0x0E852865,0x75EB0E41, + 0xC0812400,0x00000000, 0x0E79AA6B,0xBEBE254A, + 0xC0812800,0x00000000, 0x0E6F2252,0xCBB76A33, + 0xC0812C00,0x00000000, 0x0E62E23E,0xDA926562, + 0xC0813000,0x00000000, 0x0E56E83C,0x7B04E02F, + 0xC0813400,0x00000000, 0x0E4BC9AD,0x9C3FBD04, + 0xC0813800,0x00000000, 0x0E40DAA9,0xF60C798E, + 0xC0813C00,0x00000000, 0x0E3471F3,0xAF7A72A4, + 0xC0814000,0x00000000, 0x0E28CD1A,0xC69E588E, + 0xC0814400,0x00000000, 0x0E1E15DA,0x6AFC4D3E, + 0xC0814800,0x00000000, 0x0E123F68,0xFC4575DB, + 0xC0814C00,0x00000000, 0x0E0622B4,0xF7502E83, + 0xC0815000,0x00000000, 0x0DFADA10,0x1D510258, + 0xC0815400,0x00000000, 0x0DF04954,0x7693E4F4, + 0xC0815800,0x00000000, 0x0DE3C1A7,0x2292901E, + 0xC0815C00,0x00000000, 0x0DD7F73E,0x3985F587, + 0xC0816000,0x00000000, 0x0DCD126D,0x11767245, + 0xC0816400,0x00000000, 0x0DC1A20F,0x40AC4112, + 0xC0816800,0x00000000, 0x0DB563D4,0xC10E0648, + 0xC0816C00,0x00000000, 0x0DA9F284,0xD43FEA64, + 0xC0817000,0x00000000, 0x0D9F79C8,0x5ED5E0EC, + 0xC0817400,0x00000000, 0x0D93174A,0xD13A901B, + 0xC0817800,0x00000000, 0x0D872895,0xCF19DE71, + 0xC0817C00,0x00000000, 0x0D7C17BC,0xC4943A84, + 0xC0818000,0x00000000, 0x0D710A02,0x5BDDCE90, + 0xC0818400,0x00000000, 0x0D64AB62,0x789B3F6D, + 0xC0818800,0x00000000, 0x0D5912C6,0x280B3FE7, + 0xC0818C00,0x00000000, 0x0D4E6A5D,0xD404B0D4, + 0xC0819000,0x00000000, 0x0D4272AB,0x866D760E, + 0xC0819400,0x00000000, 0x0D3660E3,0x694EB13B, + 0xC0819800,0x00000000, 0x0D2B257E,0x2A2DF540, + 0xC0819C00,0x00000000, 0x0D207714,0x99C8147D, + 0xC081A000,0x00000000, 0x0D13F926,0xAD10B4A7, + 0xC081A400,0x00000000, 0x0D083A90,0xD7D67565, + 0xC081A800,0x00000000, 0x0CFD6417,0xB798615D, + 0xC081AC00,0x00000000, 0x0CF1D397,0xC6B5CE12, + 0xC081B000,0x00000000, 0x0CE59FEB,0x01BCEEA9, + 0xC081B400,0x00000000, 0x0CDA3B68,0x71DFA060, + 0xC081B800,0x00000000, 0x0CCFD233,0xA0E64E00, + 0xC081BC00,0x00000000, 0x0CC34CEB,0xCB9926B8, + 0xC081C000,0x00000000, 0x0CB769A3,0xE6B296E5, + 0xC081C400,0x00000000, 0x0CAC66A7,0x33F22068, + 0xC081C800,0x00000000, 0x0CA139DF,0xC14E1511, + 0xC081CC00,0x00000000, 0x0C94E572,0x97962240, + 0xC081D000,0x00000000, 0x0C895935,0x3F25F783, + 0xC081D400,0x00000000, 0x0C7EBFCE,0xA575BA73, + 0xC081D800,0x00000000, 0x0C72A67E,0x0F56D28A, + 0xC081DC00,0x00000000, 0x0C669FC0,0x88158C63, + 0xC081E000,0x00000000, 0x0C5B71C0,0x1B3DED84, + 0xC081E400,0x00000000, 0x0C50A555,0x41C161E9, + 0xC081E800,0x00000000, 0x0C443142,0x1E359EAD, + 0xC081EC00,0x00000000, 0x0C387EA0,0x94383D7A, + 0xC081F000,0x00000000, 0x0C2DB6A7,0xC6F5DCCD, + 0xC081F400,0x00000000, 0x0C2205AB,0x71D3E305, + 0xC081F800,0x00000000, 0x0C15DCAA,0x0CF9CDC5, + 0xC081FC00,0x00000000, 0x0C0A8518,0xD08CBA9A, + 0xC0820000,0x00000000, 0x0C0015CB,0xA207FDA9, + 0xC0820400,0x00000000, 0x0BF38323,0x6C479105, + 0xC0820800,0x00000000, 0x0BE7AB68,0xBD9864AA, + 0xC0820C00,0x00000000, 0x0BDCB66F,0x5253581E, + 0xC0821000,0x00000000, 0x0BD16A43,0x9BF9113A, + 0xC0821400,0x00000000, 0x0BC52025,0xD1A0DBF5, + 0xC0821800,0x00000000, 0x0BB9A06A,0x31B3FFAD, + 0xC0821C00,0x00000000, 0x0BAF162F,0x7A377C4D, + 0xC0822000,0x00000000, 0x0BA2DAE2,0x2B815A8F, + 0xC0822400,0x00000000, 0x0B96DF4E,0x3E5371D4, + 0xC0822800,0x00000000, 0x0B8BBED8,0x43BB3EF0, + 0xC0822C00,0x00000000, 0x0B80D417,0xD785EDD7, + 0xC0823000,0x00000000, 0x0B7469FB,0x2BF30362, + 0xC0823400,0x00000000, 0x0B68C36F,0x81EC1B2B, + 0xC0823800,0x00000000, 0x0B5E0A1F,0xC40034A2, + 0xC0823C00,0x00000000, 0x0B52384B,0xC8E64C4B, + 0xC0824000,0x00000000, 0x0B461A13,0xBCEC2990, + 0xC0824400,0x00000000, 0x0B3ACF98,0x2F74E138, + 0xC0824800,0x00000000, 0x0B3042FB,0x010675D2, + 0xC0824C00,0x00000000, 0x0B23B9F3,0x5A771BCB, + 0xC0825000,0x00000000, 0x0B17EDE6,0x55271177, + 0xC0825400,0x00000000, 0x0B0D0717,0x8E742492, + 0xC0825800,0x00000000, 0x0B019B2F,0x659409CA, + 0xC0825C00,0x00000000, 0x0AF55B7D,0xF0EA4C20, + 0xC0826000,0x00000000, 0x0AE9E867,0x2B833817, + 0xC0826400,0x00000000, 0x0ADF6D82,0xF48373C8, + 0xC0826800,0x00000000, 0x0AD30FD9,0x73DD2691, + 0xC0826C00,0x00000000, 0x0AC71F8E,0x7C1975D9, + 0xC0827000,0x00000000, 0x0ABC0CC8,0xFD684DF1, + 0xC0827400,0x00000000, 0x0AB1035D,0xC8120182, + 0xC0827800,0x00000000, 0x0AA4A353,0x9108D490, + 0xC0827C00,0x00000000, 0x0A9908FF,0xBA07361B, + 0xC0828000,0x00000000, 0x0A8E5E82,0x3A3B0994, + 0xC0828400,0x00000000, 0x0A826B7A,0x5716D93A, + 0xC0828800,0x00000000, 0x0A765829,0xF0EF7C8F, + 0xC0828C00,0x00000000, 0x0A6B1AE8,0xD4157ABA, + 0xC0829000,0x00000000, 0x0A6070A9,0x4E1F9059, + 0xC0829400,0x00000000, 0x0A53F15D,0x41FDE003, + 0xC0829800,0x00000000, 0x0A48311E,0xB45C7CA5, + 0xC0829C00,0x00000000, 0x0A3D58A2,0x5DE61EED, + 0xC082A000,0x00000000, 0x0A31CCA4,0x9BF94C40, + 0xC082A400,0x00000000, 0x0A25977C,0xC4A8696A, + 0xC082A800,0x00000000, 0x0A1A312E,0x5E7AD231, + 0xC082AC00,0x00000000, 0x0A0FC5CB,0xBDF91826, + 0xC082B000,0x00000000, 0x0A034565,0x85D7102A, + 0xC082B400,0x00000000, 0x09F76083,0x36EA2F37, + 0xC082B800,0x00000000, 0x09EC5B94,0xA8A1E898, + 0xC082BC00,0x00000000, 0x09E13328,0x84632FA5, + 0xC082C000,0x00000000, 0x09D4DD4D,0x0D12C071, + 0xC082C400,0x00000000, 0x09C94F53,0x5B837056, + 0xC082C800,0x00000000, 0x09BEB3D1,0xBC502A62, + 0xC082CC00,0x00000000, 0x09B29F38,0xABE56891, + 0xC082D000,0x00000000, 0x09A696EE,0x8DA1D378, + 0xC082D400,0x00000000, 0x099B670D,0x0A4D66C9, + 0xC082D800,0x00000000, 0x09909ED7,0xEDE30E86, + 0xC082DC00,0x00000000, 0x09842962,0xD363CE53, + 0xC082E000,0x00000000, 0x09787513,0xE7E86E26, + 0xC082E400,0x00000000, 0x096DAB12,0x3D2368AB, + 0xC082E800,0x00000000, 0x0961FEA4,0xC133D172, + 0xC082EC00,0x00000000, 0x0955D424,0x21266122, + 0xC082F000,0x00000000, 0x094A7AC2,0x02AC7312, + 0xC082F400,0x00000000, 0x09400F86,0x43D95176, + 0xC082F800,0x00000000, 0x09337B88,0x03654D1B, + 0xC082FC00,0x00000000, 0x0927A22E,0x69C901B3, + 0xC0830000,0x00000000, 0x091CAB3D,0xAC71D32F, + 0xC0830400,0x00000000, 0x09116379,0x818394A3, + 0xC0830800,0x00000000, 0x090517E9,0x6495D782, + 0xC0830C00,0x00000000, 0x08F9966C,0x8B4FF487, + 0xC0831000,0x00000000, 0x08EF0A10,0xE423A904, + 0xC0831400,0x00000000, 0x08E2D388,0x5B3416BE, + 0xC0831800,0x00000000, 0x08D6D663,0x7CF293E3, + 0xC0831C00,0x00000000, 0x08CBB407,0x246EEAD3, + 0xC0832000,0x00000000, 0x08C0CD88,0x48CA512E, + 0xC0832400,0x00000000, 0x08B46205,0xC3EFDF2E, + 0xC0832800,0x00000000, 0x08A8B9C8,0x023C95F8, + 0xC0832C00,0x00000000, 0x089DFE69,0xAFA213A3, + 0xC0833000,0x00000000, 0x08923131,0x5B8B02C6, + 0xC0833400,0x00000000, 0x08861175,0xDFD2DE88, + 0xC0833800,0x00000000, 0x087AC524,0x5665858A, + 0xC0833C00,0x00000000, 0x08703CA4,0x052D0954, + 0xC0834000,0x00000000, 0x0863B242,0x93142DAB, + 0xC0834400,0x00000000, 0x0857E492,0x15499393, + 0xC0834800,0x00000000, 0x084CFBC6,0x76A188E2, + 0xC0834C00,0x00000000, 0x08419452,0x3895364A, + 0xC0835000,0x00000000, 0x0835532A,0x610E58A3, + 0xC0835400,0x00000000, 0x0829DE4D,0x7461F2A9, + 0xC0835800,0x00000000, 0x081F6142,0x52E8284B, + 0xC0835C00,0x00000000, 0x0813086A,0xFD538E67, + 0xC0836000,0x00000000, 0x0807168A,0xAE316C71, + 0xC0836400,0x00000000, 0x07FC01D9,0x7B51D108, + 0xC0836800,0x00000000, 0x07F0FCBB,0xCB435662, + 0xC0836C00,0x00000000, 0x07E49B47,0xCDB567F7, + 0xC0837000,0x00000000, 0x07D8FF3D,0x1B9CB882, + 0xC0837400,0x00000000, 0x07CE52AB,0x3FE7C08D, + 0xC0837800,0x00000000, 0x07C2644B,0xF58EA085, + 0xC0837C00,0x00000000, 0x07B64F73,0xDF4E7A26, + 0xC0838000,0x00000000, 0x07AB1057,0x9E40BCD8, + 0xC0838400,0x00000000, 0x07A06A40,0x831F3461, + 0xC0838800,0x00000000, 0x0793E996,0xE012FEE2, + 0xC0838C00,0x00000000, 0x078827B0,0x3F9F6E83, + 0xC0839000,0x00000000, 0x077D4D31,0x7BCD311C, + 0xC0839400,0x00000000, 0x0771C5B4,0x26DD8383, + 0xC0839800,0x00000000, 0x07658F11,0xD0FDA401, + 0xC0839C00,0x00000000, 0x075A26F8,0x47C58BC3, + 0xC083A000,0x00000000, 0x074FB968,0xB133627C, + 0xC083A400,0x00000000, 0x07433DE2,0x2F0F7B7D, + 0xC083A800,0x00000000, 0x07375766,0x161D6EFA, + 0xC083AC00,0x00000000, 0x072C5086,0x6E65BA35, + 0xC083B000,0x00000000, 0x07212C73,0xE5BBD5FC, + 0xC083B400,0x00000000, 0x0714D52A,0xAFA195A6, + 0xC083B800,0x00000000, 0x07094575,0x522F0869, + 0xC083BC00,0x00000000, 0x06FEA7D9,0x7F9D74A6, + 0xC083C000,0x00000000, 0x06F297F6,0x1E22C99D, + 0xC083C400,0x00000000, 0x06E68E20,0x037A51BF, + 0xC083C800,0x00000000, 0x06DB5C5E,0x2537C88E, + 0xC083CC00,0x00000000, 0x06D0985D,0x21B4917C, + 0xC083D000,0x00000000, 0x06C42186,0x9A4110E5, + 0xC083D400,0x00000000, 0x06B86B8A,0xF4ADCC6C, + 0xC083D800,0x00000000, 0x06AD9F81,0x3776CA1F, + 0xC083DC00,0x00000000, 0x06A1F7A0,0xCDD0F45A, + 0xC083E000,0x00000000, 0x0695CBA1,0x87F85526, + 0xC083E400,0x00000000, 0x068A706F,0x3CAEED22, + 0xC083E800,0x00000000, 0x06800943,0x578974D3, + 0xC083EC00,0x00000000, 0x067373EF,0x91BB2152, + 0xC083F000,0x00000000, 0x066798F7,0xAEF4551C, + 0xC083F400,0x00000000, 0x065CA010,0x63C4A31B, + 0xC083F800,0x00000000, 0x06515CB2,0x0CAC7D62, + 0xC083FC00,0x00000000, 0x06450FB0,0x2D890D3D, + 0xC0840000,0x00000000, 0x06398C72,0xCA0CAE46, + 0xC0840400,0x00000000, 0x062EFDF7,0x07A3A70D, + 0xC0840800,0x00000000, 0x0622CC31,0x688C252A, + 0xC0840C00,0x00000000, 0x0616CD7C,0x3586C936, + 0xC0841000,0x00000000, 0x060BA93A,0x3CB53A35, + 0xC0841400,0x00000000, 0x0600C6FB,0x48D9F88F, + 0xC0841800,0x00000000, 0x05F45A13,0x763AE1F1, + 0xC0841C00,0x00000000, 0x05E8B024,0x461790A0, + 0xC0842000,0x00000000, 0x05DDF2B8,0x2C19897E, + 0xC0842400,0x00000000, 0x05D22A19,0xB31ECAA5, + 0xC0842800,0x00000000, 0x05C608DB,0x5EB484AD, + 0xC0842C00,0x00000000, 0x05BABAB4,0x908B9BAB, + 0xC0843000,0x00000000, 0x05B0364F,0x82109118, + 0xC0843400,0x00000000, 0x05A3AA94,0xCB3E1403, + 0xC0843800,0x00000000, 0x0597DB41,0x7881EFAD, + 0xC0843C00,0x00000000, 0x058CF079,0xC8459DD0, + 0xC0844000,0x00000000, 0x05818D77,0xB8A44AD7, + 0xC0844400,0x00000000, 0x05754ADA,0x1035B28E, + 0xC0844800,0x00000000, 0x0569D437,0xAD527EDA, + 0xC0844C00,0x00000000, 0x055F5506,0x78268673, + 0xC0845000,0x00000000, 0x055300FF,0x6C7C2E28, + 0xC0845400,0x00000000, 0x05470D8A,0x640274EF, + 0xC0845800,0x00000000, 0x053BF6EE,0x3CA69D34, + 0xC0845C00,0x00000000, 0x0530F61C,0x646F53FB, + 0xC0846000,0x00000000, 0x0524933F,0x2D676E53, + 0xC0846400,0x00000000, 0x0518F57E,0x4B4F6DF1, + 0xC0846800,0x00000000, 0x050E46D8,0xE33D72F8, + 0xC0846C00,0x00000000, 0x05025D20,0x60BCF3B2, + 0xC0847000,0x00000000, 0x04F646C1,0x33183202, + 0xC0847400,0x00000000, 0x04EB05CA,0x8713EFBB, + 0xC0847800,0x00000000, 0x04E063DA,0x37CD3C33, + 0xC0847C00,0x00000000, 0x04D3E1D3,0x862115AA, + 0xC0848000,0x00000000, 0x04C81E45,0x782FC195, + 0xC0848400,0x00000000, 0x04BD41C5,0x0F8FBFB0, + 0xC0848800,0x00000000, 0x04B1BEC6,0x665408BB, + 0xC0848C00,0x00000000, 0x04A586AA,0x257495B1, + 0xC0849000,0x00000000, 0x049A1CC6,0x2C31E026, + 0xC0849400,0x00000000, 0x048FAD0A,0x78B277BE, + 0xC0849800,0x00000000, 0x04833661,0xC61DA1B7, + 0xC0849C00,0x00000000, 0x04774E4C,0x82E92E0E, + 0xC084A000,0x00000000, 0x046C457C,0x838EC18B, + 0xC084A400,0x00000000, 0x046125C1,0xE452B8CC, + 0xC084A800,0x00000000, 0x0454CD0B,0x7E05A5C6, + 0xC084AC00,0x00000000, 0x04493B9B,0x21A83A1F, + 0xC084B000,0x00000000, 0x043E9BE5,0xED8B2664, + 0xC084B400,0x00000000, 0x043290B6,0x64F40B56, + 0xC084B800,0x00000000, 0x04268554,0xE847D59B, + 0xC084BC00,0x00000000, 0x041B51B3,0x6A5CC22B, + 0xC084C000,0x00000000, 0x041091E4,0xDC3968C8, + 0xC084C400,0x00000000, 0x040419AD,0x719B17A8, + 0xC084C800,0x00000000, 0x03F86205,0xB914C66C, + 0xC084CC00,0x00000000, 0x03ED93F4,0xB42D4482, + 0xC084D000,0x00000000, 0x03E1F09F,0x9699E8FA, + 0xC084D400,0x00000000, 0x03D5C322,0x40240796, + 0xC084D800,0x00000000, 0x03CA6620,0x7D01DE07, + 0xC084DC00,0x00000000, 0x03C00302,0xDC246720, + 0xC084E000,0x00000000, 0x03B36C5A,0x1621103F, + 0xC084E400,0x00000000, 0x03A78FC4,0x8BB35116, + 0xC084E800,0x00000000, 0x039C94E7,0x769839F2, + 0xC084EC00,0x00000000, 0x039155ED,0x3C6B9E1E, + 0xC084F000,0x00000000, 0x0385077A,0x2B3A069B, + 0xC084F400,0x00000000, 0x0379827C,0xEC656F24, + 0xC084F800,0x00000000, 0x036EF1E1,0xE2DFE53B, + 0xC084FC00,0x00000000, 0x0362C4DD,0x526B80BB, + 0xC0850000,0x00000000, 0x0356C498,0x66B51C22, + 0xC0850400,0x00000000, 0x034B9E71,0x8AE94AF2, + 0xC0850800,0x00000000, 0x0340C070,0xD6B59CA4, + 0xC0850C00,0x00000000, 0x03345224,0x419E607D, + 0xC0851000,0x00000000, 0x0328A684,0x4C05657D, + 0xC0851400,0x00000000, 0x031DE70B,0x379EE75F, + 0xC0851800,0x00000000, 0x03122304,0xCE8D412E, + 0xC0851C00,0x00000000, 0x03060044,0x3841D62C, + 0xC0852000,0x00000000, 0x02FAB048,0xDC506EC0, + 0xC0852400,0x00000000, 0x02F02FFD,0x76BA5F10, + 0xC0852800,0x00000000, 0x02E3A2EA,0x01C991EE, + 0xC0852C00,0x00000000, 0x02D7D1F4,0x7D652759, + 0xC0853000,0x00000000, 0x02CCE531,0x81A80DE5, + 0xC0853400,0x00000000, 0x02C1869F,0xE4B63400, + 0xC0853800,0x00000000, 0x02B5428C,0xFD1C5F1E, + 0xC0853C00,0x00000000, 0x02A9CA25,0xD4CBDADB, + 0xC0854000,0x00000000, 0x029F48CF,0x6261D064, + 0xC0854400,0x00000000, 0x0292F996,0xC035DD46, + 0xC0854800,0x00000000, 0x0287048D,0x9C2DCB01, + 0xC0854C00,0x00000000, 0x027BEC07,0x3FBD3202, + 0xC0855000,0x00000000, 0x0270EF7F,0x9293E5DA, + 0xC0855400,0x00000000, 0x02648B39,0xAEE5D690, + 0xC0855800,0x00000000, 0x0258EBC3,0x47A39184, + 0xC0855C00,0x00000000, 0x024E3B0B,0x226F71EF, + 0xC0856000,0x00000000, 0x024255F7,0x978A67A0, + 0xC0856400,0x00000000, 0x02363E11,0xEAF9B07D, + 0xC0856800,0x00000000, 0x022AFB41,0x8CF3E80F, + 0xC0856C00,0x00000000, 0x02205D76,0x6B3044CB, + 0xC0857000,0x00000000, 0x0213DA13,0x32F99EDE, + 0xC0857400,0x00000000, 0x020814DE,0x5C9E7BBA, + 0xC0857800,0x00000000, 0x01FD365D,0x1770A040, + 0xC0857C00,0x00000000, 0x01F1B7DB,0x594EDA35, + 0xC0858000,0x00000000, 0x01E57E45,0xC0C5B59D, + 0xC0858400,0x00000000, 0x01DA1298,0x0A327D8C, + 0xC0858800,0x00000000, 0x01CFA0B1,0x12945ED6, + 0xC0858C00,0x00000000, 0x01C32EE4,0x49DD2E00, + 0xC0859000,0x00000000, 0x01B74536,0x7BEACEC7, + 0xC0859400,0x00000000, 0x01AC3A76,0xE66ED2E1, + 0xC0859800,0x00000000, 0x01A11F12,0x7F22EEA9, + 0xC0859C00,0x00000000, 0x0194C4EF,0x7702704E, + 0xC085A000,0x00000000, 0x018931C4,0xC86F15C5, + 0xC085A400,0x00000000, 0x017E8FF7,0x04478297, + 0xC085A800,0x00000000, 0x01728979,0x7F3EB1AF, + 0xC085AC00,0x00000000, 0x01667C8D,0x3AB3B33F, + 0xC085B000,0x00000000, 0x015B470C,0xD81CA546, + 0xC085B400,0x00000000, 0x01508B6F,0x1C7574DA, + 0xC085B800,0x00000000, 0x014411D7,0x58400B4D, + 0xC085BC00,0x00000000, 0x01385884,0x33AA5B26, + 0xC085C000,0x00000000, 0x012D886C,0xB184CAE4, + 0xC085C400,0x00000000, 0x0121E9A1,0x1A7DB725, + 0xC085C800,0x00000000, 0x0115BAA6,0x485E5782, + 0xC085CC00,0x00000000, 0x010A5BD5,0xC21397D5, + 0xC085D000,0x00000000, 0x00FFF989,0xA16D0DBB, + 0xC085D400,0x00000000, 0x00F364C7,0x8F6F8FDB, + 0xC085D800,0x00000000, 0x00E78694,0xFE9F73CC, + 0xC085DC00,0x00000000, 0x00DC89C2,0xE339B392, + 0xC085E000,0x00000000, 0x00D14F2B,0x0FB9307F, + 0xC085E400,0x00000000, 0x00C4FF47,0x5C68CA02, + 0xC085E800,0x00000000, 0x00B9788A,0xF0D610E6, + 0xC085EC00,0x00000000, 0x00AEE5D1,0x74018A3B, + 0xC085F000,0x00000000, 0x00A2BD8C,0x17B493DC, + 0xC085F400,0x00000000, 0x0096BBB8,0x0F231E3D, + 0xC085F800,0x00000000, 0x008B93AD,0x0D66DEFD, + 0xC085FC00,0x00000000, 0x0080B9E8,0xF15E599E, + 0xC0860000,0x00000000, 0x00744A38,0x24E5285F, + 0xC0860400,0x00000000, 0x00689CE8,0x128F015B, + 0xC0860800,0x00000000, 0x005DDB62,0xD06B3019, + 0xC0860C00,0x00000000, 0x00521BF2,0xACC26F65, + 0xC0861000,0x00000000, 0x0045F7B0,0x6B2C0FE5, + 0xC0861400,0x00000000, 0x003AA5E1,0x381DE881, + 0xC0861800,0x00000000, 0x003029AD,0xE2342558, + 0xC0861C00,0x00000000, 0x00239B42,0x358BDF31, + 0xC0862000,0x00000000, 0x0017C8AB,0x2288C9AB, + }; + +LOCAL_D const TUint32 LnTest[] = + { + 0x3FD00000,0x00000000, 0xBFF62E42,0xFEFA39EF, + 0x3FD01062,0x4DD2F1AA, 0xBFF61DE9,0x0EED76F7, + 0x3FD020C4,0x9BA5E354, 0xBFF60D9F,0xC3B96425, + 0x3FD03126,0xE978D4FE, 0xBFF5FD66,0xFB9E280A, + 0x3FD04189,0x374BC6A8, 0xBFF5ED3E,0x95422881, + 0x3FD051EB,0x851EB852, 0xBFF5DD26,0x6FB06F4F, + 0x3FD0624D,0xD2F1A9FC, 0xBFF5CD1E,0x6A5716C4, + 0x3FD072B0,0x20C49BA6, 0xBFF5BD26,0x6505BE3E, + 0x3FD08312,0x6E978D50, 0xBFF5AD3E,0x3FEC065D, + 0x3FD09374,0xBC6A7EFA, 0xBFF59D65,0xDB9814AF, + 0x3FD0A3D7,0x0A3D70A4, 0xBFF58D9D,0x18F51EBC, + 0x3FD0B439,0x5810624E, 0xBFF57DE3,0xD949FC2E, + 0x3FD0C49B,0xA5E353F8, 0xBFF56E39,0xFE37C000, + 0x3FD0D4FD,0xF3B645A2, 0xBFF55E9F,0x69B8587E, + 0x3FD0E560,0x4189374C, 0xBFF54F13,0xFE1D35F8, + 0x3FD0F5C2,0x8F5C28F6, 0xBFF53F97,0x9E0DF7F8, + 0x3FD10624,0xDD2F1AA0, 0xBFF5302A,0x2C8720D9, + 0x3FD11687,0x2B020C4A, 0xBFF520CB,0x8CD8CF9D, + 0x3FD126E9,0x78D4FDF4, 0xBFF5117B,0xA2A57FDC, + 0x3FD1374B,0xC6A7EF9E, 0xBFF5023A,0x51E0CFA5, + 0x3FD147AE,0x147AE148, 0xBFF4F307,0x7ECE4B36, + 0x3FD15810,0x624DD2F2, 0xBFF4E3E3,0x0E003E69, + 0x3FD16872,0xB020C49C, 0xBFF4D4CC,0xE4568BAF, + 0x3FD178D4,0xFDF3B646, 0xBFF4C5C4,0xE6FD887D, + 0x3FD18937,0x4BC6A7F0, 0xBFF4B6CA,0xFB6CDF16, + 0x3FD19999,0x9999999A, 0xBFF4A7DF,0x07667582, + 0x3FD1A9FB,0xE76C8B44, 0xBFF49900,0xF0F559A7, + 0x3FD1BA5E,0x353F7CEE, 0xBFF48A30,0x9E6CB255, + 0x3FD1CAC0,0x83126E98, 0xBFF47B6D,0xF666B540, + 0x3FD1DB22,0xD0E56042, 0xBFF46CB8,0xDFC3A1B8, + 0x3FD1EB85,0x1EB851EC, 0xBFF45E11,0x41A8C00F, + 0x3FD1FBE7,0x6C8B4396, 0xBFF44F77,0x037F6597, + 0x3FD20C49,0xBA5E353F, 0xBFF440EA,0x0CF3FD13, + 0x3FD21CAC,0x083126E9, 0xBFF4326A,0x45F5138A, + 0x3FD22D0E,0x56041893, 0xBFF423F7,0x96B2696E, + 0x3FD23D70,0xA3D70A3D, 0xBFF41591,0xE79C07EB, + 0x3FD24DD2,0xF1A9FBE7, 0xBFF40739,0x21615A50, + 0x3FD25E35,0x3F7CED91, 0xBFF3F8ED,0x2CF04B8F, + 0x3FD26E97,0x8D4FDF3B, 0xBFF3EAAD,0xF3746796, + 0x3FD27EF9,0xDB22D0E5, 0xBFF3DC7B,0x5E56009A, + 0x3FD28F5C,0x28F5C28F, 0xBFF3CE55,0x57395819, + 0x3FD29FBE,0x76C8B439, 0xBFF3C03B,0xC7FDCB97, + 0x3FD2B020,0xC49BA5E3, 0xBFF3B22E,0x9ABD04F9, + 0x3FD2C083,0x126E978D, 0xBFF3A42D,0xB9CA2E6F, + 0x3FD2D0E5,0x60418937, 0xBFF39639,0x0FB129D0, + 0x3FD2E147,0xAE147AE1, 0xBFF38850,0x8735CB6B, + 0x3FD2F1A9,0xFBE76C8B, 0xBFF37A74,0x0B531820, + 0x3FD3020C,0x49BA5E35, 0xBFF36CA3,0x873A86CA, + 0x3FD3126E,0x978D4FDF, 0xBFF35EDE,0xE65344D6, + 0x3FD322D0,0xE5604189, 0xBFF35126,0x14397DFF, + 0x3FD33333,0x33333333, 0xBFF34378,0xFCBDA721, + 0x3FD34395,0x810624DD, 0xBFF335D7,0x8BE3CC08, + 0x3FD353F7,0xCED91687, 0xBFF32841,0xADE2E03D, + 0x3FD3645A,0x1CAC0831, 0xBFF31AB7,0x4F2412B4, + 0x3FD374BC,0x6A7EF9DB, 0xBFF30D38,0x5C42244A, + 0x3FD3851E,0xB851EB85, 0xBFF2FFC4,0xC208C11A, + 0x3FD39581,0x0624DD2F, 0xBFF2F25C,0x6D73DC81, + 0x3FD3A5E3,0x53F7CED9, 0xBFF2E4FF,0x4BAF0FD0, + 0x3FD3B645,0xA1CAC083, 0xBFF2D7AD,0x4A14FBA3, + 0x3FD3C6A7,0xEF9DB22D, 0xBFF2CA66,0x562EABC7, + 0x3FD3D70A,0x3D70A3D7, 0xBFF2BD2A,0x5DB2FDA2, + 0x3FD3E76C,0x8B439581, 0xBFF2AFF9,0x4E86091C, + 0x3FD3F7CE,0xD916872B, 0xBFF2A2D3,0x16B88BEE, + 0x3FD40831,0x26E978D5, 0xBFF295B7,0xA4875754, + 0x3FD41893,0x74BC6A7F, 0xBFF288A6,0xE65AC018, + 0x3FD428F5,0xC28F5C29, 0xBFF27BA0,0xCAC610E1, + 0x3FD43958,0x10624DD3, 0xBFF26EA5,0x4086FEC6, + 0x3FD449BA,0x5E353F7D, 0xBFF261B4,0x36852010, + 0x3FD45A1C,0xAC083127, 0xBFF254CD,0x9BD16529, + 0x3FD46A7E,0xF9DB22D1, 0xBFF247F1,0x5FA593AC, + 0x3FD47AE1,0x47AE147B, 0xBFF23B1F,0x7163C380, + 0x3FD48B43,0x95810625, 0xBFF22E57,0xC095DE09, + 0x3FD49BA5,0xE353F7CF, 0xBFF2219A,0x3CED1F52, + 0x3FD4AC08,0x3126E979, 0xBFF214E6,0xD6419934, + 0x3FD4BC6A,0x7EF9DB23, 0xBFF2083D,0x7C91B867, + 0x3FD4CCCC,0xCCCCCCCD, 0xBFF1FB9E,0x2001CB78, + 0x3FD4DD2F,0x1A9FBE77, 0xBFF1EF08,0xB0DB8B9D, + 0x3FD4ED91,0x6872B021, 0xBFF1E27D,0x1F8DA75D, + 0x3FD4FDF3,0xB645A1CB, 0xBFF1D5FB,0x5CAB4EFF, + 0x3FD50E56,0x04189375, 0xBFF1C983,0x58EBC2BD, + 0x3FD51EB8,0x51EB851F, 0xBFF1BD15,0x0529E2B4, + 0x3FD52F1A,0x9FBE76C9, 0xBFF1B0B0,0x5263C081, + 0x3FD53F7C,0xED916873, 0xBFF1A455,0x31BA328B, + 0x3FD54FDF,0x3B645A1D, 0xBFF19803,0x947068F1, + 0x3FD56041,0x89374BC7, 0xBFF18BBB,0x6BEB840F, + 0x3FD570A3,0xD70A3D71, 0xBFF17F7C,0xA9B22C98, + 0x3FD58106,0x24DD2F1B, 0xBFF17347,0x3F6C2D40, + 0x3FD59168,0x72B020C5, 0xBFF1671B,0x1EE20DE8, + 0x3FD5A1CA,0xC083126F, 0xBFF15AF8,0x39FCB045, + 0x3FD5B22D,0x0E560419, 0xBFF14EDE,0x82C4EE07, + 0x3FD5C28F,0x5C28F5C3, 0xBFF142CD,0xEB63386A, + 0x3FD5D2F1,0xA9FBE76D, 0xBFF136C6,0x661F3935, + 0x3FD5E353,0xF7CED917, 0xBFF12AC7,0xE55F751B, + 0x3FD5F3B6,0x45A1CAC1, 0xBFF11ED2,0x5BA8EF7B, + 0x3FD60418,0x9374BC6A, 0xBFF112E5,0xBB9ECF78, + 0x3FD6147A,0xE147AE14, 0xBFF10701,0xF8020663, + 0x3FD624DD,0x2F1A9FBE, 0xBFF0FB27,0x03B0F76F, + 0x3FD6353F,0x7CED9168, 0xBFF0EF54,0xD1A720AE, + 0x3FD645A1,0xCAC08312, 0xBFF0E38B,0x54FCC54A, + 0x3FD65604,0x189374BC, 0xBFF0D7CA,0x80E69901, + 0x3FD66666,0x66666666, 0xBFF0CC12,0x48B56CCC, + 0x3FD676C8,0xB4395810, 0xBFF0C062,0x9FD5DCC0, + 0x3FD6872B,0x020C49BA, 0xBFF0B4BB,0x79CFFF14, + 0x3FD6978D,0x4FDF3B64, 0xBFF0A91C,0xCA471450, + 0x3FD6A7EF,0x9DB22D0E, 0xBFF09D86,0x84F9389C, + 0x3FD6B851,0xEB851EB8, 0xBFF091F8,0x9DBF162A, + 0x3FD6C8B4,0x39581062, 0xBFF08673,0x088B98B9, + 0x3FD6D916,0x872B020C, 0xBFF07AF5,0xB96BA22C, + 0x3FD6E978,0xD4FDF3B6, 0xBFF06F80,0xA485C029, + 0x3FD6F9DB,0x22D0E560, 0xBFF06413,0xBE19E2CC, + 0x3FD70A3D,0x70A3D70A, 0xBFF058AE,0xFA811452, + 0x3FD71A9F,0xBE76C8B4, 0xBFF04D52,0x4E2D31CF, + 0x3FD72B02,0x0C49BA5E, 0xBFF041FD,0xADA8A4DF, + 0x3FD73B64,0x5A1CAC08, 0xBFF036B1,0x0D961E48, + 0x3FD74BC6,0xA7EF9DB2, 0xBFF02B6C,0x62B05199, + 0x3FD75C28,0xF5C28F5C, 0xBFF0202F,0xA1C9B1B5, + 0x3FD76C8B,0x43958106, 0xBFF014FA,0xBFCC2E4B, + 0x3FD77CED,0x916872B0, 0xBFF009CD,0xB1B8F237, + 0x3FD78D4F,0xDF3B645A, 0xBFEFFD50,0xD9504585, + 0x3FD79DB2,0x2D0E5604, 0xBFEFE715,0xCB913FA1, + 0x3FD7AE14,0x7AE147AE, 0xBFEFD0EA,0x24BF89B7, + 0x3FD7BE76,0xC8B43958, 0xBFEFBACD,0xCF9255A9, + 0x3FD7CED9,0x16872B02, 0xBFEFA4C0,0xB6ECD5A7, + 0x3FD7DF3B,0x645A1CAC, 0xBFEF8EC2,0xC5DDC33E, + 0x3FD7EF9D,0xB22D0E56, 0xBFEF78D3,0xE79EE7FD, + 0x3FD80000,0x00000000, 0xBFEF62F4,0x0794A7B8, + 0x3FD81062,0x4DD2F1AA, 0xBFEF4D23,0x114D8C5B, + 0x3FD820C4,0x9BA5E354, 0xBFEF3760,0xF081D343, + 0x3FD83126,0xE978D4FE, 0xBFEF21AD,0x9112FC25, + 0x3FD84189,0x374BC6A8, 0xBFEF0C08,0xDF0B596A, + 0x3FD851EB,0x851EB852, 0xBFEEF672,0xC69DA20B, + 0x3FD8624D,0xD2F1A9FC, 0xBFEEE0EB,0x342484DC, + 0x3FD872B0,0x20C49BA6, 0xBFEECB72,0x14223D43, + 0x3FD88312,0x6E978D50, 0xBFEEB607,0x53402957, + 0x3FD89374,0xBC6A7EFA, 0xBFEEA0AA,0xDE4E6162, + 0x3FD8A3D7,0x0A3D70A4, 0xBFEE8B5C,0xA24350BE, + 0x3FD8B439,0x5810624E, 0xBFEE761C,0x8C3B5003, + 0x3FD8C49B,0xA5E353F8, 0xBFEE60EA,0x89784093, + 0x3FD8D4FD,0xF3B645A2, 0xBFEE4BC6,0x87612963, + 0x3FD8E560,0x4189374C, 0xBFEE36B0,0x7381D516, + 0x3FD8F5C2,0x8F5C28F6, 0xBFEE21A8,0x3B8A7153, + 0x3FD90624,0xDD2F1AA0, 0xBFEE0CAD,0xCD4F2F5A, + 0x3FD91687,0x2B020C4A, 0xBFEDF7C1,0x16C7E5D7, + 0x3FD926E9,0x78D4FDF4, 0xBFEDE2E2,0x060FB3D9, + 0x3FD9374B,0xC6A7EF9E, 0xBFEDCE10,0x8964A50A, + 0x3FD947AE,0x147AE148, 0xBFEDB94C,0x8F275703, + 0x3FD95810,0x624DD2F2, 0xBFEDA496,0x05DA9FCA, + 0x3FD96872,0xB020C49C, 0xBFED8FEC,0xDC233575, + 0x3FD978D4,0xFDF3B646, 0xBFED7B51,0x00C756E1, + 0x3FD98937,0x4BC6A7F0, 0xBFED66C2,0x62AE758C, + 0x3FD99999,0x9999999A, 0xBFED5240,0xF0E0E077, + 0x3FD9A9FB,0xE76C8B44, 0xBFED3DCC,0x9A877023, + 0x3FD9BA5E,0x353F7CEE, 0xBFED2965,0x4EEB3392, + 0x3FD9CAC0,0x83126E98, 0xBFED150A,0xFD751E56, + 0x3FD9DB22,0xD0E56042, 0xBFED00BD,0x95ADB79D, + 0x3FD9EB85,0x1EB851EC, 0xBFECEC7D,0x073CCA46, + 0x3FD9FBE7,0x6C8B4396, 0xBFECD849,0x41E915E9, + 0x3FDA0C49,0xBA5E353F, 0xBFECC422,0x359800DF, + 0x3FDA1CAC,0x083126E9, 0xBFECB007,0xD24D4B39, + 0x3FDA2D0E,0x56041893, 0xBFEC9BFA,0x082AC2AE, + 0x3FDA3D70,0xA3D70A3D, 0xBFEC87F8,0xC76FF776, + 0x3FDA4DD2,0xF1A9FBE7, 0xBFEC7404,0x0079F207, + 0x3FDA5E35,0x3F7CED91, 0xBFEC601B,0xA3C2E9C5, + 0x3FDA6E97,0x8D4FDF3B, 0xBFEC4C3F,0xA1E1FC8E, + 0x3FDA7EF9,0xDB22D0E5, 0xBFEC386F,0xEB8AE729, + 0x3FDA8F5C,0x28F5C28F, 0xBFEC24AC,0x718DBE8F, + 0x3FDA9FBE,0x76C8B439, 0xBFEC10F5,0x24D6AA13, + 0x3FDAB020,0xC49BA5E3, 0xBFEBFD49,0xF66D9E5B, + 0x3FDAC083,0x126E978D, 0xBFEBE9AA,0xD7761933, + 0x3FDAD0E5,0x60418937, 0xBFEBD617,0xB92EDE28, + 0x3FDAE147,0xAE147AE1, 0xBFEBC290,0x8CF1B3F9, + 0x3FDAF1A9,0xFBE76C8B, 0xBFEBAF15,0x443322D0, + 0x3FDB020C,0x49BA5E35, 0xBFEB9BA5,0xD082333D, + 0x3FDB126E,0x978D4FDF, 0xBFEB8842,0x23882DFF, + 0x3FDB22D0,0xE5604189, 0xBFEB74EA,0x2F085C8A, + 0x3FDB3333,0x33333333, 0xBFEB619D,0xE4DFCA4D, + 0x3FDB4395,0x810624DD, 0xBFEB4E5D,0x370506B6, + 0x3FDB53F7,0xCED91687, 0xBFEB3B28,0x1787E7ED, + 0x3FDB645A,0x1CAC0831, 0xBFEB27FE,0x78914E48, + 0x3FDB74BC,0x6A7EF9DB, 0xBFEB14E0,0x4C62E87A, + 0x3FDB851E,0xB851EB85, 0xBFEB01CD,0x8556F868, + 0x3FDB9581,0x0624DD2F, 0xBFEAEEC6,0x15E018B7, + 0x3FDBA5E3,0x53F7CED9, 0xBFEADBC9,0xF0890306, + 0x3FDBB645,0xA1CAC083, 0xBFEAC8D9,0x07F456D1, + 0x3FDBC6A7,0xEF9DB22D, 0xBFEAB5F3,0x4EDC60FD, + 0x3FDBD70A,0x3D70A3D7, 0xBFEAA318,0xB812E40B, + 0x3FDBE76C,0x8B439581, 0xBFEA9049,0x3680E0F1, + 0x3FDBF7CE,0xD916872B, 0xBFEA7D84,0xBD266090, + 0x3FDC0831,0x26E978D5, 0xBFEA6ACB,0x3F1A3DCC, + 0x3FDC1893,0x74BC6A7F, 0xBFEA581C,0xAF89F043, + 0x3FDC28F5,0xC28F5C29, 0xBFEA4579,0x01B9579F, + 0x3FDC3958,0x10624DD3, 0xBFEA32E0,0x2902877A, + 0x3FDC49BA,0x5E353F7D, 0xBFEA2052,0x18D593E8, + 0x3FDC5A1C,0xAC083127, 0xBFEA0DCE,0xC4B85E82, + 0x3FDC6A7E,0xF9DB22D1, 0xBFE9FB56,0x2046641A, + 0x3FDC7AE1,0x47AE147B, 0xBFE9E8E8,0x1F308AE9, + 0x3FDC8B43,0x95810625, 0xBFE9D684,0xB53CF164, + 0x3FDC9BA5,0xE353F7CF, 0xBFE9C42B,0xD646BD85, + 0x3FDCAC08,0x3126E979, 0xBFE9B1DD,0x763DECB8, + 0x3FDCBC6A,0x7EF9DB23, 0xBFE99F99,0x8927243C, + 0x3FDCCCCC,0xCCCCCCCD, 0xBFE98D60,0x031B821B, + 0x3FDCDD2F,0x1A9FBE77, 0xBFE97B30,0xD8486E9C, + 0x3FDCED91,0x6872B021, 0xBFE9690B,0xFCEF6E46, + 0x3FDCFDF3,0xB645A1CB, 0xBFE956F1,0x6565F454, + 0x3FDD0E56,0x04189375, 0xBFE944E1,0x061535BD, + 0x3FDD1EB8,0x51EB851F, 0xBFE932DA,0xD379FCA8, + 0x3FDD2F1A,0x9FBE76C9, 0xBFE920DE,0xC2247C6D, + 0x3FDD3F7C,0xED916873, 0xBFE90EEC,0xC6B82605, + 0x3FDD4FDF,0x3B645A1D, 0xBFE8FD04,0xD5EB7CFD, + 0x3FDD6041,0x89374BC7, 0xBFE8EB26,0xE487ECDB, + 0x3FDD70A3,0xD70A3D71, 0xBFE8D952,0xE7699EFC, + 0x3FDD8106,0x24DD2F1B, 0xBFE8C788,0xD37F50EA, + 0x3FDD9168,0x72B020C5, 0xBFE8B5C8,0x9DCA2B20, + 0x3FDDA1CA,0xC083126F, 0xBFE8A412,0x3B5D9842, + 0x3FDDB22D,0x0E560419, 0xBFE89265,0xA15F1CCA, + 0x3FDDC28F,0x5C28F5C3, 0xBFE880C2,0xC5062F1E, + 0x3FDDD2F1,0xA9FBE76D, 0xBFE86F29,0x9B9C1017, + 0x3FDDE353,0xF7CED917, 0xBFE85D9A,0x1A7BA3F3, + 0x3FDDF3B6,0x45A1CAC1, 0xBFE84C14,0x37114BB5, + 0x3FDE0418,0x9374BC6A, 0xBFE83A97,0xE6DABEE9, + 0x3FDE147A,0xE147AE14, 0xBFE82925,0x1F66E5D3, + 0x3FDE24DD,0x2F1A9FBE, 0xBFE817BB,0xD655B40A, + 0x3FDE353F,0x7CED9168, 0xBFE8065C,0x0158036F, + 0x3FDE45A1,0xCAC08312, 0xBFE7F505,0x962F6F8F, + 0x3FDE5604,0x189374BC, 0xBFE7E3B8,0x8AAE3166, + 0x3FDE6666,0x66666666, 0xBFE7D274,0xD4B6FB83, + 0x3FDE76C8,0xB4395810, 0xBFE7C13A,0x6A3CD68E, + 0x3FDE872B,0x020C49BA, 0xBFE7B009,0x4142FE2D, + 0x3FDE978D,0x4FDF3B64, 0xBFE79EE1,0x4FDCBE46, + 0x3FDEA7EF,0x9DB22D0E, 0xBFE78DC2,0x8C2D50A0, + 0x3FDEB851,0xEB851EB8, 0xBFE77CAC,0xEC67BADA, + 0x3FDEC8B4,0x39581062, 0xBFE76BA0,0x66CEACCA, + 0x3FDED916,0x872B020C, 0xBFE75A9C,0xF1B45F21, + 0x3FDEE978,0xD4FDF3B6, 0xBFE749A2,0x837A727E, + 0x3FDEF9DB,0x22D0E560, 0xBFE738B1,0x1291CEC6, + 0x3FDF0A3D,0x70A3D70A, 0xBFE727C8,0x957A82DC, + 0x3FDF1A9F,0xBE76C8B4, 0xBFE716E9,0x02C3A4A9, + 0x3FDF2B02,0x0C49BA5E, 0xBFE70612,0x510B3181, + 0x3FDF3B64,0x5A1CAC08, 0xBFE6F544,0x76FDEECE, + 0x3FDF4BC6,0xA7EF9DB2, 0xBFE6E47F,0x6B574B15, + 0x3FDF5C28,0xF5C28F5C, 0xBFE6D3C3,0x24E13F4F, + 0x3FDF6C8B,0x43958106, 0xBFE6C30F,0x9A743088, + 0x3FDF7CED,0x916872B0, 0xBFE6B264,0xC2F6D1D8, + 0x3FDF8D4F,0xDF3B645A, 0xBFE6A1C2,0x955E06A0, + 0x3FDF9DB2,0x2D0E5604, 0xBFE69129,0x08ACC51D, + 0x3FDFAE14,0x7AE147AE, 0xBFE68098,0x13F3F942, + 0x3FDFBE76,0xC8B43958, 0xBFE6700F,0xAE5267DE, + 0x3FDFCED9,0x16872B02, 0xBFE65F8F,0xCEF4920C, + 0x3FDFDF3B,0x645A1CAC, 0xBFE64F18,0x6D1498F1, + 0x3FDFEF9D,0xB22D0E56, 0xBFE63EA9,0x7FFA21BB, + 0x3FE00000,0x00000000, 0xBFE62E42,0xFEFA39EF, + 0x3FE00831,0x26E978D5, 0xBFE61DE4,0xE1773BF8, + 0x3FE01062,0x4DD2F1AA, 0xBFE60D8F,0x1EE0B3FF, + 0x3FE01893,0x74BC6A7F, 0xBFE5FD41,0xAEB3450A, + 0x3FE020C4,0x9BA5E354, 0xBFE5ECFC,0x88788E5B, + 0x3FE028F5,0xC28F5C29, 0xBFE5DCBF,0xA3C71115, + 0x3FE03126,0xE978D4FE, 0xBFE5CC8A,0xF8421624, + 0x3FE03958,0x10624DD3, 0xBFE5BC5E,0x7D999465, + 0x3FE04189,0x374BC6A8, 0xBFE5AC3A,0x2B8A1713, + 0x3FE049BA,0x5E353F7D, 0xBFE59C1D,0xF9DCA470, + 0x3FE051EB,0x851EB852, 0xBFE58C09,0xE066A4B0, + 0x3FE05A1C,0xAC083127, 0xBFE57BFD,0xD709C922, + 0x3FE0624D,0xD2F1A9FC, 0xBFE56BF9,0xD5B3F399, + 0x3FE06A7E,0xF9DB22D1, 0xBFE55BFD,0xD45F1E11, + 0x3FE072B0,0x20C49BA6, 0xBFE54C09,0xCB11428D, + 0x3FE07AE1,0x47AE147B, 0xBFE53C1D,0xB1DC433C, + 0x3FE08312,0x6E978D50, 0xBFE52C39,0x80DDD2CA, + 0x3FE08B43,0x95810625, 0xBFE51C5D,0x303F5CFA, + 0x3FE09374,0xBC6A7EFA, 0xBFE50C88,0xB835EF6F, + 0x3FE09BA5,0xE353F7CF, 0xBFE4FCBC,0x110222B8, + 0x3FE0A3D7,0x0A3D70A4, 0xBFE4ECF7,0x32F00389, + 0x3FE0AC08,0x3126E979, 0xBFE4DD3A,0x1656FC3A, + 0x3FE0B439,0x5810624E, 0xBFE4CD84,0xB399BE6D, + 0x3FE0BC6A,0x7EF9DB23, 0xBFE4BDD7,0x03262CFD, + 0x3FE0C49B,0xA5E353F8, 0xBFE4AE30,0xFD754610, + 0x3FE0CCCC,0xCCCCCCCD, 0xBFE49E92,0x9B0B0D70, + 0x3FE0D4FD,0xF3B645A2, 0xBFE48EFB,0xD476770C, + 0x3FE0DD2F,0x1A9FBE77, 0xBFE47F6C,0xA25151B3, + 0x3FE0E560,0x4189374C, 0xBFE46FE4,0xFD403201, + 0x3FE0ED91,0x6872B021, 0xBFE46064,0xDDF25D81, + 0x3FE0F5C2,0x8F5C28F6, 0xBFE450EC,0x3D21B601, + 0x3FE0FDF3,0xB645A1CB, 0xBFE4417B,0x1392A512, + 0x3FE10624,0xDD2F1AA0, 0xBFE43211,0x5A1407C3, + 0x3FE10E56,0x04189375, 0xBFE422AF,0x097F1A87, + 0x3FE11687,0x2B020C4A, 0xBFE41354,0x1AB7654B, + 0x3FE11EB8,0x51EB851F, 0xBFE40400,0x86AAA7BF, + 0x3FE126E9,0x78D4FDF4, 0xBFE3F4B4,0x4650C5C9, + 0x3FE12F1A,0x9FBE76C9, 0xBFE3E56F,0x52ABB42C, + 0x3FE1374B,0xC6A7EF9E, 0xBFE3D631,0xA4C7655A, + 0x3FE13F7C,0xED916873, 0xBFE3C6FB,0x35B9B675, + 0x3FE147AE,0x147AE148, 0xBFE3B7CB,0xFEA25C7D, + 0x3FE14FDF,0x3B645A1D, 0xBFE3A8A3,0xF8AAD1A6, + 0x3FE15810,0x624DD2F2, 0xBFE39983,0x1D0642E4, + 0x3FE16041,0x89374BC7, 0xBFE38A69,0x64F17D97, + 0x3FE16872,0xB020C49C, 0xBFE37B56,0xC9B2DD6E, + 0x3FE170A3,0xD70A3D71, 0xBFE36C4B,0x449A3A68, + 0x3FE178D4,0xFDF3B646, 0xBFE35D46,0xCF00D70A, + 0x3FE18106,0x24DD2F1B, 0xBFE34E49,0x62494EB9, + 0x3FE18937,0x4BC6A7F0, 0xBFE33F52,0xF7DF843C, + 0x3FE19168,0x72B020C5, 0xBFE33063,0x89389070, + 0x3FE19999,0x9999999A, 0xBFE3217B,0x0FD2B116, + 0x3FE1A1CA,0xC083126F, 0xBFE31299,0x853537D5, + 0x3FE1A9FB,0xE76C8B44, 0xBFE303BE,0xE2F0795E, + 0x3FE1B22D,0x0E560419, 0xBFE2F4EB,0x229DBCBB, + 0x3FE1BA5E,0x353F7CEE, 0xBFE2E61E,0x3DDF2ABA, + 0x3FE1C28F,0x5C28F5C3, 0xBFE2D758,0x2E5FBD90, + 0x3FE1CAC0,0x83126E98, 0xBFE2C898,0xEDD33091, + 0x3FE1D2F1,0xA9FBE76D, 0xBFE2B9E0,0x75F5F013, + 0x3FE1DB22,0xD0E56042, 0xBFE2AB2E,0xC08D0980, + 0x3FE1E353,0xF7CED917, 0xBFE29C83,0xC7661B79, + 0x3FE1EB85,0x1EB851EC, 0xBFE28DDF,0x8457462F, + 0x3FE1F3B6,0x45A1CAC1, 0xBFE27F41,0xF13F1BD6, + 0x3FE1FBE7,0x6C8B4396, 0xBFE270AB,0x0804913F, + 0x3FE20418,0x9374BC6A, 0xBFE2621A,0xC296EE95, + 0x3FE20C49,0xBA5E353F, 0xBFE25391,0x1AEDC036, + 0x3FE2147A,0xE147AE14, 0xBFE2450E,0x0B08C7BE, + 0x3FE21CAC,0x083126E9, 0xBFE23691,0x8CEFED24, + 0x3FE224DD,0x2F1A9FBE, 0xBFE2281B,0x9AB33000, + 0x3FE22D0E,0x56041893, 0xBFE219AC,0x2E6A98EE, + 0x3FE2353F,0x7CED9168, 0xBFE20B43,0x42362B1A, + 0x3FE23D70,0xA3D70A3D, 0xBFE1FCE0,0xD03DD5E6, + 0x3FE245A1,0xCAC08312, 0xBFE1EE84,0xD2B166AD, + 0x3FE24DD2,0xF1A9FBE7, 0xBFE1E02F,0x43C87AB2, + 0x3FE25604,0x189374BC, 0xBFE1D1E0,0x1DC2711E, + 0x3FE25E35,0x3F7CED91, 0xBFE1C397,0x5AE65D2E, + 0x3FE26666,0x66666666, 0xBFE1B554,0xF582F875, + 0x3FE26E97,0x8D4FDF3B, 0xBFE1A718,0xE7EE953D, + 0x3FE276C8,0xB4395810, 0xBFE198E3,0x2C87110D, + 0x3FE27EF9,0xDB22D0E5, 0xBFE18AB3,0xBDB1C745, + 0x3FE2872B,0x020C49BA, 0xBFE17C8A,0x95DB83DE, + 0x3FE28F5C,0x28F5C28F, 0xBFE16E67,0xAF787643, + 0x3FE2978D,0x4FDF3B64, 0xBFE1604B,0x05042447, + 0x3FE29FBE,0x76C8B439, 0xBFE15234,0x91015D3E, + 0x3FE2A7EF,0x9DB22D0E, 0xBFE14424,0x4DFA2D29, + 0x3FE2B020,0xC49BA5E3, 0xBFE1361A,0x367FD003, + 0x3FE2B851,0xEB851EB8, 0xBFE12816,0x452AA52E, + 0x3FE2C083,0x126E978D, 0xBFE11A18,0x749A22EF, + 0x3FE2C8B4,0x39581062, 0xBFE10C20,0xBF74CA16, + 0x3FE2D0E5,0x60418937, 0xBFE0FE2F,0x206819B2, + 0x3FE2D916,0x872B020C, 0xBFE0F043,0x922882E9, + 0x3FE2E147,0xAE147AE1, 0xBFE0E25E,0x0F715CE7, + 0x3FE2E978,0xD4FDF3B6, 0xBFE0D47E,0x9304D8E5, + 0x3FE2F1A9,0xFBE76C8B, 0xBFE0C6A5,0x17ABF651, + 0x3FE2F9DB,0x22D0E560, 0xBFE0B8D1,0x98367706, + 0x3FE3020C,0x49BA5E35, 0xBFE0AB04,0x0F7AD3A5, + 0x3FE30A3D,0x70A3D70A, 0xBFE09D3C,0x78563006, + 0x3FE3126E,0x978D4FDF, 0xBFE08F7A,0xCDAC4FBD, + 0x3FE31A9F,0xBE76C8B4, 0xBFE081BF,0x0A678ABC, + 0x3FE322D0,0xE5604189, 0xBFE07409,0x2978C20F, + 0x3FE32B02,0x0C49BA5E, 0xBFE06659,0x25D754AA, + 0x3FE33333,0x33333333, 0xBFE058AE,0xFA811452, + 0x3FE33B64,0x5A1CAC08, 0xBFE04B0A,0xA27A3AA2, + 0x3FE34395,0x810624DD, 0xBFE03D6C,0x18CD5E20, + 0x3FE34BC6,0xA7EF9DB2, 0xBFE02FD3,0x588B676D, + 0x3FE353F7,0xCED91687, 0xBFE02240,0x5CCB868C, + 0x3FE35C28,0xF5C28F5C, 0xBFE014B3,0x20AB283E, + 0x3FE3645A,0x1CAC0831, 0xBFE0072B,0x9F4DEB78, + 0x3FE36C8B,0x43958106, 0xBFDFF353,0xA7BB2DD6, + 0x3FE374BC,0x6A7EF9DB, 0xBFDFD85B,0x73141D49, + 0x3FE37CED,0x916872B0, 0xBFDFBD6E,0x97129387, + 0x3FE3851E,0xB851EB85, 0xBFDFA28D,0x0A2E908A, + 0x3FE38D4F,0xDF3B645A, 0xBFDF87B6,0xC2EC11CA, + 0x3FE39581,0x0624DD2F, 0xBFDF6CEB,0xB7DAFE25, + 0x3FE39DB2,0x2D0E5604, 0xBFDF522B,0xDF9711F8, + 0x3FE3A5E3,0x53F7CED9, 0xBFDF3777,0x30C7CB60, + 0x3FE3AE14,0x7AE147AE, 0xBFDF1CCD,0xA220569F, + 0x3FE3B645,0xA1CAC083, 0xBFDF022F,0x2A5F7AAE, + 0x3FE3BE76,0xC8B43958, 0xBFDEE79B,0xC04F85F9, + 0x3FE3C6A7,0xEF9DB22D, 0xBFDECD13,0x5AC63B3D, + 0x3FE3CED9,0x16872B02, 0xBFDEB295,0xF0A4BE96, + 0x3FE3D70A,0x3D70A3D7, 0xBFDE9823,0x78D782AA, + 0x3FE3DF3B,0x645A1CAC, 0xBFDE7DBB,0xEA563605, + 0x3FE3E76C,0x8B439581, 0xBFDE635F,0x3C23B092, + 0x3FE3EF9D,0xB22D0E56, 0xBFDE490D,0x654DE143, + 0x3FE3F7CE,0xD916872B, 0xBFDE2EC6,0x5CEDBBD8, + 0x3FE40000,0x00000000, 0xBFDE148A,0x1A2726CE, + 0x3FE40831,0x26E978D5, 0xBFDDFA58,0x9428E971, + 0x3FE41062,0x4DD2F1AA, 0xBFDDE031,0xC22C9A19, + 0x3FE41893,0x74BC6A7F, 0xBFDDC615,0x9B768C81, + 0x3FE420C4,0x9BA5E354, 0xBFDDAC04,0x1755C04C, + 0x3FE428F5,0xC28F5C29, 0xBFDD91FD,0x2D23CFA6, + 0x3FE43126,0xE978D4FE, 0xBFDD7800,0xD444DE0D, + 0x3FE43958,0x10624DD3, 0xBFDD5E0F,0x04278739, + 0x3FE44189,0x374BC6A8, 0xBFDD4427,0xB444CE2C, + 0x3FE449BA,0x5E353F7D, 0xBFDD2A4A,0xDC200C60, + 0x3FE451EB,0x851EB852, 0xBFDD1078,0x7346E115, + 0x3FE45A1C,0xAC083127, 0xBFDCF6B0,0x715120C7, + 0x3FE4624D,0xD2F1A9FC, 0xBFDCDCF2,0xCDE0C4C1, + 0x3FE46A7E,0xF9DB22D1, 0xBFDCC33F,0x80A1DAD2, + 0x3FE472B0,0x20C49BA6, 0xBFDCA996,0x814A7520, + 0x3FE47AE1,0x47AE147B, 0xBFDC8FF7,0xC79A9A21, + 0x3FE48312,0x6E978D50, 0xBFDC7663,0x4B5C34B1, + 0x3FE48B43,0x95810625, 0xBFDC5CD9,0x04630444, + 0x3FE49374,0xBC6A7EFA, 0xBFDC4358,0xEA8C8D3F, + 0x3FE49BA5,0xE353F7CF, 0xBFDC29E2,0xF5C00969, + 0x3FE4A3D7,0x0A3D70A4, 0xBFDC1077,0x1DEE5883, + 0x3FE4AC08,0x3126E979, 0xBFDBF715,0x5B11F0F3, + 0x3FE4B439,0x5810624E, 0xBFDBDDBD,0xA52ED09A, + 0x3FE4BC6A,0x7EF9DB23, 0xBFDBC46F,0xF4526DBF, + 0x3FE4C49B,0xA5E353F8, 0xBFDBAB2C,0x4093A81B, + 0x3FE4CCCC,0xCCCCCCCD, 0xBFDB91F2,0x8212BA02, + 0x3FE4D4FD,0xF3B645A2, 0xBFDB78C2,0xB0F929AC, + 0x3FE4DD2F,0x1A9FBE77, 0xBFDB5F9C,0xC579BA97, + 0x3FE4E560,0x4189374C, 0xBFDB4680,0xB7D05F03, + 0x3FE4ED91,0x6872B021, 0xBFDB2D6E,0x80422996, + 0x3FE4F5C2,0x8F5C28F6, 0xBFDB1466,0x171D3F0F, + 0x3FE4FDF3,0xB645A1CB, 0xBFDAFB67,0x74B8C81C, + 0x3FE50624,0xDD2F1AA0, 0xBFDAE272,0x9174E34C, + 0x3FE50E56,0x04189375, 0xBFDAC987,0x65BA9715, + 0x3FE51687,0x2B020C4A, 0xBFDAB0A5,0xE9FBC402, + 0x3FE51EB8,0x51EB851F, 0xBFDA97CE,0x16B316F1, + 0x3FE526E9,0x78D4FDF4, 0xBFDA7EFF,0xE463FB6C, + 0x3FE52F1A,0x9FBE76C9, 0xBFDA663B,0x4B9A8E25, + 0x3FE5374B,0xC6A7EF9E, 0xBFDA4D80,0x44EB8F83, + 0x3FE53F7C,0xED916873, 0xBFDA34CE,0xC8F4564E, + 0x3FE547AE,0x147AE148, 0xBFDA1C26,0xD05AC275, + 0x3FE54FDF,0x3B645A1D, 0xBFDA0388,0x53CD2FE6, + 0x3FE55810,0x624DD2F2, 0xBFD9EAF3,0x4C02698D, + 0x3FE56041,0x89374BC7, 0xBFD9D267,0xB1B99C5C, + 0x3FE56872,0xB020C49C, 0xBFD9B9E5,0x7DBA4A7A, + 0x3FE570A3,0xD70A3D71, 0xBFD9A16C,0xA8D43E81, + 0x3FE578D4,0xFDF3B646, 0xBFD988FD,0x2BDF7ED7, + 0x3FE58106,0x24DD2F1B, 0xBFD97096,0xFFBC4123, + 0x3FE58937,0x4BC6A7F0, 0xBFD9583A,0x1D52DDD4, + 0x3FE59168,0x72B020C5, 0xBFD93FE6,0x7D93C3C2, + 0x3FE59999,0x9999999A, 0xBFD9279C,0x19776BE9, + 0x3FE5A1CA,0xC083126F, 0xBFD90F5A,0xE9FE4D36, + 0x3FE5A9FB,0xE76C8B44, 0xBFD8F722,0xE830D073, + 0x3FE5B22D,0x0E560419, 0xBFD8DEF4,0x0D1F443F, + 0x3FE5BA5E,0x353F7CEE, 0xBFD8C6CE,0x51E1D126, + 0x3FE5C28F,0x5C28F5C3, 0xBFD8AEB1,0xAF986DCC, + 0x3FE5CAC0,0x83126E98, 0xBFD8969E,0x1F6AD32D, + 0x3FE5D2F1,0xA9FBE76D, 0xBFD87E93,0x9A8870F7, + 0x3FE5DB22,0xD0E56042, 0xBFD86692,0x1A2861F4, + 0x3FE5E353,0xF7CED917, 0xBFD84E99,0x9789608E, + 0x3FE5EB85,0x1EB851EC, 0xBFD836AA,0x0BF1BB68, + 0x3FE5F3B6,0x45A1CAC1, 0xBFD81EC3,0x70AF4A0C, + 0x3FE5FBE7,0x6C8B4396, 0xBFD806E5,0xBF1761AE, + 0x3FE60418,0x9374BC6A, 0xBFD7EF10,0xF086CA03, + 0x3FE60C49,0xBA5E353F, 0xBFD7D744,0xFE61B228, + 0x3FE6147A,0xE147AE14, 0xBFD7BF81,0xE213A5AF, + 0x3FE61CAC,0x083126E9, 0xBFD7A7C7,0x950F81AC, + 0x3FE624DD,0x2F1A9FBE, 0xBFD79016,0x10CF69DF, + 0x3FE62D0E,0x56041893, 0xBFD7786D,0x4ED4BDF6, + 0x3FE6353F,0x7CED9168, 0xBFD760CD,0x48A80ED9, + 0x3FE63D70,0xA3D70A3D, 0xBFD74935,0xF7D91413, + 0x3FE645A1,0xCAC08312, 0xBFD731A7,0x55FEA14A, + 0x3FE64DD2,0xF1A9FBE7, 0xBFD71A21,0x5CB69BCA, + 0x3FE65604,0x189374BC, 0xBFD702A4,0x05A5F024, + 0x3FE65E35,0x3F7CED91, 0xBFD6EB2F,0x4A7887E4, + 0x3FE66666,0x66666666, 0xBFD6D3C3,0x24E13F50, + 0x3FE66E97,0x8D4FDF3B, 0xBFD6BC5F,0x8E99DB45, + 0x3FE676C8,0xB4395810, 0xBFD6A504,0x8162FF20, + 0x3FE67EF9,0xDB22D0E5, 0xBFD68DB1,0xF70422B8, + 0x3FE6872B,0x020C49BA, 0xBFD67667,0xE94B8871, + 0x3FE68F5C,0x28F5C28F, 0xBFD65F26,0x520E335A, + 0x3FE6978D,0x4FDF3B64, 0xBFD647ED,0x2B27DD63, + 0x3FE69FBE,0x76C8B439, 0xBFD630BC,0x6E7AED9C, + 0x3FE6A7EF,0x9DB22D0E, 0xBFD61994,0x15F06E93, + 0x3FE6B020,0xC49BA5E3, 0xBFD60274,0x1B7804B4, + 0x3FE6B851,0xEB851EB8, 0xBFD5EB5C,0x7907E4CA, + 0x3FE6C083,0x126E978D, 0xBFD5D44D,0x289CCA80, + 0x3FE6C8B4,0x39581062, 0xBFD5BD46,0x2439EF06, + 0x3FE6D0E5,0x60418937, 0xBFD5A647,0x65E8FFB5, + 0x3FE6D916,0x872B020C, 0xBFD58F50,0xE7BA14D1, + 0x3FE6E147,0xAE147AE1, 0xBFD57862,0xA3C3A852, + 0x3FE6E978,0xD4FDF3B6, 0xBFD5617C,0x94228CC7, + 0x3FE6F1A9,0xFBE76C8B, 0xBFD54A9E,0xB2F9E441, + 0x3FE6F9DB,0x22D0E560, 0xBFD533C8,0xFA731752, + 0x3FE7020C,0x49BA5E35, 0xBFD51CFB,0x64BDCC1A, + 0x3FE70A3D,0x70A3D70A, 0xBFD50635,0xEC0FDD69, + 0x3FE7126E,0x978D4FDF, 0xBFD4EF78,0x8AA551E9, + 0x3FE71A9F,0xBE76C8B4, 0xBFD4D8C3,0x3AC0535F, + 0x3FE722D0,0xE5604189, 0xBFD4C215,0xF6A925F7, + 0x3FE72B02,0x0C49BA5E, 0xBFD4AB70,0xB8AE1F9E, + 0x3FE73333,0x33333333, 0xBFD494D3,0x7B239F74, + 0x3FE73B64,0x5A1CAC08, 0xBFD47E3E,0x38640541, + 0x3FE74395,0x810624DD, 0xBFD467B0,0xEACFA902, + 0x3FE74BC6,0xA7EF9DB2, 0xBFD4512B,0x8CCCD284, + 0x3FE753F7,0xCED91687, 0xBFD43AAE,0x18C7B107, + 0x3FE75C28,0xF5C28F5C, 0xBFD42438,0x893252F5, + 0x3FE7645A,0x1CAC0831, 0xBFD40DCA,0xD8849DAE, + 0x3FE76C8B,0x43958106, 0xBFD3F765,0x013C454F, + 0x3FE774BC,0x6A7EF9DB, 0xBFD3E106,0xFDDCC4A1, + 0x3FE77CED,0x916872B0, 0xBFD3CAB0,0xC8EF54FD, + 0x3FE7851E,0xB851EB85, 0xBFD3B462,0x5D02E652, + 0x3FE78D4F,0xDF3B645A, 0xBFD39E1B,0xB4AC172C, + 0x3FE79581,0x0624DD2F, 0xBFD387DC,0xCA852CD1, + 0x3FE79DB2,0x2D0E5604, 0xBFD371A5,0x992E0B64, + 0x3FE7A5E3,0x53F7CED9, 0xBFD35B76,0x1B4C2E1F, + 0x3FE7AE14,0x7AE147AE, 0xBFD3454E,0x4B8A9F90, + 0x3FE7B645,0xA1CAC083, 0xBFD32F2E,0x2499F1EF, + 0x3FE7BE76,0xC8B43958, 0xBFD31915,0xA1303773, + 0x3FE7C6A7,0xEF9DB22D, 0xBFD30304,0xBC08FAC5, + 0x3FE7CED9,0x16872B02, 0xBFD2ECFB,0x6FE5376F, + 0x3FE7D70A,0x3D70A3D7, 0xBFD2D6F9,0xB78B5268, + 0x3FE7DF3B,0x645A1CAC, 0xBFD2C0FF,0x8DC7129D, + 0x3FE7E76C,0x8B439581, 0xBFD2AB0C,0xED699996, + 0x3FE7EF9D,0xB22D0E56, 0xBFD29521,0xD1495C1B, + 0x3FE7F7CE,0xD916872B, 0xBFD27F3E,0x34421AF0, + 0x3FE80000,0x00000000, 0xBFD26962,0x1134DB92, + 0x3FE80831,0x26E978D5, 0xBFD2538D,0x6307E10F, + 0x3FE81062,0x4DD2F1AA, 0xBFD23DC0,0x24A6A4D8, + 0x3FE81893,0x74BC6A7F, 0xBFD227FA,0x5101CFB3, + 0x3FE820C4,0x9BA5E354, 0xBFD2123B,0xE30F32A8, + 0x3FE828F5,0xC28F5C29, 0xBFD1FC84,0xD5C9C006, + 0x3FE83126,0xE978D4FE, 0xBFD1E6D5,0x2431846B, + 0x3FE83958,0x10624DD3, 0xBFD1D12C,0xC94B9FDF, + 0x3FE84189,0x374BC6A8, 0xBFD1BB8B,0xC0223EF5, + 0x3FE849BA,0x5E353F7D, 0xBFD1A5F2,0x03C493FC, + 0x3FE851EB,0x851EB852, 0xBFD1905F,0x8F46D038, + 0x3FE85A1C,0xAC083127, 0xBFD17AD4,0x5DC21D28, + 0x3FE8624D,0xD2F1A9FC, 0xBFD16550,0x6A5495DA, + 0x3FE86A7E,0xF9DB22D1, 0xBFD14FD3,0xB0214042, + 0x3FE872B0,0x20C49BA6, 0xBFD13A5E,0x2A5006A7, + 0x3FE87AE1,0x47AE147B, 0xBFD124EF,0xD40DB113, + 0x3FE88312,0x6E978D50, 0xBFD10F88,0xA88BDED0, + 0x3FE88B43,0x95810625, 0xBFD0FA28,0xA300FFF1, + 0x3FE89374,0xBC6A7EFA, 0xBFD0E4CF,0xBEA84EE6, + 0x3FE89BA5,0xE353F7CF, 0xBFD0CF7D,0xF6C1CA1B, + 0x3FE8A3D7,0x0A3D70A4, 0xBFD0BA33,0x46922D9D, + 0x3FE8AC08,0x3126E979, 0xBFD0A4EF,0xA962ECCF, + 0x3FE8B439,0x5810624E, 0xBFD08FB3,0x1A822C28, + 0x3FE8BC6A,0x7EF9DB23, 0xBFD07A7D,0x9542BAFB, + 0x3FE8C49B,0xA5E353F8, 0xBFD0654F,0x14FC0D48, + 0x3FE8CCCC,0xCCCCCCCD, 0xBFD05027,0x950A3599, + 0x3FE8D4FD,0xF3B645A2, 0xBFD03B07,0x10CDDEE8, + 0x3FE8DD2F,0x1A9FBE77, 0xBFD025ED,0x83AC4692, + 0x3FE8E560,0x4189374C, 0xBFD010DA,0xE90F364E, + 0x3FE8ED91,0x6872B021, 0xBFCFF79E,0x78C9FC65, + 0x3FE8F5C2,0x8F5C28F6, 0xBFCFCD94,0xF240DD8E, + 0x3FE8FDF3,0xB645A1CB, 0xBFCFA399,0x3571A62D, + 0x3FE90624,0xDD2F1AA0, 0xBFCF79AB,0x3953D5AD, + 0x3FE90E56,0x04189375, 0xBFCF4FCA,0xF4E7C91D, + 0x3FE91687,0x2B020C4A, 0xBFCF25F8,0x5F36AF9F, + 0x3FE91EB8,0x51EB851F, 0xBFCEFC33,0x6F527EDF, + 0x3FE926E9,0x78D4FDF4, 0xBFCED27C,0x1C55E7A8, + 0x3FE92F1A,0x9FBE76C9, 0xBFCEA8D2,0x5D644A84, + 0x3FE9374B,0xC6A7EF9E, 0xBFCE7F36,0x29A9AC6D, + 0x3FE93F7C,0xED916873, 0xBFCE55A7,0x785AAB99, + 0x3FE947AE,0x147AE148, 0xBFCE2C26,0x40B4744F, + 0x3FE94FDF,0x3B645A1D, 0xBFCE02B2,0x79FCB5D5, + 0x3FE95810,0x624DD2F2, 0xBFCDD94C,0x1B81976B, + 0x3FE96041,0x89374BC7, 0xBFCDAFF3,0x1C99AD5B, + 0x3FE96872,0xB020C49C, 0xBFCD86A7,0x74A3EE16, + 0x3FE970A3,0xD70A3D71, 0xBFCD5D69,0x1B07A76B, + 0x3FE978D4,0xFDF3B646, 0xBFCD3438,0x073473C8, + 0x3FE98106,0x24DD2F1B, 0xBFCD0B14,0x30A22F8D, + 0x3FE98937,0x4BC6A7F0, 0xBFCCE1FD,0x8ED0EE73, + 0x3FE99168,0x72B020C5, 0xBFCCB8F4,0x1948F104, + 0x3FE99999,0x9999999A, 0xBFCC8FF7,0xC79A9A20, + 0x3FE9A1CA,0xC083126F, 0xBFCC6708,0x915E6496, + 0x3FE9A9FB,0xE76C8B44, 0xBFCC3E26,0x6E34D8CF, + 0x3FE9B22D,0x0E560419, 0xBFCC1551,0x55C68285, + 0x3FE9BA5E,0x353F7CEE, 0xBFCBEC89,0x3FC3E68C, + 0x3FE9C28F,0x5C28F5C3, 0xBFCBC3CE,0x23E578B0, + 0x3FE9CAC0,0x83126E98, 0xBFCB9B1F,0xF9EB919B, + 0x3FE9D2F1,0xA9FBE76D, 0xBFCB727E,0xB99E64D0, + 0x3FE9DB22,0xD0E56042, 0xBFCB49EA,0x5ACDF6B8, + 0x3FE9E353,0xF7CED917, 0xBFCB2162,0xD55212B8, + 0x3FE9EB85,0x1EB851EC, 0xBFCAF8E8,0x210A415B, + 0x3FE9F3B6,0x45A1CAC1, 0xBFCAD07A,0x35DDBE8E, + 0x3FE9FBE7,0x6C8B4396, 0xBFCAA819,0x0BBB6FE6, + 0x3FEA0418,0x9374BC6A, 0xBFCA7FC4,0x9A99DAFB, + 0x3FEA0C49,0xBA5E353F, 0xBFCA577C,0xDA771BBF, + 0x3FEA147A,0xE147AE14, 0xBFCA2F41,0xC358DB0F, + 0x3FEA1CAC,0x083126E9, 0xBFCA0713,0x4D4C4526, + 0x3FEA24DD,0x2F1A9FBE, 0xBFC9DEF1,0x70660032, + 0x3FEA2D0E,0x56041893, 0xBFC9B6DC,0x24C222FD, + 0x3FEA353F,0x7CED9168, 0xBFC98ED3,0x62842B97, + 0x3FEA3D70,0xA3D70A3D, 0xBFC966D7,0x21D6F61B, + 0x3FEA45A1,0xCAC08312, 0xBFC93EE7,0x5AECB37C, + 0x3FEA4DD2,0xF1A9FBE7, 0xBFC91704,0x05FEE05F, + 0x3FEA5604,0x189374BC, 0xBFC8EF2D,0x1B4E3C09, + 0x3FEA5E35,0x3F7CED91, 0xBFC8C762,0x9322BF57, + 0x3FEA6666,0x66666666, 0xBFC89FA4,0x65CB93C4, + 0x3FEA6E97,0x8D4FDF3B, 0xBFC877F2,0x8B9F0A7C, + 0x3FEA76C8,0xB4395810, 0xBFC8504C,0xFCFA9385, + 0x3FEA7EF9,0xDB22D0E5, 0xBFC828B3,0xB242B4E7, + 0x3FEA872B,0x020C49BA, 0xBFC80126,0xA3E301F0, + 0x3FEA8F5C,0x28F5C28F, 0xBFC7D9A5,0xCA4E127E, + 0x3FEA978D,0x4FDF3B64, 0xBFC7B231,0x1DFD7A57, + 0x3FEA9FBE,0x76C8B439, 0xBFC78AC8,0x9771C08D, + 0x3FEAA7EF,0x9DB22D0E, 0xBFC7636C,0x2F3256F8, + 0x3FEAB020,0xC49BA5E3, 0xBFC73C1B,0xDDCD91AF, + 0x3FEAB851,0xEB851EB8, 0xBFC714D7,0x9BD89E9B, + 0x3FEAC083,0x126E978D, 0xBFC6ED9F,0x61EF7D0E, + 0x3FEAC8B4,0x39581062, 0xBFC6C673,0x28B4F56D, + 0x3FEAD0E5,0x60418937, 0xBFC69F52,0xE8D290E2, + 0x3FEAD916,0x872B020C, 0xBFC6783E,0x9AF8911F, + 0x3FEAE147,0xAE147AE1, 0xBFC65136,0x37DDE829, + 0x3FEAE978,0xD4FDF3B6, 0xBFC62A39,0xB8403032, + 0x3FEAF1A9,0xFBE76C8B, 0xBFC60349,0x14E3A383, + 0x3FEAF9DB,0x22D0E560, 0xBFC5DC64,0x46931468, + 0x3FEB020C,0x49BA5E35, 0xBFC5B58B,0x461FE536, + 0x3FEB0A3D,0x70A3D70A, 0xBFC58EBE,0x0C62004F, + 0x3FEB126E,0x978D4FDF, 0xBFC567FC,0x9237D03E, + 0x3FEB1A9F,0xBE76C8B4, 0xBFC54146,0xD08637D8, + 0x3FEB22D0,0xE5604189, 0xBFC51A9C,0xC0388A6B, + 0x3FEB2B02,0x0C49BA5E, 0xBFC4F3FE,0x5A4083F8, + 0x3FEB3333,0x33333333, 0xBFC4CD6B,0x97964179, + 0x3FEB3B64,0x5A1CAC08, 0xBFC4A6E4,0x71383935, + 0x3FEB4395,0x810624DD, 0xBFC48068,0xE02B331C, + 0x3FEB4BC6,0xA7EF9DB2, 0xBFC459F8,0xDD7A412F, + 0x3FEB53F7,0xCED91687, 0xBFC43394,0x6236B7F6, + 0x3FEB5C28,0xF5C28F5C, 0xBFC40D3B,0x677826FD, + 0x3FEB645A,0x1CAC0831, 0xBFC3E6ED,0xE65C5165, + 0x3FEB6C8B,0x43958106, 0xBFC3C0AB,0xD8072670, + 0x3FEB74BC,0x6A7EF9DB, 0xBFC39A75,0x35A2BA2C, + 0x3FEB7CED,0x916872B0, 0xBFC37449,0xF85F3E1A, + 0x3FEB851E,0xB851EB85, 0xBFC34E2A,0x1972F9E3, + 0x3FEB8D4F,0xDF3B645A, 0xBFC32815,0x921A441F, + 0x3FEB9581,0x0624DD2F, 0xBFC3020C,0x5B977B1E, + 0x3FEB9DB2,0x2D0E5604, 0xBFC2DC0E,0x6F32FDC2, + 0x3FEBA5E3,0x53F7CED9, 0xBFC2B61B,0xC63B245B, + 0x3FEBAE14,0x7AE147AE, 0xBFC29034,0x5A04399A, + 0x3FEBB645,0xA1CAC083, 0xBFC26A58,0x23E87386, + 0x3FEBBE76,0xC8B43958, 0xBFC24487,0x1D47EC7A, + 0x3FEBC6A7,0xEF9DB22D, 0xBFC21EC1,0x3F889C35, + 0x3FEBCED9,0x16872B02, 0xBFC1F906,0x841650ED, + 0x3FEBD70A,0x3D70A3D7, 0xBFC1D356,0xE462A870, + 0x3FEBDF3B,0x645A1CAC, 0xBFC1ADB2,0x59E5094D, + 0x3FEBE76C,0x8B439581, 0xBFC18818,0xDE1A9C09, + 0x3FEBEF9D,0xB22D0E56, 0xBFC1628A,0x6A86445F, + 0x3FEBF7CE,0xD916872B, 0xBFC13D06,0xF8B09A84, + 0x3FEC0000,0x00000000, 0xBFC1178E,0x8227E47C, + 0x3FEC0831,0x26E978D5, 0xBFC0F221,0x00800F74, + 0x3FEC1062,0x4DD2F1AA, 0xBFC0CCBE,0x6D52A928, + 0x3FEC1893,0x74BC6A7F, 0xBFC0A766,0xC23ED951, + 0x3FEC20C4,0x9BA5E354, 0xBFC08219,0xF8E95B21, + 0x3FEC28F5,0xC28F5C29, 0xBFC05CD8,0x0AFC76BE, + 0x3FEC3126,0xE978D4FE, 0xBFC037A0,0xF227FAD6, + 0x3FEC3958,0x10624DD3, 0xBFC01274,0xA821362D, + 0x3FEC4189,0x374BC6A8, 0xBFBFDAA6,0x4D45E27B, + 0x3FEC49BA,0x5E353F7D, 0xBFBF9078,0xCEDACFC3, + 0x3FEC51EB,0x851EB852, 0xBFBF4660,0xC88C8603, + 0x3FEC5A1C,0xAC083127, 0xBFBEFC5E,0x2DF12499, + 0x3FEC624D,0xD2F1A9FC, 0xBFBEB270,0xF2A98BFD, + 0x3FEC6A7E,0xF9DB22D1, 0xBFBE6899,0x0A615153, + 0x3FEC72B0,0x20C49BA6, 0xBFBE1ED6,0x68CEB215, + 0x3FEC7AE1,0x47AE147B, 0xBFBDD529,0x01B287D1, + 0x3FEC8312,0x6E978D50, 0xBFBD8B90,0xC8D83BF3, + 0x3FEC8B43,0x95810625, 0xBFBD420D,0xB215BBA3, + 0x3FEC9374,0xBC6A7EFA, 0xBFBCF89F,0xB14B6BB6, + 0x3FEC9BA5,0xE353F7CF, 0xBFBCAF46,0xBA641CB0, + 0x3FECA3D7,0x0A3D70A4, 0xBFBC6602,0xC154FED4, + 0x3FECAC08,0x3126E979, 0xBFBC1CD3,0xBA1D9647, + 0x3FECB439,0x5810624E, 0xBFBBD3B9,0x98C7AF45, + 0x3FECBC6A,0x7EF9DB23, 0xBFBB8AB4,0x51675268, + 0x3FECC49B,0xA5E353F8, 0xBFBB41C3,0xD81AB8FA, + 0x3FECCCCC,0xCCCCCCCD, 0xBFBAF8E8,0x210A415C, + 0x3FECD4FD,0xF3B645A2, 0xBFBAB021,0x2068637F, + 0x3FECDD2F,0x1A9FBE77, 0xBFBA676E,0xCA71A569, + 0x3FECE560,0x4189374C, 0xBFBA1ED1,0x136C8FCE, + 0x3FECED91,0x6872B021, 0xBFB9D647,0xEFA9A2B4, + 0x3FECF5C2,0x8F5C28F6, 0xBFB98DD3,0x53834A30, + 0x3FECFDF3,0xB645A1CB, 0xBFB94573,0x335DD329, + 0x3FED0624,0xDD2F1AA0, 0xBFB8FD27,0x83A76031, + 0x3FED0E56,0x04189375, 0xBFB8B4F0,0x38D7DE6E, + 0x3FED1687,0x2B020C4A, 0xBFB86CCD,0x4770FA8C, + 0x3FED1EB8,0x51EB851F, 0xBFB824BE,0xA3FE15C9, + 0x3FED26E9,0x78D4FDF4, 0xBFB7DCC4,0x43143B07, + 0x3FED2F1A,0x9FBE76C9, 0xBFB794DE,0x195213F0, + 0x3FED374B,0xC6A7EF9E, 0xBFB74D0C,0x1B5FDE30, + 0x3FED3F7C,0xED916873, 0xBFB7054E,0x3DEF60B2, + 0x3FED47AE,0x147AE148, 0xBFB6BDA4,0x75BBE0F6, + 0x3FED4FDF,0x3B645A1D, 0xBFB6760E,0xB78A1871, + 0x3FED5810,0x624DD2F2, 0xBFB62E8C,0xF82829FF, + 0x3FED6041,0x89374BC7, 0xBFB5E71F,0x2C6D975E, + 0x3FED6872,0xB020C49C, 0xBFB59FC5,0x493B36C2, + 0x3FED70A3,0xD70A3D71, 0xBFB5587F,0x437B2869, + 0x3FED78D4,0xFDF3B646, 0xBFB5114D,0x1020CC4D, + 0x3FED8106,0x24DD2F1B, 0xBFB4CA2E,0xA428B7D9, + 0x3FED8937,0x4BC6A7F0, 0xBFB48323,0xF498ABB1, + 0x3FED9168,0x72B020C5, 0xBFB43C2C,0xF67F8985, + 0x3FED9999,0x9999999A, 0xBFB3F549,0x9EF549F9, + 0x3FEDA1CA,0xC083126F, 0xBFB3AE79,0xE31AF295, + 0x3FEDA9FB,0xE76C8B44, 0xBFB367BD,0xB81A8BC1, + 0x3FEDB22D,0x0E560419, 0xBFB32115,0x132716D5, + 0x3FEDBA5E,0x353F7CEE, 0xBFB2DA7F,0xE97C8435, + 0x3FEDC28F,0x5C28F5C3, 0xBFB293FE,0x305FA975, + 0x3FEDCAC0,0x83126E98, 0xBFB24D8F,0xDD1E3794, + 0x3FEDD2F1,0xA9FBE76D, 0xBFB20734,0xE50EB13D, + 0x3FEDDB22,0xD0E56042, 0xBFB1C0ED,0x3D906115, + 0x3FEDE353,0xF7CED917, 0xBFB17AB8,0xDC0B5020, + 0x3FEDEB85,0x1EB851EC, 0xBFB13497,0xB5F03C25, + 0x3FEDF3B6,0x45A1CAC1, 0xBFB0EE89,0xC0B88E2D, + 0x3FEDFBE7,0x6C8B4396, 0xBFB0A88E,0xF1E65102, + 0x3FEE0418,0x9374BC6A, 0xBFB062A7,0x3F0427CE, + 0x3FEE0C49,0xBA5E353F, 0xBFB01CD2,0x9DA54498, + 0x3FEE147A,0xE147AE14, 0xBFAFAE22,0x06CABE40, + 0x3FEE1CAC,0x083126E9, 0xBFAF22C4,0xCBD156F4, + 0x3FEE24DD,0x2F1A9FBE, 0xBFAE978D,0x75B7A1B0, + 0x3FEE2D0E,0x56041893, 0xBFAE0C7B,0xEFE7C0BD, + 0x3FEE353F,0x7CED9168, 0xBFAD8190,0x25DC9801, + 0x3FEE3D70,0xA3D70A3D, 0xBFACF6CA,0x0321BAD9, + 0x3FEE45A1,0xCAC08312, 0xBFAC6C29,0x73535A03, + 0x3FEE4DD2,0xF1A9FBE7, 0xBFABE1AE,0x621E31A5, + 0x3FEE5604,0x189374BC, 0xBFAB5758,0xBB3F7770, + 0x3FEE5E35,0x3F7CED91, 0xBFAACD28,0x6A84C8D0, + 0x3FEE6666,0x66666666, 0xBFAA431D,0x5BCC193E, + 0x3FEE6E97,0x8D4FDF3B, 0xBFA9B937,0x7B03A0A9, + 0x3FEE76C8,0xB4395810, 0xBFA92F76,0xB429C9F0, + 0x3FEE7EF9,0xDB22D0E5, 0xBFA8A5DA,0xF34D217A, + 0x3FEE872B,0x020C49BA, 0xBFA81C64,0x248C43E2, + 0x3FEE8F5C,0x28F5C28F, 0xBFA79312,0x3415CCBD, + 0x3FEE978D,0x4FDF3B64, 0xBFA709E5,0x0E284574, + 0x3FEE9FBE,0x76C8B439, 0xBFA680DC,0x9F121438, + 0x3FEEA7EF,0x9DB22D0E, 0xBFA5F7F8,0xD3316B08, + 0x3FEEB020,0xC49BA5E3, 0xBFA56F39,0x96F436D4, + 0x3FEEB851,0xEB851EB8, 0xBFA4E69E,0xD6D80EB3, + 0x3FEEC083,0x126E978D, 0xBFA45E28,0x7F6A232F, + 0x3FEEC8B4,0x39581062, 0xBFA3D5D6,0x7D472DA6, + 0x3FEED0E5,0x60418937, 0xBFA34DA8,0xBD1B5FC8, + 0x3FEED916,0x872B020C, 0xBFA2C59F,0x2BA25321, + 0x3FEEE147,0xAE147AE1, 0xBFA23DB9,0xB5A6F8C1, + 0x3FEEE978,0xD4FDF3B6, 0xBFA1B5F8,0x480388F4, + 0x3FEEF1A9,0xFBE76C8B, 0xBFA12E5A,0xCFA17314, + 0x3FEEF9DB,0x22D0E560, 0xBFA0A6E1,0x39794D70, + 0x3FEF020C,0x49BA5E35, 0xBFA01F8B,0x7292C543, + 0x3FEF0A3D,0x70A3D70A, 0xBF9F30B2,0xD0091D8A, + 0x3FEF126E,0x978D4FDF, 0xBF9E2296,0x0DE8AAA3, + 0x3FEF1A9F,0xBE76C8B4, 0xBF9D14C0,0x792D5741, + 0x3FEF22D0,0xE5604189, 0xBF9C0731,0xEC5DF82A, + 0x3FEF2B02,0x0C49BA5E, 0xBF9AF9EA,0x421EF240, + 0x3FEF3333,0x33333333, 0xBF99ECE9,0x55321B70, + 0x3FEF3B64,0x5A1CAC08, 0xBF98E02F,0x00769BCE, + 0x3FEF4395,0x810624DD, 0xBF97D3BB,0x1EE8CED0, + 0x3FEF4BC6,0xA7EF9DB2, 0xBF96C78D,0x8BA224BC, + 0x3FEF53F7,0xCED91687, 0xBF95BBA6,0x21D90435, + 0x3FEF5C28,0xF5C28F5C, 0xBF94B004,0xBCE0ABF7, + 0x3FEF645A,0x1CAC0831, 0xBF93A4A9,0x382914B6, + 0x3FEF6C8B,0x43958106, 0xBF929993,0x6F3ED324, + 0x3FEF74BC,0x6A7EF9DB, 0xBF918EC3,0x3DCAFA23, + 0x3FEF7CED,0x916872B0, 0xBF908438,0x7F92FD19, + 0x3FEF851E,0xB851EB85, 0xBF8EF3E6,0x20F124D2, + 0x3FEF8D4F,0xDF3B645A, 0xBF8CDFE5,0x98F32C36, + 0x3FEF9581,0x0624DD2F, 0xBF8ACC6F,0x1F5FD940, + 0x3FEF9DB2,0x2D0E5604, 0xBF88B982,0x6CA2CB84, + 0x3FEFA5E3,0x53F7CED9, 0xBF86A71F,0x395F3F6F, + 0x3FEFAE14,0x7AE147AE, 0xBF849545,0x3E6FD4BC, + 0x3FEFB645,0xA1CAC083, 0xBF8283F4,0x34E6552E, + 0x3FEFBE76,0xC8B43958, 0xBF80732B,0xD60B7B99, + 0x3FEFC6A7,0xEF9DB22D, 0xBF7CC5D7,0xB6BD7664, + 0x3FEFCED9,0x16872B02, 0xBF78A667,0xFD2C0E51, + 0x3FEFD70A,0x3D70A3D7, 0xBF748807,0xF33B3513, + 0x3FEFDF3B,0x645A1CAC, 0xBF706AB7,0x0D2F80D0, + 0x3FEFE76C,0x8B439581, 0xBF689CE9,0x7F727142, + 0x3FEFEF9D,0xB22D0E56, 0xBF606680,0xFFE7CC09, + 0x3FEFF7CE,0xD916872B, 0xBF506467,0x0D979B73, + 0x3FF00000,0x00000000, 0x80000000,0x00000000, + 0x3FF00418,0x9374BC6A, 0x3F506035,0x4F8C3CC4, + 0x3FF00831,0x26E978D5, 0x3F605E1D,0x82FDF749, + 0x3FF00C49,0xBA5E353F, 0x3F688A09,0xA34CA9D6, + 0x3FF01062,0x4DD2F1AA, 0x3F7059F0,0x0CC2F7FC, + 0x3FF0147A,0xE147AE14, 0x3F746DD0,0xFAD671FA, + 0x3FF01893,0x74BC6A7F, 0x3F7880A8,0x237A7261, + 0x3FF01CAC,0x083126E9, 0x3F7C9276,0x0DE12CC4, + 0x3FF020C4,0x9BA5E354, 0x3F80519D,0xA06AE4F3, + 0x3FF024DD,0x2F1A9FBE, 0x3F82597C,0x215E6436, + 0x3FF028F5,0xC28F5C29, 0x3F8460D6,0xCCCA367C, + 0x3FF02D0E,0x56041893, 0x3F8667AD,0xE57A90E1, + 0x3FF03126,0xE978D4FE, 0x3F886E01,0xAE08F2D9, + 0x3FF0353F,0x7CED9168, 0x3F8A73D2,0x68DC557E, + 0x3FF03958,0x10624DD3, 0x3F8C7920,0x58296295, + 0x3FF03D70,0xA3D70A3D, 0x3F8E7DEB,0xBDF2A35D, + 0x3FF04189,0x374BC6A8, 0x3F90411A,0x6E045B8A, + 0x3FF045A1,0xCAC08312, 0x3F9142FD,0xFA0540A5, + 0x3FF049BA,0x5E353F7D, 0x3F9244A0,0xA3B2AFEE, + 0x3FF04DD2,0xF1A9FBE7, 0x3F934602,0x8BAAAC6B, + 0x3FF051EB,0x851EB852, 0x3F944723,0xD272A7F6, + 0x3FF05604,0x189374BC, 0x3F954804,0x987799EC, + 0x3FF05A1C,0xAC083127, 0x3F9648A4,0xFE0E19B0, + 0x3FF05E35,0x3F7CED91, 0x3F974905,0x2372751C, + 0x3FF0624D,0xD2F1A9FC, 0x3F984925,0x28C8CAC5, + 0x3FF06666,0x66666666, 0x3F994905,0x2E1D202E, + 0x3FF06A7E,0xF9DB22D1, 0x3F9A48A5,0x53637BD3, + 0x3FF06E97,0x8D4FDF3B, 0x3F9B4805,0xB877FB21, + 0x3FF072B0,0x20C49BA6, 0x3F9C4726,0x7D1EEC3E, + 0x3FF076C8,0xB4395810, 0x3F9D4607,0xC104E3C9, + 0x3FF07AE1,0x47AE147B, 0x3F9E44A9,0xA3BED66B, + 0x3FF07EF9,0xDB22D0E5, 0x3F9F430C,0x44CA2E59, + 0x3FF08312,0x6E978D50, 0x3FA02097,0xE1C67254, + 0x3FF0872B,0x020C49BA, 0x3FA09F8A,0x1FAACB4D, + 0x3FF08B43,0x95810625, 0x3FA11E5C,0xEBADCF5A, + 0x3FF08F5C,0x28F5C28F, 0x3FA19D10,0x555F94E8, + 0x3FF09374,0xBC6A7EFA, 0x3FA21BA4,0x6C44A801, + 0x3FF0978D,0x4FDF3B64, 0x3FA29A19,0x3FD614B8, + 0x3FF09BA5,0xE353F7CF, 0x3FA3186E,0xDF817377, + 0x3FF09FBE,0x76C8B439, 0x3FA396A5,0x5AA8F35A, + 0x3FF0A3D7,0x0A3D70A4, 0x3FA414BC,0xC0A3665D, + 0x3FF0A7EF,0x9DB22D0E, 0x3FA492B5,0x20BC4B99, + 0x3FF0AC08,0x3126E979, 0x3FA5108E,0x8A33DB58, + 0x3FF0B020,0xC49BA5E3, 0x3FA58E49,0x0C3F1137, + 0x3FF0B439,0x5810624E, 0x3FA60BE4,0xB607B81F, + 0x3FF0B851,0xEB851EB8, 0x3FA68961,0x96AC744C, + 0x3FF0BC6A,0x7EF9DB23, 0x3FA706BF,0xBD40CF29, + 0x3FF0C083,0x126E978D, 0x3FA783FF,0x38CD413E, + 0x3FF0C49B,0xA5E353F8, 0x3FA80120,0x184F3DF2, + 0x3FF0C8B4,0x39581062, 0x3FA87E22,0x6AB93D5D, + 0x3FF0CCCC,0xCCCCCCCD, 0x3FA8FB06,0x3EF2C7F0, + 0x3FF0D0E5,0x60418937, 0x3FA977CB,0xA3D8802B, + 0x3FF0D4FD,0xF3B645A2, 0x3FA9F472,0xA83C2E32, + 0x3FF0D916,0x872B020C, 0x3FAA70FB,0x5AE4C960, + 0x3FF0DD2F,0x1A9FBE77, 0x3FAAED65,0xCA8E83C8, + 0x3FF0E147,0xAE147AE1, 0x3FAB69B2,0x05EAD3AD, + 0x3FF0E560,0x4189374C, 0x3FABE5E0,0x1BA07EE6, + 0x3FF0E978,0xD4FDF3B6, 0x3FAC61F0,0x1A4BA446, + 0x3FF0ED91,0x6872B021, 0x3FACDDE2,0x107DC6DD, + 0x3FF0F1A9,0xFBE76C8B, 0x3FAD59B6,0x0CBDD74A, + 0x3FF0F5C2,0x8F5C28F6, 0x3FADD56C,0x1D883EE6, + 0x3FF0F9DB,0x22D0E560, 0x3FAE5104,0x514EE8FD, + 0x3FF0FDF3,0xB645A1CB, 0x3FAECC7E,0xB6794DDA, + 0x3FF1020C,0x49BA5E35, 0x3FAF47DB,0x5B647BEF, + 0x3FF10624,0xDD2F1AA0, 0x3FAFC31A,0x4E6322C7, + 0x3FF10A3D,0x70A3D70A, 0x3FB01F1D,0xCEDECE09, + 0x3FF10E56,0x04189375, 0x3FB05C9F,0xABD8FB42, + 0x3FF1126E,0x978D4FDF, 0x3FB09A12,0xC539FF63, + 0x3FF11687,0x2B020C4A, 0x3FB0D777,0x2216A51E, + 0x3FF11A9F,0xBE76C8B4, 0x3FB114CC,0xC97E9FF2, + 0x3FF11EB8,0x51EB851F, 0x3FB15213,0xC27C9180, + 0x3FF122D0,0xE5604189, 0x3FB18F4C,0x14160DEE, + 0x3FF126E9,0x78D4FDF4, 0x3FB1CC75,0xC54BA132, + 0x3FF12B02,0x0C49BA5E, 0x3FB20990,0xDD18D36A, + 0x3FF12F1A,0x9FBE76C9, 0x3FB2469D,0x62742E1B, + 0x3FF13333,0x33333333, 0x3FB2839B,0x5C4F407C, + 0x3FF1374B,0xC6A7EF9E, 0x3FB2C08A,0xD196A4AA, + 0x3FF13B64,0x5A1CAC08, 0x3FB2FD6B,0xC93203E9, + 0x3FF13F7C,0xED916873, 0x3FB33A3E,0x4A041BCF, + 0x3FF14395,0x810624DD, 0x3FB37702,0x5AEAC274, + 0x3FF147AE,0x147AE148, 0x3FB3B3B8,0x02BEEB94, + 0x3FF14BC6,0xA7EF9DB2, 0x3FB3F05F,0x4854ACB9, + 0x3FF14FDF,0x3B645A1D, 0x3FB42CF8,0x327B424B, + 0x3FF153F7,0xCED91687, 0x3FB46982,0xC7FD13B2, + 0x3FF15810,0x624DD2F2, 0x3FB4A5FF,0x0F9FB85E, + 0x3FF15C28,0xF5C28F5C, 0x3FB4E26D,0x1023FBD7, + 0x3FF16041,0x89374BC7, 0x3FB51ECC,0xD045E2C0, + 0x3FF1645A,0x1CAC0831, 0x3FB55B1E,0x56BCAEDD, + 0x3FF16872,0xB020C49C, 0x3FB59761,0xAA3AE408, + 0x3FF16C8B,0x43958106, 0x3FB5D396,0xD16E4C2E, + 0x3FF170A3,0xD70A3D71, 0x3FB60FBD,0xD2FFFC37, + 0x3FF174BC,0x6A7EF9DB, 0x3FB64BD6,0xB59457FC, + 0x3FF178D4,0xFDF3B646, 0x3FB687E1,0x7FCB1726, + 0x3FF17CED,0x916872B0, 0x3FB6C3DE,0x383F4915, + 0x3FF18106,0x24DD2F1B, 0x3FB6FFCC,0xE58759B3, + 0x3FF1851E,0xB851EB85, 0x3FB73BAD,0x8E35155A, + 0x3FF18937,0x4BC6A7F0, 0x3FB77780,0x38D5AD96, + 0x3FF18D4F,0xDF3B645A, 0x3FB7B344,0xEBF1BD00, + 0x3FF19168,0x72B020C5, 0x3FB7EEFB,0xAE0D4BFA, + 0x3FF19581,0x0624DD2F, 0x3FB82AA4,0x85A7D47D, + 0x3FF19999,0x9999999A, 0x3FB8663F,0x793C46CC, + 0x3FF19DB2,0x2D0E5604, 0x3FB8A1CC,0x8F410D3C, + 0x3FF1A1CA,0xC083126F, 0x3FB8DD4B,0xCE2810D4, + 0x3FF1A5E3,0x53F7CED9, 0x3FB918BD,0x3C5EBD13, + 0x3FF1A9FB,0xE76C8B44, 0x3FB95420,0xE04E0486, + 0x3FF1AE14,0x7AE147AE, 0x3FB98F76,0xC05A647E, + 0x3FF1B22D,0x0E560419, 0x3FB9CABE,0xE2E3E9A4, + 0x3FF1B645,0xA1CAC083, 0x3FBA05F9,0x4E4633A0, + 0x3FF1BA5E,0x353F7CEE, 0x3FBA4126,0x08D879A6, + 0x3FF1BE76,0xC8B43958, 0x3FBA7C45,0x18ED8E15, + 0x3FF1C28F,0x5C28F5C3, 0x3FBAB756,0x84D3E2F6, + 0x3FF1C6A7,0xEF9DB22D, 0x3FBAF25A,0x52D58D95, + 0x3FF1CAC0,0x83126E98, 0x3FBB2D50,0x89384AF5, + 0x3FF1CED9,0x16872B02, 0x3FBB6839,0x2E3D8364, + 0x3FF1D2F1,0xA9FBE76D, 0x3FBBA314,0x48224EDE, + 0x3FF1D70A,0x3D70A3D7, 0x3FBBDDE1,0xDD1F789F, + 0x3FF1DB22,0xD0E56042, 0x3FBC18A1,0xF369837A, + 0x3FF1DF3B,0x645A1CAC, 0x3FBC5354,0x9130AD5F, + 0x3FF1E353,0xF7CED917, 0x3FBC8DF9,0xBCA0F3B2, + 0x3FF1E76C,0x8B439581, 0x3FBCC891,0x7BE216BC, + 0x3FF1EB85,0x1EB851EC, 0x3FBD031B,0xD5179E02, + 0x3FF1EF9D,0xB22D0E56, 0x3FBD3D98,0xCE60DBAB, + 0x3FF1F3B6,0x45A1CAC1, 0x3FBD7808,0x6DD8F0CA, + 0x3FF1F7CE,0xD916872B, 0x3FBDB26A,0xB996D0C2, + 0x3FF1FBE7,0x6C8B4396, 0x3FBDECBF,0xB7AD4583, + 0x3FF20000,0x00000000, 0x3FBE2707,0x6E2AF2E6, + 0x3FF20418,0x9374BC6A, 0x3FBE6141,0xE31A5AD3, + 0x3FF20831,0x26E978D5, 0x3FBE9B6F,0x1C81E0DB, + 0x3FF20C49,0xBA5E353F, 0x3FBED58F,0x2063CDCA, + 0x3FF21062,0x4DD2F1AA, 0x3FBF0FA1,0xF4BE53C3, + 0x3FF2147A,0xE147AE14, 0x3FBF49A7,0x9F8B9187, + 0x3FF21893,0x74BC6A7F, 0x3FBF83A0,0x26C19690, + 0x3FF21CAC,0x083126E9, 0x3FBFBD8B,0x90526656, + 0x3FF220C4,0x9BA5E354, 0x3FBFF769,0xE22BFC60, + 0x3FF224DD,0x2F1A9FBE, 0x3FC0189D,0x911C27BF, + 0x3FF228F5,0xC28F5C29, 0x3FC0357F,0xAB2EAAEA, + 0x3FF22D0E,0x56041893, 0x3FC0525B,0x423E8406, + 0x3FF23126,0xE978D4FE, 0x3FC06F30,0x593AB2AE, + 0x3FF2353F,0x7CED9168, 0x3FC08BFE,0xF3103B54, + 0x3FF23958,0x10624DD3, 0x3FC0A8C7,0x12AA2941, + 0x3FF23D70,0xA3D70A3D, 0x3FC0C588,0xBAF19025, + 0x3FF24189,0x374BC6A8, 0x3FC0E243,0xEECD8E13, + 0x3FF245A1,0xCAC08312, 0x3FC0FEF8,0xB1234D07, + 0x3FF249BA,0x5E353F7D, 0x3FC11BA7,0x04D604E4, + 0x3FF24DD2,0xF1A9FBE7, 0x3FC1384E,0xECC6FCF6, + 0x3FF251EB,0x851EB852, 0x3FC154F0,0x6BD58DE8, + 0x3FF25604,0x189374BC, 0x3FC1718B,0x84DF2346, + 0x3FF25A1C,0xAC083127, 0x3FC18E20,0x3ABF3D6B, + 0x3FF25E35,0x3F7CED91, 0x3FC1AAAE,0x904F7304, + 0x3FF2624D,0xD2F1A9FC, 0x3FC1C736,0x886772F9, + 0x3FF26666,0x66666666, 0x3FC1E3B8,0x25DD05E9, + 0x3FF26A7E,0xF9DB22D1, 0x3FC20033,0x6B841012, + 0x3FF26E97,0x8D4FDF3B, 0x3FC21CA8,0x5C2E92C8, + 0x3FF272B0,0x20C49BA6, 0x3FC23916,0xFAACAE5B, + 0x3FF276C8,0xB4395810, 0x3FC2557F,0x49CCA389, + 0x3FF27AE1,0x47AE147B, 0x3FC271E1,0x4C5AD55E, + 0x3FF27EF9,0xDB22D0E5, 0x3FC28E3D,0x0521CAA8, + 0x3FF28312,0x6E978D50, 0x3FC2AA92,0x76EA2FCF, + 0x3FF2872B,0x020C49BA, 0x3FC2C6E1,0xA47AD845, + 0x3FF28B43,0x95810625, 0x3FC2E32A,0x9098C05C, + 0x3FF28F5C,0x28F5C28F, 0x3FC2FF6D,0x3E070EB3, + 0x3FF29374,0xBC6A7EFA, 0x3FC31BA9,0xAF871608, + 0x3FF2978D,0x4FDF3B64, 0x3FC337DF,0xE7D856A0, + 0x3FF29BA5,0xE353F7CF, 0x3FC3540F,0xE9B88018, + 0x3FF29FBE,0x76C8B439, 0x3FC37039,0xB7E372C4, + 0x3FF2A3D7,0x0A3D70A4, 0x3FC38C5D,0x55134183, + 0x3FF2A7EF,0x9DB22D0E, 0x3FC3A87A,0xC4003319, + 0x3FF2AC08,0x3126E979, 0x3FC3C492,0x0760C3FC, + 0x3FF2B020,0xC49BA5E3, 0x3FC3E0A3,0x21E9A7AF, + 0x3FF2B439,0x5810624E, 0x3FC3FCAE,0x164DCA87, + 0x3FF2B851,0xEB851EB8, 0x3FC418B2,0xE73E5307, + 0x3FF2BC6A,0x7EF9DB23, 0x3FC434B1,0x976AA39E, + 0x3FF2C083,0x126E978D, 0x3FC450AA,0x29805C02, + 0x3FF2C49B,0xA5E353F8, 0x3FC46C9C,0xA02B5AEB, + 0x3FF2C8B4,0x39581062, 0x3FC48888,0xFE15BF67, + 0x3FF2CCCC,0xCCCCCCCD, 0x3FC4A46F,0x45E7EA95, + 0x3FF2D0E5,0x60418937, 0x3FC4C04F,0x7A4880F6, + 0x3FF2D4FD,0xF3B645A2, 0x3FC4DC29,0x9DDC6C23, + 0x3FF2D916,0x872B020C, 0x3FC4F7FD,0xB346DC19, + 0x3FF2DD2F,0x1A9FBE77, 0x3FC513CB,0xBD2948F0, + 0x3FF2E147,0xAE147AE1, 0x3FC52F93,0xBE237421, + 0x3FF2E560,0x4189374C, 0x3FC54B55,0xB8D36A3C, + 0x3FF2E978,0xD4FDF3B6, 0x3FC56711,0xAFD58428, + 0x3FF2ED91,0x6872B021, 0x3FC582C7,0xA5C468D3, + 0x3FF2F1A9,0xFBE76C8B, 0x3FC59E77,0x9D390E79, + 0x3FF2F5C2,0x8F5C28F6, 0x3FC5BA21,0x98CABC49, + 0x3FF2F9DB,0x22D0E560, 0x3FC5D5C5,0x9B0F0BA7, + 0x3FF2FDF3,0xB645A1CB, 0x3FC5F163,0xA699E9D3, + 0x3FF3020C,0x49BA5E35, 0x3FC60CFB,0xBDFD9929, + 0x3FF30624,0xDD2F1AA0, 0x3FC6288D,0xE3CAB2C0, + 0x3FF30A3D,0x70A3D70A, 0x3FC6441A,0x1A9027A6, + 0x3FF30E56,0x04189375, 0x3FC65FA0,0x64DB4282, + 0x3FF3126E,0x978D4FDF, 0x3FC67B20,0xC537A8CA, + 0x3FF31687,0x2B020C4A, 0x3FC6969B,0x3E2F5C62, + 0x3FF31A9F,0xBE76C8B4, 0x3FC6B20F,0xD24ABCCC, + 0x3FF31EB8,0x51EB851F, 0x3FC6CD7E,0x841088C8, + 0x3FF322D0,0xE5604189, 0x3FC6E8E7,0x5605DF80, + 0x3FF326E9,0x78D4FDF4, 0x3FC7044A,0x4AAE4225, + 0x3FF32B02,0x0C49BA5E, 0x3FC71FA7,0x648B9516, + 0x3FF32F1A,0x9FBE76C9, 0x3FC73AFE,0xA61E217E, + 0x3FF33333,0x33333333, 0x3FC75650,0x11E49675, + 0x3FF3374B,0xC6A7EF9E, 0x3FC7719B,0xAA5C0A99, + 0x3FF33B64,0x5A1CAC08, 0x3FC78CE1,0x71FFFD34, + 0x3FF33F7C,0xED916873, 0x3FC7A821,0x6B4A57C9, + 0x3FF34395,0x810624DD, 0x3FC7C35B,0x98B36F3C, + 0x3FF347AE,0x147AE148, 0x3FC7DE8F,0xFCB2055D, + 0x3FF34BC6,0xA7EF9DB2, 0x3FC7F9BE,0x99BB4A09, + 0x3FF34FDF,0x3B645A1D, 0x3FC814E7,0x7242DCB5, + 0x3FF353F7,0xCED91687, 0x3FC8300A,0x88BACD8E, + 0x3FF35810,0x624DD2F2, 0x3FC84B27,0xDF939EFD, + 0x3FF35C28,0xF5C28F5C, 0x3FC8663F,0x793C46C6, + 0x3FF36041,0x89374BC7, 0x3FC88151,0x58222F88, + 0x3FF3645A,0x1CAC0831, 0x3FC89C5D,0x7EB139DD, + 0x3FF36872,0xB020C49C, 0x3FC8B763,0xEF53BDD5, + 0x3FF36C8B,0x43958106, 0x3FC8D264,0xAC728C10, + 0x3FF370A3,0xD70A3D71, 0x3FC8ED5F,0xB874EF3D, + 0x3FF374BC,0x6A7EF9DB, 0x3FC90855,0x15C0AD2B, + 0x3FF378D4,0xFDF3B646, 0x3FC92344,0xC6BA0847, + 0x3FF37CED,0x916872B0, 0x3FC93E2E,0xCDC3C0AF, + 0x3FF38106,0x24DD2F1B, 0x3FC95913,0x2D3F15A6, + 0x3FF3851E,0xB851EB85, 0x3FC973F1,0xE78BC6A8, + 0x3FF38937,0x4BC6A7F0, 0x3FC98ECA,0xFF0814DE, + 0x3FF38D4F,0xDF3B645A, 0x3FC9A99E,0x7610C429, + 0x3FF39168,0x72B020C5, 0x3FC9C46C,0x4F011C99, + 0x3FF39581,0x0624DD2F, 0x3FC9DF34,0x8C32EB74, + 0x3FF39999,0x9999999A, 0x3FC9F9F7,0x2FFE84A6, + 0x3FF39DB2,0x2D0E5604, 0x3FCA14B4,0x3CBAC3CC, + 0x3FF3A1CA,0xC083126F, 0x3FCA2F6B,0xB4BD0DA0, + 0x3FF3A5E3,0x53F7CED9, 0x3FCA4A1D,0x9A5950FC, + 0x3FF3A9FB,0xE76C8B44, 0x3FCA64C9,0xEFE20849, + 0x3FF3AE14,0x7AE147AE, 0x3FCA7F70,0xB7A83A7F, + 0x3FF3B22D,0x0E560419, 0x3FCA9A11,0xF3FB7C8E, + 0x3FF3B645,0xA1CAC083, 0x3FCAB4AD,0xA729F260, + 0x3FF3BA5E,0x353F7CEE, 0x3FCACF43,0xD380503E, + 0x3FF3BE76,0xC8B43958, 0x3FCAE9D4,0x7B49DBCB, + 0x3FF3C28F,0x5C28F5C3, 0x3FCB045F,0xA0D06D6D, + 0x3FF3C6A7,0xEF9DB22D, 0x3FCB1EE5,0x465C7142, + 0x3FF3CAC0,0x83126E98, 0x3FCB3965,0x6E34E888, + 0x3FF3CED9,0x16872B02, 0x3FCB53E0,0x1A9F6A91, + 0x3FF3D2F1,0xA9FBE76D, 0x3FCB6E55,0x4DE02621, + 0x3FF3D70A,0x3D70A3D7, 0x3FCB88C5,0x0A39E268, + 0x3FF3DB22,0xD0E56042, 0x3FCBA32F,0x51EE005E, + 0x3FF3DF3B,0x645A1CAC, 0x3FCBBD94,0x273C7BB3, + 0x3FF3E353,0xF7CED917, 0x3FCBD7F3,0x8C63EC2D, + 0x3FF3E76C,0x8B439581, 0x3FCBF24D,0x83A18698, + 0x3FF3EB85,0x1EB851EC, 0x3FCC0CA2,0x0F311E1E, + 0x3FF3EF9D,0xB22D0E56, 0x3FCC26F1,0x314D2536, + 0x3FF3F3B6,0x45A1CAC1, 0x3FCC413A,0xEC2EAEF8, + 0x3FF3F7CE,0xD916872B, 0x3FCC5B7F,0x420D700C, + 0x3FF3FBE7,0x6C8B4396, 0x3FCC75BE,0x351FBFFD, + 0x3FF40000,0x00000000, 0x3FCC8FF7,0xC79A9A22, + 0x3FF40418,0x9374BC6A, 0x3FCCAA2B,0xFBB19EE7, + 0x3FF40831,0x26E978D5, 0x3FCCC45A,0xD39714DB, + 0x3FF40C49,0xBA5E353F, 0x3FCCDE84,0x517BE9B1, + 0x3FF41062,0x4DD2F1AA, 0x3FCCF8A8,0x778FB38C, + 0x3FF4147A,0xE147AE14, 0x3FCD12C7,0x4800B1DE, + 0x3FF41893,0x74BC6A7F, 0x3FCD2CE0,0xC4FBCEBB, + 0x3FF41CAC,0x083126E9, 0x3FCD46F4,0xF0AC9FB4, + 0x3FF420C4,0x9BA5E354, 0x3FCD6103,0xCD3D6725, + 0x3FF424DD,0x2F1A9FBE, 0x3FCD7B0D,0x5CD71512, + 0x3FF428F5,0xC28F5C29, 0x3FCD9511,0xA1A14871, + 0x3FF42D0E,0x56041893, 0x3FCDAF10,0x9DC25005, + 0x3FF43126,0xE978D4FE, 0x3FCDC90A,0x535F2BA4, + 0x3FF4353F,0x7CED9168, 0x3FCDE2FE,0xC49B8D14, + 0x3FF43958,0x10624DD3, 0x3FCDFCED,0xF399D94B, + 0x3FF43D70,0xA3D70A3D, 0x3FCE16D7,0xE27B294C, + 0x3FF44189,0x374BC6A8, 0x3FCE30BC,0x935F4B64, + 0x3FF445A1,0xCAC08312, 0x3FCE4A9C,0x0864C404, + 0x3FF449BA,0x5E353F7D, 0x3FCE6476,0x43A8CEFD, + 0x3FF44DD2,0xF1A9FBE7, 0x3FCE7E4B,0x47476059, + 0x3FF451EB,0x851EB852, 0x3FCE981B,0x155B2593, + 0x3FF45604,0x189374BC, 0x3FCEB1E5,0xAFFD866F, + 0x3FF45A1C,0xAC083127, 0x3FCECBAB,0x1946A62F, + 0x3FF45E35,0x3F7CED91, 0x3FCEE56B,0x534D6468, + 0x3FF4624D,0xD2F1A9FC, 0x3FCEFF26,0x60275E3A, + 0x3FF46666,0x66666666, 0x3FCF18DC,0x41E8EF1D, + 0x3FF46A7E,0xF9DB22D1, 0x3FCF328C,0xFAA53219, + 0x3FF46E97,0x8D4FDF3B, 0x3FCF4C38,0x8C6E0292, + 0x3FF472B0,0x20C49BA6, 0x3FCF65DE,0xF953FD7D, + 0x3FF476C8,0xB4395810, 0x3FCF7F80,0x4366822B, + 0x3FF47AE1,0x47AE147B, 0x3FCF991C,0x6CB3B37A, + 0x3FF47EF9,0xDB22D0E5, 0x3FCFB2B3,0x774878A1, + 0x3FF48312,0x6E978D50, 0x3FCFCC45,0x65307E5B, + 0x3FF4872B,0x020C49BA, 0x3FCFE5D2,0x387637B5, + 0x3FF48B43,0x95810625, 0x3FCFFF59,0xF322DF35, + 0x3FF48F5C,0x28F5C28F, 0x3FD00C6E,0x4B9F3BD3, + 0x3FF49374,0xBC6A7EFA, 0x3FD0192D,0x1367E6A0, + 0x3FF4978D,0x4FDF3B64, 0x3FD025E9,0x51EE3B35, + 0x3FF49BA5,0xE353F7CF, 0x3FD032A3,0x08346A75, + 0x3FF49FBE,0x76C8B439, 0x3FD03F5A,0x373C0B51, + 0x3FF4A3D7,0x0A3D70A4, 0x3FD04C0E,0xE0061B5B, + 0x3FF4A7EF,0x9DB22D0E, 0x3FD058C1,0x0392FF2B, + 0x3FF4AC08,0x3126E979, 0x3FD06570,0xA2E282EB, + 0x3FF4B020,0xC49BA5E3, 0x3FD0721D,0xBEF3DABC, + 0x3FF4B439,0x5810624E, 0x3FD07EC8,0x58C5A344, + 0x3FF4B851,0xEB851EB8, 0x3FD08B70,0x7155E20F, + 0x3FF4BC6A,0x7EF9DB23, 0x3FD09816,0x09A2061F, + 0x3FF4C083,0x126E978D, 0x3FD0A4B9,0x22A6E849, + 0x3FF4C49B,0xA5E353F8, 0x3FD0B159,0xBD60CBC4, + 0x3FF4C8B4,0x39581062, 0x3FD0BDF7,0xDACB5E88, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FD0CA93,0x7BE1B9DC, + 0x3FF4D0E5,0x60418937, 0x3FD0D72C,0xA19E62B2, + 0x3FF4D4FD,0xF3B645A2, 0x3FD0E3C3,0x4CFB4A32, + 0x3FF4D916,0x872B020C, 0x3FD0F057,0x7EF1CE1A, + 0x3FF4DD2F,0x1A9FBE77, 0x3FD0FCE9,0x387AB948, + 0x3FF4E147,0xAE147AE1, 0x3FD10978,0x7A8E4413, + 0x3FF4E560,0x4189374C, 0x3FD11605,0x462414DB, + 0x3FF4E978,0xD4FDF3B6, 0x3FD1228F,0x9C33405F, + 0x3FF4ED91,0x6872B021, 0x3FD12F17,0x7DB24A48, + 0x3FF4F1A9,0xFBE76C8B, 0x3FD13B9C,0xEB972584, + 0x3FF4F5C2,0x8F5C28F6, 0x3FD1481F,0xE6D734CF, + 0x3FF4F9DB,0x22D0E560, 0x3FD154A0,0x70674B09, + 0x3FF4FDF3,0xB645A1CB, 0x3FD1611E,0x893BABC2, + 0x3FF5020C,0x49BA5E35, 0x3FD16D9A,0x32480B8F, + 0x3FF50624,0xDD2F1AA0, 0x3FD17A13,0x6C7F9093, + 0x3FF50A3D,0x70A3D70A, 0x3FD1868A,0x38D4D2D6, + 0x3FF50E56,0x04189375, 0x3FD192FE,0x9839DCC9, + 0x3FF5126E,0x978D4FDF, 0x3FD19F70,0x8BA02BA3, + 0x3FF51687,0x2B020C4A, 0x3FD1ABE0,0x13F8AFDC, + 0x3FF51A9F,0xBE76C8B4, 0x3FD1B84D,0x3233CD8D, + 0x3FF51EB8,0x51EB851F, 0x3FD1C4B7,0xE7415CEE, + 0x3FF522D0,0xE5604189, 0x3FD1D120,0x3410AAAD, + 0x3FF526E9,0x78D4FDF4, 0x3FD1DD86,0x19907873, + 0x3FF52B02,0x0C49BA5E, 0x3FD1E9E9,0x98AEFD35, + 0x3FF52F1A,0x9FBE76C9, 0x3FD1F64A,0xB259E5BA, + 0x3FF53333,0x33333333, 0x3FD202A9,0x677E54EC, + 0x3FF5374B,0xC6A7EF9E, 0x3FD20F05,0xB908E45C, + 0x3FF53B64,0x5A1CAC08, 0x3FD21B5F,0xA7E5A492, + 0x3FF53F7C,0xED916873, 0x3FD227B7,0x35001D90, + 0x3FF54395,0x810624DD, 0x3FD2340C,0x61434F25, + 0x3FF547AE,0x147AE148, 0x3FD2405F,0x2D99B16A, + 0x3FF54BC6,0xA7EF9DB2, 0x3FD24CAF,0x9AED3514, + 0x3FF54FDF,0x3B645A1D, 0x3FD258FD,0xAA2743F8, + 0x3FF553F7,0xCED91687, 0x3FD26549,0x5C30C153, + 0x3FF55810,0x624DD2F2, 0x3FD27192,0xB1F20A51, + 0x3FF55C28,0xF5C28F5C, 0x3FD27DD9,0xAC52F657, + 0x3FF56041,0x89374BC7, 0x3FD28A1E,0x4C3AD782, + 0x3FF5645A,0x1CAC0831, 0x3FD29660,0x92907AF8, + 0x3FF56872,0xB020C49C, 0x3FD2A2A0,0x803A2964, + 0x3FF56C8B,0x43958106, 0x3FD2AEDE,0x161DA742, + 0x3FF570A3,0xD70A3D71, 0x3FD2BB19,0x5520355D, + 0x3FF574BC,0x6A7EF9DB, 0x3FD2C752,0x3E26911F, + 0x3FF578D4,0xFDF3B646, 0x3FD2D388,0xD214F507, + 0x3FF57CED,0x916872B0, 0x3FD2DFBD,0x11CF18FA, + 0x3FF58106,0x24DD2F1B, 0x3FD2EBEE,0xFE3832BB, + 0x3FF5851E,0xB851EB85, 0x3FD2F81E,0x9832F63A, + 0x3FF58937,0x4BC6A7F0, 0x3FD3044B,0xE0A1960A, + 0x3FF58D4F,0xDF3B645A, 0x3FD31076,0xD865C3B1, + 0x3FF59168,0x72B020C5, 0x3FD31C9F,0x8060B01C, + 0x3FF59581,0x0624DD2F, 0x3FD328C5,0xD9730BEE, + 0x3FF59999,0x9999999A, 0x3FD334E9,0xE47D07F6, + 0x3FF59DB2,0x2D0E5604, 0x3FD3410B,0xA25E5578, + 0x3FF5A1CA,0xC083126F, 0x3FD34D2B,0x13F626A8, + 0x3FF5A5E3,0x53F7CED9, 0x3FD35948,0x3A232EF1, + 0x3FF5A9FB,0xE76C8B44, 0x3FD36563,0x15C3A36B, + 0x3FF5AE14,0x7AE147AE, 0x3FD3717B,0xA7B53B27, + 0x3FF5B22D,0x0E560419, 0x3FD37D91,0xF0D52FA0, + 0x3FF5B645,0xA1CAC083, 0x3FD389A5,0xF2003D07, + 0x3FF5BA5E,0x353F7CEE, 0x3FD395B7,0xAC12A2B9, + 0x3FF5BE76,0xC8B43958, 0x3FD3A1C7,0x1FE82381, + 0x3FF5C28F,0x5C28F5C3, 0x3FD3ADD4,0x4E5C0613, + 0x3FF5C6A7,0xEF9DB22D, 0x3FD3B9DF,0x3849154E, + 0x3FF5CAC0,0x83126E98, 0x3FD3C5E7,0xDE89A0B1, + 0x3FF5CED9,0x16872B02, 0x3FD3D1EE,0x41F77CA4, + 0x3FF5D2F1,0xA9FBE76D, 0x3FD3DDF2,0x636C02E7, + 0x3FF5D70A,0x3D70A3D7, 0x3FD3E9F4,0x43C012D9, + 0x3FF5DB22,0xD0E56042, 0x3FD3F5F3,0xE3CC11EB, + 0x3FF5DF3B,0x645A1CAC, 0x3FD401F1,0x4467EBE3, + 0x3FF5E353,0xF7CED917, 0x3FD40DEC,0x666B1351, + 0x3FF5E76C,0x8B439581, 0x3FD419E5,0x4AAC81CF, + 0x3FF5EB85,0x1EB851EC, 0x3FD425DB,0xF202B876, + 0x3FF5EF9D,0xB22D0E56, 0x3FD431D0,0x5D43C01F, + 0x3FF5F3B6,0x45A1CAC1, 0x3FD43DC2,0x8D4529D2, + 0x3FF5F7CE,0xD916872B, 0x3FD449B2,0x82DC0F0D, + 0x3FF5FBE7,0x6C8B4396, 0x3FD455A0,0x3EDD1230, + 0x3FF60000,0x00000000, 0x3FD4618B,0xC21C5EC2, + 0x3FF60418,0x9374BC6A, 0x3FD46D75,0x0D6DA9DB, + 0x3FF60831,0x26E978D5, 0x3FD4795C,0x21A43274, + 0x3FF60C49,0xBA5E353F, 0x3FD48540,0xFF92C1B6, + 0x3FF61062,0x4DD2F1AA, 0x3FD49123,0xA80BAB69, + 0x3FF6147A,0xE147AE14, 0x3FD49D04,0x1BE0CE2F, + 0x3FF61893,0x74BC6A7F, 0x3FD4A8E2,0x5BE393F6, + 0x3FF61CAC,0x083126E9, 0x3FD4B4BE,0x68E4F233, + 0x3FF620C4,0x9BA5E354, 0x3FD4C098,0x43B56A55, + 0x3FF624DD,0x2F1A9FBE, 0x3FD4CC6F,0xED2509FF, + 0x3FF628F5,0xC28F5C29, 0x3FD4D845,0x66036B79, + 0x3FF62D0E,0x56041893, 0x3FD4E418,0xAF1FB5E9, + 0x3FF63126,0xE978D4FE, 0x3FD4EFE9,0xC9489DC3, + 0x3FF6353F,0x7CED9168, 0x3FD4FBB8,0xB54C6506, + 0x3FF63958,0x10624DD3, 0x3FD50785,0x73F8DBA6, + 0x3FF63D70,0xA3D70A3D, 0x3FD51350,0x061B5FCB, + 0x3FF64189,0x374BC6A8, 0x3FD51F18,0x6C80DE3B, + 0x3FF645A1,0xCAC08312, 0x3FD52ADE,0xA7F5D294, + 0x3FF649BA,0x5E353F7D, 0x3FD536A2,0xB94647BC, + 0x3FF64DD2,0xF1A9FBE7, 0x3FD54264,0xA13DD815, + 0x3FF651EB,0x851EB852, 0x3FD54E24,0x60A7ADEE, + 0x3FF65604,0x189374BC, 0x3FD559E1,0xF84E83BA, + 0x3FF65A1C,0xAC083127, 0x3FD5659D,0x68FCA47B, + 0x3FF65E35,0x3F7CED91, 0x3FD57156,0xB37BEBFB, + 0x3FF6624D,0xD2F1A9FC, 0x3FD57D0D,0xD895C734, + 0x3FF66666,0x66666666, 0x3FD588C2,0xD913348F, + 0x3FF66A7E,0xF9DB22D1, 0x3FD59475,0xB5BCC443, + 0x3FF66E97,0x8D4FDF3B, 0x3FD5A026,0x6F5A9899, + 0x3FF672B0,0x20C49BA6, 0x3FD5ABD5,0x06B4664A, + 0x3FF676C8,0xB4395810, 0x3FD5B781,0x7C9174BF, + 0x3FF67AE1,0x47AE147B, 0x3FD5C32B,0xD1B89E70, + 0x3FF67EF9,0xDB22D0E5, 0x3FD5CED4,0x06F05126, + 0x3FF68312,0x6E978D50, 0x3FD5DA7A,0x1CFE8E5A, + 0x3FF6872B,0x020C49BA, 0x3FD5E61E,0x14A8EB6D, + 0x3FF68B43,0x95810625, 0x3FD5F1BF,0xEEB49213, + 0x3FF68F5C,0x28F5C28F, 0x3FD5FD5F,0xABE64084, + 0x3FF69374,0xBC6A7EFA, 0x3FD608FD,0x4D0249E4, + 0x3FF6978D,0x4FDF3B64, 0x3FD61498,0xD2CC967C, + 0x3FF69BA5,0xE353F7CF, 0x3FD62032,0x3E08A417, + 0x3FF69FBE,0x76C8B439, 0x3FD62BC9,0x8F798642, + 0x3FF6A3D7,0x0A3D70A4, 0x3FD6375E,0xC7E1E6A8, + 0x3FF6A7EF,0x9DB22D0E, 0x3FD642F1,0xE804054C, + 0x3FF6AC08,0x3126E979, 0x3FD64E82,0xF0A1B8E9, + 0x3FF6B020,0xC49BA5E3, 0x3FD65A11,0xE27C6F2A, + 0x3FF6B439,0x5810624E, 0x3FD6659E,0xBE552D0D, + 0x3FF6B851,0xEB851EB8, 0x3FD67129,0x84EC8F15, + 0x3FF6BC6A,0x7EF9DB23, 0x3FD67CB2,0x3702C9AD, + 0x3FF6C083,0x126E978D, 0x3FD68838,0xD557A95E, + 0x3FF6C49B,0xA5E353F8, 0x3FD693BD,0x60AA932F, + 0x3FF6C8B4,0x39581062, 0x3FD69F3F,0xD9BA84D8, + 0x3FF6CCCC,0xCCCCCCCD, 0x3FD6AAC0,0x41461526, + 0x3FF6D0E5,0x60418937, 0x3FD6B63E,0x980B7429, + 0x3FF6D4FD,0xF3B645A2, 0x3FD6C1BA,0xDEC86B9B, + 0x3FF6D916,0x872B020C, 0x3FD6CD35,0x163A5F0E, + 0x3FF6DD2F,0x1A9FBE77, 0x3FD6D8AD,0x3F1E4C4C, + 0x3FF6E147,0xAE147AE1, 0x3FD6E423,0x5A30CB8D, + 0x3FF6E560,0x4189374C, 0x3FD6EF97,0x682E0FD1, + 0x3FF6E978,0xD4FDF3B6, 0x3FD6FB09,0x69D1E717, + 0x3FF6ED91,0x6872B021, 0x3FD70679,0x5FD7BAB9, + 0x3FF6F1A9,0xFBE76C8B, 0x3FD711E7,0x4AFA8F9D, + 0x3FF6F5C2,0x8F5C28F6, 0x3FD71D53,0x2BF50695, + 0x3FF6F9DB,0x22D0E560, 0x3FD728BD,0x03815C8D, + 0x3FF6FDF3,0xB645A1CB, 0x3FD73424,0xD2596AEC, + 0x3FF7020C,0x49BA5E35, 0x3FD73F8A,0x9936A7C4, + 0x3FF70624,0xDD2F1AA0, 0x3FD74AEE,0x58D2262D, + 0x3FF70A3D,0x70A3D70A, 0x3FD75650,0x11E49676, + 0x3FF70E56,0x04189375, 0x3FD761AF,0xC5264681, + 0x3FF7126E,0x978D4FDF, 0x3FD76D0D,0x734F21F5, + 0x3FF71687,0x2B020C4A, 0x3FD77869,0x1D16B299, + 0x3FF71A9F,0xBE76C8B4, 0x3FD783C2,0xC334207F, + 0x3FF71EB8,0x51EB851F, 0x3FD78F1A,0x665E3267, + 0x3FF722D0,0xE5604189, 0x3FD79A70,0x074B4DE8, + 0x3FF726E9,0x78D4FDF4, 0x3FD7A5C3,0xA6B177CC, + 0x3FF72B02,0x0C49BA5E, 0x3FD7B115,0x45465441, + 0x3FF72F1A,0x9FBE76C9, 0x3FD7BC64,0xE3BF272F, + 0x3FF73333,0x33333333, 0x3FD7C7B2,0x82D0D46B, + 0x3FF7374B,0xC6A7EF9E, 0x3FD7D2FE,0x232FE00D, + 0x3FF73B64,0x5A1CAC08, 0x3FD7DE47,0xC5906E9E, + 0x3FF73F7C,0xED916873, 0x3FD7E98F,0x6AA64574, + 0x3FF74395,0x810624DD, 0x3FD7F4D5,0x1324CADC, + 0x3FF747AE,0x147AE148, 0x3FD80018,0xBFBF0675, + 0x3FF74BC6,0xA7EF9DB2, 0x3FD80B5A,0x7127A15A, + 0x3FF74FDF,0x3B645A1D, 0x3FD8169A,0x2810E67F, + 0x3FF753F7,0xCED91687, 0x3FD821D7,0xE52CC2D8, + 0x3FF75810,0x624DD2F2, 0x3FD82D13,0xA92CC5B4, + 0x3FF75C28,0xF5C28F5C, 0x3FD8384D,0x74C220E9, + 0x3FF76041,0x89374BC7, 0x3FD84385,0x489DA929, + 0x3FF7645A,0x1CAC0831, 0x3FD84EBB,0x256FD631, + 0x3FF76872,0xB020C49C, 0x3FD859EF,0x0BE8C31B, + 0x3FF76C8B,0x43958106, 0x3FD86520,0xFCB82E8F, + 0x3FF770A3,0xD70A3D71, 0x3FD87050,0xF88D7B14, + 0x3FF774BC,0x6A7EF9DB, 0x3FD87B7F,0x0017AF3E, + 0x3FF778D4,0xFDF3B646, 0x3FD886AB,0x14057602, + 0x3FF77CED,0x916872B0, 0x3FD891D5,0x35051EE1, + 0x3FF78106,0x24DD2F1B, 0x3FD89CFD,0x63C49E40, + 0x3FF7851E,0xB851EB85, 0x3FD8A823,0xA0F18D8C, + 0x3FF78937,0x4BC6A7F0, 0x3FD8B347,0xED392B95, + 0x3FF78D4F,0xDF3B645A, 0x3FD8BE6A,0x49485CB2, + 0x3FF79168,0x72B020C5, 0x3FD8C98A,0xB5CBAB1B, + 0x3FF79581,0x0624DD2F, 0x3FD8D4A9,0x336F470E, + 0x3FF79999,0x9999999A, 0x3FD8DFC5,0xC2DF0724, + 0x3FF79DB2,0x2D0E5604, 0x3FD8EAE0,0x64C6687A, + 0x3FF7A1CA,0xC083126F, 0x3FD8F5F9,0x19D08F07, + 0x3FF7A5E3,0x53F7CED9, 0x3FD9010F,0xE2A845C0, + 0x3FF7A9FB,0xE76C8B44, 0x3FD90C24,0xBFF7FEEC, + 0x3FF7AE14,0x7AE147AE, 0x3FD91737,0xB269D44E, + 0x3FF7B22D,0x0E560419, 0x3FD92248,0xBAA78778, + 0x3FF7B645,0xA1CAC083, 0x3FD92D57,0xD95A81F0, + 0x3FF7BA5E,0x353F7CEE, 0x3FD93865,0x0F2BD582, + 0x3FF7BE76,0xC8B43958, 0x3FD94370,0x5CC43C6B, + 0x3FF7C28F,0x5C28F5C3, 0x3FD94E79,0xC2CC19A7, + 0x3FF7C6A7,0xEF9DB22D, 0x3FD95981,0x41EB791A, + 0x3FF7CAC0,0x83126E98, 0x3FD96486,0xDACA0FDE, + 0x3FF7CED9,0x16872B02, 0x3FD96F8A,0x8E0F3C6F, + 0x3FF7D2F1,0xA9FBE76D, 0x3FD97A8C,0x5C6206F7, + 0x3FF7D70A,0x3D70A3D7, 0x3FD9858C,0x46692177, + 0x3FF7DB22,0xD0E56042, 0x3FD9908A,0x4CCAE814, + 0x3FF7DF3B,0x645A1CAC, 0x3FD99B86,0x702D6142, + 0x3FF7E353,0xF7CED917, 0x3FD9A680,0xB1363E0E, + 0x3FF7E76C,0x8B439581, 0x3FD9B179,0x108ADA49, + 0x3FF7EB85,0x1EB851EC, 0x3FD9BC6F,0x8ED03CD3, + 0x3FF7EF9D,0xB22D0E56, 0x3FD9C764,0x2CAB17C3, + 0x3FF7F3B6,0x45A1CAC1, 0x3FD9D256,0xEABFC8B5, + 0x3FF7F7CE,0xD916872B, 0x3FD9DD47,0xC9B258EF, + 0x3FF7FBE7,0x6C8B4396, 0x3FD9E836,0xCA267DAD, + 0x3FF80000,0x00000000, 0x3FD9F323,0xECBF984C, + 0x3FF80418,0x9374BC6A, 0x3FD9FE0F,0x3220B68E, + 0x3FF80831,0x26E978D5, 0x3FDA08F8,0x9AEC92D0, + 0x3FF80C49,0xBA5E353F, 0x3FDA13E0,0x27C59439, + 0x3FF81062,0x4DD2F1AA, 0x3FDA1EC5,0xD94DCF07, + 0x3FF8147A,0xE147AE14, 0x3FDA29A9,0xB02704AE, + 0x3FF81893,0x74BC6A7F, 0x3FDA348B,0xACF2A42C, + 0x3FF81CAC,0x083126E9, 0x3FDA3F6B,0xD051CA25, + 0x3FF820C4,0x9BA5E354, 0x3FDA4A4A,0x1AE54137, + 0x3FF824DD,0x2F1A9FBE, 0x3FDA5526,0x8D4D8214, + 0x3FF828F5,0xC28F5C29, 0x3FDA6001,0x282AB3D9, + 0x3FF82D0E,0x56041893, 0x3FDA6AD9,0xEC1CAC26, + 0x3FF83126,0xE978D4FE, 0x3FDA75B0,0xD9C2EF74, + 0x3FF8353F,0x7CED9168, 0x3FDA8085,0xF1BCB12D, + 0x3FF83958,0x10624DD3, 0x3FDA8B59,0x34A8D400, + 0x3FF83D70,0xA3D70A3D, 0x3FDA962A,0xA325E9FE, + 0x3FF84189,0x374BC6A8, 0x3FDAA0FA,0x3DD234EA, + 0x3FF845A1,0xCAC08312, 0x3FDAABC8,0x054BA652, + 0x3FF849BA,0x5E353F7D, 0x3FDAB693,0xFA2FDFE3, + 0x3FF84DD2,0xF1A9FBE7, 0x3FDAC15E,0x1D1C3385, + 0x3FF851EB,0x851EB852, 0x3FDACC26,0x6EADA3A7, + 0x3FF85604,0x189374BC, 0x3FDAD6EC,0xEF80E35F, + 0x3FF85A1C,0xAC083127, 0x3FDAE1B1,0xA03256B6, + 0x3FF85E35,0x3F7CED91, 0x3FDAEC74,0x815E12C6, + 0x3FF8624D,0xD2F1A9FC, 0x3FDAF735,0x939FDE05, + 0x3FF86666,0x66666666, 0x3FDB01F4,0xD7933064, + 0x3FF86A7E,0xF9DB22D1, 0x3FDB0CB2,0x4DD3339C, + 0x3FF86E97,0x8D4FDF3B, 0x3FDB176D,0xF6FAC34A, + 0x3FF872B0,0x20C49BA6, 0x3FDB2227,0xD3A46D37, + 0x3FF876C8,0xB4395810, 0x3FDB2CDF,0xE46A717D, + 0x3FF87AE1,0x47AE147B, 0x3FDB3796,0x29E6C2CB, + 0x3FF87EF9,0xDB22D0E5, 0x3FDB424A,0xA4B30686, + 0x3FF88312,0x6E978D50, 0x3FDB4CFD,0x5568950F, + 0x3FF8872B,0x020C49BA, 0x3FDB57AE,0x3CA079E6, + 0x3FF88B43,0x95810625, 0x3FDB625D,0x5AF373EE, + 0x3FF88F5C,0x28F5C28F, 0x3FDB6D0A,0xB0F9F58E, + 0x3FF89374,0xBC6A7EFA, 0x3FDB77B6,0x3F4C24F8, + 0x3FF8978D,0x4FDF3B64, 0x3FDB8260,0x0681DC46, + 0x3FF89BA5,0xE353F7CF, 0x3FDB8D08,0x0732A9C3, + 0x3FF89FBE,0x76C8B439, 0x3FDB97AE,0x41F5D008, + 0x3FF8A3D7,0x0A3D70A4, 0x3FDBA252,0xB7624642, + 0x3FF8A7EF,0x9DB22D0E, 0x3FDBACF5,0x680EB851, + 0x3FF8AC08,0x3126E979, 0x3FDBB796,0x54918710, + 0x3FF8B020,0xC49BA5E3, 0x3FDBC235,0x7D80C86D, + 0x3FF8B439,0x5810624E, 0x3FDBCCD2,0xE37247B7, + 0x3FF8B851,0xEB851EB8, 0x3FDBD76E,0x86FB85B1, + 0x3FF8BC6A,0x7EF9DB23, 0x3FDBE208,0x68B1B8E3, + 0x3FF8C083,0x126E978D, 0x3FDBECA0,0x8929CDAF, + 0x3FF8C49B,0xA5E353F8, 0x3FDBF736,0xE8F86696, + 0x3FF8C8B4,0x39581062, 0x3FDC01CB,0x88B1DC5C, + 0x3FF8CCCC,0xCCCCCCCD, 0x3FDC0C5E,0x68EA3E46, + 0x3FF8D0E5,0x60418937, 0x3FDC16EF,0x8A355236, + 0x3FF8D4FD,0xF3B645A2, 0x3FDC217E,0xED2694F6, + 0x3FF8D916,0x872B020C, 0x3FDC2C0C,0x92513A4E, + 0x3FF8DD2F,0x1A9FBE77, 0x3FDC3698,0x7A482D4C, + 0x3FF8E147,0xAE147AE1, 0x3FDC4122,0xA59E105C, + 0x3FF8E560,0x4189374C, 0x3FDC4BAB,0x14E53D91, + 0x3FF8E978,0xD4FDF3B6, 0x3FDC5631,0xC8AFC6BA, + 0x3FF8ED91,0x6872B021, 0x3FDC60B6,0xC18F75AC, + 0x3FF8F1A9,0xFBE76C8B, 0x3FDC6B3A,0x0015CC5A, + 0x3FF8F5C2,0x8F5C28F6, 0x3FDC75BB,0x84D40518, + 0x3FF8F9DB,0x22D0E560, 0x3FDC803B,0x505B12B7, + 0x3FF8FDF3,0xB645A1CB, 0x3FDC8AB9,0x633BA0C8, + 0x3FF9020C,0x49BA5E35, 0x3FDC9535,0xBE0613B6, + 0x3FF90624,0xDD2F1AA0, 0x3FDC9FB0,0x614A8908, + 0x3FF90A3D,0x70A3D70A, 0x3FDCAA29,0x4D98D77E, + 0x3FF90E56,0x04189375, 0x3FDCB4A0,0x83808F50, + 0x3FF9126E,0x978D4FDF, 0x3FDCBF16,0x0390FA4A, + 0x3FF91687,0x2B020C4A, 0x3FDCC989,0xCE591C0F, + 0x3FF91A9F,0xBE76C8B4, 0x3FDCD3FB,0xE467B230, + 0x3FF91EB8,0x51EB851F, 0x3FDCDE6C,0x464B346F, + 0x3FF922D0,0xE5604189, 0x3FDCE8DA,0xF491D4DA, + 0x3FF926E9,0x78D4FDF4, 0x3FDCF347,0xEFC9800A, + 0x3FF92B02,0x0C49BA5E, 0x3FDCFDB3,0x387FDD3F, + 0x3FF92F1A,0x9FBE76C9, 0x3FDD081C,0xCF424E9D, + 0x3FF93333,0x33333333, 0x3FDD1284,0xB49DF149, + 0x3FF9374B,0xC6A7EF9E, 0x3FDD1CEA,0xE91F9DA8, + 0x3FF93B64,0x5A1CAC08, 0x3FDD274F,0x6D53E779, + 0x3FF93F7C,0xED916873, 0x3FDD31B2,0x41C71E12, + 0x3FF94395,0x810624DD, 0x3FDD3C13,0x67054C7E, + 0x3FF947AE,0x147AE148, 0x3FDD4672,0xDD9A39B7, + 0x3FF94BC6,0xA7EF9DB2, 0x3FDD50D0,0xA61168C4, + 0x3FF94FDF,0x3B645A1D, 0x3FDD5B2C,0xC0F618F4, + 0x3FF953F7,0xCED91687, 0x3FDD6587,0x2ED345FA, + 0x3FF95810,0x624DD2F2, 0x3FDD6FDF,0xF033A829, + 0x3FF95C28,0xF5C28F5C, 0x3FDD7A37,0x05A1B48F, + 0x3FF96041,0x89374BC7, 0x3FDD848C,0x6FA79D31, + 0x3FF9645A,0x1CAC0831, 0x3FDD8EE0,0x2ECF5126, + 0x3FF96872,0xB020C49C, 0x3FDD9932,0x43A27CD3, + 0x3FF96C8B,0x43958106, 0x3FDDA382,0xAEAA8A04, + 0x3FF970A3,0xD70A3D71, 0x3FDDADD1,0x7070A029, + 0x3FF974BC,0x6A7EF9DB, 0x3FDDB81E,0x897DA46E, + 0x3FF978D4,0xFDF3B646, 0x3FDDC269,0xFA5A39FA, + 0x3FF97CED,0x916872B0, 0x3FDDCCB3,0xC38EC206, + 0x3FF98106,0x24DD2F1B, 0x3FDDD6FB,0xE5A35C18, + 0x3FF9851E,0xB851EB85, 0x3FDDE142,0x611FE61D, + 0x3FF98937,0x4BC6A7F0, 0x3FDDEB87,0x368BFCA5, + 0x3FF98D4F,0xDF3B645A, 0x3FDDF5CA,0x666EFAFA, + 0x3FF99168,0x72B020C5, 0x3FDE000B,0xF14FFB5C, + 0x3FF99581,0x0624DD2F, 0x3FDE0A4B,0xD7B5D71B, + 0x3FF99999,0x9999999A, 0x3FDE148A,0x1A2726CF, + 0x3FF99DB2,0x2D0E5604, 0x3FDE1EC6,0xB92A426F, + 0x3FF9A1CA,0xC083126F, 0x3FDE2901,0xB5454193, + 0x3FF9A5E3,0x53F7CED9, 0x3FDE333B,0x0EFDFB83, + 0x3FF9A9FB,0xE76C8B44, 0x3FDE3D72,0xC6DA0777, + 0x3FF9AE14,0x7AE147AE, 0x3FDE47A8,0xDD5EBCAB, + 0x3FF9B22D,0x0E560419, 0x3FDE51DD,0x5311329C, + 0x3FF9B645,0xA1CAC083, 0x3FDE5C10,0x2876411F, + 0x3FF9BA5E,0x353F7CEE, 0x3FDE6641,0x5E128098, + 0x3FF9BE76,0xC8B43958, 0x3FDE7070,0xF46A4A16, + 0x3FF9C28F,0x5C28F5C3, 0x3FDE7A9E,0xEC01B787, + 0x3FF9C6A7,0xEF9DB22D, 0x3FDE84CB,0x455CA3D2, + 0x3FF9CAC0,0x83126E98, 0x3FDE8EF6,0x00FEAB11, + 0x3FF9CED9,0x16872B02, 0x3FDE991F,0x1F6B2AA7, + 0x3FF9D2F1,0xA9FBE76D, 0x3FDEA346,0xA1254176, + 0x3FF9D70A,0x3D70A3D7, 0x3FDEAD6C,0x86AFCFFB, + 0x3FF9DB22,0xD0E56042, 0x3FDEB790,0xD08D7882, + 0x3FF9DF3B,0x645A1CAC, 0x3FDEC1B3,0x7F409F3E, + 0x3FF9E353,0xF7CED917, 0x3FDECBD4,0x934B6A83, + 0x3FF9E76C,0x8B439581, 0x3FDED5F4,0x0D2FC2D7, + 0x3FF9EB85,0x1EB851EC, 0x3FDEE011,0xED6F5331, + 0x3FF9EF9D,0xB22D0E56, 0x3FDEEA2E,0x348B890A, + 0x3FF9F3B6,0x45A1CAC1, 0x3FDEF448,0xE3059497, + 0x3FF9F7CE,0xD916872B, 0x3FDEFE61,0xF95E68DD, + 0x3FF9FBE7,0x6C8B4396, 0x3FDF0879,0x7816BBEB, + 0x3FFA0000,0x00000000, 0x3FDF128F,0x5FAF06ED, + 0x3FFA0418,0x9374BC6A, 0x3FDF1CA3,0xB0A78661, + 0x3FFA0831,0x26E978D5, 0x3FDF26B6,0x6B803A3B, + 0x3FFA0C49,0xBA5E353F, 0x3FDF30C7,0x90B8E5FF, + 0x3FFA1062,0x4DD2F1AA, 0x3FDF3AD7,0x20D110FB, + 0x3FFA147A,0xE147AE14, 0x3FDF44E5,0x1C480657, + 0x3FFA1893,0x74BC6A7F, 0x3FDF4EF1,0x839CD550, + 0x3FFA1CAC,0x083126E9, 0x3FDF58FC,0x574E514B, + 0x3FFA20C4,0x9BA5E354, 0x3FDF6305,0x97DB120B, + 0x3FFA24DD,0x2F1A9FBE, 0x3FDF6D0D,0x45C173C5, + 0x3FFA28F5,0xC28F5C29, 0x3FDF7713,0x617F9758, + 0x3FFA2D0E,0x56041893, 0x3FDF8117,0xEB936260, + 0x3FFA3126,0xE978D4FE, 0x3FDF8B1A,0xE47A7F6C, + 0x3FFA353F,0x7CED9168, 0x3FDF951C,0x4CB25E13, + 0x3FFA3958,0x10624DD3, 0x3FDF9F1C,0x24B83329, + 0x3FFA3D70,0xA3D70A3D, 0x3FDFA91A,0x6D08F8D1, + 0x3FFA4189,0x374BC6A8, 0x3FDFB317,0x26216EB8, + 0x3FFA45A1,0xCAC08312, 0x3FDFBD12,0x507E1A21, + 0x3FFA49BA,0x5E353F7D, 0x3FDFC70B,0xEC9B4621, + 0x3FFA4DD2,0xF1A9FBE7, 0x3FDFD103,0xFAF503AF, + 0x3FFA51EB,0x851EB852, 0x3FDFDAFA,0x7C0729DA, + 0x3FFA5604,0x189374BC, 0x3FDFE4EF,0x704D55DA, + 0x3FFA5A1C,0xAC083127, 0x3FDFEEE2,0xD842EB49, + 0x3FFA5E35,0x3F7CED91, 0x3FDFF8D4,0xB4631433, + 0x3FFA624D,0xD2F1A9FC, 0x3FE00162,0x829460A5, + 0x3FFA6666,0x66666666, 0x3FE00659,0xE58754FE, + 0x3FFA6A7E,0xF9DB22D1, 0x3FE00B50,0x8347A653, + 0x3FFA6E97,0x8D4FDF3B, 0x3FE01046,0x5C127750, + 0x3FFA72B0,0x20C49BA6, 0x3FE0153B,0x7024CE40, + 0x3FFA76C8,0xB4395810, 0x3FE01A2F,0xBFBB950E, + 0x3FFA7AE1,0x47AE147B, 0x3FE01F23,0x4B139965, + 0x3FFA7EF9,0xDB22D0E5, 0x3FE02416,0x12698CB6, + 0x3FFA8312,0x6E978D50, 0x3FE02908,0x15FA0451, + 0x3FFA872B,0x020C49BA, 0x3FE02DF9,0x56017973, + 0x3FFA8B43,0x95810625, 0x3FE032E9,0xD2BC495A, + 0x3FFA8F5C,0x28F5C28F, 0x3FE037D9,0x8C66B550, + 0x3FFA9374,0xBC6A7EFA, 0x3FE03CC8,0x833CE2C5, + 0x3FFA978D,0x4FDF3B64, 0x3FE041B6,0xB77ADB5A, + 0x3FFA9BA5,0xE353F7CF, 0x3FE046A4,0x295C8CF4, + 0x3FFA9FBE,0x76C8B439, 0x3FE04B90,0xD91DC9CC, + 0x3FFAA3D7,0x0A3D70A4, 0x3FE0507C,0xC6FA4884, + 0x3FFAA7EF,0x9DB22D0E, 0x3FE05567,0xF32DA431, + 0x3FFAAC08,0x3126E979, 0x3FE05A52,0x5DF35C75, + 0x3FFAB020,0xC49BA5E3, 0x3FE05F3C,0x0786D583, + 0x3FFAB439,0x5810624E, 0x3FE06424,0xF0235842, + 0x3FFAB851,0xEB851EB8, 0x3FE0690D,0x18041249, + 0x3FFABC6A,0x7EF9DB23, 0x3FE06DF4,0x7F641601, + 0x3FFAC083,0x126E978D, 0x3FE072DB,0x267E5AAC, + 0x3FFAC49B,0xA5E353F8, 0x3FE077C1,0x0D8DBC7A, + 0x3FFAC8B4,0x39581062, 0x3FE07CA6,0x34CCFC94, + 0x3FFACCCC,0xCCCCCCCD, 0x3FE0818A,0x9C76C137, + 0x3FFAD0E5,0x60418937, 0x3FE0866E,0x44C595B7, + 0x3FFAD4FD,0xF3B645A2, 0x3FE08B51,0x2DF3EA9C, + 0x3FFAD916,0x872B020C, 0x3FE09033,0x583C15A7, + 0x3FFADD2F,0x1A9FBE77, 0x3FE09514,0xC3D851F0, + 0x3FFAE147,0xAE147AE1, 0x3FE099F5,0x7102BFE5, + 0x3FFAE560,0x4189374C, 0x3FE09ED5,0x5FF5656B, + 0x3FFAE978,0xD4FDF3B6, 0x3FE0A3B4,0x90EA2DE3, + 0x3FFAED91,0x6872B021, 0x3FE0A893,0x041AEA3F, + 0x3FFAF1A9,0xFBE76C8B, 0x3FE0AD70,0xB9C1510F, + 0x3FFAF5C2,0x8F5C28F6, 0x3FE0B24D,0xB216FE96, + 0x3FFAF9DB,0x22D0E560, 0x3FE0B729,0xED5574D5, + 0x3FFAFDF3,0xB645A1CB, 0x3FE0BC05,0x6BB61B9F, + 0x3FFB020C,0x49BA5E35, 0x3FE0C0E0,0x2D7240A2, + 0x3FFB0624,0xDD2F1AA0, 0x3FE0C5BA,0x32C31782, + 0x3FFB0A3D,0x70A3D70A, 0x3FE0CA93,0x7BE1B9DC, + 0x3FFB0E56,0x04189375, 0x3FE0CF6C,0x09072762, + 0x3FFB126E,0x978D4FDF, 0x3FE0D443,0xDA6C45E0, + 0x3FFB1687,0x2B020C4A, 0x3FE0D91A,0xF049E155, + 0x3FFB1A9F,0xBE76C8B4, 0x3FE0DDF1,0x4AD8ABF9, + 0x3FFB1EB8,0x51EB851F, 0x3FE0E2C6,0xEA513E58, + 0x3FFB22D0,0xE5604189, 0x3FE0E79B,0xCEEC1754, + 0x3FFB26E9,0x78D4FDF4, 0x3FE0EC6F,0xF8E19C44, + 0x3FFB2B02,0x0C49BA5E, 0x3FE0F143,0x686A18F1, + 0x3FFB2F1A,0x9FBE76C9, 0x3FE0F616,0x1DBDBFBA, + 0x3FFB3333,0x33333333, 0x3FE0FAE8,0x1914A991, + 0x3FFB374B,0xC6A7EF9E, 0x3FE0FFB9,0x5AA6D617, + 0x3FFB3B64,0x5A1CAC08, 0x3FE10489,0xE2AC2BA2, + 0x3FFB3F7C,0xED916873, 0x3FE10959,0xB15C7756, + 0x3FFB4395,0x810624DD, 0x3FE10E28,0xC6EF6D28, + 0x3FFB47AE,0x147AE148, 0x3FE112F7,0x239CA7FC, + 0x3FFB4BC6,0xA7EF9DB2, 0x3FE117C4,0xC79BA9A3, + 0x3FFB4FDF,0x3B645A1D, 0x3FE11C91,0xB323DAFC, + 0x3FFB53F7,0xCED91687, 0x3FE1215D,0xE66C8BF2, + 0x3FFB5810,0x624DD2F2, 0x3FE12629,0x61ACF398, + 0x3FFB5C28,0xF5C28F5C, 0x3FE12AF4,0x251C3030, + 0x3FFB6041,0x89374BC7, 0x3FE12FBE,0x30F1473F, + 0x3FFB645A,0x1CAC0831, 0x3FE13487,0x85632596, + 0x3FFB6872,0xB020C49C, 0x3FE13950,0x22A89F69, + 0x3FFB6C8B,0x43958106, 0x3FE13E18,0x08F87053, + 0x3FFB70A3,0xD70A3D71, 0x3FE142DF,0x38893B71, + 0x3FFB74BC,0x6A7EF9DB, 0x3FE147A5,0xB1918B64, + 0x3FFB78D4,0xFDF3B646, 0x3FE14C6B,0x7447D26B, + 0x3FFB7CED,0x916872B0, 0x3FE15130,0x80E26A69, + 0x3FFB8106,0x24DD2F1B, 0x3FE155F4,0xD79794F9, + 0x3FFB851E,0xB851EB85, 0x3FE15AB8,0x789D7B77, + 0x3FFB8937,0x4BC6A7F0, 0x3FE15F7B,0x642A2F16, + 0x3FFB8D4F,0xDF3B645A, 0x3FE1643D,0x9A73A8E7, + 0x3FFB9168,0x72B020C5, 0x3FE168FF,0x1BAFC9EE, + 0x3FFB9581,0x0624DD2F, 0x3FE16DBF,0xE8145B28, + 0x3FFB9999,0x9999999A, 0x3FE1727F,0xFFD70DA1, + 0x3FFB9DB2,0x2D0E5604, 0x3FE1773F,0x632D7A7F, + 0x3FFBA1CA,0xC083126F, 0x3FE17BFE,0x124D2310, + 0x3FFBA5E3,0x53F7CED9, 0x3FE180BC,0x0D6B70D9, + 0x3FFBA9FB,0xE76C8B44, 0x3FE18579,0x54BDB5A3, + 0x3FFBAE14,0x7AE147AE, 0x3FE18A35,0xE8792B89, + 0x3FFBB22D,0x0E560419, 0x3FE18EF1,0xC8D2F509, + 0x3FFBB645,0xA1CAC083, 0x3FE193AC,0xF6001D0E, + 0x3FFBBA5E,0x353F7CEE, 0x3FE19867,0x70359700, + 0x3FFBBE76,0xC8B43958, 0x3FE19D21,0x37A83ED1, + 0x3FFBC28F,0x5C28F5C3, 0x3FE1A1DA,0x4C8CD90C, + 0x3FFBC6A7,0xEF9DB22D, 0x3FE1A692,0xAF1812E2, + 0x3FFBCAC0,0x83126E98, 0x3FE1AB4A,0x5F7E8238, + 0x3FFBCED9,0x16872B02, 0x3FE1B001,0x5DF4A5B4, + 0x3FFBD2F1,0xA9FBE76D, 0x3FE1B4B7,0xAAAEE4CD, + 0x3FFBD70A,0x3D70A3D7, 0x3FE1B96D,0x45E18FD3, + 0x3FFBDB22,0xD0E56042, 0x3FE1BE22,0x2FC0E007, + 0x3FFBDF3B,0x645A1CAC, 0x3FE1C2D6,0x6880F79C, + 0x3FFBE353,0xF7CED917, 0x3FE1C789,0xF055E1CF, + 0x3FFBE76C,0x8B439581, 0x3FE1CC3C,0xC77392ED, + 0x3FFBEB85,0x1EB851EC, 0x3FE1D0EE,0xEE0DE867, + 0x3FFBEF9D,0xB22D0E56, 0x3FE1D5A0,0x6458A8D7, + 0x3FFBF3B6,0x45A1CAC1, 0x3FE1DA51,0x2A87841A, + 0x3FFBF7CE,0xD916872B, 0x3FE1DF01,0x40CE134E, + 0x3FFBFBE7,0x6C8B4396, 0x3FE1E3B0,0xA75FD8ED, + 0x3FFC0000,0x00000000, 0x3FE1E85F,0x5E7040D0, + 0x3FFC0418,0x9374BC6A, 0x3FE1ED0D,0x6632A044, + 0x3FFC0831,0x26E978D5, 0x3FE1F1BA,0xBEDA3612, + 0x3FFC0C49,0xBA5E353F, 0x3FE1F667,0x689A2A8E, + 0x3FFC1062,0x4DD2F1AA, 0x3FE1FB13,0x63A58FA5, + 0x3FFC147A,0xE147AE14, 0x3FE1FFBE,0xB02F60E8, + 0x3FFC1893,0x74BC6A7F, 0x3FE20469,0x4E6A839B, + 0x3FFC1CAC,0x083126E9, 0x3FE20913,0x3E89C6C0, + 0x3FFC20C4,0x9BA5E354, 0x3FE20DBC,0x80BFE327, + 0x3FFC24DD,0x2F1A9FBE, 0x3FE21265,0x153F7B77, + 0x3FFC28F5,0xC28F5C29, 0x3FE2170C,0xFC3B1C40, + 0x3FFC2D0E,0x56041893, 0x3FE21BB4,0x35E53C00, + 0x3FFC3126,0xE978D4FE, 0x3FE2205A,0xC2703B3A, + 0x3FFC353F,0x7CED9168, 0x3FE22500,0xA20E6478, + 0x3FFC3958,0x10624DD3, 0x3FE229A5,0xD4F1EC64, + 0x3FFC3D70,0xA3D70A3D, 0x3FE22E4A,0x5B4CF1C6, + 0x3FFC4189,0x374BC6A8, 0x3FE232EE,0x35517DA0, + 0x3FFC45A1,0xCAC08312, 0x3FE23791,0x6331832C, + 0x3FFC49BA,0x5E353F7D, 0x3FE23C33,0xE51EDFF7, + 0x3FFC4DD2,0xF1A9FBE7, 0x3FE240D5,0xBB4B5BDF, + 0x3FFC51EB,0x851EB852, 0x3FE24576,0xE5E8A92F, + 0x3FFC5604,0x189374BC, 0x3FE24A17,0x6528649B, + 0x3FFC5A1C,0xAC083127, 0x3FE24EB7,0x393C155C, + 0x3FFC5E35,0x3F7CED91, 0x3FE25356,0x62552D30, + 0x3FFC624D,0xD2F1A9FC, 0x3FE257F4,0xE0A50870, + 0x3FFC6666,0x66666666, 0x3FE25C92,0xB45CEE13, + 0x3FFC6A7E,0xF9DB22D1, 0x3FE2612F,0xDDAE0FC5, + 0x3FFC6E97,0x8D4FDF3B, 0x3FE265CC,0x5CC989E8, + 0x3FFC72B0,0x20C49BA6, 0x3FE26A68,0x31E063AD, + 0x3FFC76C8,0xB4395810, 0x3FE26F03,0x5D238F10, + 0x3FFC7AE1,0x47AE147B, 0x3FE2739D,0xDEC3E8F5, + 0x3FFC7EF9,0xDB22D0E5, 0x3FE27837,0xB6F23928, + 0x3FFC8312,0x6E978D50, 0x3FE27CD0,0xE5DF3271, + 0x3FFC872B,0x020C49BA, 0x3FE28169,0x6BBB7298, + 0x3FFC8B43,0x95810625, 0x3FE28601,0x48B7827B, + 0x3FFC8F5C,0x28F5C28F, 0x3FE28A98,0x7D03D60F, + 0x3FFC9374,0xBC6A7EFA, 0x3FE28F2F,0x08D0CC78, + 0x3FFC978D,0x4FDF3B64, 0x3FE293C4,0xEC4EB009, + 0x3FFC9BA5,0xE353F7CF, 0x3FE2985A,0x27ADB659, + 0x3FFC9FBE,0x76C8B439, 0x3FE29CEE,0xBB1E0049, + 0x3FFCA3D7,0x0A3D70A4, 0x3FE2A182,0xA6CF9A15, + 0x3FFCA7EF,0x9DB22D0E, 0x3FE2A615,0xEAF27B59, + 0x3FFCAC08,0x3126E979, 0x3FE2AAA8,0x87B68726, + 0x3FFCB020,0xC49BA5E3, 0x3FE2AF3A,0x7D4B8C04, + 0x3FFCB439,0x5810624E, 0x3FE2B3CB,0xCBE14407, + 0x3FFCB851,0xEB851EB8, 0x3FE2B85C,0x73A754CF, + 0x3FFCBC6A,0x7EF9DB23, 0x3FE2BCEC,0x74CD4FA2, + 0x3FFCC083,0x126E978D, 0x3FE2C17B,0xCF82B16C, + 0x3FFCC49B,0xA5E353F8, 0x3FE2C60A,0x83F6E2D0, + 0x3FFCC8B4,0x39581062, 0x3FE2CA98,0x92593832, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FE2CF25,0xFAD8F1C4, + 0x3FFCD0E5,0x60418937, 0x3FE2D3B2,0xBDA53B8E, + 0x3FFCD4FD,0xF3B645A2, 0x3FE2D83E,0xDAED2D7F, + 0x3FFCD916,0x872B020C, 0x3FE2DCCA,0x52DFCB73, + 0x3FFCDD2F,0x1A9FBE77, 0x3FE2E155,0x25AC0542, + 0x3FFCE147,0xAE147AE1, 0x3FE2E5DF,0x5380B6C8, + 0x3FFCE560,0x4189374C, 0x3FE2EA68,0xDC8CA7F6, + 0x3FFCE978,0xD4FDF3B6, 0x3FE2EEF1,0xC0FE8CD4, + 0x3FFCED91,0x6872B021, 0x3FE2F37A,0x01050599, + 0x3FFCF1A9,0xFBE76C8B, 0x3FE2F801,0x9CCE9EA8, + 0x3FFCF5C2,0x8F5C28F6, 0x3FE2FC88,0x9489D0A9, + 0x3FFCF9DB,0x22D0E560, 0x3FE3010E,0xE8650088, + 0x3FFCFDF3,0xB645A1CB, 0x3FE30594,0x988E7F8A, + 0x3FFD020C,0x49BA5E35, 0x3FE30A19,0xA5348B50, + 0x3FFD0624,0xDD2F1AA0, 0x3FE30E9E,0x0E854DE9, + 0x3FFD0A3D,0x70A3D70A, 0x3FE31321,0xD4AEDDD7, + 0x3FFD0E56,0x04189375, 0x3FE317A4,0xF7DF3E21, + 0x3FFD126E,0x978D4FDF, 0x3FE31C27,0x78445E56, + 0x3FFD1687,0x2B020C4A, 0x3FE320A9,0x560C1A9E, + 0x3FFD1A9F,0xBE76C8B4, 0x3FE3252A,0x91643BC0, + 0x3FFD1EB8,0x51EB851F, 0x3FE329AB,0x2A7A7736, + 0x3FFD22D0,0xE5604189, 0x3FE32E2B,0x217C6F2A, + 0x3FFD26E9,0x78D4FDF4, 0x3FE332AA,0x7697B28E, + 0x3FFD2B02,0x0C49BA5E, 0x3FE33729,0x29F9BD1E, + 0x3FFD2F1A,0x9FBE76C9, 0x3FE33BA7,0x3BCFF771, + 0x3FFD3333,0x33333333, 0x3FE34024,0xAC47B6FD, + 0x3FFD374B,0xC6A7EF9E, 0x3FE344A1,0x7B8E3E29, + 0x3FFD3B64,0x5A1CAC08, 0x3FE3491D,0xA9D0BC52, + 0x3FFD3F7C,0xED916873, 0x3FE34D99,0x373C4DD9, + 0x3FFD4395,0x810624DD, 0x3FE35214,0x23FDFC2B, + 0x3FFD47AE,0x147AE148, 0x3FE3568E,0x7042BDD0, + 0x3FFD4BC6,0xA7EF9DB2, 0x3FE35B08,0x1C377670, + 0x3FFD4FDF,0x3B645A1D, 0x3FE35F81,0x2808F6E1, + 0x3FFD53F7,0xCED91687, 0x3FE363F9,0x93E3FD30, + 0x3FFD5810,0x624DD2F2, 0x3FE36871,0x5FF534AF, + 0x3FFD5C28,0xF5C28F5C, 0x3FE36CE8,0x8C6935F9, + 0x3FFD6041,0x89374BC7, 0x3FE3715F,0x196C8703, + 0x3FFD645A,0x1CAC0831, 0x3FE375D5,0x072B9B22, + 0x3FFD6872,0xB020C49C, 0x3FE37A4A,0x55D2D317, + 0x3FFD6C8B,0x43958106, 0x3FE37EBF,0x058E7D19, + 0x3FFD70A3,0xD70A3D71, 0x3FE38333,0x168AD4E2, + 0x3FFD74BC,0x6A7EF9DB, 0x3FE387A6,0x88F403B3, + 0x3FFD78D4,0xFDF3B646, 0x3FE38C19,0x5CF62066, + 0x3FFD7CED,0x916872B0, 0x3FE3908B,0x92BD2F70, + 0x3FFD8106,0x24DD2F1B, 0x3FE394FD,0x2A7522F4, + 0x3FFD851E,0xB851EB85, 0x3FE3996E,0x2449DAC6, + 0x3FFD8937,0x4BC6A7F0, 0x3FE39DDE,0x80672479, + 0x3FFD8D4F,0xDF3B645A, 0x3FE3A24E,0x3EF8BB67, + 0x3FFD9168,0x72B020C5, 0x3FE3A6BD,0x602A48BF, + 0x3FFD9581,0x0624DD2F, 0x3FE3AB2B,0xE4276386, + 0x3FFD9999,0x9999999A, 0x3FE3AF99,0xCB1B90B0, + 0x3FFD9DB2,0x2D0E5604, 0x3FE3B407,0x15324319, + 0x3FFDA1CA,0xC083126F, 0x3FE3B873,0xC296DB9D, + 0x3FFDA5E3,0x53F7CED9, 0x3FE3BCDF,0xD374A917, + 0x3FFDA9FB,0xE76C8B44, 0x3FE3C14B,0x47F6E877, + 0x3FFDAE14,0x7AE147AE, 0x3FE3C5B6,0x2048C4BE, + 0x3FFDB22D,0x0E560419, 0x3FE3CA20,0x5C955715, + 0x3FFDB645,0xA1CAC083, 0x3FE3CE89,0xFD07A6CA, + 0x3FFDBA5E,0x353F7CEE, 0x3FE3D2F3,0x01CAA969, + 0x3FFDBE76,0xC8B43958, 0x3FE3D75B,0x6B0942B5, + 0x3FFDC28F,0x5C28F5C3, 0x3FE3DBC3,0x38EE44C1, + 0x3FFDC6A7,0xEF9DB22D, 0x3FE3E02A,0x6BA46FED, + 0x3FFDCAC0,0x83126E98, 0x3FE3E491,0x035672FD, + 0x3FFDCED9,0x16872B02, 0x3FE3E8F7,0x002EEB13, + 0x3FFDD2F1,0xA9FBE76D, 0x3FE3ED5C,0x625863C8, + 0x3FFDD70A,0x3D70A3D7, 0x3FE3F1C1,0x29FD5729, + 0x3FFDDB22,0xD0E56042, 0x3FE3F625,0x57482DCD, + 0x3FFDDF3B,0x645A1CAC, 0x3FE3FA88,0xEA633ED0, + 0x3FFDE353,0xF7CED917, 0x3FE3FEEB,0xE378CFEB, + 0x3FFDE76C,0x8B439581, 0x3FE4034E,0x42B31573, + 0x3FFDEB85,0x1EB851EC, 0x3FE407B0,0x083C326B, + 0x3FFDEF9D,0xB22D0E56, 0x3FE40C11,0x343E3881, + 0x3FFDF3B6,0x45A1CAC1, 0x3FE41071,0xC6E3282A, + 0x3FFDF7CE,0xD916872B, 0x3FE414D1,0xC054F096, + 0x3FFDFBE7,0x6C8B4396, 0x3FE41931,0x20BD6FCF, + 0x3FFE0000,0x00000000, 0x3FE41D8F,0xE84672AE, + 0x3FFE0418,0x9374BC6A, 0x3FE421EE,0x1719B4F5, + 0x3FFE0831,0x26E978D5, 0x3FE4264B,0xAD60E150, + 0x3FFE0C49,0xBA5E353F, 0x3FE42AA8,0xAB45915C, + 0x3FFE1062,0x4DD2F1AA, 0x3FE42F05,0x10F14DBA, + 0x3FFE147A,0xE147AE14, 0x3FE43360,0xDE8D8E0B, + 0x3FFE1893,0x74BC6A7F, 0x3FE437BC,0x1443B909, + 0x3FFE1CAC,0x083126E9, 0x3FE43C16,0xB23D2480, + 0x3FFE20C4,0x9BA5E354, 0x3FE44070,0xB8A31565, + 0x3FFE24DD,0x2F1A9FBE, 0x3FE444CA,0x279EBFD4, + 0x3FFE28F5,0xC28F5C29, 0x3FE44922,0xFF594724, + 0x3FFE2D0E,0x56041893, 0x3FE44D7B,0x3FFBBDE3, + 0x3FFE3126,0xE978D4FE, 0x3FE451D2,0xE9AF25EF, + 0x3FFE353F,0x7CED9168, 0x3FE45629,0xFC9C706F, + 0x3FFE3958,0x10624DD3, 0x3FE45A80,0x78EC7DE9, + 0x3FFE3D70,0xA3D70A3D, 0x3FE45ED6,0x5EC81E42, + 0x3FFE4189,0x374BC6A8, 0x3FE4632B,0xAE5810CD, + 0x3FFE45A1,0xCAC08312, 0x3FE46780,0x67C5044F, + 0x3FFE49BA,0x5E353F7D, 0x3FE46BD4,0x8B37970F, + 0x3FFE4DD2,0xF1A9FBE7, 0x3FE47028,0x18D856D5, + 0x3FFE51EB,0x851EB852, 0x3FE4747B,0x10CFC0FD, + 0x3FFE5604,0x189374BC, 0x3FE478CD,0x73464278, + 0x3FFE5A1C,0xAC083127, 0x3FE47D1F,0x406437DB, + 0x3FFE5E35,0x3F7CED91, 0x3FE48170,0x7851ED62, + 0x3FFE624D,0xD2F1A9FC, 0x3FE485C1,0x1B379EFF, + 0x3FFE6666,0x66666666, 0x3FE48A11,0x293D785B, + 0x3FFE6A7E,0xF9DB22D1, 0x3FE48E60,0xA28B94EA, + 0x3FFE6E97,0x8D4FDF3B, 0x3FE492AF,0x8749FFE5, + 0x3FFE72B0,0x20C49BA6, 0x3FE496FD,0xD7A0B462, + 0x3FFE76C8,0xB4395810, 0x3FE49B4B,0x93B79D50, + 0x3FFE7AE1,0x47AE147B, 0x3FE49F98,0xBBB6958B, + 0x3FFE7EF9,0xDB22D0E5, 0x3FE4A3E5,0x4FC567D8, + 0x3FFE8312,0x6E978D50, 0x3FE4A831,0x500BCEFA, + 0x3FFE872B,0x020C49BA, 0x3FE4AC7C,0xBCB175B1, + 0x3FFE8B43,0x95810625, 0x3FE4B0C7,0x95DDF6CB, + 0x3FFE8F5C,0x28F5C28F, 0x3FE4B511,0xDBB8DD23, + 0x3FFE9374,0xBC6A7EFA, 0x3FE4B95B,0x8E69A3B4, + 0x3FFE978D,0x4FDF3B64, 0x3FE4BDA4,0xAE17B598, + 0x3FFE9BA5,0xE353F7CF, 0x3FE4C1ED,0x3AEA6E17, + 0x3FFE9FBE,0x76C8B439, 0x3FE4C635,0x350918AC, + 0x3FFEA3D7,0x0A3D70A4, 0x3FE4CA7C,0x9C9AF110, + 0x3FFEA7EF,0x9DB22D0E, 0x3FE4CEC3,0x71C7233F, + 0x3FFEAC08,0x3126E979, 0x3FE4D309,0xB4B4CB85, + 0x3FFEB020,0xC49BA5E3, 0x3FE4D74F,0x658AF682, + 0x3FFEB439,0x5810624E, 0x3FE4DB94,0x8470A136, + 0x3FFEB851,0xEB851EB8, 0x3FE4DFD9,0x118CB904, + 0x3FFEBC6A,0x7EF9DB23, 0x3FE4E41D,0x0D061BC3, + 0x3FFEC083,0x126E978D, 0x3FE4E860,0x770397BC, + 0x3FFEC49B,0xA5E353F8, 0x3FE4ECA3,0x4FABEBBD, + 0x3FFEC8B4,0x39581062, 0x3FE4F0E5,0x9725C715, + 0x3FFECCCC,0xCCCCCCCD, 0x3FE4F527,0x4D97C9A9, + 0x3FFED0E5,0x60418937, 0x3FE4F968,0x732883F3, + 0x3FFED4FD,0xF3B645A2, 0x3FE4FDA9,0x07FE770E, + 0x3FFED916,0x872B020C, 0x3FE501E9,0x0C4014BD, + 0x3FFEDD2F,0x1A9FBE77, 0x3FE50628,0x8013BF76, + 0x3FFEE147,0xAE147AE1, 0x3FE50A67,0x639FCA63, + 0x3FFEE560,0x4189374C, 0x3FE50EA5,0xB70A7975, + 0x3FFEE978,0xD4FDF3B6, 0x3FE512E3,0x7A7A0160, + 0x3FFEED91,0x6872B021, 0x3FE51720,0xAE1487AE, + 0x3FFEF1A9,0xFBE76C8B, 0x3FE51B5D,0x520022BE, + 0x3FFEF5C2,0x8F5C28F6, 0x3FE51F99,0x6662D9D4, + 0x3FFEF9DB,0x22D0E560, 0x3FE523D4,0xEB62A518, + 0x3FFEFDF3,0xB645A1CB, 0x3FE5280F,0xE1256DAA, + 0x3FFF020C,0x49BA5E35, 0x3FE52C4A,0x47D10D9B, + 0x3FFF0624,0xDD2F1AA0, 0x3FE53084,0x1F8B5004, + 0x3FFF0A3D,0x70A3D70A, 0x3FE534BD,0x6879F103, + 0x3FFF0E56,0x04189375, 0x3FE538F6,0x22C29DC8, + 0x3FFF126E,0x978D4FDF, 0x3FE53D2E,0x4E8AF49A, + 0x3FFF1687,0x2B020C4A, 0x3FE54165,0xEBF884E4, + 0x3FFF1A9F,0xBE76C8B4, 0x3FE5459C,0xFB30CF35, + 0x3FFF1EB8,0x51EB851F, 0x3FE549D3,0x7C594551, + 0x3FFF22D0,0xE5604189, 0x3FE54E09,0x6F974A2E, + 0x3FFF26E9,0x78D4FDF4, 0x3FE5523E,0xD5103208, + 0x3FFF2B02,0x0C49BA5E, 0x3FE55673,0xACE9425D, + 0x3FFF2F1A,0x9FBE76C9, 0x3FE55AA7,0xF747B200, + 0x3FFF3333,0x33333333, 0x3FE55EDB,0xB450A914, + 0x3FFF374B,0xC6A7EF9E, 0x3FE5630E,0xE4294121, + 0x3FFF3B64,0x5A1CAC08, 0x3FE56741,0x86F68511, + 0x3FFF3F7C,0xED916873, 0x3FE56B73,0x9CDD713F, + 0x3FFF4395,0x810624DD, 0x3FE56FA5,0x2602F379, + 0x3FFF47AE,0x147AE148, 0x3FE573D6,0x228BEB0C, + 0x3FFF4BC6,0xA7EF9DB2, 0x3FE57806,0x929D28C9, + 0x3FFF4FDF,0x3B645A1D, 0x3FE57C36,0x765B6F0F, + 0x3FFF53F7,0xCED91687, 0x3FE58065,0xCDEB71CE, + 0x3FFF5810,0x624DD2F2, 0x3FE58494,0x9971D694, + 0x3FFF5C28,0xF5C28F5C, 0x3FE588C2,0xD913348F, + 0x3FFF6041,0x89374BC7, 0x3FE58CF0,0x8CF4149E, + 0x3FFF645A,0x1CAC0831, 0x3FE5911D,0xB538F14A, + 0x3FFF6872,0xB020C49C, 0x3FE5954A,0x520636DB, + 0x3FFF6C8B,0x43958106, 0x3FE59976,0x63804356, + 0x3FFF70A3,0xD70A3D71, 0x3FE59DA1,0xE9CB668E, + 0x3FFF74BC,0x6A7EF9DB, 0x3FE5A1CC,0xE50BE21E, + 0x3FFF78D4,0xFDF3B646, 0x3FE5A5F7,0x5565E980, + 0x3FFF7CED,0x916872B0, 0x3FE5AA21,0x3AFDA206, + 0x3FFF8106,0x24DD2F1B, 0x3FE5AE4A,0x95F722EE, + 0x3FFF851E,0xB851EB85, 0x3FE5B273,0x6676755C, + 0x3FFF8937,0x4BC6A7F0, 0x3FE5B69B,0xAC9F946F, + 0x3FFF8D4F,0xDF3B645A, 0x3FE5BAC3,0x68966D3E, + 0x3FFF9168,0x72B020C5, 0x3FE5BEEA,0x9A7EDEE6, + 0x3FFF9581,0x0624DD2F, 0x3FE5C311,0x427CBA8A, + 0x3FFF9999,0x9999999A, 0x3FE5C737,0x60B3C364, + 0x3FFF9DB2,0x2D0E5604, 0x3FE5CB5C,0xF547AEC1, + 0x3FFFA1CA,0xC083126F, 0x3FE5CF82,0x005C2414, + 0x3FFFA5E3,0x53F7CED9, 0x3FE5D3A6,0x8214BCF1, + 0x3FFFA9FB,0xE76C8B44, 0x3FE5D7CA,0x7A950521, + 0x3FFFAE14,0x7AE147AE, 0x3FE5DBED,0xEA007A9C, + 0x3FFFB22D,0x0E560419, 0x3FE5E010,0xD07A8D9C, + 0x3FFFB645,0xA1CAC083, 0x3FE5E433,0x2E26A09A, + 0x3FFFBA5E,0x353F7CEE, 0x3FE5E855,0x0328085F, + 0x3FFFBE76,0xC8B43958, 0x3FE5EC76,0x4FA20C01, + 0x3FFFC28F,0x5C28F5C3, 0x3FE5F097,0x13B7E4F2, + 0x3FFFC6A7,0xEF9DB22D, 0x3FE5F4B7,0x4F8CBF02, + 0x3FFFCAC0,0x83126E98, 0x3FE5F8D7,0x0343B86C, + 0x3FFFCED9,0x16872B02, 0x3FE5FCF6,0x2EFFE1D3, + 0x3FFFD2F1,0xA9FBE76D, 0x3FE60114,0xD2E43E54, + 0x3FFFD70A,0x3D70A3D7, 0x3FE60532,0xEF13C385, + 0x3FFFDB22,0xD0E56042, 0x3FE60950,0x83B15982, + 0x3FFFDF3B,0x645A1CAC, 0x3FE60D6D,0x90DFDAEE, + 0x3FFFE353,0xF7CED917, 0x3FE6118A,0x16C214FE, + 0x3FFFE76C,0x8B439581, 0x3FE615A6,0x157AC77E, + 0x3FFFEB85,0x1EB851EC, 0x3FE619C1,0x8D2CA4DB, + 0x3FFFEF9D,0xB22D0E56, 0x3FE61DDC,0x7DFA5223, + 0x3FFFF3B6,0x45A1CAC1, 0x3FE621F6,0xE8066716, + 0x3FFFF7CE,0xD916872B, 0x3FE62610,0xCB736E21, + 0x3FFFFBE7,0x6C8B4396, 0x3FE62A2A,0x2863E472, + 0x40000000,0x00000000, 0x3FE62E42,0xFEFA39EF, + 0x4000020C,0x49BA5E35, 0x3FE6325B,0x4F58D14E, + 0x40000418,0x9374BC6A, 0x3FE63673,0x19A2000E, + 0x40000624,0xDD2F1AA0, 0x3FE63A8A,0x5DF80E87, + 0x40000831,0x26E978D5, 0x3FE63EA1,0x1C7D37E6, + 0x40000A3D,0x70A3D70A, 0x3FE642B7,0x5553AA43, + 0x40000C49,0xBA5E353F, 0x3FE646CD,0x089D8699, + 0x40000E56,0x04189375, 0x3FE64AE2,0x367CE0D8, + 0x40001062,0x4DD2F1AA, 0x3FE64EF6,0xDF13BFDF, + 0x4000126E,0x978D4FDF, 0x3FE6530B,0x02841D91, + 0x4000147A,0xE147AE14, 0x3FE6571E,0xA0EFE6D3, + 0x40001687,0x2B020C4A, 0x3FE65B31,0xBA78FB95, + 0x40001893,0x74BC6A7F, 0x3FE65F44,0x4F412ED4, + 0x40001A9F,0xBE76C8B4, 0x3FE66356,0x5F6A46A9, + 0x40001CAC,0x083126E9, 0x3FE66767,0xEB15FC49, + 0x40001EB8,0x51EB851F, 0x3FE66B78,0xF265FC11, + 0x400020C4,0x9BA5E354, 0x3FE66F89,0x757BE583, + 0x400022D0,0xE5604189, 0x3FE67399,0x74794B58, + 0x400024DD,0x2F1A9FBE, 0x3FE677A8,0xEF7FB380, + 0x400026E9,0x78D4FDF4, 0x3FE67BB7,0xE6B0972B, + 0x400028F5,0xC28F5C29, 0x3FE67FC6,0x5A2D62C9, + 0x40002B02,0x0C49BA5E, 0x3FE683D4,0x4A17761B, + 0x40002D0E,0x56041893, 0x3FE687E1,0xB6902433, + 0x40002F1A,0x9FBE76C9, 0x3FE68BEE,0x9FB8B37C, + 0x40003126,0xE978D4FE, 0x3FE68FFB,0x05B25DBB, + 0x40003333,0x33333333, 0x3FE69406,0xE89E5020, + 0x4000353F,0x7CED9168, 0x3FE69812,0x489DAB45, + 0x4000374B,0xC6A7EF9E, 0x3FE69C1D,0x25D18338, + 0x40003958,0x10624DD3, 0x3FE6A027,0x805ADF7A, + 0x40003B64,0x5A1CAC08, 0x3FE6A431,0x585ABB0E, + 0x40003D70,0xA3D70A3D, 0x3FE6A83A,0xADF2047D, + 0x40003F7C,0xED916873, 0x3FE6AC43,0x81419DDC, + 0x40004189,0x374BC6A8, 0x3FE6B04B,0xD26A5CCC, + 0x40004395,0x810624DD, 0x3FE6B453,0xA18D0A8B, + 0x400045A1,0xCAC08312, 0x3FE6B85A,0xEECA63F4, + 0x400047AE,0x147AE148, 0x3FE6BC61,0xBA431989, + 0x400049BA,0x5E353F7D, 0x3FE6C068,0x0417CF6F, + 0x40004BC6,0xA7EF9DB2, 0x3FE6C46D,0xCC691D81, + 0x40004DD2,0xF1A9FBE7, 0x3FE6C873,0x13578F53, + 0x40004FDF,0x3B645A1D, 0x3FE6CC77,0xD903A433, + 0x400051EB,0x851EB852, 0x3FE6D07C,0x1D8DCF2F, + 0x400053F7,0xCED91687, 0x3FE6D47F,0xE1167725, + 0x40005604,0x189374BC, 0x3FE6D883,0x23BDF6BF, + 0x40005810,0x624DD2F2, 0x3FE6DC85,0xE5A49C7F, + 0x40005A1C,0xAC083127, 0x3FE6E088,0x26EAAABD, + 0x40005C28,0xF5C28F5C, 0x3FE6E489,0xE7B057B9, + 0x40005E35,0x3F7CED91, 0x3FE6E88B,0x2815CD98, + 0x40006041,0x89374BC7, 0x3FE6EC8B,0xE83B2A70, + 0x4000624D,0xD2F1A9FC, 0x3FE6F08C,0x28408045, + 0x4000645A,0x1CAC0831, 0x3FE6F48B,0xE845D51A, + 0x40006666,0x66666666, 0x3FE6F88B,0x286B22F1, + 0x40006872,0xB020C49C, 0x3FE6FC89,0xE8D057D2, + 0x40006A7E,0xF9DB22D1, 0x3FE70088,0x299555CE, + 0x40006C8B,0x43958106, 0x3FE70485,0xEAD9F30B, + 0x40006E97,0x8D4FDF3B, 0x3FE70883,0x2CBDF9C8, + 0x400070A3,0xD70A3D71, 0x3FE70C7F,0xEF612861, + 0x400072B0,0x20C49BA6, 0x3FE7107C,0x32E33151, + 0x400074BC,0x6A7EF9DB, 0x3FE71477,0xF763BB43, + 0x400076C8,0xB4395810, 0x3FE71873,0x3D02610D, + 0x400078D4,0xFDF3B646, 0x3FE71C6E,0x03DEB1C1, + 0x40007AE1,0x47AE147B, 0x3FE72068,0x4C1830A3, + 0x40007CED,0x916872B0, 0x3FE72462,0x15CE553D, + 0x40007EF9,0xDB22D0E5, 0x3FE7285B,0x61208B62, + 0x40008106,0x24DD2F1B, 0x3FE72C54,0x2E2E3330, + 0x40008312,0x6E978D50, 0x3FE7304C,0x7D16A114, + 0x4000851E,0xB851EB85, 0x3FE73444,0x4DF91DD9, + 0x4000872B,0x020C49BA, 0x3FE7383B,0xA0F4E6A4, + 0x40008937,0x4BC6A7F0, 0x3FE73C32,0x76292D03, + 0x40008B43,0x95810625, 0x3FE74028,0xCDB516E5, + 0x40008D4F,0xDF3B645A, 0x3FE7441E,0xA7B7BEB0, + 0x40008F5C,0x28F5C28F, 0x3FE74814,0x0450333E, + 0x40009168,0x72B020C5, 0x3FE74C08,0xE39D77E3, + 0x40009374,0xBC6A7EFA, 0x3FE74FFD,0x45BE846F, + 0x40009581,0x0624DD2F, 0x3FE753F1,0x2AD24540, + 0x4000978D,0x4FDF3B64, 0x3FE757E4,0x92F79B3B, + 0x40009999,0x9999999A, 0x3FE75BD7,0x7E4D5BD9, + 0x40009BA5,0xE353F7CF, 0x3FE75FC9,0xECF25127, + 0x40009DB2,0x2D0E5604, 0x3FE763BB,0xDF0539D0, + 0x40009FBE,0x76C8B439, 0x3FE767AD,0x54A4C925, + 0x4000A1CA,0xC083126F, 0x3FE76B9E,0x4DEFA71C, + 0x4000A3D7,0x0A3D70A4, 0x3FE76F8E,0xCB047055, + 0x4000A5E3,0x53F7CED9, 0x3FE7737E,0xCC01B62A, + 0x4000A7EF,0x9DB22D0E, 0x3FE7776E,0x5105FEA9, + 0x4000A9FB,0xE76C8B44, 0x3FE77B5D,0x5A2FC4A3, + 0x4000AC08,0x3126E979, 0x3FE77F4B,0xE79D77A5, + 0x4000AE14,0x7AE147AE, 0x3FE78339,0xF96D7C0C, + 0x4000B020,0xC49BA5E3, 0x3FE78727,0x8FBE2B03, + 0x4000B22D,0x0E560419, 0x3FE78B14,0xAAADD288, + 0x4000B439,0x5810624E, 0x3FE78F01,0x4A5AB571, + 0x4000B645,0xA1CAC083, 0x3FE792ED,0x6EE30B76, + 0x4000B851,0xEB851EB8, 0x3FE796D9,0x18650134, + 0x4000BA5E,0x353F7CEE, 0x3FE79AC4,0x46FEB832, + 0x4000BC6A,0x7EF9DB23, 0x3FE79EAE,0xFACE46E2, + 0x4000BE76,0xC8B43958, 0x3FE7A299,0x33F1B8B1, + 0x4000C083,0x126E978D, 0x3FE7A682,0xF2870E03, + 0x4000C28F,0x5C28F5C3, 0x3FE7AA6C,0x36AC3C40, + 0x4000C49B,0xA5E353F8, 0x3FE7AE55,0x007F2DCE, + 0x4000C6A7,0xEF9DB22D, 0x3FE7B23D,0x501DC224, + 0x4000C8B4,0x39581062, 0x3FE7B625,0x25A5CDC5, + 0x4000CAC0,0x83126E98, 0x3FE7BA0C,0x81351A4E, + 0x4000CCCC,0xCCCCCCCD, 0x3FE7BDF3,0x62E9666E, + 0x4000CED9,0x16872B02, 0x3FE7C1D9,0xCAE065FD, + 0x4000D0E5,0x60418937, 0x3FE7C5BF,0xB937C1F2, + 0x4000D2F1,0xA9FBE76D, 0x3FE7C9A5,0x2E0D1874, + 0x4000D4FD,0xF3B645A2, 0x3FE7CD8A,0x297DFCD2, + 0x4000D70A,0x3D70A3D7, 0x3FE7D16E,0xABA7F797, + 0x4000D916,0x872B020C, 0x3FE7D552,0xB4A88685, + 0x4000DB22,0xD0E56042, 0x3FE7D936,0x449D1CA0, + 0x4000DD2F,0x1A9FBE77, 0x3FE7DD19,0x5BA3222C, + 0x4000DF3B,0x645A1CAC, 0x3FE7E0FB,0xF9D7F4BA, + 0x4000E147,0xAE147AE1, 0x3FE7E4DE,0x1F58E72A, + 0x4000E353,0xF7CED917, 0x3FE7E8BF,0xCC4341B3, + 0x4000E560,0x4189374C, 0x3FE7ECA1,0x00B441DE, + 0x4000E76C,0x8B439581, 0x3FE7F081,0xBCC91A99, + 0x4000E978,0xD4FDF3B6, 0x3FE7F462,0x009EF434, + 0x4000EB85,0x1EB851EC, 0x3FE7F841,0xCC52EC69, + 0x4000ED91,0x6872B021, 0x3FE7FC21,0x2002165D, + 0x4000EF9D,0xB22D0E56, 0x3FE7FFFF,0xFBC97AAA, + 0x4000F1A9,0xFBE76C8B, 0x3FE803DE,0x5FC61764, + 0x4000F3B6,0x45A1CAC1, 0x3FE807BC,0x4C14E01B, + 0x4000F5C2,0x8F5C28F6, 0x3FE80B99,0xC0D2BDDE, + 0x4000F7CE,0xD916872B, 0x3FE80F76,0xBE1C8F48, + 0x4000F9DB,0x22D0E560, 0x3FE81353,0x440F287F, + 0x4000FBE7,0x6C8B4396, 0x3FE8172F,0x52C7533D, + 0x4000FDF3,0xB645A1CB, 0x3FE81B0A,0xEA61CECD, + 0x40010000,0x00000000, 0x3FE81EE6,0x0AFB501A, + 0x4001020C,0x49BA5E35, 0x3FE822C0,0xB4B081AE, + 0x40010418,0x9374BC6A, 0x3FE8269A,0xE79E03BB, + 0x40010624,0xDD2F1AA0, 0x3FE82A74,0xA3E06C1C, + 0x40010831,0x26E978D5, 0x3FE82E4D,0xE9944658, + 0x40010A3D,0x70A3D70A, 0x3FE83226,0xB8D613B0, + 0x40010C49,0xBA5E353F, 0x3FE835FF,0x11C24B1D, + 0x40010E56,0x04189375, 0x3FE839D6,0xF4755957, + 0x40011062,0x4DD2F1AA, 0x3FE83DAE,0x610BA0D5, + 0x4001126E,0x978D4FDF, 0x3FE84185,0x57A179DC, + 0x4001147A,0xE147AE14, 0x3FE8455B,0xD853327A, + 0x40011687,0x2B020C4A, 0x3FE84931,0xE33D0E93, + 0x40011893,0x74BC6A7F, 0x3FE84D07,0x787B47DD, + 0x40011A9F,0xBE76C8B4, 0x3FE850DC,0x982A0DED, + 0x40011CAC,0x083126E9, 0x3FE854B1,0x4265863A, + 0x40011EB8,0x51EB851F, 0x3FE85885,0x7749CC1F, + 0x400120C4,0x9BA5E354, 0x3FE85C59,0x36F2F0DE, + 0x400122D0,0xE5604189, 0x3FE8602C,0x817CFBAD, + 0x400124DD,0x2F1A9FBE, 0x3FE863FF,0x5703E9B4, + 0x400126E9,0x78D4FDF4, 0x3FE867D1,0xB7A3AE15, + 0x400128F5,0xC28F5C29, 0x3FE86BA3,0xA37831ED, + 0x40012B02,0x0C49BA5E, 0x3FE86F75,0x1A9D545D, + 0x40012D0E,0x56041893, 0x3FE87346,0x1D2EEA8D, + 0x40012F1A,0x9FBE76C9, 0x3FE87716,0xAB48BFB3, + 0x40013126,0xE978D4FE, 0x3FE87AE6,0xC506950F, + 0x40013333,0x33333333, 0x3FE87EB6,0x6A8421FF, + 0x4001353F,0x7CED9168, 0x3FE88285,0x9BDD13F4, + 0x4001374B,0xC6A7EF9E, 0x3FE88654,0x592D0E84, + 0x40013958,0x10624DD3, 0x3FE88A22,0xA28FAB62, + 0x40013B64,0x5A1CAC08, 0x3FE88DF0,0x78207A6C, + 0x40013D70,0xA3D70A3D, 0x3FE891BD,0xD9FB01AF, + 0x40013F7C,0xED916873, 0x3FE8958A,0xC83ABD69, + 0x40014189,0x374BC6A8, 0x3FE89957,0x42FB2009, + 0x40014395,0x810624DD, 0x3FE89D23,0x4A57923E, + 0x400145A1,0xCAC08312, 0x3FE8A0EE,0xDE6B72F5, + 0x400147AE,0x147AE148, 0x3FE8A4B9,0xFF521762, + 0x400149BA,0x5E353F7D, 0x3FE8A884,0xAD26CAFA, + 0x40014BC6,0xA7EF9DB2, 0x3FE8AC4E,0xE804CF86, + 0x40014DD2,0xF1A9FBE7, 0x3FE8B018,0xB0075D20, + 0x40014FDF,0x3B645A1D, 0x3FE8B3E2,0x0549A239, + 0x400151EB,0x851EB852, 0x3FE8B7AA,0xE7E6C396, + 0x400153F7,0xCED91687, 0x3FE8BB73,0x57F9DC66, + 0x40015604,0x189374BC, 0x3FE8BF3B,0x559DFE34, + 0x40015810,0x624DD2F2, 0x3FE8C302,0xE0EE30FB, + 0x40015A1C,0xAC083127, 0x3FE8C6C9,0xFA05731A, + 0x40015C28,0xF5C28F5C, 0x3FE8CA90,0xA0FEB96A, + 0x40015E35,0x3F7CED91, 0x3FE8CE56,0xD5F4EF36, + 0x40016041,0x89374BC7, 0x3FE8D21C,0x9902F647, + 0x4001624D,0xD2F1A9FC, 0x3FE8D5E1,0xEA43A6E0, + 0x4001645A,0x1CAC0831, 0x3FE8D9A6,0xC9D1CFCB, + 0x40016666,0x66666666, 0x3FE8DD6B,0x37C8365B, + 0x40016872,0xB020C49C, 0x3FE8E12F,0x34419670, + 0x40016A7E,0xF9DB22D1, 0x3FE8E4F2,0xBF58A277, + 0x40016C8B,0x43958106, 0x3FE8E8B5,0xD9280375, + 0x40016E97,0x8D4FDF3B, 0x3FE8EC78,0x81CA590A, + 0x400170A3,0xD70A3D71, 0x3FE8F03A,0xB95A3976, + 0x400172B0,0x20C49BA6, 0x3FE8F3FC,0x7FF23194, + 0x400174BC,0x6A7EF9DB, 0x3FE8F7BD,0xD5ACC4EF, + 0x400176C8,0xB4395810, 0x3FE8FB7E,0xBAA46DB8, + 0x400178D4,0xFDF3B646, 0x3FE8FF3F,0x2EF39CD4, + 0x40017AE1,0x47AE147B, 0x3FE902FF,0x32B4B9D7, + 0x40017CED,0x916872B0, 0x3FE906BE,0xC6022312, + 0x40017EF9,0xDB22D0E5, 0x3FE90A7D,0xE8F62D91, + 0x40018106,0x24DD2F1B, 0x3FE90E3C,0x9BAB2526, + 0x40018312,0x6E978D50, 0x3FE911FA,0xDE3B4C5E, + 0x4001851E,0xB851EB85, 0x3FE915B8,0xB0C0DC9A, + 0x4001872B,0x020C49BA, 0x3FE91976,0x13560606, + 0x40018937,0x4BC6A7F0, 0x3FE91D33,0x0614EFA2, + 0x40018B43,0x95810625, 0x3FE920EF,0x8917B73F, + 0x40018D4F,0xDF3B645A, 0x3FE924AB,0x9C78718F, + 0x40018F5C,0x28F5C28F, 0x3FE92867,0x40512A23, + 0x40019168,0x72B020C5, 0x3FE92C22,0x74BBE36E, + 0x40019374,0xBC6A7EFA, 0x3FE92FDD,0x39D296CA, + 0x40019581,0x0624DD2F, 0x3FE93397,0x8FAF347F, + 0x4001978D,0x4FDF3B64, 0x3FE93751,0x766BA3C4, + 0x40019999,0x9999999A, 0x3FE93B0A,0xEE21C2C9, + 0x40019BA5,0xE353F7CF, 0x3FE93EC3,0xF6EB66AE, + 0x40019DB2,0x2D0E5604, 0x3FE9427C,0x90E25B97, + 0x40019FBE,0x76C8B439, 0x3FE94634,0xBC2064A7, + 0x4001A1CA,0xC083126F, 0x3FE949EC,0x78BF3C0A, + 0x4001A3D7,0x0A3D70A4, 0x3FE94DA3,0xC6D892ED, + 0x4001A5E3,0x53F7CED9, 0x3FE9515A,0xA6861192, + 0x4001A7EF,0x9DB22D0E, 0x3FE95511,0x17E1574A, + 0x4001A9FB,0xE76C8B44, 0x3FE958C7,0x1B03FA80, + 0x4001AC08,0x3126E979, 0x3FE95C7C,0xB00788B1, + 0x4001AE14,0x7AE147AE, 0x3FE96031,0xD705867F, + 0x4001B020,0xC49BA5E3, 0x3FE963E6,0x90176FAC, + 0x4001B22D,0x0E560419, 0x3FE9679A,0xDB56B724, + 0x4001B439,0x5810624E, 0x3FE96B4E,0xB8DCC6F5, + 0x4001B645,0xA1CAC083, 0x3FE96F02,0x28C30063, + 0x4001B851,0xEB851EB8, 0x3FE972B5,0x2B22BBE4, + 0x4001BA5E,0x353F7CEE, 0x3FE97667,0xC0154924, + 0x4001BC6A,0x7EF9DB23, 0x3FE97A19,0xE7B3EF06, + 0x4001BE76,0xC8B43958, 0x3FE97DCB,0xA217EBB2, + 0x4001C083,0x126E978D, 0x3FE9817C,0xEF5A748F, + 0x4001C28F,0x5C28F5C3, 0x3FE9852D,0xCF94B64E, + 0x4001C49B,0xA5E353F8, 0x3FE988DE,0x42DFD4E6, + 0x4001C6A7,0xEF9DB22D, 0x3FE98C8E,0x4954EBA2, + 0x4001C8B4,0x39581062, 0x3FE9903D,0xE30D0D1D, + 0x4001CAC0,0x83126E98, 0x3FE993ED,0x1021434E, + 0x4001CCCC,0xCCCCCCCD, 0x3FE9979B,0xD0AA8F7E, + 0x4001CED9,0x16872B02, 0x3FE99B4A,0x24C1EA5C, + 0x4001D0E5,0x60418937, 0x3FE99EF8,0x0C8043F8, + 0x4001D2F1,0xA9FBE76D, 0x3FE9A2A5,0x87FE83CB, + 0x4001D4FD,0xF3B645A2, 0x3FE9A652,0x975588B3, + 0x4001D70A,0x3D70A3D7, 0x3FE9A9FF,0x3A9E2903, + 0x4001D916,0x872B020C, 0x3FE9ADAB,0x71F1327E, + 0x4001DB22,0xD0E56042, 0x3FE9B157,0x3D676A5E, + 0x4001DD2F,0x1A9FBE77, 0x3FE9B502,0x9D198D57, + 0x4001DF3B,0x645A1CAC, 0x3FE9B8AD,0x91204F9B, + 0x4001E147,0xAE147AE1, 0x3FE9BC58,0x19945CE1, + 0x4001E353,0xF7CED917, 0x3FE9C002,0x368E5865, + 0x4001E560,0x4189374C, 0x3FE9C3AB,0xE826DCEB, + 0x4001E76C,0x8B439581, 0x3FE9C755,0x2E767CC7, + 0x4001E978,0xD4FDF3B6, 0x3FE9CAFE,0x0995C1DF, + 0x4001EB85,0x1EB851EC, 0x3FE9CEA6,0x799D2DAF, + 0x4001ED91,0x6872B021, 0x3FE9D24E,0x7EA5394B, + 0x4001EF9D,0xB22D0E56, 0x3FE9D5F6,0x18C65565, + 0x4001F1A9,0xFBE76C8B, 0x3FE9D99D,0x4818EA50, + 0x4001F3B6,0x45A1CAC1, 0x3FE9DD44,0x0CB55808, + 0x4001F5C2,0x8F5C28F6, 0x3FE9E0EA,0x66B3F62B, + 0x4001F7CE,0xD916872B, 0x3FE9E490,0x562D1407, + 0x4001F9DB,0x22D0E560, 0x3FE9E835,0xDB38F89D, + 0x4001FBE7,0x6C8B4396, 0x3FE9EBDA,0xF5EFE2A0, + 0x4001FDF3,0xB645A1CB, 0x3FE9EF7F,0xA66A0877, + 0x40020000,0x00000000, 0x3FE9F323,0xECBF984C, + 0x4002020C,0x49BA5E35, 0x3FE9F6C7,0xC908B804, + 0x40020418,0x9374BC6A, 0x3FE9FA6B,0x3B5D854A, + 0x40020624,0xDD2F1AA0, 0x3FE9FE0E,0x43D6158E, + 0x40020831,0x26E978D5, 0x3FEA01B0,0xE28A760B, + 0x40020A3D,0x70A3D70A, 0x3FEA0553,0x1792ABCA, + 0x40020C49,0xBA5E353F, 0x3FEA08F4,0xE306B3A8, + 0x40020E56,0x04189375, 0x3FEA0C96,0x44FE825A, + 0x40021062,0x4DD2F1AA, 0x3FEA1037,0x3D920468, + 0x4002126E,0x978D4FDF, 0x3FEA13D7,0xCCD91E3B, + 0x4002147A,0xE147AE14, 0x3FEA1777,0xF2EBAC20, + 0x40021687,0x2B020C4A, 0x3FEA1B17,0xAFE18246, + 0x40021893,0x74BC6A7F, 0x3FEA1EB7,0x03D26CC1, + 0x40021A9F,0xBE76C8B4, 0x3FEA2255,0xEED62F97, + 0x40021CAC,0x083126E9, 0x3FEA25F4,0x710486BA, + 0x40021EB8,0x51EB851F, 0x3FEA2992,0x8A752613, + 0x400220C4,0x9BA5E354, 0x3FEA2D30,0x3B3FB97B, + 0x400222D0,0xE5604189, 0x3FEA30CD,0x837BE4CD, + 0x400224DD,0x2F1A9FBE, 0x3FEA346A,0x634143DF, + 0x400226E9,0x78D4FDF4, 0x3FEA3806,0xDAA76A8A, + 0x400228F5,0xC28F5C29, 0x3FEA3BA2,0xE9C5E4AA, + 0x40022B02,0x0C49BA5E, 0x3FEA3F3E,0x90B43625, + 0x40022D0E,0x56041893, 0x3FEA42D9,0xCF89DAF1, + 0x40022F1A,0x9FBE76C9, 0x3FEA4674,0xA65E4711, + 0x40023126,0xE978D4FE, 0x3FEA4A0F,0x1548E69B, + 0x40023333,0x33333333, 0x3FEA4DA9,0x1C611DBE, + 0x4002353F,0x7CED9168, 0x3FEA5142,0xBBBE48C4, + 0x4002374B,0xC6A7EF9E, 0x3FEA54DB,0xF377BC18, + 0x40023958,0x10624DD3, 0x3FEA5874,0xC3A4C43F, + 0x40023B64,0x5A1CAC08, 0x3FEA5C0D,0x2C5CA5ED, + 0x40023D70,0xA3D70A3D, 0x3FEA5FA5,0x2DB69DF9, + 0x40023F7C,0xED916873, 0x3FEA633C,0xC7C9E16A, + 0x40024189,0x374BC6A8, 0x3FEA66D3,0xFAAD9D74, + 0x40024395,0x810624DD, 0x3FEA6A6A,0xC678F781, + 0x400245A1,0xCAC08312, 0x3FEA6E01,0x2B430D31, + 0x400247AE,0x147AE148, 0x3FEA7197,0x2922F462, + 0x400249BA,0x5E353F7D, 0x3FEA752C,0xC02FBB28, + 0x40024BC6,0xA7EF9DB2, 0x3FEA78C1,0xF08067E1, + 0x40024DD2,0xF1A9FBE7, 0x3FEA7C56,0xBA2BF92D, + 0x40024FDF,0x3B645A1D, 0x3FEA7FEB,0x1D4965F5, + 0x400251EB,0x851EB852, 0x3FEA837F,0x19EF9D69, + 0x400253F7,0xCED91687, 0x3FEA8712,0xB0358710, + 0x40025604,0x189374BC, 0x3FEA8AA5,0xE03202C1, + 0x40025810,0x624DD2F2, 0x3FEA8E38,0xA9FBE8A8, + 0x40025A1C,0xAC083127, 0x3FEA91CB,0x0DAA094A, + 0x40025C28,0xF5C28F5C, 0x3FEA955D,0x0B532D8B, + 0x40025E35,0x3F7CED91, 0x3FEA98EE,0xA30E16B0, + 0x40026041,0x89374BC7, 0x3FEA9C7F,0xD4F17E62, + 0x4002624D,0xD2F1A9FC, 0x3FEAA010,0xA11416AD, + 0x4002645A,0x1CAC0831, 0x3FEAA3A1,0x078C8A0D, + 0x40026666,0x66666666, 0x3FEAA731,0x08717B69, + 0x40026872,0xB020C49C, 0x3FEAAAC0,0xA3D9861D, + 0x40026A7E,0xF9DB22D1, 0x3FEAAE4F,0xD9DB3DF4, + 0x40026C8B,0x43958106, 0x3FEAB1DE,0xAA8D2F34, + 0x40026E97,0x8D4FDF3B, 0x3FEAB56D,0x1605DEA1, + 0x400270A3,0xD70A3D71, 0x3FEAB8FB,0x1C5BC97D, + 0x400272B0,0x20C49BA6, 0x3FEABC88,0xBDA56586, + 0x400274BC,0x6A7EF9DB, 0x3FEAC015,0xF9F92107, + 0x400276C8,0xB4395810, 0x3FEAC3A2,0xD16D62D1, + 0x400278D4,0xFDF3B646, 0x3FEAC72F,0x44188A44, + 0x40027AE1,0x47AE147B, 0x3FEACABB,0x5210EF47, + 0x40027CED,0x916872B0, 0x3FEACE46,0xFB6CE25C, + 0x40027EF9,0xDB22D0E5, 0x3FEAD1D2,0x4042AC99, + 0x40028106,0x24DD2F1B, 0x3FEAD55D,0x20A88FAE, + 0x40028312,0x6E978D50, 0x3FEAD8E7,0x9CB4C5E3, + 0x4002851E,0xB851EB85, 0x3FEADC71,0xB47D8224, + 0x4002872B,0x020C49BA, 0x3FEADFFB,0x6818F000, + 0x40028937,0x4BC6A7F0, 0x3FEAE384,0xB79D33AD, + 0x40028B43,0x95810625, 0x3FEAE70D,0xA3206A06, + 0x40028D4F,0xDF3B645A, 0x3FEAEA96,0x2AB8A897, + 0x40028F5C,0x28F5C28F, 0x3FEAEE1E,0x4E7BFD9C, + 0x40029168,0x72B020C5, 0x3FEAF1A6,0x0E807004, + 0x40029374,0xBC6A7EFA, 0x3FEAF52D,0x6ADBFF71, + 0x40029581,0x0624DD2F, 0x3FEAF8B4,0x63A4A444, + 0x4002978D,0x4FDF3B64, 0x3FEAFC3A,0xF8F04F97, + 0x40029999,0x9999999A, 0x3FEAFFC1,0x2AD4EB49, + 0x40029BA5,0xE353F7CF, 0x3FEB0346,0xF96859F5, + 0x40029DB2,0x2D0E5604, 0x3FEB06CC,0x64C07702, + 0x40029FBE,0x76C8B439, 0x3FEB0A51,0x6CF316A0, + 0x4002A1CA,0xC083126F, 0x3FEB0DD6,0x121605CC, + 0x4002A3D7,0x0A3D70A4, 0x3FEB115A,0x543F0A50, + 0x4002A5E3,0x53F7CED9, 0x3FEB14DE,0x3383E2CC, + 0x4002A7EF,0x9DB22D0E, 0x3FEB1861,0xAFFA46B5, + 0x4002A9FB,0xE76C8B44, 0x3FEB1BE4,0xC9B7E65E, + 0x4002AC08,0x3126E979, 0x3FEB1F67,0x80D26AEE, + 0x4002AE14,0x7AE147AE, 0x3FEB22E9,0xD55F7673, + 0x4002B020,0xC49BA5E3, 0x3FEB266B,0xC774A3DB, + 0x4002B22D,0x0E560419, 0x3FEB29ED,0x572786FC, + 0x4002B439,0x5810624E, 0x3FEB2D6E,0x848DAC91, + 0x4002B645,0xA1CAC083, 0x3FEB30EF,0x4FBC9A45, + 0x4002B851,0xEB851EB8, 0x3FEB346F,0xB8C9CEB1, + 0x4002BA5E,0x353F7CEE, 0x3FEB37EF,0xBFCAC162, + 0x4002BC6A,0x7EF9DB23, 0x3FEB3B6F,0x64D4E2D7, + 0x4002BE76,0xC8B43958, 0x3FEB3EEE,0xA7FD9C89, + 0x4002C083,0x126E978D, 0x3FEB426D,0x895A50F0, + 0x4002C28F,0x5C28F5C3, 0x3FEB45EC,0x09005B7F, + 0x4002C49B,0xA5E353F8, 0x3FEB496A,0x270510AA, + 0x4002C6A7,0xEF9DB22D, 0x3FEB4CE7,0xE37DBDEC, + 0x4002C8B4,0x39581062, 0x3FEB5065,0x3E7FA9C9, + 0x4002CAC0,0x83126E98, 0x3FEB53E2,0x382013CE, + 0x4002CCCC,0xCCCCCCCD, 0x3FEB575E,0xD0743494, + 0x4002CED9,0x16872B02, 0x3FEB5ADB,0x07913DC9, + 0x4002D0E5,0x60418937, 0x3FEB5E56,0xDD8C5A2D, + 0x4002D2F1,0xA9FBE76D, 0x3FEB61D2,0x527AAD98, + 0x4002D4FD,0xF3B645A2, 0x3FEB654D,0x667154F8, + 0x4002D70A,0x3D70A3D7, 0x3FEB68C8,0x1985665D, + 0x4002D916,0x872B020C, 0x3FEB6C42,0x6BCBF0F5, + 0x4002DB22,0xD0E56042, 0x3FEB6FBC,0x5D59FD13, + 0x4002DD2F,0x1A9FBE77, 0x3FEB7335,0xEE448C2B, + 0x4002DF3B,0x645A1CAC, 0x3FEB76AF,0x1EA098DE, + 0x4002E147,0xAE147AE1, 0x3FEB7A27,0xEE8316F8, + 0x4002E353,0xF7CED917, 0x3FEB7DA0,0x5E00F375, + 0x4002E560,0x4189374C, 0x3FEB8118,0x6D2F147E, + 0x4002E76C,0x8B439581, 0x3FEB8490,0x1C225977, + 0x4002E978,0xD4FDF3B6, 0x3FEB8807,0x6AEF9AF9, + 0x4002EB85,0x1EB851EC, 0x3FEB8B7E,0x59ABAAD9, + 0x4002ED91,0x6872B021, 0x3FEB8EF4,0xE86B5424, + 0x4002EF9D,0xB22D0E56, 0x3FEB926B,0x17435B2F, + 0x4002F1A9,0xFBE76C8B, 0x3FEB95E0,0xE6487D8E, + 0x4002F3B6,0x45A1CAC1, 0x3FEB9956,0x558F721E, + 0x4002F5C2,0x8F5C28F6, 0x3FEB9CCB,0x652CE901, + 0x4002F7CE,0xD916872B, 0x3FEBA040,0x15358BAA, + 0x4002F9DB,0x22D0E560, 0x3FEBA3B4,0x65BDFCD9, + 0x4002FBE7,0x6C8B4396, 0x3FEBA728,0x56DAD8A0, + 0x4002FDF3,0xB645A1CB, 0x3FEBAA9B,0xE8A0B464, + 0x40030000,0x00000000, 0x3FEBAE0F,0x1B241EE4, + 0x4003020C,0x49BA5E35, 0x3FEBB181,0xEE79A039, + 0x40030418,0x9374BC6A, 0x3FEBB4F4,0x62B5B9DA, + 0x40030624,0xDD2F1AA0, 0x3FEBB866,0x77ECE69F, + 0x40030831,0x26E978D5, 0x3FEBBBD8,0x2E339ABE, + 0x40030A3D,0x70A3D70A, 0x3FEBBF49,0x859E43D9, + 0x40030C49,0xBA5E353F, 0x3FEBC2BA,0x7E4148F7, + 0x40030E56,0x04189375, 0x3FEBC62B,0x18310A90, + 0x40031062,0x4DD2F1AA, 0x3FEBC99B,0x5381E281, + 0x4003126E,0x978D4FDF, 0x3FEBCD0B,0x30482422, + 0x4003147A,0xE147AE14, 0x3FEBD07A,0xAE981C39, + 0x40031687,0x2B020C4A, 0x3FEBD3E9,0xCE861108, + 0x40031893,0x74BC6A7F, 0x3FEBD758,0x90264243, + 0x40031A9F,0xBE76C8B4, 0x3FEBDAC6,0xF38CE922, + 0x40031CAC,0x083126E9, 0x3FEBDE34,0xF8CE385A, + 0x40031EB8,0x51EB851F, 0x3FEBE1A2,0x9FFE5C21, + 0x400320C4,0x9BA5E354, 0x3FEBE50F,0xE9317A31, + 0x400322D0,0xE5604189, 0x3FEBE87C,0xD47BB1CF, + 0x400324DD,0x2F1A9FBE, 0x3FEBEBE9,0x61F11BC8, + 0x400326E9,0x78D4FDF4, 0x3FEBEF55,0x91A5CA78, + 0x400328F5,0xC28F5C29, 0x3FEBF2C1,0x63ADC9C8, + 0x40032B02,0x0C49BA5E, 0x3FEBF62C,0xD81D1F35, + 0x40032D0E,0x56041893, 0x3FEBF997,0xEF07C9D3, + 0x40032F1A,0x9FBE76C9, 0x3FEBFD02,0xA881C24F, + 0x40033126,0xE978D4FE, 0x3FEC006D,0x049EFAEB, + 0x40033333,0x33333333, 0x3FEC03D7,0x03735F8C, + 0x4003353F,0x7CED9168, 0x3FEC0740,0xA512D5B8, + 0x4003374B,0xC6A7EF9E, 0x3FEC0AA9,0xE9913C96, + 0x40033958,0x10624DD3, 0x3FEC0E12,0xD1026CEF, + 0x40033B64,0x5A1CAC08, 0x3FEC117B,0x5B7A393C, + 0x40033D70,0xA3D70A3D, 0x3FEC14E3,0x890C6D9D, + 0x40033F7C,0xED916873, 0x3FEC184B,0x59CCCFE1, + 0x40034189,0x374BC6A8, 0x3FEC1BB2,0xCDCF1F86, + 0x40034395,0x810624DD, 0x3FEC1F19,0xE52715BE, + 0x400345A1,0xCAC08312, 0x3FEC2280,0x9FE86573, + 0x400347AE,0x147AE148, 0x3FEC25E6,0xFE26BB46, + 0x400349BA,0x5E353F7D, 0x3FEC294C,0xFFF5BD92, + 0x40034BC6,0xA7EF9DB2, 0x3FEC2CB2,0xA5690C71, + 0x40034DD2,0xF1A9FBE7, 0x3FEC3017,0xEE9441C0, + 0x40034FDF,0x3B645A1D, 0x3FEC337C,0xDB8AF11D, + 0x400351EB,0x851EB852, 0x3FEC36E1,0x6C60A7E9, + 0x400353F7,0xCED91687, 0x3FEC3A45,0xA128ED53, + 0x40035604,0x189374BC, 0x3FEC3DA9,0x79F74252, + 0x40035810,0x624DD2F2, 0x3FEC410C,0xF6DF21AF, + 0x40035A1C,0xAC083127, 0x3FEC4470,0x17F3FFFA, + 0x40035C28,0xF5C28F5C, 0x3FEC47D2,0xDD494BA1, + 0x40035E35,0x3F7CED91, 0x3FEC4B35,0x46F26CE0, + 0x40036041,0x89374BC7, 0x3FEC4E97,0x5502C5D1, + 0x4003624D,0xD2F1A9FC, 0x3FEC51F9,0x078DB263, + 0x4003645A,0x1CAC0831, 0x3FEC555A,0x5EA68866, + 0x40036666,0x66666666, 0x3FEC58BB,0x5A60978B, + 0x40036872,0xB020C49C, 0x3FEC5C1B,0xFACF2964, + 0x40036A7E,0xF9DB22D1, 0x3FEC5F7C,0x40058167, + 0x40036C8B,0x43958106, 0x3FEC62DC,0x2A16DCF3, + 0x40036E97,0x8D4FDF3B, 0x3FEC663B,0xB9167353, + 0x400370A3,0xD70A3D71, 0x3FEC699A,0xED1775BE, + 0x400372B0,0x20C49BA6, 0x3FEC6CF9,0xC62D0F58, + 0x400374BC,0x6A7EF9DB, 0x3FEC7058,0x446A653A, + 0x400376C8,0xB4395810, 0x3FEC73B6,0x67E29670, + 0x400378D4,0xFDF3B646, 0x3FEC7714,0x30A8BC01, + 0x40037AE1,0x47AE147B, 0x3FEC7A71,0x9ECFE8E6, + 0x40037CED,0x916872B0, 0x3FEC7DCE,0xB26B2A1B, + 0x40037EF9,0xDB22D0E5, 0x3FEC812B,0x6B8D8698, + 0x40038106,0x24DD2F1B, 0x3FEC8487,0xCA49FF59, + 0x40038312,0x6E978D50, 0x3FEC87E3,0xCEB38F57, + 0x4003851E,0xB851EB85, 0x3FEC8B3F,0x78DD2B99, + 0x4003872B,0x020C49BA, 0x3FEC8E9A,0xC8D9C32B, + 0x40038937,0x4BC6A7F0, 0x3FEC91F5,0xBEBC3F27, + 0x40038B43,0x95810625, 0x3FEC9550,0x5A9782AE, + 0x40038D4F,0xDF3B645A, 0x3FEC98AA,0x9C7E6AF9, + 0x40038F5C,0x28F5C28F, 0x3FEC9C04,0x8483CF51, + 0x40039168,0x72B020C5, 0x3FEC9F5E,0x12BA8116, + 0x40039374,0xBC6A7EFA, 0x3FECA2B7,0x47354BB9, + 0x40039581,0x0624DD2F, 0x3FECA610,0x2206F4CC, + 0x4003978D,0x4FDF3B64, 0x3FECA968,0xA3423BFD, + 0x40039999,0x9999999A, 0x3FECACC0,0xCAF9DB19, + 0x40039BA5,0xE353F7CF, 0x3FECB018,0x99408609, + 0x40039DB2,0x2D0E5604, 0x3FECB370,0x0E28EAE2, + 0x40039FBE,0x76C8B439, 0x3FECB6C7,0x29C5B1DB, + 0x4003A1CA,0xC083126F, 0x3FECBA1D,0xEC297D57, + 0x4003A3D7,0x0A3D70A4, 0x3FECBD74,0x5566E9DF, + 0x4003A5E3,0x53F7CED9, 0x3FECC0CA,0x65908E2E, + 0x4003A7EF,0x9DB22D0E, 0x3FECC420,0x1CB8FB30, + 0x4003A9FB,0xE76C8B44, 0x3FECC775,0x7AF2BC01, + 0x4003AC08,0x3126E979, 0x3FECCACA,0x805055F3, + 0x4003AE14,0x7AE147AE, 0x3FECCE1F,0x2CE4488F, + 0x4003B020,0xC49BA5E3, 0x3FECD173,0x80C10D99, + 0x4003B22D,0x0E560419, 0x3FECD4C7,0x7BF91913, + 0x4003B439,0x5810624E, 0x3FECD81B,0x1E9ED937, + 0x4003B645,0xA1CAC083, 0x3FECDB6E,0x68C4B687, + 0x4003B851,0xEB851EB8, 0x3FECDEC1,0x5A7D13C6, + 0x4003BA5E,0x353F7CEE, 0x3FECE213,0xF3DA4DFF, + 0x4003BC6A,0x7EF9DB23, 0x3FECE566,0x34EEBC7E, + 0x4003BE76,0xC8B43958, 0x3FECE8B8,0x1DCCB0E2, + 0x4003C083,0x126E978D, 0x3FECEC09,0xAE867713, + 0x4003C28F,0x5C28F5C3, 0x3FECEF5A,0xE72E554A, + 0x4003C49B,0xA5E353F8, 0x3FECF2AB,0xC7D68C0F, + 0x4003C6A7,0xEF9DB22D, 0x3FECF5FC,0x50915640, + 0x4003C8B4,0x39581062, 0x3FECF94C,0x8170E911, + 0x4003CAC0,0x83126E98, 0x3FECFC9C,0x5A877411, + 0x4003CCCC,0xCCCCCCCD, 0x3FECFFEB,0xDBE72125, + 0x4003CED9,0x16872B02, 0x3FED033B,0x05A21493, + 0x4003D0E5,0x60418937, 0x3FED0689,0xD7CA6D01, + 0x4003D2F1,0xA9FBE76D, 0x3FED09D8,0x52724377, + 0x4003D4FD,0xF3B645A2, 0x3FED0D26,0x75ABAB5E, + 0x4003D70A,0x3D70A3D7, 0x3FED1074,0x4188B289, + 0x4003D916,0x872B020C, 0x3FED13C1,0xB61B6134, + 0x4003DB22,0xD0E56042, 0x3FED170E,0xD375BA07, + 0x4003DD2F,0x1A9FBE77, 0x3FED1A5B,0x99A9BA12, + 0x4003DF3B,0x645A1CAC, 0x3FED1DA8,0x08C958DC, + 0x4003E147,0xAE147AE1, 0x3FED20F4,0x20E6885B, + 0x4003E353,0xF7CED917, 0x3FED243F,0xE21334FA, + 0x4003E560,0x4189374C, 0x3FED278B,0x4C61459A, + 0x4003E76C,0x8B439581, 0x3FED2AD6,0x5FE29B95, + 0x4003E978,0xD4FDF3B6, 0x3FED2E21,0x1CA912C3, + 0x4003EB85,0x1EB851EC, 0x3FED316B,0x82C68177, + 0x4003ED91,0x6872B021, 0x3FED34B5,0x924CB882, + 0x4003EF9D,0xB22D0E56, 0x3FED37FF,0x4B4D833D, + 0x4003F1A9,0xFBE76C8B, 0x3FED3B48,0xADDAA780, + 0x4003F3B6,0x45A1CAC1, 0x3FED3E91,0xBA05E5AD, + 0x4003F5C2,0x8F5C28F6, 0x3FED41DA,0x6FE0F8AC, + 0x4003F7CE,0xD916872B, 0x3FED4522,0xCF7D95F2, + 0x4003F9DB,0x22D0E560, 0x3FED486A,0xD8ED6D82, + 0x4003FBE7,0x6C8B4396, 0x3FED4BB2,0x8C4229EF, + 0x4003FDF3,0xB645A1CB, 0x3FED4EF9,0xE98D7058, + 0x40040000,0x00000000, 0x3FED5240,0xF0E0E078, + 0x4004020C,0x49BA5E35, 0x3FED5587,0xA24E149B, + 0x40040418,0x9374BC6A, 0x3FED58CD,0xFDE6A1A9, + 0x40040624,0xDD2F1AA0, 0x3FED5C14,0x03BC1724, + 0x40040831,0x26E978D5, 0x3FED5F59,0xB3DFFF26, + 0x40040A3D,0x70A3D70A, 0x3FED629F,0x0E63DE6F, + 0x40040C49,0xBA5E353F, 0x3FED65E4,0x1359345C, + 0x40040E56,0x04189375, 0x3FED6928,0xC2D17AF1, + 0x40041062,0x4DD2F1AA, 0x3FED6C6D,0x1CDE26D2, + 0x4004126E,0x978D4FDF, 0x3FED6FB1,0x2190A751, + 0x4004147A,0xE147AE14, 0x3FED72F4,0xD0FA6667, + 0x40041687,0x2B020C4A, 0x3FED7638,0x2B2CC8BB, + 0x40041893,0x74BC6A7F, 0x3FED797B,0x30392D9E, + 0x40041A9F,0xBE76C8B4, 0x3FED7CBD,0xE030EF17, + 0x40041CAC,0x083126E9, 0x3FED8000,0x3B2561DC, + 0x40041EB8,0x51EB851F, 0x3FED8342,0x4127D55D, + 0x400420C4,0x9BA5E354, 0x3FED8683,0xF24993B8, + 0x400422D0,0xE5604189, 0x3FED89C5,0x4E9BE1CD, + 0x400424DD,0x2F1A9FBE, 0x3FED8D06,0x562FFF34, + 0x400426E9,0x78D4FDF4, 0x3FED9047,0x09172642, + 0x400428F5,0xC28F5C29, 0x3FED9387,0x67628C0B, + 0x40042B02,0x0C49BA5E, 0x3FED96C7,0x71236067, + 0x40042D0E,0x56041893, 0x3FED9A07,0x266ACDF0, + 0x40042F1A,0x9FBE76C9, 0x3FED9D46,0x8749FA09, + 0x40043126,0xE978D4FE, 0x3FEDA085,0x93D204D8, + 0x40043333,0x33333333, 0x3FEDA3C4,0x4C140951, + 0x4004353F,0x7CED9168, 0x3FEDA702,0xB0211D34, + 0x4004374B,0xC6A7EF9E, 0x3FEDAA40,0xC00A5111, + 0x40043958,0x10624DD3, 0x3FEDAD7E,0x7BE0B042, + 0x40043B64,0x5A1CAC08, 0x3FEDB0BB,0xE3B540FB, + 0x40043D70,0xA3D70A3D, 0x3FEDB3F8,0xF7990442, + 0x40043F7C,0xED916873, 0x3FEDB735,0xB79CF5F6, + 0x40044189,0x374BC6A8, 0x3FEDBA72,0x23D20CC8, + 0x40044395,0x810624DD, 0x3FEDBDAE,0x3C493A4C, + 0x400445A1,0xCAC08312, 0x3FEDC0EA,0x01136AF0, + 0x400447AE,0x147AE148, 0x3FEDC425,0x72418602, + 0x400449BA,0x5E353F7D, 0x3FEDC760,0x8FE46DAE, + 0x40044BC6,0xA7EF9DB2, 0x3FEDCA9B,0x5A0CFF08, + 0x40044DD2,0xF1A9FBE7, 0x3FEDCDD5,0xD0CC1205, + 0x40044FDF,0x3B645A1D, 0x3FEDD10F,0xF4327988, + 0x400451EB,0x851EB852, 0x3FEDD449,0xC4510354, + 0x400453F7,0xCED91687, 0x3FEDD783,0x4138781F, + 0x40045604,0x189374BC, 0x3FEDDABC,0x6AF99B8B, + 0x40045810,0x624DD2F2, 0x3FEDDDF5,0x41A52C2A, + 0x40045A1C,0xAC083127, 0x3FEDE12D,0xC54BE37B, + 0x40045C28,0xF5C28F5C, 0x3FEDE465,0xF5FE75F7, + 0x40045E35,0x3F7CED91, 0x3FEDE79D,0xD3CD9309, + 0x40046041,0x89374BC7, 0x3FEDEAD5,0x5EC9E518, + 0x4004624D,0xD2F1A9FC, 0x3FEDEE0C,0x9704117E, + 0x4004645A,0x1CAC0831, 0x3FEDF143,0x7C8CB895, + 0x40046666,0x66666666, 0x3FEDF47A,0x0F7475B7, + 0x40046872,0xB020C49C, 0x3FEDF7B0,0x4FCBDF3A, + 0x40046A7E,0xF9DB22D1, 0x3FEDFAE6,0x3DA38675, + 0x40046C8B,0x43958106, 0x3FEDFE1B,0xD90BF7C8, + 0x40046E97,0x8D4FDF3B, 0x3FEE0151,0x2215BA94, + 0x400470A3,0xD70A3D71, 0x3FEE0486,0x18D15146, + 0x400472B0,0x20C49BA6, 0x3FEE07BA,0xBD4F394F, + 0x400474BC,0x6A7EF9DB, 0x3FEE0AEF,0x0F9FEB31, + 0x400476C8,0xB4395810, 0x3FEE0E23,0x0FD3DA7A, + 0x400478D4,0xFDF3B646, 0x3FEE1156,0xBDFB75CA, + 0x40047AE1,0x47AE147B, 0x3FEE148A,0x1A2726CE, + 0x40047CED,0x916872B0, 0x3FEE17BD,0x2467524A, + 0x40047EF9,0xDB22D0E5, 0x3FEE1AEF,0xDCCC5817, + 0x40048106,0x24DD2F1B, 0x3FEE1E22,0x43669329, + 0x40048312,0x6E978D50, 0x3FEE2154,0x58465986, + 0x4004851E,0xB851EB85, 0x3FEE2486,0x1B7BFC56, + 0x4004872B,0x020C49BA, 0x3FEE27B7,0x8D17C7DC, + 0x40048937,0x4BC6A7F0, 0x3FEE2AE8,0xAD2A037E, + 0x40048B43,0x95810625, 0x3FEE2E19,0x7BC2F1BC, + 0x40048D4F,0xDF3B645A, 0x3FEE3149,0xF8F2D041, + 0x40048F5C,0x28F5C28F, 0x3FEE347A,0x24C9D7D9, + 0x40049168,0x72B020C5, 0x3FEE37A9,0xFF583C7A, + 0x40049374,0xBC6A7EFA, 0x3FEE3AD9,0x88AE2D3F, + 0x40049581,0x0624DD2F, 0x3FEE3E08,0xC0DBD472, + 0x4004978D,0x4FDF3B64, 0x3FEE4137,0xA7F1578A, + 0x40049999,0x9999999A, 0x3FEE4466,0x3DFED72B, + 0x40049BA5,0xE353F7CF, 0x3FEE4794,0x83146F2A, + 0x40049DB2,0x2D0E5604, 0x3FEE4AC2,0x7742368F, + 0x40049FBE,0x76C8B439, 0x3FEE4DF0,0x1A983F98, + 0x4004A1CA,0xC083126F, 0x3FEE511D,0x6D2697B9, + 0x4004A3D7,0x0A3D70A4, 0x3FEE544A,0x6EFD479D, + 0x4004A5E3,0x53F7CED9, 0x3FEE5777,0x202C532A, + 0x4004A7EF,0x9DB22D0E, 0x3FEE5AA3,0x80C3B985, + 0x4004A9FB,0xE76C8B44, 0x3FEE5DCF,0x90D3750E, + 0x4004AC08,0x3126E979, 0x3FEE60FB,0x506B7B65, + 0x4004AE14,0x7AE147AE, 0x3FEE6426,0xBF9BBD6D, + 0x4004B020,0xC49BA5E3, 0x3FEE6751,0xDE74274D, + 0x4004B22D,0x0E560419, 0x3FEE6A7C,0xAD04A074, + 0x4004B439,0x5810624E, 0x3FEE6DA7,0x2B5D0B91, + 0x4004B645,0xA1CAC083, 0x3FEE70D1,0x598D46A5, + 0x4004B851,0xEB851EB8, 0x3FEE73FB,0x37A52AF7, + 0x4004BA5E,0x353F7CEE, 0x3FEE7724,0xC5B48D1F, + 0x4004BC6A,0x7EF9DB23, 0x3FEE7A4E,0x03CB3CFF, + 0x4004BE76,0xC8B43958, 0x3FEE7D76,0xF1F905CE, + 0x4004C083,0x126E978D, 0x3FEE809F,0x904DAE14, + 0x4004C28F,0x5C28F5C3, 0x3FEE83C7,0xDED8F7AF, + 0x4004C49B,0xA5E353F8, 0x3FEE86EF,0xDDAA9FD1, + 0x4004C6A7,0xEF9DB22D, 0x3FEE8A17,0x8CD25F06, + 0x4004C8B4,0x39581062, 0x3FEE8D3E,0xEC5FE933, + 0x4004CAC0,0x83126E98, 0x3FEE9065,0xFC62ED9C, + 0x4004CCCC,0xCCCCCCCD, 0x3FEE938C,0xBCEB16DD, + 0x4004CED9,0x16872B02, 0x3FEE96B3,0x2E080AF7, + 0x4004D0E5,0x60418937, 0x3FEE99D9,0x4FC96B48, + 0x4004D2F1,0xA9FBE76D, 0x3FEE9CFF,0x223ED497, + 0x4004D4FD,0xF3B645A2, 0x3FEEA024,0xA577DF08, + 0x4004D70A,0x3D70A3D7, 0x3FEEA349,0xD9841E2D, + 0x4004D916,0x872B020C, 0x3FEEA66E,0xBE7320FC, + 0x4004DB22,0xD0E56042, 0x3FEEA993,0x545471DB, + 0x4004DD2F,0x1A9FBE77, 0x3FEEACB7,0x9B379693, + 0x4004DF3B,0x645A1CAC, 0x3FEEAFDB,0x932C1064, + 0x4004E147,0xAE147AE1, 0x3FEEB2FF,0x3C415BF9, + 0x4004E353,0xF7CED917, 0x3FEEB622,0x9686F172, + 0x4004E560,0x4189374C, 0x3FEEB945,0xA20C445D, + 0x4004E76C,0x8B439581, 0x3FEEBC68,0x5EE0C3C2, + 0x4004E978,0xD4FDF3B6, 0x3FEEBF8A,0xCD13DA1F, + 0x4004EB85,0x1EB851EC, 0x3FEEC2AC,0xECB4ED6B, + 0x4004ED91,0x6872B021, 0x3FEEC5CE,0xBDD35F13, + 0x4004EF9D,0xB22D0E56, 0x3FEEC8F0,0x407E8C07, + 0x4004F1A9,0xFBE76C8B, 0x3FEECC11,0x74C5CCB1, + 0x4004F3B6,0x45A1CAC1, 0x3FEECF32,0x5AB874FE, + 0x4004F5C2,0x8F5C28F6, 0x3FEED252,0xF265D457, + 0x4004F7CE,0xD916872B, 0x3FEED573,0x3BDD35AC, + 0x4004F9DB,0x22D0E560, 0x3FEED893,0x372DDF74, + 0x4004FBE7,0x6C8B4396, 0x3FEEDBB2,0xE46713AA, + 0x4004FDF3,0xB645A1CB, 0x3FEEDED2,0x43980FD0, + 0x40050000,0x00000000, 0x3FEEE1F1,0x54D00CF6, + 0x4005020C,0x49BA5E35, 0x3FEEE510,0x181E3FB7, + 0x40050418,0x9374BC6A, 0x3FEEE82E,0x8D91D83A, + 0x40050624,0xDD2F1AA0, 0x3FEEEB4C,0xB53A0239, + 0x40050831,0x26E978D5, 0x3FEEEE6A,0x8F25E4FA, + 0x40050A3D,0x70A3D70A, 0x3FEEF188,0x1B64A35A, + 0x40050C49,0xBA5E353F, 0x3FEEF4A5,0x5A055BCB, + 0x40050E56,0x04189375, 0x3FEEF7C2,0x4B172854, + 0x40051062,0x4DD2F1AA, 0x3FEEFADE,0xEEA91E92, + 0x4005126E,0x978D4FDF, 0x3FEEFDFB,0x44CA4FC1, + 0x4005147A,0xE147AE14, 0x3FEF0117,0x4D89C8B3, + 0x40051687,0x2B020C4A, 0x3FEF0433,0x08F691DD, + 0x40051893,0x74BC6A7F, 0x3FEF074E,0x771FAF4D, + 0x40051A9F,0xBE76C8B4, 0x3FEF0A69,0x981420B6, + 0x40051CAC,0x083126E9, 0x3FEF0D84,0x6BE2E16B, + 0x40051EB8,0x51EB851F, 0x3FEF109E,0xF29AE866, + 0x400520C4,0x9BA5E354, 0x3FEF13B9,0x2C4B2842, + 0x400522D0,0xE5604189, 0x3FEF16D3,0x19028F46, + 0x400524DD,0x2F1A9FBE, 0x3FEF19EC,0xB8D0075F, + 0x400526E9,0x78D4FDF4, 0x3FEF1D06,0x0BC27629, + 0x400528F5,0xC28F5C29, 0x3FEF201F,0x11E8BCE5, + 0x40052B02,0x0C49BA5E, 0x3FEF2337,0xCB51B88A, + 0x40052D0E,0x56041893, 0x3FEF2650,0x380C41BA, + 0x40052F1A,0x9FBE76C9, 0x3FEF2968,0x58272CCC, + 0x40053126,0xE978D4FE, 0x3FEF2C80,0x2BB149C6, + 0x40053333,0x33333333, 0x3FEF2F97,0xB2B96465, + 0x4005353F,0x7CED9168, 0x3FEF32AE,0xED4E441E, + 0x4005374B,0xC6A7EF9E, 0x3FEF35C5,0xDB7EAC1D, + 0x40053958,0x10624DD3, 0x3FEF38DC,0x7D595B45, + 0x40053B64,0x5A1CAC08, 0x3FEF3BF2,0xD2ED0C38, + 0x40053D70,0xA3D70A3D, 0x3FEF3F08,0xDC487554, + 0x40053F7C,0xED916873, 0x3FEF421E,0x997A48B7, + 0x40054189,0x374BC6A8, 0x3FEF4534,0x0A91343C, + 0x40054395,0x810624DD, 0x3FEF4849,0x2F9BE182, + 0x400545A1,0xCAC08312, 0x3FEF4B5E,0x08A8F5EC, + 0x400547AE,0x147AE148, 0x3FEF4E72,0x95C712A4, + 0x400549BA,0x5E353F7D, 0x3FEF5186,0xD704D496, + 0x40054BC6,0xA7EF9DB2, 0x3FEF549A,0xCC70D479, + 0x40054DD2,0xF1A9FBE7, 0x3FEF57AE,0x7619A6D1, + 0x40054FDF,0x3B645A1D, 0x3FEF5AC1,0xD40DDBEB, + 0x400551EB,0x851EB852, 0x3FEF5DD4,0xE65BFFDF, + 0x400553F7,0xCED91687, 0x3FEF60E7,0xAD129A99, + 0x40055604,0x189374BC, 0x3FEF63FA,0x28402FD2, + 0x40055810,0x624DD2F2, 0x3FEF670C,0x57F33F18, + 0x40055A1C,0xAC083127, 0x3FEF6A1E,0x3C3A43C8, + 0x40055C28,0xF5C28F5C, 0x3FEF6D2F,0xD523B51B, + 0x40055E35,0x3F7CED91, 0x3FEF7041,0x22BE061B, + 0x40056041,0x89374BC7, 0x3FEF7352,0x2517A5B0, + 0x4005624D,0xD2F1A9FC, 0x3FEF7662,0xDC3EFE97, + 0x4005645A,0x1CAC0831, 0x3FEF7973,0x4842776B, + 0x40056666,0x66666666, 0x3FEF7C83,0x693072A6, + 0x40056872,0xB020C49C, 0x3FEF7F93,0x3F174EA1, + 0x40056A7E,0xF9DB22D1, 0x3FEF82A2,0xCA056590, + 0x40056C8B,0x43958106, 0x3FEF85B2,0x0A090D90, + 0x40056E97,0x8D4FDF3B, 0x3FEF88C0,0xFF30989E, + 0x400570A3,0xD70A3D71, 0x3FEF8BCF,0xA98A549E, + 0x400572B0,0x20C49BA6, 0x3FEF8EDE,0x09248B58, + 0x400574BC,0x6A7EF9DB, 0x3FEF91EC,0x1E0D827F, + 0x400576C8,0xB4395810, 0x3FEF94F9,0xE8537BAF, + 0x400578D4,0xFDF3B646, 0x3FEF9807,0x6804B473, + 0x40057AE1,0x47AE147B, 0x3FEF9B14,0x9D2F663B, + 0x40057CED,0x916872B0, 0x3FEF9E21,0x87E1C66C, + 0x40057EF9,0xDB22D0E5, 0x3FEFA12E,0x282A065B, + 0x40058106,0x24DD2F1B, 0x3FEFA43A,0x7E16534D, + 0x40058312,0x6E978D50, 0x3FEFA746,0x89B4D678, + 0x4005851E,0xB851EB85, 0x3FEFAA52,0x4B13B50C, + 0x4005872B,0x020C49BA, 0x3FEFAD5D,0xC241102C, + 0x40058937,0x4BC6A7F0, 0x3FEFB068,0xEF4B04F4, + 0x40058B43,0x95810625, 0x3FEFB373,0xD23FAC78, + 0x40058D4F,0xDF3B645A, 0x3FEFB67E,0x6B2D1BC8, + 0x40058F5C,0x28F5C28F, 0x3FEFB988,0xBA2163F0, + 0x40059168,0x72B020C5, 0x3FEFBC92,0xBF2A91FD, + 0x40059374,0xBC6A7EFA, 0x3FEFBF9C,0x7A56AEF6, + 0x40059581,0x0624DD2F, 0x3FEFC2A5,0xEBB3BFE6, + 0x4005978D,0x4FDF3B64, 0x3FEFC5AF,0x134FC5DC, + 0x40059999,0x9999999A, 0x3FEFC8B7,0xF138BDEA, + 0x40059BA5,0xE353F7CF, 0x3FEFCBC0,0x857CA125, + 0x40059DB2,0x2D0E5604, 0x3FEFCEC8,0xD02964AB, + 0x40059FBE,0x76C8B439, 0x3FEFD1D0,0xD14CF9A5, + 0x4005A1CA,0xC083126F, 0x3FEFD4D8,0x88F54D43, + 0x4005A3D7,0x0A3D70A4, 0x3FEFD7DF,0xF73048C1, + 0x4005A5E3,0x53F7CED9, 0x3FEFDAE7,0x1C0BD168, + 0x4005A7EF,0x9DB22D0E, 0x3FEFDDED,0xF795C891, + 0x4005A9FB,0xE76C8B44, 0x3FEFE0F4,0x89DC0BA5, + 0x4005AC08,0x3126E979, 0x3FEFE3FA,0xD2EC741B, + 0x4005AE14,0x7AE147AE, 0x3FEFE700,0xD2D4D783, + 0x4005B020,0xC49BA5E3, 0x3FEFEA06,0x89A3077C, + 0x4005B22D,0x0E560419, 0x3FEFED0B,0xF764D1BF, + 0x4005B439,0x5810624E, 0x3FEFF011,0x1C280019, + 0x4005B645,0xA1CAC083, 0x3FEFF315,0xF7FA5873, + 0x4005B851,0xEB851EB8, 0x3FEFF61A,0x8AE99CCE, + 0x4005BA5E,0x353F7CEE, 0x3FEFF91E,0xD5038B4C, + 0x4005BC6A,0x7EF9DB23, 0x3FEFFC22,0xD655DE23, + 0x4005BE76,0xC8B43958, 0x3FEFFF26,0x8EEE4BB0, + 0x4005C083,0x126E978D, 0x3FF00114,0xFF6D4337, + 0x4005C28F,0x5C28F5C3, 0x3FF00296,0x93141E7C, + 0x4005C49B,0xA5E353F8, 0x3FF00418,0x02728D08, + 0x4005C6A7,0xEF9DB22D, 0x3FF00599,0x4D8F624B, + 0x4005C8B4,0x39581062, 0x3FF0071A,0x74716FCC, + 0x4005CAC0,0x83126E98, 0x3FF0089B,0x771F8524, + 0x4005CCCC,0xCCCCCCCD, 0x3FF00A1C,0x55A06FFF, + 0x4005CED9,0x16872B02, 0x3FF00B9D,0x0FFAFC21, + 0x4005D0E5,0x60418937, 0x3FF00D1D,0xA635F361, + 0x4005D2F1,0xA9FBE76D, 0x3FF00E9E,0x18581DB1, + 0x4005D4FD,0xF3B645A2, 0x3FF0101E,0x66684116, + 0x4005D70A,0x3D70A3D7, 0x3FF0119E,0x906D21AE, + 0x4005D916,0x872B020C, 0x3FF0131E,0x966D81B1, + 0x4005DB22,0xD0E56042, 0x3FF0149E,0x78702172, + 0x4005DD2F,0x1A9FBE77, 0x3FF0161E,0x367BBF5A, + 0x4005DF3B,0x645A1CAC, 0x3FF0179D,0xD09717F0, + 0x4005E147,0xAE147AE1, 0x3FF0191D,0x46C8E5D6, + 0x4005E353,0xF7CED917, 0x3FF01A9C,0x9917E1CC, + 0x4005E560,0x4189374C, 0x3FF01C1B,0xC78AC2AA, + 0x4005E76C,0x8B439581, 0x3FF01D9A,0xD2283D6B, + 0x4005E978,0xD4FDF3B6, 0x3FF01F19,0xB8F70527, + 0x4005EB85,0x1EB851EC, 0x3FF02098,0x7BFDCB15, + 0x4005ED91,0x6872B021, 0x3FF02217,0x1B433E8B, + 0x4005EF9D,0xB22D0E56, 0x3FF02395,0x96CE0CFF, + 0x4005F1A9,0xFBE76C8B, 0x3FF02513,0xEEA4E20C, + 0x4005F3B6,0x45A1CAC1, 0x3FF02692,0x22CE676C, + 0x4005F5C2,0x8F5C28F6, 0x3FF02810,0x335144FB, + 0x4005F7CE,0xD916872B, 0x3FF0298E,0x203420BB, + 0x4005F9DB,0x22D0E560, 0x3FF02B0B,0xE97D9ED0, + 0x4005FBE7,0x6C8B4396, 0x3FF02C89,0x8F346184, + 0x4005FDF3,0xB645A1CB, 0x3FF02E07,0x115F0945, + 0x40060000,0x00000000, 0x3FF02F84,0x700434A8, + 0x4006020C,0x49BA5E35, 0x3FF03101,0xAB2A806A, + 0x40060418,0x9374BC6A, 0x3FF0327E,0xC2D8876E, + 0x40060624,0xDD2F1AA0, 0x3FF033FB,0xB714E2C1, + 0x40060831,0x26E978D5, 0x3FF03578,0x87E62995, + 0x40060A3D,0x70A3D70A, 0x3FF036F5,0x3552F149, + 0x40060C49,0xBA5E353F, 0x3FF03871,0xBF61CD65, + 0x40060E56,0x04189375, 0x3FF039EE,0x26194F9E, + 0x40061062,0x4DD2F1AA, 0x3FF03B6A,0x698007D2, + 0x4006126E,0x978D4FDF, 0x3FF03CE6,0x899C840C, + 0x4006147A,0xE147AE14, 0x3FF03E62,0x86755083, + 0x40061687,0x2B020C4A, 0x3FF03FDE,0x6010F7A0, + 0x40061893,0x74BC6A7F, 0x3FF0415A,0x167601F5, + 0x40061A9F,0xBE76C8B4, 0x3FF042D5,0xA9AAF645, + 0x40061CAC,0x083126E9, 0x3FF04451,0x19B65984, + 0x40061EB8,0x51EB851F, 0x3FF045CC,0x669EAED6, + 0x400620C4,0x9BA5E354, 0x3FF04747,0x906A778D, + 0x400622D0,0xE5604189, 0x3FF048C2,0x97203330, + 0x400624DD,0x2F1A9FBE, 0x3FF04A3D,0x7AC65F77, + 0x400626E9,0x78D4FDF4, 0x3FF04BB8,0x3B637850, + 0x400628F5,0xC28F5C29, 0x3FF04D32,0xD8FDF7D6, + 0x40062B02,0x0C49BA5E, 0x3FF04EAD,0x539C565E, + 0x40062D0E,0x56041893, 0x3FF05027,0xAB450A72, + 0x40062F1A,0x9FBE76C9, 0x3FF051A1,0xDFFE88CF, + 0x40063126,0xE978D4FE, 0x3FF0531B,0xF1CF4468, + 0x40063333,0x33333333, 0x3FF05495,0xE0BDAE6B, + 0x4006353F,0x7CED9168, 0x3FF0560F,0xACD03639, + 0x4006374B,0xC6A7EF9E, 0x3FF05789,0x560D496F, + 0x40063958,0x10624DD3, 0x3FF05902,0xDC7B53E1, + 0x40063B64,0x5A1CAC08, 0x3FF05A7C,0x4020BF9D, + 0x40063D70,0xA3D70A3D, 0x3FF05BF5,0x8103F4EA, + 0x40063F7C,0xED916873, 0x3FF05D6E,0x9F2B5A4F, + 0x40064189,0x374BC6A8, 0x3FF05EE7,0x9A9D5486, + 0x40064395,0x810624DD, 0x3FF06060,0x7360468E, + 0x400645A1,0xCAC08312, 0x3FF061D9,0x297A919D, + 0x400647AE,0x147AE148, 0x3FF06351,0xBCF2952A, + 0x400649BA,0x5E353F7D, 0x3FF064CA,0x2DCEAEE7, + 0x40064BC6,0xA7EF9DB2, 0x3FF06642,0x7C153AC7, + 0x40064DD2,0xF1A9FBE7, 0x3FF067BA,0xA7CC92FD, + 0x40064FDF,0x3B645A1D, 0x3FF06932,0xB0FB0FFB, + 0x400651EB,0x851EB852, 0x3FF06AAA,0x97A70873, + 0x400653F7,0xCED91687, 0x3FF06C22,0x5BD6D15A, + 0x40065604,0x189374BC, 0x3FF06D99,0xFD90BDE6, + 0x40065810,0x624DD2F2, 0x3FF06F11,0x7CDB1F91, + 0x40065A1C,0xAC083127, 0x3FF07088,0xD9BC4616, + 0x40065C28,0xF5C28F5C, 0x3FF07200,0x143A7F76, + 0x40065E35,0x3F7CED91, 0x3FF07377,0x2C5C17F6, + 0x40066041,0x89374BC7, 0x3FF074EE,0x22275A21, + 0x4006624D,0xD2F1A9FC, 0x3FF07664,0xF5A28EC5, + 0x4006645A,0x1CAC0831, 0x3FF077DB,0xA6D3FCF9, + 0x40066666,0x66666666, 0x3FF07952,0x35C1EA1B, + 0x40066872,0xB020C49C, 0x3FF07AC8,0xA27299D2, + 0x40066A7E,0xF9DB22D1, 0x3FF07C3E,0xECEC4E08, + 0x40066C8B,0x43958106, 0x3FF07DB5,0x153546F7, + 0x40066E97,0x8D4FDF3B, 0x3FF07F2B,0x1B53C31E, + 0x400670A3,0xD70A3D71, 0x3FF080A0,0xFF4DFF48, + 0x400672B0,0x20C49BA6, 0x3FF08216,0xC12A368A, + 0x400674BC,0x6A7EF9DB, 0x3FF0838C,0x60EEA245, + 0x400676C8,0xB4395810, 0x3FF08501,0xDEA17A27, + 0x400678D4,0xFDF3B646, 0x3FF08677,0x3A48F42A, + 0x40067AE1,0x47AE147B, 0x3FF087EC,0x73EB4494, + 0x40067CED,0x916872B0, 0x3FF08961,0x8B8E9DFA, + 0x40067EF9,0xDB22D0E5, 0x3FF08AD6,0x81393141, + 0x40068106,0x24DD2F1B, 0x3FF08C4B,0x54F12D9D, + 0x40068312,0x6E978D50, 0x3FF08DC0,0x06BCC08E, + 0x4006851E,0xB851EB85, 0x3FF08F34,0x96A215E9, + 0x4006872B,0x020C49BA, 0x3FF090A9,0x04A757D3, + 0x40068937,0x4BC6A7F0, 0x3FF0921D,0x50D2AEC2, + 0x40068B43,0x95810625, 0x3FF09391,0x7B2A417C, + 0x40068D4F,0xDF3B645A, 0x3FF09505,0x83B4351F, + 0x40068F5C,0x28F5C28F, 0x3FF09679,0x6A76AD19, + 0x40069168,0x72B020C5, 0x3FF097ED,0x2F77CB2C, + 0x40069374,0xBC6A7EFA, 0x3FF09960,0xD2BDAF71, + 0x40069581,0x0624DD2F, 0x3FF09AD4,0x544E7853, + 0x4006978D,0x4FDF3B64, 0x3FF09C47,0xB4304297, + 0x40069999,0x9999999A, 0x3FF09DBA,0xF2692955, + 0x40069BA5,0xE353F7CF, 0x3FF09F2E,0x0EFF45FD, + 0x40069DB2,0x2D0E5604, 0x3FF0A0A1,0x09F8B059, + 0x40069FBE,0x76C8B439, 0x3FF0A213,0xE35B7E88, + 0x4006A1CA,0xC083126F, 0x3FF0A386,0x9B2DC505, + 0x4006A3D7,0x0A3D70A4, 0x3FF0A4F9,0x317596A2, + 0x4006A5E3,0x53F7CED9, 0x3FF0A66B,0xA639048C, + 0x4006A7EF,0x9DB22D0E, 0x3FF0A7DD,0xF97E1E4B, + 0x4006A9FB,0xE76C8B44, 0x3FF0A950,0x2B4AF1C3, + 0x4006AC08,0x3126E979, 0x3FF0AAC2,0x3BA58B32, + 0x4006AE14,0x7AE147AE, 0x3FF0AC34,0x2A93F534, + 0x4006B020,0xC49BA5E3, 0x3FF0ADA5,0xF81C38C2, + 0x4006B22D,0x0E560419, 0x3FF0AF17,0xA4445D33, + 0x4006B439,0x5810624E, 0x3FF0B089,0x2F12683B, + 0x4006B645,0xA1CAC083, 0x3FF0B1FA,0x988C5DED, + 0x4006B851,0xEB851EB8, 0x3FF0B36B,0xE0B840BD, + 0x4006BA5E,0x353F7CEE, 0x3FF0B4DD,0x079C117E, + 0x4006BC6A,0x7EF9DB23, 0x3FF0B64E,0x0D3DCF63, + 0x4006BE76,0xC8B43958, 0x3FF0B7BE,0xF1A37801, + 0x4006C083,0x126E978D, 0x3FF0B92F,0xB4D3074F, + 0x4006C28F,0x5C28F5C3, 0x3FF0BAA0,0x56D277A7, + 0x4006C49B,0xA5E353F8, 0x3FF0BC10,0xD7A7C1C3, + 0x4006C6A7,0xEF9DB22D, 0x3FF0BD81,0x3758DCC4, + 0x4006C8B4,0x39581062, 0x3FF0BEF1,0x75EBBE2E, + 0x4006CAC0,0x83126E98, 0x3FF0C061,0x936659E8, + 0x4006CCCC,0xCCCCCCCD, 0x3FF0C1D1,0x8FCEA241, + 0x4006CED9,0x16872B02, 0x3FF0C341,0x6B2A87EB, + 0x4006D0E5,0x60418937, 0x3FF0C4B1,0x257FFA02, + 0x4006D2F1,0xA9FBE76D, 0x3FF0C620,0xBED4E606, + 0x4006D4FD,0xF3B645A2, 0x3FF0C790,0x372F37DE, + 0x4006D70A,0x3D70A3D7, 0x3FF0C8FF,0x8E94D9DD, + 0x4006D916,0x872B020C, 0x3FF0CA6E,0xC50BB4BB, + 0x4006DB22,0xD0E56042, 0x3FF0CBDD,0xDA99AF9C, + 0x4006DD2F,0x1A9FBE77, 0x3FF0CD4C,0xCF44B00B, + 0x4006DF3B,0x645A1CAC, 0x3FF0CEBB,0xA31299FF, + 0x4006E147,0xAE147AE1, 0x3FF0D02A,0x56094FDB, + 0x4006E353,0xF7CED917, 0x3FF0D198,0xE82EB26C, + 0x4006E560,0x4189374C, 0x3FF0D307,0x5988A0EC, + 0x4006E76C,0x8B439581, 0x3FF0D475,0xAA1CF900, + 0x4006E978,0xD4FDF3B6, 0x3FF0D5E3,0xD9F196BD, + 0x4006EB85,0x1EB851EC, 0x3FF0D751,0xE90C54A5, + 0x4006ED91,0x6872B021, 0x3FF0D8BF,0xD7730BA6, + 0x4006EF9D,0xB22D0E56, 0x3FF0DA2D,0xA52B931F, + 0x4006F1A9,0xFBE76C8B, 0x3FF0DB9B,0x523BC0DF, + 0x4006F3B6,0x45A1CAC1, 0x3FF0DD08,0xDEA96924, + 0x4006F5C2,0x8F5C28F6, 0x3FF0DE76,0x4A7A5E9D, + 0x4006F7CE,0xD916872B, 0x3FF0DFE3,0x95B47269, + 0x4006F9DB,0x22D0E560, 0x3FF0E150,0xC05D741B, + 0x4006FBE7,0x6C8B4396, 0x3FF0E2BD,0xCA7B31B7, + 0x4006FDF3,0xB645A1CB, 0x3FF0E42A,0xB41377B3, + 0x40070000,0x00000000, 0x3FF0E597,0x7D2C10F9, + 0x4007020C,0x49BA5E35, 0x3FF0E704,0x25CAC6E9, + 0x40070418,0x9374BC6A, 0x3FF0E870,0xADF56154, + 0x40070624,0xDD2F1AA0, 0x3FF0E9DD,0x15B1A683, + 0x40070831,0x26E978D5, 0x3FF0EB49,0x5D055B32, + 0x40070A3D,0x70A3D70A, 0x3FF0ECB5,0x83F64295, + 0x40070C49,0xBA5E353F, 0x3FF0EE21,0x8A8A1E56, + 0x40070E56,0x04189375, 0x3FF0EF8D,0x70C6AE98, + 0x40071062,0x4DD2F1AA, 0x3FF0F0F9,0x36B1B1F1, + 0x4007126E,0x978D4FDF, 0x3FF0F264,0xDC50E575, + 0x4007147A,0xE147AE14, 0x3FF0F3D0,0x61AA04AD, + 0x40071687,0x2B020C4A, 0x3FF0F53B,0xC6C2C99E, + 0x40071893,0x74BC6A7F, 0x3FF0F6A7,0x0BA0ECC4, + 0x40071A9F,0xBE76C8B4, 0x3FF0F812,0x304A2517, + 0x40071CAC,0x083126E9, 0x3FF0F97D,0x34C4280C, + 0x40071EB8,0x51EB851F, 0x3FF0FAE8,0x1914A991, + 0x400720C4,0x9BA5E354, 0x3FF0FC52,0xDD415C10, + 0x400722D0,0xE5604189, 0x3FF0FDBD,0x814FF072, + 0x400724DD,0x2F1A9FBE, 0x3FF0FF28,0x05461619, + 0x400726E9,0x78D4FDF4, 0x3FF10092,0x69297AEB, + 0x400728F5,0xC28F5C29, 0x3FF101FC,0xACFFCB45, + 0x40072B02,0x0C49BA5E, 0x3FF10366,0xD0CEB208, + 0x40072D0E,0x56041893, 0x3FF104D0,0xD49BD892, + 0x40072F1A,0x9FBE76C9, 0x3FF1063A,0xB86CE6C3, + 0x40073126,0xE978D4FE, 0x3FF107A4,0x7C4782F9, + 0x40073333,0x33333333, 0x3FF1090E,0x20315212, + 0x4007353F,0x7CED9168, 0x3FF10A77,0xA42FF772, + 0x4007374B,0xC6A7EF9E, 0x3FF10BE1,0x084914FB, + 0x40073958,0x10624DD3, 0x3FF10D4A,0x4C824B11, + 0x40073B64,0x5A1CAC08, 0x3FF10EB3,0x70E1389F, + 0x40073D70,0xA3D70A3D, 0x3FF1101C,0x756B7B10, + 0x40073F7C,0xED916873, 0x3FF11185,0x5A26AE55, + 0x40074189,0x374BC6A8, 0x3FF112EE,0x1F186CE1, + 0x40074395,0x810624DD, 0x3FF11456,0xC4464FAF, + 0x400745A1,0xCAC08312, 0x3FF115BF,0x49B5EE3E, + 0x400747AE,0x147AE148, 0x3FF11727,0xAF6CDE95, + 0x400749BA,0x5E353F7D, 0x3FF1188F,0xF570B53E, + 0x40074BC6,0xA7EF9DB2, 0x3FF119F8,0x1BC7054E, + 0x40074DD2,0xF1A9FBE7, 0x3FF11B60,0x22756060, + 0x40074FDF,0x3B645A1D, 0x3FF11CC8,0x09815697, + 0x400751EB,0x851EB852, 0x3FF11E2F,0xD0F0769F, + 0x400753F7,0xCED91687, 0x3FF11F97,0x78C84DAE, + 0x40075604,0x189374BC, 0x3FF120FF,0x010E6781, + 0x40075810,0x624DD2F2, 0x3FF12266,0x69C84E65, + 0x40075A1C,0xAC083127, 0x3FF123CD,0xB2FB8B2A, + 0x40075C28,0xF5C28F5C, 0x3FF12534,0xDCADA532, + 0x40075E35,0x3F7CED91, 0x3FF1269B,0xE6E42267, + 0x40076041,0x89374BC7, 0x3FF12802,0xD1A48742, + 0x4007624D,0xD2F1A9FC, 0x3FF12969,0x9CF456C5, + 0x4007645A,0x1CAC0831, 0x3FF12AD0,0x48D91284, + 0x40076666,0x66666666, 0x3FF12C36,0xD5583A9D, + 0x40076872,0xB020C49C, 0x3FF12D9D,0x42774DBE, + 0x40076A7E,0xF9DB22D1, 0x3FF12F03,0x903BC924, + 0x40076C8B,0x43958106, 0x3FF13069,0xBEAB289B, + 0x40076E97,0x8D4FDF3B, 0x3FF131CF,0xCDCAE67F, + 0x400770A3,0xD70A3D71, 0x3FF13335,0xBDA07BBD, + 0x400772B0,0x20C49BA6, 0x3FF1349B,0x8E315FD0, + 0x400774BC,0x6A7EF9DB, 0x3FF13601,0x3F8308C7, + 0x400776C8,0xB4395810, 0x3FF13766,0xD19AEB43, + 0x400778D4,0xFDF3B646, 0x3FF138CC,0x447E7A78, + 0x40077AE1,0x47AE147B, 0x3FF13A31,0x98332829, + 0x40077CED,0x916872B0, 0x3FF13B96,0xCCBE64B0, + 0x40077EF9,0xDB22D0E5, 0x3FF13CFB,0xE2259EFA, + 0x40078106,0x24DD2F1B, 0x3FF13E60,0xD86E4488, + 0x40078312,0x6E978D50, 0x3FF13FC5,0xAF9DC16F, + 0x4007851E,0xB851EB85, 0x3FF1412A,0x67B9805B, + 0x4007872B,0x020C49BA, 0x3FF1428F,0x00C6EA8D, + 0x40078937,0x4BC6A7F0, 0x3FF143F3,0x7ACB67DD, + 0x40078B43,0x95810625, 0x3FF14557,0xD5CC5EB8, + 0x40078D4F,0xDF3B645A, 0x3FF146BC,0x11CF3424, + 0x40078F5C,0x28F5C28F, 0x3FF14820,0x2ED94BBF, + 0x40079168,0x72B020C5, 0x3FF14984,0x2CF007BE, + 0x40079374,0xBC6A7EFA, 0x3FF14AE8,0x0C18C8F0, + 0x40079581,0x0624DD2F, 0x3FF14C4B,0xCC58EEBB, + 0x4007978D,0x4FDF3B64, 0x3FF14DAF,0x6DB5D722, + 0x40079999,0x9999999A, 0x3FF14F12,0xF034DEC0, + 0x40079BA5,0xE353F7CF, 0x3FF15076,0x53DB60CC, + 0x40079DB2,0x2D0E5604, 0x3FF151D9,0x98AEB716, + 0x40079FBE,0x76C8B439, 0x3FF1533C,0xBEB43A0D, + 0x4007A1CA,0xC083126F, 0x3FF1549F,0xC5F140B9, + 0x4007A3D7,0x0A3D70A4, 0x3FF15602,0xAE6B20C1, + 0x4007A5E3,0x53F7CED9, 0x3FF15765,0x78272E68, + 0x4007A7EF,0x9DB22D0E, 0x3FF158C8,0x232ABC8D, + 0x4007A9FB,0xE76C8B44, 0x3FF15A2A,0xAF7B1CB3, + 0x4007AC08,0x3126E979, 0x3FF15B8D,0x1D1D9EF3, + 0x4007AE14,0x7AE147AE, 0x3FF15CEF,0x6C17920B, + 0x4007B020,0xC49BA5E3, 0x3FF15E51,0x9C6E4358, + 0x4007B22D,0x0E560419, 0x3FF15FB3,0xAE26FED6, + 0x4007B439,0x5810624E, 0x3FF16115,0xA1470F20, + 0x4007B645,0xA1CAC083, 0x3FF16277,0x75D3BD74, + 0x4007B851,0xEB851EB8, 0x3FF163D9,0x2BD251B1, + 0x4007BA5E,0x353F7CEE, 0x3FF1653A,0xC3481258, + 0x4007BC6A,0x7EF9DB23, 0x3FF1669C,0x3C3A448C, + 0x4007BE76,0xC8B43958, 0x3FF167FD,0x96AE2C12, + 0x4007C083,0x126E978D, 0x3FF1695E,0xD2A90B55, + 0x4007C28F,0x5C28F5C3, 0x3FF16ABF,0xF0302361, + 0x4007C49B,0xA5E353F8, 0x3FF16C20,0xEF48B3E8, + 0x4007C6A7,0xEF9DB22D, 0x3FF16D81,0xCFF7FB3E, + 0x4007C8B4,0x39581062, 0x3FF16EE2,0x92433660, + 0x4007CAC0,0x83126E98, 0x3FF17043,0x362FA0EF, + 0x4007CCCC,0xCCCCCCCD, 0x3FF171A3,0xBBC27531, + 0x4007CED9,0x16872B02, 0x3FF17304,0x2300EC13, + 0x4007D0E5,0x60418937, 0x3FF17464,0x6BF03D2B, + 0x4007D2F1,0xA9FBE76D, 0x3FF175C4,0x96959EB5, + 0x4007D4FD,0xF3B645A2, 0x3FF17724,0xA2F64594, + 0x4007D70A,0x3D70A3D7, 0x3FF17884,0x91176555, + 0x4007D916,0x872B020C, 0x3FF179E4,0x60FE302E, + 0x4007DB22,0xD0E56042, 0x3FF17B44,0x12AFD6FD, + 0x4007DD2F,0x1A9FBE77, 0x3FF17CA3,0xA631894A, + 0x4007DF3B,0x645A1CAC, 0x3FF17E03,0x1B887548, + 0x4007E147,0xAE147AE1, 0x3FF17F62,0x72B9C7D5, + 0x4007E353,0xF7CED917, 0x3FF180C1,0xABCAAC7B, + 0x4007E560,0x4189374C, 0x3FF18220,0xC6C04D6C, + 0x4007E76C,0x8B439581, 0x3FF1837F,0xC39FD38A, + 0x4007E978,0xD4FDF3B6, 0x3FF184DE,0xA26E6661, + 0x4007EB85,0x1EB851EC, 0x3FF1863D,0x63312C2C, + 0x4007ED91,0x6872B021, 0x3FF1879C,0x05ED49D2, + 0x4007EF9D,0xB22D0E56, 0x3FF188FA,0x8AA7E2E8, + 0x4007F1A9,0xFBE76C8B, 0x3FF18A58,0xF16619B3, + 0x4007F3B6,0x45A1CAC1, 0x3FF18BB7,0x3A2D0F25, + 0x4007F5C2,0x8F5C28F6, 0x3FF18D15,0x6501E2DF, + 0x4007F7CE,0xD916872B, 0x3FF18E73,0x71E9B333, + 0x4007F9DB,0x22D0E560, 0x3FF18FD1,0x60E99D24, + 0x4007FBE7,0x6C8B4396, 0x3FF1912F,0x3206BC63, + 0x4007FDF3,0xB645A1CB, 0x3FF1928C,0xE5462B53, + 0x40080000,0x00000000, 0x3FF193EA,0x7AAD030B, + 0x4008020C,0x49BA5E35, 0x3FF19547,0xF2405B4F, + 0x40080418,0x9374BC6A, 0x3FF196A5,0x4C054A9B, + 0x40080624,0xDD2F1AA0, 0x3FF19802,0x8800E61A, + 0x40080831,0x26E978D5, 0x3FF1995F,0xA63841AC, + 0x40080A3D,0x70A3D70A, 0x3FF19ABC,0xA6B06FE2, + 0x40080C49,0xBA5E353F, 0x3FF19C19,0x896E8206, + 0x40080E56,0x04189375, 0x3FF19D76,0x4E778813, + 0x40081062,0x4DD2F1AA, 0x3FF19ED2,0xF5D090B9, + 0x4008126E,0x978D4FDF, 0x3FF1A02F,0x7F7EA960, + 0x4008147A,0xE147AE14, 0x3FF1A18B,0xEB86DE23, + 0x40081687,0x2B020C4A, 0x3FF1A2E8,0x39EE39D7, + 0x40081893,0x74BC6A7F, 0x3FF1A444,0x6AB9C603, + 0x40081A9F,0xBE76C8B4, 0x3FF1A5A0,0x7DEE8AE9, + 0x40081CAC,0x083126E9, 0x3FF1A6FC,0x73918F81, + 0x40081EB8,0x51EB851F, 0x3FF1A858,0x4BA7D97D, + 0x400820C4,0x9BA5E354, 0x3FF1A9B4,0x06366D45, + 0x400822D0,0xE5604189, 0x3FF1AB0F,0xA3424DFC, + 0x400824DD,0x2F1A9FBE, 0x3FF1AC6B,0x22D07D7D, + 0x400826E9,0x78D4FDF4, 0x3FF1ADC6,0x84E5FC5E, + 0x400828F5,0xC28F5C29, 0x3FF1AF21,0xC987C9EE, + 0x40082B02,0x0C49BA5E, 0x3FF1B07C,0xF0BAE438, + 0x40082D0E,0x56041893, 0x3FF1B1D7,0xFA844801, + 0x40082F1A,0x9FBE76C9, 0x3FF1B332,0xE6E8F0CC, + 0x40083126,0xE978D4FE, 0x3FF1B48D,0xB5EDD8D4, + 0x40083333,0x33333333, 0x3FF1B5E8,0x6797F915, + 0x4008353F,0x7CED9168, 0x3FF1B742,0xFBEC4943, + 0x4008374B,0xC6A7EF9E, 0x3FF1B89D,0x72EFBFD4, + 0x40083958,0x10624DD3, 0x3FF1B9F7,0xCCA751F8, + 0x40083B64,0x5A1CAC08, 0x3FF1BB52,0x0917F39F, + 0x40083D70,0xA3D70A3D, 0x3FF1BCAC,0x28469777, + 0x40083F7C,0xED916873, 0x3FF1BE06,0x2A382EEF, + 0x40084189,0x374BC6A8, 0x3FF1BF60,0x0EF1AA32, + 0x40084395,0x810624DD, 0x3FF1C0B9,0xD677F82D, + 0x400845A1,0xCAC08312, 0x3FF1C213,0x80D0068C, + 0x400847AE,0x147AE148, 0x3FF1C36D,0x0DFEC1BE, + 0x400849BA,0x5E353F7D, 0x3FF1C4C6,0x7E0914F0, + 0x40084BC6,0xA7EF9DB2, 0x3FF1C61F,0xD0F3EA13, + 0x40084DD2,0xF1A9FBE7, 0x3FF1C779,0x06C429D9, + 0x40084FDF,0x3B645A1D, 0x3FF1C8D2,0x1F7EBBB6, + 0x400851EB,0x851EB852, 0x3FF1CA2B,0x1B2885E1, + 0x400853F7,0xCED91687, 0x3FF1CB83,0xF9C66D55, + 0x40085604,0x189374BC, 0x3FF1CCDC,0xBB5D55CF, + 0x40085810,0x624DD2F2, 0x3FF1CE35,0x5FF221D3, + 0x40085A1C,0xAC083127, 0x3FF1CF8D,0xE789B2A5, + 0x40085C28,0xF5C28F5C, 0x3FF1D0E6,0x5228E852, + 0x40085E35,0x3F7CED91, 0x3FF1D23E,0x9FD4A1A9, + 0x40086041,0x89374BC7, 0x3FF1D396,0xD091BC42, + 0x4008624D,0xD2F1A9FC, 0x3FF1D4EE,0xE4651479, + 0x4008645A,0x1CAC0831, 0x3FF1D646,0xDB538570, + 0x40086666,0x66666666, 0x3FF1D79E,0xB561E911, + 0x40086872,0xB020C49C, 0x3FF1D8F6,0x7295180E, + 0x40086A7E,0xF9DB22D1, 0x3FF1DA4E,0x12F1E9DF, + 0x40086C8B,0x43958106, 0x3FF1DBA5,0x967D34C5, + 0x40086E97,0x8D4FDF3B, 0x3FF1DCFC,0xFD3BCDCA, + 0x400870A3,0xD70A3D71, 0x3FF1DE54,0x473288C1, + 0x400872B0,0x20C49BA6, 0x3FF1DFAB,0x74663845, + 0x400874BC,0x6A7EF9DB, 0x3FF1E102,0x84DBADBD, + 0x400876C8,0xB4395810, 0x3FF1E259,0x7897B957, + 0x400878D4,0xFDF3B646, 0x3FF1E3B0,0x4F9F2A0F, + 0x40087AE1,0x47AE147B, 0x3FF1E507,0x09F6CDAA, + 0x40087CED,0x916872B0, 0x3FF1E65D,0xA7A370B9, + 0x40087EF9,0xDB22D0E5, 0x3FF1E7B4,0x28A9DE99, + 0x40088106,0x24DD2F1B, 0x3FF1E90A,0x8D0EE173, + 0x40088312,0x6E978D50, 0x3FF1EA60,0xD4D7423B, + 0x4008851E,0xB851EB85, 0x3FF1EBB7,0x0007C8B5, + 0x4008872B,0x020C49BA, 0x3FF1ED0D,0x0EA53B71, + 0x40088937,0x4BC6A7F0, 0x3FF1EE63,0x00B45FCD, + 0x40088B43,0x95810625, 0x3FF1EFB8,0xD639F9F3, + 0x40088D4F,0xDF3B645A, 0x3FF1F10E,0x8F3ACCDF, + 0x40088F5C,0x28F5C28F, 0x3FF1F264,0x2BBB9A5B, + 0x40089168,0x72B020C5, 0x3FF1F3B9,0xABC12300, + 0x40089374,0xBC6A7EFA, 0x3FF1F50F,0x0F502636, + 0x40089581,0x0624DD2F, 0x3FF1F664,0x566D6236, + 0x4008978D,0x4FDF3B64, 0x3FF1F7B9,0x811D9409, + 0x40089999,0x9999999A, 0x3FF1F90E,0x8F65778C, + 0x40089BA5,0xE353F7CF, 0x3FF1FA63,0x8149C768, + 0x40089DB2,0x2D0E5604, 0x3FF1FBB8,0x56CF3D1D, + 0x40089FBE,0x76C8B439, 0x3FF1FD0D,0x0FFA90FA, + 0x4008A1CA,0xC083126F, 0x3FF1FE61,0xACD07A21, + 0x4008A3D7,0x0A3D70A4, 0x3FF1FFB6,0x2D55AE88, + 0x4008A5E3,0x53F7CED9, 0x3FF2010A,0x918EE2F7, + 0x4008A7EF,0x9DB22D0E, 0x3FF2025E,0xD980CB0C, + 0x4008A9FB,0xE76C8B44, 0x3FF203B3,0x05301937, + 0x4008AC08,0x3126E979, 0x3FF20507,0x14A17EBC, + 0x4008AE14,0x7AE147AE, 0x3FF2065B,0x07D9ABB5, + 0x4008B020,0xC49BA5E3, 0x3FF207AE,0xDEDD4F13, + 0x4008B22D,0x0E560419, 0x3FF20902,0x99B1169A, + 0x4008B439,0x5810624E, 0x3FF20A56,0x3859AEE5, + 0x4008B645,0xA1CAC083, 0x3FF20BA9,0xBADBC366, + 0x4008B851,0xEB851EB8, 0x3FF20CFD,0x213BFE64, + 0x4008BA5E,0x353F7CEE, 0x3FF20E50,0x6B7F0900, + 0x4008BC6A,0x7EF9DB23, 0x3FF20FA3,0x99A98B30, + 0x4008BE76,0xC8B43958, 0x3FF210F6,0xABC02BC4, + 0x4008C083,0x126E978D, 0x3FF21249,0xA1C79063, + 0x4008C28F,0x5C28F5C3, 0x3FF2139C,0x7BC45D8E, + 0x4008C49B,0xA5E353F8, 0x3FF214EF,0x39BB369D, + 0x4008C6A7,0xEF9DB22D, 0x3FF21641,0xDBB0BDC4, + 0x4008C8B4,0x39581062, 0x3FF21794,0x61A9940F, + 0x4008CAC0,0x83126E98, 0x3FF218E6,0xCBAA5966, + 0x4008CCCC,0xCCCCCCCD, 0x3FF21A39,0x19B7AC89, + 0x4008CED9,0x16872B02, 0x3FF21B8B,0x4BD62B16, + 0x4008D0E5,0x60418937, 0x3FF21CDD,0x620A7185, + 0x4008D2F1,0xA9FBE76D, 0x3FF21E2F,0x5C591B2A, + 0x4008D4FD,0xF3B645A2, 0x3FF21F81,0x3AC6C235, + 0x4008D70A,0x3D70A3D7, 0x3FF220D2,0xFD57FFB2, + 0x4008D916,0x872B020C, 0x3FF22224,0xA4116B8B, + 0x4008DB22,0xD0E56042, 0x3FF22376,0x2EF79C88, + 0x4008DD2F,0x1A9FBE77, 0x3FF224C7,0x9E0F284B, + 0x4008DF3B,0x645A1CAC, 0x3FF22618,0xF15CA357, + 0x4008E147,0xAE147AE1, 0x3FF2276A,0x28E4A10F, + 0x4008E353,0xF7CED917, 0x3FF228BB,0x44ABB3B1, + 0x4008E560,0x4189374C, 0x3FF22A0C,0x44B66C5C, + 0x4008E76C,0x8B439581, 0x3FF22B5D,0x29095B0E, + 0x4008E978,0xD4FDF3B6, 0x3FF22CAD,0xF1A90EA6, + 0x4008EB85,0x1EB851EC, 0x3FF22DFE,0x9E9A14E3, + 0x4008ED91,0x6872B021, 0x3FF22F4F,0x2FE0FA63, + 0x4008EF9D,0xB22D0E56, 0x3FF2309F,0xA5824AA6, + 0x4008F1A9,0xFBE76C8B, 0x3FF231EF,0xFF82900E, + 0x4008F3B6,0x45A1CAC1, 0x3FF23340,0x3DE653DF, + 0x4008F5C2,0x8F5C28F6, 0x3FF23490,0x60B21E3E, + 0x4008F7CE,0xD916872B, 0x3FF235E0,0x67EA7631, + 0x4008F9DB,0x22D0E560, 0x3FF23730,0x5393E1A5, + 0x4008FBE7,0x6C8B4396, 0x3FF23880,0x23B2E568, + 0x4008FDF3,0xB645A1CB, 0x3FF239CF,0xD84C052A, + 0x40090000,0x00000000, 0x3FF23B1F,0x7163C380, + 0x4009020C,0x49BA5E35, 0x3FF23C6E,0xEEFEA1E5, + 0x40090418,0x9374BC6A, 0x3FF23DBE,0x512120B7, + 0x40090624,0xDD2F1AA0, 0x3FF23F0D,0x97CFBF3A, + 0x40090831,0x26E978D5, 0x3FF2405C,0xC30EFB95, + 0x40090A3D,0x70A3D70A, 0x3FF241AB,0xD2E352D7, + 0x40090C49,0xBA5E353F, 0x3FF242FA,0xC75140F5, + 0x40090E56,0x04189375, 0x3FF24449,0xA05D40CC, + 0x40091062,0x4DD2F1AA, 0x3FF24598,0x5E0BCC1A, + 0x4009126E,0x978D4FDF, 0x3FF246E7,0x00615B8A, + 0x4009147A,0xE147AE14, 0x3FF24835,0x876266AD, + 0x40091687,0x2B020C4A, 0x3FF24983,0xF31363FB, + 0x40091893,0x74BC6A7F, 0x3FF24AD2,0x4378C8D5, + 0x40091A9F,0xBE76C8B4, 0x3FF24C20,0x78970984, + 0x40091CAC,0x083126E9, 0x3FF24D6E,0x9272993A, + 0x40091EB8,0x51EB851F, 0x3FF24EBC,0x910FEA13, + 0x400920C4,0x9BA5E354, 0x3FF2500A,0x74736D15, + 0x400922D0,0xE5604189, 0x3FF25158,0x3CA1922E, + 0x400924DD,0x2F1A9FBE, 0x3FF252A5,0xE99EC839, + 0x400926E9,0x78D4FDF4, 0x3FF253F3,0x7B6F7CFA, + 0x400928F5,0xC28F5C29, 0x3FF25540,0xF2181D20, + 0x40092B02,0x0C49BA5E, 0x3FF2568E,0x4D9D1447, + 0x40092D0E,0x56041893, 0x3FF257DB,0x8E02CCF5, + 0x40092F1A,0x9FBE76C9, 0x3FF25928,0xB34DB09F, + 0x40093126,0xE978D4FE, 0x3FF25A75,0xBD8227A1, + 0x40093333,0x33333333, 0x3FF25BC2,0xACA4994A, + 0x4009353F,0x7CED9168, 0x3FF25D0F,0x80B96BD2, + 0x4009374B,0xC6A7EF9E, 0x3FF25E5C,0x39C50462, + 0x40093958,0x10624DD3, 0x3FF25FA8,0xD7CBC70C, + 0x40093B64,0x5A1CAC08, 0x3FF260F5,0x5AD216D6, + 0x40093D70,0xA3D70A3D, 0x3FF26241,0xC2DC55B0, + 0x40093F7C,0xED916873, 0x3FF2638E,0x0FEEE47C, + 0x40094189,0x374BC6A8, 0x3FF264DA,0x420E2309, + 0x40094395,0x810624DD, 0x3FF26626,0x593E7017, + 0x400945A1,0xCAC08312, 0x3FF26772,0x55842956, + 0x400947AE,0x147AE148, 0x3FF268BE,0x36E3AB65, + 0x400949BA,0x5E353F7D, 0x3FF26A09,0xFD6151D6, + 0x40094BC6,0xA7EF9DB2, 0x3FF26B55,0xA9017729, + 0x40094DD2,0xF1A9FBE7, 0x3FF26CA1,0x39C874D1, + 0x40094FDF,0x3B645A1D, 0x3FF26DEC,0xAFBAA335, + 0x400951EB,0x851EB852, 0x3FF26F38,0x0ADC59A8, + 0x400953F7,0xCED91687, 0x3FF27083,0x4B31EE76, + 0x40095604,0x189374BC, 0x3FF271CE,0x70BFB6D9, + 0x40095810,0x624DD2F2, 0x3FF27319,0x7B8A0702, + 0x40095A1C,0xAC083127, 0x3FF27464,0x6B953210, + 0x40095C28,0xF5C28F5C, 0x3FF275AF,0x40E58A1B, + 0x40095E35,0x3F7CED91, 0x3FF276F9,0xFB7F602D, + 0x40096041,0x89374BC7, 0x3FF27844,0x9B670444, + 0x4009624D,0xD2F1A9FC, 0x3FF2798F,0x20A0C552, + 0x4009645A,0x1CAC0831, 0x3FF27AD9,0x8B30F141, + 0x40096666,0x66666666, 0x3FF27C23,0xDB1BD4EE, + 0x40096872,0xB020C49C, 0x3FF27D6E,0x1065BC2C, + 0x40096A7E,0xF9DB22D1, 0x3FF27EB8,0x2B12F1C5, + 0x40096C8B,0x43958106, 0x3FF28002,0x2B27BF79, + 0x40096E97,0x8D4FDF3B, 0x3FF2814C,0x10A86DFD, + 0x400970A3,0xD70A3D71, 0x3FF28295,0xDB994502, + 0x400972B0,0x20C49BA6, 0x3FF283DF,0x8BFE8B2A, + 0x400974BC,0x6A7EF9DB, 0x3FF28529,0x21DC8613, + 0x400976C8,0xB4395810, 0x3FF28672,0x9D377A52, + 0x400978D4,0xFDF3B646, 0x3FF287BB,0xFE13AB76, + 0x40097AE1,0x47AE147B, 0x3FF28905,0x44755C03, + 0x40097CED,0x916872B0, 0x3FF28A4E,0x7060CD79, + 0x40097EF9,0xDB22D0E5, 0x3FF28B97,0x81DA4051, + 0x40098106,0x24DD2F1B, 0x3FF28CE0,0x78E5F3FE, + 0x40098312,0x6E978D50, 0x3FF28E29,0x558826EA, + 0x4009851E,0xB851EB85, 0x3FF28F72,0x17C5167F, + 0x4009872B,0x020C49BA, 0x3FF290BA,0xBFA0FF1D, + 0x40098937,0x4BC6A7F0, 0x3FF29203,0x4D201C21, + 0x40098B43,0x95810625, 0x3FF2934B,0xC046A7E2, + 0x40098D4F,0xDF3B645A, 0x3FF29494,0x1918DBB6, + 0x40098F5C,0x28F5C28F, 0x3FF295DC,0x579AEFEB, + 0x40099168,0x72B020C5, 0x3FF29724,0x7BD11BCF, + 0x40099374,0xBC6A7EFA, 0x3FF2986C,0x85BF95A8, + 0x40099581,0x0624DD2F, 0x3FF299B4,0x756A92BE, + 0x4009978D,0x4FDF3B64, 0x3FF29AFC,0x4AD64754, + 0x40099999,0x9999999A, 0x3FF29C44,0x0606E6AB, + 0x40099BA5,0xE353F7CF, 0x3FF29D8B,0xA700A301, + 0x40099DB2,0x2D0E5604, 0x3FF29ED3,0x2DC7AD93, + 0x40099FBE,0x76C8B439, 0x3FF2A01A,0x9A60369E, + 0x4009A1CA,0xC083126F, 0x3FF2A161,0xECCE6D5C, + 0x4009A3D7,0x0A3D70A4, 0x3FF2A2A9,0x25168007, + 0x4009A5E3,0x53F7CED9, 0x3FF2A3F0,0x433C9BD8, + 0x4009A7EF,0x9DB22D0E, 0x3FF2A537,0x4744ED0A, + 0x4009A9FB,0xE76C8B44, 0x3FF2A67E,0x31339ED5, + 0x4009AC08,0x3126E979, 0x3FF2A7C5,0x010CDB74, + 0x4009AE14,0x7AE147AE, 0x3FF2A90B,0xB6D4CC22, + 0x4009B020,0xC49BA5E3, 0x3FF2AA52,0x528F991C, + 0x4009B22D,0x0E560419, 0x3FF2AB98,0xD441699F, + 0x4009B439,0x5810624E, 0x3FF2ACDF,0x3BEE63EA, + 0x4009B645,0xA1CAC083, 0x3FF2AE25,0x899AAD3F, + 0x4009B851,0xEB851EB8, 0x3FF2AF6B,0xBD4A69E3, + 0x4009BA5E,0x353F7CEE, 0x3FF2B0B1,0xD701BD1E, + 0x4009BC6A,0x7EF9DB23, 0x3FF2B1F7,0xD6C4C937, + 0x4009BE76,0xC8B43958, 0x3FF2B33D,0xBC97AF7D, + 0x4009C083,0x126E978D, 0x3FF2B483,0x887E9041, + 0x4009C28F,0x5C28F5C3, 0x3FF2B5C9,0x3A7D8AD9, + 0x4009C49B,0xA5E353F8, 0x3FF2B70E,0xD298BD9D, + 0x4009C6A7,0xEF9DB22D, 0x3FF2B854,0x50D445EC, + 0x4009C8B4,0x39581062, 0x3FF2B999,0xB5344029, + 0x4009CAC0,0x83126E98, 0x3FF2BADE,0xFFBCC7BC, + 0x4009CCCC,0xCCCCCCCD, 0x3FF2BC24,0x3071F713, + 0x4009CED9,0x16872B02, 0x3FF2BD69,0x4757E7A1, + 0x4009D0E5,0x60418937, 0x3FF2BEAE,0x4472B1E2, + 0x4009D2F1,0xA9FBE76D, 0x3FF2BFF3,0x27C66D55, + 0x4009D4FD,0xF3B645A2, 0x3FF2C137,0xF1573082, + 0x4009D70A,0x3D70A3D7, 0x3FF2C27C,0xA12910F6, + 0x4009D916,0x872B020C, 0x3FF2C3C1,0x37402349, + 0x4009DB22,0xD0E56042, 0x3FF2C505,0xB3A07B18, + 0x4009DD2F,0x1A9FBE77, 0x3FF2C64A,0x164E2B08, + 0x4009DF3B,0x645A1CAC, 0x3FF2C78E,0x5F4D44C7, + 0x4009E147,0xAE147AE1, 0x3FF2C8D2,0x8EA1D90D, + 0x4009E353,0xF7CED917, 0x3FF2CA16,0xA44FF798, + 0x4009E560,0x4189374C, 0x3FF2CB5A,0xA05BAF32, + 0x4009E76C,0x8B439581, 0x3FF2CC9E,0x82C90DAD, + 0x4009E978,0xD4FDF3B6, 0x3FF2CDE2,0x4B9C1FE6, + 0x4009EB85,0x1EB851EC, 0x3FF2CF25,0xFAD8F1C4, + 0x4009ED91,0x6872B021, 0x3FF2D069,0x90838E36, + 0x4009EF9D,0xB22D0E56, 0x3FF2D1AD,0x0C9FFF3A, + 0x4009F1A9,0xFBE76C8B, 0x3FF2D2F0,0x6F324DD6, + 0x4009F3B6,0x45A1CAC1, 0x3FF2D433,0xB83E821D, + 0x4009F5C2,0x8F5C28F6, 0x3FF2D576,0xE7C8A32D, + 0x4009F7CE,0xD916872B, 0x3FF2D6B9,0xFDD4B72F, + 0x4009F9DB,0x22D0E560, 0x3FF2D7FC,0xFA66C35A, + 0x4009FBE7,0x6C8B4396, 0x3FF2D93F,0xDD82CBF2, + 0x4009FDF3,0xB645A1CB, 0x3FF2DA82,0xA72CD446, + 0x400A0000,0x00000000, 0x3FF2DBC5,0x5768DEB3, + 0x400A020C,0x49BA5E35, 0x3FF2DD07,0xEE3AECA3, + 0x400A0418,0x9374BC6A, 0x3FF2DE4A,0x6BA6FE90, + 0x400A0624,0xDD2F1AA0, 0x3FF2DF8C,0xCFB11400, + 0x400A0831,0x26E978D5, 0x3FF2E0CF,0x1A5D2B86, + 0x400A0A3D,0x70A3D70A, 0x3FF2E211,0x4BAF42C8, + 0x400A0C49,0xBA5E353F, 0x3FF2E353,0x63AB5677, + 0x400A0E56,0x04189375, 0x3FF2E495,0x62556257, + 0x400A1062,0x4DD2F1AA, 0x3FF2E5D7,0x47B16136, + 0x400A126E,0x978D4FDF, 0x3FF2E719,0x13C34CF8, + 0x400A147A,0xE147AE14, 0x3FF2E85A,0xC68F1E8D, + 0x400A1687,0x2B020C4A, 0x3FF2E99C,0x6018CDF9, + 0x400A1893,0x74BC6A7F, 0x3FF2EADD,0xE064524C, + 0x400A1A9F,0xBE76C8B4, 0x3FF2EC1F,0x4775A1AB, + 0x400A1CAC,0x083126E9, 0x3FF2ED60,0x9550B14A, + 0x400A1EB8,0x51EB851F, 0x3FF2EEA1,0xC9F97573, + 0x400A20C4,0x9BA5E354, 0x3FF2EFE2,0xE573E17A, + 0x400A22D0,0xE5604189, 0x3FF2F123,0xE7C3E7CD, + 0x400A24DD,0x2F1A9FBE, 0x3FF2F264,0xD0ED79E9, + 0x400A26E9,0x78D4FDF4, 0x3FF2F3A5,0xA0F4885E, + 0x400A28F5,0xC28F5C29, 0x3FF2F4E6,0x57DD02CE, + 0x400A2B02,0x0C49BA5E, 0x3FF2F626,0xF5AAD7F0, + 0x400A2D0E,0x56041893, 0x3FF2F767,0x7A61F590, + 0x400A2F1A,0x9FBE76C9, 0x3FF2F8A7,0xE606488B, + 0x400A3126,0xE978D4FE, 0x3FF2F9E8,0x389BBCD3, + 0x400A3333,0x33333333, 0x3FF2FB28,0x72263D6F, + 0x400A353F,0x7CED9168, 0x3FF2FC68,0x92A9B47C, + 0x400A374B,0xC6A7EF9E, 0x3FF2FDA8,0x9A2A0B2B, + 0x400A3958,0x10624DD3, 0x3FF2FEE8,0x88AB29C2, + 0x400A3B64,0x5A1CAC08, 0x3FF30028,0x5E30F79C, + 0x400A3D70,0xA3D70A3D, 0x3FF30168,0x1ABF5B2C, + 0x400A3F7C,0xED916873, 0x3FF302A7,0xBE5A39FB, + 0x400A4189,0x374BC6A8, 0x3FF303E7,0x490578A5, + 0x400A4395,0x810624DD, 0x3FF30526,0xBAC4FAE3, + 0x400A45A1,0xCAC08312, 0x3FF30666,0x139CA380, + 0x400A47AE,0x147AE148, 0x3FF307A5,0x53905461, + 0x400A49BA,0x5E353F7D, 0x3FF308E4,0x7AA3EE80, + 0x400A4BC6,0xA7EF9DB2, 0x3FF30A23,0x88DB51F2, + 0x400A4DD2,0xF1A9FBE7, 0x3FF30B62,0x7E3A5DE3, + 0x400A4FDF,0x3B645A1D, 0x3FF30CA1,0x5AC4F099, + 0x400A51EB,0x851EB852, 0x3FF30DE0,0x1E7EE76E, + 0x400A53F7,0xCED91687, 0x3FF30F1E,0xC96C1EDB, + 0x400A5604,0x189374BC, 0x3FF3105D,0x5B90726E, + 0x400A5810,0x624DD2F2, 0x3FF3119B,0xD4EFBCD2, + 0x400A5A1C,0xAC083127, 0x3FF312DA,0x358DD7CA, + 0x400A5C28,0xF5C28F5C, 0x3FF31418,0x7D6E9C33, + 0x400A5E35,0x3F7CED91, 0x3FF31556,0xAC95E204, + 0x400A6041,0x89374BC7, 0x3FF31694,0xC3078053, + 0x400A624D,0xD2F1A9FC, 0x3FF317D2,0xC0C74D4A, + 0x400A645A,0x1CAC0831, 0x3FF31910,0xA5D91E35, + 0x400A6666,0x66666666, 0x3FF31A4E,0x7240C777, + 0x400A6872,0xB020C49C, 0x3FF31B8C,0x26021C92, + 0x400A6A7E,0xF9DB22D1, 0x3FF31CC9,0xC120F021, + 0x400A6C8B,0x43958106, 0x3FF31E07,0x43A113DE, + 0x400A6E97,0x8D4FDF3B, 0x3FF31F44,0xAD8658A0, + 0x400A70A3,0xD70A3D71, 0x3FF32081,0xFED48E58, + 0x400A72B0,0x20C49BA6, 0x3FF321BF,0x378F8418, + 0x400A74BC,0x6A7EF9DB, 0x3FF322FC,0x57BB080B, + 0x400A76C8,0xB4395810, 0x3FF32439,0x5F5AE77F, + 0x400A78D4,0xFDF3B646, 0x3FF32576,0x4E72EEDC, + 0x400A7AE1,0x47AE147B, 0x3FF326B3,0x2506E9AA, + 0x400A7CED,0x916872B0, 0x3FF327EF,0xE31AA290, + 0x400A7EF9,0xDB22D0E5, 0x3FF3292C,0x88B1E352, + 0x400A8106,0x24DD2F1B, 0x3FF32A69,0x15D074D7, + 0x400A8312,0x6E978D50, 0x3FF32BA5,0x8A7A1F20, + 0x400A851E,0xB851EB85, 0x3FF32CE1,0xE6B2A952, + 0x400A872B,0x020C49BA, 0x3FF32E1E,0x2A7DD9B1, + 0x400A8937,0x4BC6A7F0, 0x3FF32F5A,0x55DF75A1, + 0x400A8B43,0x95810625, 0x3FF33096,0x68DB41A5, + 0x400A8D4F,0xDF3B645A, 0x3FF331D2,0x63750162, + 0x400A8F5C,0x28F5C28F, 0x3FF3330E,0x45B0779F, + 0x400A9168,0x72B020C5, 0x3FF3344A,0x0F916645, + 0x400A9374,0xBC6A7EFA, 0x3FF33585,0xC11B8E5A, + 0x400A9581,0x0624DD2F, 0x3FF336C1,0x5A52B00B, + 0x400A978D,0x4FDF3B64, 0x3FF337FC,0xDB3A8AA4, + 0x400A9999,0x9999999A, 0x3FF33938,0x43D6DC96, + 0x400A9BA5,0xE353F7CF, 0x3FF33A73,0x942B6372, + 0x400A9DB2,0x2D0E5604, 0x3FF33BAE,0xCC3BDBEC, + 0x400A9FBE,0x76C8B439, 0x3FF33CE9,0xEC0C01DE, + 0x400AA1CA,0xC083126F, 0x3FF33E24,0xF39F9043, + 0x400AA3D7,0x0A3D70A4, 0x3FF33F5F,0xE2FA413A, + 0x400AA5E3,0x53F7CED9, 0x3FF3409A,0xBA1FCE06, + 0x400AA7EF,0x9DB22D0E, 0x3FF341D5,0x7913EF10, + 0x400AA9FB,0xE76C8B44, 0x3FF34310,0x1FDA5BE4, + 0x400AAC08,0x3126E979, 0x3FF3444A,0xAE76CB32, + 0x400AAE14,0x7AE147AE, 0x3FF34585,0x24ECF2D0, + 0x400AB020,0xC49BA5E3, 0x3FF346BF,0x834087B9, + 0x400AB22D,0x0E560419, 0x3FF347F9,0xC9753E10, + 0x400AB439,0x5810624E, 0x3FF34933,0xF78EC918, + 0x400AB645,0xA1CAC083, 0x3FF34A6E,0x0D90DB41, + 0x400AB851,0xEB851EB8, 0x3FF34BA8,0x0B7F261C, + 0x400ABA5E,0x353F7CEE, 0x3FF34CE1,0xF15D5A64, + 0x400ABC6A,0x7EF9DB23, 0x3FF34E1B,0xBF2F27F8, + 0x400ABE76,0xC8B43958, 0x3FF34F55,0x74F83DE1, + 0x400AC083,0x126E978D, 0x3FF3508F,0x12BC4A4D, + 0x400AC28F,0x5C28F5C3, 0x3FF351C8,0x987EFA95, + 0x400AC49B,0xA5E353F8, 0x3FF35302,0x0643FB34, + 0x400AC6A7,0xEF9DB22D, 0x3FF3543B,0x5C0EF7D4, + 0x400AC8B4,0x39581062, 0x3FF35574,0x99E39B42, + 0x400ACAC0,0x83126E98, 0x3FF356AD,0xBFC58F77, + 0x400ACCCC,0xCCCCCCCD, 0x3FF357E6,0xCDB87D93, + 0x400ACED9,0x16872B02, 0x3FF3591F,0xC3C00DE1, + 0x400AD0E5,0x60418937, 0x3FF35A58,0xA1DFE7D3, + 0x400AD2F1,0xA9FBE76D, 0x3FF35B91,0x681BB208, + 0x400AD4FD,0xF3B645A2, 0x3FF35CCA,0x16771245, + 0x400AD70A,0x3D70A3D7, 0x3FF35E02,0xACF5AD7D, + 0x400AD916,0x872B020C, 0x3FF35F3B,0x2B9B27CB, + 0x400ADB22,0xD0E56042, 0x3FF36073,0x926B2477, + 0x400ADD2F,0x1A9FBE77, 0x3FF361AB,0xE16945F0, + 0x400ADF3B,0x645A1CAC, 0x3FF362E4,0x18992DD3, + 0x400AE147,0xAE147AE1, 0x3FF3641C,0x37FE7CEA, + 0x400AE353,0xF7CED917, 0x3FF36554,0x3F9CD329, + 0x400AE560,0x4189374C, 0x3FF3668C,0x2F77CFAD, + 0x400AE76C,0x8B439581, 0x3FF367C4,0x079310C5, + 0x400AE978,0xD4FDF3B6, 0x3FF368FB,0xC7F233E9, + 0x400AEB85,0x1EB851EC, 0x3FF36A33,0x7098D5BE, + 0x400AED91,0x6872B021, 0x3FF36B6B,0x018A9217, + 0x400AEF9D,0xB22D0E56, 0x3FF36CA2,0x7ACB03F3, + 0x400AF1A9,0xFBE76C8B, 0x3FF36DD9,0xDC5DC57F, + 0x400AF3B6,0x45A1CAC1, 0x3FF36F11,0x26467017, + 0x400AF5C2,0x8F5C28F6, 0x3FF37048,0x58889C43, + 0x400AF7CE,0xD916872B, 0x3FF3717F,0x7327E1BA, + 0x400AF9DB,0x22D0E560, 0x3FF372B6,0x7627D762, + 0x400AFBE7,0x6C8B4396, 0x3FF373ED,0x618C1350, + 0x400AFDF3,0xB645A1CB, 0x3FF37524,0x35582AC7, + 0x400B0000,0x00000000, 0x3FF3765A,0xF18FB239, + 0x400B020C,0x49BA5E35, 0x3FF37791,0x96363D49, + 0x400B0418,0x9374BC6A, 0x3FF378C8,0x234F5EC8, + 0x400B0624,0xDD2F1AA0, 0x3FF379FE,0x98DEA8B8, + 0x400B0831,0x26E978D5, 0x3FF37B34,0xF6E7AC4C, + 0x400B0A3D,0x70A3D70A, 0x3FF37C6B,0x3D6DF9E5, + 0x400B0C49,0xBA5E353F, 0x3FF37DA1,0x6C752118, + 0x400B0E56,0x04189375, 0x3FF37ED7,0x8400B0A8, + 0x400B1062,0x4DD2F1AA, 0x3FF3800D,0x8414368B, + 0x400B126E,0x978D4FDF, 0x3FF38143,0x6CB33FE7, + 0x400B147A,0xE147AE14, 0x3FF38279,0x3DE15916, + 0x400B1687,0x2B020C4A, 0x3FF383AE,0xF7A20DA2, + 0x400B1893,0x74BC6A7F, 0x3FF384E4,0x99F8E847, + 0x400B1A9F,0xBE76C8B4, 0x3FF3861A,0x24E972F4, + 0x400B1CAC,0x083126E9, 0x3FF3874F,0x987736CC, + 0x400B1EB8,0x51EB851F, 0x3FF38884,0xF4A5BC24, + 0x400B20C4,0x9BA5E354, 0x3FF389BA,0x39788A82, + 0x400B22D0,0xE5604189, 0x3FF38AEF,0x66F328A2, + 0x400B24DD,0x2F1A9FBE, 0x3FF38C24,0x7D191C73, + 0x400B26E9,0x78D4FDF4, 0x3FF38D59,0x7BEDEB19, + 0x400B28F5,0xC28F5C29, 0x3FF38E8E,0x637518EA, + 0x400B2B02,0x0C49BA5E, 0x3FF38FC3,0x33B22970, + 0x400B2D0E,0x56041893, 0x3FF390F7,0xECA89F6D, + 0x400B2F1A,0x9FBE76C9, 0x3FF3922C,0x8E5BFCD5, + 0x400B3126,0xE978D4FE, 0x3FF39361,0x18CFC2D1, + 0x400B3333,0x33333333, 0x3FF39495,0x8C0771C0, + 0x400B353F,0x7CED9168, 0x3FF395C9,0xE8068938, + 0x400B374B,0xC6A7EF9E, 0x3FF396FE,0x2CD08803, + 0x400B3958,0x10624DD3, 0x3FF39832,0x5A68EC21, + 0x400B3B64,0x5A1CAC08, 0x3FF39966,0x70D332C9, + 0x400B3D70,0xA3D70A3D, 0x3FF39A9A,0x7012D868, + 0x400B3F7C,0xED916873, 0x3FF39BCE,0x582B58A2, + 0x400B4189,0x374BC6A8, 0x3FF39D02,0x29202E53, + 0x400B4395,0x810624DD, 0x3FF39E35,0xE2F4D38C, + 0x400B45A1,0xCAC08312, 0x3FF39F69,0x85ACC197, + 0x400B47AE,0x147AE148, 0x3FF3A09D,0x114B70F5, + 0x400B49BA,0x5E353F7D, 0x3FF3A1D0,0x85D45960, + 0x400B4BC6,0xA7EF9DB2, 0x3FF3A303,0xE34AF1C9, + 0x400B4DD2,0xF1A9FBE7, 0x3FF3A437,0x29B2B05A, + 0x400B4FDF,0x3B645A1D, 0x3FF3A56A,0x590F0A76, + 0x400B51EB,0x851EB852, 0x3FF3A69D,0x716374B6, + 0x400B53F7,0xCED91687, 0x3FF3A7D0,0x72B362F1, + 0x400B5604,0x189374BC, 0x3FF3A903,0x5D024832, + 0x400B5810,0x624DD2F2, 0x3FF3AA36,0x305396C4, + 0x400B5A1C,0xAC083127, 0x3FF3AB68,0xECAAC024, + 0x400B5C28,0xF5C28F5C, 0x3FF3AC9B,0x920B3510, + 0x400B5E35,0x3F7CED91, 0x3FF3ADCE,0x2078657B, + 0x400B6041,0x89374BC7, 0x3FF3AF00,0x97F5C097, + 0x400B624D,0xD2F1A9FC, 0x3FF3B032,0xF886B4CD, + 0x400B645A,0x1CAC0831, 0x3FF3B165,0x422EAFC3, + 0x400B6666,0x66666666, 0x3FF3B297,0x74F11E59, + 0x400B6872,0xB020C49C, 0x3FF3B3C9,0x90D16CAC, + 0x400B6A7E,0xF9DB22D1, 0x3FF3B4FB,0x95D30613, + 0x400B6C8B,0x43958106, 0x3FF3B62D,0x83F95521, + 0x400B6E97,0x8D4FDF3B, 0x3FF3B75F,0x5B47C3A7, + 0x400B70A3,0xD70A3D71, 0x3FF3B891,0x1BC1BAB0, + 0x400B72B0,0x20C49BA6, 0x3FF3B9C2,0xC56AA284, + 0x400B74BC,0x6A7EF9DB, 0x3FF3BAF4,0x5845E2AA, + 0x400B76C8,0xB4395810, 0x3FF3BC25,0xD456E1E2, + 0x400B78D4,0xFDF3B646, 0x3FF3BD57,0x39A1062D, + 0x400B7AE1,0x47AE147B, 0x3FF3BE88,0x8827B4C8, + 0x400B7CED,0x916872B0, 0x3FF3BFB9,0xBFEE522C, + 0x400B7EF9,0xDB22D0E5, 0x3FF3C0EA,0xE0F84213, + 0x400B8106,0x24DD2F1B, 0x3FF3C21B,0xEB48E774, + 0x400B8312,0x6E978D50, 0x3FF3C34C,0xDEE3A482, + 0x400B851E,0xB851EB85, 0x3FF3C47D,0xBBCBDAB3, + 0x400B872B,0x020C49BA, 0x3FF3C5AE,0x8204EAB8, + 0x400B8937,0x4BC6A7F0, 0x3FF3C6DF,0x31923483, + 0x400B8B43,0x95810625, 0x3FF3C80F,0xCA771744, + 0x400B8D4F,0xDF3B645A, 0x3FF3C940,0x4CB6F16B, + 0x400B8F5C,0x28F5C28F, 0x3FF3CA70,0xB85520AA, + 0x400B9168,0x72B020C5, 0x3FF3CBA1,0x0D5501EF, + 0x400B9374,0xBC6A7EFA, 0x3FF3CCD1,0x4BB9F16A, + 0x400B9581,0x0624DD2F, 0x3FF3CE01,0x73874A8B, + 0x400B978D,0x4FDF3B64, 0x3FF3CF31,0x84C06805, + 0x400B9999,0x9999999A, 0x3FF3D061,0x7F68A3C8, + 0x400B9BA5,0xE353F7CF, 0x3FF3D191,0x63835707, + 0x400B9DB2,0x2D0E5604, 0x3FF3D2C1,0x3113DA37, + 0x400B9FBE,0x76C8B439, 0x3FF3D3F0,0xE81D850D, + 0x400BA1CA,0xC083126F, 0x3FF3D520,0x88A3AE80, + 0x400BA3D7,0x0A3D70A4, 0x3FF3D650,0x12A9ACC9, + 0x400BA5E3,0x53F7CED9, 0x3FF3D77F,0x8632D564, + 0x400BA7EF,0x9DB22D0E, 0x3FF3D8AE,0xE3427D0E, + 0x400BA9FB,0xE76C8B44, 0x3FF3D9DE,0x29DBF7C9, + 0x400BAC08,0x3126E979, 0x3FF3DB0D,0x5A0298D6, + 0x400BAE14,0x7AE147AE, 0x3FF3DC3C,0x73B9B2BC, + 0x400BB020,0xC49BA5E3, 0x3FF3DD6B,0x77049744, + 0x400BB22D,0x0E560419, 0x3FF3DE9A,0x63E6977C, + 0x400BB439,0x5810624E, 0x3FF3DFC9,0x3A6303B3, + 0x400BB645,0xA1CAC083, 0x3FF3E0F7,0xFA7D2B7E, + 0x400BB851,0xEB851EB8, 0x3FF3E226,0xA4385DB6, + 0x400BBA5E,0x353F7CEE, 0x3FF3E355,0x3797E878, + 0x400BBC6A,0x7EF9DB23, 0x3FF3E483,0xB49F1923, + 0x400BBE76,0xC8B43958, 0x3FF3E5B2,0x1B513C60, + 0x400BC083,0x126E978D, 0x3FF3E6E0,0x6BB19E18, + 0x400BC28F,0x5C28F5C3, 0x3FF3E80E,0xA5C3897E, + 0x400BC49B,0xA5E353F8, 0x3FF3E93C,0xC98A4905, + 0x400BC6A7,0xEF9DB22D, 0x3FF3EA6A,0xD7092669, + 0x400BC8B4,0x39581062, 0x3FF3EB98,0xCE436AAB, + 0x400BCAC0,0x83126E98, 0x3FF3ECC6,0xAF3C5E14, + 0x400BCCCC,0xCCCCCCCD, 0x3FF3EDF4,0x79F7482F, + 0x400BCED9,0x16872B02, 0x3FF3EF22,0x2E776FD2, + 0x400BD0E5,0x60418937, 0x3FF3F04F,0xCCC01B16, + 0x400BD2F1,0xA9FBE76D, 0x3FF3F17D,0x54D48F5E, + 0x400BD4FD,0xF3B645A2, 0x3FF3F2AA,0xC6B81152, + 0x400BD70A,0x3D70A3D7, 0x3FF3F3D8,0x226DE4E1, + 0x400BD916,0x872B020C, 0x3FF3F505,0x67F94D44, + 0x400BDB22,0xD0E56042, 0x3FF3F632,0x975D8CFB, + 0x400BDD2F,0x1A9FBE77, 0x3FF3F75F,0xB09DE5CC, + 0x400BDF3B,0x645A1CAC, 0x3FF3F88C,0xB3BD98C6, + 0x400BE147,0xAE147AE1, 0x3FF3F9B9,0xA0BFE641, + 0x400BE353,0xF7CED917, 0x3FF3FAE6,0x77A80DDF, + 0x400BE560,0x4189374C, 0x3FF3FC13,0x38794E88, + 0x400BE76C,0x8B439581, 0x3FF3FD3F,0xE336E66E, + 0x400BE978,0xD4FDF3B6, 0x3FF3FE6C,0x77E4130D, + 0x400BEB85,0x1EB851EC, 0x3FF3FF98,0xF684112B, + 0x400BED91,0x6872B021, 0x3FF400C5,0x5F1A1CD5, + 0x400BEF9D,0xB22D0E56, 0x3FF401F1,0xB1A97163, + 0x400BF1A9,0xFBE76C8B, 0x3FF4031D,0xEE35497A, + 0x400BF3B6,0x45A1CAC1, 0x3FF4044A,0x14C0DF05, + 0x400BF5C2,0x8F5C28F6, 0x3FF40576,0x254F6B3B, + 0x400BF7CE,0xD916872B, 0x3FF406A2,0x1FE4269F, + 0x400BF9DB,0x22D0E560, 0x3FF407CE,0x048248FD, + 0x400BFBE7,0x6C8B4396, 0x3FF408F9,0xD32D096E, + 0x400BFDF3,0xB645A1CB, 0x3FF40A25,0x8BE79E55, + 0x400C0000,0x00000000, 0x3FF40B51,0x2EB53D60, + 0x400C020C,0x49BA5E35, 0x3FF40C7C,0xBB991B8A, + 0x400C0418,0x9374BC6A, 0x3FF40DA8,0x32966D19, + 0x400C0624,0xDD2F1AA0, 0x3FF40ED3,0x93B065A2, + 0x400C0831,0x26E978D5, 0x3FF40FFE,0xDEEA3801, + 0x400C0A3D,0x70A3D70A, 0x3FF4112A,0x14471662, + 0x400C0C49,0xBA5E353F, 0x3FF41255,0x33CA323F, + 0x400C0E56,0x04189375, 0x3FF41380,0x3D76BC5C, + 0x400C1062,0x4DD2F1AA, 0x3FF414AB,0x314FE4CA, + 0x400C126E,0x978D4FDF, 0x3FF415D6,0x0F58DAEB, + 0x400C147A,0xE147AE14, 0x3FF41700,0xD794CD6B, + 0x400C1687,0x2B020C4A, 0x3FF4182B,0x8A06EA47, + 0x400C1893,0x74BC6A7F, 0x3FF41956,0x26B25EC5, + 0x400C1A9F,0xBE76C8B4, 0x3FF41A80,0xAD9A577E, + 0x400C1CAC,0x083126E9, 0x3FF41BAB,0x1EC20057, + 0x400C1EB8,0x51EB851F, 0x3FF41CD5,0x7A2C8486, + 0x400C20C4,0x9BA5E354, 0x3FF41DFF,0xBFDD0E8B, + 0x400C22D0,0xE5604189, 0x3FF41F29,0xEFD6C83A, + 0x400C24DD,0x2F1A9FBE, 0x3FF42054,0x0A1CDAB3, + 0x400C26E9,0x78D4FDF4, 0x3FF4217E,0x0EB26E68, + 0x400C28F5,0xC28F5C29, 0x3FF422A7,0xFD9AAB17, + 0x400C2B02,0x0C49BA5E, 0x3FF423D1,0xD6D8B7D2, + 0x400C2D0E,0x56041893, 0x3FF424FB,0x9A6FBAF7, + 0x400C2F1A,0x9FBE76C9, 0x3FF42625,0x4862DA38, + 0x400C3126,0xE978D4FE, 0x3FF4274E,0xE0B53A94, + 0x400C3333,0x33333333, 0x3FF42878,0x636A005D, + 0x400C353F,0x7CED9168, 0x3FF429A1,0xD0844F34, + 0x400C374B,0xC6A7EF9E, 0x3FF42ACB,0x28074A0C, + 0x400C3958,0x10624DD3, 0x3FF42BF4,0x69F6132A, + 0x400C3B64,0x5A1CAC08, 0x3FF42D1D,0x9653CC21, + 0x400C3D70,0xA3D70A3D, 0x3FF42E46,0xAD2395DB, + 0x400C3F7C,0xED916873, 0x3FF42F6F,0xAE68908F, + 0x400C4189,0x374BC6A8, 0x3FF43098,0x9A25DBC8, + 0x400C4395,0x810624DD, 0x3FF431C1,0x705E9662, + 0x400C45A1,0xCAC08312, 0x3FF432EA,0x3115DE8E, + 0x400C47AE,0x147AE148, 0x3FF43412,0xDC4ED1CD, + 0x400C49BA,0x5E353F7D, 0x3FF4353B,0x720C8CF3, + 0x400C4BC6,0xA7EF9DB2, 0x3FF43663,0xF2522C28, + 0x400C4DD2,0xF1A9FBE7, 0x3FF4378C,0x5D22CAE7, + 0x400C4FDF,0x3B645A1D, 0x3FF438B4,0xB28183FF, + 0x400C51EB,0x851EB852, 0x3FF439DC,0xF271718F, + 0x400C53F7,0xCED91687, 0x3FF43B05,0x1CF5AD0E, + 0x400C5604,0x189374BC, 0x3FF43C2D,0x32114F45, + 0x400C5810,0x624DD2F2, 0x3FF43D55,0x31C77052, + 0x400C5A1C,0xAC083127, 0x3FF43E7D,0x1C1B27A6, + 0x400C5C28,0xF5C28F5C, 0x3FF43FA4,0xF10F8C06, + 0x400C5E35,0x3F7CED91, 0x3FF440CC,0xB0A7B390, + 0x400C6041,0x89374BC7, 0x3FF441F4,0x5AE6B3B1, + 0x400C624D,0xD2F1A9FC, 0x3FF4431B,0xEFCFA12F, + 0x400C645A,0x1CAC0831, 0x3FF44443,0x6F659025, + 0x400C6666,0x66666666, 0x3FF4456A,0xD9AB9401, + 0x400C6872,0xB020C49C, 0x3FF44692,0x2EA4BF8A, + 0x400C6A7E,0xF9DB22D1, 0x3FF447B9,0x6E5424DA, + 0x400C6C8B,0x43958106, 0x3FF448E0,0x98BCD563, + 0x400C6E97,0x8D4FDF3B, 0x3FF44A07,0xADE1E1EC, + 0x400C70A3,0xD70A3D71, 0x3FF44B2E,0xADC65A94, + 0x400C72B0,0x20C49BA6, 0x3FF44C55,0x986D4ECE, + 0x400C74BC,0x6A7EF9DB, 0x3FF44D7C,0x6DD9CD66, + 0x400C76C8,0xB4395810, 0x3FF44EA3,0x2E0EE47F, + 0x400C78D4,0xFDF3B646, 0x3FF44FC9,0xD90FA193, + 0x400C7AE1,0x47AE147B, 0x3FF450F0,0x6EDF1172, + 0x400C7CED,0x916872B0, 0x3FF45216,0xEF804045, + 0x400C7EF9,0xDB22D0E5, 0x3FF4533D,0x5AF6398C, + 0x400C8106,0x24DD2F1B, 0x3FF45463,0xB1440820, + 0x400C8312,0x6E978D50, 0x3FF45589,0xF26CB630, + 0x400C851E,0xB851EB85, 0x3FF456B0,0x1E734D46, + 0x400C872B,0x020C49BA, 0x3FF457D6,0x355AD644, + 0x400C8937,0x4BC6A7F0, 0x3FF458FC,0x37265963, + 0x400C8B43,0x95810625, 0x3FF45A22,0x23D8DE35, + 0x400C8D4F,0xDF3B645A, 0x3FF45B47,0xFB756BA8, + 0x400C8F5C,0x28F5C28F, 0x3FF45C6D,0xBDFF07FF, + 0x400C9168,0x72B020C5, 0x3FF45D93,0x6B78B8DC, + 0x400C9374,0xBC6A7EFA, 0x3FF45EB9,0x03E58334, + 0x400C9581,0x0624DD2F, 0x3FF45FDE,0x87486B5B, + 0x400C978D,0x4FDF3B64, 0x3FF46103,0xF5A474FC, + 0x400C9999,0x9999999A, 0x3FF46229,0x4EFCA31F, + 0x400C9BA5,0xE353F7CF, 0x3FF4634E,0x9353F824, + 0x400C9DB2,0x2D0E5604, 0x3FF46473,0xC2AD75C6, + 0x400C9FBE,0x76C8B439, 0x3FF46598,0xDD0C1D1C, + 0x400CA1CA,0xC083126F, 0x3FF466BD,0xE272EE97, + 0x400CA3D7,0x0A3D70A4, 0x3FF467E2,0xD2E4EA02, + 0x400CA5E3,0x53F7CED9, 0x3FF46907,0xAE650E85, + 0x400CA7EF,0x9DB22D0E, 0x3FF46A2C,0x74F65AA4, + 0x400CA9FB,0xE76C8B44, 0x3FF46B51,0x269BCC3D, + 0x400CAC08,0x3126E979, 0x3FF46C75,0xC358608B, + 0x400CAE14,0x7AE147AE, 0x3FF46D9A,0x4B2F1423, + 0x400CB020,0xC49BA5E3, 0x3FF46EBE,0xBE22E2FA, + 0x400CB22D,0x0E560419, 0x3FF46FE3,0x1C36C85E, + 0x400CB439,0x5810624E, 0x3FF47107,0x656DBEFB, + 0x400CB645,0xA1CAC083, 0x3FF4722B,0x99CAC0D9, + 0x400CB851,0xEB851EB8, 0x3FF4734F,0xB950C75F, + 0x400CBA5E,0x353F7CEE, 0x3FF47473,0xC402CB4F, + 0x400CBC6A,0x7EF9DB23, 0x3FF47597,0xB9E3C4C9, + 0x400CBE76,0xC8B43958, 0x3FF476BB,0x9AF6AB4A, + 0x400CC083,0x126E978D, 0x3FF477DF,0x673E75AD, + 0x400CC28F,0x5C28F5C3, 0x3FF47903,0x1EBE1A2D, + 0x400CC49B,0xA5E353F8, 0x3FF47A26,0xC1788E60, + 0x400CC6A7,0xEF9DB22D, 0x3FF47B4A,0x4F70C73A, + 0x400CC8B4,0x39581062, 0x3FF47C6D,0xC8A9B910, + 0x400CCAC0,0x83126E98, 0x3FF47D91,0x2D265796, + 0x400CCCCC,0xCCCCCCCD, 0x3FF47EB4,0x7CE995D9, + 0x400CCED9,0x16872B02, 0x3FF47FD7,0xB7F6664D, + 0x400CD0E5,0x60418937, 0x3FF480FA,0xDE4FBABE, + 0x400CD2F1,0xA9FBE76D, 0x3FF4821D,0xEFF8845E, + 0x400CD4FD,0xF3B645A2, 0x3FF48340,0xECF3B3B7, + 0x400CD70A,0x3D70A3D7, 0x3FF48463,0xD54438B9, + 0x400CD916,0x872B020C, 0x3FF48586,0xA8ED02B1, + 0x400CDB22,0xD0E56042, 0x3FF486A9,0x67F1004D, + 0x400CDD2F,0x1A9FBE77, 0x3FF487CC,0x12531F99, + 0x400CDF3B,0x645A1CAC, 0x3FF488EE,0xA8164E03, + 0x400CE147,0xAE147AE1, 0x3FF48A11,0x293D785C, + 0x400CE353,0xF7CED917, 0x3FF48B33,0x95CB8AD1, + 0x400CE560,0x4189374C, 0x3FF48C55,0xEDC370F2, + 0x400CE76C,0x8B439581, 0x3FF48D78,0x312815B2, + 0x400CE978,0xD4FDF3B6, 0x3FF48E9A,0x5FFC6362, + 0x400CEB85,0x1EB851EC, 0x3FF48FBC,0x7A4343B6, + 0x400CED91,0x6872B021, 0x3FF490DE,0x7FFF9FC4, + 0x400CEF9D,0xB22D0E56, 0x3FF49200,0x71346003, + 0x400CF1A9,0xFBE76C8B, 0x3FF49322,0x4DE46C4C, + 0x400CF3B6,0x45A1CAC1, 0x3FF49444,0x1612ABDB, + 0x400CF5C2,0x8F5C28F6, 0x3FF49565,0xC9C2054C, + 0x400CF7CE,0xD916872B, 0x3FF49687,0x68F55EA1, + 0x400CF9DB,0x22D0E560, 0x3FF497A8,0xF3AF9D3C, + 0x400CFBE7,0x6C8B4396, 0x3FF498CA,0x69F3A5E2, + 0x400CFDF3,0xB645A1CB, 0x3FF499EB,0xCBC45CBD, + 0x400D0000,0x00000000, 0x3FF49B0D,0x1924A557, + 0x400D020C,0x49BA5E35, 0x3FF49C2E,0x5217629F, + 0x400D0418,0x9374BC6A, 0x3FF49D4F,0x769F76EA, + 0x400D0624,0xDD2F1AA0, 0x3FF49E70,0x86BFC3EC, + 0x400D0831,0x26E978D5, 0x3FF49F91,0x827B2AC0, + 0x400D0A3D,0x70A3D70A, 0x3FF4A0B2,0x69D48BE3, + 0x400D0C49,0xBA5E353F, 0x3FF4A1D3,0x3CCEC739, + 0x400D0E56,0x04189375, 0x3FF4A2F3,0xFB6CBC08, + 0x400D1062,0x4DD2F1AA, 0x3FF4A414,0xA5B148FB, + 0x400D126E,0x978D4FDF, 0x3FF4A535,0x3B9F4C22, + 0x400D147A,0xE147AE14, 0x3FF4A655,0xBD39A2F3, + 0x400D1687,0x2B020C4A, 0x3FF4A776,0x2A832A46, + 0x400D1893,0x74BC6A7F, 0x3FF4A896,0x837EBE5C, + 0x400D1A9F,0xBE76C8B4, 0x3FF4A9B6,0xC82F3AD8, + 0x400D1CAC,0x083126E9, 0x3FF4AAD6,0xF8977AC5, + 0x400D1EB8,0x51EB851F, 0x3FF4ABF7,0x14BA5893, + 0x400D20C4,0x9BA5E354, 0x3FF4AD17,0x1C9AAE16, + 0x400D22D0,0xE5604189, 0x3FF4AE37,0x103B548D, + 0x400D24DD,0x2F1A9FBE, 0x3FF4AF56,0xEF9F2497, + 0x400D26E9,0x78D4FDF4, 0x3FF4B076,0xBAC8F63F, + 0x400D28F5,0xC28F5C29, 0x3FF4B196,0x71BBA0F2, + 0x400D2B02,0x0C49BA5E, 0x3FF4B2B6,0x1479FB87, + 0x400D2D0E,0x56041893, 0x3FF4B3D5,0xA306DC3A, + 0x400D2F1A,0x9FBE76C9, 0x3FF4B4F5,0x1D6518B0, + 0x400D3126,0xE978D4FE, 0x3FF4B614,0x839785F3, + 0x400D3333,0x33333333, 0x3FF4B733,0xD5A0F876, + 0x400D353F,0x7CED9168, 0x3FF4B853,0x13844413, + 0x400D374B,0xC6A7EF9E, 0x3FF4B972,0x3D443C0C, + 0x400D3958,0x10624DD3, 0x3FF4BA91,0x52E3B30B, + 0x400D3B64,0x5A1CAC08, 0x3FF4BBB0,0x54657B20, + 0x400D3D70,0xA3D70A3D, 0x3FF4BCCF,0x41CC65C8, + 0x400D3F7C,0xED916873, 0x3FF4BDEE,0x1B1B43E4, + 0x400D4189,0x374BC6A8, 0x3FF4BF0C,0xE054E5BF, + 0x400D4395,0x810624DD, 0x3FF4C02B,0x917C1B0D, + 0x400D45A1,0xCAC08312, 0x3FF4C14A,0x2E93B2EB, + 0x400D47AE,0x147AE148, 0x3FF4C268,0xB79E7BE0, + 0x400D49BA,0x5E353F7D, 0x3FF4C387,0x2C9F43D9, + 0x400D4BC6,0xA7EF9DB2, 0x3FF4C4A5,0x8D98D82F, + 0x400D4DD2,0xF1A9FBE7, 0x3FF4C5C3,0xDA8E05A6, + 0x400D4FDF,0x3B645A1D, 0x3FF4C6E2,0x13819868, + 0x400D51EB,0x851EB852, 0x3FF4C800,0x38765C0B, + 0x400D53F7,0xCED91687, 0x3FF4C91E,0x496F1B90, + 0x400D5604,0x189374BC, 0x3FF4CA3C,0x466EA15F, + 0x400D5810,0x624DD2F2, 0x3FF4CB5A,0x2F77B74F, + 0x400D5A1C,0xAC083127, 0x3FF4CC78,0x048D269D, + 0x400D5C28,0xF5C28F5C, 0x3FF4CD95,0xC5B1B7F4, + 0x400D5E35,0x3F7CED91, 0x3FF4CEB3,0x72E83368, + 0x400D6041,0x89374BC7, 0x3FF4CFD1,0x0C336079, + 0x400D624D,0xD2F1A9FC, 0x3FF4D0EE,0x91960612, + 0x400D645A,0x1CAC0831, 0x3FF4D20C,0x0312EA88, + 0x400D6666,0x66666666, 0x3FF4D329,0x60ACD39F, + 0x400D6872,0xB020C49C, 0x3FF4D446,0xAA668683, + 0x400D6A7E,0xF9DB22D1, 0x3FF4D563,0xE042C7CE, + 0x400D6C8B,0x43958106, 0x3FF4D681,0x02445B84, + 0x400D6E97,0x8D4FDF3B, 0x3FF4D79E,0x106E0518, + 0x400D70A3,0xD70A3D71, 0x3FF4D8BB,0x0AC28769, + 0x400D72B0,0x20C49BA6, 0x3FF4D9D7,0xF144A4BE, + 0x400D74BC,0x6A7EF9DB, 0x3FF4DAF4,0xC3F71ED1, + 0x400D76C8,0xB4395810, 0x3FF4DC11,0x82DCB6C5, + 0x400D78D4,0xFDF3B646, 0x3FF4DD2E,0x2DF82D2A, + 0x400D7AE1,0x47AE147B, 0x3FF4DE4A,0xC54C41FF, + 0x400D7CED,0x916872B0, 0x3FF4DF67,0x48DBB4AF, + 0x400D7EF9,0xDB22D0E5, 0x3FF4E083,0xB8A94413, + 0x400D8106,0x24DD2F1B, 0x3FF4E1A0,0x14B7AE72, + 0x400D8312,0x6E978D50, 0x3FF4E2BC,0x5D09B17E, + 0x400D851E,0xB851EB85, 0x3FF4E3D8,0x91A20A5A, + 0x400D872B,0x020C49BA, 0x3FF4E4F4,0xB2837598, + 0x400D8937,0x4BC6A7F0, 0x3FF4E610,0xBFB0AF34, + 0x400D8B43,0x95810625, 0x3FF4E72C,0xB92C729C, + 0x400D8D4F,0xDF3B645A, 0x3FF4E848,0x9EF97AAB, + 0x400D8F5C,0x28F5C28F, 0x3FF4E964,0x711A81AC, + 0x400D9168,0x72B020C5, 0x3FF4EA80,0x2F924157, + 0x400D9374,0xBC6A7EFA, 0x3FF4EB9B,0xDA6372D4, + 0x400D9581,0x0624DD2F, 0x3FF4ECB7,0x7190CEBB, + 0x400D978D,0x4FDF3B64, 0x3FF4EDD2,0xF51D0D12, + 0x400D9999,0x9999999A, 0x3FF4EEEE,0x650AE550, + 0x400D9BA5,0xE353F7CF, 0x3FF4F009,0xC15D0E59, + 0x400D9DB2,0x2D0E5604, 0x3FF4F125,0x0A163E84, + 0x400D9FBE,0x76C8B439, 0x3FF4F240,0x3F392B96, + 0x400DA1CA,0xC083126F, 0x3FF4F35B,0x60C88AC6, + 0x400DA3D7,0x0A3D70A4, 0x3FF4F476,0x6EC710B8, + 0x400DA5E3,0x53F7CED9, 0x3FF4F591,0x69377183, + 0x400DA7EF,0x9DB22D0E, 0x3FF4F6AC,0x501C60AF, + 0x400DA9FB,0xE76C8B44, 0x3FF4F7C7,0x23789133, + 0x400DAC08,0x3126E979, 0x3FF4F8E1,0xE34EB578, + 0x400DAE14,0x7AE147AE, 0x3FF4F9FC,0x8FA17F57, + 0x400DB020,0xC49BA5E3, 0x3FF4FB17,0x2873A01B, + 0x400DB22D,0x0E560419, 0x3FF4FC31,0xADC7C882, + 0x400DB439,0x5810624E, 0x3FF4FD4C,0x1FA0A8B8, + 0x400DB645,0xA1CAC083, 0x3FF4FE66,0x7E00F05D, + 0x400DB851,0xEB851EB8, 0x3FF4FF80,0xC8EB4E82, + 0x400DBA5E,0x353F7CEE, 0x3FF5009B,0x006271AC, + 0x400DBC6A,0x7EF9DB23, 0x3FF501B5,0x246907CE, + 0x400DBE76,0xC8B43958, 0x3FF502CF,0x3501BE52, + 0x400DC083,0x126E978D, 0x3FF503E9,0x322F4211, + 0x400DC28F,0x5C28F5C3, 0x3FF50503,0x1BF43F58, + 0x400DC49B,0xA5E353F8, 0x3FF5061C,0xF25361E6, + 0x400DC6A7,0xEF9DB22D, 0x3FF50736,0xB54F54EE, + 0x400DC8B4,0x39581062, 0x3FF50850,0x64EAC316, + 0x400DCAC0,0x83126E98, 0x3FF5096A,0x01285676, + 0x400DCCCC,0xCCCCCCCD, 0x3FF50A83,0x8A0AB89A, + 0x400DCED9,0x16872B02, 0x3FF50B9C,0xFF949281, + 0x400DD0E5,0x60418937, 0x3FF50CB6,0x61C88C9F, + 0x400DD2F1,0xA9FBE76D, 0x3FF50DCF,0xB0A94EDB, + 0x400DD4FD,0xF3B645A2, 0x3FF50EE8,0xEC398090, + 0x400DD70A,0x3D70A3D7, 0x3FF51002,0x147BC88C, + 0x400DD916,0x872B020C, 0x3FF5111B,0x2972CD13, + 0x400DDB22,0xD0E56042, 0x3FF51234,0x2B2133DE, + 0x400DDD2F,0x1A9FBE77, 0x3FF5134D,0x1989A217, + 0x400DDF3B,0x645A1CAC, 0x3FF51465,0xF4AEBC5F, + 0x400DE147,0xAE147AE1, 0x3FF5157E,0xBC9326CE, + 0x400DE353,0xF7CED917, 0x3FF51697,0x713984ED, + 0x400DE560,0x4189374C, 0x3FF517B0,0x12A479BC, + 0x400DE76C,0x8B439581, 0x3FF518C8,0xA0D6A7B1, + 0x400DE978,0xD4FDF3B6, 0x3FF519E1,0x1BD2B0B7, + 0x400DEB85,0x1EB851EC, 0x3FF51AF9,0x839B362D, + 0x400DED91,0x6872B021, 0x3FF51C11,0xD832D8E9, + 0x400DEF9D,0xB22D0E56, 0x3FF51D2A,0x199C3938, + 0x400DF1A9,0xFBE76C8B, 0x3FF51E42,0x47D9F6DC, + 0x400DF3B6,0x45A1CAC1, 0x3FF51F5A,0x62EEB10C, + 0x400DF5C2,0x8F5C28F6, 0x3FF52072,0x6ADD0678, + 0x400DF7CE,0xD916872B, 0x3FF5218A,0x5FA79543, + 0x400DF9DB,0x22D0E560, 0x3FF522A2,0x4150FB0A, + 0x400DFBE7,0x6C8B4396, 0x3FF523BA,0x0FDBD4DF, + 0x400DFDF3,0xB645A1CB, 0x3FF524D1,0xCB4ABF4B, + 0x400E0000,0x00000000, 0x3FF525E9,0x73A0564F, + 0x400E020C,0x49BA5E35, 0x3FF52701,0x08DF3562, + 0x400E0418,0x9374BC6A, 0x3FF52818,0x8B09F772, + 0x400E0624,0xDD2F1AA0, 0x3FF5292F,0xFA2336E8, + 0x400E0831,0x26E978D5, 0x3FF52A47,0x562D8DA0, + 0x400E0A3D,0x70A3D70A, 0x3FF52B5E,0x9F2B94F0, + 0x400E0C49,0xBA5E353F, 0x3FF52C75,0xD51FE5A6, + 0x400E0E56,0x04189375, 0x3FF52D8C,0xF80D1808, + 0x400E1062,0x4DD2F1AA, 0x3FF52EA4,0x07F5C3D4, + 0x400E126E,0x978D4FDF, 0x3FF52FBB,0x04DC8041, + 0x400E147A,0xE147AE14, 0x3FF530D1,0xEEC3E3FD, + 0x400E1687,0x2B020C4A, 0x3FF531E8,0xC5AE8531, + 0x400E1893,0x74BC6A7F, 0x3FF532FF,0x899EF97C, + 0x400E1A9F,0xBE76C8B4, 0x3FF53416,0x3A97D5F8, + 0x400E1CAC,0x083126E9, 0x3FF5352C,0xD89BAF38, + 0x400E1EB8,0x51EB851F, 0x3FF53643,0x63AD1947, + 0x400E20C4,0x9BA5E354, 0x3FF53759,0xDBCEA7AA, + 0x400E22D0,0xE5604189, 0x3FF53870,0x4102ED60, + 0x400E24DD,0x2F1A9FBE, 0x3FF53986,0x934C7CE2, + 0x400E26E9,0x78D4FDF4, 0x3FF53A9C,0xD2ADE821, + 0x400E28F5,0xC28F5C29, 0x3FF53BB2,0xFF29C089, + 0x400E2B02,0x0C49BA5E, 0x3FF53CC9,0x18C29701, + 0x400E2D0E,0x56041893, 0x3FF53DDF,0x1F7AFBE9, + 0x400E2F1A,0x9FBE76C9, 0x3FF53EF5,0x13557F1D, + 0x400E3126,0xE978D4FE, 0x3FF5400A,0xF454AFEF, + 0x400E3333,0x33333333, 0x3FF54120,0xC27B1D32, + 0x400E353F,0x7CED9168, 0x3FF54236,0x7DCB552F, + 0x400E374B,0xC6A7EF9E, 0x3FF5434C,0x2647E5AD, + 0x400E3958,0x10624DD3, 0x3FF54461,0xBBF35BEC, + 0x400E3B64,0x5A1CAC08, 0x3FF54577,0x3ED044A8, + 0x400E3D70,0xA3D70A3D, 0x3FF5468C,0xAEE12C18, + 0x400E3F7C,0xED916873, 0x3FF547A2,0x0C289DF1, + 0x400E4189,0x374BC6A8, 0x3FF548B7,0x56A9255E, + 0x400E4395,0x810624DD, 0x3FF549CC,0x8E654D0B, + 0x400E45A1,0xCAC08312, 0x3FF54AE1,0xB35F9F1F, + 0x400E47AE,0x147AE148, 0x3FF54BF6,0xC59AA53C, + 0x400E49BA,0x5E353F7D, 0x3FF54D0B,0xC518E87F, + 0x400E4BC6,0xA7EF9DB2, 0x3FF54E20,0xB1DCF184, + 0x400E4DD2,0xF1A9FBE7, 0x3FF54F35,0x8BE94862, + 0x400E4FDF,0x3B645A1D, 0x3FF5504A,0x534074AE, + 0x400E51EB,0x851EB852, 0x3FF5515F,0x07E4FD76, + 0x400E53F7,0xCED91687, 0x3FF55273,0xA9D9694A, + 0x400E5604,0x189374BC, 0x3FF55388,0x39203E34, + 0x400E5810,0x624DD2F2, 0x3FF5549C,0xB5BC01BB, + 0x400E5A1C,0xAC083127, 0x3FF555B1,0x1FAF38E5, + 0x400E5C28,0xF5C28F5C, 0x3FF556C5,0x76FC6834, + 0x400E5E35,0x3F7CED91, 0x3FF557D9,0xBBA613A9, + 0x400E6041,0x89374BC7, 0x3FF558ED,0xEDAEBEC1, + 0x400E624D,0xD2F1A9FC, 0x3FF55A02,0x0D18EC77, + 0x400E645A,0x1CAC0831, 0x3FF55B16,0x19E71F46, + 0x400E6666,0x66666666, 0x3FF55C2A,0x141BD925, + 0x400E6872,0xB020C49C, 0x3FF55D3D,0xFBB99B8C, + 0x400E6A7E,0xF9DB22D1, 0x3FF55E51,0xD0C2E76C, + 0x400E6C8B,0x43958106, 0x3FF55F65,0x933A3D3B, + 0x400E6E97,0x8D4FDF3B, 0x3FF56079,0x43221CEA, + 0x400E70A3,0xD70A3D71, 0x3FF5618C,0xE07D05EA, + 0x400E72B0,0x20C49BA6, 0x3FF562A0,0x6B4D7728, + 0x400E74BC,0x6A7EF9DB, 0x3FF563B3,0xE395EF16, + 0x400E76C8,0xB4395810, 0x3FF564C7,0x4958EBA0, + 0x400E78D4,0xFDF3B646, 0x3FF565DA,0x9C98EA34, + 0x400E7AE1,0x47AE147B, 0x3FF566ED,0xDD5867BD, + 0x400E7CED,0x916872B0, 0x3FF56801,0x0B99E0A9, + 0x400E7EF9,0xDB22D0E5, 0x3FF56914,0x275FD0E3, + 0x400E8106,0x24DD2F1B, 0x3FF56A27,0x30ACB3D9, + 0x400E8312,0x6E978D50, 0x3FF56B3A,0x27830474, + 0x400E851E,0xB851EB85, 0x3FF56C4D,0x0BE53D23, + 0x400E872B,0x020C49BA, 0x3FF56D5F,0xDDD5D7D0, + 0x400E8937,0x4BC6A7F0, 0x3FF56E72,0x9D574DEA, + 0x400E8B43,0x95810625, 0x3FF56F85,0x4A6C185D, + 0x400E8D4F,0xDF3B645A, 0x3FF57097,0xE516AF98, + 0x400E8F5C,0x28F5C28F, 0x3FF571AA,0x6D598B89, + 0x400E9168,0x72B020C5, 0x3FF572BC,0xE33723A2, + 0x400E9374,0xBC6A7EFA, 0x3FF573CF,0x46B1EED2, + 0x400E9581,0x0624DD2F, 0x3FF574E1,0x97CC638C, + 0x400E978D,0x4FDF3B64, 0x3FF575F3,0xD688F7C4, + 0x400E9999,0x9999999A, 0x3FF57706,0x02EA20EF, + 0x400E9BA5,0xE353F7CF, 0x3FF57818,0x1CF25403, + 0x400E9DB2,0x2D0E5604, 0x3FF5792A,0x24A4057A, + 0x400E9FBE,0x76C8B439, 0x3FF57A3C,0x1A01A94D, + 0x400EA1CA,0xC083126F, 0x3FF57B4D,0xFD0DB2FB, + 0x400EA3D7,0x0A3D70A4, 0x3FF57C5F,0xCDCA9580, + 0x400EA5E3,0x53F7CED9, 0x3FF57D71,0x8C3AC35D, + 0x400EA7EF,0x9DB22D0E, 0x3FF57E83,0x3860AE97, + 0x400EA9FB,0xE76C8B44, 0x3FF57F94,0xD23EC8B3, + 0x400EAC08,0x3126E979, 0x3FF580A6,0x59D782BA, + 0x400EAE14,0x7AE147AE, 0x3FF581B7,0xCF2D4D37, + 0x400EB020,0xC49BA5E3, 0x3FF582C9,0x32429839, + 0x400EB22D,0x0E560419, 0x3FF583DA,0x8319D351, + 0x400EB439,0x5810624E, 0x3FF584EB,0xC1B56D92, + 0x400EB645,0xA1CAC083, 0x3FF585FC,0xEE17D597, + 0x400EB851,0xEB851EB8, 0x3FF5870E,0x0843797A, + 0x400EBA5E,0x353F7CEE, 0x3FF5881F,0x103AC6DA, + 0x400EBC6A,0x7EF9DB23, 0x3FF58930,0x06002AD9, + 0x400EBE76,0xC8B43958, 0x3FF58A40,0xE996121F, + 0x400EC083,0x126E978D, 0x3FF58B51,0xBAFEE8D6, + 0x400EC28F,0x5C28F5C3, 0x3FF58C62,0x7A3D1AAD, + 0x400EC49B,0xA5E353F8, 0x3FF58D73,0x275312D6, + 0x400EC6A7,0xEF9DB22D, 0x3FF58E83,0xC2433C09, + 0x400EC8B4,0x39581062, 0x3FF58F94,0x4B100082, + 0x400ECAC0,0x83126E98, 0x3FF590A4,0xC1BBCA02, + 0x400ECCCC,0xCCCCCCCD, 0x3FF591B5,0x264901CC, + 0x400ECED9,0x16872B02, 0x3FF592C5,0x78BA10AC, + 0x400ED0E5,0x60418937, 0x3FF593D5,0xB9115EF1, + 0x400ED2F1,0xA9FBE76D, 0x3FF594E5,0xE751546F, + 0x400ED4FD,0xF3B645A2, 0x3FF595F6,0x037C587F, + 0x400ED70A,0x3D70A3D7, 0x3FF59706,0x0D94D200, + 0x400ED916,0x872B020C, 0x3FF59816,0x059D2756, + 0x400EDB22,0xD0E56042, 0x3FF59925,0xEB97BE6D, + 0x400EDD2F,0x1A9FBE77, 0x3FF59A35,0xBF86FCB3, + 0x400EDF3B,0x645A1CAC, 0x3FF59B45,0x816D471D, + 0x400EE147,0xAE147AE1, 0x3FF59C55,0x314D0229, + 0x400EE353,0xF7CED917, 0x3FF59D64,0xCF2891D8, + 0x400EE560,0x4189374C, 0x3FF59E74,0x5B0259B2, + 0x400EE76C,0x8B439581, 0x3FF59F83,0xD4DCBCC5, + 0x400EE978,0xD4FDF3B6, 0x3FF5A093,0x3CBA1DA8, + 0x400EEB85,0x1EB851EC, 0x3FF5A1A2,0x929CDE75, + 0x400EED91,0x6872B021, 0x3FF5A2B1,0xD68760CF, + 0x400EEF9D,0xB22D0E56, 0x3FF5A3C1,0x087C05DF, + 0x400EF1A9,0xFBE76C8B, 0x3FF5A4D0,0x287D2E57, + 0x400EF3B6,0x45A1CAC1, 0x3FF5A5DF,0x368D3A6D, + 0x400EF5C2,0x8F5C28F6, 0x3FF5A6EE,0x32AE89E1, + 0x400EF7CE,0xD916872B, 0x3FF5A7FD,0x1CE37BFA, + 0x400EF9DB,0x22D0E560, 0x3FF5A90B,0xF52E6F84, + 0x400EFBE7,0x6C8B4396, 0x3FF5AA1A,0xBB91C2D6, + 0x400EFDF3,0xB645A1CB, 0x3FF5AB29,0x700FD3CC, + 0x400F0000,0x00000000, 0x3FF5AC38,0x12AAFFCD, + 0x400F020C,0x49BA5E35, 0x3FF5AD46,0xA365A3C5, + 0x400F0418,0x9374BC6A, 0x3FF5AE55,0x22421C2A, + 0x400F0624,0xDD2F1AA0, 0x3FF5AF63,0x8F42C4FA, + 0x400F0831,0x26E978D5, 0x3FF5B071,0xEA69F9BA, + 0x400F0A3D,0x70A3D70A, 0x3FF5B180,0x33BA1579, + 0x400F0C49,0xBA5E353F, 0x3FF5B28E,0x6B3572CF, + 0x400F0E56,0x04189375, 0x3FF5B39C,0x90DE6BDC, + 0x400F1062,0x4DD2F1AA, 0x3FF5B4AA,0xA4B75A47, + 0x400F126E,0x978D4FDF, 0x3FF5B5B8,0xA6C29745, + 0x400F147A,0xE147AE14, 0x3FF5B6C6,0x97027B8E, + 0x400F1687,0x2B020C4A, 0x3FF5B7D4,0x75795F6A, + 0x400F1893,0x74BC6A7F, 0x3FF5B8E2,0x42299AA3, + 0x400F1A9F,0xBE76C8B4, 0x3FF5B9EF,0xFD158492, + 0x400F1CAC,0x083126E9, 0x3FF5BAFD,0xA63F7418, + 0x400F1EB8,0x51EB851F, 0x3FF5BC0B,0x3DA9BFA0, + 0x400F20C4,0x9BA5E354, 0x3FF5BD18,0xC356BD1D, + 0x400F22D0,0xE5604189, 0x3FF5BE26,0x3748C20F, + 0x400F24DD,0x2F1A9FBE, 0x3FF5BF33,0x9982237D, + 0x400F26E9,0x78D4FDF4, 0x3FF5C040,0xEA0535FC, + 0x400F28F5,0xC28F5C29, 0x3FF5C14E,0x28D44DA7, + 0x400F2B02,0x0C49BA5E, 0x3FF5C25B,0x55F1BE26, + 0x400F2D0E,0x56041893, 0x3FF5C368,0x715FDAAD, + 0x400F2F1A,0x9FBE76C9, 0x3FF5C475,0x7B20F5F7, + 0x400F3126,0xE978D4FE, 0x3FF5C582,0x7337624D, + 0x400F3333,0x33333333, 0x3FF5C68F,0x59A57181, + 0x400F353F,0x7CED9168, 0x3FF5C79C,0x2E6D74F2, + 0x400F374B,0xC6A7EF9E, 0x3FF5C8A8,0xF191BD88, + 0x400F3958,0x10624DD3, 0x3FF5C9B5,0xA3149BB7, + 0x400F3B64,0x5A1CAC08, 0x3FF5CAC2,0x42F85F80, + 0x400F3D70,0xA3D70A3D, 0x3FF5CBCE,0xD13F586D, + 0x400F3F7C,0xED916873, 0x3FF5CCDB,0x4DEBD597, + 0x400F4189,0x374BC6A8, 0x3FF5CDE7,0xB900259F, + 0x400F4395,0x810624DD, 0x3FF5CEF4,0x127E96B4, + 0x400F45A1,0xCAC08312, 0x3FF5D000,0x5A697691, + 0x400F47AE,0x147AE148, 0x3FF5D10C,0x90C3127E, + 0x400F49BA,0x5E353F7D, 0x3FF5D218,0xB58DB74C, + 0x400F4BC6,0xA7EF9DB2, 0x3FF5D324,0xC8CBB15C, + 0x400F4DD2,0xF1A9FBE7, 0x3FF5D430,0xCA7F4C9A, + 0x400F4FDF,0x3B645A1D, 0x3FF5D53C,0xBAAAD47F, + 0x400F51EB,0x851EB852, 0x3FF5D648,0x99509410, + 0x400F53F7,0xCED91687, 0x3FF5D754,0x6672D5DE, + 0x400F5604,0x189374BC, 0x3FF5D860,0x2213E40B, + 0x400F5810,0x624DD2F2, 0x3FF5D96B,0xCC360841, + 0x400F5A1C,0xAC083127, 0x3FF5DA77,0x64DB8BBB, + 0x400F5C28,0xF5C28F5C, 0x3FF5DB82,0xEC06B73F, + 0x400F5E35,0x3F7CED91, 0x3FF5DC8E,0x61B9D322, + 0x400F6041,0x89374BC7, 0x3FF5DD99,0xC5F72747, + 0x400F624D,0xD2F1A9FC, 0x3FF5DEA5,0x18C0FB1B, + 0x400F645A,0x1CAC0831, 0x3FF5DFB0,0x5A19959C, + 0x400F6666,0x66666666, 0x3FF5E0BB,0x8A033D57, + 0x400F6872,0xB020C49C, 0x3FF5E1C6,0xA8803865, + 0x400F6A7E,0xF9DB22D1, 0x3FF5E2D1,0xB592CC6C, + 0x400F6C8B,0x43958106, 0x3FF5E3DC,0xB13D3EA3, + 0x400F6E97,0x8D4FDF3B, 0x3FF5E4E7,0x9B81D3CD, + 0x400F70A3,0xD70A3D71, 0x3FF5E5F2,0x7462D03E, + 0x400F72B0,0x20C49BA6, 0x3FF5E6FD,0x3BE277D7, + 0x400F74BC,0x6A7EF9DB, 0x3FF5E807,0xF2030E07, + 0x400F76C8,0xB4395810, 0x3FF5E912,0x96C6D5CD, + 0x400F78D4,0xFDF3B646, 0x3FF5EA1D,0x2A3011B8, + 0x400F7AE1,0x47AE147B, 0x3FF5EB27,0xAC4103E3, + 0x400F7CED,0x916872B0, 0x3FF5EC32,0x1CFBEDFB, + 0x400F7EF9,0xDB22D0E5, 0x3FF5ED3C,0x7C63113B, + 0x400F8106,0x24DD2F1B, 0x3FF5EE46,0xCA78AE6E, + 0x400F8312,0x6E978D50, 0x3FF5EF51,0x073F05EF, + 0x400F851E,0xB851EB85, 0x3FF5F05B,0x32B857A6, + 0x400F872B,0x020C49BA, 0x3FF5F165,0x4CE6E30D, + 0x400F8937,0x4BC6A7F0, 0x3FF5F26F,0x55CCE72F, + 0x400F8B43,0x95810625, 0x3FF5F379,0x4D6CA2A4, + 0x400F8D4F,0xDF3B645A, 0x3FF5F483,0x33C85397, + 0x400F8F5C,0x28F5C28F, 0x3FF5F58D,0x08E237C0, + 0x400F9168,0x72B020C5, 0x3FF5F696,0xCCBC8C6B, + 0x400F9374,0xBC6A7EFA, 0x3FF5F7A0,0x7F598E70, + 0x400F9581,0x0624DD2F, 0x3FF5F8AA,0x20BB7A3D, + 0x400F978D,0x4FDF3B64, 0x3FF5F9B3,0xB0E48BCB, + 0x400F9999,0x9999999A, 0x3FF5FABD,0x2FD6FEAA, + 0x400F9BA5,0xE353F7CF, 0x3FF5FBC6,0x9D950DF4, + 0x400F9DB2,0x2D0E5604, 0x3FF5FCCF,0xFA20F458, + 0x400F9FBE,0x76C8B439, 0x3FF5FDD9,0x457CEC17, + 0x400FA1CA,0xC083126F, 0x3FF5FEE2,0x7FAB2F02, + 0x400FA3D7,0x0A3D70A4, 0x3FF5FFEB,0xA8ADF679, + 0x400FA5E3,0x53F7CED9, 0x3FF600F4,0xC0877B70, + 0x400FA7EF,0x9DB22D0E, 0x3FF601FD,0xC739F66E, + 0x400FA9FB,0xE76C8B44, 0x3FF60306,0xBCC79F88, + 0x400FAC08,0x3126E979, 0x3FF6040F,0xA132AE67, + 0x400FAE14,0x7AE147AE, 0x3FF60518,0x747D5A46, + 0x400FB020,0xC49BA5E3, 0x3FF60621,0x36A9D9F0, + 0x400FB22D,0x0E560419, 0x3FF60729,0xE7BA63C6, + 0x400FB439,0x5810624E, 0x3FF60832,0x87B12DB6, + 0x400FB645,0xA1CAC083, 0x3FF6093B,0x16906D45, + 0x400FB851,0xEB851EB8, 0x3FF60A43,0x945A5788, + 0x400FBA5E,0x353F7CEE, 0x3FF60B4C,0x01112127, + 0x400FBC6A,0x7EF9DB23, 0x3FF60C54,0x5CB6FE5D, + 0x400FBE76,0xC8B43958, 0x3FF60D5C,0xA74E22F8, + 0x400FC083,0x126E978D, 0x3FF60E64,0xE0D8C258, + 0x400FC28F,0x5C28F5C3, 0x3FF60F6D,0x09590F71, + 0x400FC49B,0xA5E353F8, 0x3FF61075,0x20D13CC8, + 0x400FC6A7,0xEF9DB22D, 0x3FF6117D,0x27437C79, + 0x400FC8B4,0x39581062, 0x3FF61285,0x1CB20030, + 0x400FCAC0,0x83126E98, 0x3FF6138D,0x011EF92E, + 0x400FCCCC,0xCCCCCCCD, 0x3FF61494,0xD48C9846, + 0x400FCED9,0x16872B02, 0x3FF6159C,0x96FD0DE1, + 0x400FD0E5,0x60418937, 0x3FF616A4,0x487289FA, + 0x400FD2F1,0xA9FBE76D, 0x3FF617AB,0xE8EF3C22, + 0x400FD4FD,0xF3B645A2, 0x3FF618B3,0x7875537A, + 0x400FD70A,0x3D70A3D7, 0x3FF619BA,0xF706FEBA, + 0x400FD916,0x872B020C, 0x3FF61AC2,0x64A66C2F, + 0x400FDB22,0xD0E56042, 0x3FF61BC9,0xC155C9B9, + 0x400FDD2F,0x1A9FBE77, 0x3FF61CD1,0x0D1744CB, + 0x400FDF3B,0x645A1CAC, 0x3FF61DD8,0x47ED0A6E, + 0x400FE147,0xAE147AE1, 0x3FF61EDF,0x71D94741, + 0x400FE353,0xF7CED917, 0x3FF61FE6,0x8ADE2777, + 0x400FE560,0x4189374C, 0x3FF620ED,0x92FDD6D4, + 0x400FE76C,0x8B439581, 0x3FF621F4,0x8A3A80B7, + 0x400FE978,0xD4FDF3B6, 0x3FF622FB,0x7096500F, + 0x400FEB85,0x1EB851EC, 0x3FF62402,0x46136F65, + 0x400FED91,0x6872B021, 0x3FF62509,0x0AB408D2, + 0x400FEF9D,0xB22D0E56, 0x3FF6260F,0xBE7A4609, + 0x400FF1A9,0xFBE76C8B, 0x3FF62716,0x61685050, + 0x400FF3B6,0x45A1CAC1, 0x3FF6281C,0xF3805083, + 0x400FF5C2,0x8F5C28F6, 0x3FF62923,0x74C46F13, + 0x400FF7CE,0xD916872B, 0x3FF62A29,0xE536D408, + 0x400FF9DB,0x22D0E560, 0x3FF62B30,0x44D9A701, + 0x400FFBE7,0x6C8B4396, 0x3FF62C36,0x93AF0F30, + 0x400FFDF3,0xB645A1CB, 0x3FF62D3C,0xD1B93360, + 0x40100000,0x00000000, 0x3FF62E42,0xFEFA39EF, + }; + + +LOCAL_D const TUint32 SqrtTest[] = + { + 0x3FE00000,0x00000000, 0x3FE6A09E,0x667F3BCD, + 0x3FE051EB,0x851EB852, 0x3FE6DA42,0x17576971, + 0x3FE0A3D7,0x0A3D70A4, 0x3FE71355,0xD04DE190, + 0x3FE0F5C2,0x8F5C28F6, 0x3FE74BDD,0xB3926321, + 0x3FE147AE,0x147AE148, 0x3FE783DD,0xB1A48E38, + 0x3FE19999,0x9999999A, 0x3FE7BB59,0x8C88B4AD, + 0x3FE1EB85,0x1EB851EC, 0x3FE7F254,0xDAB9CC3B, + 0x3FE23D70,0xA3D70A3D, 0x3FE828D3,0x09DF0C49, + 0x3FE28F5C,0x28F5C28F, 0x3FE85ED7,0x614B038C, + 0x3FE2E147,0xAE147AE1, 0x3FE89465,0x04494BE3, + 0x3FE33333,0x33333333, 0x3FE8C97E,0xF43F7248, + 0x3FE3851E,0xB851EB85, 0x3FE8FE28,0x12A529ED, + 0x3FE3D70A,0x3D70A3D7, 0x3FE93263,0x22D77275, + 0x3FE428F5,0xC28F5C29, 0x3FE96632,0xCBC9F77F, + 0x3FE47AE1,0x47AE147B, 0x3FE99999,0x9999999A, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FE9CC99,0xFF02C481, + 0x3FE51EB8,0x51EB851F, 0x3FE9FF36,0x56BDF346, + 0x3FE570A3,0xD70A3D71, 0x3FEA3170,0xE4C48745, + 0x3FE5C28F,0x5C28F5C3, 0x3FEA634B,0xD77FE1A5, + 0x3FE6147A,0xE147AE14, 0x3FEA94C9,0x48E4800E, + 0x3FE66666,0x66666666, 0x3FEAC5EB,0x3F7AB2F8, + 0x3FE6B851,0xEB851EB8, 0x3FEAF6B3,0xAF565E6F, + 0x3FE70A3D,0x70A3D70A, 0x3FEB2724,0x7AFF148F, + 0x3FE75C28,0xF5C28F5C, 0x3FEB573F,0x7449BA9F, + 0x3FE7AE14,0x7AE147AE, 0x3FEB8706,0x5D24CEE3, + 0x3FE80000,0x00000000, 0x3FEBB67A,0xE8584CAA, + 0x3FE851EB,0x851EB852, 0x3FEBE59E,0xBA3A165A, + 0x3FE8A3D7,0x0A3D70A4, 0x3FEC1473,0x6957B96B, + 0x3FE8F5C2,0x8F5C28F6, 0x3FEC42FA,0x7F164E6C, + 0x3FE947AE,0x147AE148, 0x3FEC7135,0x7849271A, + 0x3FE99999,0x9999999A, 0x3FEC9F25,0xC5BFEDD9, + 0x3FE9EB85,0x1EB851EC, 0x3FECCCCC,0xCCCCCCCD, + 0x3FEA3D70,0xA3D70A3D, 0x3FECFA2B,0xE7C3269F, + 0x3FEA8F5C,0x28F5C28F, 0x3FED2744,0x666F6040, + 0x3FEAE147,0xAE147AE1, 0x3FED5417,0x8E8830D5, + 0x3FEB3333,0x33333333, 0x3FED80A6,0x9C19E42A, + 0x3FEB851E,0xB851EB85, 0x3FEDACF2,0xC1EBF386, + 0x3FEBD70A,0x3D70A3D7, 0x3FEDD8FD,0x29E1516F, + 0x3FEC28F5,0xC28F5C29, 0x3FEE04C6,0xF553BDD8, + 0x3FEC7AE1,0x47AE147B, 0x3FEE3051,0x3D6A7202, + 0x3FECCCCC,0xCCCCCCCD, 0x3FEE5B9D,0x136C6D96, + 0x3FED1EB8,0x51EB851F, 0x3FEE86AB,0x810EA912, + 0x3FED70A3,0xD70A3D71, 0x3FEEB17D,0x88BE6CF1, + 0x3FEDC28F,0x5C28F5C3, 0x3FEEDC14,0x25E80867, + 0x3FEE147A,0xE147AE14, 0x3FEF0670,0x4D3A1E6F, + 0x3FEE6666,0x66666666, 0x3FEF3092,0xECE5BC35, + 0x3FEEB851,0xEB851EB8, 0x3FEF5A7C,0xECDB684A, + 0x3FEF0A3D,0x70A3D70A, 0x3FEF842F,0x2F055704, + 0x3FEF5C28,0xF5C28F5C, 0x3FEFADAA,0x8F7EED52, + 0x3FEFAE14,0x7AE147AE, 0x3FEFD6EF,0xE4C9B8A5, + 0x3FF00000,0x00000000, 0x3FF00000,0x00000000, + 0x3FF028F5,0xC28F5C29, 0x3FF0146D,0xD68287F3, + 0x3FF051EB,0x851EB852, 0x3FF028C1,0xD959B062, + 0x3FF07AE1,0x47AE147B, 0x3FF03CFC,0x69845AA9, + 0x3FF0A3D7,0x0A3D70A4, 0x3FF0511D,0xE5A8265F, + 0x3FF0CCCC,0xCCCCCCCD, 0x3FF06526,0xAA25A13B, + 0x3FF0F5C2,0x8F5C28F6, 0x3FF07917,0x112B9A06, + 0x3FF11EB8,0x51EB851F, 0x3FF08CEF,0x72C9A206, + 0x3FF147AE,0x147AE148, 0x3FF0A0B0,0x2501C79A, + 0x3FF170A3,0xD70A3D71, 0x3FF0B459,0x7BD9942C, + 0x3FF19999,0x9999999A, 0x3FF0C7EB,0xC96A56F6, + 0x3FF1C28F,0x5C28F5C3, 0x3FF0DB67,0x5DF0C580, + 0x3FF1EB85,0x1EB851EC, 0x3FF0EECC,0x87DBFA55, + 0x3FF2147A,0xE147AE14, 0x3FF1021B,0x93DBD9C4, + 0x3FF23D70,0xA3D70A3D, 0x3FF11554,0xCCEEE448, + 0x3FF26666,0x66666666, 0x3FF12878,0x7C6F7D7A, + 0x3FF28F5C,0x28F5C28F, 0x3FF13B86,0xEA20AE5C, + 0x3FF2B851,0xEB851EB8, 0x3FF14E80,0x5C3A692B, + 0x3FF2E147,0xAE147AE1, 0x3FF16165,0x177554AE, + 0x3FF30A3D,0x70A3D70A, 0x3FF17435,0x5F16249E, + 0x3FF33333,0x33333333, 0x3FF186F1,0x74F88472, + 0x3FF35C28,0xF5C28F5C, 0x3FF19999,0x9999999A, + 0x3FF3851E,0xB851EB85, 0x3FF1AC2E,0x0C2221D3, + 0x3FF3AE14,0x7AE147AE, 0x3FF1BEAF,0x0A703231, + 0x3FF3D70A,0x3D70A3D7, 0x3FF1D11C,0xD1209B03, + 0x3FF40000,0x00000000, 0x3FF1E377,0x9B97F4A8, + 0x3FF428F5,0xC28F5C29, 0x3FF1F5BF,0xA40B592C, + 0x3FF451EB,0x851EB852, 0x3FF207F5,0x2388CE40, + 0x3FF47AE1,0x47AE147B, 0x3FF21A18,0x51FF630A, + 0x3FF4A3D7,0x0A3D70A4, 0x3FF22C29,0x66470506, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF23E28,0x96280F23, + 0x3FF4F5C2,0x8F5C28F6, 0x3FF25016,0x166295F7, + 0x3FF51EB8,0x51EB851F, 0x3FF261F2,0x1AB573F3, + 0x3FF547AE,0x147AE148, 0x3FF273BC,0xD5E51828, + 0x3FF570A3,0xD70A3D71, 0x3FF28576,0x79C21A32, + 0x3FF59999,0x9999999A, 0x3FF2971F,0x372F95B6, + 0x3FF5C28F,0x5C28F5C3, 0x3FF2A8B7,0x3E294FB5, + 0x3FF5EB85,0x1EB851EC, 0x3FF2BA3E,0xBDC9A7E6, + 0x3FF6147A,0xE147AE14, 0x3FF2CBB5,0xE44F5836, + 0x3FF63D70,0xA3D70A3D, 0x3FF2DD1C,0xDF230457, + 0x3FF66666,0x66666666, 0x3FF2EE73,0xDADC9B57, + 0x3FF68F5C,0x28F5C28F, 0x3FF2FFBB,0x03488D00, + 0x3FF6B851,0xEB851EB8, 0x3FF310F2,0x836CD4BA, + 0x3FF6E147,0xAE147AE1, 0x3FF3221A,0x858DDB9D, + 0x3FF70A3D,0x70A3D70A, 0x3FF33333,0x33333333, + 0x3FF73333,0x33333333, 0x3FF3443C,0xB52C2A85, + 0x3FF75C28,0xF5C28F5C, 0x3FF35537,0x33943EBD, + 0x3FF7851E,0xB851EB85, 0x3FF36622,0xD5D768DE, + 0x3FF7AE14,0x7AE147AE, 0x3FF376FF,0xC2B649C7, + 0x3FF7D70A,0x3D70A3D7, 0x3FF387CE,0x204A35D2, + 0x3FF80000,0x00000000, 0x3FF3988E,0x1409212E, + 0x3FF828F5,0xC28F5C29, 0x3FF3A93F,0xC2C96E34, + 0x3FF851EB,0x851EB852, 0x3FF3B9E3,0x50C59EAE, + 0x3FF87AE1,0x47AE147B, 0x3FF3CA78,0xE19FE93C, + 0x3FF8A3D7,0x0A3D70A4, 0x3FF3DB00,0x9865B3BD, + 0x3FF8CCCC,0xCCCCCCCD, 0x3FF3EB7A,0x9792F3C6, + 0x3FF8F5C2,0x8F5C28F6, 0x3FF3FBE7,0x01157608, + 0x3FF91EB8,0x51EB851F, 0x3FF40C45,0xF6500D83, + 0x3FF947AE,0x147AE148, 0x3FF41C97,0x981DAB71, + 0x3FF970A3,0xD70A3D71, 0x3FF42CDC,0x06D4609E, + 0x3FF99999,0x9999999A, 0x3FF43D13,0x6248490F, + 0x3FF9C28F,0x5C28F5C3, 0x3FF44D3D,0xC9CE62A3, + 0x3FF9EB85,0x1EB851EC, 0x3FF45D5B,0x5C3F4F6B, + 0x3FFA147A,0xE147AE14, 0x3FF46D6C,0x37FA0475, + 0x3FFA3D70,0xA3D70A3D, 0x3FF47D70,0x7AE6659A, + 0x3FFA6666,0x66666666, 0x3FF48D68,0x4277CF0B, + 0x3FFA8F5C,0x28F5C28F, 0x3FF49D53,0xABAF8D2C, + 0x3FFAB851,0xEB851EB8, 0x3FF4AD32,0xD31F434E, + 0x3FFAE147,0xAE147AE1, 0x3FF4BD05,0xD4EB41E9, + 0x3FFB0A3D,0x70A3D70A, 0x3FF4CCCC,0xCCCCCCCD, + 0x3FFB3333,0x33333333, 0x3FF4DC87,0xD61451DA, + 0x3FFB5C28,0xF5C28F5C, 0x3FF4EC37,0x0BAB90C4, + 0x3FFB851E,0xB851EB85, 0x3FF4FBDA,0x8817B44D, + 0x3FFBAE14,0x7AE147AE, 0x3FF50B72,0x657B5D7E, + 0x3FFBD70A,0x3D70A3D7, 0x3FF51AFE,0xBD98A145, + 0x3FFC0000,0x00000000, 0x3FF52A7F,0xA9D2F8EA, + 0x3FFC28F5,0xC28F5C29, 0x3FF539F5,0x433125C3, + 0x3FFC51EB,0x851EB852, 0x3FF5495F,0xA25F0897, + 0x3FFC7AE1,0x47AE147B, 0x3FF558BE,0xDFAF6CF9, + 0x3FFCA3D7,0x0A3D70A4, 0x3FF56813,0x131DC91E, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF5775C,0x544FF263, + 0x3FFCF5C2,0x8F5C28F6, 0x3FF5869A,0xBA97C6F7, + 0x3FFD1EB8,0x51EB851F, 0x3FF595CE,0x5CF4CCF2, + 0x3FFD47AE,0x147AE148, 0x3FF5A4F7,0x5215C72B, + 0x3FFD70A3,0xD70A3D71, 0x3FF5B415,0xB05A401C, + 0x3FFD9999,0x9999999A, 0x3FF5C329,0x8DD40B25, + 0x3FFDC28F,0x5C28F5C3, 0x3FF5D233,0x0048BC6E, + 0x3FFDEB85,0x1EB851EC, 0x3FF5E132,0x1D3317B6, + 0x3FFE147A,0xE147AE14, 0x3FF5F026,0xF9C47652, + 0x3FFE3D70,0xA3D70A3D, 0x3FF5FF11,0xAAE624A0, + 0x3FFE6666,0x66666666, 0x3FF60DF2,0x453AB723, + 0x3FFE8F5C,0x28F5C28F, 0x3FF61CC8,0xDD1F5796, + 0x3FFEB851,0xEB851EB8, 0x3FF62B95,0x86AD0A22, + 0x3FFEE147,0xAE147AE1, 0x3FF63A58,0x55B9EAFB, + 0x3FFF0A3D,0x70A3D70A, 0x3FF64911,0x5DDA6496, + 0x3FFF3333,0x33333333, 0x3FF657C0,0xB2625EB4, + 0x3FFF5C28,0xF5C28F5C, 0x3FF66666,0x66666666, + 0x3FFF851E,0xB851EB85, 0x3FF67502,0x8CBCCF54, + 0x3FFFAE14,0x7AE147AE, 0x3FF68395,0x37FECE62, + 0x3FFFD70A,0x3D70A3D7, 0x3FF6921E,0x7A898DED, + 0x40000000,0x00000000, 0x3FF6A09E,0x667F3BCD, + 0x4000147A,0xE147AE14, 0x3FF6AF15,0x0DC81142, + 0x400028F5,0xC28F5C29, 0x3FF6BD82,0x821354FF, + 0x40003D70,0xA3D70A3D, 0x3FF6CBE6,0xD4D85770, + 0x400051EB,0x851EB852, 0x3FF6DA42,0x17576971, + 0x40006666,0x66666666, 0x3FF6E894,0x5A9ACD92, + 0x40007AE1,0x47AE147B, 0x3FF6F6DD,0xAF77A413, + 0x40008F5C,0x28F5C28F, 0x3FF7051E,0x268ED1B4, + 0x4000A3D7,0x0A3D70A4, 0x3FF71355,0xD04DE190, + 0x4000B851,0xEB851EB8, 0x3FF72184,0xBCEFE200, + 0x4000CCCC,0xCCCCCCCD, 0x3FF72FAA,0xFC7E3CD7, + 0x4000E147,0xAE147AE1, 0x3FF73DC8,0x9ED18AEA, + 0x4000F5C2,0x8F5C28F6, 0x3FF74BDD,0xB3926321, + 0x40010A3D,0x70A3D70A, 0x3FF759EA,0x4A3A251F, + 0x40011EB8,0x51EB851F, 0x3FF767EE,0x7213BFA8, + 0x40013333,0x33333333, 0x3FF775EA,0x3A3C72D2, + 0x400147AE,0x147AE148, 0x3FF783DD,0xB1A48E38, + 0x40015C28,0xF5C28F5C, 0x3FF791C8,0xE7102B26, + 0x400170A3,0xD70A3D71, 0x3FF79FAB,0xE917E2F5, + 0x4001851E,0xB851EB85, 0x3FF7AD86,0xC629819F, + 0x40019999,0x9999999A, 0x3FF7BB59,0x8C88B4AD, + 0x4001AE14,0x7AE147AE, 0x3FF7C924,0x4A4FB68C, + 0x4001C28F,0x5C28F5C3, 0x3FF7D6E7,0x0D6FF66D, + 0x4001D70A,0x3D70A3D7, 0x3FF7E4A1,0xE3B2BCBA, + 0x4001EB85,0x1EB851EC, 0x3FF7F254,0xDAB9CC3B, + 0x40020000,0x00000000, 0x3FF80000,0x00000000, + 0x4002147A,0xE147AE14, 0x3FF80DA3,0x60D9E625, + 0x400228F5,0xC28F5C29, 0x3FF81B3F,0x0A765780, + 0x40023D70,0xA3D70A3D, 0x3FF828D3,0x09DF0C49, + 0x400251EB,0x851EB852, 0x3FF8365F,0x6BF92DE2, + 0x40026666,0x66666666, 0x3FF843E4,0x3D85E5B1, + 0x40027AE1,0x47AE147B, 0x3FF85161,0x8B22E93E, + 0x40028F5C,0x28F5C28F, 0x3FF85ED7,0x614B038C, + 0x4002A3D7,0x0A3D70A4, 0x3FF86C45,0xCC569BD1, + 0x4002B851,0xEB851EB8, 0x3FF879AC,0xD87C398E, + 0x4002CCCC,0xCCCCCCCD, 0x3FF8870C,0x91D10623, + 0x4002E147,0xAE147AE1, 0x3FF89465,0x04494BE3, + 0x4002F5C2,0x8F5C28F6, 0x3FF8A1B6,0x3BB8F2C3, + 0x40030A3D,0x70A3D70A, 0x3FF8AF00,0x43D3FAA3, + 0x40031EB8,0x51EB851F, 0x3FF8BC43,0x282EF353, + 0x40033333,0x33333333, 0x3FF8C97E,0xF43F7248, + 0x400347AE,0x147AE148, 0x3FF8D6B3,0xB35C8629, + 0x40035C28,0xF5C28F5C, 0x3FF8E3E1,0x70BF282E, + 0x400370A3,0xD70A3D71, 0x3FF8F108,0x3782AB66, + 0x4003851E,0xB851EB85, 0x3FF8FE28,0x12A529ED, + 0x40039999,0x9999999A, 0x3FF90B41,0x0D07F01E, + 0x4003AE14,0x7AE147AE, 0x3FF91853,0x316FE5D0, + 0x4003C28F,0x5C28F5C3, 0x3FF9255E,0x8A85F5A4, + 0x4003D70A,0x3D70A3D7, 0x3FF93263,0x22D77275, + 0x4003EB85,0x1EB851EC, 0x3FF93F61,0x04D67AED, + 0x40040000,0x00000000, 0x3FF94C58,0x3ADA5B53, + 0x4004147A,0xE147AE14, 0x3FF95948,0xCF1FED8E, + 0x400428F5,0xC28F5C29, 0x3FF96632,0xCBC9F77F, + 0x40043D70,0xA3D70A3D, 0x3FF97316,0x3AE18797, + 0x400451EB,0x851EB852, 0x3FF97FF3,0x26564FDE, + 0x40046666,0x66666666, 0x3FF98CC9,0x97FEFF4C, + 0x40047AE1,0x47AE147B, 0x3FF99999,0x9999999A, + 0x40048F5C,0x28F5C28F, 0x3FF9A663,0x34CBCD7F, + 0x4004A3D7,0x0A3D70A4, 0x3FF9B326,0x73234978, + 0x4004B851,0xEB851EB8, 0x3FF9BFE3,0x5E160F05, + 0x4004CCCC,0xCCCCCCCD, 0x3FF9CC99,0xFF02C481, + 0x4004E147,0xAE147AE1, 0x3FF9D94A,0x5F31058A, + 0x4004F5C2,0x8F5C28F6, 0x3FF9E5F4,0x87D1B20C, + 0x40050A3D,0x70A3D70A, 0x3FF9F298,0x81FF3BE6, + 0x40051EB8,0x51EB851F, 0x3FF9FF36,0x56BDF346, + 0x40053333,0x33333333, 0x3FFA0BCE,0x0EFC51B3, + 0x400547AE,0x147AE148, 0x3FFA185F,0xB39343D4, + 0x40055C28,0xF5C28F5C, 0x3FFA24EB,0x4D4671F0, + 0x400570A3,0xD70A3D71, 0x3FFA3170,0xE4C48745, + 0x4005851E,0xB851EB85, 0x3FFA3DF0,0x82A77817, + 0x40059999,0x9999999A, 0x3FFA4A6A,0x2F74C6AC, + 0x4005AE14,0x7AE147AE, 0x3FFA56DD,0xF39DC709, + 0x4005C28F,0x5C28F5C3, 0x3FFA634B,0xD77FE1A5, + 0x4005D70A,0x3D70A3D7, 0x3FFA6FB3,0xE364D4F2, + 0x4005EB85,0x1EB851EC, 0x3FFA7C16,0x1F82F5DD, + 0x40060000,0x00000000, 0x3FFA8872,0x93FD6F34, + 0x4006147A,0xE147AE14, 0x3FFA94C9,0x48E4800E, + 0x400628F5,0xC28F5C29, 0x3FFAA11A,0x4635B928, + 0x40063D70,0xA3D70A3D, 0x3FFAAD65,0x93DC3940, + 0x400651EB,0x851EB852, 0x3FFAB9AB,0x39B0E884, + 0x40066666,0x66666666, 0x3FFAC5EB,0x3F7AB2F8, + 0x40067AE1,0x47AE147B, 0x3FFAD225,0xACEEC1FC, + 0x40068F5C,0x28F5C28F, 0x3FFADE5A,0x89B0B4E2, + 0x4006A3D7,0x0A3D70A4, 0x3FFAEA89,0xDD52D896, + 0x4006B851,0xEB851EB8, 0x3FFAF6B3,0xAF565E6F, + 0x4006CCCC,0xCCCCCCCD, 0x3FFB02D8,0x072B921B, + 0x4006E147,0xAE147AE1, 0x3FFB0EF6,0xEC320EAD, + 0x4006F5C2,0x8F5C28F6, 0x3FFB1B10,0x65B8F2E3, + 0x40070A3D,0x70A3D70A, 0x3FFB2724,0x7AFF148F, + 0x40071EB8,0x51EB851F, 0x3FFB3333,0x33333333, + 0x40073333,0x33333333, 0x3FFB3F3C,0x957429DA, + 0x400747AE,0x147AE148, 0x3FFB4B40,0xA8D12027, + 0x40075C28,0xF5C28F5C, 0x3FFB573F,0x7449BA9F, + 0x400770A3,0xD70A3D71, 0x3FFB6338,0xFECE4A3D, + 0x4007851E,0xB851EB85, 0x3FFB6F2D,0x4F3FFB41, + 0x40079999,0x9999999A, 0x3FFB7B1C,0x6C710352, + 0x4007AE14,0x7AE147AE, 0x3FFB8706,0x5D24CEE3, + 0x4007C28F,0x5C28F5C3, 0x3FFB92EB,0x28102DED, + 0x4007D70A,0x3D70A3D7, 0x3FFB9ECA,0xD3D97FF8, + 0x4007EB85,0x1EB851EC, 0x3FFBAAA5,0x6718DF80, + 0x40080000,0x00000000, 0x3FFBB67A,0xE8584CAA, + 0x4008147A,0xE147AE14, 0x3FFBC24B,0x5E13D75E, + 0x400828F5,0xC28F5C29, 0x3FFBCE16,0xCEB9C8BA, + 0x40083D70,0xA3D70A3D, 0x3FFBD9DD,0x40AACBE7, + 0x400851EB,0x851EB852, 0x3FFBE59E,0xBA3A165A, + 0x40086666,0x66666666, 0x3FFBF15B,0x41AD8F74, + 0x40087AE1,0x47AE147B, 0x3FFBFD12,0xDD3DF78F, + 0x40088F5C,0x28F5C28F, 0x3FFC08C5,0x93170E7B, + 0x4008A3D7,0x0A3D70A4, 0x3FFC1473,0x6957B96B, + 0x4008B851,0xEB851EB8, 0x3FFC201C,0x6612284A, + 0x4008CCCC,0xCCCCCCCD, 0x3FFC2BC0,0x8F4BFA98, + 0x4008E147,0xAE147AE1, 0x3FFC375F,0xEAFE63A8, + 0x4008F5C2,0x8F5C28F6, 0x3FFC42FA,0x7F164E6C, + 0x40090A3D,0x70A3D70A, 0x3FFC4E90,0x517480AD, + 0x40091EB8,0x51EB851F, 0x3FFC5A21,0x67EDBDCD, + 0x40093333,0x33333333, 0x3FFC65AD,0xC84AE903, + 0x400947AE,0x147AE148, 0x3FFC7135,0x7849271A, + 0x40095C28,0xF5C28F5C, 0x3FFC7CB8,0x7D99FFBA, + 0x400970A3,0xD70A3D71, 0x3FFC8836,0xDDE37E36, + 0x4009851E,0xB851EB85, 0x3FFC93B0,0x9EC051DA, + 0x40099999,0x9999999A, 0x3FFC9F25,0xC5BFEDD9, + 0x4009AE14,0x7AE147AE, 0x3FFCAA96,0x5866A8B2, + 0x4009C28F,0x5C28F5C3, 0x3FFCB602,0x5C2DDB31, + 0x4009D70A,0x3D70A3D7, 0x3FFCC169,0xD683FF02, + 0x4009EB85,0x1EB851EC, 0x3FFCCCCC,0xCCCCCCCD, + 0x400A0000,0x00000000, 0x3FFCD82B,0x446159F3, + 0x400A147A,0xE147AE14, 0x3FFCE385,0x429035DB, + 0x400A28F5,0xC28F5C29, 0x3FFCEEDA,0xCC9D86D5, + 0x400A3D70,0xA3D70A3D, 0x3FFCFA2B,0xE7C3269F, + 0x400A51EB,0x851EB852, 0x3FFD0578,0x9930BE82, + 0x400A6666,0x66666666, 0x3FFD10C0,0xE60BE308, + 0x400A7AE1,0x47AE147B, 0x3FFD1C04,0xD3702F5C, + 0x400A8F5C,0x28F5C28F, 0x3FFD2744,0x666F6040, + 0x400AA3D7,0x0A3D70A4, 0x3FFD327F,0xA4116EAB, + 0x400AB851,0xEB851EB8, 0x3FFD3DB6,0x9154AA0E, + 0x400ACCCC,0xCCCCCCCD, 0x3FFD48E9,0x332DD234, + 0x400AE147,0xAE147AE1, 0x3FFD5417,0x8E8830D5, + 0x400AF5C2,0x8F5C28F6, 0x3FFD5F41,0xA845B2CB, + 0x400B0A3D,0x70A3D70A, 0x3FFD6A67,0x853F00F0, + 0x400B1EB8,0x51EB851F, 0x3FFD7589,0x2A4398AC, + 0x400B3333,0x33333333, 0x3FFD80A6,0x9C19E42A, + 0x400B47AE,0x147AE148, 0x3FFD8BBF,0xDF7F5240, + 0x400B5C28,0xF5C28F5C, 0x3FFD96D4,0xF9286E05, + 0x400B70A3,0xD70A3D71, 0x3FFDA1E5,0xEDC0F614, + 0x400B851E,0xB851EB85, 0x3FFDACF2,0xC1EBF386, + 0x400B9999,0x9999999A, 0x3FFDB7FB,0x7A43D09D, + 0x400BAE14,0x7AE147AE, 0x3FFDC300,0x1B5A6F21, + 0x400BC28F,0x5C28F5C3, 0x3FFDCE00,0xA9B93E79, + 0x400BD70A,0x3D70A3D7, 0x3FFDD8FD,0x29E1516F, + 0x400BEB85,0x1EB851EC, 0x3FFDE3F5,0xA04B73C0, + 0x400C0000,0x00000000, 0x3FFDEEEA,0x11683F49, + 0x400C147A,0xE147AE14, 0x3FFDF9DA,0x81A0310C, + 0x400C28F5,0xC28F5C29, 0x3FFE04C6,0xF553BDD8, + 0x400C3D70,0xA3D70A3D, 0x3FFE0FAF,0x70DB66BB, + 0x400C51EB,0x851EB852, 0x3FFE1A93,0xF887CD30, + 0x400C6666,0x66666666, 0x3FFE2574,0x90A1C704, + 0x400C7AE1,0x47AE147B, 0x3FFE3051,0x3D6A7202, + 0x400C8F5C,0x28F5C28F, 0x3FFE3B2A,0x031B475E, + 0x400CA3D7,0x0A3D70A4, 0x3FFE45FE,0xE5E62EDE, + 0x400CB851,0xEB851EB8, 0x3FFE50CF,0xE9F591C8, + 0x400CCCCC,0xCCCCCCCD, 0x3FFE5B9D,0x136C6D96, + 0x400CE147,0xAE147AE1, 0x3FFE6666,0x66666666, + 0x400CF5C2,0x8F5C28F6, 0x3FFE712B,0xE6F7D939, + 0x400D0A3D,0x70A3D70A, 0x3FFE7BED,0x992DEDEF, + 0x400D1EB8,0x51EB851F, 0x3FFE86AB,0x810EA912, + 0x400D3333,0x33333333, 0x3FFE9165,0xA298FD64, + 0x400D47AE,0x147AE148, 0x3FFE9C1C,0x01C4DD35, + 0x400D5C28,0xF5C28F5C, 0x3FFEA6CE,0xA2834B85, + 0x400D70A3,0xD70A3D71, 0x3FFEB17D,0x88BE6CF1, + 0x400D851E,0xB851EB85, 0x3FFEBC28,0xB8599867, + 0x400D9999,0x9999999A, 0x3FFEC6D0,0x353167A9, + 0x400DAE14,0x7AE147AE, 0x3FFED174,0x031BC79C, + 0x400DC28F,0x5C28F5C3, 0x3FFEDC14,0x25E80867, + 0x400DD70A,0x3D70A3D7, 0x3FFEE6B0,0xA15EED56, + 0x400DEB85,0x1EB851EC, 0x3FFEF149,0x7942BC9D, + 0x400E0000,0x00000000, 0x3FFEFBDE,0xB14F4EDA, + 0x400E147A,0xE147AE14, 0x3FFF0670,0x4D3A1E6F, + 0x400E28F5,0xC28F5C29, 0x3FFF10FE,0x50B256B1, + 0x400E3D70,0xA3D70A3D, 0x3FFF1B88,0xBF60E2DE, + 0x400E51EB,0x851EB852, 0x3FFF260F,0x9CE87CEE, + 0x400E6666,0x66666666, 0x3FFF3092,0xECE5BC35, + 0x400E7AE1,0x47AE147B, 0x3FFF3B12,0xB2EF23D7, + 0x400E8F5C,0x28F5C28F, 0x3FFF458E,0xF2953111, + 0x400EA3D7,0x0A3D70A4, 0x3FFF5007,0xAF626957, + 0x400EB851,0xEB851EB8, 0x3FFF5A7C,0xECDB684A, + 0x400ECCCC,0xCCCCCCCD, 0x3FFF64EE,0xAE7EED81, + 0x400EE147,0xAE147AE1, 0x3FFF6F5C,0xF7C5EA25, + 0x400EF5C2,0x8F5C28F6, 0x3FFF79C7,0xCC238E74, + 0x400F0A3D,0x70A3D70A, 0x3FFF842F,0x2F055704, + 0x400F1EB8,0x51EB851F, 0x3FFF8E93,0x23D319F6, + 0x400F3333,0x33333333, 0x3FFF98F3,0xADEF13F2, + 0x400F47AE,0x147AE148, 0x3FFFA350,0xD0B5F505, + 0x400F5C28,0xF5C28F5C, 0x3FFFADAA,0x8F7EED52, + 0x400F70A3,0xD70A3D71, 0x3FFFB800,0xED9BB9A8, + 0x400F851E,0xB851EB85, 0x3FFFC253,0xEE58AFEA, + 0x400F9999,0x9999999A, 0x3FFFCCA3,0x94FCCB55, + 0x400FAE14,0x7AE147AE, 0x3FFFD6EF,0xE4C9B8A5, + 0x400FC28F,0x5C28F5C3, 0x3FFFE138,0xE0FBE215, + 0x400FD70A,0x3D70A3D7, 0x3FFFEB7E,0x8CCA7B39, + 0x400FEB85,0x1EB851EC, 0x3FFFF5C0,0xEB678CBF, + 0x40100000,0x00000000, 0x40000000,0x00000000, + 0x40100A3D,0x70A3D70A, 0x4000051D,0xE6DDD53F, + 0x4010147A,0xE147AE14, 0x40000A3A,0x2BDEAC9B, + 0x40101EB8,0x51EB851F, 0x40000F54,0xD0916DEE, + 0x401028F5,0xC28F5C29, 0x4000146D,0xD68287F3, + 0x40103333,0x33333333, 0x40001985,0x3F3BF5CA, + 0x40103D70,0xA3D70A3D, 0x40001E9B,0x0C45445B, + 0x401047AE,0x147AE148, 0x400023AF,0x3F2397B6, + 0x401051EB,0x851EB852, 0x400028C1,0xD959B062, + 0x40105C28,0xF5C28F5C, 0x40002DD2,0xDC67F097, + 0x40106666,0x66666666, 0x400032E2,0x49CC6171, + 0x401070A3,0xD70A3D71, 0x400037F0,0x2302B811, + 0x40107AE1,0x47AE147B, 0x40003CFC,0x69845AA9, + 0x4010851E,0xB851EB85, 0x40004207,0x1EC8658A, + 0x40108F5C,0x28F5C28F, 0x40004710,0x4443B015, + 0x40109999,0x9999999A, 0x40004C17,0xDB68D1A2, + 0x4010A3D7,0x0A3D70A4, 0x4000511D,0xE5A8265F, + 0x4010AE14,0x7AE147AE, 0x40005622,0x646FD41A, + 0x4010B851,0xEB851EB8, 0x40005B25,0x592BCF05, + 0x4010C28F,0x5C28F5C3, 0x40006026,0xC545DE65, + 0x4010CCCC,0xCCCCCCCD, 0x40006526,0xAA25A13B, + 0x4010D70A,0x3D70A3D7, 0x40006A25,0x093092DC, + 0x4010E147,0xAE147AE1, 0x40006F21,0xE3CA0F7F, + 0x4010EB85,0x1EB851EC, 0x4000741D,0x3B5358BE, + 0x4010F5C2,0x8F5C28F6, 0x40007917,0x112B9A06, + 0x40110000,0x00000000, 0x40007E0F,0x66AFED07, + 0x40110A3D,0x70A3D70A, 0x40008306,0x3D3B5E08, + 0x4011147A,0xE147AE14, 0x400087FB,0x9626F03C, + 0x40111EB8,0x51EB851F, 0x40008CEF,0x72C9A206, + 0x401128F5,0xC28F5C29, 0x400091E1,0xD4787132, + 0x40113333,0x33333333, 0x400096D2,0xBC865F23, + 0x40113D70,0xA3D70A3D, 0x40009BC2,0x2C4474F6, + 0x401147AE,0x147AE148, 0x4000A0B0,0x2501C79A, + 0x401151EB,0x851EB852, 0x4000A59C,0xA80B7BD9, + 0x40115C28,0xF5C28F5C, 0x4000AA87,0xB6ACCA63, + 0x40116666,0x66666666, 0x4000AF71,0x522F03BB, + 0x401170A3,0xD70A3D71, 0x4000B459,0x7BD9942C, + 0x40117AE1,0x47AE147B, 0x4000B940,0x34F207A5, + 0x4011851E,0xB851EB85, 0x4000BE25,0x7EBC0D98, + 0x40118F5C,0x28F5C28F, 0x4000C309,0x5A797CC3, + 0x40119999,0x9999999A, 0x4000C7EB,0xC96A56F6, + 0x4011A3D7,0x0A3D70A4, 0x4000CCCC,0xCCCCCCCD, + 0x4011AE14,0x7AE147AE, 0x4000D1AC,0x65DD4162, + 0x4011B851,0xEB851EB8, 0x4000D68A,0x95D64DF3, + 0x4011C28F,0x5C28F5C3, 0x4000DB67,0x5DF0C580, + 0x4011CCCC,0xCCCCCCCD, 0x4000E042,0xBF63B85D, + 0x4011D70A,0x3D70A3D7, 0x4000E51C,0xBB6477C0, + 0x4011E147,0xAE147AE1, 0x4000E9F5,0x53269942, + 0x4011EB85,0x1EB851EC, 0x4000EECC,0x87DBFA55, + 0x4011F5C2,0x8F5C28F6, 0x4000F3A2,0x5AB4C3B7, + 0x40120000,0x00000000, 0x4000F876,0xCCDF6CD9, + 0x40120A3D,0x70A3D70A, 0x4000FD49,0xDF88BF3C, + 0x4012147A,0xE147AE14, 0x4001021B,0x93DBD9C4, + 0x40121EB8,0x51EB851F, 0x400106EB,0xEB02340D, + 0x401228F5,0xC28F5C29, 0x40010BBA,0xE623A1A6, + 0x40123333,0x33333333, 0x40011088,0x86665555, + 0x40123D70,0xA3D70A3D, 0x40011554,0xCCEEE448, + 0x401247AE,0x147AE148, 0x40011A1F,0xBAE04943, + 0x401251EB,0x851EB852, 0x40011EE9,0x515BE7C1, + 0x40125C28,0xF5C28F5C, 0x400123B1,0x91818F15, + 0x40126666,0x66666666, 0x40012878,0x7C6F7D7A, + 0x401270A3,0xD70A3D71, 0x40012D3E,0x13426323, + 0x40127AE1,0x47AE147B, 0x40013202,0x5715653E, + 0x4012851E,0xB851EB85, 0x400136C5,0x490220F3, + 0x40128F5C,0x28F5C28F, 0x40013B86,0xEA20AE5C, + 0x40129999,0x9999999A, 0x40014047,0x3B87A370, + 0x4012A3D7,0x0A3D70A4, 0x40014506,0x3E4C16EB, + 0x4012AE14,0x7AE147AE, 0x400149C3,0xF381A332, + 0x4012B851,0xEB851EB8, 0x40014E80,0x5C3A692B, + 0x4012C28F,0x5C28F5C3, 0x4001533B,0x7987130E, + 0x4012CCCC,0xCCCCCCCD, 0x400157F5,0x4C76D72F, + 0x4012D70A,0x3D70A3D7, 0x40015CAD,0xD6177AC7, + 0x4012E147,0xAE147AE1, 0x40016165,0x177554AE, + 0x4012EB85,0x1EB851EC, 0x4001661B,0x119B5016, + 0x4012F5C2,0x8F5C28F6, 0x40016ACF,0xC592EF36, + 0x40130000,0x00000000, 0x40016F83,0x34644DF9, + 0x40130A3D,0x70A3D70A, 0x40017435,0x5F16249E, + 0x4013147A,0xE147AE14, 0x400178E6,0x46ADCA59, + 0x40131EB8,0x51EB851F, 0x40017D95,0xEC2F37E6, + 0x401328F5,0xC28F5C29, 0x40018244,0x509D0A1A, + 0x40133333,0x33333333, 0x400186F1,0x74F88472, + 0x40133D70,0xA3D70A3D, 0x40018B9D,0x5A419391, + 0x401347AE,0x147AE148, 0x40019048,0x0176CFC3, + 0x401351EB,0x851EB852, 0x400194F1,0x6B957F72, + 0x40135C28,0xF5C28F5C, 0x40019999,0x9999999A, + 0x40136666,0x66666666, 0x40019E40,0x8C7DC837, + 0x401370A3,0xD70A3D71, 0x4001A2E6,0x453B6AAA, + 0x40137AE1,0x47AE147B, 0x4001A78A,0xC4CA981B, + 0x4013851E,0xB851EB85, 0x4001AC2E,0x0C2221D3, + 0x40138F5C,0x28F5C28F, 0x4001B0D0,0x1C379595, + 0x40139999,0x9999999A, 0x4001B570,0xF5FF3FED, + 0x4013A3D7,0x0A3D70A4, 0x4001BA10,0x9A6C2E79, + 0x4013AE14,0x7AE147AE, 0x4001BEAF,0x0A703231, + 0x4013B851,0xEB851EB8, 0x4001C34C,0x46FBE1A9, + 0x4013C28F,0x5C28F5C3, 0x4001C7E8,0x50FE9B49, + 0x4013CCCC,0xCCCCCCCD, 0x4001CC83,0x29668782, + 0x4013D70A,0x3D70A3D7, 0x4001D11C,0xD1209B03, + 0x4013E147,0xAE147AE1, 0x4001D5B5,0x491898E2, + 0x4013EB85,0x1EB851EC, 0x4001DA4C,0x923914C4, + 0x4013F5C2,0x8F5C28F6, 0x4001DEE2,0xAD6B74FB, + 0x40140000,0x00000000, 0x4001E377,0x9B97F4A8, + 0x40140A3D,0x70A3D70A, 0x4001E80B,0x5DA5A5D0, + 0x4014147A,0xE147AE14, 0x4001EC9D,0xF47A736F, + 0x40141EB8,0x51EB851F, 0x4001F12F,0x60FB2388, + 0x401428F5,0xC28F5C29, 0x4001F5BF,0xA40B592C, + 0x40143333,0x33333333, 0x4001FA4E,0xBE8D9681, + 0x40143D70,0xA3D70A3D, 0x4001FEDC,0xB1633EC2, + 0x401447AE,0x147AE148, 0x40020369,0x7D6C983C, + 0x401451EB,0x851EB852, 0x400207F5,0x2388CE40, + 0x40145C28,0xF5C28F5C, 0x40020C7F,0xA495F31F, + 0x40146666,0x66666666, 0x40021109,0x0171020F, + 0x401470A3,0xD70A3D71, 0x40021591,0x3AF5E11D, + 0x40147AE1,0x47AE147B, 0x40021A18,0x51FF630A, + 0x4014851E,0xB851EB85, 0x40021E9E,0x47674937, + 0x40148F5C,0x28F5C28F, 0x40022323,0x1C06457A, + 0x40149999,0x9999999A, 0x400227A6,0xD0B3FBFB, + 0x4014A3D7,0x0A3D70A4, 0x40022C29,0x66470506, + 0x4014AE14,0x7AE147AE, 0x400230AA,0xDD94EEE1, + 0x4014B851,0xEB851EB8, 0x4002352B,0x37723F94, + 0x4014C28F,0x5C28F5C3, 0x400239AA,0x74B276B3, + 0x4014CCCC,0xCCCCCCCD, 0x40023E28,0x96280F23, + 0x4014D70A,0x3D70A3D7, 0x400242A5,0x9CA480DD, + 0x4014E147,0xAE147AE1, 0x40024721,0x88F842A9, + 0x4014EB85,0x1EB851EC, 0x40024B9C,0x5BF2CBD8, + 0x4014F5C2,0x8F5C28F6, 0x40025016,0x166295F7, + 0x40150000,0x00000000, 0x4002548E,0xB9151E85, + 0x40150A3D,0x70A3D70A, 0x40025906,0x44D6E89F, + 0x4015147A,0xE147AE14, 0x40025D7C,0xBA737EA7, + 0x40151EB8,0x51EB851F, 0x400261F2,0x1AB573F3, + 0x401528F5,0xC28F5C29, 0x40026666,0x66666666, + 0x40153333,0x33333333, 0x40026AD9,0x9E4F0017, + 0x40153D70,0xA3D70A3D, 0x40026F4B,0xC336F8EA, + 0x401547AE,0x147AE148, 0x400273BC,0xD5E51828, + 0x401551EB,0x851EB852, 0x4002782C,0xD71F3615, + 0x40155C28,0xF5C28F5C, 0x40027C9B,0xC7AA3D82, + 0x40156666,0x66666666, 0x40028109,0xA84A2D5B, + 0x401570A3,0xD70A3D71, 0x40028576,0x79C21A32, + 0x40157AE1,0x47AE147B, 0x400289E2,0x3CD42FC3, + 0x4015851E,0xB851EB85, 0x40028E4C,0xF241B280, + 0x40158F5C,0x28F5C28F, 0x400292B6,0x9ACB010B, + 0x40159999,0x9999999A, 0x4002971F,0x372F95B6, + 0x4015A3D7,0x0A3D70A4, 0x40029B86,0xC82E07FF, + 0x4015AE14,0x7AE147AE, 0x40029FED,0x4E840E06, + 0x4015B851,0xEB851EB8, 0x4002A452,0xCAEE7E03, + 0x4015C28F,0x5C28F5C3, 0x4002A8B7,0x3E294FB5, + 0x4015CCCC,0xCCCCCCCD, 0x4002AD1A,0xA8EF9DD1, + 0x4015D70A,0x3D70A3D7, 0x4002B17D,0x0BFBA76F, + 0x4015E147,0xAE147AE1, 0x4002B5DE,0x6806D170, + 0x4015EB85,0x1EB851EC, 0x4002BA3E,0xBDC9A7E6, + 0x4015F5C2,0x8F5C28F6, 0x4002BE9E,0x0DFBDF72, + 0x40160000,0x00000000, 0x4002C2FC,0x595456A7, + 0x40160A3D,0x70A3D70A, 0x4002C759,0xA0891765, + 0x4016147A,0xE147AE14, 0x4002CBB5,0xE44F5836, + 0x40161EB8,0x51EB851F, 0x4002D011,0x255B7D9E, + 0x401628F5,0xC28F5C29, 0x4002D46B,0x64611B76, + 0x40163333,0x33333333, 0x4002D8C4,0xA212F639, + 0x40163D70,0xA3D70A3D, 0x4002DD1C,0xDF230457, + 0x401647AE,0x147AE148, 0x4002E174,0x1C426F7A, + 0x401651EB,0x851EB852, 0x4002E5CA,0x5A2195D8, + 0x40165C28,0xF5C28F5C, 0x4002EA1F,0x99700B70, + 0x40166666,0x66666666, 0x4002EE73,0xDADC9B57, + 0x401670A3,0xD70A3D71, 0x4002F2C7,0x1F1548F4, + 0x40167AE1,0x47AE147B, 0x4002F719,0x66C7513E, + 0x4016851E,0xB851EB85, 0x4002FB6A,0xB29F2BFD, + 0x40168F5C,0x28F5C28F, 0x4002FFBB,0x03488D00, + 0x40169999,0x9999999A, 0x4003040A,0x596E6555, + 0x4016A3D7,0x0A3D70A4, 0x40030858,0xB5BAE47C, + 0x4016AE14,0x7AE147AE, 0x40030CA6,0x18D7799F, + 0x4016B851,0xEB851EB8, 0x400310F2,0x836CD4BA, + 0x4016C28F,0x5C28F5C3, 0x4003153D,0xF622E7D0, + 0x4016CCCC,0xCCCCCCCD, 0x40031988,0x71A0E80E, + 0x4016D70A,0x3D70A3D7, 0x40031DD1,0xF68D4EFC, + 0x4016E147,0xAE147AE1, 0x4003221A,0x858DDB9D, + 0x4016EB85,0x1EB851EC, 0x40032662,0x1F479396, + 0x4016F5C2,0x8F5C28F6, 0x40032AA8,0xC45EC450, + 0x40170000,0x00000000, 0x40032EEE,0x75770416, + 0x40170A3D,0x70A3D70A, 0x40033333,0x33333333, + 0x4017147A,0xE147AE14, 0x40033776,0xFE357D0C, + 0x40171EB8,0x51EB851F, 0x40033BB9,0xD71F593B, + 0x401728F5,0xC28F5C29, 0x40033FFB,0xBE918CA2, + 0x40173333,0x33333333, 0x4003443C,0xB52C2A85, + 0x40173D70,0xA3D70A3D, 0x4003487C,0xBB8E9595, + 0x401747AE,0x147AE148, 0x40034CBB,0xD2578108, + 0x401751EB,0x851EB852, 0x400350F9,0xFA24F1A0, + 0x40175C28,0xF5C28F5C, 0x40035537,0x33943EBD, + 0x40176666,0x66666666, 0x40035973,0x7F421360, + 0x401770A3,0xD70A3D71, 0x40035DAE,0xDDCA6F3C, + 0x40177AE1,0x47AE147B, 0x400361E9,0x4FC8A7B2, + 0x4017851E,0xB851EB85, 0x40036622,0xD5D768DE, + 0x40178F5C,0x28F5C28F, 0x40036A5B,0x7090B690, + 0x40179999,0x9999999A, 0x40036E93,0x208DED54, + 0x4017A3D7,0x0A3D70A4, 0x400372C9,0xE667C36B, + 0x4017AE14,0x7AE147AE, 0x400376FF,0xC2B649C7, + 0x4017B851,0xEB851EB8, 0x40037B34,0xB610ED09, + 0x4017C28F,0x5C28F5C3, 0x40037F68,0xC10E7675, + 0x4017CCCC,0xCCCCCCCD, 0x4003839B,0xE4450CE8, + 0x4017D70A,0x3D70A3D7, 0x400387CE,0x204A35D2, + 0x4017E147,0xAE147AE1, 0x40038BFF,0x75B2D623, + 0x4017EB85,0x1EB851EC, 0x4003902F,0xE513333D, + 0x4017F5C2,0x8F5C28F6, 0x4003945F,0x6EFEF3E5, + 0x40180000,0x00000000, 0x4003988E,0x1409212E, + 0x40180A3D,0x70A3D70A, 0x40039CBB,0xD4C42766, + 0x4018147A,0xE147AE14, 0x4003A0E8,0xB1C1D6FE, + 0x40181EB8,0x51EB851F, 0x4003A514,0xAB936573, + 0x401828F5,0xC28F5C29, 0x4003A93F,0xC2C96E34, + 0x40183333,0x33333333, 0x4003AD69,0xF7F3F385, + 0x40183D70,0xA3D70A3D, 0x4003B193,0x4BA25F66, + 0x401847AE,0x147AE148, 0x4003B5BB,0xBE63846E, + 0x401851EB,0x851EB852, 0x4003B9E3,0x50C59EAE, + 0x40185C28,0xF5C28F5C, 0x4003BE0A,0x03565490, + 0x40186666,0x66666666, 0x4003C22F,0xD6A2B7B1, + 0x401870A3,0xD70A3D71, 0x4003C654,0xCB3745BA, + 0x40187AE1,0x47AE147B, 0x4003CA78,0xE19FE93C, + 0x4018851E,0xB851EB85, 0x4003CE9C,0x1A67FA85, + 0x40188F5C,0x28F5C28F, 0x4003D2BE,0x761A4077, + 0x40189999,0x9999999A, 0x4003D6DF,0xF540F15E, + 0x4018A3D7,0x0A3D70A4, 0x4003DB00,0x9865B3BD, + 0x4018AE14,0x7AE147AE, 0x4003DF20,0x60119F23, + 0x4018B851,0xEB851EB8, 0x4003E33F,0x4CCD3CFB, + 0x4018C28F,0x5C28F5C3, 0x4003E75D,0x5F20895A, + 0x4018CCCC,0xCCCCCCCD, 0x4003EB7A,0x9792F3C6, + 0x4018D70A,0x3D70A3D7, 0x4003EF96,0xF6AB600B, + 0x4018E147,0xAE147AE1, 0x4003F3B2,0x7CF026FA, + 0x4018EB85,0x1EB851EC, 0x4003F7CD,0x2AE7173A, + 0x4018F5C2,0x8F5C28F6, 0x4003FBE7,0x01157608, + 0x40190000,0x00000000, 0x40040000,0x00000000, + 0x40190A3D,0x70A3D70A, 0x40040418,0x282AE9E0, + 0x4019147A,0xE147AE14, 0x4004082F,0x7A19E149, + 0x40191EB8,0x51EB851F, 0x40040C45,0xF6500D83, + 0x401928F5,0xC28F5C29, 0x4004105B,0x9D501039, + 0x40193333,0x33333333, 0x40041470,0x6F9C063A, + 0x40193D70,0xA3D70A3D, 0x40041884,0x6DB58834, + 0x401947AE,0x147AE148, 0x40041C97,0x981DAB71, + 0x401951EB,0x851EB852, 0x400420A9,0xEF550290, + 0x40195C28,0xF5C28F5C, 0x400424BB,0x73DB9E40, + 0x40196666,0x66666666, 0x400428CC,0x26310DF4, + 0x401970A3,0xD70A3D71, 0x40042CDC,0x06D4609E, + 0x40197AE1,0x47AE147B, 0x400430EB,0x1644255E, + 0x4019851E,0xB851EB85, 0x400434F9,0x54FE6C3B, + 0x40198F5C,0x28F5C28F, 0x40043906,0xC380C6D4, + 0x40199999,0x9999999A, 0x40043D13,0x6248490F, + 0x4019A3D7,0x0A3D70A4, 0x4004411F,0x31D189CC, + 0x4019AE14,0x7AE147AE, 0x4004452A,0x3298A391, + 0x4019B851,0xEB851EB8, 0x40044934,0x65193539, + 0x4019C28F,0x5C28F5C3, 0x40044D3D,0xC9CE62A3, + 0x4019CCCC,0xCCCCCCCD, 0x40045146,0x6132D554, + 0x4019D70A,0x3D70A3D7, 0x4004554E,0x2BC0BD2C, + 0x4019E147,0xAE147AE1, 0x40045955,0x29F1D108, + 0x4019EB85,0x1EB851EC, 0x40045D5B,0x5C3F4F6B, + 0x4019F5C2,0x8F5C28F6, 0x40046160,0xC321FF25, + 0x401A0000,0x00000000, 0x40046565,0x5F122FF6, + 0x401A0A3D,0x70A3D70A, 0x40046969,0x3087BB36, + 0x401A147A,0xE147AE14, 0x40046D6C,0x37FA0475, + 0x401A1EB8,0x51EB851F, 0x4004716E,0x75DFFA1C, + 0x401A28F5,0xC28F5C29, 0x4004756F,0xEAB01610, + 0x401A3333,0x33333333, 0x40047970,0x96E05E52, + 0x401A3D70,0xA3D70A3D, 0x40047D70,0x7AE6659A, + 0x401A47AE,0x147AE148, 0x4004816F,0x97374BF7, + 0x401A51EB,0x851EB852, 0x4004856D,0xEC47BF6D, + 0x401A5C28,0xF5C28F5C, 0x4004896B,0x7A8BFC8B, + 0x401A6666,0x66666666, 0x40048D68,0x4277CF0B, + 0x401A70A3,0xD70A3D71, 0x40049164,0x447E9266, + 0x401A7AE1,0x47AE147B, 0x4004955F,0x81133271, + 0x401A851E,0xB851EB85, 0x40049959,0xF8A82BEF, + 0x401A8F5C,0x28F5C28F, 0x40049D53,0xABAF8D2C, + 0x401A9999,0x9999999A, 0x4004A14C,0x9A9AF68E, + 0x401AA3D7,0x0A3D70A4, 0x4004A544,0xC5DB9B2B, + 0x401AAE14,0x7AE147AE, 0x4004A93C,0x2DE2415C, + 0x401AB851,0xEB851EB8, 0x4004AD32,0xD31F434E, + 0x401AC28F,0x5C28F5C3, 0x4004B128,0xB6028F96, + 0x401ACCCC,0xCCCCCCCD, 0x4004B51D,0xD6FBA9BB, + 0x401AD70A,0x3D70A3D7, 0x4004B912,0x3679AACC, + 0x401AE147,0xAE147AE1, 0x4004BD05,0xD4EB41E9, + 0x401AEB85,0x1EB851EC, 0x4004C0F8,0xB2BEB4D5, + 0x401AF5C2,0x8F5C28F6, 0x4004C4EA,0xD061E07A, + 0x401B0000,0x00000000, 0x4004C8DC,0x2E423980, + 0x401B0A3D,0x70A3D70A, 0x4004CCCC,0xCCCCCCCD, + 0x401B147A,0xE147AE14, 0x4004D0BC,0xAC6E4014, + 0x401B1EB8,0x51EB851F, 0x4004D4AB,0xCD92D25C, + 0x401B28F5,0xC28F5C29, 0x4004D89A,0x30A65C87, + 0x401B3333,0x33333333, 0x4004DC87,0xD61451DA, + 0x401B3D70,0xA3D70A3D, 0x4004E074,0xBE47C083, + 0x401B47AE,0x147AE148, 0x4004E460,0xE9AB521D, + 0x401B51EB,0x851EB852, 0x4004E84C,0x58A94C32, + 0x401B5C28,0xF5C28F5C, 0x4004EC37,0x0BAB90C4, + 0x401B6666,0x66666666, 0x4004F021,0x031B9ECA, + 0x401B70A3,0xD70A3D71, 0x4004F40A,0x3F6292B3, + 0x401B7AE1,0x47AE147B, 0x4004F7F2,0xC0E926E9, + 0x401B851E,0xB851EB85, 0x4004FBDA,0x8817B44D, + 0x401B8F5C,0x28F5C28F, 0x4004FFC1,0x955632B8, + 0x401B9999,0x9999999A, 0x400503A7,0xE90C397B, + 0x401BA3D7,0x0A3D70A4, 0x4005078D,0x83A0FFD7, + 0x401BAE14,0x7AE147AE, 0x40050B72,0x657B5D7E, + 0x401BB851,0xEB851EB8, 0x40050F56,0x8F01CB10, + 0x401BC28F,0x5C28F5C3, 0x4005133A,0x009A6290, + 0x401BCCCC,0xCCCCCCCD, 0x4005171C,0xBAAADFE2, + 0x401BD70A,0x3D70A3D7, 0x40051AFE,0xBD98A145, + 0x401BE147,0xAE147AE1, 0x40051EE0,0x09C8A7CA, + 0x401BEB85,0x1EB851EC, 0x400522C0,0x9F9F97CC, + 0x401BF5C2,0x8F5C28F6, 0x400526A0,0x7F81B966, + 0x401C0000,0x00000000, 0x40052A7F,0xA9D2F8EA, + 0x401C0A3D,0x70A3D70A, 0x40052E5E,0x1EF6E758, + 0x401C147A,0xE147AE14, 0x4005323B,0xDF50BAD1, + 0x401C1EB8,0x51EB851F, 0x40053618,0xEB434F0B, + 0x401C28F5,0xC28F5C29, 0x400539F5,0x433125C3, + 0x401C3333,0x33333333, 0x40053DD0,0xE77C6734, + 0x401C3D70,0xA3D70A3D, 0x400541AB,0xD886E283, + 0x401C47AE,0x147AE148, 0x40054586,0x16B20E33, + 0x401C51EB,0x851EB852, 0x4005495F,0xA25F0897, + 0x401C5C28,0xF5C28F5C, 0x40054D38,0x7BEE983C, + 0x401C6666,0x66666666, 0x40055110,0xA3C12C5E, + 0x401C70A3,0xD70A3D71, 0x400554E8,0x1A36DD53, + 0x401C7AE1,0x47AE147B, 0x400558BE,0xDFAF6CF9, + 0x401C851E,0xB851EB85, 0x40055C94,0xF48A4723, + 0x401C8F5C,0x28F5C28F, 0x4005606A,0x59268203, + 0x401C9999,0x9999999A, 0x4005643F,0x0DE2DE9A, + 0x401CA3D7,0x0A3D70A4, 0x40056813,0x131DC91E, + 0x401CAE14,0x7AE147AE, 0x40056BE6,0x69355968, + 0x401CB851,0xEB851EB8, 0x40056FB9,0x10875359, + 0x401CC28F,0x5C28F5C3, 0x4005738B,0x09712747, + 0x401CCCCC,0xCCCCCCCD, 0x4005775C,0x544FF263, + 0x401CD70A,0x3D70A3D7, 0x40057B2C,0xF1807F20, + 0x401CE147,0xAE147AE1, 0x40057EFC,0xE15F459C, + 0x401CEB85,0x1EB851EC, 0x400582CC,0x24486C03, + 0x401CF5C2,0x8F5C28F6, 0x4005869A,0xBA97C6F7, + 0x401D0000,0x00000000, 0x40058A68,0xA4A8D9F3, + 0x401D0A3D,0x70A3D70A, 0x40058E35,0xE2D6D7B3, + 0x401D147A,0xE147AE14, 0x40059202,0x757CA292, + 0x401D1EB8,0x51EB851F, 0x400595CE,0x5CF4CCF2, + 0x401D28F5,0xC28F5C29, 0x40059999,0x9999999A, + 0x401D3333,0x33333333, 0x40059D64,0x2BC4FC1C, + 0x401D3D70,0xA3D70A3D, 0x4005A12E,0x13D09934, + 0x401D47AE,0x147AE148, 0x4005A4F7,0x5215C72B, + 0x401D51EB,0x851EB852, 0x4005A8BF,0xE6ED8E2F, + 0x401D5C28,0xF5C28F5C, 0x4005AC87,0xD2B0A8BF, + 0x401D6666,0x66666666, 0x4005B04F,0x15B783FF, + 0x401D70A3,0xD70A3D71, 0x4005B415,0xB05A401C, + 0x401D7AE1,0x47AE147B, 0x4005B7DB,0xA2F0B0A8, + 0x401D851E,0xB851EB85, 0x4005BBA0,0xEDD25CF8, + 0x401D8F5C,0x28F5C28F, 0x4005BF65,0x9156807D, + 0x401D9999,0x9999999A, 0x4005C329,0x8DD40B25, + 0x401DA3D7,0x0A3D70A4, 0x4005C6EC,0xE3A1A1B5, + 0x401DAE14,0x7AE147AE, 0x4005CAAF,0x93159E20, + 0x401DB851,0xEB851EB8, 0x4005CE71,0x9C860FE7, + 0x401DC28F,0x5C28F5C3, 0x4005D233,0x0048BC6E, + 0x401DCCCC,0xCCCCCCCD, 0x4005D5F3,0xBEB31F59, + 0x401DD70A,0x3D70A3D7, 0x4005D9B3,0xD81A6AE1, + 0x401DE147,0xAE147AE1, 0x4005DD73,0x4CD38830, + 0x401DEB85,0x1EB851EC, 0x4005E132,0x1D3317B6, + 0x401DF5C2,0x8F5C28F6, 0x4005E4F0,0x498D717F, + 0x401E0000,0x00000000, 0x4005E8AD,0xD236A58F, + 0x401E0A3D,0x70A3D70A, 0x4005EC6A,0xB7827C31, + 0x401E147A,0xE147AE14, 0x4005F026,0xF9C47652, + 0x401E1EB8,0x51EB851F, 0x4005F3E2,0x994FCDD2, + 0x401E28F5,0xC28F5C29, 0x4005F79D,0x967775DC, + 0x401E3333,0x33333333, 0x4005FB57,0xF18E1B39, + 0x401E3D70,0xA3D70A3D, 0x4005FF11,0xAAE624A0, + 0x401E47AE,0x147AE148, 0x400602CA,0xC2D1B30F, + 0x401E51EB,0x851EB852, 0x40060683,0x39A2A218, + 0x401E5C28,0xF5C28F5C, 0x40060A3B,0x0FAA8838, + 0x401E6666,0x66666666, 0x40060DF2,0x453AB723, + 0x401E70A3,0xD70A3D71, 0x400611A8,0xDAA43C1C, + 0x401E7AE1,0x47AE147B, 0x4006155E,0xD037E03D, + 0x401E851E,0xB851EB85, 0x40061914,0x264628CF, + 0x401E8F5C,0x28F5C28F, 0x40061CC8,0xDD1F5796, + 0x401E9999,0x9999999A, 0x4006207C,0xF5136B20, + 0x401EA3D7,0x0A3D70A4, 0x40062430,0x6E721F12, + 0x401EAE14,0x7AE147AE, 0x400627E3,0x498AEC7C, + 0x401EB851,0xEB851EB8, 0x40062B95,0x86AD0A22, + 0x401EC28F,0x5C28F5C3, 0x40062F47,0x26276CCA, + 0x401ECCCC,0xCCCCCCCD, 0x400632F8,0x2848C789, + 0x401ED70A,0x3D70A3D7, 0x400636A8,0x8D5F8C11, + 0x401EE147,0xAE147AE1, 0x40063A58,0x55B9EAFB, + 0x401EEB85,0x1EB851EC, 0x40063E07,0x81A5D413, + 0x401EF5C2,0x8F5C28F6, 0x400641B6,0x1170F6A5, + 0x401F0000,0x00000000, 0x40064564,0x0568C1C3, + 0x401F0A3D,0x70A3D70A, 0x40064911,0x5DDA6496, + 0x401F147A,0xE147AE14, 0x40064CBE,0x1B12CEA2, + 0x401F1EB8,0x51EB851F, 0x4006506A,0x3D5EB010, + 0x401F28F5,0xC28F5C29, 0x40065415,0xC50A79FB, + 0x401F3333,0x33333333, 0x400657C0,0xB2625EB4, + 0x401F3D70,0xA3D70A3D, 0x40065B6B,0x05B2520D, + 0x401F47AE,0x147AE148, 0x40065F14,0xBF4609A0, + 0x401F51EB,0x851EB852, 0x400662BD,0xDF68FD14, + 0x401F5C28,0xF5C28F5C, 0x40066666,0x66666666, + 0x401F6666,0x66666666, 0x40066A0E,0x54894232, + 0x401F70A3,0xD70A3D71, 0x40066DB5,0xAA1C4FF4, + 0x401F7AE1,0x47AE147B, 0x4006715C,0x676A124F, + 0x401F851E,0xB851EB85, 0x40067502,0x8CBCCF54, + 0x401F8F5C,0x28F5C28F, 0x400678A8,0x1A5E90C8, + 0x401F9999,0x9999999A, 0x40067C4D,0x10992464, + 0x401FA3D7,0x0A3D70A4, 0x40067FF1,0x6FB61C1C, + 0x401FAE14,0x7AE147AE, 0x40068395,0x37FECE62, + 0x401FB851,0xEB851EB8, 0x40068738,0x69BC566A, + 0x401FC28F,0x5C28F5C3, 0x40068ADB,0x0537946E, + 0x401FCCCC,0xCCCCCCCD, 0x40068E7D,0x0AB92DEC, + 0x401FD70A,0x3D70A3D7, 0x4006921E,0x7A898DED, + 0x401FE147,0xAE147AE1, 0x400695BF,0x54F0E543, + 0x401FEB85,0x1EB851EC, 0x4006995F,0x9A372AD0, + 0x401FF5C2,0x8F5C28F6, 0x40069CFF,0x4AA41BBF, + }; +/* +LOCAL_D const TUint32 ArctanTest[] = + { + 0x00000000,0x00000000, 0x00000000,0x00000000, + 0x3F847AE1,0x47AE147B, 0x3F847AB4,0x8B1EFB5D, + 0x3F947AE1,0x47AE147B, 0x3F947A2E,0x5DAFFF07, + 0x3F9EB851,0xEB851EB8, 0x3F9EB5F6,0x44234B83, + 0x3FA47AE1,0x47AE147B, 0x3FA47816,0x23768D56, + 0x3FA99999,0x9999999A, 0x3FA99425,0x97929F27, + 0x3FAEB851,0xEB851EB8, 0x3FAEAEE7,0x34B5DD23, + 0x3FB1EB85,0x1EB851EC, 0x3FB1E40C,0x8B780FDE, + 0x3FB47AE1,0x47AE147B, 0x3FB46FBC,0xE9DFCC00, + 0x3FB70A3D,0x70A3D70A, 0x3FB6FA64,0x46B1CB54, + 0x3FB99999,0x9999999A, 0x3FB983E2,0x82E2CC4D, + 0x3FBC28F5,0xC28F5C29, 0x3FBC0C17,0xD875967A, + 0x3FBEB851,0xEB851EB8, 0x3FBE92E4,0xE371F679, + 0x3FC0A3D7,0x0A3D70A4, 0x3FC08C15,0x5549DC84, + 0x3FC1EB85,0x1EB851EC, 0x3FC1CDE5,0x53D5FE66, + 0x3FC33333,0x33333333, 0x3FC30ED3,0x67D7CD04, + 0x3FC47AE1,0x47AE147B, 0x3FC44ED0,0xCD36E62E, + 0x3FC5C28F,0x5C28F5C3, 0x3FC58DCF,0x04F55E58, + 0x3FC70A3D,0x70A3D70A, 0x3FC6CBBF,0xD8ACFF50, + 0x3FC851EB,0x851EB852, 0x3FC80895,0x5DDAC693, + 0x3FC99999,0x9999999A, 0x3FC94441,0xF8F7260C, + 0x3FCAE147,0xAE147AE1, 0x3FCA7EB8,0x6059C7DA, + 0x3FCC28F5,0xC28F5C29, 0x3FCBB7EB,0x9EE7D317, + 0x3FCD70A3,0xD70A3D71, 0x3FCCEFCF,0x168BED03, + 0x3FCEB851,0xEB851EB8, 0x3FCE2656,0x82776E76, + 0x3FD00000,0x00000000, 0x3FCF5B75,0xF92C80DD, + 0x3FD0A3D7,0x0A3D70A4, 0x3FD04790,0xF72887D4, + 0x3FD147AE,0x147AE148, 0x3FD0E0A7,0x9A2559AF, + 0x3FD1EB85,0x1EB851EC, 0x3FD178F9,0x7ED1F891, + 0x3FD28F5C,0x28F5C28F, 0x3FD21081,0x6F1DAE81, + 0x3FD33333,0x33333333, 0x3FD2A73A,0x661EAF06, + 0x3FD3D70A,0x3D70A3D7, 0x3FD33D1F,0x9074C099, + 0x3FD47AE1,0x47AE147B, 0x3FD3D22C,0x4C92395D, + 0x3FD51EB8,0x51EB851F, 0x3FD4665C,0x2AEBEED4, + 0x3FD5C28F,0x5C28F5C3, 0x3FD4F9AA,0xEE10CA82, + 0x3FD66666,0x66666666, 0x3FD58C14,0x8AA9C5D6, + 0x3FD70A3D,0x70A3D70A, 0x3FD61D95,0x27631EA9, + 0x3FD7AE14,0x7AE147AE, 0x3FD6AE29,0x1CBFA274, + 0x3FD851EB,0x851EB852, 0x3FD73DCC,0xF4D6FA15, + 0x3FD8F5C2,0x8F5C28F6, 0x3FD7CC7D,0x6AFFE959, + 0x3FD99999,0x9999999A, 0x3FD85A37,0x6B677DC0, + 0x3FDA3D70,0xA3D70A3D, 0x3FD8E6F8,0x12962E4E, + 0x3FDAE147,0xAE147AE1, 0x3FD972BC,0xACE3F311, + 0x3FDB851E,0xB851EB85, 0x3FD9FD82,0xB5DC5E5F, + 0x3FDC28F5,0xC28F5C29, 0x3FDA8747,0xD793C3DC, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FDB1009,0xE9EE79BC, + 0x3FDD70A3,0xD70A3D71, 0x3FDB97C6,0xF1DB4032, + 0x3FDE147A,0xE147AE14, 0x3FDC1E7D,0x2081D8E2, + 0x3FDEB851,0xEB851EB8, 0x3FDCA42A,0xD266D56F, + 0x3FDF5C28,0xF5C28F5C, 0x3FDD28CE,0x8E859FEF, + 0x3FE00000,0x00000000, 0x3FDDAC67,0x0561BB4F, + 0x3FE051EB,0x851EB852, 0x3FDE2EF3,0x101033DF, + 0x3FE0A3D7,0x0A3D70A4, 0x3FDEB071,0xAF3A3191, + 0x3FE0F5C2,0x8F5C28F6, 0x3FDF30E2,0x0A199675, + 0x3FE147AE,0x147AE148, 0x3FDFB043,0x6D708C0A, + 0x3FE19999,0x9999999A, 0x3FE0174A,0xA53E6CE4, + 0x3FE1EB85,0x1EB851EC, 0x3FE055EB,0x9AF3EB4B, + 0x3FE23D70,0xA3D70A3D, 0x3FE09404,0x7359DEEB, + 0x3FE28F5C,0x28F5C28F, 0x3FE0D195,0x1A9393B7, + 0x3FE2E147,0xAE147AE1, 0x3FE10E9D,0x8CDBAC48, + 0x3FE33333,0x33333333, 0x3FE14B1D,0xD5F90CE1, + 0x3FE3851E,0xB851EB85, 0x3FE18716,0x10B3DA41, + 0x3FE3D70A,0x3D70A3D7, 0x3FE1C286,0x664AD8C9, + 0x3FE428F5,0xC28F5C29, 0x3FE1FD6F,0x0DE97388, + 0x3FE47AE1,0x47AE147B, 0x3FE237D0,0x4C1EAE02, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FE271AA,0x72553ED5, + 0x3FE51EB8,0x51EB851F, 0x3FE2AAFD,0xDE4D0C9F, + 0x3FF80000,0x00000000, 0x3FEF730B,0xD281F69B, + 0x3FF828F5,0xC28F5C29, 0x3FEF8C22,0xEEB07043, + 0x3FF851EB,0x851EB852, 0x3FEFA4FF,0x2D0F34B7, + 0x3FF87AE1,0x47AE147B, 0x3FEFBDA1,0x3E3D8F55, + 0x3FF8A3D7,0x0A3D70A4, 0x3FEFD609,0xD0B7BEFF, + 0x3FF8CCCC,0xCCCCCCCD, 0x3FEFEE39,0x90DAD712, + 0x3FF8F5C2,0x8F5C28F6, 0x3FF00318,0x947462A0, + 0x3FF91EB8,0x51EB851F, 0x3FF00EF8,0xA0863CC4, + 0x3FF947AE,0x147AE148, 0x3FF01ABD,0x3FAF16B2, + 0x3FF970A3,0xD70A3D71, 0x3FF02666,0xC3F3E3E9, + 0x3FF99999,0x9999999A, 0x3FF031F5,0x7E54ADBE, + 0x3FF9C28F,0x5C28F5C3, 0x3FF03D69,0xBECEDE6D, + 0x3FF9EB85,0x1EB851EC, 0x3FF048C3,0xD45F96F8, + 0x3FFA147A,0xE147AE14, 0x3FF05404,0x0D060ED1, + 0x3FFA3D70,0xA3D70A3D, 0x3FF05F2A,0xB5C5FC40, + 0x3FFA6666,0x66666666, 0x3FF06A38,0x1AAA0497, + 0x3FFA8F5C,0x28F5C28F, 0x3FF0752C,0x86C63350, + 0x3FFAB851,0xEB851EB8, 0x3FF08008,0x443A7731, + 0x3FFAE147,0xAE147AE1, 0x3FF08ACB,0x9C3524A3, + 0x3FFB0A3D,0x70A3D70A, 0x3FF09576,0xD6F57C81, + 0x3FFB3333,0x33333333, 0x3FF0A00A,0x3BCE369F, + 0x3FFB5C28,0xF5C28F5C, 0x3FF0AA86,0x11280F54, + 0x3FFB851E,0xB851EB85, 0x3FF0B4EA,0x9C845764, + 0x3FFBAE14,0x7AE147AE, 0x3FF0BF38,0x227F85AD, + 0x3FFBD70A,0x3D70A3D7, 0x3FF0C96E,0xE6D3CA01, + 0x3FFC0000,0x00000000, 0x3FF0D38F,0x2C5BA09F, + 0x3FFC28F5,0xC28F5C29, 0x3FF0DD99,0x351465C6, + 0x3FFC51EB,0x851EB852, 0x3FF0E78D,0x4220E8EF, + 0x3FFC7AE1,0x47AE147B, 0x3FF0F16B,0x93CBFF2A, + 0x3FFCA3D7,0x0A3D70A4, 0x3FF0FB34,0x698B1438, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF104E8,0x0200BA00, + 0x3FFCF5C2,0x8F5C28F6, 0x3FF10E86,0x9AFF35F2, + 0x3FFD1EB8,0x51EB851F, 0x3FF11810,0x718B0C06, + 0x3FFD47AE,0x147AE148, 0x3FF12185,0xC1DD8701, + 0x3FFD70A3,0xD70A3D71, 0x3FF12AE6,0xC7673DAB, + 0x3FFD9999,0x9999999A, 0x3FF13433,0xBCD294B5, + 0x3FFDC28F,0x5C28F5C3, 0x3FF13D6C,0xDC063D05, + 0x3FFDEB85,0x1EB851EC, 0x3FF14692,0x5E27AE23, + 0x3FFE147A,0xE147AE14, 0x3FF14FA4,0x7B9D9C95, + 0x3FFE3D70,0xA3D70A3D, 0x3FF158A3,0x6C126BF2, + 0x3FFE6666,0x66666666, 0x3FF1618F,0x66769C69, + 0x3FFE8F5C,0x28F5C28F, 0x3FF16A68,0xA10333A9, + 0x3FFEB851,0xEB851EB8, 0x3FF1732F,0x513C20E4, + 0x3FFEE147,0xAE147AE1, 0x3FF17BE3,0xABF29BCE, + 0x3FFF0A3D,0x70A3D70A, 0x3FF18485,0xE5477E85, + 0x3FFF3333,0x33333333, 0x3FF18D16,0x30AD9A1A, + 0x3FFF5C28,0xF5C28F5C, 0x3FF19594,0xC0EC05CA, + 0x3FFF851E,0xB851EB85, 0x3FF19E01,0xC82068A8, + 0x3FFFAE14,0x7AE147AE, 0x3FF1A65D,0x77C13DAE, + 0x3FFFD70A,0x3D70A3D7, 0x3FF1AEA8,0x00A01226, + 0x40000000,0x00000000, 0x3FF1B6E1,0x92EBBE44, + 0x4000147A,0xE147AE14, 0x3FF1BF0A,0x5E3297F5, + 0x400028F5,0xC28F5C29, 0x3FF1C722,0x91649FC2, + 0x40003D70,0xA3D70A3D, 0x3FF1CF2A,0x5AD5A7C5, + 0x400051EB,0x851EB852, 0x3FF1D721,0xE83F74A2, + 0x40006666,0x66666666, 0x3FF1DF09,0x66C3D878, + 0x40007AE1,0x47AE147B, 0x3FF1E6E1,0x02EEC7CB, + 0x40008F5C,0x28F5C28F, 0x3FF1EEA8,0xE8B8684D, + 0x4000A3D7,0x0A3D70A4, 0x3FF1F661,0x438719A2, + 0x4000B851,0xEB851EB8, 0x3FF1FE0A,0x3E3177FA, + 0x4000CCCC,0xCCCCCCCD, 0x3FF205A4,0x03005899, + 0x4000E147,0xAE147AE1, 0x3FF20D2E,0xBBB0C03D, + 0x4000F5C2,0x8F5C28F6, 0x3FF214AA,0x9175D36D, + 0x40010A3D,0x70A3D70A, 0x3FF21C17,0xACFAC0AB, + 0x40011EB8,0x51EB851F, 0x3FF22376,0x3664A496, + 0x40013333,0x33333333, 0x3FF22AC6,0x555467F6, + 0x400147AE,0x147AE148, 0x3FF23208,0x30E897BB, + 0x40015C28,0xF5C28F5C, 0x3FF2393B,0xEFBF36F9, + 0x400170A3,0xD70A3D71, 0x3FF24061,0xB7F78AE4, + 0x4001851E,0xB851EB85, 0x3FF24779,0xAF33E0D0, + 0x40019999,0x9999999A, 0x3FF24E83,0xFA9B4E48, + 0x4001AE14,0x7AE147AE, 0x3FF25580,0xBEDB6B38, + 0x4001C28F,0x5C28F5C3, 0x3FF25C70,0x202A063E, + 0x4001D70A,0x3D70A3D7, 0x3FF26352,0x4246D324, + 0x4001EB85,0x1EB851EC, 0x3FF26A27,0x487D139A, + 0x40020000,0x00000000, 0x3FF270EF,0x55A53A25, + 0x4002147A,0xE147AE14, 0x3FF277AA,0x8C26876B, + 0x400228F5,0xC28F5C29, 0x3FF27E59,0x0DF8A1D2, + 0x40023D70,0xA3D70A3D, 0x3FF284FA,0xFCA52783, + 0x400251EB,0x851EB852, 0x3FF28B90,0x79493AE7, + 0x40026666,0x66666666, 0x3FF29219,0xA49709A1, + 0x40027AE1,0x47AE147B, 0x3FF29896,0x9ED74E17, + 0x40028F5C,0x28F5C28F, 0x3FF29F07,0x87EACB94, + 0x4002A3D7,0x0A3D70A4, 0x3FF2A56C,0x7F4BC517, + 0x4002B851,0xEB851EB8, 0x3FF2ABC5,0xA40F6ED6, + 0x4002CCCC,0xCCCCCCCD, 0x3FF2B213,0x14E75A87, + 0x4002E147,0xAE147AE1, 0x3FF2B854,0xF022DE7D, + 0x4002F5C2,0x8F5C28F6, 0x3FF2BE8B,0x53B077A8, + 0x40030A3D,0x70A3D70A, 0x3FF2C4B6,0x5D1F2682, + 0x40031EB8,0x51EB851F, 0x3FF2CAD6,0x299FC702, + 0x40033333,0x33333333, 0x3FF2D0EA,0xD6066395, + 0x400347AE,0x147AE148, 0x3FF2D6F4,0x7ECB833A, + 0x40035C28,0xF5C28F5C, 0x3FF2DCF3,0x400D72C6, + 0x400370A3,0xD70A3D71, 0x3FF2E2E7,0x35918965, + 0x4003851E,0xB851EB85, 0x3FF2E8D0,0x7AC56862, + 0x40039999,0x9999999A, 0x3FF2EEAF,0x2AC0364C, + 0x4003AE14,0x7AE147AE, 0x3FF2F483,0x6043D57D, + 0x4003C28F,0x5C28F5C3, 0x3FF2FA4D,0x35BE1618, + 0x4003D70A,0x3D70A3D7, 0x3FF3000C,0xC549E391, + 0x4003EB85,0x1EB851EC, 0x3FF305C2,0x28B06DC2, + 0x40040000,0x00000000, 0x3FF30B6D,0x796A4DA8, + 0x4004147A,0xE147AE14, 0x3FF3110E,0xD0A0A5D0, + 0x400428F5,0xC28F5C29, 0x3FF316A6,0x472E3E7F, + 0x40043D70,0xA3D70A3D, 0x3FF31C33,0xF5A09DB2, + 0x400451EB,0x851EB852, 0x3FF321B7,0xF4391AF3, + 0x40046666,0x66666666, 0x3FF32732,0x5AEDEF1D, + 0x40047AE1,0x47AE147B, 0x3FF32CA3,0x416B401A, + 0x40048F5C,0x28F5C28F, 0x3FF3320A,0xBF1428A7, + 0x4004A3D7,0x0A3D70A4, 0x3FF33768,0xEB03BC31, + 0x4004B851,0xEB851EB8, 0x3FF33CBD,0xDC0E06D0, + 0x4004CCCC,0xCCCCCCCD, 0x3FF34209,0xA8C10980, + 0x4004E147,0xAE147AE1, 0x3FF3474C,0x6765B28B, + 0x4004F5C2,0x8F5C28F6, 0x3FF34C86,0x2E00D24E, + 0x40050A3D,0x70A3D70A, 0x3FF351B7,0x12540C4D, + 0x40051EB8,0x51EB851F, 0x3FF356DF,0x29DEC4B8, + 0x40053333,0x33333333, 0x3FF35BFE,0x89DF0A64, + 0x400547AE,0x147AE148, 0x3FF36115,0x47527D45, + 0x40055C28,0xF5C28F5C, 0x3FF36623,0x76F73175, + 0x400570A3,0xD70A3D71, 0x3FF36B29,0x2D4C8EE0, + 0x4005851E,0xB851EB85, 0x3FF37026,0x7E942D93, + 0x40059999,0x9999999A, 0x3FF3751B,0x7ED2AEC1, + 0x4005AE14,0x7AE147AE, 0x3FF37A08,0x41D0928E, + 0x4005C28F,0x5C28F5C3, 0x3FF37EEC,0xDB1B0AA9, + 0x4005D70A,0x3D70A3D7, 0x3FF383C9,0x5E04C9B9, + 0x4005EB85,0x1EB851EC, 0x3FF3889D,0xDDA6CFBC, + 0x40060000,0x00000000, 0x3FF38D6A,0x6CE13353, + 0x4006147A,0xE147AE14, 0x3FF3922F,0x1E5BE80C, + 0x400628F5,0xC28F5C29, 0x3FF396EC,0x048781BA, + 0x40063D70,0xA3D70A3D, 0x3FF39BA1,0x319DF4DD, + 0x400651EB,0x851EB852, 0x3FF3A04E,0xB7A35432, + 0x40066666,0x66666666, 0x3FF3A4F4,0xA8668B69, + 0x40067AE1,0x47AE147B, 0x3FF3A993,0x15821717, + 0x40068F5C,0x28F5C28F, 0x3FF3AE2A,0x105CB9E3, + 0x4006A3D7,0x0A3D70A4, 0x3FF3B2B9,0xAA2A2F0B, + 0x4006B851,0xEB851EB8, 0x3FF3B741,0xF3EBDA34, + 0x4006CCCC,0xCCCCCCCD, 0x3FF3BBC2,0xFE7174A3, + 0x4006E147,0xAE147AE1, 0x3FF3C03C,0xDA59B7E2, + 0x4006F5C2,0x8F5C28F6, 0x3FF3C4AF,0x981305D8, + 0x40070A3D,0x70A3D70A, 0x3FF3C91B,0x47DC0E63, + 0x40071EB8,0x51EB851F, 0x3FF3CD7F,0xF9C4727D, + 0x40073333,0x33333333, 0x3FF3D1DD,0xBDAD64F0, + 0x400747AE,0x147AE148, 0x3FF3D634,0xA34A48B1, + 0x40075C28,0xF5C28F5C, 0x3FF3DA84,0xBA214CD5, + 0x400770A3,0xD70A3D71, 0x3FF3DECE,0x118C0645, + 0x4007851E,0xB851EB85, 0x3FF3E310,0xB8B8071A, + 0x40079999,0x9999999A, 0x3FF3E74C,0xBEA773CD, + 0x4007AE14,0x7AE147AE, 0x3FF3EB82,0x32319624, + 0x4007C28F,0x5C28F5C3, 0x3FF3EFB1,0x22036DFF, + 0x4007D70A,0x3D70A3D7, 0x3FF3F3D9,0x9CA03FF5, + 0x4007EB85,0x1EB851EC, 0x3FF3F7FB,0xB06221E3, + 0x40080000,0x00000000, 0x3FF3FC17,0x6B7A8560, + 0x4008147A,0xE147AE14, 0x3FF4002C,0xDBF2C02B, + 0x400828F5,0xC28F5C29, 0x3FF4043C,0x0FAC9294, + 0x40083D70,0xA3D70A3D, 0x3FF40845,0x1462ABEF, + 0x400851EB,0x851EB852, 0x3FF40C47,0xF7A92D14, + 0x40086666,0x66666666, 0x3FF41044,0xC6EE28EF, + 0x40087AE1,0x47AE147B, 0x3FF4143B,0x8F7A2339, + 0x40088F5C,0x28F5C28F, 0x3FF4182C,0x5E708D48, + 0x4008A3D7,0x0A3D70A4, 0x3FF41C17,0x40D0411B, + 0x4008B851,0xEB851EB8, 0x3FF41FFC,0x4373FA89, + 0x4008CCCC,0xCCCCCCCD, 0x3FF423DB,0x7312CEBC, + 0x4008E147,0xAE147AE1, 0x3FF427B4,0xDC40A1DF, + 0x4008F5C2,0x8F5C28F6, 0x3FF42B88,0x8B6E9B1D, + 0x40090A3D,0x70A3D70A, 0x3FF42F56,0x8CEB96F3, + 0x40091EB8,0x51EB851F, 0x3FF4331E,0xECE497CD, + 0x40093333,0x33333333, 0x3FF436E1,0xB765350D, + 0x400947AE,0x147AE148, 0x3FF43A9E,0xF8580870, + 0x40095C28,0xF5C28F5C, 0x3FF43E56,0xBB8719D9, + 0x400970A3,0xD70A3D71, 0x3FF44209,0x0C9C4997, + 0x4009851E,0xB851EB85, 0x3FF445B5,0xF721B91A, + 0x40099999,0x9999999A, 0x3FF4495D,0x86823225, + 0x4009AE14,0x7AE147AE, 0x3FF44CFF,0xC6098C8B, + 0x4009C28F,0x5C28F5C3, 0x3FF4509C,0xC0E51269, + 0x4009D70A,0x3D70A3D7, 0x3FF45434,0x8223E2FA, + 0x4009EB85,0x1EB851EC, 0x3FF457C7,0x14B753F9, + 0x400A0000,0x00000000, 0x3FF45B54,0x837351A0, + 0x400A147A,0xE147AE14, 0x3FF45EDC,0xD90EBD46, + 0x400A28F5,0xC28F5C29, 0x3FF46260,0x2023CAA2, + 0x400A3D70,0xA3D70A3D, 0x3FF465DE,0x63305BBC, + 0x400A51EB,0x851EB852, 0x3FF46957,0xAC965B89, + 0x400A6666,0x66666666, 0x3FF46CCC,0x069C173F, + 0x400A7AE1,0x47AE147B, 0x3FF4703B,0x7B6C9666, + 0x400A8F5C,0x28F5C28F, 0x3FF473A6,0x1517F1A2, + 0x400AA3D7,0x0A3D70A4, 0x3FF4770B,0xDD93A84C, + 0x400AB851,0xEB851EB8, 0x3FF47A6C,0xDEBAF4C4, + 0x400ACCCC,0xCCCCCCCD, 0x3FF47DC9,0x224F1FA8, + 0x400AE147,0xAE147AE1, 0x3FF48120,0xB1F7D1C5, + 0x400AF5C2,0x8F5C28F6, 0x3FF48473,0x974364F3, + 0x400B0A3D,0x70A3D70A, 0x3FF487C1,0xDBA733C7, + 0x400B1EB8,0x51EB851F, 0x3FF48B0B,0x887FE81E, + 0x400B3333,0x33333333, 0x3FF48E50,0xA711C89D, + 0x400B47AE,0x147AE148, 0x3FF49191,0x4089050A, + 0x400B5C28,0xF5C28F5C, 0x3FF494CD,0x5DFA01A1, + 0x400B70A3,0xD70A3D71, 0x3FF49805,0x0861A150, + 0x400B851E,0xB851EB85, 0x3FF49B38,0x48A58EF0, + 0x400B9999,0x9999999A, 0x3FF49E67,0x27948576, + 0x400BAE14,0x7AE147AE, 0x3FF4A191,0xADE69723, + 0x400BC28F,0x5C28F5C3, 0x3FF4A4B7,0xE43D73B8, + 0x400BD70A,0x3D70A3D7, 0x3FF4A7D9,0xD324ADA9, + 0x400BEB85,0x1EB851EC, 0x3FF4AAF7,0x8311FE65, + 0x400C0000,0x00000000, 0x3FF4AE10,0xFC6589A5, + 0x400C147A,0xE147AE14, 0x3FF4B126,0x476A1FCA, + 0x400C28F5,0xC28F5C29, 0x3FF4B437,0x6C557F5A, + 0x400C3D70,0xA3D70A3D, 0x3FF4B744,0x7348958C, + 0x400C51EB,0x851EB852, 0x3FF4BA4D,0x644FBDF4, + 0x400C6666,0x66666666, 0x3FF4BD52,0x47630152, + 0x400C7AE1,0x47AE147B, 0x3FF4C053,0x2466537E, + 0x400C8F5C,0x28F5C28F, 0x3FF4C350,0x0329D080, + 0x400CA3D7,0x0A3D70A4, 0x3FF4C648,0xEB69F8CE, + 0x400CB851,0xEB851EB8, 0x3FF4C93D,0xE4CFECBA, + 0x400CCCCC,0xCCCCCCCD, 0x3FF4CC2E,0xF6F1A710, + 0x400CE147,0xAE147AE1, 0x3FF4CF1C,0x295236E4, + 0x400CF5C2,0x8F5C28F6, 0x3FF4D205,0x8361F89C, + 0x400D0A3D,0x70A3D70A, 0x3FF4D4EB,0x0C7ECE2F, + 0x400D1EB8,0x51EB851F, 0x3FF4D7CC,0xCBF456A3, + 0x400D3333,0x33333333, 0x3FF4DAAA,0xC8FC24CC, + 0x400D47AE,0x147AE148, 0x3FF4DD85,0x0ABDF549, + 0x400D5C28,0xF5C28F5C, 0x3FF4E05B,0x984FE3C9, + 0x400D70A3,0xD70A3D71, 0x3FF4E32E,0x78B69F9C, + 0x400D851E,0xB851EB85, 0x3FF4E5FD,0xB2E59F85, + 0x400D9999,0x9999999A, 0x3FF4E8C9,0x4DBF54E5, + 0x400DAE14,0x7AE147AE, 0x3FF4EB91,0x50155E2D, + 0x400DC28F,0x5C28F5C3, 0x3FF4EE55,0xC0A8B8AA, + 0x400DD70A,0x3D70A3D7, 0x3FF4F116,0xA629F1A2, + 0x400DEB85,0x1EB851EC, 0x3FF4F3D4,0x073956CA, + 0x400E0000,0x00000000, 0x3FF4F68D,0xEA672617, + 0x400E147A,0xE147AE14, 0x3FF4F944,0x5633BCEF, + 0x400E28F5,0xC28F5C29, 0x3FF4FBF7,0x510FC6B2, + 0x400E3D70,0xA3D70A3D, 0x3FF4FEA6,0xE15C6AAC, + 0x400E51EB,0x851EB852, 0x3FF50153,0x0D6B7969, + 0x400E6666,0x66666666, 0x3FF503FB,0xDB7F996E, + 0x400E7AE1,0x47AE147B, 0x3FF506A1,0x51CC735C, + 0x400E8F5C,0x28F5C28F, 0x3FF50943,0x7676DD80, + 0x400EA3D7,0x0A3D70A4, 0x3FF50BE2,0x4F9506CB, + 0x400EB851,0xEB851EB8, 0x3FF50E7D,0xE32EA13C, + 0x400ECCCC,0xCCCCCCCD, 0x3FF51116,0x373D0BC2, + 0x400EE147,0xAE147AE1, 0x3FF513AB,0x51AB7B85, + 0x400EF5C2,0x8F5C28F6, 0x3FF5163D,0x385724AE, + 0x400F0A3D,0x70A3D70A, 0x3FF518CB,0xF10F62A5, + 0x400F1EB8,0x51EB851F, 0x3FF51B57,0x8195DFC6, + 0x400F3333,0x33333333, 0x3FF51DDF,0xEF9EBC94, + 0x400F47AE,0x147AE148, 0x3FF52065,0x40D0B66B, + 0x400F5C28,0xF5C28F5C, 0x3FF522E7,0x7AC54DAA, + 0x400F70A3,0xD70A3D71, 0x3FF52566,0xA308EB6C, + 0x400F851E,0xB851EB85, 0x3FF527E2,0xBF1B06B3, + 0x400F9999,0x9999999A, 0x3FF52A5B,0xD46E492A, + 0x400FAE14,0x7AE147AE, 0x3FF52CD1,0xE868B35E, + 0x400FC28F,0x5C28F5C3, 0x3FF52F45,0x0063C08A, + 0x400FD70A,0x3D70A3D7, 0x3FF531B5,0x21AC89EA, + 0x400FEB85,0x1EB851EC, 0x3FF53422,0x5183E999, + 0x40100000,0x00000000, 0x3FF5368C,0x951E9CFD, + }; + +LOCAL_D const TUint32 ArcsinTest[] = + { + 0x00000000,0x00000000, 0x00000000,0x00000000, + 0x3F747AE1,0x47AE147B, 0x3F747AE6,0xDF5A1444, + 0x3F847AE1,0x47AE147B, 0x3F847AF7,0xA68F8EEF, + 0x3F8EB851,0xEB851EB8, 0x3F8EB89D,0x6CD47A22, + 0x3F947AE1,0x47AE147B, 0x3F947B3A,0xC64BE09A, + 0x3F999999,0x9999999A, 0x3F999A48,0x696E25A4, + 0x3F9EB851,0xEB851EB8, 0x3F9EB980,0x08422806, + 0x3FA1EB85,0x1EB851EC, 0x3FA1EC75,0x06D2956A, + 0x3FA47AE1,0x47AE147B, 0x3FA47C47,0x73AEBD59, + 0x3FA70A3D,0x70A3D70A, 0x3FA70C3B,0x834BE3FC, + 0x3FA99999,0x9999999A, 0x3FA99C55,0x70328659, + 0x3FAC28F5,0xC28F5C29, 0x3FAC2C99,0x771C898D, + 0x3FAEB851,0xEB851EB8, 0x3FAEBD0B,0xD734D8A7, + 0x3FB0A3D7,0x0A3D70A4, 0x3FB0A6D8,0x692BB3BD, + 0x3FB1EB85,0x1EB851EC, 0x3FB1EF46,0x56A8D28C, + 0x3FB33333,0x33333333, 0x3FB337D1,0xD811B44C, + 0x3FB47AE1,0x47AE147B, 0x3FB4807D,0x1320318C, + 0x3FB5C28F,0x5C28F5C3, 0x3FB5C94A,0x2F6910FA, + 0x3FB70A3D,0x70A3D70A, 0x3FB7123B,0x567D5638, + 0x3FB851EB,0x851EB852, 0x3FB85B52,0xB40BE42D, + 0x3FB99999,0x9999999A, 0x3FB9A492,0x76037884, + 0x3FBAE147,0xAE147AE1, 0x3FBAEDFC,0xCCB50667, + 0x3FBC28F5,0xC28F5C29, 0x3FBC3793,0xEAF67675, + 0x3FBD70A3,0xD70A3D71, 0x3FBD815A,0x0645D212, + 0x3FBEB851,0xEB851EB8, 0x3FBECB51,0x56ECE085, + 0x3FC00000,0x00000000, 0x3FC00ABE,0x0C129E1E, + 0x3FC0A3D7,0x0A3D70A4, 0x3FC0AFEE,0x441E736F, + 0x3FC147AE,0x147AE148, 0x3FC1553A,0x745DB182, + 0x3FC1EB85,0x1EB851EC, 0x3FC1FAA3,0xBF43AD3B, + 0x3FC28F5C,0x28F5C28F, 0x3FC2A02B,0x49066C16, + 0x3FC33333,0x33333333, 0x3FC345D2,0x37B20EB3, + 0x3FC3D70A,0x3D70A3D7, 0x3FC3EB99,0xB33C8CA7, + 0x3FC47AE1,0x47AE147B, 0x3FC49182,0xE599C592, + 0x3FC51EB8,0x51EB851F, 0x3FC5378E,0xFACFEB5F, + 0x3FC5C28F,0x5C28F5C3, 0x3FC5DDBF,0x210C49E2, + 0x3FC66666,0x66666666, 0x3FC68414,0x88B8700C, + 0x3FC70A3D,0x70A3D70A, 0x3FC72A90,0x648FBF25, + 0x3FC7AE14,0x7AE147AE, 0x3FC7D133,0xE9B56483, + 0x3FC851EB,0x851EB852, 0x3FC87800,0x4FCAC282, + 0x3FC8F5C2,0x8F5C28F6, 0x3FC91EF6,0xD1064D8C, + 0x3FC99999,0x9999999A, 0x3FC9C618,0xAA4AE23D, + 0x3FCA3D70,0xA3D70A3D, 0x3FCA6D67,0x1B3F99C4, + 0x3FCAE147,0xAE147AE1, 0x3FCB14E3,0x666821F8, + 0x3FCB851E,0xB851EB85, 0x3FCBBC8E,0xD13D9EA5, + 0x3FCC28F5,0xC28F5C29, 0x3FCC646A,0xA44819DA, + 0x3FCCCCCC,0xCCCCCCCD, 0x3FCD0C78,0x2B38893C, + 0x3FCD70A3,0xD70A3D71, 0x3FCDB4B8,0xB5036E9A, + 0x3FCE147A,0xE147AE14, 0x3FCE5D2D,0x93FC1A2B, + 0x3FCEB851,0xEB851EB8, 0x3FCF05D8,0x1DF0953F, + 0x3FCF5C28,0xF5C28F5C, 0x3FCFAEB9,0xAC463C49, + 0x3FD00000,0x00000000, 0x3FD02BE9,0xCE0B87CD, + 0x3FD051EB,0x851EB852, 0x3FD08093,0xA727E129, + 0x3FD0A3D7,0x0A3D70A4, 0x3FD0D55B,0x13E747AE, + 0x3FD0F5C2,0x8F5C28F6, 0x3FD12A40,0xC8C16E57, + 0x3FD147AE,0x147AE148, 0x3FD17F45,0x7C46DAAB, + 0x3FD19999,0x9999999A, 0x3FD1D469,0xE731919C, + 0x3FD1EB85,0x1EB851EC, 0x3FD229AE,0xC47638DD, + 0x3FD23D70,0xA3D70A3D, 0x3FD27F14,0xD155B18A, + 0x3FD28F5C,0x28F5C28F, 0x3FD2D49C,0xCD6F3133, + 0x3FD2E147,0xAE147AE1, 0x3FD32A47,0x7AD2DE7F, + 0x3FD33333,0x33333333, 0x3FD38015,0x9E14F6FF, + 0x3FD3851E,0xB851EB85, 0x3FD3D607,0xFE6183DC, + 0x3FD3D70A,0x3D70A3D7, 0x3FD42C1F,0x6590A37D, + 0x3FD428F5,0xC28F5C29, 0x3FD4825C,0xA03B6E54, + 0x3FD47AE1,0x47AE147B, 0x3FD4D8C0,0x7DD17D7D, + 0x3FD4CCCC,0xCCCCCCCD, 0x3FD52F4B,0xD0AF1A0B, + 0x3FD51EB8,0x51EB851F, 0x3FD585FF,0x6E341C3E, + 0x3FD570A3,0xD70A3D71, 0x3FD5DCDC,0x2EDB8227, + 0x3FD5C28F,0x5C28F5C3, 0x3FD633E2,0xEE53C5B9, + 0x3FD6147A,0xE147AE14, 0x3FD68B14,0x8B97FA84, + 0x3FD66666,0x66666666, 0x3FD6E271,0xE909BBE4, + 0x3FD6B851,0xEB851EB8, 0x3FD739FB,0xEC8BF4B2, + 0x3FD70A3D,0x70A3D70A, 0x3FD791B3,0x7F9E8A25, + 0x3FD75C28,0xF5C28F5C, 0x3FD7E999,0x8F7AF3F6, + 0x3FD7AE14,0x7AE147AE, 0x3FD841AF,0x0D31CC53, + 0x3FD80000,0x00000000, 0x3FD899F4,0xEDC962D3, + 0x3FD851EB,0x851EB852, 0x3FD8F26C,0x2A5D5E1D, + 0x3FD8A3D7,0x0A3D70A4, 0x3FD94B15,0xC03F7890, + 0x3FD8F5C2,0x8F5C28F6, 0x3FD9A3F2,0xB11964EC, + 0x3FD947AE,0x147AE148, 0x3FD9FD04,0x030FE8A3, + 0x3FD99999,0x9999999A, 0x3FDA564A,0xC0E73A34, + 0x3FD9EB85,0x1EB851EC, 0x3FDAAFC7,0xFA28B2BE, + 0x3FDA3D70,0xA3D70A3D, 0x3FDB097C,0xC349E2C6, + 0x3FDA8F5C,0x28F5C28F, 0x3FDB636A,0x35D51B17, + 0x3FDAE147,0xAE147AE1, 0x3FDBBD91,0x70937B7F, + 0x3FDB3333,0x33333333, 0x3FDC17F3,0x97B89A42, + 0x3FDB851E,0xB851EB85, 0x3FDC7291,0xD50FD81E, + 0x3FDBD70A,0x3D70A3D7, 0x3FDCCD6D,0x582B75E4, + 0x3FDC28F5,0xC28F5C29, 0x3FDD2887,0x569581CA, + 0x3FDC7AE1,0x47AE147B, 0x3FDD83E1,0x0C02B412, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FDDDF7B,0xBA8753CD, + 0x3FDD1EB8,0x51EB851F, 0x3FDE3B58,0xAACE3E1C, + 0x3FDD70A3,0xD70A3D71, 0x3FDE9779,0x2C522BE1, + 0x3FDDC28F,0x5C28F5C3, 0x3FDEF3DE,0x95995367, + 0x3FDE147A,0xE147AE14, 0x3FDF508A,0x4473857E, + 0x3FDE6666,0x66666666, 0x3FDFAD7D,0x9E3AE753, + 0x3FDEB851,0xEB851EB8, 0x3FE0055D,0x080BB634, + 0x3FDF0A3D,0x70A3D70A, 0x3FE03420,0x87A29B28, + 0x3FDF5C28,0xF5C28F5C, 0x3FE0630A,0x0CAF011A, + 0x3FDFAE14,0x7AE147AE, 0x3FE0921A,0x5A52E74D, + 0x3FE00000,0x00000000, 0x3FE0C152,0x382D7366, + }; +*/ +LOCAL_D const TUint32 ArctanTest[] = + { + 0x00000000,0x00000000, 0x00000000,0x00000000, + 0x3F747AE1,0x47AE147B, 0x3F747AD6,0x186952B5, + 0x3F847AE1,0x47AE147B, 0x3F847AB4,0x8B1EFB5D, + 0x3F8EB851,0xEB851EB8, 0x3F8EB7BA,0xF2082977, + 0x3F947AE1,0x47AE147B, 0x3F947A2E,0x5DAFFF07, + 0x3F999999,0x9999999A, 0x3F99983C,0x34A774D2, + 0x3F9EB851,0xEB851EB8, 0x3F9EB5F6,0x44234B83, + 0x3FA1EB85,0x1EB851EC, 0x3FA1E9A5,0xEC6421B1, + 0x3FA47AE1,0x47AE147B, 0x3FA47816,0x23768D56, + 0x3FA70A3D,0x70A3D70A, 0x3FA70643,0x75EF93F7, + 0x3FA99999,0x9999999A, 0x3FA99425,0x97929F27, + 0x3FAC28F5,0xC28F5C29, 0x3FAC21B4,0x41E04F61, + 0x3FAEB851,0xEB851EB8, 0x3FAEAEE7,0x34B5DD23, + 0x3FB0A3D7,0x0A3D70A4, 0x3FB09DDB,0x1B75A262, + 0x3FB1EB85,0x1EB851EC, 0x3FB1E40C,0x8B780FDE, + 0x3FB33333,0x33333333, 0x3FB32A03,0xD5B3875B, + 0x3FB47AE1,0x47AE147B, 0x3FB46FBC,0xE9DFCC00, + 0x3FB5C28F,0x5C28F5C3, 0x3FB5B533,0xBC672F49, + 0x3FB70A3D,0x70A3D70A, 0x3FB6FA64,0x46B1CB54, + 0x3FB851EB,0x851EB852, 0x3FB83F4A,0x876FCEA2, + 0x3FB99999,0x9999999A, 0x3FB983E2,0x82E2CC4D, + 0x3FBAE147,0xAE147AE1, 0x3FBAC828,0x43260428, + 0x3FBC28F5,0xC28F5C29, 0x3FBC0C17,0xD875967A, + 0x3FBD70A3,0xD70A3D71, 0x3FBD4FAD,0x59749764, + 0x3FBEB851,0xEB851EB8, 0x3FBE92E4,0xE371F679, + 0x3FC00000,0x00000000, 0x3FBFD5BA,0x9AAC2F6E, + 0x3FC0A3D7,0x0A3D70A4, 0x3FC08C15,0x5549DC84, + 0x3FC147AE,0x147AE148, 0x3FC12D18,0xA3061410, + 0x3FC1EB85,0x1EB851EC, 0x3FC1CDE5,0x53D5FE66, + 0x3FC28F5C,0x28F5C28F, 0x3FC26E79,0x88FD8817, + 0x3FC33333,0x33333333, 0x3FC30ED3,0x67D7CD04, + 0x3FC3D70A,0x3D70A3D7, 0x3FC3AEF1,0x19F4E2B1, + 0x3FC47AE1,0x47AE147B, 0x3FC44ED0,0xCD36E62E, + 0x3FC51EB8,0x51EB851F, 0x3FC4EE70,0xB3EE49B0, + 0x3FC5C28F,0x5C28F5C3, 0x3FC58DCF,0x04F55E58, + 0x3FC66666,0x66666666, 0x3FC62CE9,0xFBCB16C0, + 0x3FC70A3D,0x70A3D70A, 0x3FC6CBBF,0xD8ACFF50, + 0x3FC7AE14,0x7AE147AE, 0x3FC76A4E,0xE0B0695E, + 0x3FC851EB,0x851EB852, 0x3FC80895,0x5DDAC693, + 0x3FC8F5C2,0x8F5C28F6, 0x3FC8A691,0x9F393230, + 0x3FC99999,0x9999999A, 0x3FC94441,0xF8F7260C, + 0x3FCA3D70,0xA3D70A3D, 0x3FC9E1A4,0xC4745962, + 0x3FCAE147,0xAE147AE1, 0x3FCA7EB8,0x6059C7DA, + 0x3FCB851E,0xB851EB85, 0x3FCB1B7B,0x30ADDF4B, + 0x3FCC28F5,0xC28F5C29, 0x3FCBB7EB,0x9EE7D317, + 0x3FCCCCCC,0xCCCCCCCD, 0x3FCC5408,0x1A021430, + 0x3FCD70A3,0xD70A3D71, 0x3FCCEFCF,0x168BED03, + 0x3FCE147A,0xE147AE14, 0x3FCD8B3F,0x0EBA40DA, + 0x3FCEB851,0xEB851EB8, 0x3FCE2656,0x82776E76, + 0x3FCF5C28,0xF5C28F5C, 0x3FCEC113,0xF77255BF, + 0x3FD00000,0x00000000, 0x3FCF5B75,0xF92C80DD, + 0x3FD051EB,0x851EB852, 0x3FCFF57B,0x19077106, + 0x3FD0A3D7,0x0A3D70A4, 0x3FD04790,0xF72887D4, + 0x3FD0F5C2,0x8F5C28F6, 0x3FD09434,0x8B27A260, + 0x3FD147AE,0x147AE148, 0x3FD0E0A7,0x9A2559AF, + 0x3FD19999,0x9999999A, 0x3FD12CE9,0x78CC4EC9, + 0x3FD1EB85,0x1EB851EC, 0x3FD178F9,0x7ED1F891, + 0x3FD23D70,0xA3D70A3D, 0x3FD1C4D7,0x06FABF59, + 0x3FD28F5C,0x28F5C28F, 0x3FD21081,0x6F1DAE81, + 0x3FD2E147,0xAE147AE1, 0x3FD25BF8,0x1827BD2A, + 0x3FD33333,0x33333333, 0x3FD2A73A,0x661EAF06, + 0x3FD3851E,0xB851EB85, 0x3FD2F247,0xC0238E5E, + 0x3FD3D70A,0x3D70A3D7, 0x3FD33D1F,0x9074C099, + 0x3FD428F5,0xC28F5C29, 0x3FD387C1,0x446FB673, + 0x3FD47AE1,0x47AE147B, 0x3FD3D22C,0x4C92395D, + 0x3FD4CCCC,0xCCCCCCCD, 0x3FD41C60,0x1C7B5755, + 0x3FD51EB8,0x51EB851F, 0x3FD4665C,0x2AEBEED4, + 0x3FD570A3,0xD70A3D71, 0x3FD4B01F,0xF1C6DC3C, + 0x3FD5C28F,0x5C28F5C3, 0x3FD4F9AA,0xEE10CA82, + 0x3FD6147A,0xE147AE14, 0x3FD542FC,0x9FEFA8A9, + 0x3FD66666,0x66666666, 0x3FD58C14,0x8AA9C5D6, + 0x3FD6B851,0xEB851EB8, 0x3FD5D4F2,0x34A495A3, + 0x3FD70A3D,0x70A3D70A, 0x3FD61D95,0x27631EA9, + 0x3FD75C28,0xF5C28F5C, 0x3FD665FC,0xEF8414F8, + 0x3FD7AE14,0x7AE147AE, 0x3FD6AE29,0x1CBFA274, + 0x3FD80000,0x00000000, 0x3FD6F619,0x41E4DEF1, + 0x3FD851EB,0x851EB852, 0x3FD73DCC,0xF4D6FA15, + 0x3FD8A3D7,0x0A3D70A4, 0x3FD78543,0xCE8A18F4, + 0x3FD8F5C2,0x8F5C28F6, 0x3FD7CC7D,0x6AFFE959, + 0x3FD947AE,0x147AE148, 0x3FD81379,0x6943ECDC, + 0x3FD99999,0x9999999A, 0x3FD85A37,0x6B677DC0, + 0x3FD9EB85,0x1EB851EC, 0x3FD8A0B7,0x167D8FAB, + 0x3FDA3D70,0xA3D70A3D, 0x3FD8E6F8,0x12962E4E, + 0x3FDA8F5C,0x28F5C28F, 0x3FD92CFA,0x0AB9BC1D, + 0x3FDAE147,0xAE147AE1, 0x3FD972BC,0xACE3F311, + 0x3FDB3333,0x33333333, 0x3FD9B83F,0xA9FEA9AF, + 0x3FDB851E,0xB851EB85, 0x3FD9FD82,0xB5DC5E5F, + 0x3FDBD70A,0x3D70A3D7, 0x3FDA4285,0x87328B23, + 0x3FDC28F5,0xC28F5C29, 0x3FDA8747,0xD793C3DC, + 0x3FDC7AE1,0x47AE147B, 0x3FDACBC9,0x6369A11D, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FDB1009,0xE9EE79BC, + 0x3FDD1EB8,0x51EB851F, 0x3FDB5409,0x2D26ED16, + 0x3FDD70A3,0xD70A3D71, 0x3FDB97C6,0xF1DB4032, + 0x3FDDC28F,0x5C28F5C3, 0x3FDBDB42,0xFF908FB9, + 0x3FDE147A,0xE147AE14, 0x3FDC1E7D,0x2081D8E2, + 0x3FDE6666,0x66666666, 0x3FDC6175,0x2198DB3D, + 0x3FDEB851,0xEB851EB8, 0x3FDCA42A,0xD266D56F, + 0x3FDF0A3D,0x70A3D70A, 0x3FDCE69E,0x051D1ED4, + 0x3FDF5C28,0xF5C28F5C, 0x3FDD28CE,0x8E859FEF, + 0x3FDFAE14,0x7AE147AE, 0x3FDD6ABC,0x45FB2BAE, + 0x3FE00000,0x00000000, 0x3FDDAC67,0x0561BB4F, + 0x3FE028F5,0xC28F5C29, 0x3FDDEDCE,0xA91E8ED4, + 0x3FE051EB,0x851EB852, 0x3FDE2EF3,0x101033DF, + 0x3FE07AE1,0x47AE147B, 0x3FDE6FD4,0x1B8674C2, + 0x3FE0A3D7,0x0A3D70A4, 0x3FDEB071,0xAF3A3191, + 0x3FE0CCCC,0xCCCCCCCD, 0x3FDEF0CB,0xB14524F4, + 0x3FE0F5C2,0x8F5C28F6, 0x3FDF30E2,0x0A199675, + 0x3FE11EB8,0x51EB851F, 0x3FDF70B4,0xA479FBF9, + 0x3FE147AE,0x147AE148, 0x3FDFB043,0x6D708C0A, + 0x3FE170A3,0xD70A3D71, 0x3FDFEF8E,0x5446C29A, + 0x3FE19999,0x9999999A, 0x3FE0174A,0xA53E6CE4, + 0x3FE1C28F,0x5C28F5C3, 0x3FE036AC,0x21E09C1D, + 0x3FE1EB85,0x1EB851EC, 0x3FE055EB,0x9AF3EB4B, + 0x3FE2147A,0xE147AE14, 0x3FE07509,0x0C70CEC4, + 0x3FE23D70,0xA3D70A3D, 0x3FE09404,0x7359DEEB, + 0x3FE26666,0x66666666, 0x3FE0B2DD,0xCDB781E3, + 0x3FE28F5C,0x28F5C28F, 0x3FE0D195,0x1A9393B7, + 0x3FE2B851,0xEB851EB8, 0x3FE0F02A,0x59F50D7F, + 0x3FE2E147,0xAE147AE1, 0x3FE10E9D,0x8CDBAC48, + 0x3FE30A3D,0x70A3D70A, 0x3FE12CEE,0xB53B9841, + 0x3FE33333,0x33333333, 0x3FE14B1D,0xD5F90CE1, + 0x3FE35C28,0xF5C28F5C, 0x3FE1692A,0xF2E40288, + 0x3FE3851E,0xB851EB85, 0x3FE18716,0x10B3DA41, + 0x3FE3AE14,0x7AE147AE, 0x3FE1A4DF,0x35030C1F, + 0x3FE3D70A,0x3D70A3D7, 0x3FE1C286,0x664AD8C9, + 0x3FE40000,0x00000000, 0x3FE1E00B,0xABDEFEB4, + 0x3FE428F5,0xC28F5C29, 0x3FE1FD6F,0x0DE97388, + 0x3FE451EB,0x851EB852, 0x3FE21AB0,0x95662230, + 0x3FE47AE1,0x47AE147B, 0x3FE237D0,0x4C1EAE02, + 0x3FE4A3D7,0x0A3D70A4, 0x3FE254CE,0x3CA63B76, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FE271AA,0x72553ED5, + 0x3FE4F5C2,0x8F5C28F6, 0x3FE28E64,0xF9455145, + 0x3FE51EB8,0x51EB851F, 0x3FE2AAFD,0xDE4D0C9F, + 0x3FE547AE,0x147AE148, 0x3FE2C775,0x2EFBEE61, + 0x3FE570A3,0xD70A3D71, 0x3FE2E3CA,0xF996421E, + 0x3FE59999,0x9999999A, 0x3FE2FFFF,0x4D1113C2, + 0x3FE5C28F,0x5C28F5C3, 0x3FE31C12,0x390E29FA, + 0x3FE5EB85,0x1EB851EC, 0x3FE33803,0xCDD8090A, + 0x3FE6147A,0xE147AE14, 0x3FE353D4,0x1C5DFE67, + 0x3FE63D70,0xA3D70A3D, 0x3FE36F83,0x36303552, + 0x3FE66666,0x66666666, 0x3FE38B11,0x2D7BD4AD, + 0x3FE68F5C,0x28F5C28F, 0x3FE3A67E,0x15072661, + 0x3FE6B851,0xEB851EB8, 0x3FE3C1CA,0x002DC877, + 0x3FE6E147,0xAE147AE1, 0x3FE3DCF5,0x02DCE82B, + 0x3FE70A3D,0x70A3D70A, 0x3FE3F7FF,0x318F8723, + 0x3FE73333,0x33333333, 0x3FE412E8,0xA14ACAFF, + 0x3FE75C28,0xF5C28F5C, 0x3FE42DB1,0x679A576F, + 0x3FE7851E,0xB851EB85, 0x3FE44859,0x9A8CB2EF, + 0x3FE7AE14,0x7AE147AE, 0x3FE462E1,0x50AFB65F, + 0x3FE7D70A,0x3D70A3D7, 0x3FE47D48,0xA10D0791, + 0x3FE80000,0x00000000, 0x3FE4978F,0xA3269EE1, + 0x3FE828F5,0xC28F5C29, 0x3FE4B1B6,0x6EF35814, + 0x3FE851EB,0x851EB852, 0x3FE4CBBD,0x1CDB8E70, + 0x3FE87AE1,0x47AE147B, 0x3FE4E5A3,0xC5B5C44A, + 0x3FE8A3D7,0x0A3D70A4, 0x3FE4FF6A,0x82C35600, + 0x3FE8CCCC,0xCCCCCCCD, 0x3FE51911,0x6DAD3886, + 0x3FE8F5C2,0x8F5C28F6, 0x3FE53298,0xA080C38D, + 0x3FE91EB8,0x51EB851F, 0x3FE54C00,0x35AC874B, + 0x3FE947AE,0x147AE148, 0x3FE56548,0x47FD2E00, + 0x3FE970A3,0xD70A3D71, 0x3FE57E70,0xF29A692E, + 0x3FE99999,0x9999999A, 0x3FE5977A,0x5103EA93, + 0x3FE9C28F,0x5C28F5C3, 0x3FE5B064,0x7F0E68E9, + 0x3FE9EB85,0x1EB851EC, 0x3FE5C92F,0x98E0B072, + 0x3FEA147A,0xE147AE14, 0x3FE5E1DB,0xBAF0BF3E, + 0x3FEA3D70,0xA3D70A3D, 0x3FE5FA69,0x0200ED45, + 0x3FEA6666,0x66666666, 0x3FE612D7,0x8B1D2038, + 0x3FEA8F5C,0x28F5C28F, 0x3FE62B27,0x73980B11, + 0x3FEAB851,0xEB851EB8, 0x3FE64358,0xD908795A, + 0x3FEAE147,0xAE147AE1, 0x3FE65B6B,0xD946A61B, + 0x3FEB0A3D,0x70A3D70A, 0x3FE67360,0x92699E72, + 0x3FEB3333,0x33333333, 0x3FE68B37,0x22C4AFB4, + 0x3FEB5C28,0xF5C28F5C, 0x3FE6A2EF,0xA8E4E126, + 0x3FEB851E,0xB851EB85, 0x3FE6BA8A,0x438E7926, + 0x3FEBAE14,0x7AE147AE, 0x3FE6D207,0x11BA8DBD, + 0x3FEBD70A,0x3D70A3D7, 0x3FE6E966,0x3294A097, + 0x3FEC0000,0x00000000, 0x3FE700A7,0xC5784634, + 0x3FEC28F5,0xC28F5C29, 0x3FE717CB,0xE9EED853, + 0x3FEC51EB,0x851EB852, 0x3FE72ED2,0xBFAD3382, + 0x3FEC7AE1,0x47AE147B, 0x3FE745BC,0x66917FB0, + 0x3FECA3D7,0x0A3D70A4, 0x3FE75C88,0xFEA103B5, + 0x3FECCCCC,0xCCCCCCCD, 0x3FE77338,0xA80603BE, + 0x3FECF5C2,0x8F5C28F6, 0x3FE789CB,0x830DAA79, + 0x3FED1EB8,0x51EB851F, 0x3FE7A041,0xB025FCE9, + 0x3FED47AE,0x147AE148, 0x3FE7B69B,0x4FDBD8D9, + 0x3FED70A3,0xD70A3D71, 0x3FE7CCD8,0x82D8FDBE, + 0x3FED9999,0x9999999A, 0x3FE7E2F9,0x69E21FFF, + 0x3FEDC28F,0x5C28F5C3, 0x3FE7F8FE,0x25D5067B, + 0x3FEDEB85,0x1EB851EC, 0x3FE80EE6,0xD7A6B236, + 0x3FEE147A,0xE147AE14, 0x3FE824B3,0xA0619019, + 0x3FEE3D70,0xA3D70A3D, 0x3FE83A64,0xA123B499, + 0x3FEE6666,0x66666666, 0x3FE84FF9,0xFB1D212E, + 0x3FEE8F5C,0x28F5C28F, 0x3FE86573,0xCF8E1386, + 0x3FEEB851,0xEB851EB8, 0x3FE87AD2,0x3FC55E47, + 0x3FEEE147,0xAE147AE1, 0x3FE89015,0x6D1ECB48, + 0x3FEF0A3D,0x70A3D70A, 0x3FE8A53D,0x7901872A, + 0x3FEF3333,0x33333333, 0x3FE8BA4A,0x84DE9622, + 0x3FEF5C28,0xF5C28F5C, 0x3FE8CF3C,0xB22F51E5, + 0x3FEF851E,0xB851EB85, 0x3FE8E414,0x2273F090, + 0x3FEFAE14,0x7AE147AE, 0x3FE8F8D0,0xF7321467, + 0x3FEFD70A,0x3D70A3D7, 0x3FE90D73,0x51F36458, + 0x3FF00000,0x00000000, 0x3FE921FB,0x54442D18, + 0x3FF0147A,0xE147AE14, 0x3FE93669,0x1FB20AC2, + 0x3FF028F5,0xC28F5C29, 0x3FE94ABC,0xD5CA9ACF, + 0x3FF03D70,0xA3D70A3D, 0x3FE95EF6,0x981A3654, + 0x3FF051EB,0x851EB852, 0x3FE97316,0x882AB45A, + 0x3FF06666,0x66666666, 0x3FE9871C,0xC7823436, + 0x3FF07AE1,0x47AE147B, 0x3FE99B09,0x77A1EFC7, + 0x3FF08F5C,0x28F5C28F, 0x3FE9AEDC,0xBA05156C, + 0x3FF0A3D7,0x0A3D70A4, 0x3FE9C296,0xB01FA9A5, + 0x3FF0B851,0xEB851EB8, 0x3FE9D637,0x7B5D702A, + 0x3FF0CCCC,0xCCCCCCCD, 0x3FE9E9BF,0x3D20DC71, + 0x3FF0E147,0xAE147AE1, 0x3FE9FD2E,0x16C2096D, + 0x3FF0F5C2,0x8F5C28F6, 0x3FEA1084,0x298DB87B, + 0x3FF10A3D,0x70A3D70A, 0x3FEA23C1,0x96C4574A, + 0x3FF11EB8,0x51EB851F, 0x3FEA36E6,0x7F990CB6, + 0x3FF13333,0x33333333, 0x3FEA49F3,0x0530CC61, + 0x3FF147AE,0x147AE148, 0x3FEA5CE7,0x48A170FE, + 0x3FF15C28,0xF5C28F5C, 0x3FEA6FC3,0x6AF0DD25, + 0x3FF170A3,0xD70A3D71, 0x3FEA8287,0x8D142297, + 0x3FF1851E,0xB851EB85, 0x3FEA9533,0xCFEEAFCE, + 0x3FF19999,0x9999999A, 0x3FEAA7C8,0x545183CD, + 0x3FF1AE14,0x7AE147AE, 0x3FEABA45,0x3AFA67F7, + 0x3FF1C28F,0x5C28F5C3, 0x3FEACCAA,0xA4932FEE, + 0x3FF1D70A,0x3D70A3D7, 0x3FEADEF8,0xB1B0FF43, + 0x3FF1EB85,0x1EB851EC, 0x3FEAF12F,0x82D394F6, + 0x3FF20000,0x00000000, 0x3FEB034F,0x38649C88, + 0x3FF2147A,0xE147AE14, 0x3FEB1557,0xF2B704A8, + 0x3FF228F5,0xC28F5C29, 0x3FEB2749,0xD2065B46, + 0x3FF23D70,0xA3D70A3D, 0x3FEB3924,0xF6762EF7, + 0x3FF251EB,0x851EB852, 0x3FEB4AE9,0x80117598, + 0x3FF26666,0x66666666, 0x3FEB5C97,0x8EC9F805, + 0x3FF27AE1,0x47AE147B, 0x3FEB6E2F,0x4277C2E2, + 0x3FF28F5C,0x28F5C28F, 0x3FEB7FB0,0xBAD89C3A, + 0x3FF2A3D7,0x0A3D70A4, 0x3FEB911C,0x178F7E06, + 0x3FF2B851,0xEB851EB8, 0x3FEBA271,0x78241551, + 0x3FF2CCCC,0xCCCCCCCD, 0x3FEBB3B0,0xFC024612, + 0x3FF2E147,0xAE147AE1, 0x3FEBC4DA,0xC279B378, + 0x3FF2F5C2,0x8F5C28F6, 0x3FEBD5EE,0xEABD4CB5, + 0x3FF30A3D,0x70A3D70A, 0x3FEBE6ED,0x93E2DE0A, + 0x3FF31EB8,0x51EB851F, 0x3FEBF7D6,0xDCE2A629, + 0x3FF33333,0x33333333, 0x3FEC08AA,0xE496EFA6, + 0x3FF347AE,0x147AE148, 0x3FEC1969,0xC9BBAE89, + 0x3FF35C28,0xF5C28F5C, 0x3FEC2A13,0xAAEE21CF, + 0x3FF370A3,0xD70A3D71, 0x3FEC3AA8,0xA6AC78D4, + 0x3FF3851E,0xB851EB85, 0x3FEC4B28,0xDB557C83, + 0x3FF39999,0x9999999A, 0x3FEC5B94,0x67283C49, + 0x3FF3AE14,0x7AE147AE, 0x3FEC6BEB,0x6843BE9A, + 0x3FF3C28F,0x5C28F5C3, 0x3FEC7C2D,0xFCA6B514, + 0x3FF3D70A,0x3D70A3D7, 0x3FEC8C5C,0x422F340D, + 0x3FF3EB85,0x1EB851EC, 0x3FEC9C76,0x569A6D90, + 0x3FF40000,0x00000000, 0x3FECAC7C,0x57846F9E, + 0x3FF4147A,0xE147AE14, 0x3FECBC6E,0x6267E5BD, + 0x3FF428F5,0xC28F5C29, 0x3FECCC4C,0x949DDD9E, + 0x3FF43D70,0xA3D70A3D, 0x3FECDC17,0x0B5D8EE8, + 0x3FF451EB,0x851EB852, 0x3FECEBCD,0xE3BC25FE, + 0x3FF46666,0x66666666, 0x3FECFB71,0x3AAC91BD, + 0x3FF47AE1,0x47AE147B, 0x3FED0B01,0x2CFF5412, + 0x3FF48F5C,0x28F5C28F, 0x3FED1A7D,0xD7625566, + 0x3FF4A3D7,0x0A3D70A4, 0x3FED29E7,0x5660BAC1, + 0x3FF4B851,0xEB851EB8, 0x3FED393D,0xC662BE9A, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FED4881,0x43AD8C44, + 0x3FF4E147,0xAE147AE1, 0x3FED57B1,0xEA631DDB, + 0x3FF4F5C2,0x8F5C28F6, 0x3FED66CF,0xD6821CBE, + 0x3FF50A3D,0x70A3D70A, 0x3FED75DB,0x23E5C45D, + 0x3FF51EB8,0x51EB851F, 0x3FED84D3,0xEE45C771, + 0x3FF53333,0x33333333, 0x3FED93BA,0x5136377A, + 0x3FF547AE,0x147AE148, 0x3FEDA28E,0x68276E77, + 0x3FF55C28,0xF5C28F5C, 0x3FEDB150,0x4E65FACD, + 0x3FF570A3,0xD70A3D71, 0x3FEDC000,0x1F1A8D4F, + 0x3FF5851E,0xB851EB85, 0x3FEDCE9D,0xF549E952, + 0x3FF59999,0x9999999A, 0x3FEDDD29,0xEBD4D6C8, + 0x3FF5AE14,0x7AE147AE, 0x3FEDEBA4,0x1D78164E, + 0x3FF5C28F,0x5C28F5C3, 0x3FEDFA0C,0xA4CC5721, + 0x3FF5D70A,0x3D70A3D7, 0x3FEE0863,0x9C462EED, + 0x3FF5EB85,0x1EB851EC, 0x3FEE16A9,0x1E36136F, + 0x3FF60000,0x00000000, 0x3FEE24DD,0x44C855D1, + 0x3FF6147A,0xE147AE14, 0x3FEE3300,0x2A051FBE, + 0x3FF628F5,0xC28F5C29, 0x3FEE4111,0xE7D0721F, + 0x3FF63D70,0xA3D70A3D, 0x3FEE4F12,0x97EA2570, + 0x3FF651EB,0x851EB852, 0x3FEE5D02,0x53EDEBB1, + 0x3FF66666,0x66666666, 0x3FEE6AE1,0x355353CF, + 0x3FF67AE1,0x47AE147B, 0x3FEE78AF,0x556DCE94, + 0x3FF68F5C,0x28F5C28F, 0x3FEE866C,0xCD6CB4F8, + 0x3FF6A3D7,0x0A3D70A4, 0x3FEE9419,0xB65B4FE9, + 0x3FF6B851,0xEB851EB8, 0x3FEEA1B6,0x2920E15D, + 0x3FF6CCCC,0xCCCCCCCD, 0x3FEEAF42,0x3E80AEC0, + 0x3FF6E147,0xAE147AE1, 0x3FEEBCBE,0x0F1A0C9F, + 0x3FF6F5C2,0x8F5C28F6, 0x3FEECA29,0xB3686B95, + 0x3FF70A3D,0x70A3D70A, 0x3FEED785,0x43C3666B, + 0x3FF71EB8,0x51EB851F, 0x3FEEE4D0,0xD85ED15D, + 0x3FF73333,0x33333333, 0x3FEEF20C,0x894ACA81, + 0x3FF747AE,0x147AE148, 0x3FEEFF38,0x6E73CB49, + 0x3FF75C28,0xF5C28F5C, 0x3FEF0C54,0x9FA2BB0B, + 0x3FF770A3,0xD70A3D71, 0x3FEF1961,0x347D0299, + 0x3FF7851E,0xB851EB85, 0x3FEF265E,0x4484A0CC, + 0x3FF79999,0x9999999A, 0x3FEF334B,0xE718400A, + 0x3FF7AE14,0x7AE147AE, 0x3FEF402A,0x33734CB8, + 0x3FF7C28F,0x5C28F5C3, 0x3FEF4CF9,0x40AE0C93, + 0x3FF7D70A,0x3D70A3D7, 0x3FEF59B9,0x25BDB6DF, + 0x3FF7EB85,0x1EB851EC, 0x3FEF6669,0xF9748D76, + 0x3FF80000,0x00000000, 0x3FEF730B,0xD281F69B, + 0x3FF8147A,0xE147AE14, 0x3FEF7F9E,0xC77297A0, + 0x3FF828F5,0xC28F5C29, 0x3FEF8C22,0xEEB07043, + 0x3FF83D70,0xA3D70A3D, 0x3FEF9898,0x5E82F6C3, + 0x3FF851EB,0x851EB852, 0x3FEFA4FF,0x2D0F34B7, + 0x3FF86666,0x66666666, 0x3FEFB157,0x7057E47A, + 0x3FF87AE1,0x47AE147B, 0x3FEFBDA1,0x3E3D8F55, + 0x3FF88F5C,0x28F5C28F, 0x3FEFC9DC,0xAC7EAC33, + 0x3FF8A3D7,0x0A3D70A4, 0x3FEFD609,0xD0B7BEFF, + 0x3FF8B851,0xEB851EB8, 0x3FEFE228,0xC063788D, + 0x3FF8CCCC,0xCCCCCCCD, 0x3FEFEE39,0x90DAD712, + 0x3FF8E147,0xAE147AE1, 0x3FEFFA3C,0x57554724, + 0x3FF8F5C2,0x8F5C28F6, 0x3FF00318,0x947462A0, + 0x3FF90A3D,0x70A3D70A, 0x3FF0090C,0x0D44FFE6, + 0x3FF91EB8,0x51EB851F, 0x3FF00EF8,0xA0863CC4, + 0x3FF93333,0x33333333, 0x3FF014DE,0x58915640, + 0x3FF947AE,0x147AE148, 0x3FF01ABD,0x3FAF16B2, + 0x3FF95C28,0xF5C28F5C, 0x3FF02095,0x6017E7A5, + 0x3FF970A3,0xD70A3D71, 0x3FF02666,0xC3F3E3E9, + 0x3FF9851E,0xB851EB85, 0x3FF02C31,0x755AE9D6, + 0x3FF99999,0x9999999A, 0x3FF031F5,0x7E54ADBE, + 0x3FF9AE14,0x7AE147AE, 0x3FF037B2,0xE8D8CC86, + 0x3FF9C28F,0x5C28F5C3, 0x3FF03D69,0xBECEDE6D, + 0x3FF9D70A,0x3D70A3D7, 0x3FF0431A,0x0A0E89F5, + 0x3FF9EB85,0x1EB851EC, 0x3FF048C3,0xD45F96F8, + 0x3FFA0000,0x00000000, 0x3FF04E67,0x277A01D7, + 0x3FFA147A,0xE147AE14, 0x3FF05404,0x0D060ED1, + 0x3FFA28F5,0xC28F5C29, 0x3FF0599A,0x8E9C5D78, + 0x3FFA3D70,0xA3D70A3D, 0x3FF05F2A,0xB5C5FC40, + 0x3FFA51EB,0x851EB852, 0x3FF064B4,0x8BFC7C2C, + 0x3FFA6666,0x66666666, 0x3FF06A38,0x1AAA0497, + 0x3FFA7AE1,0x47AE147B, 0x3FF06FB5,0x6B296710, + 0x3FFA8F5C,0x28F5C28F, 0x3FF0752C,0x86C63350, + 0x3FFAA3D7,0x0A3D70A4, 0x3FF07A9D,0x76BCCB47, + 0x3FFAB851,0xEB851EB8, 0x3FF08008,0x443A7731, + 0x3FFACCCC,0xCCCCCCCD, 0x3FF0856C,0xF85D79D0, + 0x3FFAE147,0xAE147AE1, 0x3FF08ACB,0x9C3524A3, + 0x3FFAF5C2,0x8F5C28F6, 0x3FF09024,0x38C1EC36, + 0x3FFB0A3D,0x70A3D70A, 0x3FF09576,0xD6F57C81, + 0x3FFB1EB8,0x51EB851F, 0x3FF09AC3,0x7FB2CD4B, + 0x3FFB3333,0x33333333, 0x3FF0A00A,0x3BCE369F, + 0x3FFB47AE,0x147AE148, 0x3FF0A54B,0x140D8548, + 0x3FFB5C28,0xF5C28F5C, 0x3FF0AA86,0x11280F54, + 0x3FFB70A3,0xD70A3D71, 0x3FF0AFBB,0x3BC6C89F, + 0x3FFB851E,0xB851EB85, 0x3FF0B4EA,0x9C845764, + 0x3FFB9999,0x9999999A, 0x3FF0BA14,0x3BED28D4, + 0x3FFBAE14,0x7AE147AE, 0x3FF0BF38,0x227F85AD, + 0x3FFBC28F,0x5C28F5C3, 0x3FF0C456,0x58ABA6D7, + 0x3FFBD70A,0x3D70A3D7, 0x3FF0C96E,0xE6D3CA01, + 0x3FFBEB85,0x1EB851EC, 0x3FF0CE81,0xD54C463D, + 0x3FFC0000,0x00000000, 0x3FF0D38F,0x2C5BA09F, + 0x3FFC147A,0xE147AE14, 0x3FF0D896,0xF43AA0D5, + 0x3FFC28F5,0xC28F5C29, 0x3FF0DD99,0x351465C6, + 0x3FFC3D70,0xA3D70A3D, 0x3FF0E295,0xF7067A20, + 0x3FFC51EB,0x851EB852, 0x3FF0E78D,0x4220E8EF, + 0x3FFC6666,0x66666666, 0x3FF0EC7F,0x1E665227, + 0x3FFC7AE1,0x47AE147B, 0x3FF0F16B,0x93CBFF2A, + 0x3FFC8F5C,0x28F5C28F, 0x3FF0F652,0xAA39F748, + 0x3FFCA3D7,0x0A3D70A4, 0x3FF0FB34,0x698B1438, + 0x3FFCB851,0xEB851EB8, 0x3FF10010,0xD98D1687, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF104E8,0x0200BA00, + 0x3FFCE147,0xAE147AE1, 0x3FF109B9,0xEA99CA07, + 0x3FFCF5C2,0x8F5C28F6, 0x3FF10E86,0x9AFF35F2, + 0x3FFD0A3D,0x70A3D70A, 0x3FF1134E,0x1ACB2548, + 0x3FFD1EB8,0x51EB851F, 0x3FF11810,0x718B0C06, + 0x3FFD3333,0x33333333, 0x3FF11CCD,0xA6BFBECC, + 0x3FFD47AE,0x147AE148, 0x3FF12185,0xC1DD8701, + 0x3FFD5C28,0xF5C28F5C, 0x3FF12638,0xCA4C36E7, + 0x3FFD70A3,0xD70A3D71, 0x3FF12AE6,0xC7673DAB, + 0x3FFD851E,0xB851EB85, 0x3FF12F8F,0xC07DBB53, + 0x3FFD9999,0x9999999A, 0x3FF13433,0xBCD294B5, + 0x3FFDAE14,0x7AE147AE, 0x3FF138D2,0xC39C874C, + 0x3FFDC28F,0x5C28F5C3, 0x3FF13D6C,0xDC063D05, + 0x3FFDD70A,0x3D70A3D7, 0x3FF14202,0x0D2E5FFB, + 0x3FFDEB85,0x1EB851EC, 0x3FF14692,0x5E27AE23, + 0x3FFE0000,0x00000000, 0x3FF14B1D,0xD5F90CE1, + 0x3FFE147A,0xE147AE14, 0x3FF14FA4,0x7B9D9C95, + 0x3FFE28F5,0xC28F5C29, 0x3FF15426,0x5604CC0F, + 0x3FFE3D70,0xA3D70A3D, 0x3FF158A3,0x6C126BF2, + 0x3FFE51EB,0x851EB852, 0x3FF15D1B,0xC49EC202, + 0x3FFE6666,0x66666666, 0x3FF1618F,0x66769C69, + 0x3FFE7AE1,0x47AE147B, 0x3FF165FE,0x585B64DA, + 0x3FFE8F5C,0x28F5C28F, 0x3FF16A68,0xA10333A9, + 0x3FFEA3D7,0x0A3D70A4, 0x3FF16ECE,0x4718E2D3, + 0x3FFEB851,0xEB851EB8, 0x3FF1732F,0x513C20E4, + 0x3FFECCCC,0xCCCCCCCD, 0x3FF1778B,0xC60183D4, + 0x3FFEE147,0xAE147AE1, 0x3FF17BE3,0xABF29BCE, + 0x3FFEF5C2,0x8F5C28F6, 0x3FF18037,0x098E05DD, + 0x3FFF0A3D,0x70A3D70A, 0x3FF18485,0xE5477E85, + 0x3FFF1EB8,0x51EB851F, 0x3FF188D0,0x4587F449, + 0x3FFF3333,0x33333333, 0x3FF18D16,0x30AD9A1A, + 0x3FFF47AE,0x147AE148, 0x3FF19157,0xAD0BF9B0, + 0x3FFF5C28,0xF5C28F5C, 0x3FF19594,0xC0EC05CA, + 0x3FFF70A3,0xD70A3D71, 0x3FF199CD,0x728C2C5E, + 0x3FFF851E,0xB851EB85, 0x3FF19E01,0xC82068A8, + 0x3FFF9999,0x9999999A, 0x3FF1A231,0xC7D25530, + 0x3FFFAE14,0x7AE147AE, 0x3FF1A65D,0x77C13DAE, + 0x3FFFC28F,0x5C28F5C3, 0x3FF1AA84,0xDE0230DA, + 0x3FFFD70A,0x3D70A3D7, 0x3FF1AEA8,0x00A01226, + 0x3FFFEB85,0x1EB851EC, 0x3FF1B2C6,0xE59BAB62, + 0x40000000,0x00000000, 0x3FF1B6E1,0x92EBBE44, + 0x40000A3D,0x70A3D70A, 0x3FF1BAF8,0x0E7D15DE, + 0x4000147A,0xE147AE14, 0x3FF1BF0A,0x5E3297F5, + 0x40001EB8,0x51EB851F, 0x3FF1C318,0x87E5564B, + 0x400028F5,0xC28F5C29, 0x3FF1C722,0x91649FC2, + 0x40003333,0x33333333, 0x3FF1CB28,0x8076117A, + 0x40003D70,0xA3D70A3D, 0x3FF1CF2A,0x5AD5A7C5, + 0x400047AE,0x147AE148, 0x3FF1D328,0x2635CF0D, + 0x400051EB,0x851EB852, 0x3FF1D721,0xE83F74A2, + 0x40005C28,0xF5C28F5C, 0x3FF1DB17,0xA6921768, + 0x40006666,0x66666666, 0x3FF1DF09,0x66C3D878, + 0x400070A3,0xD70A3D71, 0x3FF1E2F7,0x2E618BA0, + 0x40007AE1,0x47AE147B, 0x3FF1E6E1,0x02EEC7CB, + 0x4000851E,0xB851EB85, 0x3FF1EAC6,0xE9E5F756, + 0x40008F5C,0x28F5C28F, 0x3FF1EEA8,0xE8B8684D, + 0x40009999,0x9999999A, 0x3FF1F287,0x04CE5C82, + 0x4000A3D7,0x0A3D70A4, 0x3FF1F661,0x438719A2, + 0x4000AE14,0x7AE147AE, 0x3FF1FA37,0xAA38F91A, + 0x4000B851,0xEB851EB8, 0x3FF1FE0A,0x3E3177FA, + 0x4000C28F,0x5C28F5C3, 0x3FF201D9,0x04B546AA, + 0x4000CCCC,0xCCCCCCCD, 0x3FF205A4,0x03005899, + 0x4000D70A,0x3D70A3D7, 0x3FF2096B,0x3E45F3C7, + 0x4000E147,0xAE147AE1, 0x3FF20D2E,0xBBB0C03D, + 0x4000EB85,0x1EB851EC, 0x3FF210EE,0x8062D76B, + 0x4000F5C2,0x8F5C28F6, 0x3FF214AA,0x9175D36D, + 0x40010000,0x00000000, 0x3FF21862,0xF3FADE36, + 0x40010A3D,0x70A3D70A, 0x3FF21C17,0xACFAC0AB, + 0x4001147A,0xE147AE14, 0x3FF21FC8,0xC175F197, + 0x40011EB8,0x51EB851F, 0x3FF22376,0x3664A496, + 0x400128F5,0xC28F5C29, 0x3FF22720,0x10B6D8DF, + 0x40013333,0x33333333, 0x3FF22AC6,0x555467F6, + 0x40013D70,0xA3D70A3D, 0x3FF22E69,0x091D144B, + 0x400147AE,0x147AE148, 0x3FF23208,0x30E897BB, + 0x400151EB,0x851EB852, 0x3FF235A3,0xD186B1FE, + 0x40015C28,0xF5C28F5C, 0x3FF2393B,0xEFBF36F9, + 0x40016666,0x66666666, 0x3FF23CD0,0x90521CFC, + 0x400170A3,0xD70A3D71, 0x3FF24061,0xB7F78AE4, + 0x40017AE1,0x47AE147B, 0x3FF243EF,0x6B5FE628, + 0x4001851E,0xB851EB85, 0x3FF24779,0xAF33E0D0, + 0x40018F5C,0x28F5C28F, 0x3FF24B00,0x8814874E, + 0x40019999,0x9999999A, 0x3FF24E83,0xFA9B4E48, + 0x4001A3D7,0x0A3D70A4, 0x3FF25204,0x0B5A2042, + 0x4001AE14,0x7AE147AE, 0x3FF25580,0xBEDB6B38, + 0x4001B851,0xEB851EB8, 0x3FF258FA,0x19A22E1C, + 0x4001C28F,0x5C28F5C3, 0x3FF25C70,0x202A063E, + 0x4001CCCC,0xCCCCCCCD, 0x3FF25FE2,0xD6E73C9E, + 0x4001D70A,0x3D70A3D7, 0x3FF26352,0x4246D324, + 0x4001E147,0xAE147AE1, 0x3FF266BE,0x66AE91C9, + 0x4001EB85,0x1EB851EC, 0x3FF26A27,0x487D139A, + 0x4001F5C2,0x8F5C28F6, 0x3FF26D8C,0xEC09D3B5, + 0x40020000,0x00000000, 0x3FF270EF,0x55A53A25, + 0x40020A3D,0x70A3D70A, 0x3FF2744E,0x8998A8AA, + 0x4002147A,0xE147AE14, 0x3FF277AA,0x8C26876B, + 0x40021EB8,0x51EB851F, 0x3FF27B03,0x618A5193, + 0x400228F5,0xC28F5C29, 0x3FF27E59,0x0DF8A1D2, + 0x40023333,0x33333333, 0x3FF281AB,0x959F3ED0, + 0x40023D70,0xA3D70A3D, 0x3FF284FA,0xFCA52783, + 0x400247AE,0x147AE148, 0x3FF28847,0x472A9F73, + 0x400251EB,0x851EB852, 0x3FF28B90,0x79493AE7, + 0x40025C28,0xF5C28F5C, 0x3FF28ED6,0x9713EAFA, + 0x40026666,0x66666666, 0x3FF29219,0xA49709A1, + 0x400270A3,0xD70A3D71, 0x3FF29559,0xA5D86590, + 0x40027AE1,0x47AE147B, 0x3FF29896,0x9ED74E17, + 0x4002851E,0xB851EB85, 0x3FF29BD0,0x938C9EDE, + 0x40028F5C,0x28F5C28F, 0x3FF29F07,0x87EACB94, + 0x40029999,0x9999999A, 0x3FF2A23B,0x7FDDEB84, + 0x4002A3D7,0x0A3D70A4, 0x3FF2A56C,0x7F4BC517, + 0x4002AE14,0x7AE147AE, 0x3FF2A89A,0x8A13D940, + 0x4002B851,0xEB851EB8, 0x3FF2ABC5,0xA40F6ED6, + 0x4002C28F,0x5C28F5C3, 0x3FF2AEED,0xD1119DD3, + 0x4002CCCC,0xCCCCCCCD, 0x3FF2B213,0x14E75A87, + 0x4002D70A,0x3D70A3D7, 0x3FF2B535,0x735780AF, + 0x4002E147,0xAE147AE1, 0x3FF2B854,0xF022DE7D, + 0x4002EB85,0x1EB851EC, 0x3FF2BB71,0x8F043F87, + 0x4002F5C2,0x8F5C28F6, 0x3FF2BE8B,0x53B077A8, + 0x40030000,0x00000000, 0x3FF2C1A2,0x41D66DC3, + 0x40030A3D,0x70A3D70A, 0x3FF2C4B6,0x5D1F2682, + 0x4003147A,0xE147AE14, 0x3FF2C7C7,0xA92DCEEE, + 0x40031EB8,0x51EB851F, 0x3FF2CAD6,0x299FC702, + 0x400328F5,0xC28F5C29, 0x3FF2CDE1,0xE20CAC27, + 0x40033333,0x33333333, 0x3FF2D0EA,0xD6066395, + 0x40033D70,0xA3D70A3D, 0x3FF2D3F1,0x091924AF, + 0x400347AE,0x147AE148, 0x3FF2D6F4,0x7ECB833A, + 0x400351EB,0x851EB852, 0x3FF2D9F5,0x3A9E7994, + 0x40035C28,0xF5C28F5C, 0x3FF2DCF3,0x400D72C6, + 0x40036666,0x66666666, 0x3FF2DFEE,0x928E5492, + 0x400370A3,0xD70A3D71, 0x3FF2E2E7,0x35918965, + 0x40037AE1,0x47AE147B, 0x3FF2E5DD,0x2C820A37, + 0x4003851E,0xB851EB85, 0x3FF2E8D0,0x7AC56862, + 0x40038F5C,0x28F5C28F, 0x3FF2EBC1,0x23BBD756, + 0x40039999,0x9999999A, 0x3FF2EEAF,0x2AC0364C, + 0x4003A3D7,0x0A3D70A4, 0x3FF2F19A,0x932819DA, + 0x4003AE14,0x7AE147AE, 0x3FF2F483,0x6043D57D, + 0x4003B851,0xEB851EB8, 0x3FF2F769,0x955E850A, + 0x4003C28F,0x5C28F5C3, 0x3FF2FA4D,0x35BE1618, + 0x4003CCCC,0xCCCCCCCD, 0x3FF2FD2E,0x44A35149, + 0x4003D70A,0x3D70A3D7, 0x3FF3000C,0xC549E391, + 0x4003E147,0xAE147AE1, 0x3FF302E8,0xBAE86760, + 0x4003EB85,0x1EB851EC, 0x3FF305C2,0x28B06DC2, + 0x4003F5C2,0x8F5C28F6, 0x3FF30899,0x11CE8769, + 0x40040000,0x00000000, 0x3FF30B6D,0x796A4DA8, + 0x40040A3D,0x70A3D70A, 0x3FF30E3F,0x62A66B5F, + 0x4004147A,0xE147AE14, 0x3FF3110E,0xD0A0A5D0, + 0x40041EB8,0x51EB851F, 0x3FF313DB,0xC671E56A, + 0x400428F5,0xC28F5C29, 0x3FF316A6,0x472E3E7F, + 0x40043333,0x33333333, 0x3FF3196E,0x55E4F9ED, + 0x40043D70,0xA3D70A3D, 0x3FF31C33,0xF5A09DB2, + 0x400447AE,0x147AE148, 0x3FF31EF7,0x2966F573, + 0x400451EB,0x851EB852, 0x3FF321B7,0xF4391AF3, + 0x40045C28,0xF5C28F5C, 0x3FF32476,0x59137E77, + 0x40046666,0x66666666, 0x3FF32732,0x5AEDEF1D, + 0x400470A3,0xD70A3D71, 0x3FF329EB,0xFCBBA323, + 0x40047AE1,0x47AE147B, 0x3FF32CA3,0x416B401A, + 0x4004851E,0xB851EB85, 0x3FF32F58,0x2BE6E311, + 0x40048F5C,0x28F5C28F, 0x3FF3320A,0xBF1428A7, + 0x40049999,0x9999999A, 0x3FF334BA,0xFDD43518, + 0x4004A3D7,0x0A3D70A4, 0x3FF33768,0xEB03BC31, + 0x4004AE14,0x7AE147AE, 0x3FF33A14,0x897B0939, + 0x4004B851,0xEB851EB8, 0x3FF33CBD,0xDC0E06D0, + 0x4004C28F,0x5C28F5C3, 0x3FF33F64,0xE58C46B4, + 0x4004CCCC,0xCCCCCCCD, 0x3FF34209,0xA8C10980, + 0x4004D70A,0x3D70A3D7, 0x3FF344AC,0x28734659, + 0x4004E147,0xAE147AE1, 0x3FF3474C,0x6765B28B, + 0x4004EB85,0x1EB851EC, 0x3FF349EA,0x6856C91E, + 0x4004F5C2,0x8F5C28F6, 0x3FF34C86,0x2E00D24E, + 0x40050000,0x00000000, 0x3FF34F1F,0xBB19EB09, + 0x40050A3D,0x70A3D70A, 0x3FF351B7,0x12540C4D, + 0x4005147A,0xE147AE14, 0x3FF3544C,0x365D127F, + 0x40051EB8,0x51EB851F, 0x3FF356DF,0x29DEC4B8, + 0x400528F5,0xC28F5C29, 0x3FF3596F,0xEF7EDBFB, + 0x40053333,0x33333333, 0x3FF35BFE,0x89DF0A64, + 0x40053D70,0xA3D70A3D, 0x3FF35E8A,0xFB9D0248, + 0x400547AE,0x147AE148, 0x3FF36115,0x47527D45, + 0x400551EB,0x851EB852, 0x3FF3639D,0x6F954344, + 0x40055C28,0xF5C28F5C, 0x3FF36623,0x76F73175, + 0x40056666,0x66666666, 0x3FF368A7,0x60064132, + 0x400570A3,0xD70A3D71, 0x3FF36B29,0x2D4C8EE0, + 0x40057AE1,0x47AE147B, 0x3FF36DA8,0xE15060B9, + 0x4005851E,0xB851EB85, 0x3FF37026,0x7E942D93, + 0x40058F5C,0x28F5C28F, 0x3FF372A2,0x0796A38D, + 0x40059999,0x9999999A, 0x3FF3751B,0x7ED2AEC1, + 0x4005A3D7,0x0A3D70A4, 0x3FF37792,0xE6BF7FD4, + 0x4005AE14,0x7AE147AE, 0x3FF37A08,0x41D0928E, + 0x4005B851,0xEB851EB8, 0x3FF37C7B,0x9275B456, + 0x4005C28F,0x5C28F5C3, 0x3FF37EEC,0xDB1B0AA9, + 0x4005CCCC,0xCCCCCCCD, 0x3FF3815C,0x1E291982, + 0x4005D70A,0x3D70A3D7, 0x3FF383C9,0x5E04C9B9, + 0x4005E147,0xAE147AE1, 0x3FF38634,0x9D0F6F50, + 0x4005EB85,0x1EB851EC, 0x3FF3889D,0xDDA6CFBC, + 0x4005F5C2,0x8F5C28F6, 0x3FF38B05,0x22252817, + 0x40060000,0x00000000, 0x3FF38D6A,0x6CE13353, + 0x40060A3D,0x70A3D70A, 0x3FF38FCD,0xC02E3054, + 0x4006147A,0xE147AE14, 0x3FF3922F,0x1E5BE80C, + 0x40061EB8,0x51EB851F, 0x3FF3948E,0x89B6B37D, + 0x400628F5,0xC28F5C29, 0x3FF396EC,0x048781BA, + 0x40063333,0x33333333, 0x3FF39947,0x9113DDDA, + 0x40063D70,0xA3D70A3D, 0x3FF39BA1,0x319DF4DD, + 0x400647AE,0x147AE148, 0x3FF39DF8,0xE8649B87, + 0x400651EB,0x851EB852, 0x3FF3A04E,0xB7A35432, + 0x40065C28,0xF5C28F5C, 0x3FF3A2A2,0xA1925490, + 0x40066666,0x66666666, 0x3FF3A4F4,0xA8668B69, + 0x400670A3,0xD70A3D71, 0x3FF3A744,0xCE51A646, + 0x40067AE1,0x47AE147B, 0x3FF3A993,0x15821717, + 0x4006851E,0xB851EB85, 0x3FF3ABDF,0x802319CC, + 0x40068F5C,0x28F5C28F, 0x3FF3AE2A,0x105CB9E3, + 0x40069999,0x9999999A, 0x3FF3B072,0xC853D7EF, + 0x4006A3D7,0x0A3D70A4, 0x3FF3B2B9,0xAA2A2F0B, + 0x4006AE14,0x7AE147AE, 0x3FF3B4FE,0xB7FE5A50, + 0x4006B851,0xEB851EB8, 0x3FF3B741,0xF3EBDA34, + 0x4006C28F,0x5C28F5C3, 0x3FF3B983,0x600B19E7, + 0x4006CCCC,0xCCCCCCCD, 0x3FF3BBC2,0xFE7174A3, + 0x4006D70A,0x3D70A3D7, 0x3FF3BE00,0xD1313AF0, + 0x4006E147,0xAE147AE1, 0x3FF3C03C,0xDA59B7E2, + 0x4006EB85,0x1EB851EC, 0x3FF3C277,0x1BF73649, + 0x4006F5C2,0x8F5C28F6, 0x3FF3C4AF,0x981305D8, + 0x40070000,0x00000000, 0x3FF3C6E6,0x50B38047, + 0x40070A3D,0x70A3D70A, 0x3FF3C91B,0x47DC0E63, + 0x4007147A,0xE147AE14, 0x3FF3CB4E,0x7F8D2D1A, + 0x40071EB8,0x51EB851F, 0x3FF3CD7F,0xF9C4727D, + 0x400728F5,0xC28F5C29, 0x3FF3CFAF,0xB87C92B4, + 0x40073333,0x33333333, 0x3FF3D1DD,0xBDAD64F0, + 0x40073D70,0xA3D70A3D, 0x3FF3D40A,0x0B4BE84E, + 0x400747AE,0x147AE148, 0x3FF3D634,0xA34A48B1, + 0x400751EB,0x851EB852, 0x3FF3D85D,0x8797E394, + 0x40075C28,0xF5C28F5C, 0x3FF3DA84,0xBA214CD5, + 0x40076666,0x66666666, 0x3FF3DCAA,0x3CD05374, + 0x400770A3,0xD70A3D71, 0x3FF3DECE,0x118C0645, + 0x40077AE1,0x47AE147B, 0x3FF3E0F0,0x3A38B8A5, + 0x4007851E,0xB851EB85, 0x3FF3E310,0xB8B8071A, + 0x40078F5C,0x28F5C28F, 0x3FF3E52F,0x8EE8DBF0, + 0x40079999,0x9999999A, 0x3FF3E74C,0xBEA773CD, + 0x4007A3D7,0x0A3D70A4, 0x3FF3E968,0x49CD6239, + 0x4007AE14,0x7AE147AE, 0x3FF3EB82,0x32319624, + 0x4007B851,0xEB851EB8, 0x3FF3ED9A,0x79A85E5C, + 0x4007C28F,0x5C28F5C3, 0x3FF3EFB1,0x22036DFF, + 0x4007CCCC,0xCCCCCCCD, 0x3FF3F1C6,0x2D11E0E2, + 0x4007D70A,0x3D70A3D7, 0x3FF3F3D9,0x9CA03FF5, + 0x4007E147,0xAE147AE1, 0x3FF3F5EB,0x72788596, + 0x4007EB85,0x1EB851EC, 0x3FF3F7FB,0xB06221E3, + 0x4007F5C2,0x8F5C28F6, 0x3FF3FA0A,0x5821FF02, + 0x40080000,0x00000000, 0x3FF3FC17,0x6B7A8560, + 0x40080A3D,0x70A3D70A, 0x3FF3FE22,0xEC2B9FE6, + 0x4008147A,0xE147AE14, 0x3FF4002C,0xDBF2C02B, + 0x40081EB8,0x51EB851F, 0x3FF40235,0x3C8AE29A, + 0x400828F5,0xC28F5C29, 0x3FF4043C,0x0FAC9294, + 0x40083333,0x33333333, 0x3FF40641,0x570DEE83, + 0x40083D70,0xA3D70A3D, 0x3FF40845,0x1462ABEF, + 0x400847AE,0x147AE148, 0x3FF40A47,0x495C1B85, + 0x400851EB,0x851EB852, 0x3FF40C47,0xF7A92D14, + 0x40085C28,0xF5C28F5C, 0x3FF40E47,0x20F6738D, + 0x40086666,0x66666666, 0x3FF41044,0xC6EE28EF, + 0x400870A3,0xD70A3D71, 0x3FF41240,0xEB383236, + 0x40087AE1,0x47AE147B, 0x3FF4143B,0x8F7A2339, + 0x4008851E,0xB851EB85, 0x3FF41634,0xB5574289, + 0x40088F5C,0x28F5C28F, 0x3FF4182C,0x5E708D48, + 0x40089999,0x9999999A, 0x3FF41A22,0x8C64BAEF, + 0x4008A3D7,0x0A3D70A4, 0x3FF41C17,0x40D0411B, + 0x4008AE14,0x7AE147AE, 0x3FF41E0A,0x7D4D5747, + 0x4008B851,0xEB851EB8, 0x3FF41FFC,0x4373FA89, + 0x4008C28F,0x5C28F5C3, 0x3FF421EC,0x94D9F140, + 0x4008CCCC,0xCCCCCCCD, 0x3FF423DB,0x7312CEBC, + 0x4008D70A,0x3D70A3D7, 0x3FF425C8,0xDFAFF6E8, + 0x4008E147,0xAE147AE1, 0x3FF427B4,0xDC40A1DF, + 0x4008EB85,0x1EB851EC, 0x3FF4299F,0x6A51DF87, + 0x4008F5C2,0x8F5C28F6, 0x3FF42B88,0x8B6E9B1D, + 0x40090000,0x00000000, 0x3FF42D70,0x411F9EC1, + 0x40090A3D,0x70A3D70A, 0x3FF42F56,0x8CEB96F3, + 0x4009147A,0xE147AE14, 0x3FF4313B,0x70571611, + 0x40091EB8,0x51EB851F, 0x3FF4331E,0xECE497CD, + 0x400928F5,0xC28F5C29, 0x3FF43501,0x04148498, + 0x40093333,0x33333333, 0x3FF436E1,0xB765350D, + 0x40093D70,0xA3D70A3D, 0x3FF438C1,0x0852F552, + 0x400947AE,0x147AE148, 0x3FF43A9E,0xF8580870, + 0x400951EB,0x851EB852, 0x3FF43C7B,0x88ECABAD, + 0x40095C28,0xF5C28F5C, 0x3FF43E56,0xBB8719D9, + 0x40096666,0x66666666, 0x3FF44030,0x919B8E94, + 0x400970A3,0xD70A3D71, 0x3FF44209,0x0C9C4997, + 0x40097AE1,0x47AE147B, 0x3FF443E0,0x2DF991E9, + 0x4009851E,0xB851EB85, 0x3FF445B5,0xF721B91A, + 0x40098F5C,0x28F5C28F, 0x3FF4478A,0x69811E74, + 0x40099999,0x9999999A, 0x3FF4495D,0x86823225, + 0x4009A3D7,0x0A3D70A4, 0x3FF44B2F,0x4F8D7863, + 0x4009AE14,0x7AE147AE, 0x3FF44CFF,0xC6098C8B, + 0x4009B851,0xEB851EB8, 0x3FF44ECE,0xEB5B243C, + 0x4009C28F,0x5C28F5C3, 0x3FF4509C,0xC0E51269, + 0x4009CCCC,0xCCCCCCCD, 0x3FF45269,0x48084A68, + 0x4009D70A,0x3D70A3D7, 0x3FF45434,0x8223E2FA, + 0x4009E147,0xAE147AE1, 0x3FF455FE,0x7095194D, + 0x4009EB85,0x1EB851EC, 0x3FF457C7,0x14B753F9, + 0x4009F5C2,0x8F5C28F6, 0x3FF4598E,0x6FE425FA, + 0x400A0000,0x00000000, 0x3FF45B54,0x837351A0, + 0x400A0A3D,0x70A3D70A, 0x3FF45D19,0x50BACB7B, + 0x400A147A,0xE147AE14, 0x3FF45EDC,0xD90EBD46, + 0x400A1EB8,0x51EB851F, 0x3FF4609F,0x1DC188C4, + 0x400A28F5,0xC28F5C29, 0x3FF46260,0x2023CAA2, + 0x400A3333,0x33333333, 0x3FF4641F,0xE1845D4B, + 0x400A3D70,0xA3D70A3D, 0x3FF465DE,0x63305BBC, + 0x400A47AE,0x147AE148, 0x3FF4679B,0xA6732450, + 0x400A51EB,0x851EB852, 0x3FF46957,0xAC965B89, + 0x400A5C28,0xF5C28F5C, 0x3FF46B12,0x76E1EED2, + 0x400A6666,0x66666666, 0x3FF46CCC,0x069C173F, + 0x400A70A3,0xD70A3D71, 0x3FF46E84,0x5D095C43, + 0x400A7AE1,0x47AE147B, 0x3FF4703B,0x7B6C9666, + 0x400A851E,0xB851EB85, 0x3FF471F1,0x6306F1F3, + 0x400A8F5C,0x28F5C28F, 0x3FF473A6,0x1517F1A2, + 0x400A9999,0x9999999A, 0x3FF47559,0x92DD7141, + 0x400AA3D7,0x0A3D70A4, 0x3FF4770B,0xDD93A84C, + 0x400AAE14,0x7AE147AE, 0x3FF478BC,0xF6752C91, + 0x400AB851,0xEB851EB8, 0x3FF47A6C,0xDEBAF4C4, + 0x400AC28F,0x5C28F5C3, 0x3FF47C1B,0x979C5B11, + 0x400ACCCC,0xCCCCCCCD, 0x3FF47DC9,0x224F1FA8, + 0x400AD70A,0x3D70A3D7, 0x3FF47F75,0x80076B48, + 0x400AE147,0xAE147AE1, 0x3FF48120,0xB1F7D1C5, + 0x400AEB85,0x1EB851EC, 0x3FF482CA,0xB9515482, + 0x400AF5C2,0x8F5C28F6, 0x3FF48473,0x974364F3, + 0x400B0000,0x00000000, 0x3FF4861B,0x4CFBE710, + 0x400B0A3D,0x70A3D70A, 0x3FF487C1,0xDBA733C7, + 0x400B147A,0xE147AE14, 0x3FF48967,0x44701B6B, + 0x400B1EB8,0x51EB851F, 0x3FF48B0B,0x887FE81E, + 0x400B28F5,0xC28F5C29, 0x3FF48CAE,0xA8FE6036, + 0x400B3333,0x33333333, 0x3FF48E50,0xA711C89D, + 0x400B3D70,0xA3D70A3D, 0x3FF48FF1,0x83DEE72D, + 0x400B47AE,0x147AE148, 0x3FF49191,0x4089050A, + 0x400B51EB,0x851EB852, 0x3FF4932F,0xDE31F0F7, + 0x400B5C28,0xF5C28F5C, 0x3FF494CD,0x5DFA01A1, + 0x400B6666,0x66666666, 0x3FF49669,0xC10017F1, + 0x400B70A3,0xD70A3D71, 0x3FF49805,0x0861A150, + 0x400B7AE1,0x47AE147B, 0x3FF4999F,0x353A99EA, + 0x400B851E,0xB851EB85, 0x3FF49B38,0x48A58EF0, + 0x400B8F5C,0x28F5C28F, 0x3FF49CD0,0x43BBA0D1, + 0x400B9999,0x9999999A, 0x3FF49E67,0x27948576, + 0x400BA3D7,0x0A3D70A4, 0x3FF49FFC,0xF5468A6D, + 0x400BAE14,0x7AE147AE, 0x3FF4A191,0xADE69723, + 0x400BB851,0xEB851EB8, 0x3FF4A325,0x52882F07, + 0x400BC28F,0x5C28F5C3, 0x3FF4A4B7,0xE43D73B8, + 0x400BCCCC,0xCCCCCCCD, 0x3FF4A649,0x64172723, + 0x400BD70A,0x3D70A3D7, 0x3FF4A7D9,0xD324ADA9, + 0x400BE147,0xAE147AE1, 0x3FF4A969,0x32741038, + 0x400BEB85,0x1EB851EC, 0x3FF4AAF7,0x8311FE65, + 0x400BF5C2,0x8F5C28F6, 0x3FF4AC84,0xC609D080, + 0x400C0000,0x00000000, 0x3FF4AE10,0xFC6589A5, + 0x400C0A3D,0x70A3D70A, 0x3FF4AF9C,0x272DD9CA, + 0x400C147A,0xE147AE14, 0x3FF4B126,0x476A1FCA, + 0x400C1EB8,0x51EB851F, 0x3FF4B2AF,0x5E206B6A, + 0x400C28F5,0xC28F5C29, 0x3FF4B437,0x6C557F5A, + 0x400C3333,0x33333333, 0x3FF4B5BE,0x730CD339, + 0x400C3D70,0xA3D70A3D, 0x3FF4B744,0x7348958C, + 0x400C47AE,0x147AE148, 0x3FF4B8C9,0x6E09ADB7, + 0x400C51EB,0x851EB852, 0x3FF4BA4D,0x644FBDF4, + 0x400C5C28,0xF5C28F5C, 0x3FF4BBD0,0x57192542, + 0x400C6666,0x66666666, 0x3FF4BD52,0x47630152, + 0x400C70A3,0xD70A3D71, 0x3FF4BED3,0x36293075, + 0x400C7AE1,0x47AE147B, 0x3FF4C053,0x2466537E, + 0x400C851E,0xB851EB85, 0x3FF4C1D2,0x1313CFAB, + 0x400C8F5C,0x28F5C28F, 0x3FF4C350,0x0329D080, + 0x400C9999,0x9999999A, 0x3FF4C4CC,0xF59F49A8, + 0x400CA3D7,0x0A3D70A4, 0x3FF4C648,0xEB69F8CE, + 0x400CAE14,0x7AE147AE, 0x3FF4C7C3,0xE57E6771, + 0x400CB851,0xEB851EB8, 0x3FF4C93D,0xE4CFECBA, + 0x400CC28F,0x5C28F5C3, 0x3FF4CAB6,0xEA50AF4C, + 0x400CCCCC,0xCCCCCCCD, 0x3FF4CC2E,0xF6F1A710, + 0x400CD70A,0x3D70A3D7, 0x3FF4CDA6,0x0BA29EFD, + 0x400CE147,0xAE147AE1, 0x3FF4CF1C,0x295236E4, + 0x400CEB85,0x1EB851EC, 0x3FF4D091,0x50EDE52D, + 0x400CF5C2,0x8F5C28F6, 0x3FF4D205,0x8361F89C, + 0x400D0000,0x00000000, 0x3FF4D378,0xC1999A0D, + 0x400D0A3D,0x70A3D70A, 0x3FF4D4EB,0x0C7ECE2F, + 0x400D147A,0xE147AE14, 0x3FF4D65C,0x64FA7739, + 0x400D1EB8,0x51EB851F, 0x3FF4D7CC,0xCBF456A3, + 0x400D28F5,0xC28F5C29, 0x3FF4D93C,0x42530ED3, + 0x400D3333,0x33333333, 0x3FF4DAAA,0xC8FC24CC, + 0x400D3D70,0xA3D70A3D, 0x3FF4DC18,0x60D401DE, + 0x400D47AE,0x147AE148, 0x3FF4DD85,0x0ABDF549, + 0x400D51EB,0x851EB852, 0x3FF4DEF0,0xC79C35E6, + 0x400D5C28,0xF5C28F5C, 0x3FF4E05B,0x984FE3C9, + 0x400D6666,0x66666666, 0x3FF4E1C5,0x7DB909E3, + 0x400D70A3,0xD70A3D71, 0x3FF4E32E,0x78B69F9C, + 0x400D7AE1,0x47AE147B, 0x3FF4E496,0x8A268A70, + 0x400D851E,0xB851EB85, 0x3FF4E5FD,0xB2E59F85, + 0x400D8F5C,0x28F5C28F, 0x3FF4E763,0xF3CFA543, + 0x400D9999,0x9999999A, 0x3FF4E8C9,0x4DBF54E5, + 0x400DA3D7,0x0A3D70A4, 0x3FF4EA2D,0xC18E5C04, + 0x400DAE14,0x7AE147AE, 0x3FF4EB91,0x50155E2D, + 0x400DB851,0xEB851EB8, 0x3FF4ECF3,0xFA2BF662, + 0x400DC28F,0x5C28F5C3, 0x3FF4EE55,0xC0A8B8AA, + 0x400DCCCC,0xCCCCCCCD, 0x3FF4EFB6,0xA461338E, + 0x400DD70A,0x3D70A3D7, 0x3FF4F116,0xA629F1A2, + 0x400DE147,0xAE147AE1, 0x3FF4F275,0xC6D67B00, + 0x400DEB85,0x1EB851EC, 0x3FF4F3D4,0x073956CA, + 0x400DF5C2,0x8F5C28F6, 0x3FF4F531,0x68240C9F, + 0x400E0000,0x00000000, 0x3FF4F68D,0xEA672617, + 0x400E0A3D,0x70A3D70A, 0x3FF4F7E9,0x8ED2303A, + 0x400E147A,0xE147AE14, 0x3FF4F944,0x5633BCEF, + 0x400E1EB8,0x51EB851F, 0x3FF4FA9E,0x4159646F, + 0x400E28F5,0xC28F5C29, 0x3FF4FBF7,0x510FC6B2, + 0x400E3333,0x33333333, 0x3FF4FD4F,0x86228CDD, + 0x400E3D70,0xA3D70A3D, 0x3FF4FEA6,0xE15C6AAC, + 0x400E47AE,0x147AE148, 0x3FF4FFFD,0x63871FD3, + 0x400E51EB,0x851EB852, 0x3FF50153,0x0D6B7969, + 0x400E5C28,0xF5C28F5C, 0x3FF502A7,0xDFD15348, + 0x400E6666,0x66666666, 0x3FF503FB,0xDB7F996E, + 0x400E70A3,0xD70A3D71, 0x3FF5054F,0x013C4957, + 0x400E7AE1,0x47AE147B, 0x3FF506A1,0x51CC735C, + 0x400E851E,0xB851EB85, 0x3FF507F2,0xCDF43C0C, + 0x400E8F5C,0x28F5C28F, 0x3FF50943,0x7676DD80, + 0x400E9999,0x9999999A, 0x3FF50A93,0x4C16A8B1, + 0x400EA3D7,0x0A3D70A4, 0x3FF50BE2,0x4F9506CB, + 0x400EAE14,0x7AE147AE, 0x3FF50D30,0x81B27A7A, + 0x400EB851,0xEB851EB8, 0x3FF50E7D,0xE32EA13C, + 0x400EC28F,0x5C28F5C3, 0x3FF50FCA,0x74C834AA, + 0x400ECCCC,0xCCCCCCCD, 0x3FF51116,0x373D0BC2, + 0x400ED70A,0x3D70A3D7, 0x3FF51261,0x2B4A1C2D, + 0x400EE147,0xAE147AE1, 0x3FF513AB,0x51AB7B85, + 0x400EEB85,0x1EB851EC, 0x3FF514F4,0xAB1C6099, + 0x400EF5C2,0x8F5C28F6, 0x3FF5163D,0x385724AE, + 0x400F0000,0x00000000, 0x3FF51784,0xFA1544BA, + 0x400F0A3D,0x70A3D70A, 0x3FF518CB,0xF10F62A5, + 0x400F147A,0xE147AE14, 0x3FF51A12,0x1DFD4681, + 0x400F1EB8,0x51EB851F, 0x3FF51B57,0x8195DFC6, + 0x400F28F5,0xC28F5C29, 0x3FF51C9C,0x1C8F4682, + 0x400F3333,0x33333333, 0x3FF51DDF,0xEF9EBC94, + 0x400F3D70,0xA3D70A3D, 0x3FF51F22,0xFB78AEDC, + 0x400F47AE,0x147AE148, 0x3FF52065,0x40D0B66B, + 0x400F51EB,0x851EB852, 0x3FF521A6,0xC05999B0, + 0x400F5C28,0xF5C28F5C, 0x3FF522E7,0x7AC54DAA, + 0x400F6666,0x66666666, 0x3FF52427,0x70C4F70D, + 0x400F70A3,0xD70A3D71, 0x3FF52566,0xA308EB6C, + 0x400F7AE1,0x47AE147B, 0x3FF526A5,0x1240B261, + 0x400F851E,0xB851EB85, 0x3FF527E2,0xBF1B06B3, + 0x400F8F5C,0x28F5C28F, 0x3FF5291F,0xAA45D775, + 0x400F9999,0x9999999A, 0x3FF52A5B,0xD46E492A, + 0x400FA3D7,0x0A3D70A4, 0x3FF52B97,0x3E40B6E3, + 0x400FAE14,0x7AE147AE, 0x3FF52CD1,0xE868B35E, + 0x400FB851,0xEB851EB8, 0x3FF52E0B,0xD3910A1E, + 0x400FC28F,0x5C28F5C3, 0x3FF52F45,0x0063C08A, + 0x400FCCCC,0xCCCCCCCD, 0x3FF5307D,0x6F8A16FF, + 0x400FD70A,0x3D70A3D7, 0x3FF531B5,0x21AC89EA, + 0x400FE147,0xAE147AE1, 0x3FF532EC,0x1772D2DC, + 0x400FEB85,0x1EB851EC, 0x3FF53422,0x5183E999, + 0x400FF5C2,0x8F5C28F6, 0x3FF53557,0xD086052E, + 0x40100000,0x00000000, 0x3FF5368C,0x951E9CFD, + }; + +LOCAL_D const TUint32 ArcsinTest[] = + { + 0x00000000,0x00000000, 0x00000000,0x00000000, + 0x3F50624D,0xD2F1A9FC, 0x3F50624E,0x00C1CB16, + 0x3F60624D,0xD2F1A9FC, 0x3F60624E,0x8A323E9C, + 0x3F689374,0xBC6A7EFA, 0x3F689377,0x26E4CFC8, + 0x3F70624D,0xD2F1A9FC, 0x3F706250,0xAFF4FFE4, + 0x3F747AE1,0x47AE147B, 0x3F747AE6,0xDF5A1444, + 0x3F789374,0xBC6A7EFA, 0x3F78937E,0x665B741E, + 0x3F7CAC08,0x3126E979, 0x3F7CAC17,0x89B3B93C, + 0x3F80624D,0xD2F1A9FC, 0x3F806259,0x470F3852, + 0x3F826E97,0x8D4FDF3B, 0x3F826EA7,0xDC2C2190, + 0x3F847AE1,0x47AE147B, 0x3F847AF7,0xA68F8EEF, + 0x3F86872B,0x020C49BA, 0x3F868748,0xC8992D73, + 0x3F889374,0xBC6A7EFA, 0x3F88939B,0x64A974E9, + 0x3F8A9FBE,0x76C8B439, 0x3F8A9FEF,0x9D21BC1F, + 0x3F8CAC08,0x3126E979, 0x3F8CAC45,0x94644D43, + 0x3F8EB851,0xEB851EB8, 0x3F8EB89D,0x6CD47A22, + 0x3F90624D,0xD2F1A9FC, 0x3F90627B,0xA46B5841, + 0x3F916872,0xB020C49C, 0x3F9168A9,0xA5684739, + 0x3F926E97,0x8D4FDF3B, 0x3F926ED8,0xCA947B4B, + 0x3F9374BC,0x6A7EF9DB, 0x3F937509,0x25241246, + 0x3F947AE1,0x47AE147B, 0x3F947B3A,0xC64BE09A, + 0x3F958106,0x24DD2F1B, 0x3F95816D,0xBF417B8B, + 0x3F96872B,0x020C49BA, 0x3F9687A2,0x213B435B, + 0x3F978D4F,0xDF3B645A, 0x3F978DD7,0xFD706D7E, + 0x3F989374,0xBC6A7EFA, 0x3F98940F,0x65190EC9, + 0x3F999999,0x9999999A, 0x3F999A48,0x696E25A4, + 0x3F9A9FBE,0x76C8B439, 0x3F9AA083,0x1BA9A43C, + 0x3F9BA5E3,0x53F7CED9, 0x3F9BA6BF,0x8D067AC2, + 0x3F9CAC08,0x3126E979, 0x3F9CACFD,0xCEC0A195, + 0x3F9DB22D,0x0E560419, 0x3F9DB33D,0xF2152385, + 0x3F9EB851,0xEB851EB8, 0x3F9EB980,0x08422806, + 0x3F9FBE76,0xC8B43958, 0x3F9FBFC4,0x2286FD78, + 0x3FA0624D,0xD2F1A9FC, 0x3FA06305,0x291211AB, + 0x3FA0E560,0x4189374C, 0x3FA0E629,0x542DAA42, + 0x3FA16872,0xB020C49C, 0x3FA1694E,0x9B37C8C4, + 0x3FA1EB85,0x1EB851EC, 0x3FA1EC75,0x06D2956A, + 0x3FA26E97,0x8D4FDF3B, 0x3FA26F9C,0x9FA0E585, + 0x3FA2F1A9,0xFBE76C8B, 0x3FA2F2C5,0x6E4640A5, + 0x3FA374BC,0x6A7EF9DB, 0x3FA375EF,0x7B66E5B9, + 0x3FA3F7CE,0xD916872B, 0x3FA3F91A,0xCFA7D03C, + 0x3FA47AE1,0x47AE147B, 0x3FA47C47,0x73AEBD59, + 0x3FA4FDF3,0xB645A1CB, 0x3FA4FF75,0x70223116, + 0x3FA58106,0x24DD2F1B, 0x3FA582A4,0xCDA97B7C, + 0x3FA60418,0x9374BC6A, 0x3FA605D5,0x94ECBDC6, + 0x3FA6872B,0x020C49BA, 0x3FA68907,0xCE94EF8F, + 0x3FA70A3D,0x70A3D70A, 0x3FA70C3B,0x834BE3FC, + 0x3FA78D4F,0xDF3B645A, 0x3FA78F70,0xBBBC4EEF, + 0x3FA81062,0x4DD2F1AA, 0x3FA812A7,0x8091CA38, + 0x3FA89374,0xBC6A7EFA, 0x3FA895DF,0xDA78DAC7, + 0x3FA91687,0x2B020C4A, 0x3FA91919,0xD21EF5E2, + 0x3FA99999,0x9999999A, 0x3FA99C55,0x70328659, + 0x3FAA1CAC,0x083126E9, 0x3FAA1F92,0xBD62F1C0, + 0x3FAA9FBE,0x76C8B439, 0x3FAAA2D1,0xC2609DA6, + 0x3FAB22D0,0xE5604189, 0x3FAB2612,0x87DCF4D2, + 0x3FABA5E3,0x53F7CED9, 0x3FABA955,0x168A6C7B, + 0x3FAC28F5,0xC28F5C29, 0x3FAC2C99,0x771C898D, + 0x3FACAC08,0x3126E979, 0x3FACAFDF,0xB247E5E4, + 0x3FAD2F1A,0x9FBE76C9, 0x3FAD3327,0xD0C2358D, + 0x3FADB22D,0x0E560419, 0x3FADB671,0xDB424C0E, + 0x3FAE353F,0x7CED9168, 0x3FAE39BD,0xDA8021AA, + 0x3FAEB851,0xEB851EB8, 0x3FAEBD0B,0xD734D8A7, + 0x3FAF3B64,0x5A1CAC08, 0x3FAF405B,0xDA1AC296, + 0x3FAFBE76,0xC8B43958, 0x3FAFC3AD,0xEBED65A4, + 0x3FB020C4,0x9BA5E354, 0x3FB02381,0x0AB4C0F0, + 0x3FB0624D,0xD2F1A9FC, 0x3FB0652C,0x2FA68B47, + 0x3FB0A3D7,0x0A3D70A4, 0x3FB0A6D8,0x692BB3BD, + 0x3FB0E560,0x4189374C, 0x3FB0E885,0xBBA48126, + 0x3FB126E9,0x78D4FDF4, 0x3FB12A34,0x2B71E1EA, + 0x3FB16872,0xB020C49C, 0x3FB16BE3,0xBCF56EB9, + 0x3FB1A9FB,0xE76C8B44, 0x3FB1AD94,0x74916D30, + 0x3FB1EB85,0x1EB851EC, 0x3FB1EF46,0x56A8D28C, + 0x3FB22D0E,0x56041893, 0x3FB230F9,0x679F465A, + 0x3FB26E97,0x8D4FDF3B, 0x3FB272AD,0xABD92523, + 0x3FB2B020,0xC49BA5E3, 0x3FB2B463,0x27BB8322, + 0x3FB2F1A9,0xFBE76C8B, 0x3FB2F619,0xDFAC2EF4, + 0x3FB33333,0x33333333, 0x3FB337D1,0xD811B44C, + 0x3FB374BC,0x6A7EF9DB, 0x3FB3798B,0x15535EAC, + 0x3FB3B645,0xA1CAC083, 0x3FB3BB45,0x9BD93C18, + 0x3FB3F7CE,0xD916872B, 0x3FB3FD01,0x700C1FCD, + 0x3FB43958,0x10624DD3, 0x3FB43EBE,0x9655A4FE, + 0x3FB47AE1,0x47AE147B, 0x3FB4807D,0x1320318C, + 0x3FB4BC6A,0x7EF9DB23, 0x3FB4C23C,0xEAD6F8C2, + 0x3FB4FDF3,0xB645A1CB, 0x3FB503FE,0x21E5FE10, + 0x3FB53F7C,0xED916873, 0x3FB545C0,0xBCBA17CF, + 0x3FB58106,0x24DD2F1B, 0x3FB58784,0xBFC0F1FC, + 0x3FB5C28F,0x5C28F5C3, 0x3FB5C94A,0x2F6910FA, + 0x3FB60418,0x9374BC6A, 0x3FB60B11,0x1021D455, + 0x3FB645A1,0xCAC08312, 0x3FB64CD9,0x665B798B, + 0x3FB6872B,0x020C49BA, 0x3FB68EA3,0x36871EC7, + 0x3FB6C8B4,0x39581062, 0x3FB6D06E,0x8516C5B3, + 0x3FB70A3D,0x70A3D70A, 0x3FB7123B,0x567D5638, + 0x3FB74BC6,0xA7EF9DB2, 0x3FB75409,0xAF2EA14F, + 0x3FB78D4F,0xDF3B645A, 0x3FB795D9,0x939F63C8, + 0x3FB7CED9,0x16872B02, 0x3FB7D7AB,0x08454918, + 0x3FB81062,0x4DD2F1AA, 0x3FB8197E,0x1196EE2A, + 0x3FB851EB,0x851EB852, 0x3FB85B52,0xB40BE42D, + 0x3FB89374,0xBC6A7EFA, 0x3FB89D28,0xF41CB367, + 0x3FB8D4FD,0xF3B645A2, 0x3FB8DF00,0xD642DE09, + 0x3FB91687,0x2B020C4A, 0x3FB920DA,0x5EF8E302, + 0x3FB95810,0x624DD2F2, 0x3FB962B5,0x92BA40D9, + 0x3FB99999,0x9999999A, 0x3FB9A492,0x76037884, + 0x3FB9DB22,0xD0E56042, 0x3FB9E671,0x0D521043, + 0x3FBA1CAC,0x083126E9, 0x3FBA2851,0x5D24967A, + 0x3FBA5E35,0x3F7CED91, 0x3FBA6A33,0x69FAA495, + 0x3FBA9FBE,0x76C8B439, 0x3FBAAC17,0x3854E1DE, + 0x3FBAE147,0xAE147AE1, 0x3FBAEDFC,0xCCB50667, + 0x3FBB22D0,0xE5604189, 0x3FBB2FE4,0x2B9DDDEA, + 0x3FBB645A,0x1CAC0831, 0x3FBB71CD,0x59934AAC, + 0x3FBBA5E3,0x53F7CED9, 0x3FBBB3B8,0x5B1A4868, + 0x3FBBE76C,0x8B439581, 0x3FBBF5A5,0x34B8EF36, + 0x3FBC28F5,0xC28F5C29, 0x3FBC3793,0xEAF67675, + 0x3FBC6A7E,0xF9DB22D1, 0x3FBC7984,0x825B37B8, + 0x3FBCAC08,0x3126E979, 0x3FBCBB76,0xFF70B1B6, + 0x3FBCED91,0x6872B021, 0x3FBCFD6B,0x66C18B3B, + 0x3FBD2F1A,0x9FBE76C9, 0x3FBD3F61,0xBCD99615, + 0x3FBD70A3,0xD70A3D71, 0x3FBD815A,0x0645D212, + 0x3FBDB22D,0x0E560419, 0x3FBDC354,0x47946FEE, + 0x3FBDF3B6,0x45A1CAC1, 0x3FBE0550,0x8554D451, + 0x3FBE353F,0x7CED9168, 0x3FBE474E,0xC4179AC6, + 0x3FBE76C8,0xB4395810, 0x3FBE894F,0x086E98BD, + 0x3FBEB851,0xEB851EB8, 0x3FBECB51,0x56ECE085, + 0x3FBEF9DB,0x22D0E560, 0x3FBF0D55,0xB426C44F, + 0x3FBF3B64,0x5A1CAC08, 0x3FBF4F5C,0x24B1D931, + 0x3FBF7CED,0x916872B0, 0x3FBF9164,0xAD24FA2C, + 0x3FBFBE76,0xC8B43958, 0x3FBFD36F,0x52184B35, + 0x3FC00000,0x00000000, 0x3FC00ABE,0x0C129E1E, + 0x3FC020C4,0x9BA5E354, 0x3FC02BC5,0x81F3461D, + 0x3FC04189,0x374BC6A8, 0x3FC04CCE,0x0CFC261F, + 0x3FC0624D,0xD2F1A9FC, 0x3FC06DD7,0xAF7BF140, + 0x3FC08312,0x6E978D50, 0x3FC08EE2,0x6BC206BA, + 0x3FC0A3D7,0x0A3D70A4, 0x3FC0AFEE,0x441E736F, + 0x3FC0C49B,0xA5E353F8, 0x3FC0D0FB,0x3AE1F374, + 0x3FC0E560,0x4189374C, 0x3FC0F209,0x525DF3A1, + 0x3FC10624,0xDD2F1AA0, 0x3FC11318,0x8CE4931C, + 0x3FC126E9,0x78D4FDF4, 0x3FC13428,0xECC8A4EA, + 0x3FC147AE,0x147AE148, 0x3FC1553A,0x745DB182, + 0x3FC16872,0xB020C49C, 0x3FC1764D,0x25F7F85B, + 0x3FC18937,0x4BC6A7F0, 0x3FC19761,0x03EC7181, + 0x3FC1A9FB,0xE76C8B44, 0x3FC1B876,0x1090CF2B, + 0x3FC1CAC0,0x83126E98, 0x3FC1D98C,0x4E3B7F50, + 0x3FC1EB85,0x1EB851EC, 0x3FC1FAA3,0xBF43AD3B, + 0x3FC20C49,0xBA5E353F, 0x3FC21BBC,0x66014327, + 0x3FC22D0E,0x56041893, 0x3FC23CD6,0x44CCEBDB, + 0x3FC24DD2,0xF1A9FBE7, 0x3FC25DF1,0x5E00143F, + 0x3FC26E97,0x8D4FDF3B, 0x3FC27F0D,0xB3F4ECFB, + 0x3FC28F5C,0x28F5C28F, 0x3FC2A02B,0x49066C16, + 0x3FC2B020,0xC49BA5E3, 0x3FC2C14A,0x1F904E95, + 0x3FC2D0E5,0x60418937, 0x3FC2E26A,0x39EF1A1A, + 0x3FC2F1A9,0xFBE76C8B, 0x3FC3038B,0x9A801E86, + 0x3FC3126E,0x978D4FDF, 0x3FC324AE,0x43A177A0, + 0x3FC33333,0x33333333, 0x3FC345D2,0x37B20EB3, + 0x3FC353F7,0xCED91687, 0x3FC366F7,0x79119C3B, + 0x3FC374BC,0x6A7EF9DB, 0x3FC3881E,0x0A20A988, + 0x3FC39581,0x0624DD2F, 0x3FC3A945,0xED40926B, + 0x3FC3B645,0xA1CAC083, 0x3FC3CA6F,0x24D386DB, + 0x3FC3D70A,0x3D70A3D7, 0x3FC3EB99,0xB33C8CA7, + 0x3FC3F7CE,0xD916872B, 0x3FC40CC5,0x9ADF8122, + 0x3FC41893,0x74BC6A7F, 0x3FC42DF2,0xDE211ACD, + 0x3FC43958,0x10624DD3, 0x3FC44F21,0x7F66EB10, + 0x3FC45A1C,0xAC083127, 0x3FC47051,0x81175FE6, + 0x3FC47AE1,0x47AE147B, 0x3FC49182,0xE599C592, + 0x3FC49BA5,0xE353F7CF, 0x3FC4B2B5,0xAF564857, + 0x3FC4BC6A,0x7EF9DB23, 0x3FC4D3E9,0xE0B5F62A, + 0x3FC4DD2F,0x1A9FBE77, 0x3FC4F51F,0x7C22C06F, + 0x3FC4FDF3,0xB645A1CB, 0x3FC51656,0x84077DB1, + 0x3FC51EB8,0x51EB851F, 0x3FC5378E,0xFACFEB5F, + 0x3FC53F7C,0xED916873, 0x3FC558C8,0xE2E8AF86, + 0x3FC56041,0x89374BC7, 0x3FC57A04,0x3EBF5A94, + 0x3FC58106,0x24DD2F1B, 0x3FC59B41,0x10C26917, + 0x3FC5A1CA,0xC083126F, 0x3FC5BC7F,0x5B61457F, + 0x3FC5C28F,0x5C28F5C3, 0x3FC5DDBF,0x210C49E2, + 0x3FC5E353,0xF7CED917, 0x3FC5FF00,0x6434C1C3, + 0x3FC60418,0x9374BC6A, 0x3FC62043,0x274CEBD8, + 0x3FC624DD,0x2F1A9FBE, 0x3FC64187,0x6CC7FBD5, + 0x3FC645A1,0xCAC08312, 0x3FC662CD,0x371A1C37, + 0x3FC66666,0x66666666, 0x3FC68414,0x88B8700C, + 0x3FC6872B,0x020C49BA, 0x3FC6A55D,0x641914C8, + 0x3FC6A7EF,0x9DB22D0E, 0x3FC6C6A7,0xCBB32413, + 0x3FC6C8B4,0x39581062, 0x3FC6E7F3,0xC1FEB599, + 0x3FC6E978,0xD4FDF3B6, 0x3FC70941,0x4974E0E2, + 0x3FC70A3D,0x70A3D70A, 0x3FC72A90,0x648FBF25, + 0x3FC72B02,0x0C49BA5E, 0x3FC74BE1,0x15CA6D21, + 0x3FC74BC6,0xA7EF9DB2, 0x3FC76D33,0x5FA10CF4, + 0x3FC76C8B,0x43958106, 0x3FC78E87,0x4490C7FD, + 0x3FC78D4F,0xDF3B645A, 0x3FC7AFDC,0xC717D0B2, + 0x3FC7AE14,0x7AE147AE, 0x3FC7D133,0xE9B56483, + 0x3FC7CED9,0x16872B02, 0x3FC7F28C,0xAEE9CDBD, + 0x3FC7EF9D,0xB22D0E56, 0x3FC813E7,0x19366568, + 0x3FC81062,0x4DD2F1AA, 0x3FC83543,0x2B1D9534, + 0x3FC83126,0xE978D4FE, 0x3FC856A0,0xE722D958, + 0x3FC851EB,0x851EB852, 0x3FC87800,0x4FCAC282, + 0x3FC872B0,0x20C49BA6, 0x3FC89961,0x679AF7BD, + 0x3FC89374,0xBC6A7EFA, 0x3FC8BAC4,0x311A3863, + 0x3FC8B439,0x5810624E, 0x3FC8DC28,0xAED05E0A, + 0x3FC8D4FD,0xF3B645A2, 0x3FC8FD8E,0xE3465E76, + 0x3FC8F5C2,0x8F5C28F6, 0x3FC91EF6,0xD1064D8C, + 0x3FC91687,0x2B020C4A, 0x3FC94060,0x7A9B5F4A, + 0x3FC9374B,0xC6A7EF9E, 0x3FC961CB,0xE291E9BC, + 0x3FC95810,0x624DD2F2, 0x3FC98339,0x0B7766F7, + 0x3FC978D4,0xFDF3B646, 0x3FC9A4A7,0xF7DA7718, + 0x3FC99999,0x9999999A, 0x3FC9C618,0xAA4AE23D, + 0x3FC9BA5E,0x353F7CEE, 0x3FC9E78B,0x25599A8C, + 0x3FC9DB22,0xD0E56042, 0x3FCA08FF,0x6B98BE30, + 0x3FC9FBE7,0x6C8B4396, 0x3FCA2A75,0x7F9B9963, + 0x3FCA1CAC,0x083126E9, 0x3FCA4BED,0x63F6A86F, + 0x3FCA3D70,0xA3D70A3D, 0x3FCA6D67,0x1B3F99C4, + 0x3FCA5E35,0x3F7CED91, 0x3FCA8EE2,0xA80D4FF3, + 0x3FCA7EF9,0xDB22D0E5, 0x3FCAB060,0x0CF7E3CA, + 0x3FCA9FBE,0x76C8B439, 0x3FCAD1DF,0x4C98A65F, + 0x3FCAC083,0x126E978D, 0x3FCAF360,0x698A2323, + 0x3FCAE147,0xAE147AE1, 0x3FCB14E3,0x666821F8, + 0x3FCB020C,0x49BA5E35, 0x3FCB3668,0x45CFA94C, + 0x3FCB22D0,0xE5604189, 0x3FCB57EF,0x0A5F002C, + 0x3FCB4395,0x810624DD, 0x3FCB7977,0xB6B5B067, + 0x3FCB645A,0x1CAC0831, 0x3FCB9B02,0x4D7488AA, + 0x3FCB851E,0xB851EB85, 0x3FCBBC8E,0xD13D9EA5, + 0x3FCBA5E3,0x53F7CED9, 0x3FCBDE1D,0x44B4512A, + 0x3FCBC6A7,0xEF9DB22D, 0x3FCBFFAD,0xAA7D4A58, + 0x3FCBE76C,0x8B439581, 0x3FCC2140,0x053E81C0, + 0x3FCC0831,0x26E978D5, 0x3FCC42D4,0x579F3E95, + 0x3FCC28F5,0xC28F5C29, 0x3FCC646A,0xA44819DA, + 0x3FCC49BA,0x5E353F7D, 0x3FCC8602,0xEDE3008D, + 0x3FCC6A7E,0xF9DB22D1, 0x3FCCA79D,0x371B35E4, + 0x3FCC8B43,0x95810625, 0x3FCCC939,0x829D557A, + 0x3FCCAC08,0x3126E979, 0x3FCCEAD7,0xD317558E, + 0x3FCCCCCC,0xCCCCCCCD, 0x3FCD0C78,0x2B38893C, + 0x3FCCED91,0x6872B021, 0x3FCD2E1A,0x8DB1A2BB, + 0x3FCD0E56,0x04189375, 0x3FCD4FBE,0xFD34B5A2, + 0x3FCD2F1A,0x9FBE76C9, 0x3FCD7165,0x7C753923, + 0x3FCD4FDF,0x3B645A1D, 0x3FCD930E,0x0E280A5D, + 0x3FCD70A3,0xD70A3D71, 0x3FCDB4B8,0xB5036E9A, + 0x3FCD9168,0x72B020C5, 0x3FCDD665,0x73BF15A5, + 0x3FCDB22D,0x0E560419, 0x3FCDF814,0x4D141C12, + 0x3FCDD2F1,0xA9FBE76D, 0x3FCE19C5,0x43BD0D92, + 0x3FCDF3B6,0x45A1CAC1, 0x3FCE3B78,0x5A75E74C, + 0x3FCE147A,0xE147AE14, 0x3FCE5D2D,0x93FC1A2B, + 0x3FCE353F,0x7CED9168, 0x3FCE7EE4,0xF30E8D46, + 0x3FCE5604,0x189374BC, 0x3FCEA09E,0x7A6DA030, + 0x3FCE76C8,0xB4395810, 0x3FCEC25A,0x2CDB2D60, + 0x3FCE978D,0x4FDF3B64, 0x3FCEE418,0x0D1A8C97, + 0x3FCEB851,0xEB851EB8, 0x3FCF05D8,0x1DF0953F, + 0x3FCED916,0x872B020C, 0x3FCF279A,0x6223A0DB, + 0x3FCEF9DB,0x22D0E560, 0x3FCF495E,0xDC7B8D71, + 0x3FCF1A9F,0xBE76C8B4, 0x3FCF6B25,0x8FC1BFFB, + 0x3FCF3B64,0x5A1CAC08, 0x3FCF8CEE,0x7EC126D9, + 0x3FCF5C28,0xF5C28F5C, 0x3FCFAEB9,0xAC463C49, + 0x3FCF7CED,0x916872B0, 0x3FCFD087,0x1B1F08DD, + 0x3FCF9DB2,0x2D0E5604, 0x3FCFF256,0xCE1B25FE, + 0x3FCFBE76,0xC8B43958, 0x3FD00A14,0x6405E032, + 0x3FCFDF3B,0x645A1CAC, 0x3FD01AFE,0x85E1CD4F, + 0x3FD00000,0x00000000, 0x3FD02BE9,0xCE0B87CD, + 0x3FD01062,0x4DD2F1AA, 0x3FD03CD6,0x3DEE0A95, + 0x3FD020C4,0x9BA5E354, 0x3FD04DC3,0xD6F51F49, + 0x3FD03126,0xE978D4FE, 0x3FD05EB2,0x9A8D5F8F, + 0x3FD04189,0x374BC6A8, 0x3FD06FA2,0x8A243657, + 0x3FD051EB,0x851EB852, 0x3FD08093,0xA727E129, + 0x3FD0624D,0xD2F1A9FC, 0x3FD09185,0xF3077174, + 0x3FD072B0,0x20C49BA6, 0x3FD0A279,0x6F32CDD9, + 0x3FD08312,0x6E978D50, 0x3FD0B36E,0x1D1AB37E, + 0x3FD09374,0xBC6A7EFA, 0x3FD0C463,0xFE30B761, + 0x3FD0A3D7,0x0A3D70A4, 0x3FD0D55B,0x13E747AE, + 0x3FD0B439,0x5810624E, 0x3FD0E653,0x5FB1AD12, + 0x3FD0C49B,0xA5E353F8, 0x3FD0F74C,0xE3040C13, + 0x3FD0D4FD,0xF3B645A2, 0x3FD10847,0x9F53666F, + 0x3FD0E560,0x4189374C, 0x3FD11943,0x96159C73, + 0x3FD0F5C2,0x8F5C28F6, 0x3FD12A40,0xC8C16E57, + 0x3FD10624,0xDD2F1AA0, 0x3FD13B3F,0x38CE7DA4, + 0x3FD11687,0x2B020C4A, 0x3FD14C3E,0xE7B54E92, + 0x3FD126E9,0x78D4FDF4, 0x3FD15D3F,0xD6EF4967, + 0x3FD1374B,0xC6A7EF9E, 0x3FD16E42,0x07F6BBE6, + 0x3FD147AE,0x147AE148, 0x3FD17F45,0x7C46DAAB, + 0x3FD15810,0x624DD2F2, 0x3FD1904A,0x355BC29E, + 0x3FD16872,0xB020C49C, 0x3FD1A150,0x34B27A57, + 0x3FD178D4,0xFDF3B646, 0x3FD1B257,0x7BC8F38F, + 0x3FD18937,0x4BC6A7F0, 0x3FD1C360,0x0C1E0C8F, + 0x3FD19999,0x9999999A, 0x3FD1D469,0xE731919C, + 0x3FD1A9FB,0xE76C8B44, 0x3FD1E575,0x0E843E73, + 0x3FD1BA5E,0x353F7CEE, 0x3FD1F681,0x8397BFB6, + 0x3FD1CAC0,0x83126E98, 0x3FD2078F,0x47EEB468, + 0x3FD1DB22,0xD0E56042, 0x3FD2189E,0x5D0CAF65, + 0x3FD1EB85,0x1EB851EC, 0x3FD229AE,0xC47638DD, + 0x3FD1FBE7,0x6C8B4396, 0x3FD23AC0,0x7FB0CFD1, + 0x3FD20C49,0xBA5E353F, 0x3FD24BD3,0x9042EB95, + 0x3FD21CAC,0x083126E9, 0x3FD25CE7,0xF7B3FD52, + 0x3FD22D0E,0x56041893, 0x3FD26DFD,0xB78C7184, + 0x3FD23D70,0xA3D70A3D, 0x3FD27F14,0xD155B18A, + 0x3FD24DD2,0xF1A9FBE7, 0x3FD2902D,0x469A2525, + 0x3FD25E35,0x3F7CED91, 0x3FD2A147,0x18E5340A, + 0x3FD26E97,0x8D4FDF3B, 0x3FD2B262,0x49C3476A, + 0x3FD27EF9,0xDB22D0E5, 0x3FD2C37E,0xDAC1CB83, + 0x3FD28F5C,0x28F5C28F, 0x3FD2D49C,0xCD6F3133, + 0x3FD29FBE,0x76C8B439, 0x3FD2E5BC,0x235AEF89, + 0x3FD2B020,0xC49BA5E3, 0x3FD2F6DC,0xDE15855C, + 0x3FD2C083,0x126E978D, 0x3FD307FE,0xFF307AE5, + 0x3FD2D0E5,0x60418937, 0x3FD31922,0x883E6357, + 0x3FD2E147,0xAE147AE1, 0x3FD32A47,0x7AD2DE7F, + 0x3FD2F1A9,0xFBE76C8B, 0x3FD33B6D,0xD8829A63, + 0x3FD3020C,0x49BA5E35, 0x3FD34C95,0xA2E354DF, + 0x3FD3126E,0x978D4FDF, 0x3FD35DBE,0xDB8BDD54, + 0x3FD322D0,0xE5604189, 0x3FD36EE9,0x84141643, + 0x3FD33333,0x33333333, 0x3FD38015,0x9E14F6FF, + 0x3FD34395,0x810624DD, 0x3FD39143,0x2B288D54, + 0x3FD353F7,0xCED91687, 0x3FD3A272,0x2CE9FF38, + 0x3FD3645A,0x1CAC0831, 0x3FD3B3A2,0xA4F58C7C, + 0x3FD374BC,0x6A7EF9DB, 0x3FD3C4D4,0x94E8907D, + 0x3FD3851E,0xB851EB85, 0x3FD3D607,0xFE6183DC, + 0x3FD39581,0x0624DD2F, 0x3FD3E73C,0xE2FFFE36, + 0x3FD3A5E3,0x53F7CED9, 0x3FD3F873,0x4464B7E1, + 0x3FD3B645,0xA1CAC083, 0x3FD409AB,0x24318BA6, + 0x3FD3C6A7,0xEF9DB22D, 0x3FD41AE4,0x84097887, + 0x3FD3D70A,0x3D70A3D7, 0x3FD42C1F,0x6590A37D, + 0x3FD3E76C,0x8B439581, 0x3FD43D5B,0xCA6C5942, + 0x3FD3F7CE,0xD916872B, 0x3FD44E99,0xB4431018, + 0x3FD40831,0x26E978D5, 0x3FD45FD9,0x24BC6995, + 0x3FD41893,0x74BC6A7F, 0x3FD4711A,0x1D813470, + 0x3FD428F5,0xC28F5C29, 0x3FD4825C,0xA03B6E54, + 0x3FD43958,0x10624DD3, 0x3FD493A0,0xAE9645B3, + 0x3FD449BA,0x5E353F7D, 0x3FD4A4E6,0x4A3E1B9F, + 0x3FD45A1C,0xAC083127, 0x3FD4B62D,0x74E0859E, + 0x3FD46A7E,0xF9DB22D1, 0x3FD4C776,0x302C4F8D, + 0x3FD47AE1,0x47AE147B, 0x3FD4D8C0,0x7DD17D7D, + 0x3FD48B43,0x95810625, 0x3FD4EA0C,0x5F814D93, + 0x3FD49BA5,0xE353F7CF, 0x3FD4FB59,0xD6EE39F3, + 0x3FD4AC08,0x3126E979, 0x3FD50CA8,0xE5CBFAA3, + 0x3FD4BC6A,0x7EF9DB23, 0x3FD51DF9,0x8DCF8779, + 0x3FD4CCCC,0xCCCCCCCD, 0x3FD52F4B,0xD0AF1A0B, + 0x3FD4DD2F,0x1A9FBE77, 0x3FD5409F,0xB0222F9E, + 0x3FD4ED91,0x6872B021, 0x3FD551F5,0x2DE18B1A, + 0x3FD4FDF3,0xB645A1CB, 0x3FD5634C,0x4BA73707, + 0x3FD50E56,0x04189375, 0x3FD574A5,0x0B2E8781, + 0x3FD51EB8,0x51EB851F, 0x3FD585FF,0x6E341C3E, + 0x3FD52F1A,0x9FBE76C9, 0x3FD5975B,0x7675E288, + 0x3FD53F7C,0xED916873, 0x3FD5A8B9,0x25B31747, + 0x3FD54FDF,0x3B645A1D, 0x3FD5BA18,0x7DAC4905, + 0x3FD56041,0x89374BC7, 0x3FD5CB79,0x802359FD, + 0x3FD570A3,0xD70A3D71, 0x3FD5DCDC,0x2EDB8227, + 0x3FD58106,0x24DD2F1B, 0x3FD5EE40,0x8B99514C, + 0x3FD59168,0x72B020C5, 0x3FD5FFA6,0x9822B118, + 0x3FD5A1CA,0xC083126F, 0x3FD6110E,0x563EE737, + 0x3FD5B22D,0x0E560419, 0x3FD62277,0xC7B6976D, + 0x3FD5C28F,0x5C28F5C3, 0x3FD633E2,0xEE53C5B9, + 0x3FD5D2F1,0xA9FBE76D, 0x3FD6454F,0xCBE1D876, + 0x3FD5E353,0xF7CED917, 0x3FD656BE,0x622D9A83, + 0x3FD5F3B6,0x45A1CAC1, 0x3FD6682E,0xB3053D6D, + 0x3FD60418,0x9374BC6A, 0x3FD679A0,0xC0385B9B, + 0x3FD6147A,0xE147AE14, 0x3FD68B14,0x8B97FA84, + 0x3FD624DD,0x2F1A9FBE, 0x3FD69C8A,0x16F68CDE, + 0x3FD6353F,0x7CED9168, 0x3FD6AE01,0x6427F4DB, + 0x3FD645A1,0xCAC08312, 0x3FD6BF7A,0x75018666, + 0x3FD65604,0x189374BC, 0x3FD6D0F5,0x4B5A095F, + 0x3FD66666,0x66666666, 0x3FD6E271,0xE909BBE4, + 0x3FD676C8,0xB4395810, 0x3FD6F3F0,0x4FEA5496, + 0x3FD6872B,0x020C49BA, 0x3FD70570,0x81D704E5, + 0x3FD6978D,0x4FDF3B64, 0x3FD716F2,0x80AC7B61, + 0x3FD6A7EF,0x9DB22D0E, 0x3FD72876,0x4E48E60C, + 0x3FD6B851,0xEB851EB8, 0x3FD739FB,0xEC8BF4B2, + 0x3FD6C8B4,0x39581062, 0x3FD74B83,0x5D56DB44, + 0x3FD6D916,0x872B020C, 0x3FD75D0C,0xA28C543A, + 0x3FD6E978,0xD4FDF3B6, 0x3FD76E97,0xBE10A2F2, + 0x3FD6F9DB,0x22D0E560, 0x3FD78024,0xB1C9961C, + 0x3FD70A3D,0x70A3D70A, 0x3FD791B3,0x7F9E8A25, + 0x3FD71A9F,0xBE76C8B4, 0x3FD7A344,0x29786BA4, + 0x3FD72B02,0x0C49BA5E, 0x3FD7B4D6,0xB141B9D0, + 0x3FD73B64,0x5A1CAC08, 0x3FD7C66B,0x18E688FA, + 0x3FD74BC6,0xA7EF9DB2, 0x3FD7D801,0x62548508, + 0x3FD75C28,0xF5C28F5C, 0x3FD7E999,0x8F7AF3F6, + 0x3FD76C8B,0x43958106, 0x3FD7FB33,0xA24AB85B, + 0x3FD77CED,0x916872B0, 0x3FD80CCF,0x9CB653F5, + 0x3FD78D4F,0xDF3B645A, 0x3FD81E6D,0x80B1EA32, + 0x3FD79DB2,0x2D0E5604, 0x3FD8300D,0x503342CB, + 0x3FD7AE14,0x7AE147AE, 0x3FD841AF,0x0D31CC53, + 0x3FD7BE76,0xC8B43958, 0x3FD85352,0xB9A69ED6, + 0x3FD7CED9,0x16872B02, 0x3FD864F8,0x578C7E7A, + 0x3FD7DF3B,0x645A1CAC, 0x3FD8769F,0xE8DFDE25, + 0x3FD7EF9D,0xB22D0E56, 0x3FD88849,0x6F9EE222, + 0x3FD80000,0x00000000, 0x3FD899F4,0xEDC962D3, + 0x3FD81062,0x4DD2F1AA, 0x3FD8ABA2,0x6560EF64, + 0x3FD820C4,0x9BA5E354, 0x3FD8BD51,0xD868D083, + 0x3FD83126,0xE978D4FE, 0x3FD8CF03,0x48E60B19, + 0x3FD84189,0x374BC6A8, 0x3FD8E0B6,0xB8DF6312, + 0x3FD851EB,0x851EB852, 0x3FD8F26C,0x2A5D5E1D, + 0x3FD8624D,0xD2F1A9FC, 0x3FD90423,0x9F6A467D, + 0x3FD872B0,0x20C49BA6, 0x3FD915DD,0x1A122DD6, + 0x3FD88312,0x6E978D50, 0x3FD92798,0x9C62F005, + 0x3FD89374,0xBC6A7EFA, 0x3FD93956,0x286C35F7, + 0x3FD8A3D7,0x0A3D70A4, 0x3FD94B15,0xC03F7890, + 0x3FD8B439,0x5810624E, 0x3FD95CD7,0x65F00387, + 0x3FD8C49B,0xA5E353F8, 0x3FD96E9B,0x1B92F859, + 0x3FD8D4FD,0xF3B645A2, 0x3FD98060,0xE33F5132, + 0x3FD8E560,0x4189374C, 0x3FD99228,0xBF0DE3E7, + 0x3FD8F5C2,0x8F5C28F6, 0x3FD9A3F2,0xB11964EC, + 0x3FD90624,0xDD2F1AA0, 0x3FD9B5BE,0xBB7E6A58, + 0x3FD91687,0x2B020C4A, 0x3FD9C78C,0xE05B6EE7, + 0x3FD926E9,0x78D4FDF4, 0x3FD9D95D,0x21D0D50A, + 0x3FD9374B,0xC6A7EF9E, 0x3FD9EB2F,0x8200E9F0, + 0x3FD947AE,0x147AE148, 0x3FD9FD04,0x030FE8A3, + 0x3FD95810,0x624DD2F2, 0x3FDA0EDA,0xA723FD20, + 0x3FD96872,0xB020C49C, 0x3FDA20B3,0x7065477A, + 0x3FD978D4,0xFDF3B646, 0x3FDA328E,0x60FDDF04, + 0x3FD98937,0x4BC6A7F0, 0x3FDA446B,0x7B19D579, + 0x3FD99999,0x9999999A, 0x3FDA564A,0xC0E73A34, + 0x3FD9A9FB,0xE76C8B44, 0x3FDA682C,0x34961D66, + 0x3FD9BA5E,0x353F7CEE, 0x3FDA7A0F,0xD8589358, + 0x3FD9CAC0,0x83126E98, 0x3FDA8BF5,0xAE62B7B0, + 0x3FD9DB22,0xD0E56042, 0x3FDA9DDD,0xB8EAB0BA, + 0x3FD9EB85,0x1EB851EC, 0x3FDAAFC7,0xFA28B2BE, + 0x3FD9FBE7,0x6C8B4396, 0x3FDAC1B4,0x74570353, + 0x3FDA0C49,0xBA5E353F, 0x3FDAD3A3,0x29B1FCC2, + 0x3FDA1CAC,0x083126E9, 0x3FDAE594,0x1C781169, + 0x3FDA2D0E,0x56041893, 0x3FDAF787,0x4EE9CF25, + 0x3FDA3D70,0xA3D70A3D, 0x3FDB097C,0xC349E2C6, + 0x3FDA4DD2,0xF1A9FBE7, 0x3FDB1B74,0x7BDD1B84, + 0x3FDA5E35,0x3F7CED91, 0x3FDB2D6E,0x7AEA6E81, + 0x3FDA6E97,0x8D4FDF3B, 0x3FDB3F6A,0xC2BAFA4F, + 0x3FDA7EF9,0xDB22D0E5, 0x3FDB5169,0x559A0A79, + 0x3FDA8F5C,0x28F5C28F, 0x3FDB636A,0x35D51B17, + 0x3FDA9FBE,0x76C8B439, 0x3FDB756D,0x65BBDC6D, + 0x3FDAB020,0xC49BA5E3, 0x3FDB8772,0xE7A03684, + 0x3FDAC083,0x126E978D, 0x3FDB997A,0xBDD64CD8, + 0x3FDAD0E5,0x60418937, 0x3FDBAB84,0xEAB48206, + 0x3FDAE147,0xAE147AE1, 0x3FDBBD91,0x70937B7F, + 0x3FDAF1A9,0xFBE76C8B, 0x3FDBCFA0,0x51CE254B, + 0x3FDB020C,0x49BA5E35, 0x3FDBE1B1,0x90C1B5C7, + 0x3FDB126E,0x978D4FDF, 0x3FDBF3C5,0x2FCDB179, + 0x3FDB22D0,0xE5604189, 0x3FDC05DB,0x3153EEDD, + 0x3FDB3333,0x33333333, 0x3FDC17F3,0x97B89A42, + 0x3FDB4395,0x810624DD, 0x3FDC2A0E,0x656239AE, + 0x3FDB53F7,0xCED91687, 0x3FDC3C2B,0x9CB9B0C8, + 0x3FDB645A,0x1CAC0831, 0x3FDC4E4B,0x402A44C8, + 0x3FDB74BC,0x6A7EF9DB, 0x3FDC606D,0x5221A074, + 0x3FDB851E,0xB851EB85, 0x3FDC7291,0xD50FD81E, + 0x3FDB9581,0x0624DD2F, 0x3FDC84B8,0xCB676DB1, + 0x3FDBA5E3,0x53F7CED9, 0x3FDC96E2,0x379D54C1, + 0x3FDBB645,0xA1CAC083, 0x3FDCA90E,0x1C28F6A5, + 0x3FDBC6A7,0xEF9DB22D, 0x3FDCBB3C,0x7B843697, + 0x3FDBD70A,0x3D70A3D7, 0x3FDCCD6D,0x582B75E4, + 0x3FDBE76C,0x8B439581, 0x3FDCDFA0,0xB49D9818, + 0x3FDBF7CE,0xD916872B, 0x3FDCF1D6,0x935C073C, + 0x3FDC0831,0x26E978D5, 0x3FDD040E,0xF6EAB81C, + 0x3FDC1893,0x74BC6A7F, 0x3FDD1649,0xE1D02E8E, + 0x3FDC28F5,0xC28F5C29, 0x3FDD2887,0x569581CA, + 0x3FDC3958,0x10624DD3, 0x3FDD3AC7,0x57C660C6, + 0x3FDC49BA,0x5E353F7D, 0x3FDD4D09,0xE7F116A0, + 0x3FDC5A1C,0xAC083127, 0x3FDD5F4F,0x09A68F0A, + 0x3FDC6A7E,0xF9DB22D1, 0x3FDD7196,0xBF7A5AC0, + 0x3FDC7AE1,0x47AE147B, 0x3FDD83E1,0x0C02B412, + 0x3FDC8B43,0x95810625, 0x3FDD962D,0xF1D88366, + 0x3FDC9BA5,0xE353F7CF, 0x3FDDA87D,0x739763D1, + 0x3FDCAC08,0x3126E979, 0x3FDDBACF,0x93DDA7B4, + 0x3FDCBC6A,0x7EF9DB23, 0x3FDDCD24,0x554C5D61, + 0x3FDCCCCC,0xCCCCCCCD, 0x3FDDDF7B,0xBA8753CD, + 0x3FDCDD2F,0x1A9FBE77, 0x3FDDF1D5,0xC6351F4B, + 0x3FDCED91,0x6872B021, 0x3FDE0432,0x7AFF1E4E, + 0x3FDCFDF3,0xB645A1CB, 0x3FDE1691,0xDB917E3A, + 0x3FDD0E56,0x04189375, 0x3FDE28F3,0xEA9B4038, + 0x3FDD1EB8,0x51EB851F, 0x3FDE3B58,0xAACE3E1C, + 0x3FDD2F1A,0x9FBE76C9, 0x3FDE4DC0,0x1EDF2F50, + 0x3FDD3F7C,0xED916873, 0x3FDE602A,0x4985ADC6, + 0x3FDD4FDF,0x3B645A1D, 0x3FDE7297,0x2D7C3B02, + 0x3FDD6041,0x89374BC7, 0x3FDE8506,0xCD80451E, + 0x3FDD70A3,0xD70A3D71, 0x3FDE9779,0x2C522BE1, + 0x3FDD8106,0x24DD2F1B, 0x3FDEA9EE,0x4CB545E5, + 0x3FDD9168,0x72B020C5, 0x3FDEBC66,0x316FE5BB, + 0x3FDDA1CA,0xC083126F, 0x3FDECEE0,0xDD4B5F29, + 0x3FDDB22D,0x0E560419, 0x3FDEE15E,0x53140C65, + 0x3FDDC28F,0x5C28F5C3, 0x3FDEF3DE,0x95995367, + 0x3FDDD2F1,0xA9FBE76D, 0x3FDF0661,0xA7ADAB3F, + 0x3FDDE353,0xF7CED917, 0x3FDF18E7,0x8C26A177, + 0x3FDDF3B6,0x45A1CAC1, 0x3FDF2B70,0x45DCDF86, + 0x3FDE0418,0x9374BC6A, 0x3FDF3DFB,0xD7AC3045, + 0x3FDE147A,0xE147AE14, 0x3FDF508A,0x4473857E, + 0x3FDE24DD,0x2F1A9FBE, 0x3FDF631B,0x8F14FD74, + 0x3FDE353F,0x7CED9168, 0x3FDF75AF,0xBA75E889, + 0x3FDE45A1,0xCAC08312, 0x3FDF8846,0xC97ECEE6, + 0x3FDE5604,0x189374BC, 0x3FDF9AE0,0xBF1B7632, + 0x3FDE6666,0x66666666, 0x3FDFAD7D,0x9E3AE753, + 0x3FDE76C8,0xB4395810, 0x3FDFC01D,0x69CF7443, + 0x3FDE872B,0x020C49BA, 0x3FDFD2C0,0x24CEBDE8, + 0x3FDE978D,0x4FDF3B64, 0x3FDFE565,0xD231B9FC, + 0x3FDEA7EF,0x9DB22D0E, 0x3FDFF80E,0x74F4B90A, + 0x3FDEB851,0xEB851EB8, 0x3FE0055D,0x080BB634, + 0x3FDEC8B4,0x39581062, 0x3FE00EB4,0x534E7628, + 0x3FDED916,0x872B020C, 0x3FE0180D,0x1DC5DEFB, + 0x3FDEE978,0xD4FDF3B6, 0x3FE02167,0x68F6ECDE, + 0x3FDEF9DB,0x22D0E560, 0x3FE02AC3,0x366858B1, + 0x3FDF0A3D,0x70A3D70A, 0x3FE03420,0x87A29B28, + 0x3FDF1A9F,0xBE76C8B4, 0x3FE03D7F,0x5E2FEFF9, + 0x3FDF2B02,0x0C49BA5E, 0x3FE046DF,0xBB9C5905, + 0x3FDF3B64,0x5A1CAC08, 0x3FE05041,0xA175A199, + 0x3FDF4BC6,0xA7EF9DB2, 0x3FE059A5,0x114B61AA, + 0x3FDF5C28,0xF5C28F5C, 0x3FE0630A,0x0CAF011A, + 0x3FDF6C8B,0x43958106, 0x3FE06C70,0x9533BB0B, + 0x3FDF7CED,0x916872B0, 0x3FE075D8,0xAC6EA12F, + 0x3FDF8D4F,0xDF3B645A, 0x3FE07F42,0x53F69F2A, + 0x3FDF9DB2,0x2D0E5604, 0x3FE088AD,0x8D647DF6, + 0x3FDFAE14,0x7AE147AE, 0x3FE0921A,0x5A52E74D, + 0x3FDFBE76,0xC8B43958, 0x3FE09B88,0xBC5E691F, + 0x3FDFCED9,0x16872B02, 0x3FE0A4F8,0xB525790F, + 0x3FDFDF3B,0x645A1CAC, 0x3FE0AE6A,0x464877F6, + 0x3FDFEF9D,0xB22D0E56, 0x3FE0B7DD,0x7169B56D, + 0x3FE00000,0x00000000, 0x3FE0C152,0x382D7366, + 0x3FE00831,0x26E978D5, 0x3FE0CAC8,0x9C39E9C3, + 0x3FE01062,0x4DD2F1AA, 0x3FE0D440,0x9F374A01, + 0x3FE01893,0x74BC6A7F, 0x3FE0DDBA,0x42CFC2DD, + 0x3FE020C4,0x9BA5E354, 0x3FE0E735,0x88AF8411, + 0x3FE028F5,0xC28F5C29, 0x3FE0F0B2,0x7284C20E, + 0x3FE03126,0xE978D4FE, 0x3FE0FA31,0x01FFB9C4, + 0x3FE03958,0x10624DD3, 0x3FE103B1,0x38D2B46F, + 0x3FE04189,0x374BC6A8, 0x3FE10D33,0x18B20B76, + 0x3FE049BA,0x5E353F7D, 0x3FE116B6,0xA3542C44, + 0x3FE051EB,0x851EB852, 0x3FE1203B,0xDA719C39, + 0x3FE05A1C,0xAC083127, 0x3FE129C2,0xBFC4FC99, + 0x3FE0624D,0xD2F1A9FC, 0x3FE1334B,0x550B0E8D, + 0x3FE06A7E,0xF9DB22D1, 0x3FE13CD5,0x9C02B724, + 0x3FE072B0,0x20C49BA6, 0x3FE14661,0x966D0369, + 0x3FE07AE1,0x47AE147B, 0x3FE14FEF,0x460D2C77, + 0x3FE08312,0x6E978D50, 0x3FE1597E,0xACA89B9D, + 0x3FE08B43,0x95810625, 0x3FE1630F,0xCC06EE90, + 0x3FE09374,0xBC6A7EFA, 0x3FE16CA2,0xA5F1FB98, + 0x3FE09BA5,0xE353F7CF, 0x3FE17637,0x3C35D5DB, + 0x3FE0A3D7,0x0A3D70A4, 0x3FE17FCD,0x90A0D19F, + 0x3FE0AC08,0x3126E979, 0x3FE18965,0xA50388A6, + 0x3FE0B439,0x5810624E, 0x3FE192FF,0x7B30DE8A, + 0x3FE0BC6A,0x7EF9DB23, 0x3FE19C9B,0x14FE0527, + 0x3FE0C49B,0xA5E353F8, 0x3FE1A638,0x74428112, + 0x3FE0CCCC,0xCCCCCCCD, 0x3FE1AFD7,0x9AD82E15, + 0x3FE0D4FD,0xF3B645A2, 0x3FE1B978,0x8A9B43BC, + 0x3FE0DD2F,0x1A9FBE77, 0x3FE1C31B,0x456A59EB, + 0x3FE0E560,0x4189374C, 0x3FE1CCBF,0xCD266D7A, + 0x3FE0ED91,0x6872B021, 0x3FE1D666,0x23B2E4E6, + 0x3FE0F5C2,0x8F5C28F6, 0x3FE1E00E,0x4AF59504, + 0x3FE0FDF3,0xB645A1CB, 0x3FE1E9B8,0x44D6C5C5, + 0x3FE10624,0xDD2F1AA0, 0x3FE1F364,0x13413706, + 0x3FE10E56,0x04189375, 0x3FE1FD11,0xB8222568, + 0x3FE11687,0x2B020C4A, 0x3FE206C1,0x35694F36, + 0x3FE11EB8,0x51EB851F, 0x3FE21072,0x8D08F957, + 0x3FE126E9,0x78D4FDF4, 0x3FE21A25,0xC0F5F44E, + 0x3FE12F1A,0x9FBE76C9, 0x3FE223DA,0xD327A144, + 0x3FE1374B,0xC6A7EF9E, 0x3FE22D91,0xC597F71C, + 0x3FE13F7C,0xED916873, 0x3FE2374A,0x9A43879E, + 0x3FE147AE,0x147AE148, 0x3FE24105,0x5329849F, + 0x3FE14FDF,0x3B645A1D, 0x3FE24AC1,0xF24BC545, + 0x3FE15810,0x624DD2F2, 0x3FE25480,0x79AECB4F, + 0x3FE16041,0x89374BC7, 0x3FE25E40,0xEB59C86E, + 0x3FE16872,0xB020C49C, 0x3FE26803,0x4956A3AB, + 0x3FE170A3,0xD70A3D71, 0x3FE271C7,0x95B1FED8, + 0x3FE178D4,0xFDF3B646, 0x3FE27B8D,0xD27B3C12, + 0x3FE18106,0x24DD2F1B, 0x3FE28556,0x01C48353, + 0x3FE18937,0x4BC6A7F0, 0x3FE28F20,0x25A2C808, + 0x3FE19168,0x72B020C5, 0x3FE298EC,0x402DCEC3, + 0x3FE19999,0x9999999A, 0x3FE2A2BA,0x538032F0, + 0x3FE1A1CA,0xC083126F, 0x3FE2AC8A,0x61B76CA2, + 0x3FE1A9FB,0xE76C8B44, 0x3FE2B65C,0x6CF3D665, + 0x3FE1B22D,0x0E560419, 0x3FE2C030,0x7758B327, + 0x3FE1BA5E,0x353F7CEE, 0x3FE2CA06,0x830C342F, + 0x3FE1C28F,0x5C28F5C3, 0x3FE2D3DE,0x92377F1C, + 0x3FE1CAC0,0x83126E98, 0x3FE2DDB8,0xA706B400, + 0x3FE1D2F1,0xA9FBE76D, 0x3FE2E794,0xC3A8F37F, + 0x3FE1DB22,0xD0E56042, 0x3FE2F172,0xEA506507, + 0x3FE1E353,0xF7CED917, 0x3FE2FB53,0x1D323D10, + 0x3FE1EB85,0x1EB851EC, 0x3FE30535,0x5E86C374, + 0x3FE1F3B6,0x45A1CAC1, 0x3FE30F19,0xB08959D2, + 0x3FE1FBE7,0x6C8B4396, 0x3FE31900,0x15788205, + 0x3FE20418,0x9374BC6A, 0x3FE322E8,0x8F95E4A8, + 0x3FE20C49,0xBA5E353F, 0x3FE32CD3,0x212657B5, + 0x3FE2147A,0xE147AE14, 0x3FE336BF,0xCC71E526, + 0x3FE21CAC,0x083126E9, 0x3FE340AE,0x93C3D1B5, + 0x3FE224DD,0x2F1A9FBE, 0x3FE34A9F,0x796AA3A7, + 0x3FE22D0E,0x56041893, 0x3FE35492,0x7FB829AD, + 0x3FE2353F,0x7CED9168, 0x3FE35E87,0xA90181D3, + 0x3FE23D70,0xA3D70A3D, 0x3FE3687E,0xF79F2084, + 0x3FE245A1,0xCAC08312, 0x3FE37278,0x6DECD7A5, + 0x3FE24DD2,0xF1A9FBE7, 0x3FE37C74,0x0E49DDB7, + 0x3FE25604,0x189374BC, 0x3FE38671,0xDB18D51C, + 0x3FE25E35,0x3F7CED91, 0x3FE39071,0xD6BFD362, + 0x3FE26666,0x66666666, 0x3FE39A74,0x03A868A8, + 0x3FE26E97,0x8D4FDF3B, 0x3FE3A478,0x643FA71A, + 0x3FE276C8,0xB4395810, 0x3FE3AE7E,0xFAF62A78, + 0x3FE27EF9,0xDB22D0E5, 0x3FE3B887,0xCA401FBC, + 0x3FE2872B,0x020C49BA, 0x3FE3C292,0xD4954CCF, + 0x3FE28F5C,0x28F5C28F, 0x3FE3CCA0,0x1C711851, + 0x3FE2978D,0x4FDF3B64, 0x3FE3D6AF,0xA452917E, + 0x3FE29FBE,0x76C8B439, 0x3FE3E0C1,0x6EBC781F, + 0x3FE2A7EF,0x9DB22D0E, 0x3FE3EAD5,0x7E35449C, + 0x3FE2B020,0xC49BA5E3, 0x3FE3F4EB,0xD547301B, + 0x3FE2B851,0xEB851EB8, 0x3FE3FF04,0x76803CB7, + 0x3FE2C083,0x126E978D, 0x3FE4091F,0x64723DD4, + 0x3FE2C8B4,0x39581062, 0x3FE4133C,0xA1B2E084, + 0x3FE2D0E5,0x60418937, 0x3FE41D5C,0x30DBB404, + 0x3FE2D916,0x872B020C, 0x3FE4277E,0x148A3254, + 0x3FE2E147,0xAE147AE1, 0x3FE431A2,0x4F5FC8E4, + 0x3FE2E978,0xD4FDF3B6, 0x3FE43BC8,0xE401E15B, + 0x3FE2F1A9,0xFBE76C8B, 0x3FE445F1,0xD519EA76, + 0x3FE2F9DB,0x22D0E560, 0x3FE4501D,0x25556101, + 0x3FE3020C,0x49BA5E35, 0x3FE45A4A,0xD765D8E8, + 0x3FE30A3D,0x70A3D70A, 0x3FE4647A,0xEE010664, + 0x3FE3126E,0x978D4FDF, 0x3FE46EAD,0x6BE0C73D, + 0x3FE31A9F,0xBE76C8B4, 0x3FE478E2,0x53C32C2F, + 0x3FE322D0,0xE5604189, 0x3FE48319,0xA86A8260, + 0x3FE32B02,0x0C49BA5E, 0x3FE48D53,0x6C9D5CFC, + 0x3FE33333,0x33333333, 0x3FE4978F,0xA3269EE1, + 0x3FE33B64,0x5A1CAC08, 0x3FE4A1CE,0x4ED5846E, + 0x3FE34395,0x810624DD, 0x3FE4AC0F,0x727DAD70, + 0x3FE34BC6,0xA7EF9DB2, 0x3FE4B653,0x10F72725, + 0x3FE353F7,0xCED91687, 0x3FE4C099,0x2D1E7661, + 0x3FE35C28,0xF5C28F5C, 0x3FE4CAE1,0xC9D4A1D2, + 0x3FE3645A,0x1CAC0831, 0x3FE4D52C,0xE9FF3C59, + 0x3FE36C8B,0x43958106, 0x3FE4DF7A,0x90886F8F, + 0x3FE374BC,0x6A7EF9DB, 0x3FE4E9CA,0xC05F065D, + 0x3FE37CED,0x916872B0, 0x3FE4F41D,0x7C7677B7, + 0x3FE3851E,0xB851EB85, 0x3FE4FE72,0xC7C6F17A, + 0x3FE38D4F,0xDF3B645A, 0x3FE508CA,0xA54D6367, + 0x3FE39581,0x0624DD2F, 0x3FE51325,0x180B8A3C, + 0x3FE39DB2,0x2D0E5604, 0x3FE51D82,0x2307FAF7, + 0x3FE3A5E3,0x53F7CED9, 0x3FE527E1,0xC94E2E2C, + 0x3FE3AE14,0x7AE147AE, 0x3FE53244,0x0DEE8B8E, + 0x3FE3B645,0xA1CAC083, 0x3FE53CA8,0xF3FE758E, + 0x3FE3BE76,0xC8B43958, 0x3FE54710,0x7E98551D, + 0x3FE3C6A7,0xEF9DB22D, 0x3FE5517A,0xB0DBA59F, + 0x3FE3CED9,0x16872B02, 0x3FE55BE7,0x8DED00F0, + 0x3FE3D70A,0x3D70A3D7, 0x3FE56657,0x18F62B97, + 0x3FE3DF3B,0x645A1CAC, 0x3FE570C9,0x55262123, + 0x3FE3E76C,0x8B439581, 0x3FE57B3E,0x45B1209E, + 0x3FE3EF9D,0xB22D0E56, 0x3FE585B5,0xEDD0B938, + 0x3FE3F7CE,0xD916872B, 0x3FE59030,0x50C3D70B, + 0x3FE40000,0x00000000, 0x3FE59AAD,0x71CED00F, + 0x3FE40831,0x26E978D5, 0x3FE5A52D,0x543B712E, + 0x3FE41062,0x4DD2F1AA, 0x3FE5AFAF,0xFB590B87, + 0x3FE41893,0x74BC6A7F, 0x3FE5BA35,0x6A7C81DB, + 0x3FE420C4,0x9BA5E354, 0x3FE5C4BD,0xA500561A, + 0x3FE428F5,0xC28F5C29, 0x3FE5CF48,0xAE44B724, + 0x3FE43126,0xE978D4FE, 0x3FE5D9D6,0x89AF8EB3, + 0x3FE43958,0x10624DD3, 0x3FE5E467,0x3AAC8F68, + 0x3FE44189,0x374BC6A8, 0x3FE5EEFA,0xC4AD4315, + 0x3FE449BA,0x5E353F7D, 0x3FE5F991,0x2B291922, + 0x3FE451EB,0x851EB852, 0x3FE6042A,0x719D752A, + 0x3FE45A1C,0xAC083127, 0x3FE60EC6,0x9B8DBDC2, + 0x3FE4624D,0xD2F1A9FC, 0x3FE61965,0xAC836B74, + 0x3FE46A7E,0xF9DB22D1, 0x3FE62407,0xA80E17E3, + 0x3FE472B0,0x20C49BA6, 0x3FE62EAC,0x91C38D21, + 0x3FE47AE1,0x47AE147B, 0x3FE63954,0x6D3FD53B, + 0x3FE48312,0x6E978D50, 0x3FE643FF,0x3E2549F0, + 0x3FE48B43,0x95810625, 0x3FE64EAD,0x081CA49F, + 0x3FE49374,0xBC6A7EFA, 0x3FE6595D,0xCED50E67, + 0x3FE49BA5,0xE353F7CF, 0x3FE66411,0x9604307C, + 0x3FE4A3D7,0x0A3D70A4, 0x3FE66EC8,0x616644AC, + 0x3FE4AC08,0x3126E979, 0x3FE67982,0x34BE2623, + 0x3FE4B439,0x5810624E, 0x3FE6843F,0x13D5625F, + 0x3FE4BC6A,0x7EF9DB23, 0x3FE68EFF,0x027C4A59, + 0x3FE4C49B,0xA5E353F8, 0x3FE699C2,0x048A03F0, + 0x3FE4CCCC,0xCCCCCCCD, 0x3FE6A488,0x1DDC9B84, + 0x3FE4D4FD,0xF3B645A2, 0x3FE6AF51,0x525915CE, + 0x3FE4DD2F,0x1A9FBE77, 0x3FE6BA1D,0xA5EB81F9, + 0x3FE4E560,0x4189374C, 0x3FE6C4ED,0x1C870BE7, + 0x3FE4ED91,0x6872B021, 0x3FE6CFBF,0xBA260ECA, + 0x3FE4F5C2,0x8F5C28F6, 0x3FE6DA95,0x82CA27E4, + 0x3FE4FDF3,0xB645A1CB, 0x3FE6E56E,0x7A7C4996, + 0x3FE50624,0xDD2F1AA0, 0x3FE6F04A,0xA54CCEA8, + 0x3FE50E56,0x04189375, 0x3FE6FB2A,0x07538DD3, + 0x3FE51687,0x2B020C4A, 0x3FE7060C,0xA4AFED8A, + 0x3FE51EB8,0x51EB851F, 0x3FE710F2,0x8188F80D, + 0x3FE526E9,0x78D4FDF4, 0x3FE71BDB,0xA20D6FBC, + 0x3FE52F1A,0x9FBE76C9, 0x3FE726C8,0x0A73E3AC, + 0x3FE5374B,0xC6A7EF9E, 0x3FE731B7,0xBEFAC489, + 0x3FE53F7C,0xED916873, 0x3FE73CAA,0xC3E879B9, + 0x3FE547AE,0x147AE148, 0x3FE747A1,0x1D8B76D0, + 0x3FE54FDF,0x3B645A1D, 0x3FE7529A,0xD03A5143, + 0x3FE55810,0x624DD2F2, 0x3FE75D97,0xE053D66E, + 0x3FE56041,0x89374BC7, 0x3FE76898,0x523F21E6, + 0x3FE56872,0xB020C49C, 0x3FE7739C,0x2A6BB415, + 0x3FE570A3,0xD70A3D71, 0x3FE77EA3,0x6D518926, + 0x3FE578D4,0xFDF3B646, 0x3FE789AE,0x1F713044, + 0x3FE58106,0x24DD2F1B, 0x3FE794BC,0x4553E327, + 0x3FE58937,0x4BC6A7F0, 0x3FE79FCD,0xE38B9DF4, + 0x3FE59168,0x72B020C5, 0x3FE7AAE2,0xFEB33776, + 0x3FE59999,0x9999999A, 0x3FE7B5FB,0x9B6E79A7, + 0x3FE5A1CA,0xC083126F, 0x3FE7C117,0xBE6A3A94, + 0x3FE5A9FB,0xE76C8B44, 0x3FE7CC37,0x6C5C7597, + 0x3FE5B22D,0x0E560419, 0x3FE7D75A,0xAA0464ED, + 0x3FE5BA5E,0x353F7CEE, 0x3FE7E281,0x7C2A9BA9, + 0x3FE5C28F,0x5C28F5C3, 0x3FE7EDAB,0xE7A11FFE, + 0x3FE5CAC0,0x83126E98, 0x3FE7F8D9,0xF14385F3, + 0x3FE5D2F1,0xA9FBE76D, 0x3FE8040B,0x9DF70A6C, + 0x3FE5DB22,0xD0E56042, 0x3FE80F40,0xF2AAAE9E, + 0x3FE5E353,0xF7CED917, 0x3FE81A79,0xF45753DE, + 0x3FE5EB85,0x1EB851EC, 0x3FE825B6,0xA7FFD7E1, + 0x3FE5F3B6,0x45A1CAC1, 0x3FE830F7,0x12B1315B, + 0x3FE5FBE7,0x6C8B4396, 0x3FE83C3B,0x39828D0A, + 0x3FE60418,0x9374BC6A, 0x3FE84783,0x21956B28, + 0x3FE60C49,0xBA5E353F, 0x3FE852CE,0xD015BD5A, + 0x3FE6147A,0xE147AE14, 0x3FE85E1E,0x4A3A04F1, + 0x3FE61CAC,0x083126E9, 0x3FE86971,0x954371BB, + 0x3FE624DD,0x2F1A9FBE, 0x3FE874C8,0xB67E0131, + 0x3FE62D0E,0x56041893, 0x3FE88023,0xB3409E26, + 0x3FE6353F,0x7CED9168, 0x3FE88B82,0x90ED40E7, + 0x3FE63D70,0xA3D70A3D, 0x3FE896E5,0x54F10FD7, + 0x3FE645A1,0xCAC08312, 0x3FE8A24C,0x04C48085, + 0x3FE64DD2,0xF1A9FBE7, 0x3FE8ADB6,0xA5EB7943, + 0x3FE65604,0x189374BC, 0x3FE8B925,0x3DF57336, + 0x3FE65E35,0x3F7CED91, 0x3FE8C497,0xD27D9CF4, + 0x3FE66666,0x66666666, 0x3FE8D00E,0x692AFD95, + 0x3FE66E97,0x8D4FDF3B, 0x3FE8DB89,0x07B09862, + 0x3FE676C8,0xB4395810, 0x3FE8E707,0xB3CD90F6, + 0x3FE67EF9,0xDB22D0E5, 0x3FE8F28A,0x734D4FFE, + 0x3FE6872B,0x020C49BA, 0x3FE8FE11,0x4C07A87F, + 0x3FE68F5C,0x28F5C28F, 0x3FE9099C,0x43E0FDAC, + 0x3FE6978D,0x4FDF3B64, 0x3FE9152B,0x60CA6955, + 0x3FE69FBE,0x76C8B439, 0x3FE920BE,0xA8C1E2EC, + 0x3FE6A7EF,0x9DB22D0E, 0x3FE92C56,0x21D2671E, + 0x3FE6B020,0xC49BA5E3, 0x3FE937F1,0xD2142015, + 0x3FE6B851,0xEB851EB8, 0x3FE94391,0xBFAC8E4B, + 0x3FE6C083,0x126E978D, 0x3FE94F35,0xF0CEB20B, + 0x3FE6C8B4,0x39581062, 0x3FE95ADE,0x6BBB3591, + 0x3FE6D0E5,0x60418937, 0x3FE9668B,0x36C097D6, + 0x3FE6D916,0x872B020C, 0x3FE9723C,0x583B580B, + 0x3FE6E147,0xAE147AE1, 0x3FE97DF1,0xD69621BC, + 0x3FE6E978,0xD4FDF3B6, 0x3FE989AB,0xB849F9AC, + 0x3FE6F1A9,0xFBE76C8B, 0x3FE9956A,0x03DE6B66, + 0x3FE6F9DB,0x22D0E560, 0x3FE9A12C,0xBFE9B786, + 0x3FE7020C,0x49BA5E35, 0x3FE9ACF3,0xF31102C5, + 0x3FE70A3D,0x70A3D70A, 0x3FE9B8BF,0xA40885BD, + 0x3FE7126E,0x978D4FDF, 0x3FE9C48F,0xD993BD7C, + 0x3FE71A9F,0xBE76C8B4, 0x3FE9D064,0x9A859CDB, + 0x3FE722D0,0xE5604189, 0x3FE9DC3D,0xEDC0BEA1, + 0x3FE72B02,0x0C49BA5E, 0x3FE9E81B,0xDA379879, + 0x3FE73333,0x33333333, 0x3FE9F3FE,0x66ECAEC0, + 0x3FE73B64,0x5A1CAC08, 0x3FE9FFE5,0x9AF2C925, + 0x3FE74395,0x810624DD, 0x3FEA0BD1,0x7D6D282F, + 0x3FE74BC6,0xA7EF9DB2, 0x3FEA17C2,0x158FBB9F, + 0x3FE753F7,0xCED91687, 0x3FEA23B7,0x6A9F59C1, + 0x3FE75C28,0xF5C28F5C, 0x3FEA2FB1,0x83F1F79C, + 0x3FE7645A,0x1CAC0831, 0x3FEA3BB0,0x68EEE221, + 0x3FE76C8B,0x43958106, 0x3FEA47B4,0x210EF844, + 0x3FE774BC,0x6A7EF9DB, 0x3FEA53BC,0xB3DCE615, + 0x3FE77CED,0x916872B0, 0x3FEA5FCA,0x28F560D9, + 0x3FE7851E,0xB851EB85, 0x3FEA6BDC,0x88076426, + 0x3FE78D4F,0xDF3B645A, 0x3FEA77F3,0xD8D47006, + 0x3FE79581,0x0624DD2F, 0x3FEA8410,0x2330C836, + 0x3FE79DB2,0x2D0E5604, 0x3FEA9031,0x6F03B46A, + 0x3FE7A5E3,0x53F7CED9, 0x3FEA9C57,0xC447C1B9, + 0x3FE7AE14,0x7AE147AE, 0x3FEAA883,0x2B0B0525, + 0x3FE7B645,0xA1CAC083, 0x3FEAB4B3,0xAB6F5F4F, + 0x3FE7BE76,0xC8B43958, 0x3FEAC0E9,0x4DAAC152, + 0x3FE7C6A7,0xEF9DB22D, 0x3FEACD24,0x1A0772D6, + 0x3FE7CED9,0x16872B02, 0x3FEAD964,0x18E45962, + 0x3FE7D70A,0x3D70A3D7, 0x3FEAE5A9,0x52B540E9, + 0x3FE7DF3B,0x645A1CAC, 0x3FEAF1F3,0xD00325A3, + 0x3FE7E76C,0x8B439581, 0x3FEAFE43,0x996C7F33, + 0x3FE7EF9D,0xB22D0E56, 0x3FEB0A98,0xB7A58D2D, + 0x3FE7F7CE,0xD916872B, 0x3FEB16F3,0x3378A4EC, + 0x3FE80000,0x00000000, 0x3FEB2353,0x15C680DC, + 0x3FE80831,0x26E978D5, 0x3FEB2FB8,0x6786912B, + 0x3FE81062,0x4DD2F1AA, 0x3FEB3C23,0x31C74DF2, + 0x3FE81893,0x74BC6A7F, 0x3FEB4893,0x7DAE8ADB, + 0x3FE820C4,0x9BA5E354, 0x3FEB5509,0x5479CC55, + 0x3FE828F5,0xC28F5C29, 0x3FEB6184,0xBF7E9E4C, + 0x3FE83126,0xE978D4FE, 0x3FEB6E05,0xC82AEC86, + 0x3FE83958,0x10624DD3, 0x3FEB7A8C,0x78055C9B, + 0x3FE84189,0x374BC6A8, 0x3FEB8718,0xD8ADA99C, + 0x3FE849BA,0x5E353F7D, 0x3FEB93AA,0xF3DD016B, + 0x3FE851EB,0x851EB852, 0x3FEBA042,0xD36663DB, + 0x3FE85A1C,0xAC083127, 0x3FEBACE0,0x81370390, + 0x3FE8624D,0xD2F1A9FC, 0x3FEBB984,0x0756A8B8, + 0x3FE86A7E,0xF9DB22D1, 0x3FEBC62D,0x6FE815A6, + 0x3FE872B0,0x20C49BA6, 0x3FEBD2DC,0xC5296D51, + 0x3FE87AE1,0x47AE147B, 0x3FEBDF92,0x11749BCD, + 0x3FE88312,0x6E978D50, 0x3FEBEC4D,0x5F3FC0C3, + 0x3FE88B43,0x95810625, 0x3FEBF90E,0xB91D9BFB, + 0x3FE89374,0xBC6A7EFA, 0x3FEC05D6,0x29BDFBF9, + 0x3FE89BA5,0xE353F7CF, 0x3FEC12A3,0xBBEE2EC8, + 0x3FE8A3D7,0x0A3D70A4, 0x3FEC1F77,0x7A9974F2, + 0x3FE8AC08,0x3126E979, 0x3FEC2C51,0x70C976C4, + 0x3FE8B439,0x5810624E, 0x3FEC3931,0xA9A6BBD0, + 0x3FE8BC6A,0x7EF9DB23, 0x3FEC4618,0x307924E2, + 0x3FE8C49B,0xA5E353F8, 0x3FEC5305,0x10A86850, + 0x3FE8CCCC,0xCCCCCCCD, 0x3FEC5FF8,0x55BC90CC, + 0x3FE8D4FD,0xF3B645A2, 0x3FEC6CF2,0x0B5E7EC5, + 0x3FE8DD2F,0x1A9FBE77, 0x3FEC79F2,0x3D586C5C, + 0x3FE8E560,0x4189374C, 0x3FEC86F8,0xF796740A, + 0x3FE8ED91,0x6872B021, 0x3FEC9406,0x462719FE, + 0x3FE8F5C2,0x8F5C28F6, 0x3FECA11A,0x353BD84C, + 0x3FE8FDF3,0xB645A1CB, 0x3FECAE34,0xD129ADFF, + 0x3FE90624,0xDD2F1AA0, 0x3FECBB56,0x2669B114, + 0x3FE90E56,0x04189375, 0x3FECC87E,0x4199A384, + 0x3FE91687,0x2B020C4A, 0x3FECD5AD,0x2F7C8B65, + 0x3FE91EB8,0x51EB851F, 0x3FECE2E2,0xFCFB4E35, + 0x3FE926E9,0x78D4FDF4, 0x3FECF01F,0xB7254F6B, + 0x3FE92F1A,0x9FBE76C9, 0x3FECFD63,0x6B31125D, + 0x3FE9374B,0xC6A7EF9E, 0x3FED0AAE,0x267CDF99, + 0x3FE93F7C,0xED916873, 0x3FED17FF,0xF68F6DBC, + 0x3FE947AE,0x147AE148, 0x3FED2558,0xE9188DEC, + 0x3FE94FDF,0x3B645A1D, 0x3FED32B9,0x0BF1DC00, + 0x3FE95810,0x624DD2F2, 0x3FED4020,0x6D1F727F, + 0x3FE96041,0x89374BC7, 0x3FED4D8F,0x1AD0A279, + 0x3FE96872,0xB020C49C, 0x3FED5B05,0x2360AF70, + 0x3FE970A3,0xD70A3D71, 0x3FED6882,0x95578F57, + 0x3FE978D4,0xFDF3B646, 0x3FED7607,0x7F6AAECB, + 0x3FE98106,0x24DD2F1B, 0x3FED8393,0xF07DB9A5, + 0x3FE98937,0x4BC6A7F0, 0x3FED9127,0xF7A36800, + 0x3FE99168,0x72B020C5, 0x3FED9EC3,0xA41E4FD7, + 0x3FE99999,0x9999999A, 0x3FEDAC67,0x0561BB50, + 0x3FE9A1CA,0xC083126F, 0x3FEDBA12,0x2B1283E7, + 0x3FE9A9FB,0xE76C8B44, 0x3FEDC7C5,0x2507F286, + 0x3FE9B22D,0x0E560419, 0x3FEDD580,0x034CA4C3, + 0x3FE9BA5E,0x353F7CEE, 0x3FEDE342,0xD61F7756, + 0x3FE9C28F,0x5C28F5C3, 0x3FEDF10D,0xADF475F8, + 0x3FE9CAC0,0x83126E98, 0x3FEDFEE0,0x9B75D0D2, + 0x3FE9D2F1,0xA9FBE76D, 0x3FEE0CBB,0xAF84D79A, + 0x3FE9DB22,0xD0E56042, 0x3FEE1A9E,0xFB3AFA98, + 0x3FE9E353,0xF7CED917, 0x3FEE288A,0x8FEAD1AD, + 0x3FE9EB85,0x1EB851EC, 0x3FEE367E,0x7F212996, + 0x3FE9F3B6,0x45A1CAC1, 0x3FEE447A,0xDAA61791, + 0x3FE9FBE7,0x6C8B4396, 0x3FEE527F,0xB47E139A, + 0x3FEA0418,0x9374BC6A, 0x3FEE608D,0x1EEB196B, + 0x3FEA0C49,0xBA5E353F, 0x3FEE6EA3,0x2C6DD07B, + 0x3FEA147A,0xE147AE14, 0x3FEE7CC1,0xEFC6BB1E, + 0x3FEA1CAC,0x083126E9, 0x3FEE8AE9,0x7BF76D19, + 0x3FEA24DD,0x2F1A9FBE, 0x3FEE9919,0xE443C9CC, + 0x3FEA2D0E,0x56041893, 0x3FEEA753,0x3C334A37, + 0x3FEA353F,0x7CED9168, 0x3FEEB595,0x97924B0F, + 0x3FEA3D70,0xA3D70A3D, 0x3FEEC3E1,0x0A736331, + 0x3FEA45A1,0xCAC08312, 0x3FEED235,0xA930C2A0, + 0x3FEA4DD2,0xF1A9FBE7, 0x3FEEE093,0x886D9A62, + 0x3FEA5604,0x189374BC, 0x3FEEEEFA,0xBD178D7E, + 0x3FEA5E35,0x3F7CED91, 0x3FEEFD6B,0x5C682B5D, + 0x3FEA6666,0x66666666, 0x3FEF0BE5,0x7BE673E1, + 0x3FEA6E97,0x8D4FDF3B, 0x3FEF1A69,0x3168657F, + 0x3FEA76C8,0xB4395810, 0x3FEF28F6,0x931495AB, + 0x3FEA7EF9,0xDB22D0E5, 0x3FEF378D,0xB763D3E9, + 0x3FEA872B,0x020C49BA, 0x3FEF462E,0xB522D7E2, + 0x3FEA8F5C,0x28F5C28F, 0x3FEF54D9,0xA373FACC, + 0x3FEA978D,0x4FDF3B64, 0x3FEF638E,0x99D0FC8C, + 0x3FEA9FBE,0x76C8B439, 0x3FEF724D,0xB00CD4F5, + 0x3FEAA7EF,0x9DB22D0E, 0x3FEF8116,0xFE55917F, + 0x3FEAB020,0xC49BA5E3, 0x3FEF8FEA,0x9D363FF0, + 0x3FEAB851,0xEB851EB8, 0x3FEF9EC8,0xA598E64F, + 0x3FEAC083,0x126E978D, 0x3FEFADB1,0x30C888AA, + 0x3FEAC8B4,0x39581062, 0x3FEFBCA4,0x58733D1A, + 0x3FEAD0E5,0x60418937, 0x3FEFCBA2,0x36AC4E78, + 0x3FEAD916,0x872B020C, 0x3FEFDAAA,0xE5EE6E5B, + 0x3FEAE147,0xAE147AE1, 0x3FEFE9BE,0x811DF6CA, + 0x3FEAE978,0xD4FDF3B6, 0x3FEFF8DD,0x238B3C40, + 0x3FEAF1A9,0xFBE76C8B, 0x3FF00403,0x747A7845, + 0x3FEAF9DB,0x22D0E560, 0x3FF00B9D,0xF6C54B8A, + 0x3FEB020C,0x49BA5E35, 0x3FF0133E,0x26F785A8, + 0x3FEB0A3D,0x70A3D70A, 0x3FF01AE4,0x139D8CE0, + 0x3FEB126E,0x978D4FDF, 0x3FF0228F,0xCB801635, + 0x3FEB1A9F,0xBE76C8B4, 0x3FF02A41,0x5DA585AB, + 0x3FEB22D0,0xE5604189, 0x3FF031F8,0xD95358E8, + 0x3FEB2B02,0x0C49BA5E, 0x3FF039B6,0x4E0F9C9B, + 0x3FEB3333,0x33333333, 0x3FF04179,0xCBA26D0E, + 0x3FEB3B64,0x5A1CAC08, 0x3FF04943,0x62178243, + 0x3FEB4395,0x810624DD, 0x3FF05113,0x21BFC818, + 0x3FEB4BC6,0xA7EF9DB2, 0x3FF058E9,0x1B3302D9, + 0x3FEB53F7,0xCED91687, 0x3FF060C5,0x5F5180BA, + 0x3FEB5C28,0xF5C28F5C, 0x3FF068A7,0xFF45D8BD, + 0x3FEB645A,0x1CAC0831, 0x3FF07091,0x0C86B77A, + 0x3FEB6C8B,0x43958106, 0x3FF07880,0x98D8BA59, + 0x3FEB74BC,0x6A7EF9DB, 0x3FF08076,0xB65059D2, + 0x3FEB7CED,0x916872B0, 0x3FF08873,0x7753E337, + 0x3FEB851E,0xB851EB85, 0x3FF09076,0xEE9D82BB, + 0x3FEB8D4F,0xDF3B645A, 0x3FF09881,0x2F3D5E3E, + 0x3FEB9581,0x0624DD2F, 0x3FF0A092,0x4C9BC1A8, + 0x3FEB9DB2,0x2D0E5604, 0x3FF0A8AA,0x5A7B5D67, + 0x3FEBA5E3,0x53F7CED9, 0x3FF0B0C9,0x6CFB97E2, + 0x3FEBAE14,0x7AE147AE, 0x3FF0B8EF,0x989AF2A0, + 0x3FEBB645,0xA1CAC083, 0x3FF0C11C,0xF23983E3, + 0x3FEBBE76,0xC8B43958, 0x3FF0C951,0x8F1B85AA, + 0x3FEBC6A7,0xEF9DB22D, 0x3FF0D18D,0x84EBFADD, + 0x3FEBCED9,0x16872B02, 0x3FF0D9D0,0xE9BF6BAF, + 0x3FEBD70A,0x3D70A3D7, 0x3FF0E21B,0xD416BA16, + 0x3FEBDF3B,0x645A1CAC, 0x3FF0EA6E,0x5AE20F71, + 0x3FEBE76C,0x8B439581, 0x3FF0F2C8,0x9583E464, + 0x3FEBEF9D,0xB22D0E56, 0x3FF0FB2A,0x9BD42415, + 0x3FEBF7CE,0xD916872B, 0x3FF10394,0x86236BEE, + 0x3FEC0000,0x00000000, 0x3FF10C06,0x6D3E6932, + 0x3FEC0831,0x26E978D5, 0x3FF11480,0x6A7155A6, + 0x3FEC1062,0x4DD2F1AA, 0x3FF11D02,0x978B94C1, + 0x3FEC1893,0x74BC6A7F, 0x3FF1258D,0x0EE372CB, + 0x3FEC20C4,0x9BA5E354, 0x3FF12E1F,0xEB5A0775, + 0x3FEC28F5,0xC28F5C29, 0x3FF136BB,0x485F3D91, + 0x3FEC3126,0xE978D4FE, 0x3FF13F5F,0x41F6019A, + 0x3FEC3958,0x10624DD3, 0x3FF1480B,0xF4B898CD, + 0x3FEC4189,0x374BC6A8, 0x3FF150C1,0x7DDD22D2, + 0x3FEC49BA,0x5E353F7D, 0x3FF1597F,0xFB3A47D9, + 0x3FEC51EB,0x851EB852, 0x3FF16247,0x8B4C155F, + 0x3FEC5A1C,0xAC083127, 0x3FF16B18,0x4D390BD2, + 0x3FEC624D,0xD2F1A9FC, 0x3FF173F2,0x60D75F64, + 0x3FEC6A7E,0xF9DB22D1, 0x3FF17CD5,0xE6B26EA0, + 0x3FEC72B0,0x20C49BA6, 0x3FF185C3,0x0010715C, + 0x3FEC7AE1,0x47AE147B, 0x3FF18EB9,0xCEF862D9, + 0x3FEC8312,0x6E978D50, 0x3FF197BA,0x76382A00, + 0x3FEC8B43,0x95810625, 0x3FF1A0C5,0x196B02EE, + 0x3FEC9374,0xBC6A7EFA, 0x3FF1A9D9,0xDD002D20, + 0x3FEC9BA5,0xE353F7CF, 0x3FF1B2F8,0xE641E1BF, + 0x3FECA3D7,0x0A3D70A4, 0x3FF1BC22,0x5B5C95DA, + 0x3FECAC08,0x3126E979, 0x3FF1C556,0x63668C8A, + 0x3FECB439,0x5810624E, 0x3FF1CE95,0x2667BD32, + 0x3FECBC6A,0x7EF9DB23, 0x3FF1D7DE,0xCD621268, + 0x3FECC49B,0xA5E353F8, 0x3FF1E133,0x825A064D, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF1EA93,0x705FA172, + 0x3FECD4FD,0xF3B645A2, 0x3FF1F3FE,0xC397E1B5, + 0x3FECDD2F,0x1A9FBE77, 0x3FF1FD75,0xA9468EE4, + 0x3FECE560,0x4189374C, 0x3FF206F8,0x4FD88358, + 0x3FECED91,0x6872B021, 0x3FF21086,0xE6EE6F18, + 0x3FECF5C2,0x8F5C28F6, 0x3FF21A21,0x9F681C97, + 0x3FECFDF3,0xB645A1CB, 0x3FF223C8,0xAB703E8F, + 0x3FED0624,0xDD2F1AA0, 0x3FF22D7C,0x3E88CF08, + 0x3FED0E56,0x04189375, 0x3FF2373C,0x8D980826, + 0x3FED1687,0x2B020C4A, 0x3FF24109,0xCEF5FFFF, + 0x3FED1EB8,0x51EB851F, 0x3FF24AE4,0x3A7AF149, + 0x3FED26E9,0x78D4FDF4, 0x3FF254CC,0x098E3B91, + 0x3FED2F1A,0x9FBE76C9, 0x3FF25EC1,0x7736264B, + 0x3FED374B,0xC6A7EF9E, 0x3FF268C4,0xC02872FD, + 0x3FED3F7C,0xED916873, 0x3FF272D6,0x22DBCB9F, + 0x3FED47AE,0x147AE148, 0x3FF27CF5,0xDF9A1B5D, + 0x3FED4FDF,0x3B645A1D, 0x3FF28724,0x3893E0EA, + 0x3FED5810,0x624DD2F2, 0x3FF29161,0x71F48ACB, + 0x3FED6041,0x89374BC7, 0x3FF29BAD,0xD1F7EF57, + 0x3FED6872,0xB020C49C, 0x3FF2A609,0xA100F36A, + 0x3FED70A3,0xD70A3D71, 0x3FF2B075,0x29B1748A, + 0x3FED78D4,0xFDF3B646, 0x3FF2BAF0,0xB9038CBB, + 0x3FED8106,0x24DD2F1B, 0x3FF2C57C,0x9E644835, + 0x3FED8937,0x4BC6A7F0, 0x3FF2D019,0x2BCFE71F, + 0x3FED9168,0x72B020C5, 0x3FF2DAC6,0xB5EFC7C3, + 0x3FED9999,0x9999999A, 0x3FF2E585,0x943A1802, + 0x3FEDA1CA,0xC083126F, 0x3FF2F056,0x21136F98, + 0x3FEDA9FB,0xE76C8B44, 0x3FF2FB38,0xB9F277A0, + 0x3FEDB22D,0x0E560419, 0x3FF3062D,0xBF85C717, + 0x3FEDBA5E,0x353F7CEE, 0x3FF31135,0x95DC1FB8, + 0x3FEDC28F,0x5C28F5C3, 0x3FF31C50,0xA48F3A76, + 0x3FEDCAC0,0x83126E98, 0x3FF3277F,0x56F1575A, + 0x3FEDD2F1,0xA9FBE76D, 0x3FF332C2,0x1C3DC95E, + 0x3FEDDB22,0xD0E56042, 0x3FF33E19,0x67CCBC54, + 0x3FEDE353,0xF7CED917, 0x3FF34985,0xB14A78F0, + 0x3FEDEB85,0x1EB851EC, 0x3FF35507,0x74F271D1, + 0x3FEDF3B6,0x45A1CAC1, 0x3FF3609F,0x33CE6BE0, + 0x3FEDFBE7,0x6C8B4396, 0x3FF36C4D,0x73FA1CBD, + 0x3FEE0418,0x9374BC6A, 0x3FF37812,0xC0EBA374, + 0x3FEE0C49,0xBA5E353F, 0x3FF383EF,0xABC14A22, + 0x3FEE147A,0xE147AE14, 0x3FF38FE4,0xCB950B11, + 0x3FEE1CAC,0x083126E9, 0x3FF39BF2,0xBDD66144, + 0x3FEE24DD,0x2F1A9FBE, 0x3FF3A81A,0x26AAFB55, + 0x3FEE2D0E,0x56041893, 0x3FF3B45B,0xB156F898, + 0x3FEE353F,0x7CED9168, 0x3FF3C0B8,0x10AD6BA6, + 0x3FEE3D70,0xA3D70A3D, 0x3FF3CD2F,0xFF89F36A, + 0x3FEE45A1,0xCAC08312, 0x3FF3D9C4,0x4154546E, + 0x3FEE4DD2,0xF1A9FBE7, 0x3FF3E675,0xA28F1896, + 0x3FEE5604,0x189374BC, 0x3FF3F344,0xF9725BBD, + 0x3FEE5E35,0x3F7CED91, 0x3FF40033,0x2694109F, + 0x3FEE6666,0x66666666, 0x3FF40D41,0x159F3409, + 0x3FEE6E97,0x8D4FDF3B, 0x3FF41A6F,0xBE1B950E, + 0x3FEE76C8,0xB4395810, 0x3FF427C0,0x24481188, + 0x3FEE7EF9,0xDB22D0E5, 0x3FF43533,0x5A096758, + 0x3FEE872B,0x020C49BA, 0x3FF442CA,0x7FF006A1, + 0x3FEE8F5C,0x28F5C28F, 0x3FF45086,0xC657A96B, + 0x3FEE978D,0x4FDF3B64, 0x3FF45E69,0x6EA3DC00, + 0x3FEE9FBE,0x76C8B439, 0x3FF46C73,0xCC9D1A16, + 0x3FEEA7EF,0x9DB22D0E, 0x3FF47AA7,0x47F2B272, + 0x3FEEB020,0xC49BA5E3, 0x3FF48905,0x5DE64A33, + 0x3FEEB851,0xEB851EB8, 0x3FF4978F,0xA3269EE1, + 0x3FEEC083,0x126E978D, 0x3FF4A647,0xC5E011EA, + 0x3FEEC8B4,0x39581062, 0x3FF4B52F,0x900AA16E, + 0x3FEED0E5,0x60418937, 0x3FF4C448,0xE9FE4311, + 0x3FEED916,0x872B020C, 0x3FF4D395,0xDD582B8A, + 0x3FEEE147,0xAE147AE1, 0x3FF4E318,0x983D78B1, + 0x3FEEE978,0xD4FDF3B6, 0x3FF4F2D3,0x710A08DC, + 0x3FEEF1A9,0xFBE76C8B, 0x3FF502C8,0xEA7D247E, + 0x3FEEF9DB,0x22D0E560, 0x3FF512FB,0xB8792022, + 0x3FEF020C,0x49BA5E35, 0x3FF5236E,0xC56F7284, + 0x3FEF0A3D,0x70A3D70A, 0x3FF53425,0x38981EC8, + 0x3FEF126E,0x978D4FDF, 0x3FF54522,0x7D1A13CF, + 0x3FEF1A9F,0xBE76C8B4, 0x3FF5566A,0x4A52A5E6, + 0x3FEF22D0,0xE5604189, 0x3FF56800,0xAD751A8A, + 0x3FEF2B02,0x0C49BA5E, 0x3FF579EA,0x14C91A41, + 0x3FEF3333,0x33333333, 0x3FF58C2B,0x5CE0C3E5, + 0x3FEF3B64,0x5A1CAC08, 0x3FF59EC9,0xE036730A, + 0x3FEF4395,0x810624DD, 0x3FF5B1CB,0x89C1039F, + 0x3FEF4BC6,0xA7EF9DB2, 0x3FF5C536,0xEB363A94, + 0x3FEF53F7,0xCED91687, 0x3FF5D913,0x57E9F7E9, + 0x3FEF5C28,0xF5C28F5C, 0x3FF5ED69,0x0583BE07, + 0x3FEF645A,0x1CAC0831, 0x3FF60241,0x342B8535, + 0x3FEF6C8B,0x43958106, 0x3FF617A6,0x605FB64A, + 0x3FEF74BC,0x6A7EF9DB, 0x3FF62DA4,0x81747299, + 0x3FEF7CED,0x916872B0, 0x3FF64449,0x58E74417, + 0x3FEF851E,0xB851EB85, 0x3FF65BA4,0xD86C24C5, + 0x3FEF8D4F,0xDF3B645A, 0x3FF673C9,0xA7343103, + 0x3FEF9581,0x0624DD2F, 0x3FF68CCD,0xD2F76F29, + 0x3FEF9DB2,0x2D0E5604, 0x3FF6A6CB,0xBFB70F7C, + 0x3FEFA5E3,0x53F7CED9, 0x3FF6C1E3,0x73B93370, + 0x3FEFAE14,0x7AE147AE, 0x3FF6DE3C,0x6F33D51D, + 0x3FEFB645,0xA1CAC083, 0x3FF6FC08,0x5EFE9A01, + 0x3FEFBE76,0xC8B43958, 0x3FF71B87,0x352143E2, + 0x3FEFC6A7,0xEF9DB22D, 0x3FF73D0D,0xA7DF830D, + 0x3FEFCED9,0x16872B02, 0x3FF76110,0x12AB625F, + 0x3FEFD70A,0x3D70A3D7, 0x3FF78835,0xFD4104B3, + 0x3FEFDF3B,0x645A1CAC, 0x3FF7B380,0x8CC4B16A, + 0x3FEFE76C,0x8B439581, 0x3FF7E4A0,0xA9830084, + 0x3FEFEF9D,0xB22D0E56, 0x3FF81EE2,0x80851D99, + 0x3FEFF7CE,0xD916872B, 0x3FF86AC9,0xAD18F803, + 0x3FF00000,0x00000000, 0x3FF921FB,0x54442D18, + }; + +LOCAL_D const TUint32 PowerTest[] = + { + 0x3FE00000,0x00000000, 0x3FB99999,0x9999999A, 0x3FEDDB68,0x0117AB12, + 0x3FE00000,0x00000000, 0x3FC99999,0x9999999A, 0x3FEBDB8C,0xDADBE120, + 0x3FE00000,0x00000000, 0x3FD33333,0x33333333, 0x3FE9FDF8,0xBCCE533E, + 0x3FE00000,0x00000000, 0x3FD99999,0x9999999A, 0x3FE84060,0x03B2AE5C, + 0x3FE00000,0x00000000, 0x3FE00000,0x00000000, 0x3FE6A09E,0x667F3BCD, + 0x3FE00000,0x00000000, 0x3FE33333,0x33333333, 0x3FE51CB4,0x53B9536C, + 0x3FE00000,0x00000000, 0x3FE66666,0x66666666, 0x3FE3B2C4,0x7BFF8329, + 0x3FE00000,0x00000000, 0x3FE99999,0x9999999A, 0x3FE26111,0x86BAE674, + 0x3FE00000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FE125FB,0xEE250664, + 0x3FE00000,0x00000000, 0x3FF00000,0x00000000, 0x3FE00000,0x00000000, + 0x3FE00000,0x00000000, 0x3FF19999,0x9999999A, 0x3FDDDB68,0x0117AB12, + 0x3FE00000,0x00000000, 0x3FF33333,0x33333333, 0x3FDBDB8C,0xDADBE120, + 0x3FE00000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x3FD9FDF8,0xBCCE533D, + 0x3FE00000,0x00000000, 0x3FF66666,0x66666666, 0x3FD84060,0x03B2AE5D, + 0x3FE00000,0x00000000, 0x3FF80000,0x00000000, 0x3FD6A09E,0x667F3BCD, + 0x3FE00000,0x00000000, 0x3FF99999,0x9999999A, 0x3FD51CB4,0x53B9536C, + 0x3FE00000,0x00000000, 0x3FFB3333,0x33333333, 0x3FD3B2C4,0x7BFF8329, + 0x3FE00000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x3FD26111,0x86BAE674, + 0x3FE00000,0x00000000, 0x3FFE6666,0x66666666, 0x3FD125FB,0xEE250664, + 0x3FE00000,0x00000000, 0x40000000,0x00000000, 0x3FD00000,0x00000000, + 0x3FE33333,0x33333333, 0x3FB99999,0x9999999A, 0x3FEE680A,0x48D16872, + 0x3FE33333,0x33333333, 0x3FC99999,0x9999999A, 0x3FECE465,0x8B654324, + 0x3FE33333,0x33333333, 0x3FD33333,0x33333333, 0x3FEB740E,0xC5D2AA1A, + 0x3FE33333,0x33333333, 0x3FD99999,0x9999999A, 0x3FEA160F,0xDC35D2CB, + 0x3FE33333,0x33333333, 0x3FE00000,0x00000000, 0x3FE8C97E,0xF43F7248, + 0x3FE33333,0x33333333, 0x3FE33333,0x33333333, 0x3FE78D7D,0xD8F4883C, + 0x3FE33333,0x33333333, 0x3FE66666,0x66666666, 0x3FE66139,0x66362A65, + 0x3FE33333,0x33333333, 0x3FE99999,0x9999999A, 0x3FE543E8,0xFBAE1CEA, + 0x3FE33333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x3FE434CD,0xF6C1F4C8, + 0x3FE33333,0x33333333, 0x3FF00000,0x00000000, 0x3FE33333,0x33333333, + 0x3FE33333,0x33333333, 0x3FF19999,0x9999999A, 0x3FE23E6C,0x92173EAA, + 0x3FE33333,0x33333333, 0x3FF33333,0x33333333, 0x3FE155D6,0x86D65B7C, + 0x3FE33333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x3FE078D5,0xA9E4CC76, + 0x3FE33333,0x33333333, 0x3FF66666,0x66666666, 0x3FDF4DAC,0xA1DA3027, + 0x3FE33333,0x33333333, 0x3FF80000,0x00000000, 0x3FDDBE98,0x584C22BC, + 0x3FE33333,0x33333333, 0x3FF99999,0x9999999A, 0x3FDC4363,0xD1257047, + 0x3FE33333,0x33333333, 0x3FFB3333,0x33333333, 0x3FDADB11,0xADDA9946, + 0x3FE33333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x3FD984B1,0x2E0422B2, + 0x3FE33333,0x33333333, 0x3FFE6666,0x66666666, 0x3FD83F5D,0x8E8258F0, + 0x3FE33333,0x33333333, 0x40000000,0x00000000, 0x3FD70A3D,0x70A3D70A, + 0x3FE66666,0x66666666, 0x3FB99999,0x9999999A, 0x3FEEE0F6,0x172E7679, + 0x3FE66666,0x66666666, 0x3FC99999,0x9999999A, 0x3FEDCBFA,0xE8202D18, + 0x3FE66666,0x66666666, 0x3FD33333,0x33333333, 0x3FECC0B4,0x3BA5C3D9, + 0x3FE66666,0x66666666, 0x3FD99999,0x9999999A, 0x3FEBBECB,0x03CABB82, + 0x3FE66666,0x66666666, 0x3FE00000,0x00000000, 0x3FEAC5EB,0x3F7AB2F8, + 0x3FE66666,0x66666666, 0x3FE33333,0x33333333, 0x3FE9D5C3,0xDF24FB63, + 0x3FE66666,0x66666666, 0x3FE66666,0x66666666, 0x3FE8EE06,0xAA5599B0, + 0x3FE66666,0x66666666, 0x3FE99999,0x9999999A, 0x3FE80E68,0x263B1BFB, + 0x3FE66666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x3FE7369F,0x7D10F686, + 0x3FE66666,0x66666666, 0x3FF00000,0x00000000, 0x3FE66666,0x66666666, + 0x3FE66666,0x66666666, 0x3FF19999,0x9999999A, 0x3FE59D79,0x103A1FBA, + 0x3FE66666,0x66666666, 0x3FF33333,0x33333333, 0x3FE4DB96,0x08E352C4, + 0x3FE66666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x3FE4207E,0x29C0D5E5, + 0x3FE66666,0x66666666, 0x3FF66666,0x66666666, 0x3FE36BF4,0x82A78341, + 0x3FE66666,0x66666666, 0x3FF80000,0x00000000, 0x3FE2BDBE,0x460916E0, + 0x3FE66666,0x66666666, 0x3FF99999,0x9999999A, 0x3FE215A2,0xB5CD165E, + 0x3FE66666,0x66666666, 0x3FFB3333,0x33333333, 0x3FE1736B,0x10D5852E, + 0x3FE66666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x3FE0D6E2,0x81296062, + 0x3FE66666,0x66666666, 0x3FFE6666,0x66666666, 0x3FE03FD6,0x0ABF12F7, + 0x3FE66666,0x66666666, 0x40000000,0x00000000, 0x3FDF5C28,0xF5C28F5B, + 0x3FE99999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FEF4B39,0xA9528405, + 0x3FE99999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FEE9A70,0x8EC1794A, + 0x3FE99999,0x9999999A, 0x3FD33333,0x33333333, 0x3FEDED8E,0x27210DB1, + 0x3FE99999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FED447C,0x6894B361, + 0x3FE99999,0x9999999A, 0x3FE00000,0x00000000, 0x3FEC9F25,0xC5BFEDD9, + 0x3FE99999,0x9999999A, 0x3FE33333,0x33333333, 0x3FEBFD75,0x2B06FDE0, + 0x3FE99999,0x9999999A, 0x3FE66666,0x66666666, 0x3FEB5F55,0xFBDF12BA, + 0x3FE99999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FEAC4B4,0x102DA8F1, + 0x3FE99999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x3FEA2D7B,0xB1B6C0F1, + 0x3FE99999,0x9999999A, 0x3FF00000,0x00000000, 0x3FE99999,0x9999999A, + 0x3FE99999,0x9999999A, 0x3FF19999,0x9999999A, 0x3FE908FA,0xEDDB9CD1, + 0x3FE99999,0x9999999A, 0x3FF33333,0x33333333, 0x3FE87B8D,0x3F012DD5, + 0x3FE99999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x3FE7F13E,0x85B40AF4, + 0x3FE99999,0x9999999A, 0x3FF66666,0x66666666, 0x3FE769FD,0x2076F5E8, + 0x3FE99999,0x9999999A, 0x3FF80000,0x00000000, 0x3FE6E5B7,0xD16657E2, + 0x3FE99999,0x9999999A, 0x3FF99999,0x9999999A, 0x3FE6645D,0xBC0597E7, + 0x3FE99999,0x9999999A, 0x3FFB3333,0x33333333, 0x3FE5E5DE,0x6318DBC8, + 0x3FE99999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x3FE56A29,0xA68AED8E, + 0x3FE99999,0x9999999A, 0x3FFE6666,0x66666666, 0x3FE4F12F,0xC15F00C1, + 0x3FE99999,0x9999999A, 0x40000000,0x00000000, 0x3FE47AE1,0x47AE147C, + 0x3FECCCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FEFAA24,0x4A98407A, + 0x3FECCCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FEF552E,0xF248B71D, + 0x3FECCCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FEF011D,0x8CFC7493, + 0x3FECCCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FEEADED,0xB718E4D0, + 0x3FECCCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FEE5B9D,0x136C6D96, + 0x3FECCCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FEE0A29,0x4B1D3B9B, + 0x3FECCCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FEDB990,0x0D983DD4, + 0x3FECCCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FED69CF,0x10804E69, + 0x3FECCCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FED1AE4,0x0F9D88D8, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x3FEC7F87,0x0FEF6D3A, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x3FEC3310,0xA6DB0B34, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x3FEBE767,0x65499C1E, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x3FEB9C89,0x24C99ABC, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x3FEB5273,0xC4AE62A1, + 0x3FECCCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x3FEB0925,0x2A00B5A6, + 0x3FECCCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x3FEAC09B,0x3F6F6AD9, + 0x3FECCCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x3FEA78D3,0xF5404692, + 0x3FECCCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x3FEA31CD,0x4140FB29, + 0x3FECCCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x3FE9EB85,0x1EB851EC, + 0x3FF00000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FD33333,0x33333333, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FE00000,0x00000000, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FE33333,0x33333333, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FE66666,0x66666666, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FE99999,0x9999999A, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FF00000,0x00000000, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FF19999,0x9999999A, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FF33333,0x33333333, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FF66666,0x66666666, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FF80000,0x00000000, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FF99999,0x9999999A, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FFB3333,0x33333333, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x3FFE6666,0x66666666, 0x3FF00000,0x00000000, + 0x3FF00000,0x00000000, 0x40000000,0x00000000, 0x3FF00000,0x00000000, + 0x3FF19999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF02739,0xC65D58BF, + 0x3FF19999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF04ED3,0xB7325783, + 0x3FF19999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF076CE,0xBE41BF7A, + 0x3FF19999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF09F2B,0xC99051DD, + 0x3FF19999,0x9999999A, 0x3FE00000,0x00000000, 0x3FF0C7EB,0xC96A56F6, + 0x3FF19999,0x9999999A, 0x3FE33333,0x33333333, 0x3FF0F10F,0xB06934B0, + 0x3FF19999,0x9999999A, 0x3FE66666,0x66666666, 0x3FF11A98,0x737912E1, + 0x3FF19999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FF14487,0x09DE8D69, + 0x3FF19999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x3FF16EDC,0x6D3C743C, + 0x3FF19999,0x9999999A, 0x3FF00000,0x00000000, 0x3FF19999,0x9999999A, + 0x3FF19999,0x9999999A, 0x3FF19999,0x9999999A, 0x3FF1C4BF,0x8D66AE6C, + 0x3FF19999,0x9999999A, 0x3FF33333,0x33333333, 0x3FF1F04F,0x49842D11, + 0x3FF19999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF21C49,0xD14852A0, + 0x3FF19999,0x9999999A, 0x3FF66666,0x66666666, 0x3FF248B0,0x2A8526DA, + 0x3FF19999,0x9999999A, 0x3FF80000,0x00000000, 0x3FF27583,0x5D8E92DC, + 0x3FF19999,0x9999999A, 0x3FF99999,0x9999999A, 0x3FF2A2C4,0x754086C2, + 0x3FF19999,0x9999999A, 0x3FFB3333,0x33333333, 0x3FF2D074,0x7F052E5F, + 0x3FF19999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF2FE94,0x8ADB3527, + 0x3FF19999,0x9999999A, 0x3FFE6666,0x66666666, 0x3FF32D25,0xAB5C1976, + 0x3FF19999,0x9999999A, 0x40000000,0x00000000, 0x3FF35C28,0xF5C28F5D, + 0x3FF33333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF04B5D,0x24ED17A4, + 0x3FF33333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF0981D,0x45329B9F, + 0x3FF33333,0x33333333, 0x3FD33333,0x33333333, 0x3FF0E646,0xE8DD42A0, + 0x3FF33333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF135E0,0xB6BD84CD, + 0x3FF33333,0x33333333, 0x3FE00000,0x00000000, 0x3FF186F1,0x74F88472, + 0x3FF33333,0x33333333, 0x3FE33333,0x33333333, 0x3FF1D980,0x099BA149, + 0x3FF33333,0x33333333, 0x3FE66666,0x66666666, 0x3FF22D93,0x7B32C2D3, + 0x3FF33333,0x33333333, 0x3FE99999,0x9999999A, 0x3FF28332,0xF16166A5, + 0x3FF33333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x3FF2DA65,0xB57E7F98, + 0x3FF33333,0x33333333, 0x3FF00000,0x00000000, 0x3FF33333,0x33333333, + 0x3FF33333,0x33333333, 0x3FF19999,0x9999999A, 0x3FF38DA2,0xF91C82C4, + 0x3FF33333,0x33333333, 0x3FF33333,0x33333333, 0x3FF3E9BC,0xB96FEDF1, + 0x3FF33333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF44788,0x4AA31CC0, + 0x3FF33333,0x33333333, 0x3FF66666,0x66666666, 0x3FF4A70D,0xA8169F5C, + 0x3FF33333,0x33333333, 0x3FF80000,0x00000000, 0x3FF50854,0xF2C3D222, + 0x3FF33333,0x33333333, 0x3FF99999,0x9999999A, 0x3FF56B66,0x71EDF4BE, + 0x3FF33333,0x33333333, 0x3FFB3333,0x33333333, 0x3FF5D04A,0x93D68363, + 0x3FF33333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF63709,0xEE74E192, + 0x3FF33333,0x33333333, 0x3FFE6666,0x66666666, 0x3FF69FAD,0x403165E9, + 0x3FF33333,0x33333333, 0x40000000,0x00000000, 0x3FF70A3D,0x70A3D70A, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF06CE2,0xF530F836, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF0DCAA,0xEEE362D8, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF14F6B,0xA004E4FF, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF1C539,0x4192551C, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF23E28,0x96280F23, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FF2BA4E,0xEDAA8975, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FF339C2,0x2907CFA9, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FF3BC98,0xBE128C8C, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FF442E9,0xBB77515D, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x3FF55A5A,0x3EBFA913, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x3FF5EBAB,0x035ACD4C, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF680D8,0xB66CC34C, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x3FF719FD,0xA20B083F, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x3FF7B734,0xC33413AD, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x3FF85899,0xCE90E5E5, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x3FF8FE49,0x3556F45B, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x3FF9A860,0x2A4B5050, + 0x3FF4CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x3FFA56FC,0xA6E7E9C6, + 0x3FF4CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x3FFB0A3D,0x70A3D70B, + 0x3FF66666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF08C29,0xF332A311, + 0x3FF66666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF11D1F,0xC4F3391C, + 0x3FF66666,0x66666666, 0x3FD33333,0x33333333, 0x3FF1B30B,0x79B06DED, + 0x3FF66666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF24E18,0x85EDDFB2, + 0x3FF66666,0x66666666, 0x3FE00000,0x00000000, 0x3FF2EE73,0xDADC9B57, + 0x3FF66666,0x66666666, 0x3FE33333,0x33333333, 0x3FF3944B,0xF361F023, + 0x3FF66666,0x66666666, 0x3FE66666,0x66666666, 0x3FF43FD0,0xE190613D, + 0x3FF66666,0x66666666, 0x3FE99999,0x9999999A, 0x3FF4F134,0x5C969CC0, + 0x3FF66666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x3FF5A8A9,0xCF288250, + 0x3FF66666,0x66666666, 0x3FF00000,0x00000000, 0x3FF66666,0x66666666, + 0x3FF66666,0x66666666, 0x3FF19999,0x9999999A, 0x3FF72AA1,0x2146E44B, + 0x3FF66666,0x66666666, 0x3FF33333,0x33333333, 0x3FF7F592,0xE087B65A, + 0x3FF66666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x3FF8C776,0x772A337F, + 0x3FF66666,0x66666666, 0x3FF66666,0x66666666, 0x3FF9A088,0xBB80392C, + 0x3FF66666,0x66666666, 0x3FF80000,0x00000000, 0x3FFA8108,0x98CE7313, + 0x3FF66666,0x66666666, 0x3FF99999,0x9999999A, 0x3FFB6937,0x21891CFE, + 0x3FF66666,0x66666666, 0x3FFB3333,0x33333333, 0x3FFC5957,0xA2308822, + 0x3FF66666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x3FFD51AF,0xB4D2DB73, + 0x3FF66666,0x66666666, 0x3FFE6666,0x66666666, 0x3FFE5287,0x5538B66E, + 0x3FF66666,0x66666666, 0x40000000,0x00000000, 0x3FFF5C28,0xF5C28F5B, + 0x3FF80000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF0A97D,0xCE72A0CB, + 0x3FF80000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF159FF,0x126BAB41, + 0x3FF80000,0x00000000, 0x3FD33333,0x33333333, 0x3FF211CE,0x179A0012, + 0x3FF80000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF2D138,0x3CB414F9, + 0x3FF80000,0x00000000, 0x3FE00000,0x00000000, 0x3FF3988E,0x1409212E, + 0x3FF80000,0x00000000, 0x3FE33333,0x33333333, 0x3FF46823,0x856B4748, + 0x3FF80000,0x00000000, 0x3FE66666,0x66666666, 0x3FF5404F,0xF1810326, + 0x3FF80000,0x00000000, 0x3FE99999,0x9999999A, 0x3FF6216E,0x568CB9A7, + 0x3FF80000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FF70BDD,0x76B9E56F, + 0x3FF80000,0x00000000, 0x3FF00000,0x00000000, 0x3FF80000,0x00000000, + 0x3FF80000,0x00000000, 0x3FF19999,0x9999999A, 0x3FF8FE3C,0xB5ABF131, + 0x3FF80000,0x00000000, 0x3FF33333,0x33333333, 0x3FFA06FE,0x9BA180E2, + 0x3FF80000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x3FFB1AB5,0x2367001B, + 0x3FF80000,0x00000000, 0x3FF66666,0x66666666, 0x3FFC39D4,0x5B0E1F75, + 0x3FF80000,0x00000000, 0x3FF80000,0x00000000, 0x3FFD64D5,0x1E0DB1C6, + 0x3FF80000,0x00000000, 0x3FF99999,0x9999999A, 0x3FFE9C35,0x4820EAED, + 0x3FF80000,0x00000000, 0x3FFB3333,0x33333333, 0x3FFFE077,0xEA4184BA, + 0x3FF80000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x40009912,0xC0E98B3D, + 0x3FF80000,0x00000000, 0x3FFE6666,0x66666666, 0x400148E6,0x190B6C13, + 0x3FF80000,0x00000000, 0x40000000,0x00000000, 0x40020000,0x00000000, + 0x3FF99999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF0C51B,0xFB8F97C0, + 0x3FF99999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF193B4,0x3862CFF2, + 0x3FF99999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF26C3D,0x90F409BD, + 0x3FF99999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF34F32,0x7F4C0704, + 0x3FF99999,0x9999999A, 0x3FE00000,0x00000000, 0x3FF43D13,0x6248490F, + 0x3FF99999,0x9999999A, 0x3FE33333,0x33333333, 0x3FF53666,0xC636DAD3, + 0x3FF99999,0x9999999A, 0x3FE66666,0x66666666, 0x3FF63BB9,0xB0F09863, + 0x3FF99999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FF74D9F,0xF19CFF00, + 0x3FF99999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x3FF86CB4,0x744CA3A5, + 0x3FF99999,0x9999999A, 0x3FF00000,0x00000000, 0x3FF99999,0x9999999A, + 0x3FF99999,0x9999999A, 0x3FF19999,0x9999999A, 0x3FFAD4F9,0x927F5935, + 0x3FF99999,0x9999999A, 0x3FF33333,0x33333333, 0x3FFC1F86,0xC09E1983, + 0x3FF99999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x3FFD79FC,0x1B200F96, + 0x3FF99999,0x9999999A, 0x3FF66666,0x66666666, 0x3FFEE51D,0x9879A4D4, + 0x3FF99999,0x9999999A, 0x3FF80000,0x00000000, 0x400030DC,0x4EA03A73, + 0x3FF99999,0x9999999A, 0x3FF99999,0x9999999A, 0x4000F852,0x382BE243, + 0x3FF99999,0x9999999A, 0x3FFB3333,0x33333333, 0x4001C961,0x5A5A1382, + 0x3FF99999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x4002A47F,0xF47D98CD, + 0x3FF99999,0x9999999A, 0x3FFE6666,0x66666666, 0x40038A29,0xF6A3B61E, + 0x3FF99999,0x9999999A, 0x40000000,0x00000000, 0x40047AE1,0x47AE147C, + 0x3FFB3333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF0DF37,0x1594856C, + 0x3FFB3333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF1CA98,0x3B603B59, + 0x3FFB3333,0x33333333, 0x3FD33333,0x33333333, 0x3FF2C2CD,0x258622DA, + 0x3FFB3333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF3C888,0xC7B024F9, + 0x3FFB3333,0x33333333, 0x3FE00000,0x00000000, 0x3FF4DC87,0xD61451DA, + 0x3FFB3333,0x33333333, 0x3FE33333,0x33333333, 0x3FF5FF91,0x4D82151C, + 0x3FFB3333,0x33333333, 0x3FE66666,0x66666666, 0x3FF73277,0x02D976B8, + 0x3FFB3333,0x33333333, 0x3FE99999,0x9999999A, 0x3FF87616,0x3A53D7DB, + 0x3FFB3333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x3FF9CB58,0x470B3E61, + 0x3FFB3333,0x33333333, 0x3FF00000,0x00000000, 0x3FFB3333,0x33333333, + 0x3FFB3333,0x33333333, 0x3FF19999,0x9999999A, 0x3FFCAEAA,0x717C7C6B, + 0x3FFB3333,0x33333333, 0x3FF33333,0x33333333, 0x3FFE3ECF,0x98239818, + 0x3FFB3333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x3FFFE4C3,0x2630D4D8, + 0x3FFB3333,0x33333333, 0x3FF66666,0x66666666, 0x4000D0DA,0xA9BC1F6D, + 0x3FFB3333,0x33333333, 0x3FF80000,0x00000000, 0x4001BB73,0x75F7ABF9, + 0x3FFB3333,0x33333333, 0x3FF99999,0x9999999A, 0x4002B2D5,0x1B7B5EBE, + 0x3FFB3333,0x33333333, 0x3FFB3333,0x33333333, 0x4003B7B1,0xF59F3E83, + 0x3FFB3333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x4004CAC6,0x17FA777A, + 0x3FFB3333,0x33333333, 0x3FFE6666,0x66666666, 0x4005ECD7,0xD5FCC1D2, + 0x3FFB3333,0x33333333, 0x40000000,0x00000000, 0x40071EB8,0x51EB851E, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF0F7F9,0x4BC9DC5D, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF1FEF5,0xC7C3F980, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF315DE,0x1F0EFA98, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF43DA9,0x12C67FF1, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF5775C,0x544FF263, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FF6C40D,0x6CE0B896, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FF824E2,0xB308AB84, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FF99B14,0x4F1A0622, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FFB27ED,0x4F5532F1, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x3FFE8B27,0x2204F30F, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40003243,0x9A30608D, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x40012D47,0xE8C0AE56, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x4002377E,0x90E5D98C, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x400351D3,0x18AE5A26, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x40047D3F,0x4863D954, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x4005BACC,0x0787CD91, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x40070B92,0x47310585, + 0x3FFCCCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x400870BB,0xFA997AA5, + 0x3FFCCCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x4009EB85,0x1EB851EC, + 0x3FFE6666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF10F86,0x2A137171, + 0x3FFE6666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF2310C,0x295D36BA, + 0x3FFE6666,0x66666666, 0x3FD33333,0x33333333, 0x3FF365C3,0x71F6871C, + 0x3FFE6666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF4AEF1,0xB7985489, + 0x3FFE6666,0x66666666, 0x3FE00000,0x00000000, 0x3FF60DF2,0x453AB723, + 0x3FFE6666,0x66666666, 0x3FE33333,0x33333333, 0x3FF78437,0x6B7BB651, + 0x3FFE6666,0x66666666, 0x3FE66666,0x66666666, 0x3FF9134C,0x074FFF15, + 0x3FFE6666,0x66666666, 0x3FE99999,0x9999999A, 0x3FFABCD5,0x2299B78C, + 0x3FFE6666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x3FFC8293,0xB05CF233, + 0x3FFE6666,0x66666666, 0x3FF00000,0x00000000, 0x3FFE6666,0x66666666, + 0x3FFE6666,0x66666666, 0x3FF19999,0x9999999A, 0x40003525,0xDB2C122C, + 0x3FFE6666,0x66666666, 0x3FF33333,0x33333333, 0x40014831,0xF4188D97, + 0x3FFE6666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x40026D79,0xAC43CD27, + 0x3FFE6666,0x66666666, 0x3FF66666,0x66666666, 0x4003A632,0x6E6A504E, + 0x3FFE6666,0x66666666, 0x3FF80000,0x00000000, 0x4004F3A6,0x282AFAC8, + 0x3FFE6666,0x66666666, 0x3FF99999,0x9999999A, 0x40065734,0xA61BED33, + 0x3FFE6666,0x66666666, 0x3FFB3333,0x33333333, 0x4007D255,0x06F26587, + 0x3FFE6666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40096697,0x47453B2B, + 0x3FFE6666,0x66666666, 0x3FFE6666,0x66666666, 0x400B15A5,0xE78B7FAF, + 0x3FFE6666,0x66666666, 0x40000000,0x00000000, 0x400CE147,0xAE147AE1, + 0x40000000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF125FB,0xEE250664, + 0x40000000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF26111,0x86BAE675, + 0x40000000,0x00000000, 0x3FD33333,0x33333333, 0x3FF3B2C4,0x7BFF8329, + 0x40000000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF51CB4,0x53B9536C, + 0x40000000,0x00000000, 0x3FE00000,0x00000000, 0x3FF6A09E,0x667F3BCD, + 0x40000000,0x00000000, 0x3FE33333,0x33333333, 0x3FF84060,0x03B2AE5C, + 0x40000000,0x00000000, 0x3FE66666,0x66666666, 0x3FF9FDF8,0xBCCE533D, + 0x40000000,0x00000000, 0x3FE99999,0x9999999A, 0x3FFBDB8C,0xDADBE120, + 0x40000000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x3FFDDB68,0x0117AB12, + 0x40000000,0x00000000, 0x3FF00000,0x00000000, 0x40000000,0x00000000, + 0x40000000,0x00000000, 0x3FF19999,0x9999999A, 0x400125FB,0xEE250664, + 0x40000000,0x00000000, 0x3FF33333,0x33333333, 0x40026111,0x86BAE674, + 0x40000000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x4003B2C4,0x7BFF8329, + 0x40000000,0x00000000, 0x3FF66666,0x66666666, 0x40051CB4,0x53B9536C, + 0x40000000,0x00000000, 0x3FF80000,0x00000000, 0x4006A09E,0x667F3BCD, + 0x40000000,0x00000000, 0x3FF99999,0x9999999A, 0x40084060,0x03B2AE5D, + 0x40000000,0x00000000, 0x3FFB3333,0x33333333, 0x4009FDF8,0xBCCE533D, + 0x40000000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x400BDB8C,0xDADBE120, + 0x40000000,0x00000000, 0x3FFE6666,0x66666666, 0x400DDB68,0x0117AB12, + 0x40000000,0x00000000, 0x40000000,0x00000000, 0x40100000,0x00000000, + 0x4000CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF13B74,0x8AD64EF9, + 0x4000CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF28F34,0x95D8362F, + 0x4000CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF3FD1F,0x206741C0, + 0x4000CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF58738,0x0DC9C62C, + 0x4000CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF72FAA,0xFC7E3CD7, + 0x4000CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FF8F8CE,0x55928B79, + 0x4000CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FFAE526,0x984F9BA5, + 0x4000CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x3FFCF769,0xE6DEB5B4, + 0x4000CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x3FFF3283,0xD8E9ADA4, + 0x4000CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x4000CCCC,0xCCCCCCCD, + 0x4000CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x40021807,0x2B61061F, + 0x4000CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40037CC4,0x03BC9F4B, + 0x4000CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x4004FCFA,0x486C6B71, + 0x4000CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x40069AC7,0xA813DCE1, + 0x4000CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x40085873,0x891E2648, + 0x4000CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x400A3872,0x404045A7, + 0x4000CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x400C3D68,0x865396A0, + 0x4000CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x400E6A2F,0x3269D863, + 0x4000CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x401060EB,0x9EADE18F, + 0x4000CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x4011A3D7,0x0A3D70A4, + 0x40019999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF15006,0x70251A91, + 0x40019999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF2BB9D,0xEEB2E2AB, + 0x40019999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF44509,0x6CEF8B45, + 0x40019999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF5EEBB,0x5AD4FDD3, + 0x40019999,0x9999999A, 0x3FE00000,0x00000000, 0x3FF7BB59,0x8C88B4AD, + 0x40019999,0x9999999A, 0x3FE33333,0x33333333, 0x3FF9ADC1,0x71A7FBB0, + 0x40019999,0x9999999A, 0x3FE66666,0x66666666, 0x3FFBC90C,0xA51F2482, + 0x40019999,0x9999999A, 0x3FE99999,0x9999999A, 0x3FFE1095,0xDCCF3801, + 0x40019999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x400043FF,0x206F1DDB, + 0x40019999,0x9999999A, 0x3FF00000,0x00000000, 0x40019999,0x9999999A, + 0x40019999,0x9999999A, 0x3FF19999,0x9999999A, 0x40030B3A,0x4828D06D, + 0x40019999,0x9999999A, 0x3FF33333,0x33333333, 0x40049B2D,0xB9C4C623, + 0x40019999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x40064BF0,0xC4A11933, + 0x40019999,0x9999999A, 0x3FF66666,0x66666666, 0x40082034,0x7D83E402, + 0x40019999,0x9999999A, 0x3FF80000,0x00000000, 0x400A1AE2,0x80FCC6BF, + 0x40019999,0x9999999A, 0x3FF99999,0x9999999A, 0x400C3F21,0x969F2E77, + 0x40019999,0x9999999A, 0x3FFB3333,0x33333333, 0x400E905A,0xB5A241C3, + 0x40019999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x4010891F,0x3971F867, + 0x40019999,0x9999999A, 0x3FFE6666,0x66666666, 0x4011E465,0x707A3A71, + 0x40019999,0x9999999A, 0x40000000,0x00000000, 0x40135C28,0xF5C28F5D, + 0x40026666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF163C5,0x27826636, + 0x40026666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF2E671,0x153B6431, + 0x40026666,0x66666666, 0x3FD33333,0x33333333, 0x3FF48AB2,0xE63E8C13, + 0x40026666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF65375,0x660748F3, + 0x40026666,0x66666666, 0x3FE00000,0x00000000, 0x3FF843E4,0x3D85E5B1, + 0x40026666,0x66666666, 0x3FE33333,0x33333333, 0x3FFA5F71,0x95706502, + 0x40026666,0x66666666, 0x3FE66666,0x66666666, 0x3FFCA9DC,0x35DA278C, + 0x40026666,0x66666666, 0x3FE99999,0x9999999A, 0x3FFF2736,0x2DF3FAE5, + 0x40026666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x4000EDF6,0x07E40FD6, + 0x40026666,0x66666666, 0x3FF00000,0x00000000, 0x40026666,0x66666666, + 0x40026666,0x66666666, 0x3FF19999,0x9999999A, 0x4003FF89,0x20A2C258, + 0x40026666,0x66666666, 0x3FF33333,0x33333333, 0x4005BC35,0x3ED1199E, + 0x40026666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x40079F80,0xEF2E5449, + 0x40026666,0x66666666, 0x3FF66666,0x66666666, 0x4009ACC7,0x0221FA49, + 0x40026666,0x66666666, 0x3FF80000,0x00000000, 0x400BE7AC,0xE059FB58, + 0x40026666,0x66666666, 0x3FF99999,0x9999999A, 0x400E5429,0x05747429, + 0x40026666,0x66666666, 0x3FFB3333,0x33333333, 0x40107B45,0x055D7057, + 0x40026666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x4011E9BF,0x273916AA, + 0x40026666,0x66666666, 0x3FFE6666,0x66666666, 0x4013780E,0x22ACABCF, + 0x40026666,0x66666666, 0x40000000,0x00000000, 0x401528F5,0xC28F5C28, + 0x40033333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF176C1,0xCF6D3EFB, + 0x40033333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF30FCD,0x4CA757E3, + 0x40033333,0x33333333, 0x3FD33333,0x33333333, 0x3FF4CE45,0x914222EB, + 0x40033333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF6B597,0x31476830, + 0x40033333,0x33333333, 0x3FE00000,0x00000000, 0x3FF8C97E,0xF43F7248, + 0x40033333,0x33333333, 0x3FE33333,0x33333333, 0x3FFB0E11,0x2BB0384F, + 0x40033333,0x33333333, 0x3FE66666,0x66666666, 0x3FFD87C1,0xB57B46E9, + 0x40033333,0x33333333, 0x3FE99999,0x9999999A, 0x40001DB6,0x5CEA006A, + 0x40033333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x40019730,0x1AFC1026, + 0x40033333,0x33333333, 0x3FF00000,0x00000000, 0x40033333,0x33333333, + 0x40033333,0x33333333, 0x3FF19999,0x9999999A, 0x4004F4E8,0x92831861, + 0x40033333,0x33333333, 0x3FF33333,0x33333333, 0x4006DFC3,0x28C8CFDD, + 0x40033333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x4008F786,0xAE4F5D1A, + 0x40033333,0x33333333, 0x3FF66666,0x66666666, 0x400B404F,0x07EF49D2, + 0x40033333,0x33333333, 0x3FF80000,0x00000000, 0x400DBE98,0x584C22BC, + 0x40033333,0x33333333, 0x3FF99999,0x9999999A, 0x40103BA3,0xE70354FC, + 0x40033333,0x33333333, 0x3FFB3333,0x33333333, 0x4011B7DA,0xA016C425, + 0x40033333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x401356DA,0xD5E59A18, + 0x40033333,0x33333333, 0x3FFE6666,0x66666666, 0x40151BD3,0x5394E02D, + 0x40033333,0x33333333, 0x40000000,0x00000000, 0x40170A3D,0x70A3D70A, + 0x40040000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF1890B,0x7E41B4EE, + 0x40040000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF337CE,0x41260734, + 0x40040000,0x00000000, 0x3FD33333,0x33333333, 0x3FF50FE6,0xC94A6E58, + 0x40040000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF7154C,0x7F1D0529, + 0x40040000,0x00000000, 0x3FE00000,0x00000000, 0x3FF94C58,0x3ADA5B53, + 0x40040000,0x00000000, 0x3FE33333,0x33333333, 0x3FFBB9CD,0x9E1DB235, + 0x40040000,0x00000000, 0x3FE66666,0x66666666, 0x3FFE62E5,0x531FD7EB, + 0x40040000,0x00000000, 0x3FE99999,0x9999999A, 0x4000A6AC,0x23D76B44, + 0x40040000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x40023FB5,0xFE030C24, + 0x40040000,0x00000000, 0x3FF00000,0x00000000, 0x40040000,0x00000000, + 0x40040000,0x00000000, 0x3FF19999,0x9999999A, 0x4005EB4E,0x5DD2222A, + 0x40040000,0x00000000, 0x3FF33333,0x33333333, 0x400805C1,0xD16F8900, + 0x40040000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x400A53E0,0x7B9D09EE, + 0x40040000,0x00000000, 0x3FF66666,0x66666666, 0x400CDA9F,0x9EE44672, + 0x40040000,0x00000000, 0x3FF80000,0x00000000, 0x400F9F6E,0x4990F227, + 0x40040000,0x00000000, 0x3FF99999,0x9999999A, 0x40115420,0x82D28F62, + 0x40040000,0x00000000, 0x3FFB3333,0x33333333, 0x4012FDCF,0x53F3E6F3, + 0x40040000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x4014D057,0x2CCD4615, + 0x40040000,0x00000000, 0x3FFE6666,0x66666666, 0x4016CFA3,0x7D83CF2C, + 0x40040000,0x00000000, 0x40000000,0x00000000, 0x40190000,0x00000000, + 0x4004CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF19AAF,0x91FD21C3, + 0x4004CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF35E8C,0x917ABF3E, + 0x4004CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF54FB7,0xEE6769A6, + 0x4004CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF772BC,0x9203DF8A, + 0x4004CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FF9CC99,0xFF02C481, + 0x4004CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FFC62D0,0x02641DE5, + 0x4004CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x3FFF3B6B,0x906510FF, + 0x4004CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x40012E8A,0x75CD2337, + 0x4004CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x4002E78F,0x9BA7CF4C, + 0x4004CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x4004CCCC,0xCCCCCCCD, + 0x4004CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x4006E2B1,0x0A95DF18, + 0x4004CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40092E1D,0x2385F89E, + 0x4004CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x400BB46F,0x1C533C8C, + 0x4004CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x400E7B8E,0xBDD1D5CD, + 0x4004CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x4010C4FD,0xB28E9954, + 0x4004CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x4012736D,0x9B2779D6, + 0x4004CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x40144D05,0xEAA817D9, + 0x4004CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x4016561A,0x65F1142E, + 0x4004CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x4018936D,0xE3F3C0AF, + 0x4004CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x401B0A3D,0x70A3D70B, + 0x40059999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF1ABB9,0xF1383BA5, + 0x40059999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF3841E,0x3F8C7922, + 0x40059999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF58DD6,0xF4A4CB92, + 0x40059999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF7CE0A,0xCA3F5CCA, + 0x40059999,0x9999999A, 0x3FE00000,0x00000000, 0x3FFA4A6A,0x2F74C6AC, + 0x40059999,0x9999999A, 0x3FE33333,0x33333333, 0x3FFD093D,0xAA104DB7, + 0x40059999,0x9999999A, 0x3FE66666,0x66666666, 0x400008BA,0xDC2A8E4A, + 0x40059999,0x9999999A, 0x3FE99999,0x9999999A, 0x4001B55E,0x2DAAA893, + 0x40059999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x40038EC4,0x3B186A68, + 0x40059999,0x9999999A, 0x3FF00000,0x00000000, 0x40059999,0x9999999A, + 0x40059999,0x9999999A, 0x3FF19999,0x9999999A, 0x4007DB07,0xD2725086, + 0x40059999,0x9999999A, 0x3FF33333,0x33333333, 0x400A58C2,0x6F6409EE, + 0x40059999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x400D1915,0x63DE7939, + 0x40059999,0x9999999A, 0x3FF66666,0x66666666, 0x4010117A,0x7BB791D5, + 0x40059999,0x9999999A, 0x3FF80000,0x00000000, 0x4011BF07,0xACD5394E, + 0x40059999,0x9999999A, 0x3FF99999,0x9999999A, 0x40139970,0x05FE3476, + 0x40059999,0x9999999A, 0x3FFB3333,0x33333333, 0x4015A562,0xA939734B, + 0x40059999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x4017E80B,0xF0D996C7, + 0x40059999,0x9999999A, 0x3FFE6666,0x66666666, 0x401A6722,0x82FA8FA5, + 0x40059999,0x9999999A, 0x40000000,0x00000000, 0x401D28F5,0xC28F5C2A, + 0x40066666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF1BC35,0x40858445, + 0x40066666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF3A897,0x0D39372F, + 0x40066666,0x66666666, 0x3FD33333,0x33333333, 0x3FF5CA5E,0xDAA2EED7, + 0x40066666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF82757,0x290F9E39, + 0x40066666,0x66666666, 0x3FE00000,0x00000000, 0x3FFAC5EB,0x3F7AB2F8, + 0x40066666,0x66666666, 0x3FE33333,0x33333333, 0x3FFDAD38,0x9B2E99A9, + 0x40066666,0x66666666, 0x3FE66666,0x66666666, 0x40007291,0x21BC7841, + 0x40066666,0x66666666, 0x3FE99999,0x9999999A, 0x40023B33,0x1AF8EAE0, + 0x40066666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x4004355A,0x92C39EEA, + 0x40066666,0x66666666, 0x3FF00000,0x00000000, 0x40066666,0x66666666, + 0x40066666,0x66666666, 0x3FF19999,0x9999999A, 0x4008D44A,0x8D87B92D, + 0x40066666,0x66666666, 0x3FF33333,0x33333333, 0x400B85A0,0x45B68074, + 0x40066666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x400E81B7,0xFEE41B2D, + 0x40066666,0x66666666, 0x3FF66666,0x66666666, 0x4010E856,0x9CBE21F4, + 0x40066666,0x66666666, 0x3FF80000,0x00000000, 0x4012BDBE,0x460916E0, + 0x40066666,0x66666666, 0x3FF99999,0x9999999A, 0x4014C60E,0x063A385D, + 0x40066666,0x66666666, 0x3FFB3333,0x33333333, 0x401706CB,0x2F3B0EC2, + 0x40066666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40198614,0x58F615A0, + 0x40066666,0x66666666, 0x3FFE6666,0x66666666, 0x401C4AB2,0x00AB7812, + 0x40066666,0x66666666, 0x40000000,0x00000000, 0x401F5C28,0xF5C28F5B, + 0x40073333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF1CC2B,0x0E9CE1D1, + 0x40073333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF3CC08,0xC975DEF2, + 0x40073333,0x33333333, 0x3FD33333,0x33333333, 0x3FF60568,0x0C821D96, + 0x40073333,0x33333333, 0x3FD99999,0x9999999A, 0x3FF87EBE,0xBE8E0293, + 0x40073333,0x33333333, 0x3FE00000,0x00000000, 0x3FFB3F3C,0x957429DA, + 0x40073333,0x33333333, 0x3FE33333,0x33333333, 0x3FFE4EDF,0xF6124554, + 0x40073333,0x33333333, 0x3FE66666,0x66666666, 0x4000DB46,0x964E7456, + 0x40073333,0x33333333, 0x3FE99999,0x9999999A, 0x4002C014,0x20629D76, + 0x40073333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x4004DB58,0xD85BB2AF, + 0x40073333,0x33333333, 0x3FF00000,0x00000000, 0x40073333,0x33333333, + 0x40073333,0x33333333, 0x3FF19999,0x9999999A, 0x4009CE71,0xA1FD143C, + 0x40073333,0x33333333, 0x3FF33333,0x33333333, 0x400CB4A6,0x57515012, + 0x40073333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x400FEE3D,0x45564480, + 0x40073333,0x33333333, 0x3FF66666,0x66666666, 0x4011C24A,0x4A26F510, + 0x40073333,0x33333333, 0x3FF80000,0x00000000, 0x4013C10B,0xEC5A9E58, + 0x40073333,0x33333333, 0x3FF99999,0x9999999A, 0x4015F92F,0x2C007244, + 0x40073333,0x33333333, 0x3FFB3333,0x33333333, 0x40187126,0x59F1C24A, + 0x40073333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x401B301D,0x2EF56451, + 0x40073333,0x33333333, 0x3FFE6666,0x66666666, 0x401E3E0D,0xA01E8FE4, + 0x40073333,0x33333333, 0x40000000,0x00000000, 0x4020D1EB,0x851EB852, + 0x40080000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF1DBA3,0xF92C888B, + 0x40080000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF3EE83,0x90D43956, + 0x40080000,0x00000000, 0x3FD33333,0x33333333, 0x3FF63F08,0xB6F382AE, + 0x40080000,0x00000000, 0x3FD99999,0x9999999A, 0x3FF8D45C,0x06468A88, + 0x40080000,0x00000000, 0x3FE00000,0x00000000, 0x3FFBB67A,0xE8584CAA, + 0x40080000,0x00000000, 0x3FE33333,0x33333333, 0x3FFEEE50,0x4BC32424, + 0x40080000,0x00000000, 0x3FE66666,0x66666666, 0x400142E8,0x1C889914, + 0x40080000,0x00000000, 0x3FE99999,0x9999999A, 0x4003440B,0x4DC59A8E, + 0x40080000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x400580C4,0xCE962CAA, + 0x40080000,0x00000000, 0x3FF00000,0x00000000, 0x40080000,0x00000000, + 0x40080000,0x00000000, 0x3FF19999,0x9999999A, 0x400AC975,0xF5C2CCD2, + 0x40080000,0x00000000, 0x3FF33333,0x33333333, 0x400DE5C5,0x593E5600, + 0x40080000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x4010AF46,0x8936A203, + 0x40080000,0x00000000, 0x3FF66666,0x66666666, 0x40129F45,0x04B4E7E5, + 0x40080000,0x00000000, 0x3FF80000,0x00000000, 0x4014C8DC,0x2E423980, + 0x40080000,0x00000000, 0x3FF99999,0x9999999A, 0x401732BC,0x38D25B1C, + 0x40080000,0x00000000, 0x3FFB3333,0x33333333, 0x4019E45C,0x2ACCE59E, + 0x40080000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x401CE610,0xF4A867D4, + 0x40080000,0x00000000, 0x3FFE6666,0x66666666, 0x40202093,0x9AF0A17F, + 0x40080000,0x00000000, 0x40000000,0x00000000, 0x40220000,0x00000000, + 0x4008CCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF1EAA7,0xCBBC4617, + 0x4008CCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF41016,0x03D70F0F, + 0x4008CCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF67755,0x0D6A9D87, + 0x4008CCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FF92847,0x35BF9E55, + 0x4008CCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FFC2BC0,0x8F4BFA98, + 0x4008CCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x3FFF8BA3,0xE7D0E1B4, + 0x4008CCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x4001A981,0x9B4CF265, + 0x4008CCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x4003C721,0xF6A03D4D, + 0x4008CCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x400625A3,0xD10AE026, + 0x4008CCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x4008CCCC,0xCCCCCCCD, + 0x4008CCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x400BC550,0xE2309FD8, + 0x4008CCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x400F18EE,0xEC5A2424, + 0x4008CCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x40116948,0x50CC3A16, + 0x4008CCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x40137F37,0x300E1AB4, + 0x4008CCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x4015D51B,0xA241489C, + 0x4008CCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x4018729F,0x06DB7BB9, + 0x4008CCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x401B6055,0xB0B74484, + 0x4008CCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x401EA7DB,0x0B11F89D, + 0x4008CCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x402129F8,0x8ECED41D, + 0x4008CCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x40233851,0xEB851EB9, + 0x40099999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF1F93D,0x99C0166A, + 0x40099999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF430CD,0x74F6D478, + 0x40099999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF6AE5F,0x85C6E38F, + 0x40099999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FF97A96,0x7F7524B3, + 0x40099999,0x9999999A, 0x3FE00000,0x00000000, 0x3FFC9F25,0xC5BFEDD9, + 0x40099999,0x9999999A, 0x3FE33333,0x33333333, 0x40001379,0x87DD704C, + 0x40099999,0x9999999A, 0x3FE66666,0x66666666, 0x40020F1E,0x18683DCB, + 0x40099999,0x9999999A, 0x3FE99999,0x9999999A, 0x40044960,0xC576B376, + 0x40099999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x4006C9FA,0xDE81511F, + 0x40099999,0x9999999A, 0x3FF00000,0x00000000, 0x40099999,0x9999999A, + 0x40099999,0x9999999A, 0x3FF19999,0x9999999A, 0x400CC1FC,0x29335711, + 0x40099999,0x9999999A, 0x3FF33333,0x33333333, 0x4010270A,0xC3F8A9FA, + 0x40099999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x40122519,0x37D24FA7, + 0x40099999,0x9999999A, 0x3FF66666,0x66666666, 0x40146211,0xFF90EA29, + 0x40099999,0x9999999A, 0x3FF80000,0x00000000, 0x4016E5B7,0xD16657E2, + 0x40099999,0x9999999A, 0x3FF99999,0x9999999A, 0x4019B8C2,0x72FBE6E1, + 0x40099999,0x9999999A, 0x3FFB3333,0x33333333, 0x401CE4FC,0xF3D9FC78, + 0x40099999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x40203AB3,0xD12BC2C5, + 0x40099999,0x9999999A, 0x3FFE6666,0x66666666, 0x40223B2F,0x18677418, + 0x40099999,0x9999999A, 0x40000000,0x00000000, 0x40247AE1,0x47AE147C, + 0x400A6666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF2076B,0xD4BA49A9, + 0x400A6666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF450B6,0x0FD40104, + 0x400A6666,0x66666666, 0x3FD33333,0x33333333, 0x3FF6E439,0x0B50EBDB, + 0x400A6666,0x66666666, 0x3FD99999,0x9999999A, 0x3FF9CB5E,0x4C47F2BB, + 0x400A6666,0x66666666, 0x3FE00000,0x00000000, 0x3FFD10C0,0xE60BE308, + 0x400A6666,0x66666666, 0x3FE33333,0x33333333, 0x4000602A,0x1CD635C3, + 0x400A6666,0x66666666, 0x3FE66666,0x66666666, 0x400273C7,0xCFB01256, + 0x400A6666,0x66666666, 0x3FE99999,0x9999999A, 0x4004CACF,0xCCAE1CF8, + 0x400A6666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x40076DCE,0xA1EC6C50, + 0x400A6666,0x66666666, 0x3FF00000,0x00000000, 0x400A6666,0x66666666, + 0x400A6666,0x66666666, 0x3FF19999,0x9999999A, 0x400DBF71,0xEBCCF98A, + 0x400A6666,0x66666666, 0x3FF33333,0x33333333, 0x4010C296,0x33754DA3, + 0x400A6666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x4012E2AF,0x0FBC5C2E, + 0x400A6666,0x66666666, 0x3FF66666,0x66666666, 0x401547C7,0x6554F50C, + 0x400A6666,0x66666666, 0x3FF80000,0x00000000, 0x4017FA9F,0x243034E6, + 0x400A6666,0x66666666, 0x3FF99999,0x9999999A, 0x401B0512,0x492E3F1B, + 0x400A6666,0x66666666, 0x3FFB3333,0x33333333, 0x401E723C,0xE37C1E40, + 0x400A6666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40212751,0xD5A93E4C, + 0x400A6666,0x66666666, 0x3FFE6666,0x66666666, 0x40235430,0xDF2FD95B, + 0x400A6666,0x66666666, 0x40000000,0x00000000, 0x4025C7AE,0x147AE147, + 0x400B3333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF21538,0x5F1F360F, + 0x400B3333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF46FDA,0xFAC687A0, + 0x400B3333,0x33333333, 0x3FD33333,0x33333333, 0x3FF718F1,0x2A86ECD2, + 0x400B3333,0x33333333, 0x3FD99999,0x9999999A, 0x3FFA1AB1,0x6CFCD6A5, + 0x400B3333,0x33333333, 0x3FE00000,0x00000000, 0x3FFD80A6,0x9C19E42A, + 0x400B3333,0x33333333, 0x3FE33333,0x33333333, 0x4000ABEE,0x1DFB479A, + 0x400B3333,0x33333333, 0x3FE66666,0x66666666, 0x4002D788,0x4720CE8E, + 0x400B3333,0x33333333, 0x3FE99999,0x9999999A, 0x40054B76,0x9543B6CA, + 0x400B3333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x40081123,0x7A48BB2E, + 0x400B3333,0x33333333, 0x3FF00000,0x00000000, 0x400B3333,0x33333333, + 0x400B3333,0x33333333, 0x3FF19999,0x9999999A, 0x400EBDAC,0xA1B50F1A, + 0x400B3333,0x33333333, 0x3FF33333,0x33333333, 0x40115F13,0xBB8F267A, + 0x400B3333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x4013A200,0x30F2AFB3, + 0x400B3333,0x33333333, 0x3FF66666,0x66666666, 0x4016304A,0x030A1CD8, + 0x400B3333,0x33333333, 0x3FF80000,0x00000000, 0x401913C0,0xD17C6856, + 0x400B3333,0x33333333, 0x3FF99999,0x9999999A, 0x401C577B,0x32F7F9BA, + 0x400B3333,0x33333333, 0x3FFB3333,0x33333333, 0x40200400,0xA2DBE2C5, + 0x400B3333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x402219BE,0x65465B5E, + 0x400B3333,0x33333333, 0x3FFE6666,0x66666666, 0x402474F7,0xC18A9F19, + 0x400B3333,0x33333333, 0x40000000,0x00000000, 0x40271EB8,0x51EB851E, + 0x400C0000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF222A8,0x9C88C4EE, + 0x400C0000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF48E46,0x73BDDD91, + 0x400C0000,0x00000000, 0x3FD33333,0x33333333, 0x3FF74C96,0x36EA3144, + 0x400C0000,0x00000000, 0x3FD99999,0x9999999A, 0x3FFA68A1,0x45174C0A, + 0x400C0000,0x00000000, 0x3FE00000,0x00000000, 0x3FFDEEEA,0x11683F49, + 0x400C0000,0x00000000, 0x3FE33333,0x33333333, 0x4000F6CF,0x3B36A26E, + 0x400C0000,0x00000000, 0x3FE66666,0x66666666, 0x40033A68,0x60729FC1, + 0x400C0000,0x00000000, 0x3FE99999,0x9999999A, 0x4005CB5C,0x2BB3B2CE, + 0x400C0000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x4008B3FD,0x8187E15C, + 0x400C0000,0x00000000, 0x3FF00000,0x00000000, 0x400C0000,0x00000000, + 0x400C0000,0x00000000, 0x3FF19999,0x9999999A, 0x400FBCA7,0x11EF58A2, + 0x400C0000,0x00000000, 0x3FF33333,0x33333333, 0x4011FC7D,0xA54621DF, + 0x400C0000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x40146303,0x700CEB1C, + 0x400C0000,0x00000000, 0x3FF66666,0x66666666, 0x40171B8D,0x1C746288, + 0x400C0000,0x00000000, 0x3FF80000,0x00000000, 0x401A310C,0xCF3B3760, + 0x400C0000,0x00000000, 0x3FF99999,0x9999999A, 0x401DAFEA,0xA79F9C41, + 0x400C0000,0x00000000, 0x3FFB3333,0x33333333, 0x4020D31B,0x54644BC9, + 0x400C0000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x402311F0,0xA63D3C75, + 0x400C0000,0x00000000, 0x3FFE6666,0x66666666, 0x40259D7D,0xD156E530, + 0x400C0000,0x00000000, 0x40000000,0x00000000, 0x40288000,0x00000000, + 0x400CCCCC,0xCCCCCCCD, 0x3FB99999,0x9999999A, 0x3FF22FC1,0x7FAC725E, + 0x400CCCCC,0xCCCCCCCD, 0x3FC99999,0x9999999A, 0x3FF4AC01,0xE936328F, + 0x400CCCCC,0xCCCCCCCD, 0x3FD33333,0x33333333, 0x3FF77F35,0x6BC53136, + 0x400CCCCC,0xCCCCCCCD, 0x3FD99999,0x9999999A, 0x3FFAB53D,0xF01DC613, + 0x400CCCCC,0xCCCCCCCD, 0x3FE00000,0x00000000, 0x3FFE5B9D,0x136C6D96, + 0x400CCCCC,0xCCCCCCCD, 0x3FE33333,0x33333333, 0x400140D6,0x7B4C125D, + 0x400CCCCC,0xCCCCCCCD, 0x3FE66666,0x66666666, 0x40039C70,0x68878E2B, + 0x400CCCCC,0xCCCCCCCD, 0x3FE99999,0x9999999A, 0x40064A87,0x2B54952B, + 0x400CCCCC,0xCCCCCCCD, 0x3FECCCCC,0xCCCCCCCD, 0x40095660,0x92ACBC5E, + 0x400CCCCC,0xCCCCCCCD, 0x3FF00000,0x00000000, 0x400CCCCC,0xCCCCCCCD, + 0x400CCCCC,0xCCCCCCCD, 0x3FF19999,0x9999999A, 0x40105E2E,0x261B33BC, + 0x400CCCCC,0xCCCCCCCD, 0x3FF33333,0x33333333, 0x40129ACE,0x85172D81, + 0x400CCCCC,0xCCCCCCCD, 0x3FF4CCCC,0xCCCCCCCD, 0x401525B0,0x14317918, + 0x400CCCCC,0xCCCCCCCD, 0x3FF66666,0x66666666, 0x40180984,0x8B4DFF10, + 0x400CCCCC,0xCCCCCCCD, 0x3FF80000,0x00000000, 0x401B5273,0xC4AE62A1, + 0x400CCCCC,0xCCCCCCCD, 0x3FF99999,0x9999999A, 0x401F0E4E,0xDDEF5442, + 0x400CCCCC,0xCCCCCCCD, 0x3FFB3333,0x33333333, 0x4021A665,0x2AE0665A, + 0x400CCCCC,0xCCCCCCCD, 0x3FFCCCCC,0xCCCCCCCD, 0x40240FE0,0x0D65B973, + 0x400CCCCC,0xCCCCCCCD, 0x3FFE6666,0x66666666, 0x4026CDBD,0x50CEA987, + 0x400CCCCC,0xCCCCCCCD, 0x40000000,0x00000000, 0x4029EB85,0x1EB851EC, + 0x400D9999,0x9999999A, 0x3FB99999,0x9999999A, 0x3FF23C87,0x9670A28C, + 0x400D9999,0x9999999A, 0x3FC99999,0x9999999A, 0x3FF4C916,0x0FE2BAB0, + 0x400D9999,0x9999999A, 0x3FD33333,0x33333333, 0x3FF7B0DB,0x08B44BE4, + 0x400D9999,0x9999999A, 0x3FD99999,0x9999999A, 0x3FFB0096,0x62245F0A, + 0x400D9999,0x9999999A, 0x3FE00000,0x00000000, 0x3FFEC6D0,0x353167A9, + 0x400D9999,0x9999999A, 0x3FE33333,0x33333333, 0x40018A0C,0x4BBE2B80, + 0x400D9999,0x9999999A, 0x3FE66666,0x66666666, 0x4003FDA8,0x250364F3, + 0x400D9999,0x9999999A, 0x3FE99999,0x9999999A, 0x4006C8FD,0xC86019A3, + 0x400D9999,0x9999999A, 0x3FECCCCC,0xCCCCCCCD, 0x4009F850,0x4F358183, + 0x400D9999,0x9999999A, 0x3FF00000,0x00000000, 0x400D9999,0x9999999A, + 0x400D9999,0x9999999A, 0x3FF19999,0x9999999A, 0x4010DE63,0xD18E965B, + 0x400D9999,0x9999999A, 0x3FF33333,0x33333333, 0x40133A01,0x35181FE3, + 0x400D9999,0x9999999A, 0x3FF4CCCC,0xCCCCCCCD, 0x4015E9FD,0xCE739300, + 0x400D9999,0x9999999A, 0x3FF66666,0x66666666, 0x4018FA24,0xB461A4B6, + 0x400D9999,0x9999999A, 0x3FF80000,0x00000000, 0x401C77E6,0xFE00E649, + 0x400D9999,0x9999999A, 0x3FF99999,0x9999999A, 0x4020394B,0x5FA981D8, + 0x400D9999,0x9999999A, 0x3FFB3333,0x33333333, 0x40227DD5,0x223CBD61, + 0x400D9999,0x9999999A, 0x3FFCCCCC,0xCCCCCCCD, 0x40251384,0x5958E484, + 0x400D9999,0x9999999A, 0x3FFE6666,0x66666666, 0x402805B0,0xAFAB17CC, + 0x400D9999,0x9999999A, 0x40000000,0x00000000, 0x402B6147,0xAE147AE2, + 0x400E6666,0x66666666, 0x3FB99999,0x9999999A, 0x3FF248FF,0x146D0FF9, + 0x400E6666,0x66666666, 0x3FC99999,0x9999999A, 0x3FF4E58A,0xF58FD4AE, + 0x400E6666,0x66666666, 0x3FD33333,0x33333333, 0x3FF7E192,0x6A96DE76, + 0x400E6666,0x66666666, 0x3FD99999,0x9999999A, 0x3FFB4AB8,0x8453A384, + 0x400E6666,0x66666666, 0x3FE00000,0x00000000, 0x3FFF3092,0xECE5BC35, + 0x400E6666,0x66666666, 0x3FE33333,0x33333333, 0x4001D278,0x8ED1B766, + 0x400E6666,0x66666666, 0x3FE66666,0x66666666, 0x40045E16,0xE050948C, + 0x400E6666,0x66666666, 0x3FE99999,0x9999999A, 0x400746C5,0xD8D91AA8, + 0x400E6666,0x66666666, 0x3FECCCCC,0xCCCCCCCD, 0x400A99D0,0x23EC5FA7, + 0x400E6666,0x66666666, 0x3FF00000,0x00000000, 0x400E6666,0x66666666, + 0x400E6666,0x66666666, 0x3FF19999,0x9999999A, 0x40115EF2,0x53679BF9, + 0x400E6666,0x66666666, 0x3FF33333,0x33333333, 0x4013DA10,0xCFAF0A0B, + 0x400E6666,0x66666666, 0x3FF4CCCC,0xCCCCCCCD, 0x4016AFE4,0xB20F5357, + 0x400E6666,0x66666666, 0x3FF66666,0x66666666, 0x4019ED62,0x7DB5DB55, + 0x400E6666,0x66666666, 0x3FF80000,0x00000000, 0x401DA158,0x610D72CC, + 0x400E6666,0x66666666, 0x3FF99999,0x9999999A, 0x4020EE58,0xEE1407D4, + 0x400E6666,0x66666666, 0x3FFB3333,0x33333333, 0x40235962,0x884C8D1E, + 0x400E6666,0x66666666, 0x3FFCCCCC,0xCCCCCCCD, 0x40261CD5,0x8E0172EC, + 0x400E6666,0x66666666, 0x3FFE6666,0x66666666, 0x40294552,0x8886F477, + 0x400E6666,0x66666666, 0x40000000,0x00000000, 0x402CE147,0xAE147AE1, + 0x400F3333,0x33333333, 0x3FB99999,0x9999999A, 0x3FF2552B,0xDC147B86, + 0x400F3333,0x33333333, 0x3FC99999,0x9999999A, 0x3FF50168,0x11A8AA50, + 0x400F3333,0x33333333, 0x3FD33333,0x33333333, 0x3FF81166,0x217179F7, + 0x400F3333,0x33333333, 0x3FD99999,0x9999999A, 0x3FFB93B1,0x4E01D9CA, + 0x400F3333,0x33333333, 0x3FE00000,0x00000000, 0x3FFF98F3,0xADEF13F2, + 0x400F3333,0x33333333, 0x3FE33333,0x33333333, 0x40021A22,0xA7F3B4DB, + 0x400F3333,0x33333333, 0x3FE66666,0x66666666, 0x4004BDC3,0x744A1677, + 0x400F3333,0x33333333, 0x3FE99999,0x9999999A, 0x4007C3E4,0xDC763839, + 0x400F3333,0x33333333, 0x3FECCCCC,0xCCCCCCCD, 0x400B3AE3,0x4D333AF7, + 0x400F3333,0x33333333, 0x3FF00000,0x00000000, 0x400F3333,0x33333333, + 0x400F3333,0x33333333, 0x3FF19999,0x9999999A, 0x4011DFD7,0x902D920A, + 0x400F3333,0x33333333, 0x3FF33333,0x33333333, 0x40147AF8,0xAAD13FA7, + 0x400F3333,0x33333333, 0x3FF4CCCC,0xCCCCCCCD, 0x4017775D,0x2D683D51, + 0x400F3333,0x33333333, 0x3FF66666,0x66666666, 0x401AE333,0x45A83457, + 0x400F3333,0x33333333, 0x3FF80000,0x00000000, 0x401ECEBA,0x632F803F, + 0x400F3333,0x33333333, 0x3FF99999,0x9999999A, 0x4021A648,0x308D9D23, + 0x400F3333,0x33333333, 0x3FFB3333,0x33333333, 0x40243904,0xF7C83C4D, + 0x400F3333,0x33333333, 0x3FFCCCCC,0xCCCCCCCD, 0x40272BCB,0xF08CDD37, + 0x400F3333,0x33333333, 0x3FFE6666,0x66666666, 0x402A8C9D,0x9E78597C, + 0x400F3333,0x33333333, 0x40000000,0x00000000, 0x402E6B85,0x1EB851EB, + 0x40100000,0x00000000, 0x3FB99999,0x9999999A, 0x3FF26111,0x86BAE675, + 0x40100000,0x00000000, 0x3FC99999,0x9999999A, 0x3FF51CB4,0x53B9536C, + 0x40100000,0x00000000, 0x3FD33333,0x33333333, 0x3FF84060,0x03B2AE5C, + 0x40100000,0x00000000, 0x3FD99999,0x9999999A, 0x3FFBDB8C,0xDADBE120, + 0x40100000,0x00000000, 0x3FE00000,0x00000000, 0x40000000,0x00000000, + 0x40100000,0x00000000, 0x3FE33333,0x33333333, 0x40026111,0x86BAE674, + 0x40100000,0x00000000, 0x3FE66666,0x66666666, 0x40051CB4,0x53B9536C, + 0x40100000,0x00000000, 0x3FE99999,0x9999999A, 0x40084060,0x03B2AE5D, + 0x40100000,0x00000000, 0x3FECCCCC,0xCCCCCCCD, 0x400BDB8C,0xDADBE120, + 0x40100000,0x00000000, 0x3FF00000,0x00000000, 0x40100000,0x00000000, + 0x40100000,0x00000000, 0x3FF19999,0x9999999A, 0x40126111,0x86BAE675, + 0x40100000,0x00000000, 0x3FF33333,0x33333333, 0x40151CB4,0x53B9536C, + 0x40100000,0x00000000, 0x3FF4CCCC,0xCCCCCCCD, 0x40184060,0x03B2AE5D, + 0x40100000,0x00000000, 0x3FF66666,0x66666666, 0x401BDB8C,0xDADBE11F, + 0x40100000,0x00000000, 0x3FF80000,0x00000000, 0x40200000,0x00000000, + 0x40100000,0x00000000, 0x3FF99999,0x9999999A, 0x40226111,0x86BAE675, + 0x40100000,0x00000000, 0x3FFB3333,0x33333333, 0x40251CB4,0x53B9536C, + 0x40100000,0x00000000, 0x3FFCCCCC,0xCCCCCCCD, 0x40284060,0x03B2AE5D, + 0x40100000,0x00000000, 0x3FFE6666,0x66666666, 0x402BDB8C,0xDADBE11F, + 0x40100000,0x00000000, 0x40000000,0x00000000, 0x40300000,0x00000000, + }; + +LOCAL_D const TUint32 PowerTest2[] = + { + 0x40000000,0x00000000, 2, 0x40100000,0x00000000, + 0x40000000,0x00000000, 3, 0x40200000,0x00000000, + 0x40000000,0x00000000, 4, 0x40300000,0x00000000, + 0x40000000,0x00000000, 5, 0x40400000,0x00000000, + 0x40000000,0x00000000, 6, 0x40500000,0x00000000, + 0x40000000,0x00000000, 7, 0x40600000,0x00000000, + 0x40000000,0x00000000, 8, 0x40700000,0x00000000, + 0x40000000,0x00000000, 9, 0x40800000,0x00000000, + 0x40000000,0x00000000, 10, 0x40900000,0x00000000, + 0x40000000,0x00000000, 11, 0x40A00000,0x00000000, + 0x40000000,0x00000000, 12, 0x40B00000,0x00000000, + 0x40000000,0x00000000, 13, 0x40C00000,0x00000000, + 0x40000000,0x00000000, 14, 0x40D00000,0x00000000, + 0x40000000,0x00000000, 15, 0x40E00000,0x00000000, + 0x40000000,0x00000000, 16, 0x40F00000,0x00000000, + 0x40000000,0x00000000, 17, 0x41000000,0x00000000, + 0x40000000,0x00000000, 18, 0x41100000,0x00000000, + 0x40000000,0x00000000, 19, 0x41200000,0x00000000, + 0x40000000,0x00000000, 20, 0x41300000,0x00000000, + 0x40000000,0x00000000, 21, 0x41400000,0x00000000, + 0x40000000,0x00000000, 22, 0x41500000,0x00000000, + 0x40000000,0x00000000, 23, 0x41600000,0x00000000, + 0x40000000,0x00000000, 24, 0x41700000,0x00000000, + 0x40000000,0x00000000, 25, 0x41800000,0x00000000, + 0x40000000,0x00000000, 26, 0x41900000,0x00000000, + 0x40000000,0x00000000, 27, 0x41A00000,0x00000000, + 0x40000000,0x00000000, 28, 0x41B00000,0x00000000, + 0x40000000,0x00000000, 29, 0x41C00000,0x00000000, + 0x40000000,0x00000000, 30, 0x41D00000,0x00000000, + 0x40000000,0x00000000, 31, 0x41E00000,0x00000000, + 0x40000000,0x00000000, 32, 0x41F00000,0x00000000, + 0x40000000,0x00000000, 33, 0x42000000,0x00000000, + 0x40000000,0x00000000, 34, 0x42100000,0x00000000, + 0x40000000,0x00000000, 35, 0x42200000,0x00000000, + 0x40000000,0x00000000, 36, 0x42300000,0x00000000, + 0x40000000,0x00000000, 37, 0x42400000,0x00000000, + 0x40000000,0x00000000, 38, 0x42500000,0x00000000, + 0x40000000,0x00000000, 39, 0x42600000,0x00000000, + 0x40000000,0x00000000, 40, 0x42700000,0x00000000, + 0x40000000,0x00000000, 41, 0x42800000,0x00000000, + 0x40000000,0x00000000, 42, 0x42900000,0x00000000, + 0x40000000,0x00000000, 43, 0x42A00000,0x00000000, + 0x40000000,0x00000000, 44, 0x42B00000,0x00000000, + 0x40000000,0x00000000, 45, 0x42C00000,0x00000000, + 0x40000000,0x00000000, 46, 0x42D00000,0x00000000, + 0x40000000,0x00000000, 47, 0x42E00000,0x00000000, + 0x40000000,0x00000000, 48, 0x42F00000,0x00000000, + 0x40000000,0x00000000, 49, 0x43000000,0x00000000, + 0x40000000,0x00000000, 50, 0x43100000,0x00000000, + 0x40000000,0x00000000, 51, 0x43200000,0x00000000, + 0x40000000,0x00000000, 52, 0x43300000,0x00000000, + 0x40000000,0x00000000, 53, 0x43400000,0x00000000, + 0x40000000,0x00000000, 54, 0x43500000,0x00000000, + 0x40000000,0x00000000, 55, 0x43600000,0x00000000, + 0x40000000,0x00000000, 56, 0x43700000,0x00000000, + 0x40000000,0x00000000, 57, 0x43800000,0x00000000, + 0x40000000,0x00000000, 58, 0x43900000,0x00000000, + 0x40000000,0x00000000, 59, 0x43A00000,0x00000000, + 0x40000000,0x00000000, 60, 0x43B00000,0x00000000, + 0x40000000,0x00000000, 61, 0x43C00000,0x00000000, + 0x40000000,0x00000000, 62, 0x43D00000,0x00000000, + 0x40000000,0x00000000, 63, 0x43E00000,0x00000000, + 0x40000000,0x00000000, 64, 0x43F00000,0x00000000, + 0x40000000,0x00000000, 65, 0x44000000,0x00000000, + 0x40000000,0x00000000, 66, 0x44100000,0x00000000, + 0x40000000,0x00000000, 67, 0x44200000,0x00000000, + 0x40000000,0x00000000, 68, 0x44300000,0x00000000, + 0x40000000,0x00000000, 69, 0x44400000,0x00000000, + 0x40000000,0x00000000, 70, 0x44500000,0x00000000, + 0x40000000,0x00000000, 71, 0x44600000,0x00000000, + 0x40000000,0x00000000, 72, 0x44700000,0x00000000, + 0x40000000,0x00000000, 73, 0x44800000,0x00000000, + 0x40000000,0x00000000, 74, 0x44900000,0x00000000, + 0x40000000,0x00000000, 75, 0x44A00000,0x00000000, + 0x40000000,0x00000000, 76, 0x44B00000,0x00000000, + 0x40000000,0x00000000, 77, 0x44C00000,0x00000000, + 0x40000000,0x00000000, 78, 0x44D00000,0x00000000, + 0x40000000,0x00000000, 79, 0x44E00000,0x00000000, + 0x40000000,0x00000000, 80, 0x44F00000,0x00000000, + 0x40000000,0x00000000, 81, 0x45000000,0x00000000, + 0x40000000,0x00000000, 82, 0x45100000,0x00000000, + 0x40000000,0x00000000, 83, 0x45200000,0x00000000, + 0x40000000,0x00000000, 84, 0x45300000,0x00000000, + 0x40000000,0x00000000, 85, 0x45400000,0x00000000, + 0x40000000,0x00000000, 86, 0x45500000,0x00000000, + 0x40000000,0x00000000, 87, 0x45600000,0x00000000, + 0x40000000,0x00000000, 88, 0x45700000,0x00000000, + 0x40000000,0x00000000, 89, 0x45800000,0x00000000, + 0x40000000,0x00000000, 90, 0x45900000,0x00000000, + 0x40000000,0x00000000, 91, 0x45A00000,0x00000000, + 0x40000000,0x00000000, 92, 0x45B00000,0x00000000, + 0x40000000,0x00000000, 93, 0x45C00000,0x00000000, + 0x40000000,0x00000000, 94, 0x45D00000,0x00000000, + 0x40000000,0x00000000, 95, 0x45E00000,0x00000000, + 0x40000000,0x00000000, 96, 0x45F00000,0x00000000, + 0x40000000,0x00000000, 97, 0x46000000,0x00000000, + 0x40000000,0x00000000, 98, 0x46100000,0x00000000, + 0x40000000,0x00000000, 99, 0x46200000,0x00000000, + 0x40000000,0x00000000, 100, 0x46300000,0x00000000, + 0x40000000,0x00000000, 101, 0x46400000,0x00000000, + 0x40000000,0x00000000, 102, 0x46500000,0x00000000, + 0x40000000,0x00000000, 103, 0x46600000,0x00000000, + 0x40000000,0x00000000, 104, 0x46700000,0x00000000, + 0x40000000,0x00000000, 105, 0x46800000,0x00000000, + 0x40000000,0x00000000, 106, 0x46900000,0x00000000, + 0x40000000,0x00000000, 107, 0x46A00000,0x00000000, + 0x40000000,0x00000000, 108, 0x46B00000,0x00000000, + 0x40000000,0x00000000, 109, 0x46C00000,0x00000000, + 0x40000000,0x00000000, 110, 0x46D00000,0x00000000, + 0x40000000,0x00000000, 111, 0x46E00000,0x00000000, + 0x40000000,0x00000000, 112, 0x46F00000,0x00000000, + 0x40000000,0x00000000, 113, 0x47000000,0x00000000, + 0x40000000,0x00000000, 114, 0x47100000,0x00000000, + 0x40000000,0x00000000, 115, 0x47200000,0x00000000, + 0x40000000,0x00000000, 116, 0x47300000,0x00000000, + 0x40000000,0x00000000, 117, 0x47400000,0x00000000, + 0x40000000,0x00000000, 118, 0x47500000,0x00000000, + 0x40000000,0x00000000, 119, 0x47600000,0x00000000, + 0x40000000,0x00000000, 120, 0x47700000,0x00000000, + 0x40000000,0x00000000, 121, 0x47800000,0x00000000, + 0x40000000,0x00000000, 122, 0x47900000,0x00000000, + 0x40000000,0x00000000, 123, 0x47A00000,0x00000000, + 0x40000000,0x00000000, 124, 0x47B00000,0x00000000, + 0x40000000,0x00000000, 125, 0x47C00000,0x00000000, + 0x40000000,0x00000000, 126, 0x47D00000,0x00000000, + 0x40000000,0x00000000, 127, 0x47E00000,0x00000000, + 0x40000000,0x00000000, 128, 0x47F00000,0x00000000, + 0x40000000,0x00000000, 129, 0x48000000,0x00000000, + 0x40000000,0x00000000, 130, 0x48100000,0x00000000, + 0x40000000,0x00000000, 131, 0x48200000,0x00000000, + 0x40000000,0x00000000, 132, 0x48300000,0x00000000, + 0x40000000,0x00000000, 133, 0x48400000,0x00000000, + 0x40000000,0x00000000, 134, 0x48500000,0x00000000, + 0x40000000,0x00000000, 135, 0x48600000,0x00000000, + 0x40000000,0x00000000, 136, 0x48700000,0x00000000, + 0x40000000,0x00000000, 137, 0x48800000,0x00000000, + 0x40000000,0x00000000, 138, 0x48900000,0x00000000, + 0x40000000,0x00000000, 139, 0x48A00000,0x00000000, + 0x40000000,0x00000000, 140, 0x48B00000,0x00000000, + 0x40000000,0x00000000, 141, 0x48C00000,0x00000000, + 0x40000000,0x00000000, 142, 0x48D00000,0x00000000, + 0x40000000,0x00000000, 143, 0x48E00000,0x00000000, + 0x40000000,0x00000000, 144, 0x48F00000,0x00000000, + 0x40000000,0x00000000, 145, 0x49000000,0x00000000, + 0x40000000,0x00000000, 146, 0x49100000,0x00000000, + 0x40000000,0x00000000, 147, 0x49200000,0x00000000, + 0x40000000,0x00000000, 148, 0x49300000,0x00000000, + 0x40000000,0x00000000, 149, 0x49400000,0x00000000, + 0x40000000,0x00000000, 150, 0x49500000,0x00000000, + 0x40000000,0x00000000, 151, 0x49600000,0x00000000, + 0x40000000,0x00000000, 152, 0x49700000,0x00000000, + 0x40000000,0x00000000, 153, 0x49800000,0x00000000, + 0x40000000,0x00000000, 154, 0x49900000,0x00000000, + 0x40000000,0x00000000, 155, 0x49A00000,0x00000000, + 0x40000000,0x00000000, 156, 0x49B00000,0x00000000, + 0x40000000,0x00000000, 157, 0x49C00000,0x00000000, + 0x40000000,0x00000000, 158, 0x49D00000,0x00000000, + 0x40000000,0x00000000, 159, 0x49E00000,0x00000000, + 0x40000000,0x00000000, 160, 0x49F00000,0x00000000, + 0x40000000,0x00000000, 161, 0x4A000000,0x00000000, + 0x40000000,0x00000000, 162, 0x4A100000,0x00000000, + 0x40000000,0x00000000, 163, 0x4A200000,0x00000000, + 0x40000000,0x00000000, 164, 0x4A300000,0x00000000, + 0x40000000,0x00000000, 165, 0x4A400000,0x00000000, + 0x40000000,0x00000000, 166, 0x4A500000,0x00000000, + 0x40000000,0x00000000, 167, 0x4A600000,0x00000000, + 0x40000000,0x00000000, 168, 0x4A700000,0x00000000, + 0x40000000,0x00000000, 169, 0x4A800000,0x00000000, + 0x40000000,0x00000000, 170, 0x4A900000,0x00000000, + 0x40000000,0x00000000, 171, 0x4AA00000,0x00000000, + 0x40000000,0x00000000, 172, 0x4AB00000,0x00000000, + 0x40000000,0x00000000, 173, 0x4AC00000,0x00000000, + 0x40000000,0x00000000, 174, 0x4AD00000,0x00000000, + 0x40000000,0x00000000, 175, 0x4AE00000,0x00000000, + 0x40000000,0x00000000, 176, 0x4AF00000,0x00000000, + 0x40000000,0x00000000, 177, 0x4B000000,0x00000000, + 0x40000000,0x00000000, 178, 0x4B100000,0x00000000, + 0x40000000,0x00000000, 179, 0x4B200000,0x00000000, + 0x40000000,0x00000000, 180, 0x4B300000,0x00000000, + 0x40000000,0x00000000, 181, 0x4B400000,0x00000000, + 0x40000000,0x00000000, 182, 0x4B500000,0x00000000, + 0x40000000,0x00000000, 183, 0x4B600000,0x00000000, + 0x40000000,0x00000000, 184, 0x4B700000,0x00000000, + 0x40000000,0x00000000, 185, 0x4B800000,0x00000000, + 0x40000000,0x00000000, 186, 0x4B900000,0x00000000, + 0x40000000,0x00000000, 187, 0x4BA00000,0x00000000, + 0x40000000,0x00000000, 188, 0x4BB00000,0x00000000, + 0x40000000,0x00000000, 189, 0x4BC00000,0x00000000, + 0x40000000,0x00000000, 190, 0x4BD00000,0x00000000, + 0x40000000,0x00000000, 191, 0x4BE00000,0x00000000, + 0x40000000,0x00000000, 192, 0x4BF00000,0x00000000, + 0x40000000,0x00000000, 193, 0x4C000000,0x00000000, + 0x40000000,0x00000000, 194, 0x4C100000,0x00000000, + 0x40000000,0x00000000, 195, 0x4C200000,0x00000000, + 0x40000000,0x00000000, 196, 0x4C300000,0x00000000, + 0x40000000,0x00000000, 197, 0x4C400000,0x00000000, + 0x40000000,0x00000000, 198, 0x4C500000,0x00000000, + 0x40000000,0x00000000, 199, 0x4C600000,0x00000000, + 0x40000000,0x00000000, 200, 0x4C700000,0x00000000, + 0x40000000,0x00000000, 201, 0x4C800000,0x00000000, + 0x40000000,0x00000000, 202, 0x4C900000,0x00000000, + 0x40000000,0x00000000, 203, 0x4CA00000,0x00000000, + 0x40000000,0x00000000, 204, 0x4CB00000,0x00000000, + 0x40000000,0x00000000, 205, 0x4CC00000,0x00000000, + 0x40000000,0x00000000, 206, 0x4CD00000,0x00000000, + 0x40000000,0x00000000, 207, 0x4CE00000,0x00000000, + 0x40000000,0x00000000, 208, 0x4CF00000,0x00000000, + 0x40000000,0x00000000, 209, 0x4D000000,0x00000000, + 0x40000000,0x00000000, 210, 0x4D100000,0x00000000, + 0x40000000,0x00000000, 211, 0x4D200000,0x00000000, + 0x40000000,0x00000000, 212, 0x4D300000,0x00000000, + 0x40000000,0x00000000, 213, 0x4D400000,0x00000000, + 0x40000000,0x00000000, 214, 0x4D500000,0x00000000, + 0x40000000,0x00000000, 215, 0x4D600000,0x00000000, + 0x40000000,0x00000000, 216, 0x4D700000,0x00000000, + 0x40000000,0x00000000, 217, 0x4D800000,0x00000000, + 0x40000000,0x00000000, 218, 0x4D900000,0x00000000, + 0x40000000,0x00000000, 219, 0x4DA00000,0x00000000, + 0x40000000,0x00000000, 220, 0x4DB00000,0x00000000, + 0x40000000,0x00000000, 221, 0x4DC00000,0x00000000, + 0x40000000,0x00000000, 222, 0x4DD00000,0x00000000, + 0x40000000,0x00000000, 223, 0x4DE00000,0x00000000, + 0x40000000,0x00000000, 224, 0x4DF00000,0x00000000, + 0x40000000,0x00000000, 225, 0x4E000000,0x00000000, + 0x40000000,0x00000000, 226, 0x4E100000,0x00000000, + 0x40000000,0x00000000, 227, 0x4E200000,0x00000000, + 0x40000000,0x00000000, 228, 0x4E300000,0x00000000, + 0x40000000,0x00000000, 229, 0x4E400000,0x00000000, + 0x40000000,0x00000000, 230, 0x4E500000,0x00000000, + 0x40000000,0x00000000, 231, 0x4E600000,0x00000000, + 0x40000000,0x00000000, 232, 0x4E700000,0x00000000, + 0x40000000,0x00000000, 233, 0x4E800000,0x00000000, + 0x40000000,0x00000000, 234, 0x4E900000,0x00000000, + 0x40000000,0x00000000, 235, 0x4EA00000,0x00000000, + 0x40000000,0x00000000, 236, 0x4EB00000,0x00000000, + 0x40000000,0x00000000, 237, 0x4EC00000,0x00000000, + 0x40000000,0x00000000, 238, 0x4ED00000,0x00000000, + 0x40000000,0x00000000, 239, 0x4EE00000,0x00000000, + 0x40000000,0x00000000, 240, 0x4EF00000,0x00000000, + 0x40000000,0x00000000, 241, 0x4F000000,0x00000000, + 0x40000000,0x00000000, 242, 0x4F100000,0x00000000, + 0x40000000,0x00000000, 243, 0x4F200000,0x00000000, + 0x40000000,0x00000000, 244, 0x4F300000,0x00000000, + 0x40000000,0x00000000, 245, 0x4F400000,0x00000000, + 0x40000000,0x00000000, 246, 0x4F500000,0x00000000, + 0x40000000,0x00000000, 247, 0x4F600000,0x00000000, + 0x40000000,0x00000000, 248, 0x4F700000,0x00000000, + 0x40000000,0x00000000, 249, 0x4F800000,0x00000000, + 0x40000000,0x00000000, 250, 0x4F900000,0x00000000, + 0x40000000,0x00000000, 251, 0x4FA00000,0x00000000, + 0x40000000,0x00000000, 252, 0x4FB00000,0x00000000, + 0x40000000,0x00000000, 253, 0x4FC00000,0x00000000, + 0x40000000,0x00000000, 254, 0x4FD00000,0x00000000, + 0x40000000,0x00000000, 255, 0x4FE00000,0x00000000, + 0x40000000,0x00000000, 256, 0x4FF00000,0x00000000, + 0x40000000,0x00000000, 257, 0x50000000,0x00000000, + 0x40000000,0x00000000, 258, 0x50100000,0x00000000, + 0x40000000,0x00000000, 259, 0x50200000,0x00000000, + 0x40000000,0x00000000, 260, 0x50300000,0x00000000, + 0x40000000,0x00000000, 261, 0x50400000,0x00000000, + 0x40000000,0x00000000, 262, 0x50500000,0x00000000, + 0x40000000,0x00000000, 263, 0x50600000,0x00000000, + 0x40000000,0x00000000, 264, 0x50700000,0x00000000, + 0x40000000,0x00000000, 265, 0x50800000,0x00000000, + 0x40000000,0x00000000, 266, 0x50900000,0x00000000, + 0x40000000,0x00000000, 267, 0x50A00000,0x00000000, + 0x40000000,0x00000000, 268, 0x50B00000,0x00000000, + 0x40000000,0x00000000, 269, 0x50C00000,0x00000000, + 0x40000000,0x00000000, 270, 0x50D00000,0x00000000, + 0x40000000,0x00000000, 271, 0x50E00000,0x00000000, + 0x40000000,0x00000000, 272, 0x50F00000,0x00000000, + 0x40000000,0x00000000, 273, 0x51000000,0x00000000, + 0x40000000,0x00000000, 274, 0x51100000,0x00000000, + 0x40000000,0x00000000, 275, 0x51200000,0x00000000, + 0x40000000,0x00000000, 276, 0x51300000,0x00000000, + 0x40000000,0x00000000, 277, 0x51400000,0x00000000, + 0x40000000,0x00000000, 278, 0x51500000,0x00000000, + 0x40000000,0x00000000, 279, 0x51600000,0x00000000, + 0x40000000,0x00000000, 280, 0x51700000,0x00000000, + 0x40000000,0x00000000, 281, 0x51800000,0x00000000, + 0x40000000,0x00000000, 282, 0x51900000,0x00000000, + 0x40000000,0x00000000, 283, 0x51A00000,0x00000000, + 0x40000000,0x00000000, 284, 0x51B00000,0x00000000, + 0x40000000,0x00000000, 285, 0x51C00000,0x00000000, + 0x40000000,0x00000000, 286, 0x51D00000,0x00000000, + 0x40000000,0x00000000, 287, 0x51E00000,0x00000000, + 0x40000000,0x00000000, 288, 0x51F00000,0x00000000, + 0x40000000,0x00000000, 289, 0x52000000,0x00000000, + 0x40000000,0x00000000, 290, 0x52100000,0x00000000, + 0x40000000,0x00000000, 291, 0x52200000,0x00000000, + 0x40000000,0x00000000, 292, 0x52300000,0x00000000, + 0x40000000,0x00000000, 293, 0x52400000,0x00000000, + 0x40000000,0x00000000, 294, 0x52500000,0x00000000, + 0x40000000,0x00000000, 295, 0x52600000,0x00000000, + 0x40000000,0x00000000, 296, 0x52700000,0x00000000, + 0x40000000,0x00000000, 297, 0x52800000,0x00000000, + 0x40000000,0x00000000, 298, 0x52900000,0x00000000, + 0x40000000,0x00000000, 299, 0x52A00000,0x00000000, + 0x40000000,0x00000000, 300, 0x52B00000,0x00000000, + 0x40080000,0x00000000, 2, 0x40220000,0x00000000, + 0x40080000,0x00000000, 3, 0x403B0000,0x00000000, + 0x40080000,0x00000000, 4, 0x40544000,0x00000000, + 0x40080000,0x00000000, 5, 0x406E6000,0x00000000, + 0x40080000,0x00000000, 6, 0x4086C800,0x00000000, + 0x40080000,0x00000000, 7, 0x40A11600,0x00000000, + 0x40080000,0x00000000, 8, 0x40B9A100,0x00000000, + 0x40080000,0x00000000, 9, 0x40D338C0,0x00000000, + 0x40080000,0x00000000, 10, 0x40ECD520,0x00000000, + 0x40080000,0x00000000, 11, 0x41059FD8,0x00000000, + 0x40080000,0x00000000, 12, 0x412037E2,0x00000000, + 0x40080000,0x00000000, 13, 0x413853D3,0x00000000, + 0x40080000,0x00000000, 14, 0x41523EDE,0x40000000, + 0x40080000,0x00000000, 15, 0x416B5E4D,0x60000000, + 0x40080000,0x00000000, 16, 0x418486BA,0x08000000, + 0x40080000,0x00000000, 17, 0x419ECA17,0x0C000000, + 0x40080000,0x00000000, 18, 0x41B71791,0x49000000, + 0x40080000,0x00000000, 19, 0x41D151AC,0xF6C00000, + 0x40080000,0x00000000, 20, 0x41E9FA83,0x72200000, + 0x40080000,0x00000000, 21, 0x42037BE2,0x95980000, + 0x40080000,0x00000000, 22, 0x421D39D3,0xE0640000, + 0x40080000,0x00000000, 23, 0x4235EB5E,0xE84B0000, + 0x40080000,0x00000000, 24, 0x42507087,0x2E384000, + 0x40080000,0x00000000, 25, 0x4268A8CA,0xC5546000, + 0x40080000,0x00000000, 26, 0x42827E98,0x13FF4800, + 0x40080000,0x00000000, 27, 0x429BBDE4,0x1DFEEC00, + 0x40080000,0x00000000, 28, 0x42B4CE6B,0x167F3100, + 0x40080000,0x00000000, 29, 0x42CF35A0,0xA1BEC980, + 0x40080000,0x00000000, 30, 0x42E76838,0x794F1720, + 0x40080000,0x00000000, 31, 0x43018E2A,0x5AFB5158, + 0x40080000,0x00000000, 32, 0x431A553F,0x8878FA04, + 0x40080000,0x00000000, 33, 0x4333BFEF,0xA65ABB83, + 0x40080000,0x00000000, 34, 0x434D9FE7,0x79881944, + 0x40080000,0x00000000, 35, 0x436637ED,0x9B2612F3, + 0x40080000,0x00000000, 36, 0x4380A9F2,0x345C8E37, + 0x40080000,0x00000000, 37, 0x4398FEEB,0x4E8AD552, + 0x40080000,0x00000000, 38, 0x43B2BF30,0x7AE81FFD, + 0x40080000,0x00000000, 39, 0x43CC1EC8,0xB85C2FFC, + 0x40080000,0x00000000, 40, 0x43E51716,0x8A4523FD, + 0x40080000,0x00000000, 41, 0x43FFA2A1,0xCF67B5FC, + 0x40080000,0x00000000, 42, 0x4417B9F9,0x5B8DC87D, + 0x40080000,0x00000000, 43, 0x4431CB7B,0x04AA565D, + 0x40080000,0x00000000, 44, 0x444AB138,0x86FF818C, + 0x40080000,0x00000000, 45, 0x446404EA,0x653FA129, + 0x40080000,0x00000000, 46, 0x447E075F,0x97DF71BE, + 0x40080000,0x00000000, 47, 0x44968587,0xB1E7954E, + 0x40080000,0x00000000, 48, 0x44B0E425,0xC56DAFFB, + 0x40080000,0x00000000, 49, 0x44C95638,0xA82487F8, + 0x40080000,0x00000000, 50, 0x44E300AA,0x7E1B65FA, + 0x40080000,0x00000000, 51, 0x44FC80FF,0xBD2918F7, + 0x40080000,0x00000000, 52, 0x451560BF,0xCDDED2B9, + 0x40080000,0x00000000, 53, 0x4530088F,0xDA671E0B, + 0x40080000,0x00000000, 54, 0x45480CD7,0xC79AAD11, + 0x40080000,0x00000000, 55, 0x456209A1,0xD5B401CC, + 0x40080000,0x00000000, 56, 0x457B0E72,0xC08E02B3, + 0x40080000,0x00000000, 57, 0x45944AD6,0x106A8206, + 0x40080000,0x00000000, 58, 0x45AE7041,0x189FC309, + 0x40080000,0x00000000, 59, 0x45C6D430,0xD277D247, + 0x40080000,0x00000000, 60, 0x45E11F24,0x9DD9DDB5, + 0x40080000,0x00000000, 61, 0x45F9AEB6,0xECC6CC8F, + 0x40080000,0x00000000, 62, 0x46134309,0x3195196C, + 0x40080000,0x00000000, 63, 0x462CE48D,0xCA5FA621, + 0x40080000,0x00000000, 64, 0x4645AB6A,0x57C7BC99, + 0x40080000,0x00000000, 65, 0x4660408F,0xC1D5CD73, + 0x40080000,0x00000000, 66, 0x467860D7,0xA2C0B42C, + 0x40080000,0x00000000, 67, 0x469248A1,0xBA108721, + 0x40080000,0x00000000, 68, 0x46AB6CF2,0x9718CAB2, + 0x40080000,0x00000000, 69, 0x46C491B5,0xF1529805, + 0x40080000,0x00000000, 70, 0x46DEDA90,0xE9FBE408, + 0x40080000,0x00000000, 71, 0x46F723EC,0xAF7CEB06, + 0x40080000,0x00000000, 72, 0x47115AF1,0x839DB044, + 0x40080000,0x00000000, 73, 0x472A086A,0x456C8867, + 0x40080000,0x00000000, 74, 0x4743864F,0xB411664D, + 0x40080000,0x00000000, 75, 0x475D4977,0x8E1A1974, + 0x40080000,0x00000000, 76, 0x4775F719,0xAA939317, + 0x40080000,0x00000000, 77, 0x47907953,0x3FEEAE51, + 0x40080000,0x00000000, 78, 0x47A8B5FC,0xDFE60579, + 0x40080000,0x00000000, 79, 0x47C2887D,0xA7EC841B, + 0x40080000,0x00000000, 80, 0x47DBCCBC,0x7BE2C629, + 0x40080000,0x00000000, 81, 0x47F4D98D,0x5CEA149F, + 0x40080000,0x00000000, 82, 0x480F4654,0x0B5F1EEE, + 0x40080000,0x00000000, 83, 0x482774BF,0x08875732, + 0x40080000,0x00000000, 84, 0x4841978F,0x46658166, + 0x40080000,0x00000000, 85, 0x485A6356,0xE9984219, + 0x40080000,0x00000000, 86, 0x4873CA81,0x2F323192, + 0x40080000,0x00000000, 87, 0x488DAFC1,0xC6CB4A5C, + 0x40080000,0x00000000, 88, 0x48A643D1,0x551877C5, + 0x40080000,0x00000000, 89, 0x48C0B2DC,0xFFD259D4, + 0x40080000,0x00000000, 90, 0x48D90C4B,0x7FBB86BD, + 0x40080000,0x00000000, 91, 0x48F2C938,0x9FCCA50E, + 0x40080000,0x00000000, 92, 0x490C2DD4,0xEFB2F795, + 0x40080000,0x00000000, 93, 0x4925225F,0xB3C639B0, + 0x40080000,0x00000000, 94, 0x493FB38F,0x8DA95688, + 0x40080000,0x00000000, 95, 0x4957C6AB,0xAA3F00E6, + 0x40080000,0x00000000, 96, 0x4971D500,0xBFAF40AC, + 0x40080000,0x00000000, 97, 0x498ABF81,0x1F86E102, + 0x40080000,0x00000000, 98, 0x49A40FA0,0xD7A528C2, + 0x40080000,0x00000000, 99, 0x49BE1771,0x4377BD23, + 0x40080000,0x00000000, 100, 0x49D69194,0xF299CDDA, + 0x40080000,0x00000000, 101, 0x49F0ED2F,0xB5F35A64, + 0x40080000,0x00000000, 102, 0x4A0963C7,0x90ED0795, + 0x40080000,0x00000000, 103, 0x4A230AD5,0xACB1C5B0, + 0x40080000,0x00000000, 104, 0x4A3C9040,0x830AA888, + 0x40080000,0x00000000, 105, 0x4A556C30,0x6247FE66, + 0x40080000,0x00000000, 106, 0x4A701124,0x49B5FECD, + 0x40080000,0x00000000, 107, 0x4A8819B6,0x6E90FE33, + 0x40080000,0x00000000, 108, 0x4AA21348,0xD2ECBEA6, + 0x40080000,0x00000000, 109, 0x4ABB1CED,0x3C631DF9, + 0x40080000,0x00000000, 110, 0x4AD455B1,0xED4A567B, + 0x40080000,0x00000000, 111, 0x4AEE808A,0xE3EF81B8, + 0x40080000,0x00000000, 112, 0x4B06E068,0x2AF3A14A, + 0x40080000,0x00000000, 113, 0x4B21284E,0x2036B8F8, + 0x40080000,0x00000000, 114, 0x4B39BC75,0x30521573, + 0x40080000,0x00000000, 115, 0x4B534D57,0xE43D9017, + 0x40080000,0x00000000, 116, 0x4B6CF403,0xD65C5822, + 0x40080000,0x00000000, 117, 0x4B85B702,0xE0C54219, + 0x40080000,0x00000000, 118, 0x4BA04942,0x2893F193, + 0x40080000,0x00000000, 119, 0x4BB86DE3,0x3CDDEA5D, + 0x40080000,0x00000000, 120, 0x4BD2526A,0x6DA66FC5, + 0x40080000,0x00000000, 121, 0x4BEB7B9F,0xA479A7A8, + 0x40080000,0x00000000, 122, 0x4C049CB7,0xBB5B3DBE, + 0x40080000,0x00000000, 123, 0x4C1EEB13,0x9908DC9D, + 0x40080000,0x00000000, 124, 0x4C37304E,0xB2C6A576, + 0x40080000,0x00000000, 125, 0x4C51643B,0x0614FC18, + 0x40080000,0x00000000, 126, 0x4C6A1658,0x891F7A25, + 0x40080000,0x00000000, 127, 0x4C8390C2,0x66D79B9B, + 0x40080000,0x00000000, 128, 0x4C9D5923,0x9A436969, + 0x40080000,0x00000000, 129, 0x4CB602DA,0xB3B28F0F, + 0x40080000,0x00000000, 130, 0x4CD08224,0x06C5EB4B, + 0x40080000,0x00000000, 131, 0x4CE8C336,0x0A28E0F1, + 0x40080000,0x00000000, 132, 0x4D029268,0x879EA8B5, + 0x40080000,0x00000000, 133, 0x4D1BDB9C,0xCB6DFD0F, + 0x40080000,0x00000000, 134, 0x4D34E4B5,0x98927DCB, + 0x40080000,0x00000000, 135, 0x4D4F5710,0x64DBBCB1, + 0x40080000,0x00000000, 136, 0x4D67814C,0x4BA4CD85, + 0x40080000,0x00000000, 137, 0x4D81A0F9,0x38BB9A23, + 0x40080000,0x00000000, 138, 0x4D9A7175,0xD5196735, + 0x40080000,0x00000000, 139, 0x4DB3D518,0x5FD30D68, + 0x40080000,0x00000000, 140, 0x4DCDBFA4,0x8FBC941C, + 0x40080000,0x00000000, 141, 0x4DE64FBB,0x6BCD6F15, + 0x40080000,0x00000000, 142, 0x4E00BBCC,0x90DA1350, + 0x40080000,0x00000000, 143, 0x4E1919B2,0xD9471CF7, + 0x40080000,0x00000000, 144, 0x4E32D346,0x22F555BA, + 0x40080000,0x00000000, 145, 0x4E4C3CE9,0x34700096, + 0x40080000,0x00000000, 146, 0x4E652DAE,0xE7540071, + 0x40080000,0x00000000, 147, 0x4E7FC486,0x5AFE00A9, + 0x40080000,0x00000000, 148, 0x4E97D364,0xC43E807F, + 0x40080000,0x00000000, 149, 0x4EB1DE8B,0x932EE05F, + 0x40080000,0x00000000, 150, 0x4ECACDD1,0x5CC6508F, + 0x40080000,0x00000000, 151, 0x4EE41A5D,0x0594BC6B, + 0x40080000,0x00000000, 152, 0x4EFE278B,0x885F1AA1, + 0x40080000,0x00000000, 153, 0x4F169DA8,0xA64753F8, + 0x40080000,0x00000000, 154, 0x4F30F63E,0x7CB57EFA, + 0x40080000,0x00000000, 155, 0x4F49715D,0xBB103E77, + 0x40080000,0x00000000, 156, 0x4F631506,0x4C4C2EDA, + 0x40080000,0x00000000, 157, 0x4F7C9F89,0x72724646, + 0x40080000,0x00000000, 158, 0x4F9577A7,0x15D5B4B5, + 0x40080000,0x00000000, 159, 0x4FB019BD,0x50604788, + 0x40080000,0x00000000, 160, 0x4FC8269B,0xF8906B4B, + 0x40080000,0x00000000, 161, 0x4FE21CF4,0xFA6C5079, + 0x40080000,0x00000000, 162, 0x4FFB2B6F,0x77A278B5, + 0x40080000,0x00000000, 163, 0x50146093,0x99B9DA88, + 0x40080000,0x00000000, 164, 0x502E90DD,0x6696C7CB, + 0x40080000,0x00000000, 165, 0x5046ECA6,0x0CF115D9, + 0x40080000,0x00000000, 166, 0x5061317C,0x89B4D062, + 0x40080000,0x00000000, 167, 0x5079CA3A,0xCE8F3894, + 0x40080000,0x00000000, 168, 0x509357AC,0x1AEB6A6F, + 0x40080000,0x00000000, 169, 0x50AD0382,0x28611FA6, + 0x40080000,0x00000000, 170, 0x50C5C2A1,0x9E48D7BD, + 0x40080000,0x00000000, 171, 0x50E051F9,0x36B6A1CD, + 0x40080000,0x00000000, 172, 0x50F87AF5,0xD211F2B4, + 0x40080000,0x00000000, 173, 0x51125C38,0x5D8D7607, + 0x40080000,0x00000000, 174, 0x512B8A54,0x8C54310B, + 0x40080000,0x00000000, 175, 0x5144A7BF,0x693F24C8, + 0x40080000,0x00000000, 176, 0x515EFB9F,0x1DDEB72C, + 0x40080000,0x00000000, 177, 0x51773CB7,0x56670961, + 0x40080000,0x00000000, 178, 0x51916D89,0x80CD4709, + 0x40080000,0x00000000, 179, 0x51AA244E,0x4133EA8D, + 0x40080000,0x00000000, 180, 0x51C39B3A,0xB0E6EFEA, + 0x40080000,0x00000000, 181, 0x51DD68D8,0x095A67DF, + 0x40080000,0x00000000, 182, 0x51F60EA2,0x0703CDE7, + 0x40080000,0x00000000, 183, 0x52108AF9,0x8542DA6D, + 0x40080000,0x00000000, 184, 0x5228D076,0x47E447A4, + 0x40080000,0x00000000, 185, 0x52429C58,0xB5EB35BB, + 0x40080000,0x00000000, 186, 0x525BEA85,0x10E0D098, + 0x40080000,0x00000000, 187, 0x5274EFE3,0xCCA89C72, + 0x40080000,0x00000000, 188, 0x528F67D5,0xB2FCEAAB, + 0x40080000,0x00000000, 189, 0x52A78DE0,0x463DB001, + 0x40080000,0x00000000, 190, 0x52C1AA68,0x34AE4400, + 0x40080000,0x00000000, 191, 0x52DA7F9C,0x4F056601, + 0x40080000,0x00000000, 192, 0x52F3DFB5,0x3B440C81, + 0x40080000,0x00000000, 193, 0x530DCF8F,0xD8E612C1, + 0x40080000,0x00000000, 194, 0x53265BAB,0xE2AC8E11, + 0x40080000,0x00000000, 195, 0x5340C4C0,0xEA016A8C, + 0x40080000,0x00000000, 196, 0x53592721,0x5F021FD3, + 0x40080000,0x00000000, 197, 0x5372DD59,0x074197DE, + 0x40080000,0x00000000, 198, 0x538C4C05,0x8AE263CD, + 0x40080000,0x00000000, 199, 0x53A53904,0x2829CADA, + 0x40080000,0x00000000, 200, 0x53BFD586,0x3C3EB047, + 0x40080000,0x00000000, 201, 0x53D7E024,0xAD2F0435, + 0x40080000,0x00000000, 202, 0x53F1E81B,0x81E34328, + 0x40080000,0x00000000, 203, 0x540ADC29,0x42D4E4BC, + 0x40080000,0x00000000, 204, 0x5424251E,0xF21FAB8D, + 0x40080000,0x00000000, 205, 0x543E37AE,0x6B2F8153, + 0x40080000,0x00000000, 206, 0x5456A9C2,0xD063A0FE, + 0x40080000,0x00000000, 207, 0x5470FF52,0x1C4AB8BF, + 0x40080000,0x00000000, 208, 0x54897EFB,0x2A70151E, + 0x40080000,0x00000000, 209, 0x54A31F3C,0x5FD40FD7, + 0x40080000,0x00000000, 210, 0x54BCAEDA,0x8FBE17C2, + 0x40080000,0x00000000, 211, 0x54D58323,0xEBCE91D1, + 0x40080000,0x00000000, 212, 0x54F0225A,0xF0DAED5D, + 0x40080000,0x00000000, 213, 0x55083388,0x6948640C, + 0x40080000,0x00000000, 214, 0x552226A6,0x4EF64B09, + 0x40080000,0x00000000, 215, 0x553B39F9,0x7671708D, + 0x40080000,0x00000000, 216, 0x55546B7B,0x18D5146A, + 0x40080000,0x00000000, 217, 0x556EA138,0xA53F9E9F, + 0x40080000,0x00000000, 218, 0x5586F8EA,0x7BEFB6F7, + 0x40080000,0x00000000, 219, 0x55A13AAF,0xDCF3C939, + 0x40080000,0x00000000, 220, 0x55B9D807,0xCB6DADD6, + 0x40080000,0x00000000, 221, 0x55D36205,0xD8924260, + 0x40080000,0x00000000, 222, 0x55ED1308,0xC4DB6391, + 0x40080000,0x00000000, 223, 0x5605CE46,0x93A48AAC, + 0x40080000,0x00000000, 224, 0x56205AB4,0xEEBB6801, + 0x40080000,0x00000000, 225, 0x5638880F,0x66191C02, + 0x40080000,0x00000000, 226, 0x5652660B,0x8C92D501, + 0x40080000,0x00000000, 227, 0x566B9911,0x52DC3F82, + 0x40080000,0x00000000, 228, 0x5684B2CC,0xFE252FA2, + 0x40080000,0x00000000, 229, 0x569F0C33,0x7D37C772, + 0x40080000,0x00000000, 230, 0x56B74926,0x9DE9D596, + 0x40080000,0x00000000, 231, 0x56D176DC,0xF66F6030, + 0x40080000,0x00000000, 232, 0x56EA324B,0x71A71049, + 0x40080000,0x00000000, 233, 0x5703A5B8,0x953D4C36, + 0x40080000,0x00000000, 234, 0x571D7894,0xDFDBF252, + 0x40080000,0x00000000, 235, 0x57361A6F,0xA7E4F5BD, + 0x40080000,0x00000000, 236, 0x575093D3,0xBDEBB84E, + 0x40080000,0x00000000, 237, 0x5768DDBD,0x9CE19475, + 0x40080000,0x00000000, 238, 0x5782A64E,0x35A92F58, + 0x40080000,0x00000000, 239, 0x579BF975,0x507DC704, + 0x40080000,0x00000000, 240, 0x57B4FB17,0xFC5E5543, + 0x40080000,0x00000000, 241, 0x57CF78A3,0xFA8D7FE4, + 0x40080000,0x00000000, 242, 0x57E79A7A,0xFBEA1FEB, + 0x40080000,0x00000000, 243, 0x5801B3DC,0x3CEF97F0, + 0x40080000,0x00000000, 244, 0x581A8DCA,0x5B6763E8, + 0x40080000,0x00000000, 245, 0x5833EA57,0xC48D8AEE, + 0x40080000,0x00000000, 246, 0x584DDF83,0xA6D45065, + 0x40080000,0x00000000, 247, 0x586667A2,0xBD1F3C4C, + 0x40080000,0x00000000, 248, 0x5880CDBA,0x0DD76D39, + 0x40080000,0x00000000, 249, 0x58993497,0x14C323D6, + 0x40080000,0x00000000, 250, 0x58B2E771,0x4F925AE0, + 0x40080000,0x00000000, 251, 0x58CC5B29,0xF75B8850, + 0x40080000,0x00000000, 252, 0x58E5445F,0x7984A63C, + 0x40080000,0x00000000, 253, 0x58FFE68F,0x3646F95A, + 0x40080000,0x00000000, 254, 0x5917ECEB,0x68B53B04, + 0x40080000,0x00000000, 255, 0x5931F1B0,0x8E87EC43, + 0x40080000,0x00000000, 256, 0x594AEA88,0xD5CBE264, + 0x40080000,0x00000000, 257, 0x59642FE6,0xA058E9CB, + 0x40080000,0x00000000, 258, 0x597E47D9,0xF0855EB1, + 0x40080000,0x00000000, 259, 0x5996B5E3,0x74640705, + 0x40080000,0x00000000, 260, 0x59B1086A,0x974B0543, + 0x40080000,0x00000000, 261, 0x59C98C9F,0xE2F087E5, + 0x40080000,0x00000000, 262, 0x59E32977,0xEA3465EC, + 0x40080000,0x00000000, 263, 0x59FCBE33,0xDF4E98E2, + 0x40080000,0x00000000, 264, 0x5A158EA6,0xE77AF2A9, + 0x40080000,0x00000000, 265, 0x5A302AFD,0x2D9C35FF, + 0x40080000,0x00000000, 266, 0x5A48407B,0xC46A50FE, + 0x40080000,0x00000000, 267, 0x5A62305C,0xD34FBCBF, + 0x40080000,0x00000000, 268, 0x5A7B488B,0x3CF79B1E, + 0x40080000,0x00000000, 269, 0x5A947668,0x6DB9B457, + 0x40080000,0x00000000, 270, 0x5AAEB19C,0xA4968E82, + 0x40080000,0x00000000, 271, 0x5AC70535,0x7B70EAE2, + 0x40080000,0x00000000, 272, 0x5AE143E8,0x1C94B029, + 0x40080000,0x00000000, 273, 0x5AF9E5DC,0x2ADF083E, + 0x40080000,0x00000000, 274, 0x5B136C65,0x2027462E, + 0x40080000,0x00000000, 275, 0x5B2D2297,0xB03AE945, + 0x40080000,0x00000000, 276, 0x5B45D9F1,0xC42C2EF4, + 0x40080000,0x00000000, 277, 0x5B606375,0x53212337, + 0x40080000,0x00000000, 278, 0x5B78952F,0xFCB1B4D3, + 0x40080000,0x00000000, 279, 0x5B926FE3,0xFD85479E, + 0x40080000,0x00000000, 280, 0x5BABA7D5,0xFC47EB6D, + 0x40080000,0x00000000, 281, 0x5BC4BDE0,0x7D35F092, + 0x40080000,0x00000000, 282, 0x5BDF1CD0,0xBBD0E8DB, + 0x40080000,0x00000000, 283, 0x5BF7559C,0x8CDCAEA4, + 0x40080000,0x00000000, 284, 0x5C118035,0x69A582FB, + 0x40080000,0x00000000, 285, 0x5C2A4050,0x1E784478, + 0x40080000,0x00000000, 286, 0x5C43B03C,0x16DA335A, + 0x40080000,0x00000000, 287, 0x5C5D885A,0x22474D07, + 0x40080000,0x00000000, 288, 0x5C762643,0x99B579C6, + 0x40080000,0x00000000, 289, 0x5C909CB2,0xB3481B54, + 0x40080000,0x00000000, 290, 0x5CA8EB0C,0x0CEC28FE, + 0x40080000,0x00000000, 291, 0x5CC2B049,0x09B11EBF, + 0x40080000,0x00000000, 292, 0x5CDC086D,0x8E89AE1E, + 0x40080000,0x00000000, 293, 0x5CF50652,0x2AE74297, + 0x40080000,0x00000000, 294, 0x5D0F897B,0x405AE3E2, + 0x40080000,0x00000000, 295, 0x5D27A71C,0x70442AE9, + 0x40080000,0x00000000, 296, 0x5D41BD55,0x5433202F, + 0x40080000,0x00000000, 297, 0x5D5A9BFF,0xFE4CB047, + 0x40080000,0x00000000, 298, 0x5D73F4FF,0xFEB98435, + 0x40080000,0x00000000, 299, 0x5D8DEF7F,0xFE16464F, + 0x40080000,0x00000000, 300, 0x5DA6739F,0xFE90B4BB, + 0x40100000,0x00000000, 2, 0x40300000,0x00000000, + 0x40100000,0x00000000, 3, 0x40500000,0x00000000, + 0x40100000,0x00000000, 4, 0x40700000,0x00000000, + 0x40100000,0x00000000, 5, 0x40900000,0x00000000, + 0x40100000,0x00000000, 6, 0x40B00000,0x00000000, + 0x40100000,0x00000000, 7, 0x40D00000,0x00000000, + 0x40100000,0x00000000, 8, 0x40F00000,0x00000000, + 0x40100000,0x00000000, 9, 0x41100000,0x00000000, + 0x40100000,0x00000000, 10, 0x41300000,0x00000000, + 0x40100000,0x00000000, 11, 0x41500000,0x00000000, + 0x40100000,0x00000000, 12, 0x41700000,0x00000000, + 0x40100000,0x00000000, 13, 0x41900000,0x00000000, + 0x40100000,0x00000000, 14, 0x41B00000,0x00000000, + 0x40100000,0x00000000, 15, 0x41D00000,0x00000000, + 0x40100000,0x00000000, 16, 0x41F00000,0x00000000, + 0x40100000,0x00000000, 17, 0x42100000,0x00000000, + 0x40100000,0x00000000, 18, 0x42300000,0x00000000, + 0x40100000,0x00000000, 19, 0x42500000,0x00000000, + 0x40100000,0x00000000, 20, 0x42700000,0x00000000, + 0x40100000,0x00000000, 21, 0x42900000,0x00000000, + 0x40100000,0x00000000, 22, 0x42B00000,0x00000000, + 0x40100000,0x00000000, 23, 0x42D00000,0x00000000, + 0x40100000,0x00000000, 24, 0x42F00000,0x00000000, + 0x40100000,0x00000000, 25, 0x43100000,0x00000000, + 0x40100000,0x00000000, 26, 0x43300000,0x00000000, + 0x40100000,0x00000000, 27, 0x43500000,0x00000000, + 0x40100000,0x00000000, 28, 0x43700000,0x00000000, + 0x40100000,0x00000000, 29, 0x43900000,0x00000000, + 0x40100000,0x00000000, 30, 0x43B00000,0x00000000, + 0x40100000,0x00000000, 31, 0x43D00000,0x00000000, + 0x40100000,0x00000000, 32, 0x43F00000,0x00000000, + 0x40100000,0x00000000, 33, 0x44100000,0x00000000, + 0x40100000,0x00000000, 34, 0x44300000,0x00000000, + 0x40100000,0x00000000, 35, 0x44500000,0x00000000, + 0x40100000,0x00000000, 36, 0x44700000,0x00000000, + 0x40100000,0x00000000, 37, 0x44900000,0x00000000, + 0x40100000,0x00000000, 38, 0x44B00000,0x00000000, + 0x40100000,0x00000000, 39, 0x44D00000,0x00000000, + 0x40100000,0x00000000, 40, 0x44F00000,0x00000000, + 0x40100000,0x00000000, 41, 0x45100000,0x00000000, + 0x40100000,0x00000000, 42, 0x45300000,0x00000000, + 0x40100000,0x00000000, 43, 0x45500000,0x00000000, + 0x40100000,0x00000000, 44, 0x45700000,0x00000000, + 0x40100000,0x00000000, 45, 0x45900000,0x00000000, + 0x40100000,0x00000000, 46, 0x45B00000,0x00000000, + 0x40100000,0x00000000, 47, 0x45D00000,0x00000000, + 0x40100000,0x00000000, 48, 0x45F00000,0x00000000, + 0x40100000,0x00000000, 49, 0x46100000,0x00000000, + 0x40100000,0x00000000, 50, 0x46300000,0x00000000, + 0x40100000,0x00000000, 51, 0x46500000,0x00000000, + 0x40100000,0x00000000, 52, 0x46700000,0x00000000, + 0x40100000,0x00000000, 53, 0x46900000,0x00000000, + 0x40100000,0x00000000, 54, 0x46B00000,0x00000000, + 0x40100000,0x00000000, 55, 0x46D00000,0x00000000, + 0x40100000,0x00000000, 56, 0x46F00000,0x00000000, + 0x40100000,0x00000000, 57, 0x47100000,0x00000000, + 0x40100000,0x00000000, 58, 0x47300000,0x00000000, + 0x40100000,0x00000000, 59, 0x47500000,0x00000000, + 0x40100000,0x00000000, 60, 0x47700000,0x00000000, + 0x40100000,0x00000000, 61, 0x47900000,0x00000000, + 0x40100000,0x00000000, 62, 0x47B00000,0x00000000, + 0x40100000,0x00000000, 63, 0x47D00000,0x00000000, + 0x40100000,0x00000000, 64, 0x47F00000,0x00000000, + 0x40100000,0x00000000, 65, 0x48100000,0x00000000, + 0x40100000,0x00000000, 66, 0x48300000,0x00000000, + 0x40100000,0x00000000, 67, 0x48500000,0x00000000, + 0x40100000,0x00000000, 68, 0x48700000,0x00000000, + 0x40100000,0x00000000, 69, 0x48900000,0x00000000, + 0x40100000,0x00000000, 70, 0x48B00000,0x00000000, + 0x40100000,0x00000000, 71, 0x48D00000,0x00000000, + 0x40100000,0x00000000, 72, 0x48F00000,0x00000000, + 0x40100000,0x00000000, 73, 0x49100000,0x00000000, + 0x40100000,0x00000000, 74, 0x49300000,0x00000000, + 0x40100000,0x00000000, 75, 0x49500000,0x00000000, + 0x40100000,0x00000000, 76, 0x49700000,0x00000000, + 0x40100000,0x00000000, 77, 0x49900000,0x00000000, + 0x40100000,0x00000000, 78, 0x49B00000,0x00000000, + 0x40100000,0x00000000, 79, 0x49D00000,0x00000000, + 0x40100000,0x00000000, 80, 0x49F00000,0x00000000, + 0x40100000,0x00000000, 81, 0x4A100000,0x00000000, + 0x40100000,0x00000000, 82, 0x4A300000,0x00000000, + 0x40100000,0x00000000, 83, 0x4A500000,0x00000000, + 0x40100000,0x00000000, 84, 0x4A700000,0x00000000, + 0x40100000,0x00000000, 85, 0x4A900000,0x00000000, + 0x40100000,0x00000000, 86, 0x4AB00000,0x00000000, + 0x40100000,0x00000000, 87, 0x4AD00000,0x00000000, + 0x40100000,0x00000000, 88, 0x4AF00000,0x00000000, + 0x40100000,0x00000000, 89, 0x4B100000,0x00000000, + 0x40100000,0x00000000, 90, 0x4B300000,0x00000000, + 0x40100000,0x00000000, 91, 0x4B500000,0x00000000, + 0x40100000,0x00000000, 92, 0x4B700000,0x00000000, + 0x40100000,0x00000000, 93, 0x4B900000,0x00000000, + 0x40100000,0x00000000, 94, 0x4BB00000,0x00000000, + 0x40100000,0x00000000, 95, 0x4BD00000,0x00000000, + 0x40100000,0x00000000, 96, 0x4BF00000,0x00000000, + 0x40100000,0x00000000, 97, 0x4C100000,0x00000000, + 0x40100000,0x00000000, 98, 0x4C300000,0x00000000, + 0x40100000,0x00000000, 99, 0x4C500000,0x00000000, + 0x40100000,0x00000000, 100, 0x4C700000,0x00000000, + 0x40100000,0x00000000, 101, 0x4C900000,0x00000000, + 0x40100000,0x00000000, 102, 0x4CB00000,0x00000000, + 0x40100000,0x00000000, 103, 0x4CD00000,0x00000000, + 0x40100000,0x00000000, 104, 0x4CF00000,0x00000000, + 0x40100000,0x00000000, 105, 0x4D100000,0x00000000, + 0x40100000,0x00000000, 106, 0x4D300000,0x00000000, + 0x40100000,0x00000000, 107, 0x4D500000,0x00000000, + 0x40100000,0x00000000, 108, 0x4D700000,0x00000000, + 0x40100000,0x00000000, 109, 0x4D900000,0x00000000, + 0x40100000,0x00000000, 110, 0x4DB00000,0x00000000, + 0x40100000,0x00000000, 111, 0x4DD00000,0x00000000, + 0x40100000,0x00000000, 112, 0x4DF00000,0x00000000, + 0x40100000,0x00000000, 113, 0x4E100000,0x00000000, + 0x40100000,0x00000000, 114, 0x4E300000,0x00000000, + 0x40100000,0x00000000, 115, 0x4E500000,0x00000000, + 0x40100000,0x00000000, 116, 0x4E700000,0x00000000, + 0x40100000,0x00000000, 117, 0x4E900000,0x00000000, + 0x40100000,0x00000000, 118, 0x4EB00000,0x00000000, + 0x40100000,0x00000000, 119, 0x4ED00000,0x00000000, + 0x40100000,0x00000000, 120, 0x4EF00000,0x00000000, + 0x40100000,0x00000000, 121, 0x4F100000,0x00000000, + 0x40100000,0x00000000, 122, 0x4F300000,0x00000000, + 0x40100000,0x00000000, 123, 0x4F500000,0x00000000, + 0x40100000,0x00000000, 124, 0x4F700000,0x00000000, + 0x40100000,0x00000000, 125, 0x4F900000,0x00000000, + 0x40100000,0x00000000, 126, 0x4FB00000,0x00000000, + 0x40100000,0x00000000, 127, 0x4FD00000,0x00000000, + 0x40100000,0x00000000, 128, 0x4FF00000,0x00000000, + 0x40100000,0x00000000, 129, 0x50100000,0x00000000, + 0x40100000,0x00000000, 130, 0x50300000,0x00000000, + 0x40100000,0x00000000, 131, 0x50500000,0x00000000, + 0x40100000,0x00000000, 132, 0x50700000,0x00000000, + 0x40100000,0x00000000, 133, 0x50900000,0x00000000, + 0x40100000,0x00000000, 134, 0x50B00000,0x00000000, + 0x40100000,0x00000000, 135, 0x50D00000,0x00000000, + 0x40100000,0x00000000, 136, 0x50F00000,0x00000000, + 0x40100000,0x00000000, 137, 0x51100000,0x00000000, + 0x40100000,0x00000000, 138, 0x51300000,0x00000000, + 0x40100000,0x00000000, 139, 0x51500000,0x00000000, + 0x40100000,0x00000000, 140, 0x51700000,0x00000000, + 0x40100000,0x00000000, 141, 0x51900000,0x00000000, + 0x40100000,0x00000000, 142, 0x51B00000,0x00000000, + 0x40100000,0x00000000, 143, 0x51D00000,0x00000000, + 0x40100000,0x00000000, 144, 0x51F00000,0x00000000, + 0x40100000,0x00000000, 145, 0x52100000,0x00000000, + 0x40100000,0x00000000, 146, 0x52300000,0x00000000, + 0x40100000,0x00000000, 147, 0x52500000,0x00000000, + 0x40100000,0x00000000, 148, 0x52700000,0x00000000, + 0x40100000,0x00000000, 149, 0x52900000,0x00000000, + 0x40100000,0x00000000, 150, 0x52B00000,0x00000000, + 0x40100000,0x00000000, 151, 0x52D00000,0x00000000, + 0x40100000,0x00000000, 152, 0x52F00000,0x00000000, + 0x40100000,0x00000000, 153, 0x53100000,0x00000000, + 0x40100000,0x00000000, 154, 0x53300000,0x00000000, + 0x40100000,0x00000000, 155, 0x53500000,0x00000000, + 0x40100000,0x00000000, 156, 0x53700000,0x00000000, + 0x40100000,0x00000000, 157, 0x53900000,0x00000000, + 0x40100000,0x00000000, 158, 0x53B00000,0x00000000, + 0x40100000,0x00000000, 159, 0x53D00000,0x00000000, + 0x40100000,0x00000000, 160, 0x53F00000,0x00000000, + 0x40100000,0x00000000, 161, 0x54100000,0x00000000, + 0x40100000,0x00000000, 162, 0x54300000,0x00000000, + 0x40100000,0x00000000, 163, 0x54500000,0x00000000, + 0x40100000,0x00000000, 164, 0x54700000,0x00000000, + 0x40100000,0x00000000, 165, 0x54900000,0x00000000, + 0x40100000,0x00000000, 166, 0x54B00000,0x00000000, + 0x40100000,0x00000000, 167, 0x54D00000,0x00000000, + 0x40100000,0x00000000, 168, 0x54F00000,0x00000000, + 0x40100000,0x00000000, 169, 0x55100000,0x00000000, + 0x40100000,0x00000000, 170, 0x55300000,0x00000000, + 0x40100000,0x00000000, 171, 0x55500000,0x00000000, + 0x40100000,0x00000000, 172, 0x55700000,0x00000000, + 0x40100000,0x00000000, 173, 0x55900000,0x00000000, + 0x40100000,0x00000000, 174, 0x55B00000,0x00000000, + 0x40100000,0x00000000, 175, 0x55D00000,0x00000000, + 0x40100000,0x00000000, 176, 0x55F00000,0x00000000, + 0x40100000,0x00000000, 177, 0x56100000,0x00000000, + 0x40100000,0x00000000, 178, 0x56300000,0x00000000, + 0x40100000,0x00000000, 179, 0x56500000,0x00000000, + 0x40100000,0x00000000, 180, 0x56700000,0x00000000, + 0x40100000,0x00000000, 181, 0x56900000,0x00000000, + 0x40100000,0x00000000, 182, 0x56B00000,0x00000000, + 0x40100000,0x00000000, 183, 0x56D00000,0x00000000, + 0x40100000,0x00000000, 184, 0x56F00000,0x00000000, + 0x40100000,0x00000000, 185, 0x57100000,0x00000000, + 0x40100000,0x00000000, 186, 0x57300000,0x00000000, + 0x40100000,0x00000000, 187, 0x57500000,0x00000000, + 0x40100000,0x00000000, 188, 0x57700000,0x00000000, + 0x40100000,0x00000000, 189, 0x57900000,0x00000000, + 0x40100000,0x00000000, 190, 0x57B00000,0x00000000, + 0x40100000,0x00000000, 191, 0x57D00000,0x00000000, + 0x40100000,0x00000000, 192, 0x57F00000,0x00000000, + 0x40100000,0x00000000, 193, 0x58100000,0x00000000, + 0x40100000,0x00000000, 194, 0x58300000,0x00000000, + 0x40100000,0x00000000, 195, 0x58500000,0x00000000, + 0x40100000,0x00000000, 196, 0x58700000,0x00000000, + 0x40100000,0x00000000, 197, 0x58900000,0x00000000, + 0x40100000,0x00000000, 198, 0x58B00000,0x00000000, + 0x40100000,0x00000000, 199, 0x58D00000,0x00000000, + 0x40100000,0x00000000, 200, 0x58F00000,0x00000000, + 0x40100000,0x00000000, 201, 0x59100000,0x00000000, + 0x40100000,0x00000000, 202, 0x59300000,0x00000000, + 0x40100000,0x00000000, 203, 0x59500000,0x00000000, + 0x40100000,0x00000000, 204, 0x59700000,0x00000000, + 0x40100000,0x00000000, 205, 0x59900000,0x00000000, + 0x40100000,0x00000000, 206, 0x59B00000,0x00000000, + 0x40100000,0x00000000, 207, 0x59D00000,0x00000000, + 0x40100000,0x00000000, 208, 0x59F00000,0x00000000, + 0x40100000,0x00000000, 209, 0x5A100000,0x00000000, + 0x40100000,0x00000000, 210, 0x5A300000,0x00000000, + 0x40100000,0x00000000, 211, 0x5A500000,0x00000000, + 0x40100000,0x00000000, 212, 0x5A700000,0x00000000, + 0x40100000,0x00000000, 213, 0x5A900000,0x00000000, + 0x40100000,0x00000000, 214, 0x5AB00000,0x00000000, + 0x40100000,0x00000000, 215, 0x5AD00000,0x00000000, + 0x40100000,0x00000000, 216, 0x5AF00000,0x00000000, + 0x40100000,0x00000000, 217, 0x5B100000,0x00000000, + 0x40100000,0x00000000, 218, 0x5B300000,0x00000000, + 0x40100000,0x00000000, 219, 0x5B500000,0x00000000, + 0x40100000,0x00000000, 220, 0x5B700000,0x00000000, + 0x40100000,0x00000000, 221, 0x5B900000,0x00000000, + 0x40100000,0x00000000, 222, 0x5BB00000,0x00000000, + 0x40100000,0x00000000, 223, 0x5BD00000,0x00000000, + 0x40100000,0x00000000, 224, 0x5BF00000,0x00000000, + 0x40100000,0x00000000, 225, 0x5C100000,0x00000000, + 0x40100000,0x00000000, 226, 0x5C300000,0x00000000, + 0x40100000,0x00000000, 227, 0x5C500000,0x00000000, + 0x40100000,0x00000000, 228, 0x5C700000,0x00000000, + 0x40100000,0x00000000, 229, 0x5C900000,0x00000000, + 0x40100000,0x00000000, 230, 0x5CB00000,0x00000000, + 0x40100000,0x00000000, 231, 0x5CD00000,0x00000000, + 0x40100000,0x00000000, 232, 0x5CF00000,0x00000000, + 0x40100000,0x00000000, 233, 0x5D100000,0x00000000, + 0x40100000,0x00000000, 234, 0x5D300000,0x00000000, + 0x40100000,0x00000000, 235, 0x5D500000,0x00000000, + 0x40100000,0x00000000, 236, 0x5D700000,0x00000000, + 0x40100000,0x00000000, 237, 0x5D900000,0x00000000, + 0x40100000,0x00000000, 238, 0x5DB00000,0x00000000, + 0x40100000,0x00000000, 239, 0x5DD00000,0x00000000, + 0x40100000,0x00000000, 240, 0x5DF00000,0x00000000, + 0x40100000,0x00000000, 241, 0x5E100000,0x00000000, + 0x40100000,0x00000000, 242, 0x5E300000,0x00000000, + 0x40100000,0x00000000, 243, 0x5E500000,0x00000000, + 0x40100000,0x00000000, 244, 0x5E700000,0x00000000, + 0x40100000,0x00000000, 245, 0x5E900000,0x00000000, + 0x40100000,0x00000000, 246, 0x5EB00000,0x00000000, + 0x40100000,0x00000000, 247, 0x5ED00000,0x00000000, + 0x40100000,0x00000000, 248, 0x5EF00000,0x00000000, + 0x40100000,0x00000000, 249, 0x5F100000,0x00000000, + 0x40100000,0x00000000, 250, 0x5F300000,0x00000000, + 0x40100000,0x00000000, 251, 0x5F500000,0x00000000, + 0x40100000,0x00000000, 252, 0x5F700000,0x00000000, + 0x40100000,0x00000000, 253, 0x5F900000,0x00000000, + 0x40100000,0x00000000, 254, 0x5FB00000,0x00000000, + 0x40100000,0x00000000, 255, 0x5FD00000,0x00000000, + 0x40100000,0x00000000, 256, 0x5FF00000,0x00000000, + 0x40100000,0x00000000, 257, 0x60100000,0x00000000, + 0x40100000,0x00000000, 258, 0x60300000,0x00000000, + 0x40100000,0x00000000, 259, 0x60500000,0x00000000, + 0x40100000,0x00000000, 260, 0x60700000,0x00000000, + 0x40100000,0x00000000, 261, 0x60900000,0x00000000, + 0x40100000,0x00000000, 262, 0x60B00000,0x00000000, + 0x40100000,0x00000000, 263, 0x60D00000,0x00000000, + 0x40100000,0x00000000, 264, 0x60F00000,0x00000000, + 0x40100000,0x00000000, 265, 0x61100000,0x00000000, + 0x40100000,0x00000000, 266, 0x61300000,0x00000000, + 0x40100000,0x00000000, 267, 0x61500000,0x00000000, + 0x40100000,0x00000000, 268, 0x61700000,0x00000000, + 0x40100000,0x00000000, 269, 0x61900000,0x00000000, + 0x40100000,0x00000000, 270, 0x61B00000,0x00000000, + 0x40100000,0x00000000, 271, 0x61D00000,0x00000000, + 0x40100000,0x00000000, 272, 0x61F00000,0x00000000, + 0x40100000,0x00000000, 273, 0x62100000,0x00000000, + 0x40100000,0x00000000, 274, 0x62300000,0x00000000, + 0x40100000,0x00000000, 275, 0x62500000,0x00000000, + 0x40100000,0x00000000, 276, 0x62700000,0x00000000, + 0x40100000,0x00000000, 277, 0x62900000,0x00000000, + 0x40100000,0x00000000, 278, 0x62B00000,0x00000000, + 0x40100000,0x00000000, 279, 0x62D00000,0x00000000, + 0x40100000,0x00000000, 280, 0x62F00000,0x00000000, + 0x40100000,0x00000000, 281, 0x63100000,0x00000000, + 0x40100000,0x00000000, 282, 0x63300000,0x00000000, + 0x40100000,0x00000000, 283, 0x63500000,0x00000000, + 0x40100000,0x00000000, 284, 0x63700000,0x00000000, + 0x40100000,0x00000000, 285, 0x63900000,0x00000000, + 0x40100000,0x00000000, 286, 0x63B00000,0x00000000, + 0x40100000,0x00000000, 287, 0x63D00000,0x00000000, + 0x40100000,0x00000000, 288, 0x63F00000,0x00000000, + 0x40100000,0x00000000, 289, 0x64100000,0x00000000, + 0x40100000,0x00000000, 290, 0x64300000,0x00000000, + 0x40100000,0x00000000, 291, 0x64500000,0x00000000, + 0x40100000,0x00000000, 292, 0x64700000,0x00000000, + 0x40100000,0x00000000, 293, 0x64900000,0x00000000, + 0x40100000,0x00000000, 294, 0x64B00000,0x00000000, + 0x40100000,0x00000000, 295, 0x64D00000,0x00000000, + 0x40100000,0x00000000, 296, 0x64F00000,0x00000000, + 0x40100000,0x00000000, 297, 0x65100000,0x00000000, + 0x40100000,0x00000000, 298, 0x65300000,0x00000000, + 0x40100000,0x00000000, 299, 0x65500000,0x00000000, + 0x40100000,0x00000000, 300, 0x65700000,0x00000000, + 0x40140000,0x00000000, 2, 0x40390000,0x00000000, + 0x40140000,0x00000000, 3, 0x405F4000,0x00000000, + 0x40140000,0x00000000, 4, 0x40838800,0x00000000, + 0x40140000,0x00000000, 5, 0x40A86A00,0x00000000, + 0x40140000,0x00000000, 6, 0x40CE8480,0x00000000, + 0x40140000,0x00000000, 7, 0x40F312D0,0x00000000, + 0x40140000,0x00000000, 8, 0x4117D784,0x00000000, + 0x40140000,0x00000000, 9, 0x413DCD65,0x00000000, + 0x40140000,0x00000000, 10, 0x4162A05F,0x20000000, + 0x40140000,0x00000000, 11, 0x41874876,0xE8000000, + 0x40140000,0x00000000, 12, 0x41AD1A94,0xA2000000, + 0x40140000,0x00000000, 13, 0x41D2309C,0xE5400000, + 0x40140000,0x00000000, 14, 0x41F6BCC4,0x1E900000, + 0x40140000,0x00000000, 15, 0x421C6BF5,0x26340000, + 0x40140000,0x00000000, 16, 0x4241C379,0x37E08000, + 0x40140000,0x00000000, 17, 0x42663457,0x85D8A000, + 0x40140000,0x00000000, 18, 0x428BC16D,0x674EC800, + 0x40140000,0x00000000, 19, 0x42B158E4,0x60913D00, + 0x40140000,0x00000000, 20, 0x42D5AF1D,0x78B58C40, + 0x40140000,0x00000000, 21, 0x42FB1AE4,0xD6E2EF50, + 0x40140000,0x00000000, 22, 0x4320F0CF,0x064DD592, + 0x40140000,0x00000000, 23, 0x43452D02,0xC7E14AF6, + 0x40140000,0x00000000, 24, 0x436A7843,0x79D99DB4, + 0x40140000,0x00000000, 25, 0x43908B2A,0x2C280291, + 0x40140000,0x00000000, 26, 0x43B4ADF4,0xB7320335, + 0x40140000,0x00000000, 27, 0x43D9D971,0xE4FE8402, + 0x40140000,0x00000000, 28, 0x440027E7,0x2F1F1281, + 0x40140000,0x00000000, 29, 0x442431E0,0xFAE6D721, + 0x40140000,0x00000000, 30, 0x44493E59,0x39A08CEA, + 0x40140000,0x00000000, 31, 0x446F8DEF,0x8808B024, + 0x40140000,0x00000000, 32, 0x4493B8B5,0xB5056E17, + 0x40140000,0x00000000, 33, 0x44B8A6E3,0x2246C99C, + 0x40140000,0x00000000, 34, 0x44DED09B,0xEAD87C03, + 0x40140000,0x00000000, 35, 0x45034261,0x72C74D82, + 0x40140000,0x00000000, 36, 0x452812F9,0xCF7920E3, + 0x40140000,0x00000000, 37, 0x454E17B8,0x4357691B, + 0x40140000,0x00000000, 38, 0x4572CED3,0x2A16A1B1, + 0x40140000,0x00000000, 39, 0x45978287,0xF49C4A1D, + 0x40140000,0x00000000, 40, 0x45BD6329,0xF1C35CA5, + 0x40140000,0x00000000, 41, 0x45E25DFA,0x371A19E7, + 0x40140000,0x00000000, 42, 0x4606F578,0xC4E0A061, + 0x40140000,0x00000000, 43, 0x462CB2D6,0xF618C879, + 0x40140000,0x00000000, 44, 0x4651EFC6,0x59CF7D4C, + 0x40140000,0x00000000, 45, 0x46766BB7,0xF0435C9E, + 0x40140000,0x00000000, 46, 0x469C06A5,0xEC5433C6, + 0x40140000,0x00000000, 47, 0x46C18427,0xB3B4A05C, + 0x40140000,0x00000000, 48, 0x46E5E531,0xA0A1C873, + 0x40140000,0x00000000, 49, 0x470B5E7E,0x08CA3A8F, + 0x40140000,0x00000000, 50, 0x47311B0E,0xC57E649A, + 0x40140000,0x00000000, 51, 0x475561D2,0x76DDFDC0, + 0x40140000,0x00000000, 52, 0x477ABA47,0x14957D30, + 0x40140000,0x00000000, 53, 0x47A0B46C,0x6CDD6E3E, + 0x40140000,0x00000000, 54, 0x47C4E187,0x8814C9CE, + 0x40140000,0x00000000, 55, 0x47EA19E9,0x6A19FC41, + 0x40140000,0x00000000, 56, 0x48105031,0xE2503DA9, + 0x40140000,0x00000000, 57, 0x4834643E,0x5AE44D13, + 0x40140000,0x00000000, 58, 0x48597D4D,0xF19D6057, + 0x40140000,0x00000000, 59, 0x487FDCA1,0x6E04B86D, + 0x40140000,0x00000000, 60, 0x48A3E9E4,0xE4C2F344, + 0x40140000,0x00000000, 61, 0x48C8E45E,0x1DF3B015, + 0x40140000,0x00000000, 62, 0x48EF1D75,0xA5709C1B, + 0x40140000,0x00000000, 63, 0x49137269,0x87666191, + 0x40140000,0x00000000, 64, 0x49384F03,0xE93FF9F5, + 0x40140000,0x00000000, 65, 0x495E62C4,0xE38FF872, + 0x40140000,0x00000000, 66, 0x4982FDBB,0x0E39FB47, + 0x40140000,0x00000000, 67, 0x49A7BD29,0xD1C87A19, + 0x40140000,0x00000000, 68, 0x49CDAC74,0x463A989F, + 0x40140000,0x00000000, 69, 0x49F28BC8,0xABE49F64, + 0x40140000,0x00000000, 70, 0x4A172EBA,0xD6DDC73D, + 0x40140000,0x00000000, 71, 0x4A3CFA69,0x8C95390C, + 0x40140000,0x00000000, 72, 0x4A621C81,0xF7DD43A7, + 0x40140000,0x00000000, 73, 0x4A86A3A2,0x75D49491, + 0x40140000,0x00000000, 74, 0x4AAC4C8B,0x1349B9B5, + 0x40140000,0x00000000, 75, 0x4AD1AFD6,0xEC0E1411, + 0x40140000,0x00000000, 76, 0x4AF61BCC,0xA7119916, + 0x40140000,0x00000000, 77, 0x4B1BA2BF,0xD0D5FF5B, + 0x40140000,0x00000000, 78, 0x4B4145B7,0xE285BF99, + 0x40140000,0x00000000, 79, 0x4B659725,0xDB272F7F, + 0x40140000,0x00000000, 80, 0x4B8AFCEF,0x51F0FB5F, + 0x40140000,0x00000000, 81, 0x4BB0DE15,0x93369D1B, + 0x40140000,0x00000000, 82, 0x4BD5159A,0xF8044462, + 0x40140000,0x00000000, 83, 0x4BFA5B01,0xB605557B, + 0x40140000,0x00000000, 84, 0x4C2078E1,0x11C3556D, + 0x40140000,0x00000000, 85, 0x4C449719,0x56342AC8, + 0x40140000,0x00000000, 86, 0x4C69BCDF,0xABC1357A, + 0x40140000,0x00000000, 87, 0x4C90160B,0xCB58C16C, + 0x40140000,0x00000000, 88, 0x4CB41B8E,0xBE2EF1C7, + 0x40140000,0x00000000, 89, 0x4CD92272,0x6DBAAE39, + 0x40140000,0x00000000, 90, 0x4CFF6B0F,0x092959C7, + 0x40140000,0x00000000, 91, 0x4D23A2E9,0x65B9D81D, + 0x40140000,0x00000000, 92, 0x4D488BA3,0xBF284E24, + 0x40140000,0x00000000, 93, 0x4D6EAE8C,0xAEF261AD, + 0x40140000,0x00000000, 94, 0x4D932D17,0xED577D0C, + 0x40140000,0x00000000, 95, 0x4DB7F85D,0xE8AD5C4F, + 0x40140000,0x00000000, 96, 0x4DDDF675,0x62D8B363, + 0x40140000,0x00000000, 97, 0x4E02BA09,0x5DC7701E, + 0x40140000,0x00000000, 98, 0x4E27688B,0xB5394C25, + 0x40140000,0x00000000, 99, 0x4E4D42AE,0xA2879F2E, + 0x40140000,0x00000000, 100, 0x4E7249AD,0x2594C37D, + 0x40140000,0x00000000, 101, 0x4E96DC18,0x6EF9F45C, + 0x40140000,0x00000000, 102, 0x4EBC931E,0x8AB87173, + 0x40140000,0x00000000, 103, 0x4EE1DBF3,0x16B346E8, + 0x40140000,0x00000000, 104, 0x4F0652EF,0xDC6018A2, + 0x40140000,0x00000000, 105, 0x4F2BE7AB,0xD3781ECA, + 0x40140000,0x00000000, 106, 0x4F5170CB,0x642B133F, + 0x40140000,0x00000000, 107, 0x4F75CCFE,0x3D35D80E, + 0x40140000,0x00000000, 108, 0x4F9B403D,0xCC834E12, + 0x40140000,0x00000000, 109, 0x4FC10826,0x9FD210CB, + 0x40140000,0x00000000, 110, 0x4FE54A30,0x47C694FE, + 0x40140000,0x00000000, 111, 0x500A9CBC,0x59B83A3D, + 0x40140000,0x00000000, 112, 0x5030A1F5,0xB8132466, + 0x40140000,0x00000000, 113, 0x5054CA73,0x2617ED80, + 0x40140000,0x00000000, 114, 0x5079FD0F,0xEF9DE8E0, + 0x40140000,0x00000000, 115, 0x50A03E29,0xF5C2B18C, + 0x40140000,0x00000000, 116, 0x50C44DB4,0x73335DEF, + 0x40140000,0x00000000, 117, 0x50E96121,0x9000356B, + 0x40140000,0x00000000, 118, 0x510FB969,0xF40042C5, + 0x40140000,0x00000000, 119, 0x5133D3E2,0x388029BB, + 0x40140000,0x00000000, 120, 0x5158C8DA,0xC6A0342A, + 0x40140000,0x00000000, 121, 0x517EFB11,0x78484135, + 0x40140000,0x00000000, 122, 0x51A35CEA,0xEB2D28C1, + 0x40140000,0x00000000, 123, 0x51C83425,0xA5F872F1, + 0x40140000,0x00000000, 124, 0x51EE412F,0x0F768FAD, + 0x40140000,0x00000000, 125, 0x5212E8BD,0x69AA19CC, + 0x40140000,0x00000000, 126, 0x5237A2EC,0xC414A03F, + 0x40140000,0x00000000, 127, 0x525D8BA7,0xF519C84F, + 0x40140000,0x00000000, 128, 0x52827748,0xF9301D32, + 0x40140000,0x00000000, 129, 0x52A7151B,0x377C247E, + 0x40140000,0x00000000, 130, 0x52CCDA62,0x055B2D9E, + 0x40140000,0x00000000, 131, 0x52F2087D,0x4358FC82, + 0x40140000,0x00000000, 132, 0x53168A9C,0x942F3BA3, + 0x40140000,0x00000000, 133, 0x533C2D43,0xB93B0A8C, + 0x40140000,0x00000000, 134, 0x53619C4A,0x53C4E697, + 0x40140000,0x00000000, 135, 0x5386035C,0xE8B6203D, + 0x40140000,0x00000000, 136, 0x53AB8434,0x22E3A84D, + 0x40140000,0x00000000, 137, 0x53D132A0,0x95CE4930, + 0x40140000,0x00000000, 138, 0x53F57F48,0xBB41DB7C, + 0x40140000,0x00000000, 139, 0x541ADF1A,0xEA12525B, + 0x40140000,0x00000000, 140, 0x5440CB70,0xD24B7379, + 0x40140000,0x00000000, 141, 0x5464FE4D,0x06DE5057, + 0x40140000,0x00000000, 142, 0x548A3DE0,0x4895E46D, + 0x40140000,0x00000000, 143, 0x54B066AC,0x2D5DAEC4, + 0x40140000,0x00000000, 144, 0x54D48057,0x38B51A75, + 0x40140000,0x00000000, 145, 0x54F9A06D,0x06E26112, + 0x40140000,0x00000000, 146, 0x55200444,0x244D7CAB, + 0x40140000,0x00000000, 147, 0x55440555,0x2D60DBD6, + 0x40140000,0x00000000, 148, 0x556906AA,0x78B912CC, + 0x40140000,0x00000000, 149, 0x558F4855,0x16E7577F, + 0x40140000,0x00000000, 150, 0x55B38D35,0x2E5096AF, + 0x40140000,0x00000000, 151, 0x55D87082,0x79E4BC5B, + 0x40140000,0x00000000, 152, 0x55FE8CA3,0x185DEB72, + 0x40140000,0x00000000, 153, 0x562317E5,0xEF3AB327, + 0x40140000,0x00000000, 154, 0x5647DDDF,0x6B095FF1, + 0x40140000,0x00000000, 155, 0x566DD557,0x45CBB7ED, + 0x40140000,0x00000000, 156, 0x5692A556,0x8B9F52F4, + 0x40140000,0x00000000, 157, 0x56B74EAC,0x2E8727B1, + 0x40140000,0x00000000, 158, 0x56DD2257,0x3A28F19D, + 0x40140000,0x00000000, 159, 0x57023576,0x84599702, + 0x40140000,0x00000000, 160, 0x5726C2D4,0x256FFCC3, + 0x40140000,0x00000000, 161, 0x574C7389,0x2ECBFBF4, + 0x40140000,0x00000000, 162, 0x5771C835,0xBD3F7D78, + 0x40140000,0x00000000, 163, 0x57963A43,0x2C8F5CD6, + 0x40140000,0x00000000, 164, 0x57BBC8D3,0xF7B3340C, + 0x40140000,0x00000000, 165, 0x57E15D84,0x7AD00087, + 0x40140000,0x00000000, 166, 0x5805B4E5,0x998400A9, + 0x40140000,0x00000000, 167, 0x582B221E,0xFFE500D4, + 0x40140000,0x00000000, 168, 0x5850F553,0x5FEF2084, + 0x40140000,0x00000000, 169, 0x587532A8,0x37EAE8A5, + 0x40140000,0x00000000, 170, 0x589A7F52,0x45E5A2CF, + 0x40140000,0x00000000, 171, 0x58C08F93,0x6BAF85C1, + 0x40140000,0x00000000, 172, 0x58E4B378,0x469B6732, + 0x40140000,0x00000000, 173, 0x5909E056,0x584240FE, + 0x40140000,0x00000000, 174, 0x59302C35,0xF729689F, + 0x40140000,0x00000000, 175, 0x59543743,0x74F3C2C6, + 0x40140000,0x00000000, 176, 0x59794514,0x5230B378, + 0x40140000,0x00000000, 177, 0x599F9659,0x66BCE056, + 0x40140000,0x00000000, 178, 0x59C3BDF7,0xE0360C36, + 0x40140000,0x00000000, 179, 0x59E8AD75,0xD8438F43, + 0x40140000,0x00000000, 180, 0x5A0ED8D3,0x4E547314, + 0x40140000,0x00000000, 181, 0x5A334784,0x10F4C7EC, + 0x40140000,0x00000000, 182, 0x5A581965,0x1531F9E8, + 0x40140000,0x00000000, 183, 0x5A7E1FBE,0x5A7E7861, + 0x40140000,0x00000000, 184, 0x5AA2D3D6,0xF88F0B3D, + 0x40140000,0x00000000, 185, 0x5AC788CC,0xB6B2CE0C, + 0x40140000,0x00000000, 186, 0x5AED6AFF,0xE45F818F, + 0x40140000,0x00000000, 187, 0x5B1262DF,0xEEBBB0F9, + 0x40140000,0x00000000, 188, 0x5B36FB97,0xEA6A9D38, + 0x40140000,0x00000000, 189, 0x5B5CBA7D,0xE5054486, + 0x40140000,0x00000000, 190, 0x5B81F48E,0xAF234AD4, + 0x40140000,0x00000000, 191, 0x5BA671B2,0x5AEC1D89, + 0x40140000,0x00000000, 192, 0x5BCC0E1E,0xF1A724EB, + 0x40140000,0x00000000, 193, 0x5BF188D3,0x57087713, + 0x40140000,0x00000000, 194, 0x5C15EB08,0x2CCA94D7, + 0x40140000,0x00000000, 195, 0x5C3B65CA,0x37FD3A0D, + 0x40140000,0x00000000, 196, 0x5C611F9E,0x62FE4448, + 0x40140000,0x00000000, 197, 0x5C856785,0xFBBDD55A, + 0x40140000,0x00000000, 198, 0x5CAAC167,0x7AAD4AB1, + 0x40140000,0x00000000, 199, 0x5CD0B8E0,0xACAC4EAF, + 0x40140000,0x00000000, 200, 0x5CF4E718,0xD7D7625A, + 0x40140000,0x00000000, 201, 0x5D1A20DF,0x0DCD3AF1, + 0x40140000,0x00000000, 202, 0x5D40548B,0x68A044D6, + 0x40140000,0x00000000, 203, 0x5D6469AE,0x42C8560C, + 0x40140000,0x00000000, 204, 0x5D898419,0xD37A6B8F, + 0x40140000,0x00000000, 205, 0x5DAFE520,0x48590673, + 0x40140000,0x00000000, 206, 0x5DD3EF34,0x2D37A408, + 0x40140000,0x00000000, 207, 0x5DF8EB01,0x38858D0A, + 0x40140000,0x00000000, 208, 0x5E1F25C1,0x86A6F04C, + 0x40140000,0x00000000, 209, 0x5E437798,0xF4285630, + 0x40140000,0x00000000, 210, 0x5E68557F,0x31326BBB, + 0x40140000,0x00000000, 211, 0x5E8E6ADE,0xFD7F06AA, + 0x40140000,0x00000000, 212, 0x5EB302CB,0x5E6F642A, + 0x40140000,0x00000000, 213, 0x5ED7C37E,0x360B3D35, + 0x40140000,0x00000000, 214, 0x5EFDB45D,0xC38E0C82, + 0x40140000,0x00000000, 215, 0x5F2290BA,0x9A38C7D1, + 0x40140000,0x00000000, 216, 0x5F4734E9,0x40C6F9C6, + 0x40140000,0x00000000, 217, 0x5F6D0223,0x90F8B837, + 0x40140000,0x00000000, 218, 0x5F922156,0x3A9B7323, + 0x40140000,0x00000000, 219, 0x5FB6A9AB,0xC9424FEB, + 0x40140000,0x00000000, 220, 0x5FDC5416,0xBB92E3E6, + 0x40140000,0x00000000, 221, 0x6001B48E,0x353BCE70, + 0x40140000,0x00000000, 222, 0x602621B1,0xC28AC20C, + 0x40140000,0x00000000, 223, 0x604BAA1E,0x332D728F, + 0x40140000,0x00000000, 224, 0x60714A52,0xDFFC6799, + 0x40140000,0x00000000, 225, 0x60959CE7,0x97FB817F, + 0x40140000,0x00000000, 226, 0x60BB0421,0x7DFA61DF, + 0x40140000,0x00000000, 227, 0x60E0E294,0xEEBC7D2C, + 0x40140000,0x00000000, 228, 0x61051B3A,0x2A6B9C76, + 0x40140000,0x00000000, 229, 0x612A6208,0xB5068394, + 0x40140000,0x00000000, 230, 0x61507D45,0x7124123D, + 0x40140000,0x00000000, 231, 0x61749C96,0xCD6D16CC, + 0x40140000,0x00000000, 232, 0x6199C3BC,0x80C85C7F, + 0x40140000,0x00000000, 233, 0x61C01A55,0xD07D39CF, + 0x40140000,0x00000000, 234, 0x61E420EB,0x449C8843, + 0x40140000,0x00000000, 235, 0x62092926,0x15C3AA54, + 0x40140000,0x00000000, 236, 0x622F736F,0x9B3494E9, + 0x40140000,0x00000000, 237, 0x6253A825,0xC100DD11, + 0x40140000,0x00000000, 238, 0x6278922F,0x31411456, + 0x40140000,0x00000000, 239, 0x629EB6BA,0xFD91596B, + 0x40140000,0x00000000, 240, 0x62C33234,0xDE7AD7E3, + 0x40140000,0x00000000, 241, 0x62E7FEC2,0x16198DDC, + 0x40140000,0x00000000, 242, 0x630DFE72,0x9B9FF153, + 0x40140000,0x00000000, 243, 0x6332BF07,0xA143F6D4, + 0x40140000,0x00000000, 244, 0x63576EC9,0x8994F489, + 0x40140000,0x00000000, 245, 0x637D4A7B,0xEBFA31AB, + 0x40140000,0x00000000, 246, 0x63A24E8D,0x737C5F0B, + 0x40140000,0x00000000, 247, 0x63C6E230,0xD05B76CD, + 0x40140000,0x00000000, 248, 0x63EC9ABD,0x04725481, + 0x40140000,0x00000000, 249, 0x6411E0B6,0x22C774D0, + 0x40140000,0x00000000, 250, 0x643658E3,0xAB795204, + 0x40140000,0x00000000, 251, 0x645BEF1C,0x9657A686, + 0x40140000,0x00000000, 252, 0x64817571,0xDDF6C814, + 0x40140000,0x00000000, 253, 0x64A5D2CE,0x55747A18, + 0x40140000,0x00000000, 254, 0x64CB4781,0xEAD1989E, + 0x40140000,0x00000000, 255, 0x64F10CB1,0x32C2FF63, + 0x40140000,0x00000000, 256, 0x65154FDD,0x7F73BF3C, + 0x40140000,0x00000000, 257, 0x653AA3D4,0xDF50AF0B, + 0x40140000,0x00000000, 258, 0x6560A665,0x0B926D67, + 0x40140000,0x00000000, 259, 0x6584CFFE,0x4E7708C0, + 0x40140000,0x00000000, 260, 0x65AA03FD,0xE214CAF1, + 0x40140000,0x00000000, 261, 0x65D0427E,0xAD4CFED6, + 0x40140000,0x00000000, 262, 0x65F4531E,0x58A03E8C, + 0x40140000,0x00000000, 263, 0x661967E5,0xEEC84E2F, + 0x40140000,0x00000000, 264, 0x663FC1DF,0x6A7A61BB, + 0x40140000,0x00000000, 265, 0x6663D92B,0xA28C7D15, + 0x40140000,0x00000000, 266, 0x6688CF76,0x8B2F9C5A, + 0x40140000,0x00000000, 267, 0x66AF0354,0x2DFB8370, + 0x40140000,0x00000000, 268, 0x66D36214,0x9CBD3226, + 0x40140000,0x00000000, 269, 0x66F83A99,0xC3EC7EB0, + 0x40140000,0x00000000, 270, 0x671E4940,0x34E79E5C, + 0x40140000,0x00000000, 271, 0x6742EDC8,0x2110C2F9, + 0x40140000,0x00000000, 272, 0x6767A93A,0x2954F3B8, + 0x40140000,0x00000000, 273, 0x678D9388,0xB3AA30A5, + 0x40140000,0x00000000, 274, 0x67B27C35,0x704A5E67, + 0x40140000,0x00000000, 275, 0x67D71B42,0xCC5CF601, + 0x40140000,0x00000000, 276, 0x67FCE213,0x7F743382, + 0x40140000,0x00000000, 277, 0x68220D4C,0x2FA8A031, + 0x40140000,0x00000000, 278, 0x6846909F,0x3B92C83D, + 0x40140000,0x00000000, 279, 0x686C34C7,0x0A777A4D, + 0x40140000,0x00000000, 280, 0x6891A0FC,0x668AAC70, + 0x40140000,0x00000000, 281, 0x68B6093B,0x802D578C, + 0x40140000,0x00000000, 282, 0x68DB8B8A,0x6038AD6F, + 0x40140000,0x00000000, 283, 0x69013736,0x7C236C65, + 0x40140000,0x00000000, 284, 0x69258504,0x1B2C477F, + 0x40140000,0x00000000, 285, 0x694AE645,0x21F7595E, + 0x40140000,0x00000000, 286, 0x6970CFEB,0x353A97DB, + 0x40140000,0x00000000, 287, 0x699503E6,0x02893DD2, + 0x40140000,0x00000000, 288, 0x69BA44DF,0x832B8D46, + 0x40140000,0x00000000, 289, 0x69E06B0B,0xB1FB384C, + 0x40140000,0x00000000, 290, 0x6A0485CE,0x9E7A065F, + 0x40140000,0x00000000, 291, 0x6A29A742,0x461887F6, + 0x40140000,0x00000000, 292, 0x6A500889,0x6BCF54FA, + 0x40140000,0x00000000, 293, 0x6A740AAB,0xC6C32A38, + 0x40140000,0x00000000, 294, 0x6A990D56,0xB873F4C7, + 0x40140000,0x00000000, 295, 0x6ABF50AC,0x6690F1F8, + 0x40140000,0x00000000, 296, 0x6AE3926B,0xC01A973B, + 0x40140000,0x00000000, 297, 0x6B087706,0xB0213D0A, + 0x40140000,0x00000000, 298, 0x6B2E94C8,0x5C298C4C, + 0x40140000,0x00000000, 299, 0x6B531CFD,0x3999F7B0, + 0x40140000,0x00000000, 300, 0x6B77E43C,0x8800759C, + 0x40180000,0x00000000, 2, 0x40420000,0x00000000, + 0x40180000,0x00000000, 3, 0x406B0000,0x00000000, + 0x40180000,0x00000000, 4, 0x40944000,0x00000000, + 0x40180000,0x00000000, 5, 0x40BE6000,0x00000000, + 0x40180000,0x00000000, 6, 0x40E6C800,0x00000000, + 0x40180000,0x00000000, 7, 0x41111600,0x00000000, + 0x40180000,0x00000000, 8, 0x4139A100,0x00000000, + 0x40180000,0x00000000, 9, 0x416338C0,0x00000000, + 0x40180000,0x00000000, 10, 0x418CD520,0x00000000, + 0x40180000,0x00000000, 11, 0x41B59FD8,0x00000000, + 0x40180000,0x00000000, 12, 0x41E037E2,0x00000000, + 0x40180000,0x00000000, 13, 0x420853D3,0x00000000, + 0x40180000,0x00000000, 14, 0x42323EDE,0x40000000, + 0x40180000,0x00000000, 15, 0x425B5E4D,0x60000000, + 0x40180000,0x00000000, 16, 0x428486BA,0x08000000, + 0x40180000,0x00000000, 17, 0x42AECA17,0x0C000000, + 0x40180000,0x00000000, 18, 0x42D71791,0x49000000, + 0x40180000,0x00000000, 19, 0x430151AC,0xF6C00000, + 0x40180000,0x00000000, 20, 0x4329FA83,0x72200000, + 0x40180000,0x00000000, 21, 0x43537BE2,0x95980000, + 0x40180000,0x00000000, 22, 0x437D39D3,0xE0640000, + 0x40180000,0x00000000, 23, 0x43A5EB5E,0xE84B0000, + 0x40180000,0x00000000, 24, 0x43D07087,0x2E384000, + 0x40180000,0x00000000, 25, 0x43F8A8CA,0xC5546000, + 0x40180000,0x00000000, 26, 0x44227E98,0x13FF4800, + 0x40180000,0x00000000, 27, 0x444BBDE4,0x1DFEEC00, + 0x40180000,0x00000000, 28, 0x4474CE6B,0x167F3100, + 0x40180000,0x00000000, 29, 0x449F35A0,0xA1BEC980, + 0x40180000,0x00000000, 30, 0x44C76838,0x794F1720, + 0x40180000,0x00000000, 31, 0x44F18E2A,0x5AFB5158, + 0x40180000,0x00000000, 32, 0x451A553F,0x8878FA04, + 0x40180000,0x00000000, 33, 0x4543BFEF,0xA65ABB83, + 0x40180000,0x00000000, 34, 0x456D9FE7,0x79881944, + 0x40180000,0x00000000, 35, 0x459637ED,0x9B2612F3, + 0x40180000,0x00000000, 36, 0x45C0A9F2,0x345C8E37, + 0x40180000,0x00000000, 37, 0x45E8FEEB,0x4E8AD552, + 0x40180000,0x00000000, 38, 0x4612BF30,0x7AE81FFD, + 0x40180000,0x00000000, 39, 0x463C1EC8,0xB85C2FFC, + 0x40180000,0x00000000, 40, 0x46651716,0x8A4523FD, + 0x40180000,0x00000000, 41, 0x468FA2A1,0xCF67B5FC, + 0x40180000,0x00000000, 42, 0x46B7B9F9,0x5B8DC87D, + 0x40180000,0x00000000, 43, 0x46E1CB7B,0x04AA565D, + 0x40180000,0x00000000, 44, 0x470AB138,0x86FF818C, + 0x40180000,0x00000000, 45, 0x473404EA,0x653FA129, + 0x40180000,0x00000000, 46, 0x475E075F,0x97DF71BE, + 0x40180000,0x00000000, 47, 0x47868587,0xB1E7954E, + 0x40180000,0x00000000, 48, 0x47B0E425,0xC56DAFFB, + 0x40180000,0x00000000, 49, 0x47D95638,0xA82487F8, + 0x40180000,0x00000000, 50, 0x480300AA,0x7E1B65FA, + 0x40180000,0x00000000, 51, 0x482C80FF,0xBD2918F7, + 0x40180000,0x00000000, 52, 0x485560BF,0xCDDED2B9, + 0x40180000,0x00000000, 53, 0x4880088F,0xDA671E0B, + 0x40180000,0x00000000, 54, 0x48A80CD7,0xC79AAD11, + 0x40180000,0x00000000, 55, 0x48D209A1,0xD5B401CC, + 0x40180000,0x00000000, 56, 0x48FB0E72,0xC08E02B3, + 0x40180000,0x00000000, 57, 0x49244AD6,0x106A8206, + 0x40180000,0x00000000, 58, 0x494E7041,0x189FC309, + 0x40180000,0x00000000, 59, 0x4976D430,0xD277D247, + 0x40180000,0x00000000, 60, 0x49A11F24,0x9DD9DDB5, + 0x40180000,0x00000000, 61, 0x49C9AEB6,0xECC6CC8F, + 0x40180000,0x00000000, 62, 0x49F34309,0x3195196C, + 0x40180000,0x00000000, 63, 0x4A1CE48D,0xCA5FA621, + 0x40180000,0x00000000, 64, 0x4A45AB6A,0x57C7BC99, + 0x40180000,0x00000000, 65, 0x4A70408F,0xC1D5CD73, + 0x40180000,0x00000000, 66, 0x4A9860D7,0xA2C0B42C, + 0x40180000,0x00000000, 67, 0x4AC248A1,0xBA108721, + 0x40180000,0x00000000, 68, 0x4AEB6CF2,0x9718CAB2, + 0x40180000,0x00000000, 69, 0x4B1491B5,0xF1529805, + 0x40180000,0x00000000, 70, 0x4B3EDA90,0xE9FBE408, + 0x40180000,0x00000000, 71, 0x4B6723EC,0xAF7CEB06, + 0x40180000,0x00000000, 72, 0x4B915AF1,0x839DB044, + 0x40180000,0x00000000, 73, 0x4BBA086A,0x456C8867, + 0x40180000,0x00000000, 74, 0x4BE3864F,0xB411664D, + 0x40180000,0x00000000, 75, 0x4C0D4977,0x8E1A1974, + 0x40180000,0x00000000, 76, 0x4C35F719,0xAA939317, + 0x40180000,0x00000000, 77, 0x4C607953,0x3FEEAE51, + 0x40180000,0x00000000, 78, 0x4C88B5FC,0xDFE60579, + 0x40180000,0x00000000, 79, 0x4CB2887D,0xA7EC841B, + 0x40180000,0x00000000, 80, 0x4CDBCCBC,0x7BE2C629, + 0x40180000,0x00000000, 81, 0x4D04D98D,0x5CEA149F, + 0x40180000,0x00000000, 82, 0x4D2F4654,0x0B5F1EEE, + 0x40180000,0x00000000, 83, 0x4D5774BF,0x08875732, + 0x40180000,0x00000000, 84, 0x4D81978F,0x46658166, + 0x40180000,0x00000000, 85, 0x4DAA6356,0xE9984219, + 0x40180000,0x00000000, 86, 0x4DD3CA81,0x2F323192, + 0x40180000,0x00000000, 87, 0x4DFDAFC1,0xC6CB4A5C, + 0x40180000,0x00000000, 88, 0x4E2643D1,0x551877C5, + 0x40180000,0x00000000, 89, 0x4E50B2DC,0xFFD259D4, + 0x40180000,0x00000000, 90, 0x4E790C4B,0x7FBB86BD, + 0x40180000,0x00000000, 91, 0x4EA2C938,0x9FCCA50E, + 0x40180000,0x00000000, 92, 0x4ECC2DD4,0xEFB2F795, + 0x40180000,0x00000000, 93, 0x4EF5225F,0xB3C639B0, + 0x40180000,0x00000000, 94, 0x4F1FB38F,0x8DA95688, + 0x40180000,0x00000000, 95, 0x4F47C6AB,0xAA3F00E6, + 0x40180000,0x00000000, 96, 0x4F71D500,0xBFAF40AC, + 0x40180000,0x00000000, 97, 0x4F9ABF81,0x1F86E102, + 0x40180000,0x00000000, 98, 0x4FC40FA0,0xD7A528C2, + 0x40180000,0x00000000, 99, 0x4FEE1771,0x4377BD23, + 0x40180000,0x00000000, 100, 0x50169194,0xF299CDDA, + 0x40180000,0x00000000, 101, 0x5040ED2F,0xB5F35A64, + 0x40180000,0x00000000, 102, 0x506963C7,0x90ED0795, + 0x40180000,0x00000000, 103, 0x50930AD5,0xACB1C5B0, + 0x40180000,0x00000000, 104, 0x50BC9040,0x830AA888, + 0x40180000,0x00000000, 105, 0x50E56C30,0x6247FE66, + 0x40180000,0x00000000, 106, 0x51101124,0x49B5FECD, + 0x40180000,0x00000000, 107, 0x513819B6,0x6E90FE33, + 0x40180000,0x00000000, 108, 0x51621348,0xD2ECBEA6, + 0x40180000,0x00000000, 109, 0x518B1CED,0x3C631DF9, + 0x40180000,0x00000000, 110, 0x51B455B1,0xED4A567B, + 0x40180000,0x00000000, 111, 0x51DE808A,0xE3EF81B8, + 0x40180000,0x00000000, 112, 0x5206E068,0x2AF3A14A, + 0x40180000,0x00000000, 113, 0x5231284E,0x2036B8F8, + 0x40180000,0x00000000, 114, 0x5259BC75,0x30521573, + 0x40180000,0x00000000, 115, 0x52834D57,0xE43D9017, + 0x40180000,0x00000000, 116, 0x52ACF403,0xD65C5822, + 0x40180000,0x00000000, 117, 0x52D5B702,0xE0C54219, + 0x40180000,0x00000000, 118, 0x53004942,0x2893F193, + 0x40180000,0x00000000, 119, 0x53286DE3,0x3CDDEA5D, + 0x40180000,0x00000000, 120, 0x5352526A,0x6DA66FC5, + 0x40180000,0x00000000, 121, 0x537B7B9F,0xA479A7A8, + 0x40180000,0x00000000, 122, 0x53A49CB7,0xBB5B3DBE, + 0x40180000,0x00000000, 123, 0x53CEEB13,0x9908DC9D, + 0x40180000,0x00000000, 124, 0x53F7304E,0xB2C6A576, + 0x40180000,0x00000000, 125, 0x5421643B,0x0614FC18, + 0x40180000,0x00000000, 126, 0x544A1658,0x891F7A25, + 0x40180000,0x00000000, 127, 0x547390C2,0x66D79B9B, + 0x40180000,0x00000000, 128, 0x549D5923,0x9A436969, + 0x40180000,0x00000000, 129, 0x54C602DA,0xB3B28F0F, + 0x40180000,0x00000000, 130, 0x54F08224,0x06C5EB4B, + 0x40180000,0x00000000, 131, 0x5518C336,0x0A28E0F1, + 0x40180000,0x00000000, 132, 0x55429268,0x879EA8B5, + 0x40180000,0x00000000, 133, 0x556BDB9C,0xCB6DFD0F, + 0x40180000,0x00000000, 134, 0x5594E4B5,0x98927DCB, + 0x40180000,0x00000000, 135, 0x55BF5710,0x64DBBCB1, + 0x40180000,0x00000000, 136, 0x55E7814C,0x4BA4CD85, + 0x40180000,0x00000000, 137, 0x5611A0F9,0x38BB9A23, + 0x40180000,0x00000000, 138, 0x563A7175,0xD5196735, + 0x40180000,0x00000000, 139, 0x5663D518,0x5FD30D68, + 0x40180000,0x00000000, 140, 0x568DBFA4,0x8FBC941C, + 0x40180000,0x00000000, 141, 0x56B64FBB,0x6BCD6F15, + 0x40180000,0x00000000, 142, 0x56E0BBCC,0x90DA1350, + 0x40180000,0x00000000, 143, 0x570919B2,0xD9471CF7, + 0x40180000,0x00000000, 144, 0x5732D346,0x22F555BA, + 0x40180000,0x00000000, 145, 0x575C3CE9,0x34700096, + 0x40180000,0x00000000, 146, 0x57852DAE,0xE7540071, + 0x40180000,0x00000000, 147, 0x57AFC486,0x5AFE00A9, + 0x40180000,0x00000000, 148, 0x57D7D364,0xC43E807F, + 0x40180000,0x00000000, 149, 0x5801DE8B,0x932EE05F, + 0x40180000,0x00000000, 150, 0x582ACDD1,0x5CC6508F, + 0x40180000,0x00000000, 151, 0x58541A5D,0x0594BC6B, + 0x40180000,0x00000000, 152, 0x587E278B,0x885F1AA1, + 0x40180000,0x00000000, 153, 0x58A69DA8,0xA64753F8, + 0x40180000,0x00000000, 154, 0x58D0F63E,0x7CB57EFA, + 0x40180000,0x00000000, 155, 0x58F9715D,0xBB103E77, + 0x40180000,0x00000000, 156, 0x59231506,0x4C4C2EDA, + 0x40180000,0x00000000, 157, 0x594C9F89,0x72724646, + 0x40180000,0x00000000, 158, 0x597577A7,0x15D5B4B5, + 0x40180000,0x00000000, 159, 0x59A019BD,0x50604788, + 0x40180000,0x00000000, 160, 0x59C8269B,0xF8906B4B, + 0x40180000,0x00000000, 161, 0x59F21CF4,0xFA6C5079, + 0x40180000,0x00000000, 162, 0x5A1B2B6F,0x77A278B5, + 0x40180000,0x00000000, 163, 0x5A446093,0x99B9DA88, + 0x40180000,0x00000000, 164, 0x5A6E90DD,0x6696C7CB, + 0x40180000,0x00000000, 165, 0x5A96ECA6,0x0CF115D9, + 0x40180000,0x00000000, 166, 0x5AC1317C,0x89B4D062, + 0x40180000,0x00000000, 167, 0x5AE9CA3A,0xCE8F3894, + 0x40180000,0x00000000, 168, 0x5B1357AC,0x1AEB6A6F, + 0x40180000,0x00000000, 169, 0x5B3D0382,0x28611FA6, + 0x40180000,0x00000000, 170, 0x5B65C2A1,0x9E48D7BD, + 0x40180000,0x00000000, 171, 0x5B9051F9,0x36B6A1CD, + 0x40180000,0x00000000, 172, 0x5BB87AF5,0xD211F2B4, + 0x40180000,0x00000000, 173, 0x5BE25C38,0x5D8D7607, + 0x40180000,0x00000000, 174, 0x5C0B8A54,0x8C54310B, + 0x40180000,0x00000000, 175, 0x5C34A7BF,0x693F24C8, + 0x40180000,0x00000000, 176, 0x5C5EFB9F,0x1DDEB72C, + 0x40180000,0x00000000, 177, 0x5C873CB7,0x56670961, + 0x40180000,0x00000000, 178, 0x5CB16D89,0x80CD4709, + 0x40180000,0x00000000, 179, 0x5CDA244E,0x4133EA8D, + 0x40180000,0x00000000, 180, 0x5D039B3A,0xB0E6EFEA, + 0x40180000,0x00000000, 181, 0x5D2D68D8,0x095A67DF, + 0x40180000,0x00000000, 182, 0x5D560EA2,0x0703CDE7, + 0x40180000,0x00000000, 183, 0x5D808AF9,0x8542DA6D, + 0x40180000,0x00000000, 184, 0x5DA8D076,0x47E447A4, + 0x40180000,0x00000000, 185, 0x5DD29C58,0xB5EB35BB, + 0x40180000,0x00000000, 186, 0x5DFBEA85,0x10E0D098, + 0x40180000,0x00000000, 187, 0x5E24EFE3,0xCCA89C72, + 0x40180000,0x00000000, 188, 0x5E4F67D5,0xB2FCEAAB, + 0x40180000,0x00000000, 189, 0x5E778DE0,0x463DB001, + 0x40180000,0x00000000, 190, 0x5EA1AA68,0x34AE4400, + 0x40180000,0x00000000, 191, 0x5ECA7F9C,0x4F056601, + 0x40180000,0x00000000, 192, 0x5EF3DFB5,0x3B440C81, + 0x40180000,0x00000000, 193, 0x5F1DCF8F,0xD8E612C1, + 0x40180000,0x00000000, 194, 0x5F465BAB,0xE2AC8E11, + 0x40180000,0x00000000, 195, 0x5F70C4C0,0xEA016A8C, + 0x40180000,0x00000000, 196, 0x5F992721,0x5F021FD3, + 0x40180000,0x00000000, 197, 0x5FC2DD59,0x074197DE, + 0x40180000,0x00000000, 198, 0x5FEC4C05,0x8AE263CD, + 0x40180000,0x00000000, 199, 0x60153904,0x2829CADA, + 0x40180000,0x00000000, 200, 0x603FD586,0x3C3EB047, + 0x40180000,0x00000000, 201, 0x6067E024,0xAD2F0435, + 0x40180000,0x00000000, 202, 0x6091E81B,0x81E34328, + 0x40180000,0x00000000, 203, 0x60BADC29,0x42D4E4BC, + 0x40180000,0x00000000, 204, 0x60E4251E,0xF21FAB8D, + 0x40180000,0x00000000, 205, 0x610E37AE,0x6B2F8153, + 0x40180000,0x00000000, 206, 0x6136A9C2,0xD063A0FE, + 0x40180000,0x00000000, 207, 0x6160FF52,0x1C4AB8BF, + 0x40180000,0x00000000, 208, 0x61897EFB,0x2A70151E, + 0x40180000,0x00000000, 209, 0x61B31F3C,0x5FD40FD7, + 0x40180000,0x00000000, 210, 0x61DCAEDA,0x8FBE17C2, + 0x40180000,0x00000000, 211, 0x62058323,0xEBCE91D1, + 0x40180000,0x00000000, 212, 0x6230225A,0xF0DAED5D, + 0x40180000,0x00000000, 213, 0x62583388,0x6948640C, + 0x40180000,0x00000000, 214, 0x628226A6,0x4EF64B09, + 0x40180000,0x00000000, 215, 0x62AB39F9,0x7671708D, + 0x40180000,0x00000000, 216, 0x62D46B7B,0x18D5146A, + 0x40180000,0x00000000, 217, 0x62FEA138,0xA53F9E9F, + 0x40180000,0x00000000, 218, 0x6326F8EA,0x7BEFB6F7, + 0x40180000,0x00000000, 219, 0x63513AAF,0xDCF3C939, + 0x40180000,0x00000000, 220, 0x6379D807,0xCB6DADD6, + 0x40180000,0x00000000, 221, 0x63A36205,0xD8924260, + 0x40180000,0x00000000, 222, 0x63CD1308,0xC4DB6391, + 0x40180000,0x00000000, 223, 0x63F5CE46,0x93A48AAC, + 0x40180000,0x00000000, 224, 0x64205AB4,0xEEBB6801, + 0x40180000,0x00000000, 225, 0x6448880F,0x66191C02, + 0x40180000,0x00000000, 226, 0x6472660B,0x8C92D501, + 0x40180000,0x00000000, 227, 0x649B9911,0x52DC3F82, + 0x40180000,0x00000000, 228, 0x64C4B2CC,0xFE252FA2, + 0x40180000,0x00000000, 229, 0x64EF0C33,0x7D37C772, + 0x40180000,0x00000000, 230, 0x65174926,0x9DE9D596, + 0x40180000,0x00000000, 231, 0x654176DC,0xF66F6030, + 0x40180000,0x00000000, 232, 0x656A324B,0x71A71049, + 0x40180000,0x00000000, 233, 0x6593A5B8,0x953D4C36, + 0x40180000,0x00000000, 234, 0x65BD7894,0xDFDBF252, + 0x40180000,0x00000000, 235, 0x65E61A6F,0xA7E4F5BD, + 0x40180000,0x00000000, 236, 0x661093D3,0xBDEBB84E, + 0x40180000,0x00000000, 237, 0x6638DDBD,0x9CE19475, + 0x40180000,0x00000000, 238, 0x6662A64E,0x35A92F58, + 0x40180000,0x00000000, 239, 0x668BF975,0x507DC704, + 0x40180000,0x00000000, 240, 0x66B4FB17,0xFC5E5543, + 0x40180000,0x00000000, 241, 0x66DF78A3,0xFA8D7FE4, + 0x40180000,0x00000000, 242, 0x67079A7A,0xFBEA1FEB, + 0x40180000,0x00000000, 243, 0x6731B3DC,0x3CEF97F0, + 0x40180000,0x00000000, 244, 0x675A8DCA,0x5B6763E8, + 0x40180000,0x00000000, 245, 0x6783EA57,0xC48D8AEE, + 0x40180000,0x00000000, 246, 0x67ADDF83,0xA6D45065, + 0x40180000,0x00000000, 247, 0x67D667A2,0xBD1F3C4C, + 0x40180000,0x00000000, 248, 0x6800CDBA,0x0DD76D39, + 0x40180000,0x00000000, 249, 0x68293497,0x14C323D6, + 0x40180000,0x00000000, 250, 0x6852E771,0x4F925AE0, + 0x40180000,0x00000000, 251, 0x687C5B29,0xF75B8850, + 0x40180000,0x00000000, 252, 0x68A5445F,0x7984A63C, + 0x40180000,0x00000000, 253, 0x68CFE68F,0x3646F95A, + 0x40180000,0x00000000, 254, 0x68F7ECEB,0x68B53B04, + 0x40180000,0x00000000, 255, 0x6921F1B0,0x8E87EC43, + 0x40180000,0x00000000, 256, 0x694AEA88,0xD5CBE264, + 0x40180000,0x00000000, 257, 0x69742FE6,0xA058E9CB, + 0x40180000,0x00000000, 258, 0x699E47D9,0xF0855EB1, + 0x40180000,0x00000000, 259, 0x69C6B5E3,0x74640705, + 0x40180000,0x00000000, 260, 0x69F1086A,0x974B0543, + 0x40180000,0x00000000, 261, 0x6A198C9F,0xE2F087E5, + 0x40180000,0x00000000, 262, 0x6A432977,0xEA3465EC, + 0x40180000,0x00000000, 263, 0x6A6CBE33,0xDF4E98E2, + 0x40180000,0x00000000, 264, 0x6A958EA6,0xE77AF2A9, + 0x40180000,0x00000000, 265, 0x6AC02AFD,0x2D9C35FF, + 0x40180000,0x00000000, 266, 0x6AE8407B,0xC46A50FE, + 0x40180000,0x00000000, 267, 0x6B12305C,0xD34FBCBF, + 0x40180000,0x00000000, 268, 0x6B3B488B,0x3CF79B1E, + 0x40180000,0x00000000, 269, 0x6B647668,0x6DB9B457, + 0x40180000,0x00000000, 270, 0x6B8EB19C,0xA4968E82, + 0x40180000,0x00000000, 271, 0x6BB70535,0x7B70EAE2, + 0x40180000,0x00000000, 272, 0x6BE143E8,0x1C94B029, + 0x40180000,0x00000000, 273, 0x6C09E5DC,0x2ADF083E, + 0x40180000,0x00000000, 274, 0x6C336C65,0x2027462E, + 0x40180000,0x00000000, 275, 0x6C5D2297,0xB03AE945, + 0x40180000,0x00000000, 276, 0x6C85D9F1,0xC42C2EF4, + 0x40180000,0x00000000, 277, 0x6CB06375,0x53212337, + 0x40180000,0x00000000, 278, 0x6CD8952F,0xFCB1B4D3, + 0x40180000,0x00000000, 279, 0x6D026FE3,0xFD85479E, + 0x40180000,0x00000000, 280, 0x6D2BA7D5,0xFC47EB6D, + 0x40180000,0x00000000, 281, 0x6D54BDE0,0x7D35F092, + 0x40180000,0x00000000, 282, 0x6D7F1CD0,0xBBD0E8DB, + 0x40180000,0x00000000, 283, 0x6DA7559C,0x8CDCAEA4, + 0x40180000,0x00000000, 284, 0x6DD18035,0x69A582FB, + 0x40180000,0x00000000, 285, 0x6DFA4050,0x1E784478, + 0x40180000,0x00000000, 286, 0x6E23B03C,0x16DA335A, + 0x40180000,0x00000000, 287, 0x6E4D885A,0x22474D07, + 0x40180000,0x00000000, 288, 0x6E762643,0x99B579C6, + 0x40180000,0x00000000, 289, 0x6EA09CB2,0xB3481B54, + 0x40180000,0x00000000, 290, 0x6EC8EB0C,0x0CEC28FE, + 0x40180000,0x00000000, 291, 0x6EF2B049,0x09B11EBF, + 0x40180000,0x00000000, 292, 0x6F1C086D,0x8E89AE1E, + 0x40180000,0x00000000, 293, 0x6F450652,0x2AE74297, + 0x40180000,0x00000000, 294, 0x6F6F897B,0x405AE3E2, + 0x40180000,0x00000000, 295, 0x6F97A71C,0x70442AE9, + 0x40180000,0x00000000, 296, 0x6FC1BD55,0x5433202F, + 0x40180000,0x00000000, 297, 0x6FEA9BFF,0xFE4CB047, + 0x40180000,0x00000000, 298, 0x7013F4FF,0xFEB98435, + 0x40180000,0x00000000, 299, 0x703DEF7F,0xFE16464F, + 0x40180000,0x00000000, 300, 0x7066739F,0xFE90B4BB, + 0x401C0000,0x00000000, 2, 0x40488000,0x00000000, + 0x401C0000,0x00000000, 3, 0x40757000,0x00000000, + 0x401C0000,0x00000000, 4, 0x40A2C200,0x00000000, + 0x401C0000,0x00000000, 5, 0x40D069C0,0x00000000, + 0x401C0000,0x00000000, 6, 0x40FCB910,0x00000000, + 0x401C0000,0x00000000, 7, 0x412921EE,0x00000000, + 0x401C0000,0x00000000, 8, 0x4155FDB0,0x40000000, + 0x401C0000,0x00000000, 9, 0x41833DFA,0x38000000, + 0x401C0000,0x00000000, 10, 0x41B0D63A,0xF1000000, + 0x401C0000,0x00000000, 11, 0x41DD76E7,0x25C00000, + 0x401C0000,0x00000000, 12, 0x4209C80A,0x41080000, + 0x401C0000,0x00000000, 13, 0x42368F08,0xF8E70000, + 0x401C0000,0x00000000, 14, 0x4263BD27,0xD9CA2000, + 0x401C0000,0x00000000, 15, 0x42914582,0xDE90DC00, + 0x401C0000,0x00000000, 16, 0x42BE39A5,0x057D8100, + 0x401C0000,0x00000000, 17, 0x42EA7270,0x64CDD0E0, + 0x401C0000,0x00000000, 18, 0x43172422,0x583416C4, + 0x401C0000,0x00000000, 19, 0x43443F9E,0x0D2D93EC, + 0x401C0000,0x00000000, 20, 0x4371B7AA,0x4B87E16E, + 0x401C0000,0x00000000, 21, 0x439F016A,0x042DCA81, + 0x401C0000,0x00000000, 22, 0x43CB213C,0xC3A81131, + 0x401C0000,0x00000000, 23, 0x43F7BD15,0x2B330F0A, + 0x401C0000,0x00000000, 24, 0x4424C572,0x85CCAD29, + 0x401C0000,0x00000000, 25, 0x44522CC4,0x35131784, + 0x401C0000,0x00000000, 26, 0x447FCE57,0x5CE16927, + 0x401C0000,0x00000000, 27, 0x44ABD48C,0x71453C02, + 0x401C0000,0x00000000, 28, 0x44D859FA,0xE31C9482, + 0x401C0000,0x00000000, 29, 0x45054EBB,0x86B901F2, + 0x401C0000,0x00000000, 30, 0x4532A4E4,0x15E1E1B3, + 0x401C0000,0x00000000, 31, 0x45605047,0x9325A57D, + 0x401C0000,0x00000000, 32, 0x458C8C7D,0x4181E19B, + 0x401C0000,0x00000000, 33, 0x45B8FAED,0x9951A567, + 0x401C0000,0x00000000, 34, 0x45E5DB8F,0xE62770BA, + 0x401C0000,0x00000000, 35, 0x4613201D,0xE96282A3, + 0x401C0000,0x00000000, 36, 0x4640BC1A,0x2C36324F, + 0x401C0000,0x00000000, 37, 0x466D492D,0xCD5ED80A, + 0x401C0000,0x00000000, 38, 0x4699A008,0x13B2FD09, + 0x401C0000,0x00000000, 39, 0x46C66C07,0x113C9D68, + 0x401C0000,0x00000000, 40, 0x46F39E86,0x2F1509BB, + 0x401C0000,0x00000000, 41, 0x47212AB5,0x69326883, + 0x401C0000,0x00000000, 42, 0x474E0ABD,0x781836E6, + 0x401C0000,0x00000000, 43, 0x477A4965,0xC9153009, + 0x401C0000,0x00000000, 44, 0x47A70039,0x0FF28A08, + 0x401C0000,0x00000000, 45, 0x47D42031,0xEDF438C7, + 0x401C0000,0x00000000, 46, 0x48019C2B,0xB035B1AE, + 0x401C0000,0x00000000, 47, 0x482ED14C,0x745DF6F1, + 0x401C0000,0x00000000, 48, 0x485AF722,0xE5D23813, + 0x401C0000,0x00000000, 49, 0x4887983E,0x8917F110, + 0x401C0000,0x00000000, 50, 0x48B4A536,0xB7F4F2EE, + 0x401C0000,0x00000000, 51, 0x48E2108F,0xE0F65490, + 0x401C0000,0x00000000, 52, 0x490F9CFB,0xC9AF13FD, + 0x401C0000,0x00000000, 53, 0x493BA95C,0x5079317D, + 0x401C0000,0x00000000, 54, 0x49683430,0xC66A0B4D, + 0x401C0000,0x00000000, 55, 0x49952DAA,0xAD9CC9E4, + 0x401C0000,0x00000000, 56, 0x49C287F5,0x57E930A7, + 0x401C0000,0x00000000, 57, 0x49F036F6,0xACEC0A92, + 0x401C0000,0x00000000, 58, 0x4A1C602F,0xAE9D1280, + 0x401C0000,0x00000000, 59, 0x4A48D429,0xB8C97030, + 0x401C0000,0x00000000, 60, 0x4A75B9A4,0x81B0422A, + 0x401C0000,0x00000000, 61, 0x4AA3026F,0xF17A39E5, + 0x401C0000,0x00000000, 62, 0x4AD0A221,0xF34AF2A8, + 0x401C0000,0x00000000, 63, 0x4AFD1BBB,0x69C328A6, + 0x401C0000,0x00000000, 64, 0x4B297843,0xFC8AC392, + 0x401C0000,0x00000000, 65, 0x4B56493B,0x7CF96B1F, + 0x401C0000,0x00000000, 66, 0x4B838014,0x0D5A3DBC, + 0x401C0000,0x00000000, 67, 0x4BB11011,0x8BAEF604, + 0x401C0000,0x00000000, 68, 0x4BDDDC1E,0xB4722E87, + 0x401C0000,0x00000000, 69, 0x4C0A209A,0xDDE3E8B6, + 0x401C0000,0x00000000, 70, 0x4C36DC87,0x82276B9F, + 0x401C0000,0x00000000, 71, 0x4C6400F6,0x91E27E2C, + 0x401C0000,0x00000000, 72, 0x4C9180D7,0xBFA62E66, + 0x401C0000,0x00000000, 73, 0x4CBEA179,0x8F62D133, + 0x401C0000,0x00000000, 74, 0x4CEACD4A,0x5D76770C, + 0x401C0000,0x00000000, 75, 0x4D1773A1,0x11C7A82B, + 0x401C0000,0x00000000, 76, 0x4D44852C,0xEF8EB325, + 0x401C0000,0x00000000, 77, 0x4D71F487,0x519CDCC1, + 0x401C0000,0x00000000, 78, 0x4D9F6BEC,0xCED28251, + 0x401C0000,0x00000000, 79, 0x4DCB7E6F,0x34F83207, + 0x401C0000,0x00000000, 80, 0x4DF80EA1,0x4E592BC6, + 0x401C0000,0x00000000, 81, 0x4E250CCD,0x248E064D, + 0x401C0000,0x00000000, 82, 0x4E526B33,0x7FFC4584, + 0x401C0000,0x00000000, 83, 0x4E801DCD,0x0FFCBCD3, + 0x401C0000,0x00000000, 84, 0x4EAC3426,0xDBFA4A72, + 0x401C0000,0x00000000, 85, 0x4ED8ADA2,0x007B0124, + 0x401C0000,0x00000000, 86, 0x4F0597ED,0xC06BA0FF, + 0x401C0000,0x00000000, 87, 0x4F32E4F0,0x085E2CDF, + 0x401C0000,0x00000000, 88, 0x4F608852,0x07526743, + 0x401C0000,0x00000000, 89, 0x4F8CEE8F,0x8CD034B6, + 0x401C0000,0x00000000, 90, 0x4FB950BD,0x9B362E1F, + 0x401C0000,0x00000000, 91, 0x4FE626A5,0xE7CF685B, + 0x401C0000,0x00000000, 92, 0x501361D1,0x2AD57B50, + 0x401C0000,0x00000000, 93, 0x5040F597,0x057ACBE6, + 0x401C0000,0x00000000, 94, 0x506DADC8,0x4996E4D2, + 0x401C0000,0x00000000, 95, 0x5099F80F,0x40640838, + 0x401C0000,0x00000000, 96, 0x50C6B90D,0x58578731, + 0x401C0000,0x00000000, 97, 0x50F3E1EB,0xAD4C964B, + 0x401C0000,0x00000000, 98, 0x512165AE,0x37A30381, + 0x401C0000,0x00000000, 99, 0x514E71F0,0xE15D4623, + 0x401C0000,0x00000000, 100, 0x517AA3B2,0xC5319D5E, + 0x401C0000,0x00000000, 101, 0x51A74F3C,0x6C8B69B3, + 0x401C0000,0x00000000, 102, 0x51D46554,0xDEF9FC7C, + 0x401C0000,0x00000000, 103, 0x5201D8AA,0x431ABCED, + 0x401C0000,0x00000000, 104, 0x522F3B29,0xF56ECA9E, + 0x401C0000,0x00000000, 105, 0x525B53C4,0xB6C0F14A, + 0x401C0000,0x00000000, 106, 0x5287E94C,0x1FE8D321, + 0x401C0000,0x00000000, 107, 0x52B4EC22,0x9BEBB8BD, + 0x401C0000,0x00000000, 108, 0x52E24E9E,0x486E41A5, + 0x401C0000,0x00000000, 109, 0x531004CA,0x7F607971, + 0x401C0000,0x00000000, 110, 0x533C0862,0x5EE8D485, + 0x401C0000,0x00000000, 111, 0x53688756,0x130BB9F5, + 0x401C0000,0x00000000, 112, 0x5395766B,0x50AA42B6, + 0x401C0000,0x00000000, 113, 0x53C2C79D,0xE694FA5F, + 0x401C0000,0x00000000, 114, 0x53F06EAA,0x29C25B13, + 0x401C0000,0x00000000, 115, 0x541CC1A9,0xC9141F62, + 0x401C0000,0x00000000, 116, 0x54492974,0x8FF19B76, + 0x401C0000,0x00000000, 117, 0x54760445,0xFDF36807, + 0x401C0000,0x00000000, 118, 0x54A343BD,0x3E34FB06, + 0x401C0000,0x00000000, 119, 0x54D0DB45,0x966E5BA5, + 0x401C0000,0x00000000, 120, 0x54FD7FB9,0xC7412061, + 0x401C0000,0x00000000, 121, 0x5529CFC2,0x8E58FC55, + 0x401C0000,0x00000000, 122, 0x555695CA,0x3C8DDCCA, + 0x401C0000,0x00000000, 123, 0x5583C310,0xF4FC2131, + 0x401C0000,0x00000000, 124, 0x55B14AAE,0xD65C9D0B, + 0x401C0000,0x00000000, 125, 0x55DE42B1,0xF72212D3, + 0x401C0000,0x00000000, 126, 0x560A7A5B,0xB83DD079, + 0x401C0000,0x00000000, 127, 0x56372B10,0x4136166A, + 0x401C0000,0x00000000, 128, 0x566445AE,0x390F539D, + 0x401C0000,0x00000000, 129, 0x5691BCF8,0x71ED6929, + 0x401C0000,0x00000000, 130, 0x56BF0AB2,0xC75F7808, + 0x401C0000,0x00000000, 131, 0x56EB295C,0x6E738907, + 0x401C0000,0x00000000, 132, 0x5717C430,0xE0A517E6, + 0x401C0000,0x00000000, 133, 0x5744CBAA,0xC49074E9, + 0x401C0000,0x00000000, 134, 0x57723235,0x6BFE664C, + 0x401C0000,0x00000000, 135, 0x579FD7DD,0x7CFD3305, + 0x401C0000,0x00000000, 136, 0x57CBDCE1,0xCD5D8CA4, + 0x401C0000,0x00000000, 137, 0x57F86145,0x93B1DB10, + 0x401C0000,0x00000000, 138, 0x5825551C,0xE13B9FAE, + 0x401C0000,0x00000000, 139, 0x5852AA79,0x45142BB8, + 0x401C0000,0x00000000, 140, 0x5880552A,0x1C71A641, + 0x401C0000,0x00000000, 141, 0x58AC9509,0xB1C6E2F2, + 0x401C0000,0x00000000, 142, 0x58D90268,0x7B8E0694, + 0x401C0000,0x00000000, 143, 0x5905E21B,0x6C1C45C1, + 0x401C0000,0x00000000, 144, 0x593325D7,0xFE98BD09, + 0x401C0000,0x00000000, 145, 0x5960C11C,0xFEC5A568, + 0x401C0000,0x00000000, 146, 0x598D51F2,0xBDD9E176, + 0x401C0000,0x00000000, 147, 0x59B9A7B4,0x661EA547, + 0x401C0000,0x00000000, 148, 0x59E672BD,0xD95AD09E, + 0x401C0000,0x00000000, 149, 0x5A13A466,0x1E2F768A, + 0x401C0000,0x00000000, 150, 0x5A412FD9,0x5A6987B9, + 0x401C0000,0x00000000, 151, 0x5A6E13BC,0x5E38AD84, + 0x401C0000,0x00000000, 152, 0x5A9A5144,0xD27197D4, + 0x401C0000,0x00000000, 153, 0x5AC7071C,0x382364D9, + 0x401C0000,0x00000000, 154, 0x5AF42638,0xB11EF83E, + 0x401C0000,0x00000000, 155, 0x5B21A171,0x9AFB1936, + 0x401C0000,0x00000000, 156, 0x5B4EDA86,0xCF376C1F, + 0x401C0000,0x00000000, 157, 0x5B7AFF35,0xF5507E9B, + 0x401C0000,0x00000000, 158, 0x5BA79F4F,0x36A66EC8, + 0x401C0000,0x00000000, 159, 0x5BD4AB65,0x4FD1A0EF, + 0x401C0000,0x00000000, 160, 0x5C0215F8,0xA5D76CD1, + 0x401C0000,0x00000000, 161, 0x5C2FA673,0x2238FE6D, + 0x401C0000,0x00000000, 162, 0x5C5BB1A4,0xBDF1DEA0, + 0x401C0000,0x00000000, 163, 0x5C883B70,0x2633A2CC, + 0x401C0000,0x00000000, 164, 0x5CB53402,0x216D2E72, + 0x401C0000,0x00000000, 165, 0x5CE28D81,0xDD3F88A4, + 0x401C0000,0x00000000, 166, 0x5D103BD1,0xA1979790, + 0x401C0000,0x00000000, 167, 0x5D3C68AE,0xDAC9493B, + 0x401C0000,0x00000000, 168, 0x5D68DB98,0xFF702014, + 0x401C0000,0x00000000, 169, 0x5D95C025,0xDF821C11, + 0x401C0000,0x00000000, 170, 0x5DC30821,0x2391D88F, + 0x401C0000,0x00000000, 171, 0x5DF0A71C,0xFF1F9D7D, + 0x401C0000,0x00000000, 172, 0x5E1D2472,0xBE77539B, + 0x401C0000,0x00000000, 173, 0x5E497FE4,0x66A86928, + 0x401C0000,0x00000000, 174, 0x5E764FE7,0xD9D35C03, + 0x401C0000,0x00000000, 175, 0x5EA385EA,0xDE98F082, + 0x401C0000,0x00000000, 176, 0x5ED1152D,0x82C5D272, + 0x401C0000,0x00000000, 177, 0x5EFDE50F,0xA4DA3048, + 0x401C0000,0x00000000, 178, 0x5F2A286D,0xB03EEA3F, + 0x401C0000,0x00000000, 179, 0x5F56E35F,0xFA370CF7, + 0x401C0000,0x00000000, 180, 0x5F8406F3,0xFAF02B58, + 0x401C0000,0x00000000, 181, 0x5FB18615,0x7B9225ED, + 0x401C0000,0x00000000, 182, 0x5FDEAAA5,0x983FC25F, + 0x401C0000,0x00000000, 183, 0x600AD550,0xE537CA13, + 0x401C0000,0x00000000, 184, 0x60377AA6,0xC890D0D1, + 0x401C0000,0x00000000, 185, 0x60648B51,0xEF7EB6B7, + 0x401C0000,0x00000000, 186, 0x6091F9E7,0xB18EDFE0, + 0x401C0000,0x00000000, 187, 0x60BF7555,0x76BA07C8, + 0x401C0000,0x00000000, 188, 0x60EB86AA,0xC7E2C6CF, + 0x401C0000,0x00000000, 189, 0x611815D5,0x6EE66DF5, + 0x401C0000,0x00000000, 190, 0x6145131A,0xC109A036, + 0x401C0000,0x00000000, 191, 0x617270B7,0x68E86C2F, + 0x401C0000,0x00000000, 192, 0x61A022A0,0x7BCB5EA9, + 0x401C0000,0x00000000, 193, 0x61CC3C98,0xD8A3E5A9, + 0x401C0000,0x00000000, 194, 0x61F8B505,0xBD8F68F4, + 0x401C0000,0x00000000, 195, 0x62259E65,0x05DD7BD5, + 0x401C0000,0x00000000, 196, 0x6252EA98,0x6521CC5A, + 0x401C0000,0x00000000, 197, 0x62808D45,0x587D92CF, + 0x401C0000,0x00000000, 198, 0x62ACF739,0x5ADBC0EA, + 0x401C0000,0x00000000, 199, 0x62D95852,0x2F8048CD, + 0x401C0000,0x00000000, 200, 0x63062D47,0xE9903FB4, + 0x401C0000,0x00000000, 201, 0x6333679E,0xEC5E37BD, + 0x401C0000,0x00000000, 202, 0x6360FAAB,0x0ED270C5, + 0x401C0000,0x00000000, 203, 0x638DB6AB,0x59F0455A, + 0x401C0000,0x00000000, 204, 0x63B9FFD5,0xEEB23CAE, + 0x401C0000,0x00000000, 205, 0x63E6BFDB,0x30DBF519, + 0x401C0000,0x00000000, 206, 0x6413E7DF,0xCAC07675, + 0x401C0000,0x00000000, 207, 0x64416AE3,0xD16867A7, + 0x401C0000,0x00000000, 208, 0x646E7B0E,0xAE76B564, + 0x401C0000,0x00000000, 209, 0x649AABAC,0xD8A7DEB7, + 0x401C0000,0x00000000, 210, 0x64C75637,0x3D92E2E0, + 0x401C0000,0x00000000, 211, 0x64F46B70,0x55E08684, + 0x401C0000,0x00000000, 212, 0x6521DE02,0x4B2475B4, + 0x401C0000,0x00000000, 213, 0x654F4484,0x037FCDFB, + 0x401C0000,0x00000000, 214, 0x657B5BF3,0x830FD43B, + 0x401C0000,0x00000000, 215, 0x65A7F075,0x12ADD9B4, + 0x401C0000,0x00000000, 216, 0x65D4F266,0x70581E7E, + 0x401C0000,0x00000000, 217, 0x66025419,0xA24D1AAE, + 0x401C0000,0x00000000, 218, 0x66300996,0x6E037758, + 0x401C0000,0x00000000, 219, 0x665C10C7,0x408610DA, + 0x401C0000,0x00000000, 220, 0x66888EAE,0x58754EBF, + 0x401C0000,0x00000000, 221, 0x66B57CD8,0x8D66A4E7, + 0x401C0000,0x00000000, 222, 0x66E2CD3D,0x7BB9D04A, + 0x401C0000,0x00000000, 223, 0x67107395,0xCC429641, + 0x401C0000,0x00000000, 224, 0x673CCA46,0x257486F2, + 0x401C0000,0x00000000, 225, 0x676930FD,0x60C5F613, + 0x401C0000,0x00000000, 226, 0x67960ADD,0xB4AD3751, + 0x401C0000,0x00000000, 227, 0x67C34981,0xFE179067, + 0x401C0000,0x00000000, 228, 0x67F0E051,0xBE549E5A, + 0x401C0000,0x00000000, 229, 0x681D888F,0x0D14151D, + 0x401C0000,0x00000000, 230, 0x6849D77D,0x2B71927A, + 0x401C0000,0x00000000, 231, 0x68769C8D,0x8603602B, + 0x401C0000,0x00000000, 232, 0x68A3C8FB,0xD542F425, + 0x401C0000,0x00000000, 233, 0x68D14FDC,0x5A9A95A1, + 0x401C0000,0x00000000, 234, 0x68FE4BC1,0x9E8E85D9, + 0x401C0000,0x00000000, 235, 0x692A8249,0x6ABCB51E, + 0x401C0000,0x00000000, 236, 0x69573200,0x3D651E7A, + 0x401C0000,0x00000000, 237, 0x69844BC0,0x35B87AAB, + 0x401C0000,0x00000000, 238, 0x69B1C248,0x2F016B56, + 0x401C0000,0x00000000, 239, 0x69DF13FE,0x52427BD6, + 0x401C0000,0x00000000, 240, 0x6A0B317E,0x87FA2C5B, + 0x401C0000,0x00000000, 241, 0x6A37CB4E,0xB6FAE6D0, + 0x401C0000,0x00000000, 242, 0x6A64D1E4,0xE01B89F6, + 0x401C0000,0x00000000, 243, 0x6A9237A8,0x441818B7, + 0x401C0000,0x00000000, 244, 0x6ABFE166,0x772A2B40, + 0x401C0000,0x00000000, 245, 0x6AEBE539,0xA844E5D8, + 0x401C0000,0x00000000, 246, 0x6B186892,0x733C491D, + 0x401C0000,0x00000000, 247, 0x6B455B80,0x24D4BFF9, + 0x401C0000,0x00000000, 248, 0x6B72B010,0x203A27FA, + 0x401C0000,0x00000000, 249, 0x6BA05A0E,0x1C32E2FB, + 0x401C0000,0x00000000, 250, 0x6BCC9D98,0xB1590D37, + 0x401C0000,0x00000000, 251, 0x6BF909E5,0x9B2DEB90, + 0x401C0000,0x00000000, 252, 0x6C25E8A8,0xE7C82E1E, + 0x401C0000,0x00000000, 253, 0x6C532B93,0xCACF285A, + 0x401C0000,0x00000000, 254, 0x6C80C621,0x5175434F, + 0x401C0000,0x00000000, 255, 0x6CAD5ABA,0x4E8D35CB, + 0x401C0000,0x00000000, 256, 0x6CD9AF63,0x04BB8F11, + 0x401C0000,0x00000000, 257, 0x6D067976,0xA4241D2F, + 0x401C0000,0x00000000, 258, 0x6D33AA47,0xCF9F9989, + 0x401C0000,0x00000000, 259, 0x6D6134FE,0xD5ABA658, + 0x401C0000,0x00000000, 260, 0x6D8E1CBD,0xF5EC631A, + 0x401C0000,0x00000000, 261, 0x6DBA5926,0x372ED6B7, + 0x401C0000,0x00000000, 262, 0x6DE70E01,0x7048FBE0, + 0x401C0000,0x00000000, 263, 0x6E142C41,0x423FDC64, + 0x401C0000,0x00000000, 264, 0x6E41A6B9,0x19F7E0D7, + 0x401C0000,0x00000000, 265, 0x6E6EE3C3,0xED71C979, + 0x401C0000,0x00000000, 266, 0x6E9B074B,0x6FC3904A, + 0x401C0000,0x00000000, 267, 0x6EC7A662,0x01CB1E41, + 0x401C0000,0x00000000, 268, 0x6EF4B195,0xC191BA79, + 0x401C0000,0x00000000, 269, 0x6F221B63,0x095F832A, + 0x401C0000,0x00000000, 270, 0x6F4FAFED,0x50672589, + 0x401C0000,0x00000000, 271, 0x6F7BB9EF,0xA65A40D8, + 0x401C0000,0x00000000, 272, 0x6FA842B1,0xB18EF8BD, + 0x401C0000,0x00000000, 273, 0x6FD53A5B,0x7B5D19A5, + 0x401C0000,0x00000000, 274, 0x70029310,0x0BF17670, + 0x401C0000,0x00000000, 275, 0x703040AE,0x0A7347A2, + 0x401C0000,0x00000000, 276, 0x705C7130,0x9249BD5C, + 0x401C0000,0x00000000, 277, 0x7088E30A,0x800085B1, + 0x401C0000,0x00000000, 278, 0x70B5C6A9,0x300074FB, + 0x401C0000,0x00000000, 279, 0x70E30DD4,0x0A00665B, + 0x401C0000,0x00000000, 280, 0x7110AC19,0x88C05990, + 0x401C0000,0x00000000, 281, 0x713D2D2C,0xAF509CBC, + 0x401C0000,0x00000000, 282, 0x71698787,0x19668924, + 0x401C0000,0x00000000, 283, 0x71965696,0x3639B800, + 0x401C0000,0x00000000, 284, 0x71C38BC3,0x6F728100, + 0x401C0000,0x00000000, 285, 0x71F11A4B,0x018430E0, + 0x401C0000,0x00000000, 286, 0x721DEE03,0x42A75588, + 0x401C0000,0x00000000, 287, 0x724A3042,0xDA526AD7, + 0x401C0000,0x00000000, 288, 0x7276EA3A,0x7F081D7C, + 0x401C0000,0x00000000, 289, 0x72A40CF3,0x2F2719CC, + 0x401C0000,0x00000000, 290, 0x72D18B54,0xC9423693, + 0x401C0000,0x00000000, 291, 0x72FEB3D4,0x6033DF81, + 0x401C0000,0x00000000, 292, 0x732ADD59,0xD42D6391, + 0x401C0000,0x00000000, 293, 0x735781AE,0x99A7B71F, + 0x401C0000,0x00000000, 294, 0x73849178,0xC672C03B, + 0x401C0000,0x00000000, 295, 0x73B1FF49,0xADA46834, + 0x401C0000,0x00000000, 296, 0x73DF7EC0,0xEFDFB65A, + 0x401C0000,0x00000000, 297, 0x740B8EE8,0xD1E3BF8F, + 0x401C0000,0x00000000, 298, 0x74381D0B,0xB7A7479D, + 0x401C0000,0x00000000, 299, 0x7465196A,0x40B25EA9, + 0x401C0000,0x00000000, 300, 0x7492763C,0xF89C12D4, + 0x40200000,0x00000000, 2, 0x40500000,0x00000000, + 0x40200000,0x00000000, 3, 0x40800000,0x00000000, + 0x40200000,0x00000000, 4, 0x40B00000,0x00000000, + 0x40200000,0x00000000, 5, 0x40E00000,0x00000000, + 0x40200000,0x00000000, 6, 0x41100000,0x00000000, + 0x40200000,0x00000000, 7, 0x41400000,0x00000000, + 0x40200000,0x00000000, 8, 0x41700000,0x00000000, + 0x40200000,0x00000000, 9, 0x41A00000,0x00000000, + 0x40200000,0x00000000, 10, 0x41D00000,0x00000000, + 0x40200000,0x00000000, 11, 0x42000000,0x00000000, + 0x40200000,0x00000000, 12, 0x42300000,0x00000000, + 0x40200000,0x00000000, 13, 0x42600000,0x00000000, + 0x40200000,0x00000000, 14, 0x42900000,0x00000000, + 0x40200000,0x00000000, 15, 0x42C00000,0x00000000, + 0x40200000,0x00000000, 16, 0x42F00000,0x00000000, + 0x40200000,0x00000000, 17, 0x43200000,0x00000000, + 0x40200000,0x00000000, 18, 0x43500000,0x00000000, + 0x40200000,0x00000000, 19, 0x43800000,0x00000000, + 0x40200000,0x00000000, 20, 0x43B00000,0x00000000, + 0x40200000,0x00000000, 21, 0x43E00000,0x00000000, + 0x40200000,0x00000000, 22, 0x44100000,0x00000000, + 0x40200000,0x00000000, 23, 0x44400000,0x00000000, + 0x40200000,0x00000000, 24, 0x44700000,0x00000000, + 0x40200000,0x00000000, 25, 0x44A00000,0x00000000, + 0x40200000,0x00000000, 26, 0x44D00000,0x00000000, + 0x40200000,0x00000000, 27, 0x45000000,0x00000000, + 0x40200000,0x00000000, 28, 0x45300000,0x00000000, + 0x40200000,0x00000000, 29, 0x45600000,0x00000000, + 0x40200000,0x00000000, 30, 0x45900000,0x00000000, + 0x40200000,0x00000000, 31, 0x45C00000,0x00000000, + 0x40200000,0x00000000, 32, 0x45F00000,0x00000000, + 0x40200000,0x00000000, 33, 0x46200000,0x00000000, + 0x40200000,0x00000000, 34, 0x46500000,0x00000000, + 0x40200000,0x00000000, 35, 0x46800000,0x00000000, + 0x40200000,0x00000000, 36, 0x46B00000,0x00000000, + 0x40200000,0x00000000, 37, 0x46E00000,0x00000000, + 0x40200000,0x00000000, 38, 0x47100000,0x00000000, + 0x40200000,0x00000000, 39, 0x47400000,0x00000000, + 0x40200000,0x00000000, 40, 0x47700000,0x00000000, + 0x40200000,0x00000000, 41, 0x47A00000,0x00000000, + 0x40200000,0x00000000, 42, 0x47D00000,0x00000000, + 0x40200000,0x00000000, 43, 0x48000000,0x00000000, + 0x40200000,0x00000000, 44, 0x48300000,0x00000000, + 0x40200000,0x00000000, 45, 0x48600000,0x00000000, + 0x40200000,0x00000000, 46, 0x48900000,0x00000000, + 0x40200000,0x00000000, 47, 0x48C00000,0x00000000, + 0x40200000,0x00000000, 48, 0x48F00000,0x00000000, + 0x40200000,0x00000000, 49, 0x49200000,0x00000000, + 0x40200000,0x00000000, 50, 0x49500000,0x00000000, + 0x40200000,0x00000000, 51, 0x49800000,0x00000000, + 0x40200000,0x00000000, 52, 0x49B00000,0x00000000, + 0x40200000,0x00000000, 53, 0x49E00000,0x00000000, + 0x40200000,0x00000000, 54, 0x4A100000,0x00000000, + 0x40200000,0x00000000, 55, 0x4A400000,0x00000000, + 0x40200000,0x00000000, 56, 0x4A700000,0x00000000, + 0x40200000,0x00000000, 57, 0x4AA00000,0x00000000, + 0x40200000,0x00000000, 58, 0x4AD00000,0x00000000, + 0x40200000,0x00000000, 59, 0x4B000000,0x00000000, + 0x40200000,0x00000000, 60, 0x4B300000,0x00000000, + 0x40200000,0x00000000, 61, 0x4B600000,0x00000000, + 0x40200000,0x00000000, 62, 0x4B900000,0x00000000, + 0x40200000,0x00000000, 63, 0x4BC00000,0x00000000, + 0x40200000,0x00000000, 64, 0x4BF00000,0x00000000, + 0x40200000,0x00000000, 65, 0x4C200000,0x00000000, + 0x40200000,0x00000000, 66, 0x4C500000,0x00000000, + 0x40200000,0x00000000, 67, 0x4C800000,0x00000000, + 0x40200000,0x00000000, 68, 0x4CB00000,0x00000000, + 0x40200000,0x00000000, 69, 0x4CE00000,0x00000000, + 0x40200000,0x00000000, 70, 0x4D100000,0x00000000, + 0x40200000,0x00000000, 71, 0x4D400000,0x00000000, + 0x40200000,0x00000000, 72, 0x4D700000,0x00000000, + 0x40200000,0x00000000, 73, 0x4DA00000,0x00000000, + 0x40200000,0x00000000, 74, 0x4DD00000,0x00000000, + 0x40200000,0x00000000, 75, 0x4E000000,0x00000000, + 0x40200000,0x00000000, 76, 0x4E300000,0x00000000, + 0x40200000,0x00000000, 77, 0x4E600000,0x00000000, + 0x40200000,0x00000000, 78, 0x4E900000,0x00000000, + 0x40200000,0x00000000, 79, 0x4EC00000,0x00000000, + 0x40200000,0x00000000, 80, 0x4EF00000,0x00000000, + 0x40200000,0x00000000, 81, 0x4F200000,0x00000000, + 0x40200000,0x00000000, 82, 0x4F500000,0x00000000, + 0x40200000,0x00000000, 83, 0x4F800000,0x00000000, + 0x40200000,0x00000000, 84, 0x4FB00000,0x00000000, + 0x40200000,0x00000000, 85, 0x4FE00000,0x00000000, + 0x40200000,0x00000000, 86, 0x50100000,0x00000000, + 0x40200000,0x00000000, 87, 0x50400000,0x00000000, + 0x40200000,0x00000000, 88, 0x50700000,0x00000000, + 0x40200000,0x00000000, 89, 0x50A00000,0x00000000, + 0x40200000,0x00000000, 90, 0x50D00000,0x00000000, + 0x40200000,0x00000000, 91, 0x51000000,0x00000000, + 0x40200000,0x00000000, 92, 0x51300000,0x00000000, + 0x40200000,0x00000000, 93, 0x51600000,0x00000000, + 0x40200000,0x00000000, 94, 0x51900000,0x00000000, + 0x40200000,0x00000000, 95, 0x51C00000,0x00000000, + 0x40200000,0x00000000, 96, 0x51F00000,0x00000000, + 0x40200000,0x00000000, 97, 0x52200000,0x00000000, + 0x40200000,0x00000000, 98, 0x52500000,0x00000000, + 0x40200000,0x00000000, 99, 0x52800000,0x00000000, + 0x40200000,0x00000000, 100, 0x52B00000,0x00000000, + 0x40200000,0x00000000, 101, 0x52E00000,0x00000000, + 0x40200000,0x00000000, 102, 0x53100000,0x00000000, + 0x40200000,0x00000000, 103, 0x53400000,0x00000000, + 0x40200000,0x00000000, 104, 0x53700000,0x00000000, + 0x40200000,0x00000000, 105, 0x53A00000,0x00000000, + 0x40200000,0x00000000, 106, 0x53D00000,0x00000000, + 0x40200000,0x00000000, 107, 0x54000000,0x00000000, + 0x40200000,0x00000000, 108, 0x54300000,0x00000000, + 0x40200000,0x00000000, 109, 0x54600000,0x00000000, + 0x40200000,0x00000000, 110, 0x54900000,0x00000000, + 0x40200000,0x00000000, 111, 0x54C00000,0x00000000, + 0x40200000,0x00000000, 112, 0x54F00000,0x00000000, + 0x40200000,0x00000000, 113, 0x55200000,0x00000000, + 0x40200000,0x00000000, 114, 0x55500000,0x00000000, + 0x40200000,0x00000000, 115, 0x55800000,0x00000000, + 0x40200000,0x00000000, 116, 0x55B00000,0x00000000, + 0x40200000,0x00000000, 117, 0x55E00000,0x00000000, + 0x40200000,0x00000000, 118, 0x56100000,0x00000000, + 0x40200000,0x00000000, 119, 0x56400000,0x00000000, + 0x40200000,0x00000000, 120, 0x56700000,0x00000000, + 0x40200000,0x00000000, 121, 0x56A00000,0x00000000, + 0x40200000,0x00000000, 122, 0x56D00000,0x00000000, + 0x40200000,0x00000000, 123, 0x57000000,0x00000000, + 0x40200000,0x00000000, 124, 0x57300000,0x00000000, + 0x40200000,0x00000000, 125, 0x57600000,0x00000000, + 0x40200000,0x00000000, 126, 0x57900000,0x00000000, + 0x40200000,0x00000000, 127, 0x57C00000,0x00000000, + 0x40200000,0x00000000, 128, 0x57F00000,0x00000000, + 0x40200000,0x00000000, 129, 0x58200000,0x00000000, + 0x40200000,0x00000000, 130, 0x58500000,0x00000000, + 0x40200000,0x00000000, 131, 0x58800000,0x00000000, + 0x40200000,0x00000000, 132, 0x58B00000,0x00000000, + 0x40200000,0x00000000, 133, 0x58E00000,0x00000000, + 0x40200000,0x00000000, 134, 0x59100000,0x00000000, + 0x40200000,0x00000000, 135, 0x59400000,0x00000000, + 0x40200000,0x00000000, 136, 0x59700000,0x00000000, + 0x40200000,0x00000000, 137, 0x59A00000,0x00000000, + 0x40200000,0x00000000, 138, 0x59D00000,0x00000000, + 0x40200000,0x00000000, 139, 0x5A000000,0x00000000, + 0x40200000,0x00000000, 140, 0x5A300000,0x00000000, + 0x40200000,0x00000000, 141, 0x5A600000,0x00000000, + 0x40200000,0x00000000, 142, 0x5A900000,0x00000000, + 0x40200000,0x00000000, 143, 0x5AC00000,0x00000000, + 0x40200000,0x00000000, 144, 0x5AF00000,0x00000000, + 0x40200000,0x00000000, 145, 0x5B200000,0x00000000, + 0x40200000,0x00000000, 146, 0x5B500000,0x00000000, + 0x40200000,0x00000000, 147, 0x5B800000,0x00000000, + 0x40200000,0x00000000, 148, 0x5BB00000,0x00000000, + 0x40200000,0x00000000, 149, 0x5BE00000,0x00000000, + 0x40200000,0x00000000, 150, 0x5C100000,0x00000000, + 0x40200000,0x00000000, 151, 0x5C400000,0x00000000, + 0x40200000,0x00000000, 152, 0x5C700000,0x00000000, + 0x40200000,0x00000000, 153, 0x5CA00000,0x00000000, + 0x40200000,0x00000000, 154, 0x5CD00000,0x00000000, + 0x40200000,0x00000000, 155, 0x5D000000,0x00000000, + 0x40200000,0x00000000, 156, 0x5D300000,0x00000000, + 0x40200000,0x00000000, 157, 0x5D600000,0x00000000, + 0x40200000,0x00000000, 158, 0x5D900000,0x00000000, + 0x40200000,0x00000000, 159, 0x5DC00000,0x00000000, + 0x40200000,0x00000000, 160, 0x5DF00000,0x00000000, + 0x40200000,0x00000000, 161, 0x5E200000,0x00000000, + 0x40200000,0x00000000, 162, 0x5E500000,0x00000000, + 0x40200000,0x00000000, 163, 0x5E800000,0x00000000, + 0x40200000,0x00000000, 164, 0x5EB00000,0x00000000, + 0x40200000,0x00000000, 165, 0x5EE00000,0x00000000, + 0x40200000,0x00000000, 166, 0x5F100000,0x00000000, + 0x40200000,0x00000000, 167, 0x5F400000,0x00000000, + 0x40200000,0x00000000, 168, 0x5F700000,0x00000000, + 0x40200000,0x00000000, 169, 0x5FA00000,0x00000000, + 0x40200000,0x00000000, 170, 0x5FD00000,0x00000000, + 0x40200000,0x00000000, 171, 0x60000000,0x00000000, + 0x40200000,0x00000000, 172, 0x60300000,0x00000000, + 0x40200000,0x00000000, 173, 0x60600000,0x00000000, + 0x40200000,0x00000000, 174, 0x60900000,0x00000000, + 0x40200000,0x00000000, 175, 0x60C00000,0x00000000, + 0x40200000,0x00000000, 176, 0x60F00000,0x00000000, + 0x40200000,0x00000000, 177, 0x61200000,0x00000000, + 0x40200000,0x00000000, 178, 0x61500000,0x00000000, + 0x40200000,0x00000000, 179, 0x61800000,0x00000000, + 0x40200000,0x00000000, 180, 0x61B00000,0x00000000, + 0x40200000,0x00000000, 181, 0x61E00000,0x00000000, + 0x40200000,0x00000000, 182, 0x62100000,0x00000000, + 0x40200000,0x00000000, 183, 0x62400000,0x00000000, + 0x40200000,0x00000000, 184, 0x62700000,0x00000000, + 0x40200000,0x00000000, 185, 0x62A00000,0x00000000, + 0x40200000,0x00000000, 186, 0x62D00000,0x00000000, + 0x40200000,0x00000000, 187, 0x63000000,0x00000000, + 0x40200000,0x00000000, 188, 0x63300000,0x00000000, + 0x40200000,0x00000000, 189, 0x63600000,0x00000000, + 0x40200000,0x00000000, 190, 0x63900000,0x00000000, + 0x40200000,0x00000000, 191, 0x63C00000,0x00000000, + 0x40200000,0x00000000, 192, 0x63F00000,0x00000000, + 0x40200000,0x00000000, 193, 0x64200000,0x00000000, + 0x40200000,0x00000000, 194, 0x64500000,0x00000000, + 0x40200000,0x00000000, 195, 0x64800000,0x00000000, + 0x40200000,0x00000000, 196, 0x64B00000,0x00000000, + 0x40200000,0x00000000, 197, 0x64E00000,0x00000000, + 0x40200000,0x00000000, 198, 0x65100000,0x00000000, + 0x40200000,0x00000000, 199, 0x65400000,0x00000000, + 0x40200000,0x00000000, 200, 0x65700000,0x00000000, + 0x40200000,0x00000000, 201, 0x65A00000,0x00000000, + 0x40200000,0x00000000, 202, 0x65D00000,0x00000000, + 0x40200000,0x00000000, 203, 0x66000000,0x00000000, + 0x40200000,0x00000000, 204, 0x66300000,0x00000000, + 0x40200000,0x00000000, 205, 0x66600000,0x00000000, + 0x40200000,0x00000000, 206, 0x66900000,0x00000000, + 0x40200000,0x00000000, 207, 0x66C00000,0x00000000, + 0x40200000,0x00000000, 208, 0x66F00000,0x00000000, + 0x40200000,0x00000000, 209, 0x67200000,0x00000000, + 0x40200000,0x00000000, 210, 0x67500000,0x00000000, + 0x40200000,0x00000000, 211, 0x67800000,0x00000000, + 0x40200000,0x00000000, 212, 0x67B00000,0x00000000, + 0x40200000,0x00000000, 213, 0x67E00000,0x00000000, + 0x40200000,0x00000000, 214, 0x68100000,0x00000000, + 0x40200000,0x00000000, 215, 0x68400000,0x00000000, + 0x40200000,0x00000000, 216, 0x68700000,0x00000000, + 0x40200000,0x00000000, 217, 0x68A00000,0x00000000, + 0x40200000,0x00000000, 218, 0x68D00000,0x00000000, + 0x40200000,0x00000000, 219, 0x69000000,0x00000000, + 0x40200000,0x00000000, 220, 0x69300000,0x00000000, + 0x40200000,0x00000000, 221, 0x69600000,0x00000000, + 0x40200000,0x00000000, 222, 0x69900000,0x00000000, + 0x40200000,0x00000000, 223, 0x69C00000,0x00000000, + 0x40200000,0x00000000, 224, 0x69F00000,0x00000000, + 0x40200000,0x00000000, 225, 0x6A200000,0x00000000, + 0x40200000,0x00000000, 226, 0x6A500000,0x00000000, + 0x40200000,0x00000000, 227, 0x6A800000,0x00000000, + 0x40200000,0x00000000, 228, 0x6AB00000,0x00000000, + 0x40200000,0x00000000, 229, 0x6AE00000,0x00000000, + 0x40200000,0x00000000, 230, 0x6B100000,0x00000000, + 0x40200000,0x00000000, 231, 0x6B400000,0x00000000, + 0x40200000,0x00000000, 232, 0x6B700000,0x00000000, + 0x40200000,0x00000000, 233, 0x6BA00000,0x00000000, + 0x40200000,0x00000000, 234, 0x6BD00000,0x00000000, + 0x40200000,0x00000000, 235, 0x6C000000,0x00000000, + 0x40200000,0x00000000, 236, 0x6C300000,0x00000000, + 0x40200000,0x00000000, 237, 0x6C600000,0x00000000, + 0x40200000,0x00000000, 238, 0x6C900000,0x00000000, + 0x40200000,0x00000000, 239, 0x6CC00000,0x00000000, + 0x40200000,0x00000000, 240, 0x6CF00000,0x00000000, + 0x40200000,0x00000000, 241, 0x6D200000,0x00000000, + 0x40200000,0x00000000, 242, 0x6D500000,0x00000000, + 0x40200000,0x00000000, 243, 0x6D800000,0x00000000, + 0x40200000,0x00000000, 244, 0x6DB00000,0x00000000, + 0x40200000,0x00000000, 245, 0x6DE00000,0x00000000, + 0x40200000,0x00000000, 246, 0x6E100000,0x00000000, + 0x40200000,0x00000000, 247, 0x6E400000,0x00000000, + 0x40200000,0x00000000, 248, 0x6E700000,0x00000000, + 0x40200000,0x00000000, 249, 0x6EA00000,0x00000000, + 0x40200000,0x00000000, 250, 0x6ED00000,0x00000000, + 0x40200000,0x00000000, 251, 0x6F000000,0x00000000, + 0x40200000,0x00000000, 252, 0x6F300000,0x00000000, + 0x40200000,0x00000000, 253, 0x6F600000,0x00000000, + 0x40200000,0x00000000, 254, 0x6F900000,0x00000000, + 0x40200000,0x00000000, 255, 0x6FC00000,0x00000000, + 0x40200000,0x00000000, 256, 0x6FF00000,0x00000000, + 0x40200000,0x00000000, 257, 0x70200000,0x00000000, + 0x40200000,0x00000000, 258, 0x70500000,0x00000000, + 0x40200000,0x00000000, 259, 0x70800000,0x00000000, + 0x40200000,0x00000000, 260, 0x70B00000,0x00000000, + 0x40200000,0x00000000, 261, 0x70E00000,0x00000000, + 0x40200000,0x00000000, 262, 0x71100000,0x00000000, + 0x40200000,0x00000000, 263, 0x71400000,0x00000000, + 0x40200000,0x00000000, 264, 0x71700000,0x00000000, + 0x40200000,0x00000000, 265, 0x71A00000,0x00000000, + 0x40200000,0x00000000, 266, 0x71D00000,0x00000000, + 0x40200000,0x00000000, 267, 0x72000000,0x00000000, + 0x40200000,0x00000000, 268, 0x72300000,0x00000000, + 0x40200000,0x00000000, 269, 0x72600000,0x00000000, + 0x40200000,0x00000000, 270, 0x72900000,0x00000000, + 0x40200000,0x00000000, 271, 0x72C00000,0x00000000, + 0x40200000,0x00000000, 272, 0x72F00000,0x00000000, + 0x40200000,0x00000000, 273, 0x73200000,0x00000000, + 0x40200000,0x00000000, 274, 0x73500000,0x00000000, + 0x40200000,0x00000000, 275, 0x73800000,0x00000000, + 0x40200000,0x00000000, 276, 0x73B00000,0x00000000, + 0x40200000,0x00000000, 277, 0x73E00000,0x00000000, + 0x40200000,0x00000000, 278, 0x74100000,0x00000000, + 0x40200000,0x00000000, 279, 0x74400000,0x00000000, + 0x40200000,0x00000000, 280, 0x74700000,0x00000000, + 0x40200000,0x00000000, 281, 0x74A00000,0x00000000, + 0x40200000,0x00000000, 282, 0x74D00000,0x00000000, + 0x40200000,0x00000000, 283, 0x75000000,0x00000000, + 0x40200000,0x00000000, 284, 0x75300000,0x00000000, + 0x40200000,0x00000000, 285, 0x75600000,0x00000000, + 0x40200000,0x00000000, 286, 0x75900000,0x00000000, + 0x40200000,0x00000000, 287, 0x75C00000,0x00000000, + 0x40200000,0x00000000, 288, 0x75F00000,0x00000000, + 0x40200000,0x00000000, 289, 0x76200000,0x00000000, + 0x40200000,0x00000000, 290, 0x76500000,0x00000000, + 0x40200000,0x00000000, 291, 0x76800000,0x00000000, + 0x40200000,0x00000000, 292, 0x76B00000,0x00000000, + 0x40200000,0x00000000, 293, 0x76E00000,0x00000000, + 0x40200000,0x00000000, 294, 0x77100000,0x00000000, + 0x40200000,0x00000000, 295, 0x77400000,0x00000000, + 0x40200000,0x00000000, 296, 0x77700000,0x00000000, + 0x40200000,0x00000000, 297, 0x77A00000,0x00000000, + 0x40200000,0x00000000, 298, 0x77D00000,0x00000000, + 0x40200000,0x00000000, 299, 0x78000000,0x00000000, + 0x40200000,0x00000000, 300, 0x78300000,0x00000000, + 0x40220000,0x00000000, 2, 0x40544000,0x00000000, + 0x40220000,0x00000000, 3, 0x4086C800,0x00000000, + 0x40220000,0x00000000, 4, 0x40B9A100,0x00000000, + 0x40220000,0x00000000, 5, 0x40ECD520,0x00000000, + 0x40220000,0x00000000, 6, 0x412037E2,0x00000000, + 0x40220000,0x00000000, 7, 0x41523EDE,0x40000000, + 0x40220000,0x00000000, 8, 0x418486BA,0x08000000, + 0x40220000,0x00000000, 9, 0x41B71791,0x49000000, + 0x40220000,0x00000000, 10, 0x41E9FA83,0x72200000, + 0x40220000,0x00000000, 11, 0x421D39D3,0xE0640000, + 0x40220000,0x00000000, 12, 0x42507087,0x2E384000, + 0x40220000,0x00000000, 13, 0x42827E98,0x13FF4800, + 0x40220000,0x00000000, 14, 0x42B4CE6B,0x167F3100, + 0x40220000,0x00000000, 15, 0x42E76838,0x794F1720, + 0x40220000,0x00000000, 16, 0x431A553F,0x8878FA04, + 0x40220000,0x00000000, 17, 0x434D9FE7,0x79881944, + 0x40220000,0x00000000, 18, 0x4380A9F2,0x345C8E37, + 0x40220000,0x00000000, 19, 0x43B2BF30,0x7AE81FFD, + 0x40220000,0x00000000, 20, 0x43E51716,0x8A4523FD, + 0x40220000,0x00000000, 21, 0x4417B9F9,0x5B8DC87D, + 0x40220000,0x00000000, 22, 0x444AB138,0x86FF818C, + 0x40220000,0x00000000, 23, 0x447E075F,0x97DF71BE, + 0x40220000,0x00000000, 24, 0x44B0E425,0xC56DAFFB, + 0x40220000,0x00000000, 25, 0x44E300AA,0x7E1B65FA, + 0x40220000,0x00000000, 26, 0x451560BF,0xCDDED2B9, + 0x40220000,0x00000000, 27, 0x45480CD7,0xC79AAD11, + 0x40220000,0x00000000, 28, 0x457B0E72,0xC08E02B3, + 0x40220000,0x00000000, 29, 0x45AE7041,0x189FC309, + 0x40220000,0x00000000, 30, 0x45E11F24,0x9DD9DDB5, + 0x40220000,0x00000000, 31, 0x46134309,0x3195196C, + 0x40220000,0x00000000, 32, 0x4645AB6A,0x57C7BC99, + 0x40220000,0x00000000, 33, 0x467860D7,0xA2C0B42C, + 0x40220000,0x00000000, 34, 0x46AB6CF2,0x9718CAB2, + 0x40220000,0x00000000, 35, 0x46DEDA90,0xE9FBE408, + 0x40220000,0x00000000, 36, 0x47115AF1,0x839DB044, + 0x40220000,0x00000000, 37, 0x4743864F,0xB411664D, + 0x40220000,0x00000000, 38, 0x4775F719,0xAA939317, + 0x40220000,0x00000000, 39, 0x47A8B5FC,0xDFE60579, + 0x40220000,0x00000000, 40, 0x47DBCCBC,0x7BE2C629, + 0x40220000,0x00000000, 41, 0x480F4654,0x0B5F1EEE, + 0x40220000,0x00000000, 42, 0x4841978F,0x46658166, + 0x40220000,0x00000000, 43, 0x4873CA81,0x2F323192, + 0x40220000,0x00000000, 44, 0x48A643D1,0x551877C5, + 0x40220000,0x00000000, 45, 0x48D90C4B,0x7FBB86BD, + 0x40220000,0x00000000, 46, 0x490C2DD4,0xEFB2F795, + 0x40220000,0x00000000, 47, 0x493FB38F,0x8DA95688, + 0x40220000,0x00000000, 48, 0x4971D500,0xBFAF40AC, + 0x40220000,0x00000000, 49, 0x49A40FA0,0xD7A528C2, + 0x40220000,0x00000000, 50, 0x49D69194,0xF299CDDA, + 0x40220000,0x00000000, 51, 0x4A0963C7,0x90ED0795, + 0x40220000,0x00000000, 52, 0x4A3C9040,0x830AA888, + 0x40220000,0x00000000, 53, 0x4A701124,0x49B5FECD, + 0x40220000,0x00000000, 54, 0x4AA21348,0xD2ECBEA6, + 0x40220000,0x00000000, 55, 0x4AD455B1,0xED4A567B, + 0x40220000,0x00000000, 56, 0x4B06E068,0x2AF3A14A, + 0x40220000,0x00000000, 57, 0x4B39BC75,0x30521573, + 0x40220000,0x00000000, 58, 0x4B6CF403,0xD65C5822, + 0x40220000,0x00000000, 59, 0x4BA04942,0x2893F193, + 0x40220000,0x00000000, 60, 0x4BD2526A,0x6DA66FC5, + 0x40220000,0x00000000, 61, 0x4C049CB7,0xBB5B3DBE, + 0x40220000,0x00000000, 62, 0x4C37304E,0xB2C6A576, + 0x40220000,0x00000000, 63, 0x4C6A1658,0x891F7A25, + 0x40220000,0x00000000, 64, 0x4C9D5923,0x9A436969, + 0x40220000,0x00000000, 65, 0x4CD08224,0x06C5EB4B, + 0x40220000,0x00000000, 66, 0x4D029268,0x879EA8B5, + 0x40220000,0x00000000, 67, 0x4D34E4B5,0x98927DCB, + 0x40220000,0x00000000, 68, 0x4D67814C,0x4BA4CD85, + 0x40220000,0x00000000, 69, 0x4D9A7175,0xD5196735, + 0x40220000,0x00000000, 70, 0x4DCDBFA4,0x8FBC941C, + 0x40220000,0x00000000, 71, 0x4E00BBCC,0x90DA1350, + 0x40220000,0x00000000, 72, 0x4E32D346,0x22F555BA, + 0x40220000,0x00000000, 73, 0x4E652DAE,0xE7540071, + 0x40220000,0x00000000, 74, 0x4E97D364,0xC43E807F, + 0x40220000,0x00000000, 75, 0x4ECACDD1,0x5CC6508F, + 0x40220000,0x00000000, 76, 0x4EFE278B,0x885F1AA1, + 0x40220000,0x00000000, 77, 0x4F30F63E,0x7CB57EFA, + 0x40220000,0x00000000, 78, 0x4F631506,0x4C4C2EDA, + 0x40220000,0x00000000, 79, 0x4F9577A7,0x15D5B4B5, + 0x40220000,0x00000000, 80, 0x4FC8269B,0xF8906B4B, + 0x40220000,0x00000000, 81, 0x4FFB2B6F,0x77A278B5, + 0x40220000,0x00000000, 82, 0x502E90DD,0x6696C7CB, + 0x40220000,0x00000000, 83, 0x5061317C,0x89B4D062, + 0x40220000,0x00000000, 84, 0x509357AC,0x1AEB6A6F, + 0x40220000,0x00000000, 85, 0x50C5C2A1,0x9E48D7BD, + 0x40220000,0x00000000, 86, 0x50F87AF5,0xD211F2B4, + 0x40220000,0x00000000, 87, 0x512B8A54,0x8C54310B, + 0x40220000,0x00000000, 88, 0x515EFB9F,0x1DDEB72C, + 0x40220000,0x00000000, 89, 0x51916D89,0x80CD4709, + 0x40220000,0x00000000, 90, 0x51C39B3A,0xB0E6EFEA, + 0x40220000,0x00000000, 91, 0x51F60EA2,0x0703CDE7, + 0x40220000,0x00000000, 92, 0x5228D076,0x47E447A4, + 0x40220000,0x00000000, 93, 0x525BEA85,0x10E0D098, + 0x40220000,0x00000000, 94, 0x528F67D5,0xB2FCEAAB, + 0x40220000,0x00000000, 95, 0x52C1AA68,0x34AE4400, + 0x40220000,0x00000000, 96, 0x52F3DFB5,0x3B440C81, + 0x40220000,0x00000000, 97, 0x53265BAB,0xE2AC8E11, + 0x40220000,0x00000000, 98, 0x53592721,0x5F021FD3, + 0x40220000,0x00000000, 99, 0x538C4C05,0x8AE263CD, + 0x40220000,0x00000000, 100, 0x53BFD586,0x3C3EB047, + 0x40220000,0x00000000, 101, 0x53F1E81B,0x81E34328, + 0x40220000,0x00000000, 102, 0x5424251E,0xF21FAB8D, + 0x40220000,0x00000000, 103, 0x5456A9C2,0xD063A0FE, + 0x40220000,0x00000000, 104, 0x54897EFB,0x2A70151E, + 0x40220000,0x00000000, 105, 0x54BCAEDA,0x8FBE17C2, + 0x40220000,0x00000000, 106, 0x54F0225A,0xF0DAED5D, + 0x40220000,0x00000000, 107, 0x552226A6,0x4EF64B09, + 0x40220000,0x00000000, 108, 0x55546B7B,0x18D5146A, + 0x40220000,0x00000000, 109, 0x5586F8EA,0x7BEFB6F7, + 0x40220000,0x00000000, 110, 0x55B9D807,0xCB6DADD6, + 0x40220000,0x00000000, 111, 0x55ED1308,0xC4DB6391, + 0x40220000,0x00000000, 112, 0x56205AB4,0xEEBB6801, + 0x40220000,0x00000000, 113, 0x5652660B,0x8C92D501, + 0x40220000,0x00000000, 114, 0x5684B2CC,0xFE252FA2, + 0x40220000,0x00000000, 115, 0x56B74926,0x9DE9D596, + 0x40220000,0x00000000, 116, 0x56EA324B,0x71A71049, + 0x40220000,0x00000000, 117, 0x571D7894,0xDFDBF252, + 0x40220000,0x00000000, 118, 0x575093D3,0xBDEBB84E, + 0x40220000,0x00000000, 119, 0x5782A64E,0x35A92F58, + 0x40220000,0x00000000, 120, 0x57B4FB17,0xFC5E5543, + 0x40220000,0x00000000, 121, 0x57E79A7A,0xFBEA1FEB, + 0x40220000,0x00000000, 122, 0x581A8DCA,0x5B6763E8, + 0x40220000,0x00000000, 123, 0x584DDF83,0xA6D45065, + 0x40220000,0x00000000, 124, 0x5880CDBA,0x0DD76D39, + 0x40220000,0x00000000, 125, 0x58B2E771,0x4F925AE0, + 0x40220000,0x00000000, 126, 0x58E5445F,0x7984A63C, + 0x40220000,0x00000000, 127, 0x5917ECEB,0x68B53B04, + 0x40220000,0x00000000, 128, 0x594AEA88,0xD5CBE264, + 0x40220000,0x00000000, 129, 0x597E47D9,0xF0855EB1, + 0x40220000,0x00000000, 130, 0x59B1086A,0x974B0543, + 0x40220000,0x00000000, 131, 0x59E32977,0xEA3465EC, + 0x40220000,0x00000000, 132, 0x5A158EA6,0xE77AF2A9, + 0x40220000,0x00000000, 133, 0x5A48407B,0xC46A50FE, + 0x40220000,0x00000000, 134, 0x5A7B488B,0x3CF79B1E, + 0x40220000,0x00000000, 135, 0x5AAEB19C,0xA4968E82, + 0x40220000,0x00000000, 136, 0x5AE143E8,0x1C94B029, + 0x40220000,0x00000000, 137, 0x5B136C65,0x2027462E, + 0x40220000,0x00000000, 138, 0x5B45D9F1,0xC42C2EF4, + 0x40220000,0x00000000, 139, 0x5B78952F,0xFCB1B4D3, + 0x40220000,0x00000000, 140, 0x5BABA7D5,0xFC47EB6D, + 0x40220000,0x00000000, 141, 0x5BDF1CD0,0xBBD0E8DB, + 0x40220000,0x00000000, 142, 0x5C118035,0x69A582FB, + 0x40220000,0x00000000, 143, 0x5C43B03C,0x16DA335A, + 0x40220000,0x00000000, 144, 0x5C762643,0x99B579C6, + 0x40220000,0x00000000, 145, 0x5CA8EB0C,0x0CEC28FE, + 0x40220000,0x00000000, 146, 0x5CDC086D,0x8E89AE1E, + 0x40220000,0x00000000, 147, 0x5D0F897B,0x405AE3E2, + 0x40220000,0x00000000, 148, 0x5D41BD55,0x5433202F, + 0x40220000,0x00000000, 149, 0x5D73F4FF,0xFEB98435, + 0x40220000,0x00000000, 150, 0x5DA6739F,0xFE90B4BB, + 0x40220000,0x00000000, 151, 0x5DD94213,0xFE62CB53, + 0x40220000,0x00000000, 152, 0x5E0C6A56,0x7E2F24BD, + 0x40220000,0x00000000, 153, 0x5E3FF7A1,0x4DF50955, + 0x40220000,0x00000000, 154, 0x5E71FB4A,0xBBD9D540, + 0x40220000,0x00000000, 155, 0x5EA43AB4,0x13550FE8, + 0x40220000,0x00000000, 156, 0x5ED6C20A,0x95BFB1E5, + 0x40220000,0x00000000, 157, 0x5F099A4B,0xE877A821, + 0x40220000,0x00000000, 158, 0x5F3CCD95,0x65869D25, + 0x40220000,0x00000000, 159, 0x5F7033A4,0x091BB865, + 0x40220000,0x00000000, 160, 0x5FA23A18,0x8A3F2F72, + 0x40220000,0x00000000, 161, 0x5FD4815B,0x9B871560, + 0x40220000,0x00000000, 162, 0x60071187,0x0EF7F80C, + 0x40220000,0x00000000, 163, 0x6039F3B7,0xF0D6F70D, + 0x40220000,0x00000000, 164, 0x606D322E,0xEEF1D5EF, + 0x40220000,0x00000000, 165, 0x60A06C3A,0x66680856, + 0x40220000,0x00000000, 166, 0x60D279C1,0xB3350961, + 0x40220000,0x00000000, 167, 0x6104C8F9,0xE99BAA8D, + 0x40220000,0x00000000, 168, 0x61376219,0x26CF1FDF, + 0x40220000,0x00000000, 169, 0x616A4E5C,0x4BA903DB, + 0x40220000,0x00000000, 170, 0x619D9827,0xD51E2456, + 0x40220000,0x00000000, 171, 0x61D0A596,0x67E0F471, + 0x40220000,0x00000000, 172, 0x6202BA49,0x34DD12FF, + 0x40220000,0x00000000, 173, 0x62351192,0x5B78B55F, + 0x40220000,0x00000000, 174, 0x6267B3C4,0xA6E7CC0A, + 0x40220000,0x00000000, 175, 0x629AAA3D,0x3BC4C58C, + 0x40220000,0x00000000, 176, 0x62CDFF84,0xE33D5E3D, + 0x40220000,0x00000000, 177, 0x6300DFBA,0xBFD28502, + 0x40220000,0x00000000, 178, 0x6332FBB2,0x17CCD5A3, + 0x40220000,0x00000000, 179, 0x63655B28,0x5AC67057, + 0x40220000,0x00000000, 180, 0x6398068D,0x661F3E62, + 0x40220000,0x00000000, 181, 0x63CB075F,0x12E3262E, + 0x40220000,0x00000000, 182, 0x63FE684A,0xF53F8AF4, + 0x40220000,0x00000000, 183, 0x64311AAA,0x29F3BE29, + 0x40220000,0x00000000, 184, 0x64633DFF,0x6F3235EE, + 0x40220000,0x00000000, 185, 0x6495A5BF,0x5D187CAC, + 0x40220000,0x00000000, 186, 0x64C85A77,0x48BB8C42, + 0x40220000,0x00000000, 187, 0x64FB65C6,0x31D2FDCA, + 0x40220000,0x00000000, 188, 0x652ED27E,0xF80D5D83, + 0x40220000,0x00000000, 189, 0x65615667,0x6B87849A, + 0x40220000,0x00000000, 190, 0x65938134,0x58F8752D, + 0x40220000,0x00000000, 191, 0x65C5F15A,0xE41783D3, + 0x40220000,0x00000000, 192, 0x65F8AF86,0x409A744D, + 0x40220000,0x00000000, 193, 0x662BC577,0x08ADC2D6, + 0x40220000,0x00000000, 194, 0x665F3E25,0xE9C37B31, + 0x40220000,0x00000000, 195, 0x669192F5,0x537DF54C, + 0x40220000,0x00000000, 196, 0x66C3C553,0xFDEDB3F5, + 0x40220000,0x00000000, 197, 0x66F63DFE,0x7DAB6A74, + 0x40220000,0x00000000, 198, 0x672905BE,0x4D60D7C2, + 0x40220000,0x00000000, 199, 0x675C2676,0x170CF2BB, + 0x40220000,0x00000000, 200, 0x678FAB44,0xD9EE9112, + 0x40220000,0x00000000, 201, 0x67C1D056,0xBA96319A, + 0x40220000,0x00000000, 202, 0x67F40A61,0x91E8F7CD, + 0x40220000,0x00000000, 203, 0x68268BAD,0xC42616C7, + 0x40220000,0x00000000, 204, 0x68595D23,0x7CAAD9A0, + 0x40220000,0x00000000, 205, 0x688C88C7,0xEC4034D4, + 0x40220000,0x00000000, 206, 0x68C00CF0,0x74E41DB7, + 0x40220000,0x00000000, 207, 0x68F20E8E,0x8380A16E, + 0x40220000,0x00000000, 208, 0x69245060,0x53F0B59C, + 0x40220000,0x00000000, 209, 0x6956DA6C,0x5E6ECC4F, + 0x40220000,0x00000000, 210, 0x6989B5B9,0xEA3CA5D9, + 0x40220000,0x00000000, 211, 0x69BCEC71,0x27843A94, + 0x40220000,0x00000000, 212, 0x69F044FF,0xA63A60F3, + 0x40220000,0x00000000, 213, 0x6A224D9F,0x9B01AD12, + 0x40220000,0x00000000, 214, 0x6A549753,0x8E61E2B4, + 0x40220000,0x00000000, 215, 0x6A872A3E,0x002E1F0B, + 0x40220000,0x00000000, 216, 0x6ABA0F85,0xC033E2EC, + 0x40220000,0x00000000, 217, 0x6AED5176,0x783A5F49, + 0x40220000,0x00000000, 218, 0x6B207DD2,0xA3A0D599, + 0x40220000,0x00000000, 219, 0x6B528D8C,0xF814F04D, + 0x40220000,0x00000000, 220, 0x6B84DF3E,0x97178E56, + 0x40220000,0x00000000, 221, 0x6BB77B26,0x69FA8021, + 0x40220000,0x00000000, 222, 0x6BEA6A8B,0x3739D025, + 0x40220000,0x00000000, 223, 0x6C1DB7DC,0x9E210A2A, + 0x40220000,0x00000000, 224, 0x6C50B76C,0x18F295B7, + 0x40220000,0x00000000, 225, 0x6C82CE59,0x9C10E86E, + 0x40220000,0x00000000, 226, 0x6CB52824,0xCF93057C, + 0x40220000,0x00000000, 227, 0x6CE7CD29,0x6985662C, + 0x40220000,0x00000000, 228, 0x6D1AC6CE,0x96B612F1, + 0x40220000,0x00000000, 229, 0x6D4E1FA8,0x698CD54F, + 0x40220000,0x00000000, 230, 0x6D80F1CE,0xBB5F37FD, + 0x40220000,0x00000000, 231, 0x6DB31008,0x92CB1EFC, + 0x40220000,0x00000000, 232, 0x6DE57209,0xA52482DC, + 0x40220000,0x00000000, 233, 0x6E18204A,0xD9C91337, + 0x40220000,0x00000000, 234, 0x6E4B2454,0x3502359E, + 0x40220000,0x00000000, 235, 0x6E7E88DE,0xBBA27C52, + 0x40220000,0x00000000, 236, 0x6EB12CFD,0x498B65EE, + 0x40220000,0x00000000, 237, 0x6EE3529C,0xF2BCD2AC, + 0x40220000,0x00000000, 238, 0x6F15BCF0,0x91146D01, + 0x40220000,0x00000000, 239, 0x6F48748E,0xA336FAA1, + 0x40220000,0x00000000, 240, 0x6F7B8320,0x779DD9F5, + 0x40220000,0x00000000, 241, 0x6FAEF384,0x86919534, + 0x40220000,0x00000000, 242, 0x6FE168FA,0x8BB1E3ED, + 0x40220000,0x00000000, 243, 0x70139619,0xDD28206B, + 0x40220000,0x00000000, 244, 0x704608DD,0x18CD2478, + 0x40220000,0x00000000, 245, 0x7078C9F8,0xBBE6C907, + 0x40220000,0x00000000, 246, 0x70ABE337,0xD363A228, + 0x40220000,0x00000000, 247, 0x70DF5F9E,0xCDD0166D, + 0x40220000,0x00000000, 248, 0x7111A5C9,0x53C50C9E, + 0x40220000,0x00000000, 249, 0x7143DA82,0x7E3DAE31, + 0x40220000,0x00000000, 250, 0x717655D2,0xCE0563F7, + 0x40220000,0x00000000, 251, 0x71A9208D,0x27C61076, + 0x40220000,0x00000000, 252, 0x71DC449E,0xCCBED285, + 0x40220000,0x00000000, 253, 0x720FCD32,0xA656ACD6, + 0x40220000,0x00000000, 254, 0x7241E36C,0x7D90C138, + 0x40220000,0x00000000, 255, 0x72741FDA,0x0D42D95F, + 0x40220000,0x00000000, 256, 0x72A6A3D5,0x4EEB348B, + 0x40220000,0x00000000, 257, 0x72D9784F,0xF8C89B1D, + 0x40220000,0x00000000, 258, 0x730CA759,0xF7E1AE80, + 0x40220000,0x00000000, 259, 0x73401E22,0x9B6EF228, + 0x40220000,0x00000000, 260, 0x737221E6,0xEEDCD06D, + 0x40220000,0x00000000, 261, 0x73A46623,0xCCB86A7B, + 0x40220000,0x00000000, 262, 0x73D6F2E8,0x464F77CA, + 0x40220000,0x00000000, 263, 0x7409D145,0x4F1966C3, + 0x40220000,0x00000000, 264, 0x743D0B6D,0xF8FC939C, + 0x40220000,0x00000000, 265, 0x7470566D,0xDC0E1308, + 0x40220000,0x00000000, 266, 0x74A2613B,0x978FD569, + 0x40220000,0x00000000, 267, 0x74D4AD63,0x0A81D016, + 0x40220000,0x00000000, 268, 0x7507430F,0x6BD20A18, + 0x40220000,0x00000000, 269, 0x753A2B71,0x594C4B5B, + 0x40220000,0x00000000, 270, 0x756D70DF,0x8475D4C7, + 0x40220000,0x00000000, 271, 0x75A08F7D,0xBA8247B0, + 0x40220000,0x00000000, 272, 0x75D2A16D,0x71D290A6, + 0x40220000,0x00000000, 273, 0x7604F59B,0x200CE2BA, + 0x40220000,0x00000000, 274, 0x7637944E,0x840E7F12, + 0x40220000,0x00000000, 275, 0x766A86D8,0x54904EF4, + 0x40220000,0x00000000, 276, 0x769DD7B3,0x5F2258D3, + 0x40220000,0x00000000, 277, 0x76D0C954,0xE58351F6, + 0x40220000,0x00000000, 278, 0x7702E27F,0x8233BC35, + 0x40220000,0x00000000, 279, 0x77353ECF,0x727A33BC, + 0x40220000,0x00000000, 280, 0x7767E6A9,0x60C97A33, + 0x40220000,0x00000000, 281, 0x779AE37E,0x8CE2A97A, + 0x40220000,0x00000000, 282, 0x77CE3FEE,0x5E7EFEA9, + 0x40220000,0x00000000, 283, 0x780103F6,0x15276F3F, + 0x40220000,0x00000000, 284, 0x78332474,0xD7CC5D27, + 0x40220000,0x00000000, 285, 0x78658903,0x72C5E8CC, + 0x40220000,0x00000000, 286, 0x78983A23,0xE11EA5E5, + 0x40220000,0x00000000, 287, 0x78CB4168,0x5D427AA2, + 0x40220000,0x00000000, 288, 0x78FEA995,0x68EAC9F6, + 0x40220000,0x00000000, 289, 0x79313F64,0x0B04119A, + 0x40220000,0x00000000, 290, 0x79636750,0x8C6493CE, + 0x40220000,0x00000000, 291, 0x7995D43A,0x9DF12648, + 0x40220000,0x00000000, 292, 0x79C88EC1,0xF1AF4B10, + 0x40220000,0x00000000, 293, 0x79FBA09A,0x2FE53473, + 0x40220000,0x00000000, 294, 0x7A2F14AD,0x75E1DB01, + 0x40220000,0x00000000, 295, 0x7A617BA1,0x924F0B30, + 0x40220000,0x00000000, 296, 0x7A93AB15,0xC498EC97, + 0x40220000,0x00000000, 297, 0x7AC62078,0x7D2C0A29, + 0x40220000,0x00000000, 298, 0x7AF8E487,0x8CD18B6F, + 0x40220000,0x00000000, 299, 0x7B2C0118,0x7E6BBCDC, + 0x40220000,0x00000000, 300, 0x7B5F813B,0x8E393478, + 0x40240000,0x00000000, 2, 0x40590000,0x00000000, + 0x40240000,0x00000000, 3, 0x408F4000,0x00000000, + 0x40240000,0x00000000, 4, 0x40C38800,0x00000000, + 0x40240000,0x00000000, 5, 0x40F86A00,0x00000000, + 0x40240000,0x00000000, 6, 0x412E8480,0x00000000, + 0x40240000,0x00000000, 7, 0x416312D0,0x00000000, + 0x40240000,0x00000000, 8, 0x4197D784,0x00000000, + 0x40240000,0x00000000, 9, 0x41CDCD65,0x00000000, + 0x40240000,0x00000000, 10, 0x4202A05F,0x20000000, + 0x40240000,0x00000000, 11, 0x42374876,0xE8000000, + 0x40240000,0x00000000, 12, 0x426D1A94,0xA2000000, + 0x40240000,0x00000000, 13, 0x42A2309C,0xE5400000, + 0x40240000,0x00000000, 14, 0x42D6BCC4,0x1E900000, + 0x40240000,0x00000000, 15, 0x430C6BF5,0x26340000, + 0x40240000,0x00000000, 16, 0x4341C379,0x37E08000, + 0x40240000,0x00000000, 17, 0x43763457,0x85D8A000, + 0x40240000,0x00000000, 18, 0x43ABC16D,0x674EC800, + 0x40240000,0x00000000, 19, 0x43E158E4,0x60913D00, + 0x40240000,0x00000000, 20, 0x4415AF1D,0x78B58C40, + 0x40240000,0x00000000, 21, 0x444B1AE4,0xD6E2EF50, + 0x40240000,0x00000000, 22, 0x4480F0CF,0x064DD592, + 0x40240000,0x00000000, 23, 0x44B52D02,0xC7E14AF6, + 0x40240000,0x00000000, 24, 0x44EA7843,0x79D99DB4, + 0x40240000,0x00000000, 25, 0x45208B2A,0x2C280291, + 0x40240000,0x00000000, 26, 0x4554ADF4,0xB7320335, + 0x40240000,0x00000000, 27, 0x4589D971,0xE4FE8402, + 0x40240000,0x00000000, 28, 0x45C027E7,0x2F1F1281, + 0x40240000,0x00000000, 29, 0x45F431E0,0xFAE6D721, + 0x40240000,0x00000000, 30, 0x46293E59,0x39A08CEA, + 0x40240000,0x00000000, 31, 0x465F8DEF,0x8808B024, + 0x40240000,0x00000000, 32, 0x4693B8B5,0xB5056E17, + 0x40240000,0x00000000, 33, 0x46C8A6E3,0x2246C99C, + 0x40240000,0x00000000, 34, 0x46FED09B,0xEAD87C03, + 0x40240000,0x00000000, 35, 0x47334261,0x72C74D82, + 0x40240000,0x00000000, 36, 0x476812F9,0xCF7920E3, + 0x40240000,0x00000000, 37, 0x479E17B8,0x4357691B, + 0x40240000,0x00000000, 38, 0x47D2CED3,0x2A16A1B1, + 0x40240000,0x00000000, 39, 0x48078287,0xF49C4A1D, + 0x40240000,0x00000000, 40, 0x483D6329,0xF1C35CA5, + 0x40240000,0x00000000, 41, 0x48725DFA,0x371A19E7, + 0x40240000,0x00000000, 42, 0x48A6F578,0xC4E0A061, + 0x40240000,0x00000000, 43, 0x48DCB2D6,0xF618C879, + 0x40240000,0x00000000, 44, 0x4911EFC6,0x59CF7D4C, + 0x40240000,0x00000000, 45, 0x49466BB7,0xF0435C9E, + 0x40240000,0x00000000, 46, 0x497C06A5,0xEC5433C6, + 0x40240000,0x00000000, 47, 0x49B18427,0xB3B4A05C, + 0x40240000,0x00000000, 48, 0x49E5E531,0xA0A1C873, + 0x40240000,0x00000000, 49, 0x4A1B5E7E,0x08CA3A8F, + 0x40240000,0x00000000, 50, 0x4A511B0E,0xC57E649A, + 0x40240000,0x00000000, 51, 0x4A8561D2,0x76DDFDC0, + 0x40240000,0x00000000, 52, 0x4ABABA47,0x14957D30, + 0x40240000,0x00000000, 53, 0x4AF0B46C,0x6CDD6E3E, + 0x40240000,0x00000000, 54, 0x4B24E187,0x8814C9CE, + 0x40240000,0x00000000, 55, 0x4B5A19E9,0x6A19FC41, + 0x40240000,0x00000000, 56, 0x4B905031,0xE2503DA9, + 0x40240000,0x00000000, 57, 0x4BC4643E,0x5AE44D13, + 0x40240000,0x00000000, 58, 0x4BF97D4D,0xF19D6057, + 0x40240000,0x00000000, 59, 0x4C2FDCA1,0x6E04B86D, + 0x40240000,0x00000000, 60, 0x4C63E9E4,0xE4C2F344, + 0x40240000,0x00000000, 61, 0x4C98E45E,0x1DF3B015, + 0x40240000,0x00000000, 62, 0x4CCF1D75,0xA5709C1B, + 0x40240000,0x00000000, 63, 0x4D037269,0x87666191, + 0x40240000,0x00000000, 64, 0x4D384F03,0xE93FF9F5, + 0x40240000,0x00000000, 65, 0x4D6E62C4,0xE38FF872, + 0x40240000,0x00000000, 66, 0x4DA2FDBB,0x0E39FB47, + 0x40240000,0x00000000, 67, 0x4DD7BD29,0xD1C87A19, + 0x40240000,0x00000000, 68, 0x4E0DAC74,0x463A989F, + 0x40240000,0x00000000, 69, 0x4E428BC8,0xABE49F64, + 0x40240000,0x00000000, 70, 0x4E772EBA,0xD6DDC73D, + 0x40240000,0x00000000, 71, 0x4EACFA69,0x8C95390C, + 0x40240000,0x00000000, 72, 0x4EE21C81,0xF7DD43A7, + 0x40240000,0x00000000, 73, 0x4F16A3A2,0x75D49491, + 0x40240000,0x00000000, 74, 0x4F4C4C8B,0x1349B9B5, + 0x40240000,0x00000000, 75, 0x4F81AFD6,0xEC0E1411, + 0x40240000,0x00000000, 76, 0x4FB61BCC,0xA7119916, + 0x40240000,0x00000000, 77, 0x4FEBA2BF,0xD0D5FF5B, + 0x40240000,0x00000000, 78, 0x502145B7,0xE285BF99, + 0x40240000,0x00000000, 79, 0x50559725,0xDB272F7F, + 0x40240000,0x00000000, 80, 0x508AFCEF,0x51F0FB5F, + 0x40240000,0x00000000, 81, 0x50C0DE15,0x93369D1B, + 0x40240000,0x00000000, 82, 0x50F5159A,0xF8044462, + 0x40240000,0x00000000, 83, 0x512A5B01,0xB605557B, + 0x40240000,0x00000000, 84, 0x516078E1,0x11C3556D, + 0x40240000,0x00000000, 85, 0x51949719,0x56342AC8, + 0x40240000,0x00000000, 86, 0x51C9BCDF,0xABC1357A, + 0x40240000,0x00000000, 87, 0x5200160B,0xCB58C16C, + 0x40240000,0x00000000, 88, 0x52341B8E,0xBE2EF1C7, + 0x40240000,0x00000000, 89, 0x52692272,0x6DBAAE39, + 0x40240000,0x00000000, 90, 0x529F6B0F,0x092959C7, + 0x40240000,0x00000000, 91, 0x52D3A2E9,0x65B9D81D, + 0x40240000,0x00000000, 92, 0x53088BA3,0xBF284E24, + 0x40240000,0x00000000, 93, 0x533EAE8C,0xAEF261AD, + 0x40240000,0x00000000, 94, 0x53732D17,0xED577D0C, + 0x40240000,0x00000000, 95, 0x53A7F85D,0xE8AD5C4F, + 0x40240000,0x00000000, 96, 0x53DDF675,0x62D8B363, + 0x40240000,0x00000000, 97, 0x5412BA09,0x5DC7701E, + 0x40240000,0x00000000, 98, 0x5447688B,0xB5394C25, + 0x40240000,0x00000000, 99, 0x547D42AE,0xA2879F2E, + 0x40240000,0x00000000, 100, 0x54B249AD,0x2594C37D, + 0x40240000,0x00000000, 101, 0x54E6DC18,0x6EF9F45C, + 0x40240000,0x00000000, 102, 0x551C931E,0x8AB87173, + 0x40240000,0x00000000, 103, 0x5551DBF3,0x16B346E8, + 0x40240000,0x00000000, 104, 0x558652EF,0xDC6018A2, + 0x40240000,0x00000000, 105, 0x55BBE7AB,0xD3781ECA, + 0x40240000,0x00000000, 106, 0x55F170CB,0x642B133F, + 0x40240000,0x00000000, 107, 0x5625CCFE,0x3D35D80E, + 0x40240000,0x00000000, 108, 0x565B403D,0xCC834E12, + 0x40240000,0x00000000, 109, 0x56910826,0x9FD210CB, + 0x40240000,0x00000000, 110, 0x56C54A30,0x47C694FE, + 0x40240000,0x00000000, 111, 0x56FA9CBC,0x59B83A3D, + 0x40240000,0x00000000, 112, 0x5730A1F5,0xB8132466, + 0x40240000,0x00000000, 113, 0x5764CA73,0x2617ED80, + 0x40240000,0x00000000, 114, 0x5799FD0F,0xEF9DE8E0, + 0x40240000,0x00000000, 115, 0x57D03E29,0xF5C2B18C, + 0x40240000,0x00000000, 116, 0x58044DB4,0x73335DEF, + 0x40240000,0x00000000, 117, 0x58396121,0x9000356B, + 0x40240000,0x00000000, 118, 0x586FB969,0xF40042C5, + 0x40240000,0x00000000, 119, 0x58A3D3E2,0x388029BB, + 0x40240000,0x00000000, 120, 0x58D8C8DA,0xC6A0342A, + 0x40240000,0x00000000, 121, 0x590EFB11,0x78484135, + 0x40240000,0x00000000, 122, 0x59435CEA,0xEB2D28C1, + 0x40240000,0x00000000, 123, 0x59783425,0xA5F872F1, + 0x40240000,0x00000000, 124, 0x59AE412F,0x0F768FAD, + 0x40240000,0x00000000, 125, 0x59E2E8BD,0x69AA19CC, + 0x40240000,0x00000000, 126, 0x5A17A2EC,0xC414A03F, + 0x40240000,0x00000000, 127, 0x5A4D8BA7,0xF519C84F, + 0x40240000,0x00000000, 128, 0x5A827748,0xF9301D32, + 0x40240000,0x00000000, 129, 0x5AB7151B,0x377C247E, + 0x40240000,0x00000000, 130, 0x5AECDA62,0x055B2D9E, + 0x40240000,0x00000000, 131, 0x5B22087D,0x4358FC82, + 0x40240000,0x00000000, 132, 0x5B568A9C,0x942F3BA3, + 0x40240000,0x00000000, 133, 0x5B8C2D43,0xB93B0A8C, + 0x40240000,0x00000000, 134, 0x5BC19C4A,0x53C4E697, + 0x40240000,0x00000000, 135, 0x5BF6035C,0xE8B6203D, + 0x40240000,0x00000000, 136, 0x5C2B8434,0x22E3A84D, + 0x40240000,0x00000000, 137, 0x5C6132A0,0x95CE4930, + 0x40240000,0x00000000, 138, 0x5C957F48,0xBB41DB7C, + 0x40240000,0x00000000, 139, 0x5CCADF1A,0xEA12525B, + 0x40240000,0x00000000, 140, 0x5D00CB70,0xD24B7379, + 0x40240000,0x00000000, 141, 0x5D34FE4D,0x06DE5057, + 0x40240000,0x00000000, 142, 0x5D6A3DE0,0x4895E46D, + 0x40240000,0x00000000, 143, 0x5DA066AC,0x2D5DAEC4, + 0x40240000,0x00000000, 144, 0x5DD48057,0x38B51A75, + 0x40240000,0x00000000, 145, 0x5E09A06D,0x06E26112, + 0x40240000,0x00000000, 146, 0x5E400444,0x244D7CAB, + 0x40240000,0x00000000, 147, 0x5E740555,0x2D60DBD6, + 0x40240000,0x00000000, 148, 0x5EA906AA,0x78B912CC, + 0x40240000,0x00000000, 149, 0x5EDF4855,0x16E7577F, + 0x40240000,0x00000000, 150, 0x5F138D35,0x2E5096AF, + 0x40240000,0x00000000, 151, 0x5F487082,0x79E4BC5B, + 0x40240000,0x00000000, 152, 0x5F7E8CA3,0x185DEB72, + 0x40240000,0x00000000, 153, 0x5FB317E5,0xEF3AB327, + 0x40240000,0x00000000, 154, 0x5FE7DDDF,0x6B095FF1, + 0x40240000,0x00000000, 155, 0x601DD557,0x45CBB7ED, + 0x40240000,0x00000000, 156, 0x6052A556,0x8B9F52F4, + 0x40240000,0x00000000, 157, 0x60874EAC,0x2E8727B1, + 0x40240000,0x00000000, 158, 0x60BD2257,0x3A28F19D, + 0x40240000,0x00000000, 159, 0x60F23576,0x84599702, + 0x40240000,0x00000000, 160, 0x6126C2D4,0x256FFCC3, + 0x40240000,0x00000000, 161, 0x615C7389,0x2ECBFBF4, + 0x40240000,0x00000000, 162, 0x6191C835,0xBD3F7D78, + 0x40240000,0x00000000, 163, 0x61C63A43,0x2C8F5CD6, + 0x40240000,0x00000000, 164, 0x61FBC8D3,0xF7B3340C, + 0x40240000,0x00000000, 165, 0x62315D84,0x7AD00087, + 0x40240000,0x00000000, 166, 0x6265B4E5,0x998400A9, + 0x40240000,0x00000000, 167, 0x629B221E,0xFFE500D4, + 0x40240000,0x00000000, 168, 0x62D0F553,0x5FEF2084, + 0x40240000,0x00000000, 169, 0x630532A8,0x37EAE8A5, + 0x40240000,0x00000000, 170, 0x633A7F52,0x45E5A2CF, + 0x40240000,0x00000000, 171, 0x63708F93,0x6BAF85C1, + 0x40240000,0x00000000, 172, 0x63A4B378,0x469B6732, + 0x40240000,0x00000000, 173, 0x63D9E056,0x584240FE, + 0x40240000,0x00000000, 174, 0x64102C35,0xF729689F, + 0x40240000,0x00000000, 175, 0x64443743,0x74F3C2C6, + 0x40240000,0x00000000, 176, 0x64794514,0x5230B378, + 0x40240000,0x00000000, 177, 0x64AF9659,0x66BCE056, + 0x40240000,0x00000000, 178, 0x64E3BDF7,0xE0360C36, + 0x40240000,0x00000000, 179, 0x6518AD75,0xD8438F43, + 0x40240000,0x00000000, 180, 0x654ED8D3,0x4E547314, + 0x40240000,0x00000000, 181, 0x65834784,0x10F4C7EC, + 0x40240000,0x00000000, 182, 0x65B81965,0x1531F9E8, + 0x40240000,0x00000000, 183, 0x65EE1FBE,0x5A7E7861, + 0x40240000,0x00000000, 184, 0x6622D3D6,0xF88F0B3D, + 0x40240000,0x00000000, 185, 0x665788CC,0xB6B2CE0C, + 0x40240000,0x00000000, 186, 0x668D6AFF,0xE45F818F, + 0x40240000,0x00000000, 187, 0x66C262DF,0xEEBBB0F9, + 0x40240000,0x00000000, 188, 0x66F6FB97,0xEA6A9D38, + 0x40240000,0x00000000, 189, 0x672CBA7D,0xE5054486, + 0x40240000,0x00000000, 190, 0x6761F48E,0xAF234AD4, + 0x40240000,0x00000000, 191, 0x679671B2,0x5AEC1D89, + 0x40240000,0x00000000, 192, 0x67CC0E1E,0xF1A724EB, + 0x40240000,0x00000000, 193, 0x680188D3,0x57087713, + 0x40240000,0x00000000, 194, 0x6835EB08,0x2CCA94D7, + 0x40240000,0x00000000, 195, 0x686B65CA,0x37FD3A0D, + 0x40240000,0x00000000, 196, 0x68A11F9E,0x62FE4448, + 0x40240000,0x00000000, 197, 0x68D56785,0xFBBDD55A, + 0x40240000,0x00000000, 198, 0x690AC167,0x7AAD4AB1, + 0x40240000,0x00000000, 199, 0x6940B8E0,0xACAC4EAF, + 0x40240000,0x00000000, 200, 0x6974E718,0xD7D7625A, + 0x40240000,0x00000000, 201, 0x69AA20DF,0x0DCD3AF1, + 0x40240000,0x00000000, 202, 0x69E0548B,0x68A044D6, + 0x40240000,0x00000000, 203, 0x6A1469AE,0x42C8560C, + 0x40240000,0x00000000, 204, 0x6A498419,0xD37A6B8F, + 0x40240000,0x00000000, 205, 0x6A7FE520,0x48590673, + 0x40240000,0x00000000, 206, 0x6AB3EF34,0x2D37A408, + 0x40240000,0x00000000, 207, 0x6AE8EB01,0x38858D0A, + 0x40240000,0x00000000, 208, 0x6B1F25C1,0x86A6F04C, + 0x40240000,0x00000000, 209, 0x6B537798,0xF4285630, + 0x40240000,0x00000000, 210, 0x6B88557F,0x31326BBB, + 0x40240000,0x00000000, 211, 0x6BBE6ADE,0xFD7F06AA, + 0x40240000,0x00000000, 212, 0x6BF302CB,0x5E6F642A, + 0x40240000,0x00000000, 213, 0x6C27C37E,0x360B3D35, + 0x40240000,0x00000000, 214, 0x6C5DB45D,0xC38E0C82, + 0x40240000,0x00000000, 215, 0x6C9290BA,0x9A38C7D1, + 0x40240000,0x00000000, 216, 0x6CC734E9,0x40C6F9C6, + 0x40240000,0x00000000, 217, 0x6CFD0223,0x90F8B837, + 0x40240000,0x00000000, 218, 0x6D322156,0x3A9B7323, + 0x40240000,0x00000000, 219, 0x6D66A9AB,0xC9424FEB, + 0x40240000,0x00000000, 220, 0x6D9C5416,0xBB92E3E6, + 0x40240000,0x00000000, 221, 0x6DD1B48E,0x353BCE70, + 0x40240000,0x00000000, 222, 0x6E0621B1,0xC28AC20C, + 0x40240000,0x00000000, 223, 0x6E3BAA1E,0x332D728F, + 0x40240000,0x00000000, 224, 0x6E714A52,0xDFFC6799, + 0x40240000,0x00000000, 225, 0x6EA59CE7,0x97FB817F, + 0x40240000,0x00000000, 226, 0x6EDB0421,0x7DFA61DF, + 0x40240000,0x00000000, 227, 0x6F10E294,0xEEBC7D2C, + 0x40240000,0x00000000, 228, 0x6F451B3A,0x2A6B9C76, + 0x40240000,0x00000000, 229, 0x6F7A6208,0xB5068394, + 0x40240000,0x00000000, 230, 0x6FB07D45,0x7124123D, + 0x40240000,0x00000000, 231, 0x6FE49C96,0xCD6D16CC, + 0x40240000,0x00000000, 232, 0x7019C3BC,0x80C85C7F, + 0x40240000,0x00000000, 233, 0x70501A55,0xD07D39CF, + 0x40240000,0x00000000, 234, 0x708420EB,0x449C8843, + 0x40240000,0x00000000, 235, 0x70B92926,0x15C3AA54, + 0x40240000,0x00000000, 236, 0x70EF736F,0x9B3494E9, + 0x40240000,0x00000000, 237, 0x7123A825,0xC100DD11, + 0x40240000,0x00000000, 238, 0x7158922F,0x31411456, + 0x40240000,0x00000000, 239, 0x718EB6BA,0xFD91596B, + 0x40240000,0x00000000, 240, 0x71C33234,0xDE7AD7E3, + 0x40240000,0x00000000, 241, 0x71F7FEC2,0x16198DDC, + 0x40240000,0x00000000, 242, 0x722DFE72,0x9B9FF153, + 0x40240000,0x00000000, 243, 0x7262BF07,0xA143F6D4, + 0x40240000,0x00000000, 244, 0x72976EC9,0x8994F489, + 0x40240000,0x00000000, 245, 0x72CD4A7B,0xEBFA31AB, + 0x40240000,0x00000000, 246, 0x73024E8D,0x737C5F0B, + 0x40240000,0x00000000, 247, 0x7336E230,0xD05B76CD, + 0x40240000,0x00000000, 248, 0x736C9ABD,0x04725481, + 0x40240000,0x00000000, 249, 0x73A1E0B6,0x22C774D0, + 0x40240000,0x00000000, 250, 0x73D658E3,0xAB795204, + 0x40240000,0x00000000, 251, 0x740BEF1C,0x9657A686, + 0x40240000,0x00000000, 252, 0x74417571,0xDDF6C814, + 0x40240000,0x00000000, 253, 0x7475D2CE,0x55747A18, + 0x40240000,0x00000000, 254, 0x74AB4781,0xEAD1989E, + 0x40240000,0x00000000, 255, 0x74E10CB1,0x32C2FF63, + 0x40240000,0x00000000, 256, 0x75154FDD,0x7F73BF3C, + 0x40240000,0x00000000, 257, 0x754AA3D4,0xDF50AF0B, + 0x40240000,0x00000000, 258, 0x7580A665,0x0B926D67, + 0x40240000,0x00000000, 259, 0x75B4CFFE,0x4E7708C0, + 0x40240000,0x00000000, 260, 0x75EA03FD,0xE214CAF1, + 0x40240000,0x00000000, 261, 0x7620427E,0xAD4CFED6, + 0x40240000,0x00000000, 262, 0x7654531E,0x58A03E8C, + 0x40240000,0x00000000, 263, 0x768967E5,0xEEC84E2F, + 0x40240000,0x00000000, 264, 0x76BFC1DF,0x6A7A61BB, + 0x40240000,0x00000000, 265, 0x76F3D92B,0xA28C7D15, + 0x40240000,0x00000000, 266, 0x7728CF76,0x8B2F9C5A, + 0x40240000,0x00000000, 267, 0x775F0354,0x2DFB8370, + 0x40240000,0x00000000, 268, 0x77936214,0x9CBD3226, + 0x40240000,0x00000000, 269, 0x77C83A99,0xC3EC7EB0, + 0x40240000,0x00000000, 270, 0x77FE4940,0x34E79E5C, + 0x40240000,0x00000000, 271, 0x7832EDC8,0x2110C2F9, + 0x40240000,0x00000000, 272, 0x7867A93A,0x2954F3B8, + 0x40240000,0x00000000, 273, 0x789D9388,0xB3AA30A5, + 0x40240000,0x00000000, 274, 0x78D27C35,0x704A5E67, + 0x40240000,0x00000000, 275, 0x79071B42,0xCC5CF601, + 0x40240000,0x00000000, 276, 0x793CE213,0x7F743382, + 0x40240000,0x00000000, 277, 0x79720D4C,0x2FA8A031, + 0x40240000,0x00000000, 278, 0x79A6909F,0x3B92C83D, + 0x40240000,0x00000000, 279, 0x79DC34C7,0x0A777A4D, + 0x40240000,0x00000000, 280, 0x7A11A0FC,0x668AAC70, + 0x40240000,0x00000000, 281, 0x7A46093B,0x802D578C, + 0x40240000,0x00000000, 282, 0x7A7B8B8A,0x6038AD6F, + 0x40240000,0x00000000, 283, 0x7AB13736,0x7C236C65, + 0x40240000,0x00000000, 284, 0x7AE58504,0x1B2C477F, + 0x40240000,0x00000000, 285, 0x7B1AE645,0x21F7595E, + 0x40240000,0x00000000, 286, 0x7B50CFEB,0x353A97DB, + 0x40240000,0x00000000, 287, 0x7B8503E6,0x02893DD2, + 0x40240000,0x00000000, 288, 0x7BBA44DF,0x832B8D46, + 0x40240000,0x00000000, 289, 0x7BF06B0B,0xB1FB384C, + 0x40240000,0x00000000, 290, 0x7C2485CE,0x9E7A065F, + 0x40240000,0x00000000, 291, 0x7C59A742,0x461887F6, + 0x40240000,0x00000000, 292, 0x7C900889,0x6BCF54FA, + 0x40240000,0x00000000, 293, 0x7CC40AAB,0xC6C32A38, + 0x40240000,0x00000000, 294, 0x7CF90D56,0xB873F4C7, + 0x40240000,0x00000000, 295, 0x7D2F50AC,0x6690F1F8, + 0x40240000,0x00000000, 296, 0x7D63926B,0xC01A973B, + 0x40240000,0x00000000, 297, 0x7D987706,0xB0213D0A, + 0x40240000,0x00000000, 298, 0x7DCE94C8,0x5C298C4C, + 0x40240000,0x00000000, 299, 0x7E031CFD,0x3999F7B0, + 0x40240000,0x00000000, 300, 0x7E37E43C,0x8800759C, + }; + +LOCAL_D const TUint32 PowerTest3[] = + { + 0x40000000,0x00000000, 2, 0x4016A09E,0x667F3BCD, + 0x40000000,0x00000000, 3, 0x4026A09E,0x667F3BCD, + 0x40000000,0x00000000, 4, 0x4036A09E,0x667F3BCD, + 0x40000000,0x00000000, 5, 0x4046A09E,0x667F3BCD, + 0x40000000,0x00000000, 6, 0x4056A09E,0x667F3BCD, + 0x40000000,0x00000000, 7, 0x4066A09E,0x667F3BCD, + 0x40000000,0x00000000, 8, 0x4076A09E,0x667F3BCD, + 0x40000000,0x00000000, 9, 0x4086A09E,0x667F3BCD, + 0x40000000,0x00000000, 10, 0x4096A09E,0x667F3BCD, + 0x40000000,0x00000000, 11, 0x40A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 12, 0x40B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 13, 0x40C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 14, 0x40D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 15, 0x40E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 16, 0x40F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 17, 0x4106A09E,0x667F3BCD, + 0x40000000,0x00000000, 18, 0x4116A09E,0x667F3BCD, + 0x40000000,0x00000000, 19, 0x4126A09E,0x667F3BCD, + 0x40000000,0x00000000, 20, 0x4136A09E,0x667F3BCD, + 0x40000000,0x00000000, 21, 0x4146A09E,0x667F3BCD, + 0x40000000,0x00000000, 22, 0x4156A09E,0x667F3BCD, + 0x40000000,0x00000000, 23, 0x4166A09E,0x667F3BCD, + 0x40000000,0x00000000, 24, 0x4176A09E,0x667F3BCD, + 0x40000000,0x00000000, 25, 0x4186A09E,0x667F3BCD, + 0x40000000,0x00000000, 26, 0x4196A09E,0x667F3BCD, + 0x40000000,0x00000000, 27, 0x41A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 28, 0x41B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 29, 0x41C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 30, 0x41D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 31, 0x41E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 32, 0x41F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 33, 0x4206A09E,0x667F3BCD, + 0x40000000,0x00000000, 34, 0x4216A09E,0x667F3BCD, + 0x40000000,0x00000000, 35, 0x4226A09E,0x667F3BCD, + 0x40000000,0x00000000, 36, 0x4236A09E,0x667F3BCD, + 0x40000000,0x00000000, 37, 0x4246A09E,0x667F3BCD, + 0x40000000,0x00000000, 38, 0x4256A09E,0x667F3BCD, + 0x40000000,0x00000000, 39, 0x4266A09E,0x667F3BCD, + 0x40000000,0x00000000, 40, 0x4276A09E,0x667F3BCD, + 0x40000000,0x00000000, 41, 0x4286A09E,0x667F3BCD, + 0x40000000,0x00000000, 42, 0x4296A09E,0x667F3BCD, + 0x40000000,0x00000000, 43, 0x42A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 44, 0x42B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 45, 0x42C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 46, 0x42D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 47, 0x42E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 48, 0x42F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 49, 0x4306A09E,0x667F3BCD, + 0x40000000,0x00000000, 50, 0x4316A09E,0x667F3BCD, + 0x40000000,0x00000000, 51, 0x4326A09E,0x667F3BCD, + 0x40000000,0x00000000, 52, 0x4336A09E,0x667F3BCD, + 0x40000000,0x00000000, 53, 0x4346A09E,0x667F3BCD, + 0x40000000,0x00000000, 54, 0x4356A09E,0x667F3BCD, + 0x40000000,0x00000000, 55, 0x4366A09E,0x667F3BCD, + 0x40000000,0x00000000, 56, 0x4376A09E,0x667F3BCD, + 0x40000000,0x00000000, 57, 0x4386A09E,0x667F3BCD, + 0x40000000,0x00000000, 58, 0x4396A09E,0x667F3BCD, + 0x40000000,0x00000000, 59, 0x43A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 60, 0x43B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 61, 0x43C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 62, 0x43D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 63, 0x43E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 64, 0x43F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 65, 0x4406A09E,0x667F3BCD, + 0x40000000,0x00000000, 66, 0x4416A09E,0x667F3BCD, + 0x40000000,0x00000000, 67, 0x4426A09E,0x667F3BCD, + 0x40000000,0x00000000, 68, 0x4436A09E,0x667F3BCD, + 0x40000000,0x00000000, 69, 0x4446A09E,0x667F3BCD, + 0x40000000,0x00000000, 70, 0x4456A09E,0x667F3BCD, + 0x40000000,0x00000000, 71, 0x4466A09E,0x667F3BCD, + 0x40000000,0x00000000, 72, 0x4476A09E,0x667F3BCD, + 0x40000000,0x00000000, 73, 0x4486A09E,0x667F3BCD, + 0x40000000,0x00000000, 74, 0x4496A09E,0x667F3BCD, + 0x40000000,0x00000000, 75, 0x44A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 76, 0x44B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 77, 0x44C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 78, 0x44D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 79, 0x44E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 80, 0x44F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 81, 0x4506A09E,0x667F3BCD, + 0x40000000,0x00000000, 82, 0x4516A09E,0x667F3BCD, + 0x40000000,0x00000000, 83, 0x4526A09E,0x667F3BCD, + 0x40000000,0x00000000, 84, 0x4536A09E,0x667F3BCD, + 0x40000000,0x00000000, 85, 0x4546A09E,0x667F3BCD, + 0x40000000,0x00000000, 86, 0x4556A09E,0x667F3BCD, + 0x40000000,0x00000000, 87, 0x4566A09E,0x667F3BCD, + 0x40000000,0x00000000, 88, 0x4576A09E,0x667F3BCD, + 0x40000000,0x00000000, 89, 0x4586A09E,0x667F3BCD, + 0x40000000,0x00000000, 90, 0x4596A09E,0x667F3BCD, + 0x40000000,0x00000000, 91, 0x45A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 92, 0x45B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 93, 0x45C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 94, 0x45D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 95, 0x45E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 96, 0x45F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 97, 0x4606A09E,0x667F3BCD, + 0x40000000,0x00000000, 98, 0x4616A09E,0x667F3BCD, + 0x40000000,0x00000000, 99, 0x4626A09E,0x667F3BCD, + 0x40000000,0x00000000, 100, 0x4636A09E,0x667F3BCD, + 0x40000000,0x00000000, 101, 0x4646A09E,0x667F3BCD, + 0x40000000,0x00000000, 102, 0x4656A09E,0x667F3BCD, + 0x40000000,0x00000000, 103, 0x4666A09E,0x667F3BCD, + 0x40000000,0x00000000, 104, 0x4676A09E,0x667F3BCD, + 0x40000000,0x00000000, 105, 0x4686A09E,0x667F3BCD, + 0x40000000,0x00000000, 106, 0x4696A09E,0x667F3BCD, + 0x40000000,0x00000000, 107, 0x46A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 108, 0x46B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 109, 0x46C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 110, 0x46D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 111, 0x46E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 112, 0x46F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 113, 0x4706A09E,0x667F3BCD, + 0x40000000,0x00000000, 114, 0x4716A09E,0x667F3BCD, + 0x40000000,0x00000000, 115, 0x4726A09E,0x667F3BCD, + 0x40000000,0x00000000, 116, 0x4736A09E,0x667F3BCD, + 0x40000000,0x00000000, 117, 0x4746A09E,0x667F3BCD, + 0x40000000,0x00000000, 118, 0x4756A09E,0x667F3BCD, + 0x40000000,0x00000000, 119, 0x4766A09E,0x667F3BCD, + 0x40000000,0x00000000, 120, 0x4776A09E,0x667F3BCD, + 0x40000000,0x00000000, 121, 0x4786A09E,0x667F3BCD, + 0x40000000,0x00000000, 122, 0x4796A09E,0x667F3BCD, + 0x40000000,0x00000000, 123, 0x47A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 124, 0x47B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 125, 0x47C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 126, 0x47D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 127, 0x47E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 128, 0x47F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 129, 0x4806A09E,0x667F3BCD, + 0x40000000,0x00000000, 130, 0x4816A09E,0x667F3BCD, + 0x40000000,0x00000000, 131, 0x4826A09E,0x667F3BCD, + 0x40000000,0x00000000, 132, 0x4836A09E,0x667F3BCD, + 0x40000000,0x00000000, 133, 0x4846A09E,0x667F3BCD, + 0x40000000,0x00000000, 134, 0x4856A09E,0x667F3BCD, + 0x40000000,0x00000000, 135, 0x4866A09E,0x667F3BCD, + 0x40000000,0x00000000, 136, 0x4876A09E,0x667F3BCD, + 0x40000000,0x00000000, 137, 0x4886A09E,0x667F3BCD, + 0x40000000,0x00000000, 138, 0x4896A09E,0x667F3BCD, + 0x40000000,0x00000000, 139, 0x48A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 140, 0x48B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 141, 0x48C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 142, 0x48D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 143, 0x48E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 144, 0x48F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 145, 0x4906A09E,0x667F3BCD, + 0x40000000,0x00000000, 146, 0x4916A09E,0x667F3BCD, + 0x40000000,0x00000000, 147, 0x4926A09E,0x667F3BCD, + 0x40000000,0x00000000, 148, 0x4936A09E,0x667F3BCD, + 0x40000000,0x00000000, 149, 0x4946A09E,0x667F3BCD, + 0x40000000,0x00000000, 150, 0x4956A09E,0x667F3BCD, + 0x40000000,0x00000000, 151, 0x4966A09E,0x667F3BCD, + 0x40000000,0x00000000, 152, 0x4976A09E,0x667F3BCD, + 0x40000000,0x00000000, 153, 0x4986A09E,0x667F3BCD, + 0x40000000,0x00000000, 154, 0x4996A09E,0x667F3BCD, + 0x40000000,0x00000000, 155, 0x49A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 156, 0x49B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 157, 0x49C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 158, 0x49D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 159, 0x49E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 160, 0x49F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 161, 0x4A06A09E,0x667F3BCD, + 0x40000000,0x00000000, 162, 0x4A16A09E,0x667F3BCD, + 0x40000000,0x00000000, 163, 0x4A26A09E,0x667F3BCD, + 0x40000000,0x00000000, 164, 0x4A36A09E,0x667F3BCD, + 0x40000000,0x00000000, 165, 0x4A46A09E,0x667F3BCD, + 0x40000000,0x00000000, 166, 0x4A56A09E,0x667F3BCD, + 0x40000000,0x00000000, 167, 0x4A66A09E,0x667F3BCD, + 0x40000000,0x00000000, 168, 0x4A76A09E,0x667F3BCD, + 0x40000000,0x00000000, 169, 0x4A86A09E,0x667F3BCD, + 0x40000000,0x00000000, 170, 0x4A96A09E,0x667F3BCD, + 0x40000000,0x00000000, 171, 0x4AA6A09E,0x667F3BCD, + 0x40000000,0x00000000, 172, 0x4AB6A09E,0x667F3BCD, + 0x40000000,0x00000000, 173, 0x4AC6A09E,0x667F3BCD, + 0x40000000,0x00000000, 174, 0x4AD6A09E,0x667F3BCD, + 0x40000000,0x00000000, 175, 0x4AE6A09E,0x667F3BCD, + 0x40000000,0x00000000, 176, 0x4AF6A09E,0x667F3BCD, + 0x40000000,0x00000000, 177, 0x4B06A09E,0x667F3BCD, + 0x40000000,0x00000000, 178, 0x4B16A09E,0x667F3BCD, + 0x40000000,0x00000000, 179, 0x4B26A09E,0x667F3BCD, + 0x40000000,0x00000000, 180, 0x4B36A09E,0x667F3BCD, + 0x40000000,0x00000000, 181, 0x4B46A09E,0x667F3BCD, + 0x40000000,0x00000000, 182, 0x4B56A09E,0x667F3BCD, + 0x40000000,0x00000000, 183, 0x4B66A09E,0x667F3BCD, + 0x40000000,0x00000000, 184, 0x4B76A09E,0x667F3BCD, + 0x40000000,0x00000000, 185, 0x4B86A09E,0x667F3BCD, + 0x40000000,0x00000000, 186, 0x4B96A09E,0x667F3BCD, + 0x40000000,0x00000000, 187, 0x4BA6A09E,0x667F3BCD, + 0x40000000,0x00000000, 188, 0x4BB6A09E,0x667F3BCD, + 0x40000000,0x00000000, 189, 0x4BC6A09E,0x667F3BCD, + 0x40000000,0x00000000, 190, 0x4BD6A09E,0x667F3BCD, + 0x40000000,0x00000000, 191, 0x4BE6A09E,0x667F3BCD, + 0x40000000,0x00000000, 192, 0x4BF6A09E,0x667F3BCD, + 0x40000000,0x00000000, 193, 0x4C06A09E,0x667F3BCD, + 0x40000000,0x00000000, 194, 0x4C16A09E,0x667F3BCD, + 0x40000000,0x00000000, 195, 0x4C26A09E,0x667F3BCD, + 0x40000000,0x00000000, 196, 0x4C36A09E,0x667F3BCD, + 0x40000000,0x00000000, 197, 0x4C46A09E,0x667F3BCD, + 0x40000000,0x00000000, 198, 0x4C56A09E,0x667F3BCD, + 0x40000000,0x00000000, 199, 0x4C66A09E,0x667F3BCD, + 0x40000000,0x00000000, 200, 0x4C76A09E,0x667F3BCD, + 0x40000000,0x00000000, 201, 0x4C86A09E,0x667F3BCD, + 0x40000000,0x00000000, 202, 0x4C96A09E,0x667F3BCD, + 0x40000000,0x00000000, 203, 0x4CA6A09E,0x667F3BCD, + 0x40000000,0x00000000, 204, 0x4CB6A09E,0x667F3BCD, + 0x40000000,0x00000000, 205, 0x4CC6A09E,0x667F3BCD, + 0x40000000,0x00000000, 206, 0x4CD6A09E,0x667F3BCD, + 0x40000000,0x00000000, 207, 0x4CE6A09E,0x667F3BCD, + 0x40000000,0x00000000, 208, 0x4CF6A09E,0x667F3BCD, + 0x40000000,0x00000000, 209, 0x4D06A09E,0x667F3BCD, + 0x40000000,0x00000000, 210, 0x4D16A09E,0x667F3BCD, + 0x40000000,0x00000000, 211, 0x4D26A09E,0x667F3BCD, + 0x40000000,0x00000000, 212, 0x4D36A09E,0x667F3BCD, + 0x40000000,0x00000000, 213, 0x4D46A09E,0x667F3BCD, + 0x40000000,0x00000000, 214, 0x4D56A09E,0x667F3BCD, + 0x40000000,0x00000000, 215, 0x4D66A09E,0x667F3BCD, + 0x40000000,0x00000000, 216, 0x4D76A09E,0x667F3BCD, + 0x40000000,0x00000000, 217, 0x4D86A09E,0x667F3BCD, + 0x40000000,0x00000000, 218, 0x4D96A09E,0x667F3BCD, + 0x40000000,0x00000000, 219, 0x4DA6A09E,0x667F3BCD, + 0x40000000,0x00000000, 220, 0x4DB6A09E,0x667F3BCD, + 0x40000000,0x00000000, 221, 0x4DC6A09E,0x667F3BCD, + 0x40000000,0x00000000, 222, 0x4DD6A09E,0x667F3BCD, + 0x40000000,0x00000000, 223, 0x4DE6A09E,0x667F3BCD, + 0x40000000,0x00000000, 224, 0x4DF6A09E,0x667F3BCD, + 0x40000000,0x00000000, 225, 0x4E06A09E,0x667F3BCD, + 0x40000000,0x00000000, 226, 0x4E16A09E,0x667F3BCD, + 0x40000000,0x00000000, 227, 0x4E26A09E,0x667F3BCD, + 0x40000000,0x00000000, 228, 0x4E36A09E,0x667F3BCD, + 0x40000000,0x00000000, 229, 0x4E46A09E,0x667F3BCD, + 0x40000000,0x00000000, 230, 0x4E56A09E,0x667F3BCD, + 0x40000000,0x00000000, 231, 0x4E66A09E,0x667F3BCD, + 0x40000000,0x00000000, 232, 0x4E76A09E,0x667F3BCD, + 0x40000000,0x00000000, 233, 0x4E86A09E,0x667F3BCD, + 0x40000000,0x00000000, 234, 0x4E96A09E,0x667F3BCD, + 0x40000000,0x00000000, 235, 0x4EA6A09E,0x667F3BCD, + 0x40000000,0x00000000, 236, 0x4EB6A09E,0x667F3BCD, + 0x40000000,0x00000000, 237, 0x4EC6A09E,0x667F3BCD, + 0x40000000,0x00000000, 238, 0x4ED6A09E,0x667F3BCD, + 0x40000000,0x00000000, 239, 0x4EE6A09E,0x667F3BCD, + 0x40000000,0x00000000, 240, 0x4EF6A09E,0x667F3BCD, + 0x40000000,0x00000000, 241, 0x4F06A09E,0x667F3BCD, + 0x40000000,0x00000000, 242, 0x4F16A09E,0x667F3BCD, + 0x40000000,0x00000000, 243, 0x4F26A09E,0x667F3BCD, + 0x40000000,0x00000000, 244, 0x4F36A09E,0x667F3BCD, + 0x40000000,0x00000000, 245, 0x4F46A09E,0x667F3BCD, + 0x40000000,0x00000000, 246, 0x4F56A09E,0x667F3BCD, + 0x40000000,0x00000000, 247, 0x4F66A09E,0x667F3BCD, + 0x40000000,0x00000000, 248, 0x4F76A09E,0x667F3BCD, + 0x40000000,0x00000000, 249, 0x4F86A09E,0x667F3BCD, + 0x40000000,0x00000000, 250, 0x4F96A09E,0x667F3BCD, + 0x40000000,0x00000000, 251, 0x4FA6A09E,0x667F3BCD, + 0x40000000,0x00000000, 252, 0x4FB6A09E,0x667F3BCD, + 0x40000000,0x00000000, 253, 0x4FC6A09E,0x667F3BCD, + 0x40000000,0x00000000, 254, 0x4FD6A09E,0x667F3BCD, + 0x40000000,0x00000000, 255, 0x4FE6A09E,0x667F3BCD, + 0x40000000,0x00000000, 256, 0x4FF6A09E,0x667F3BCD, + 0x40000000,0x00000000, 257, 0x5006A09E,0x667F3BCD, + 0x40000000,0x00000000, 258, 0x5016A09E,0x667F3BCD, + 0x40000000,0x00000000, 259, 0x5026A09E,0x667F3BCD, + 0x40000000,0x00000000, 260, 0x5036A09E,0x667F3BCD, + 0x40000000,0x00000000, 261, 0x5046A09E,0x667F3BCD, + 0x40000000,0x00000000, 262, 0x5056A09E,0x667F3BCD, + 0x40000000,0x00000000, 263, 0x5066A09E,0x667F3BCD, + 0x40000000,0x00000000, 264, 0x5076A09E,0x667F3BCD, + 0x40000000,0x00000000, 265, 0x5086A09E,0x667F3BCD, + 0x40000000,0x00000000, 266, 0x5096A09E,0x667F3BCD, + 0x40000000,0x00000000, 267, 0x50A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 268, 0x50B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 269, 0x50C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 270, 0x50D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 271, 0x50E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 272, 0x50F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 273, 0x5106A09E,0x667F3BCD, + 0x40000000,0x00000000, 274, 0x5116A09E,0x667F3BCD, + 0x40000000,0x00000000, 275, 0x5126A09E,0x667F3BCD, + 0x40000000,0x00000000, 276, 0x5136A09E,0x667F3BCD, + 0x40000000,0x00000000, 277, 0x5146A09E,0x667F3BCD, + 0x40000000,0x00000000, 278, 0x5156A09E,0x667F3BCD, + 0x40000000,0x00000000, 279, 0x5166A09E,0x667F3BCD, + 0x40000000,0x00000000, 280, 0x5176A09E,0x667F3BCD, + 0x40000000,0x00000000, 281, 0x5186A09E,0x667F3BCD, + 0x40000000,0x00000000, 282, 0x5196A09E,0x667F3BCD, + 0x40000000,0x00000000, 283, 0x51A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 284, 0x51B6A09E,0x667F3BCD, + 0x40000000,0x00000000, 285, 0x51C6A09E,0x667F3BCD, + 0x40000000,0x00000000, 286, 0x51D6A09E,0x667F3BCD, + 0x40000000,0x00000000, 287, 0x51E6A09E,0x667F3BCD, + 0x40000000,0x00000000, 288, 0x51F6A09E,0x667F3BCD, + 0x40000000,0x00000000, 289, 0x5206A09E,0x667F3BCD, + 0x40000000,0x00000000, 290, 0x5216A09E,0x667F3BCD, + 0x40000000,0x00000000, 291, 0x5226A09E,0x667F3BCD, + 0x40000000,0x00000000, 292, 0x5236A09E,0x667F3BCD, + 0x40000000,0x00000000, 293, 0x5246A09E,0x667F3BCD, + 0x40000000,0x00000000, 294, 0x5256A09E,0x667F3BCD, + 0x40000000,0x00000000, 295, 0x5266A09E,0x667F3BCD, + 0x40000000,0x00000000, 296, 0x5276A09E,0x667F3BCD, + 0x40000000,0x00000000, 297, 0x5286A09E,0x667F3BCD, + 0x40000000,0x00000000, 298, 0x5296A09E,0x667F3BCD, + 0x40000000,0x00000000, 299, 0x52A6A09E,0x667F3BCD, + 0x40000000,0x00000000, 300, 0x52B6A09E,0x667F3BCD, + 0x40080000,0x00000000, 2, 0x402F2D4A,0x45635640, + 0x40080000,0x00000000, 3, 0x404761F7,0xB40A80B0, + 0x40080000,0x00000000, 4, 0x40618979,0xC707E084, + 0x40080000,0x00000000, 5, 0x407A4E36,0xAA8BD0C6, + 0x40080000,0x00000000, 6, 0x4093BAA8,0xFFE8DC94, + 0x40080000,0x00000000, 7, 0x40AD97FD,0x7FDD4ADF, + 0x40080000,0x00000000, 8, 0x40C631FE,0x1FE5F827, + 0x40080000,0x00000000, 9, 0x40E0A57E,0x97EC7A1D, + 0x40080000,0x00000000, 10, 0x40F8F83D,0xE3E2B72C, + 0x40080000,0x00000000, 11, 0x4112BA2E,0x6AEA0961, + 0x40080000,0x00000000, 12, 0x412C1745,0xA05F0E11, + 0x40080000,0x00000000, 13, 0x41451174,0x38474A8D, + 0x40080000,0x00000000, 14, 0x415F9A2E,0x546AEFD3, + 0x40080000,0x00000000, 15, 0x4177B3A2,0xBF5033DF, + 0x40080000,0x00000000, 16, 0x4191C6BA,0x0F7C26E7, + 0x40080000,0x00000000, 17, 0x41AAAA17,0x173A3A5A, + 0x40080000,0x00000000, 18, 0x41C3FF91,0x516BABC4, + 0x40080000,0x00000000, 19, 0x41DDFF59,0xFA2181A6, + 0x40080000,0x00000000, 20, 0x41F67F83,0x7B99213C, + 0x40080000,0x00000000, 21, 0x4210DFA2,0x9CB2D8ED, + 0x40080000,0x00000000, 22, 0x42294F73,0xEB0C4564, + 0x40080000,0x00000000, 23, 0x4242FB96,0xF049340B, + 0x40080000,0x00000000, 24, 0x425C7962,0x686DCE10, + 0x40080000,0x00000000, 25, 0x42755B09,0xCE525A8C, + 0x40080000,0x00000000, 26, 0x42900447,0x5ABDC3E9, + 0x40080000,0x00000000, 27, 0x42A8066B,0x081CA5DE, + 0x40080000,0x00000000, 28, 0x42C204D0,0x46157C66, + 0x40080000,0x00000000, 29, 0x42DB0738,0x69203A99, + 0x40080000,0x00000000, 30, 0x42F4456A,0x4ED82BF3, + 0x40080000,0x00000000, 31, 0x430E681F,0x764441ED, + 0x40080000,0x00000000, 32, 0x4326CE17,0x98B33171, + 0x40080000,0x00000000, 33, 0x43411A91,0xB2866515, + 0x40080000,0x00000000, 34, 0x4359A7DA,0x8BC997A0, + 0x40080000,0x00000000, 35, 0x43733DE3,0xE8D731B8, + 0x40080000,0x00000000, 36, 0x438CDCD5,0xDD42CA94, + 0x40080000,0x00000000, 37, 0x43A5A5A0,0x65F217EF, + 0x40080000,0x00000000, 38, 0x43C03C38,0x4C7591F3, + 0x40080000,0x00000000, 39, 0x43D85A54,0x72B05AED, + 0x40080000,0x00000000, 40, 0x43F243BF,0x56044431, + 0x40080000,0x00000000, 41, 0x440B659F,0x0106664A, + 0x40080000,0x00000000, 42, 0x44248C37,0x40C4CCB8, + 0x40080000,0x00000000, 43, 0x443ED252,0xE1273313, + 0x40080000,0x00000000, 44, 0x44571DBE,0x28DD664E, + 0x40080000,0x00000000, 45, 0x4471564E,0x9EA60CBB, + 0x40080000,0x00000000, 46, 0x448A0175,0xEDF91318, + 0x40080000,0x00000000, 47, 0x44A38118,0x727ACE52, + 0x40080000,0x00000000, 48, 0x44BD41A4,0xABB8357B, + 0x40080000,0x00000000, 49, 0x44D5F13B,0x80CA281D, + 0x40080000,0x00000000, 50, 0x44F074EC,0xA0979E15, + 0x40080000,0x00000000, 51, 0x4508AF62,0xF0E36D20, + 0x40080000,0x00000000, 52, 0x4522838A,0x34AA91D8, + 0x40080000,0x00000000, 53, 0x453BC54F,0x4EFFDAC4, + 0x40080000,0x00000000, 54, 0x4554D3FB,0x7B3FE413, + 0x40080000,0x00000000, 55, 0x456F3DF9,0x38DFD61D, + 0x40080000,0x00000000, 56, 0x45876E7A,0xEAA7E095, + 0x40080000,0x00000000, 57, 0x45A192DC,0x2FFDE870, + 0x40080000,0x00000000, 58, 0x45BA5C4A,0x47FCDCA8, + 0x40080000,0x00000000, 59, 0x45D3C537,0xB5FDA57E, + 0x40080000,0x00000000, 60, 0x45EDA7D3,0x90FC783D, + 0x40080000,0x00000000, 61, 0x46063DDE,0xACBD5A2E, + 0x40080000,0x00000000, 62, 0x4620AE67,0x018E03A2, + 0x40080000,0x00000000, 63, 0x4639059A,0x82550574, + 0x40080000,0x00000000, 64, 0x4652C433,0xE1BFC417, + 0x40080000,0x00000000, 65, 0x466C264D,0xD29FA622, + 0x40080000,0x00000000, 66, 0x46851CBA,0x5DF7BC9A, + 0x40080000,0x00000000, 67, 0x469FAB17,0x8CF39AE6, + 0x40080000,0x00000000, 68, 0x46B7C051,0xA9B6B42D, + 0x40080000,0x00000000, 69, 0x46D1D03D,0x3F490722, + 0x40080000,0x00000000, 70, 0x46EAB85B,0xDEED8AB2, + 0x40080000,0x00000000, 71, 0x47040A44,0xE7322806, + 0x40080000,0x00000000, 72, 0x471E0F67,0x5ACB3C09, + 0x40080000,0x00000000, 73, 0x47368B8D,0x84186D06, + 0x40080000,0x00000000, 74, 0x4750E8AA,0x231251C5, + 0x40080000,0x00000000, 75, 0x47695CFF,0x349B7AA7, + 0x40080000,0x00000000, 76, 0x478305BF,0x67749BFD, + 0x40080000,0x00000000, 77, 0x479C889F,0x1B2EE9FC, + 0x40080000,0x00000000, 78, 0x47B56677,0x54632F7D, + 0x40080000,0x00000000, 79, 0x47D00CD9,0x7F4A639E, + 0x40080000,0x00000000, 80, 0x47E81346,0x3EEF956D, + 0x40080000,0x00000000, 81, 0x48020E74,0xAF33B012, + 0x40080000,0x00000000, 82, 0x481B15AF,0x06CD881A, + 0x40080000,0x00000000, 83, 0x48345043,0x451A2614, + 0x40080000,0x00000000, 84, 0x484E7864,0xE7A7391E, + 0x40080000,0x00000000, 85, 0x4866DA4B,0xADBD6AD6, + 0x40080000,0x00000000, 86, 0x488123B8,0xC24E1021, + 0x40080000,0x00000000, 87, 0x4899B595,0x23751831, + 0x40080000,0x00000000, 88, 0x48B3482F,0xDA97D225, + 0x40080000,0x00000000, 89, 0x48CCEC47,0xC7E3BB37, + 0x40080000,0x00000000, 90, 0x48E5B135,0xD5EACC69, + 0x40080000,0x00000000, 91, 0x490044E8,0x6070194F, + 0x40080000,0x00000000, 92, 0x4918675C,0x90A825F7, + 0x40080000,0x00000000, 93, 0x49324D85,0x6C7E1C79, + 0x40080000,0x00000000, 94, 0x494B7448,0x22BD2AB5, + 0x40080000,0x00000000, 95, 0x49649736,0x1A0DE008, + 0x40080000,0x00000000, 96, 0x497EE2D1,0x2714D00C, + 0x40080000,0x00000000, 97, 0x49972A1C,0xDD4F9C09, + 0x40080000,0x00000000, 98, 0x49B15F95,0xA5FBB507, + 0x40080000,0x00000000, 99, 0x49CA0F60,0x78F98F8A, + 0x40080000,0x00000000, 100, 0x49E38B88,0x5ABB2BA8, + 0x40080000,0x00000000, 101, 0x49FD514C,0x8818C17B, + 0x40080000,0x00000000, 102, 0x4A15FCF9,0x6612911D, + 0x40080000,0x00000000, 103, 0x4A307DBB,0x0C8DECD5, + 0x40080000,0x00000000, 104, 0x4A48BC98,0x92D4E340, + 0x40080000,0x00000000, 105, 0x4A628D72,0x6E1FAA70, + 0x40080000,0x00000000, 106, 0x4A7BD42B,0xA52F7FA8, + 0x40080000,0x00000000, 107, 0x4A94DF20,0xBBE39FBE, + 0x40080000,0x00000000, 108, 0x4AAF4EB1,0x19D56F9D, + 0x40080000,0x00000000, 109, 0x4AC77B04,0xD36013B6, + 0x40080000,0x00000000, 110, 0x4AE19C43,0x9E880EC8, + 0x40080000,0x00000000, 111, 0x4AFA6A65,0x6DCC162D, + 0x40080000,0x00000000, 112, 0x4B13CFCC,0x125910A1, + 0x40080000,0x00000000, 113, 0x4B2DB7B2,0x1B8598F2, + 0x40080000,0x00000000, 114, 0x4B4649C5,0x94A432B6, + 0x40080000,0x00000000, 115, 0x4B60B754,0x2F7B2608, + 0x40080000,0x00000000, 116, 0x4B7912FE,0x4738B90C, + 0x40080000,0x00000000, 117, 0x4B92CE3E,0xB56A8AC9, + 0x40080000,0x00000000, 118, 0x4BAC355E,0x101FD02E, + 0x40080000,0x00000000, 119, 0x4BC52806,0x8C17DC22, + 0x40080000,0x00000000, 120, 0x4BDFBC09,0xD223CA34, + 0x40080000,0x00000000, 121, 0x4BF7CD07,0x5D9AD7A7, + 0x40080000,0x00000000, 122, 0x4C11D9C5,0x863421BD, + 0x40080000,0x00000000, 123, 0x4C2AC6A8,0x494E329C, + 0x40080000,0x00000000, 124, 0x4C4414FE,0x36FAA5F5, + 0x40080000,0x00000000, 125, 0x4C5E1F7D,0x5277F8EF, + 0x40080000,0x00000000, 126, 0x4C76979D,0xFDD9FAB3, + 0x40080000,0x00000000, 127, 0x4C90F1B6,0x7E637C06, + 0x40080000,0x00000000, 128, 0x4CA96A91,0xBD953A0A, + 0x40080000,0x00000000, 129, 0x4CC30FED,0x4E2FEB87, + 0x40080000,0x00000000, 130, 0x4CDC97E3,0xF547E14B, + 0x40080000,0x00000000, 131, 0x4CF571EA,0xF7F5E8F8, + 0x40080000,0x00000000, 132, 0x4D101570,0x39F86EBA, + 0x40080000,0x00000000, 133, 0x4D282028,0x56F4A617, + 0x40080000,0x00000000, 134, 0x4D42181E,0x41377C91, + 0x40080000,0x00000000, 135, 0x4D5B242D,0x61D33ADA, + 0x40080000,0x00000000, 136, 0x4D745B22,0x095E6C24, + 0x40080000,0x00000000, 137, 0x4D8E88B3,0x0E0DA235, + 0x40080000,0x00000000, 138, 0x4DA6E686,0x4A8A39A8, + 0x40080000,0x00000000, 139, 0x4DC12CE4,0xB7E7AB3E, + 0x40080000,0x00000000, 140, 0x4DD9C357,0x13DB80DD, + 0x40080000,0x00000000, 141, 0x4DF35281,0x4EE4A0A6, + 0x40080000,0x00000000, 142, 0x4E0CFBC1,0xF656F0F9, + 0x40080000,0x00000000, 143, 0x4E25BCD1,0x78C134BA, + 0x40080000,0x00000000, 144, 0x4E404D9D,0x1A90E78C, + 0x40080000,0x00000000, 145, 0x4E58746B,0xA7D95B52, + 0x40080000,0x00000000, 146, 0x4E725750,0xBDE3047D, + 0x40080000,0x00000000, 147, 0x4E8B82F9,0x1CD486BC, + 0x40080000,0x00000000, 148, 0x4EA4A23A,0xD59F650D, + 0x40080000,0x00000000, 149, 0x4EBEF358,0x406F1793, + 0x40080000,0x00000000, 150, 0x4ED73682,0x305351AF, + 0x40080000,0x00000000, 151, 0x4EF168E1,0xA43E7D43, + 0x40080000,0x00000000, 152, 0x4F0A1D52,0x765DBBE4, + 0x40080000,0x00000000, 153, 0x4F2395FD,0xD8C64CEB, + 0x40080000,0x00000000, 154, 0x4F3D60FC,0xC5297361, + 0x40080000,0x00000000, 155, 0x4F5608BD,0x93DF1689, + 0x40080000,0x00000000, 156, 0x4F70868E,0x2EE750E7, + 0x40080000,0x00000000, 157, 0x4F88C9D5,0x465AF95A, + 0x40080000,0x00000000, 158, 0x4FA2975F,0xF4C43B03, + 0x40080000,0x00000000, 159, 0x4FBBE30F,0xEF265885, + 0x40080000,0x00000000, 160, 0x4FD4EA4B,0xF35CC264, + 0x40080000,0x00000000, 161, 0x4FEF5F71,0xED0B2396, + 0x40080000,0x00000000, 162, 0x50078795,0x71C85AB0, + 0x40080000,0x00000000, 163, 0x5021A5B0,0x15564404, + 0x40080000,0x00000000, 164, 0x503A7888,0x20016606, + 0x40080000,0x00000000, 165, 0x5053DA66,0x18010C85, + 0x40080000,0x00000000, 166, 0x506DC799,0x240192C7, + 0x40080000,0x00000000, 167, 0x508655B2,0xDB012E15, + 0x40080000,0x00000000, 168, 0x50A0C046,0x2440E290, + 0x40080000,0x00000000, 169, 0x50B92069,0x366153D8, + 0x40080000,0x00000000, 170, 0x50D2D84E,0xE8C8FEE2, + 0x40080000,0x00000000, 171, 0x50EC4476,0x5D2D7E53, + 0x40080000,0x00000000, 172, 0x51053358,0xC5E21EBE, + 0x40080000,0x00000000, 173, 0x511FCD05,0x28D32E1D, + 0x40080000,0x00000000, 174, 0x5137D9C3,0xDE9E6296, + 0x40080000,0x00000000, 175, 0x5151E352,0xE6F6C9F1, + 0x40080000,0x00000000, 176, 0x516AD4FC,0x5A722EE9, + 0x40080000,0x00000000, 177, 0x51841FBD,0x43D5A32F, + 0x40080000,0x00000000, 178, 0x519E2F9B,0xE5C074C6, + 0x40080000,0x00000000, 179, 0x51B6A3B4,0xEC505794, + 0x40080000,0x00000000, 180, 0x51D0FAC7,0xB13C41AF, + 0x40080000,0x00000000, 181, 0x51E9782B,0x89DA6287, + 0x40080000,0x00000000, 182, 0x52031A20,0xA763C9E5, + 0x40080000,0x00000000, 183, 0x521CA730,0xFB15AED8, + 0x40080000,0x00000000, 184, 0x52357D64,0xBC504322, + 0x40080000,0x00000000, 185, 0x52501E0B,0x8D3C3259, + 0x40080000,0x00000000, 186, 0x52682D11,0x53DA4B86, + 0x40080000,0x00000000, 187, 0x528221CC,0xFEE3B8A5, + 0x40080000,0x00000000, 188, 0x529B32B3,0x7E5594F7, + 0x40080000,0x00000000, 189, 0x52B46606,0x9EC02FB9, + 0x40080000,0x00000000, 190, 0x52CE9909,0xEE204796, + 0x40080000,0x00000000, 191, 0x52E6F2C7,0x729835B0, + 0x40080000,0x00000000, 192, 0x53013615,0x95F22844, + 0x40080000,0x00000000, 193, 0x5319D120,0x60EB3C66, + 0x40080000,0x00000000, 194, 0x53335CD8,0x48B06D4D, + 0x40080000,0x00000000, 195, 0x534D0B44,0x6D08A3F3, + 0x40080000,0x00000000, 196, 0x5365C873,0x51C67AF6, + 0x40080000,0x00000000, 197, 0x53805656,0x7D54DC39, + 0x40080000,0x00000000, 198, 0x53988181,0xBBFF4A55, + 0x40080000,0x00000000, 199, 0x53B26121,0x4CFF77C0, + 0x40080000,0x00000000, 200, 0x53CB91B1,0xF37F33A0, + 0x40080000,0x00000000, 201, 0x53E4AD45,0x769F66B8, + 0x40080000,0x00000000, 202, 0x53FF03E8,0x31EF1A14, + 0x40080000,0x00000000, 203, 0x541742EE,0x2573538F, + 0x40080000,0x00000000, 204, 0x54317232,0x9C167EAB, + 0x40080000,0x00000000, 205, 0x544A2B4B,0xEA21BE01, + 0x40080000,0x00000000, 206, 0x5463A078,0xEF994E80, + 0x40080000,0x00000000, 207, 0x547D70B5,0x6765F5C1, + 0x40080000,0x00000000, 208, 0x54961488,0x0D8C7851, + 0x40080000,0x00000000, 209, 0x54B08F66,0x0A295A3C, + 0x40080000,0x00000000, 210, 0x54C8D719,0x0F3E075B, + 0x40080000,0x00000000, 211, 0x54E2A152,0xCB6E8584, + 0x40080000,0x00000000, 212, 0x54FBF1FC,0x3125C846, + 0x40080000,0x00000000, 213, 0x5514F57D,0x24DC5634, + 0x40080000,0x00000000, 214, 0x552F703B,0xB74A814F, + 0x40080000,0x00000000, 215, 0x5547942C,0xC977E0FB, + 0x40080000,0x00000000, 216, 0x5561AF21,0x9719E8BC, + 0x40080000,0x00000000, 217, 0x557A86B2,0x62A6DD1A, + 0x40080000,0x00000000, 218, 0x5593E505,0xC9FD25D4, + 0x40080000,0x00000000, 219, 0x55ADD788,0xAEFBB8BE, + 0x40080000,0x00000000, 220, 0x55C661A6,0x833CCA8E, + 0x40080000,0x00000000, 221, 0x55E0C93C,0xE26D97EB, + 0x40080000,0x00000000, 222, 0x55F92DDB,0x53A463E0, + 0x40080000,0x00000000, 223, 0x5612E264,0x7EBB4AE8, + 0x40080000,0x00000000, 224, 0x562C5396,0xBE18F05C, + 0x40080000,0x00000000, 225, 0x56453EB1,0x0E92B445, + 0x40080000,0x00000000, 226, 0x565FDE09,0x95DC0E68, + 0x40080000,0x00000000, 227, 0x5677E687,0x30650ACE, + 0x40080000,0x00000000, 228, 0x5691ECE5,0x644BC81A, + 0x40080000,0x00000000, 229, 0x56AAE358,0x1671AC27, + 0x40080000,0x00000000, 230, 0x56C42A82,0x10D5411E, + 0x40080000,0x00000000, 231, 0x56DE3FC3,0x193FE1AC, + 0x40080000,0x00000000, 232, 0x56F6AFD2,0x52EFE941, + 0x40080000,0x00000000, 233, 0x571103DD,0xBE33EEF1, + 0x40080000,0x00000000, 234, 0x572985CC,0x9D4DE669, + 0x40080000,0x00000000, 235, 0x57432459,0x75FA6CCF, + 0x40080000,0x00000000, 236, 0x575CB686,0x30F7A337, + 0x40080000,0x00000000, 237, 0x577588E4,0xA4B9BA69, + 0x40080000,0x00000000, 238, 0x579026AB,0x7B8B4BCF, + 0x40080000,0x00000000, 239, 0x57A83A01,0x3950F1B6, + 0x40080000,0x00000000, 240, 0x57C22B80,0xEAFCB549, + 0x40080000,0x00000000, 241, 0x57DB4141,0x607B0FED, + 0x40080000,0x00000000, 242, 0x57F470F1,0x085C4BF2, + 0x40080000,0x00000000, 243, 0x580EA969,0x8C8A71EA, + 0x40080000,0x00000000, 244, 0x5826FF0F,0x2967D570, + 0x40080000,0x00000000, 245, 0x58413F4B,0x5F0DE014, + 0x40080000,0x00000000, 246, 0x5859DEF1,0x0E94D01E, + 0x40080000,0x00000000, 247, 0x58736734,0xCAEF9C16, + 0x40080000,0x00000000, 248, 0x588D1ACF,0x30676A21, + 0x40080000,0x00000000, 249, 0x58A5D41B,0x644D8F99, + 0x40080000,0x00000000, 250, 0x58C05F14,0x8B3A2BB3, + 0x40080000,0x00000000, 251, 0x58D88E9E,0xD0D7418C, + 0x40080000,0x00000000, 252, 0x58F26AF7,0x1CA17129, + 0x40080000,0x00000000, 253, 0x590BA072,0xAAF229BE, + 0x40080000,0x00000000, 254, 0x5924B856,0x00359F4E, + 0x40080000,0x00000000, 255, 0x593F1481,0x00506EF6, + 0x40080000,0x00000000, 256, 0x59574F60,0xC03C5338, + 0x40080000,0x00000000, 257, 0x59717B88,0x902D3E6A, + 0x40080000,0x00000000, 258, 0x598A394C,0xD843DD9F, + 0x40080000,0x00000000, 259, 0x59A3AAF9,0xA232E637, + 0x40080000,0x00000000, 260, 0x59BD8076,0x734C5953, + 0x40080000,0x00000000, 261, 0x59D62058,0xD67942FE, + 0x40080000,0x00000000, 262, 0x59F09842,0xA0DAF23F, + 0x40080000,0x00000000, 263, 0x5A08E463,0xF1486B5E, + 0x40080000,0x00000000, 264, 0x5A22AB4A,0xF4F65087, + 0x40080000,0x00000000, 265, 0x5A3C00F0,0x6F7178CA, + 0x40080000,0x00000000, 266, 0x5A5500B4,0x53951A97, + 0x40080000,0x00000000, 267, 0x5A6F810E,0x7D5FA7E3, + 0x40080000,0x00000000, 268, 0x5A87A0CA,0xDE07BDEA, + 0x40080000,0x00000000, 269, 0x5AA1B898,0x2685CE70, + 0x40080000,0x00000000, 270, 0x5ABA94E4,0x39C8B5A8, + 0x40080000,0x00000000, 271, 0x5AD3EFAB,0x2B56883E, + 0x40080000,0x00000000, 272, 0x5AEDE780,0xC101CC5D, + 0x40080000,0x00000000, 273, 0x5B066DA0,0x90C15945, + 0x40080000,0x00000000, 274, 0x5B20D238,0x6C9102F4, + 0x40080000,0x00000000, 275, 0x5B393B54,0xA2D9846E, + 0x40080000,0x00000000, 276, 0x5B52EC7F,0x7A232353, + 0x40080000,0x00000000, 277, 0x5B6C62BF,0x3734B4FC, + 0x40080000,0x00000000, 278, 0x5B854A0F,0x696787BD, + 0x40080000,0x00000000, 279, 0x5B9FEF17,0x1E1B4B9B, + 0x40080000,0x00000000, 280, 0x5BB7F351,0x569478B4, + 0x40080000,0x00000000, 281, 0x5BD1F67D,0x00EF5A87, + 0x40080000,0x00000000, 282, 0x5BEAF1BB,0x816707CB, + 0x40080000,0x00000000, 283, 0x5C04354C,0xA10D45D8, + 0x40080000,0x00000000, 284, 0x5C1E4FF2,0xF193E8C4, + 0x40080000,0x00000000, 285, 0x5C36BBF6,0x352EEE93, + 0x40080000,0x00000000, 286, 0x5C510CF8,0xA7E332EE, + 0x40080000,0x00000000, 287, 0x5C699374,0xFBD4CC66, + 0x40080000,0x00000000, 288, 0x5C832E97,0xBCDF994C, + 0x40080000,0x00000000, 289, 0x5C9CC5E3,0x9B4F65F2, + 0x40080000,0x00000000, 290, 0x5CB5946A,0xB47B8C76, + 0x40080000,0x00000000, 291, 0x5CD02F50,0x075CA958, + 0x40080000,0x00000000, 292, 0x5CE846F8,0x0B0AFE05, + 0x40080000,0x00000000, 293, 0x5D02353A,0x08483E83, + 0x40080000,0x00000000, 294, 0x5D1B4FD7,0x0C6C5DC5, + 0x40080000,0x00000000, 295, 0x5D347BE1,0x49514654, + 0x40080000,0x00000000, 296, 0x5D4EB9D1,0xEDF9E97E, + 0x40080000,0x00000000, 297, 0x5D670B5D,0x727B6F1E, + 0x40080000,0x00000000, 298, 0x5D814886,0x15DC9357, + 0x40080000,0x00000000, 299, 0x5D99ECC9,0x20CADD02, + 0x40080000,0x00000000, 300, 0x5DB37196,0xD89825C2, + 0x40100000,0x00000000, 2, 0x40400000,0x00000000, + 0x40100000,0x00000000, 3, 0x40600000,0x00000000, + 0x40100000,0x00000000, 4, 0x40800000,0x00000000, + 0x40100000,0x00000000, 5, 0x40A00000,0x00000000, + 0x40100000,0x00000000, 6, 0x40C00000,0x00000000, + 0x40100000,0x00000000, 7, 0x40E00000,0x00000000, + 0x40100000,0x00000000, 8, 0x41000000,0x00000000, + 0x40100000,0x00000000, 9, 0x41200000,0x00000000, + 0x40100000,0x00000000, 10, 0x41400000,0x00000000, + 0x40100000,0x00000000, 11, 0x41600000,0x00000000, + 0x40100000,0x00000000, 12, 0x41800000,0x00000000, + 0x40100000,0x00000000, 13, 0x41A00000,0x00000000, + 0x40100000,0x00000000, 14, 0x41C00000,0x00000000, + 0x40100000,0x00000000, 15, 0x41E00000,0x00000000, + 0x40100000,0x00000000, 16, 0x42000000,0x00000000, + 0x40100000,0x00000000, 17, 0x42200000,0x00000000, + 0x40100000,0x00000000, 18, 0x42400000,0x00000000, + 0x40100000,0x00000000, 19, 0x42600000,0x00000000, + 0x40100000,0x00000000, 20, 0x42800000,0x00000000, + 0x40100000,0x00000000, 21, 0x42A00000,0x00000000, + 0x40100000,0x00000000, 22, 0x42C00000,0x00000000, + 0x40100000,0x00000000, 23, 0x42E00000,0x00000000, + 0x40100000,0x00000000, 24, 0x43000000,0x00000000, + 0x40100000,0x00000000, 25, 0x43200000,0x00000000, + 0x40100000,0x00000000, 26, 0x43400000,0x00000000, + 0x40100000,0x00000000, 27, 0x43600000,0x00000000, + 0x40100000,0x00000000, 28, 0x43800000,0x00000000, + 0x40100000,0x00000000, 29, 0x43A00000,0x00000000, + 0x40100000,0x00000000, 30, 0x43C00000,0x00000000, + 0x40100000,0x00000000, 31, 0x43E00000,0x00000000, + 0x40100000,0x00000000, 32, 0x44000000,0x00000000, + 0x40100000,0x00000000, 33, 0x44200000,0x00000000, + 0x40100000,0x00000000, 34, 0x44400000,0x00000000, + 0x40100000,0x00000000, 35, 0x44600000,0x00000000, + 0x40100000,0x00000000, 36, 0x44800000,0x00000000, + 0x40100000,0x00000000, 37, 0x44A00000,0x00000000, + 0x40100000,0x00000000, 38, 0x44C00000,0x00000000, + 0x40100000,0x00000000, 39, 0x44E00000,0x00000000, + 0x40100000,0x00000000, 40, 0x45000000,0x00000000, + 0x40100000,0x00000000, 41, 0x45200000,0x00000000, + 0x40100000,0x00000000, 42, 0x45400000,0x00000000, + 0x40100000,0x00000000, 43, 0x45600000,0x00000000, + 0x40100000,0x00000000, 44, 0x45800000,0x00000000, + 0x40100000,0x00000000, 45, 0x45A00000,0x00000000, + 0x40100000,0x00000000, 46, 0x45C00000,0x00000000, + 0x40100000,0x00000000, 47, 0x45E00000,0x00000000, + 0x40100000,0x00000000, 48, 0x46000000,0x00000000, + 0x40100000,0x00000000, 49, 0x46200000,0x00000000, + 0x40100000,0x00000000, 50, 0x46400000,0x00000000, + 0x40100000,0x00000000, 51, 0x46600000,0x00000000, + 0x40100000,0x00000000, 52, 0x46800000,0x00000000, + 0x40100000,0x00000000, 53, 0x46A00000,0x00000000, + 0x40100000,0x00000000, 54, 0x46C00000,0x00000000, + 0x40100000,0x00000000, 55, 0x46E00000,0x00000000, + 0x40100000,0x00000000, 56, 0x47000000,0x00000000, + 0x40100000,0x00000000, 57, 0x47200000,0x00000000, + 0x40100000,0x00000000, 58, 0x47400000,0x00000000, + 0x40100000,0x00000000, 59, 0x47600000,0x00000000, + 0x40100000,0x00000000, 60, 0x47800000,0x00000000, + 0x40100000,0x00000000, 61, 0x47A00000,0x00000000, + 0x40100000,0x00000000, 62, 0x47C00000,0x00000000, + 0x40100000,0x00000000, 63, 0x47E00000,0x00000000, + 0x40100000,0x00000000, 64, 0x48000000,0x00000000, + 0x40100000,0x00000000, 65, 0x48200000,0x00000000, + 0x40100000,0x00000000, 66, 0x48400000,0x00000000, + 0x40100000,0x00000000, 67, 0x48600000,0x00000000, + 0x40100000,0x00000000, 68, 0x48800000,0x00000000, + 0x40100000,0x00000000, 69, 0x48A00000,0x00000000, + 0x40100000,0x00000000, 70, 0x48C00000,0x00000000, + 0x40100000,0x00000000, 71, 0x48E00000,0x00000000, + 0x40100000,0x00000000, 72, 0x49000000,0x00000000, + 0x40100000,0x00000000, 73, 0x49200000,0x00000000, + 0x40100000,0x00000000, 74, 0x49400000,0x00000000, + 0x40100000,0x00000000, 75, 0x49600000,0x00000000, + 0x40100000,0x00000000, 76, 0x49800000,0x00000000, + 0x40100000,0x00000000, 77, 0x49A00000,0x00000000, + 0x40100000,0x00000000, 78, 0x49C00000,0x00000000, + 0x40100000,0x00000000, 79, 0x49E00000,0x00000000, + 0x40100000,0x00000000, 80, 0x4A000000,0x00000000, + 0x40100000,0x00000000, 81, 0x4A200000,0x00000000, + 0x40100000,0x00000000, 82, 0x4A400000,0x00000000, + 0x40100000,0x00000000, 83, 0x4A600000,0x00000000, + 0x40100000,0x00000000, 84, 0x4A800000,0x00000000, + 0x40100000,0x00000000, 85, 0x4AA00000,0x00000000, + 0x40100000,0x00000000, 86, 0x4AC00000,0x00000000, + 0x40100000,0x00000000, 87, 0x4AE00000,0x00000000, + 0x40100000,0x00000000, 88, 0x4B000000,0x00000000, + 0x40100000,0x00000000, 89, 0x4B200000,0x00000000, + 0x40100000,0x00000000, 90, 0x4B400000,0x00000000, + 0x40100000,0x00000000, 91, 0x4B600000,0x00000000, + 0x40100000,0x00000000, 92, 0x4B800000,0x00000000, + 0x40100000,0x00000000, 93, 0x4BA00000,0x00000000, + 0x40100000,0x00000000, 94, 0x4BC00000,0x00000000, + 0x40100000,0x00000000, 95, 0x4BE00000,0x00000000, + 0x40100000,0x00000000, 96, 0x4C000000,0x00000000, + 0x40100000,0x00000000, 97, 0x4C200000,0x00000000, + 0x40100000,0x00000000, 98, 0x4C400000,0x00000000, + 0x40100000,0x00000000, 99, 0x4C600000,0x00000000, + 0x40100000,0x00000000, 100, 0x4C800000,0x00000000, + 0x40100000,0x00000000, 101, 0x4CA00000,0x00000000, + 0x40100000,0x00000000, 102, 0x4CC00000,0x00000000, + 0x40100000,0x00000000, 103, 0x4CE00000,0x00000000, + 0x40100000,0x00000000, 104, 0x4D000000,0x00000000, + 0x40100000,0x00000000, 105, 0x4D200000,0x00000000, + 0x40100000,0x00000000, 106, 0x4D400000,0x00000000, + 0x40100000,0x00000000, 107, 0x4D600000,0x00000000, + 0x40100000,0x00000000, 108, 0x4D800000,0x00000000, + 0x40100000,0x00000000, 109, 0x4DA00000,0x00000000, + 0x40100000,0x00000000, 110, 0x4DC00000,0x00000000, + 0x40100000,0x00000000, 111, 0x4DE00000,0x00000000, + 0x40100000,0x00000000, 112, 0x4E000000,0x00000000, + 0x40100000,0x00000000, 113, 0x4E200000,0x00000000, + 0x40100000,0x00000000, 114, 0x4E400000,0x00000000, + 0x40100000,0x00000000, 115, 0x4E600000,0x00000000, + 0x40100000,0x00000000, 116, 0x4E800000,0x00000000, + 0x40100000,0x00000000, 117, 0x4EA00000,0x00000000, + 0x40100000,0x00000000, 118, 0x4EC00000,0x00000000, + 0x40100000,0x00000000, 119, 0x4EE00000,0x00000000, + 0x40100000,0x00000000, 120, 0x4F000000,0x00000000, + 0x40100000,0x00000000, 121, 0x4F200000,0x00000000, + 0x40100000,0x00000000, 122, 0x4F400000,0x00000000, + 0x40100000,0x00000000, 123, 0x4F600000,0x00000000, + 0x40100000,0x00000000, 124, 0x4F800000,0x00000000, + 0x40100000,0x00000000, 125, 0x4FA00000,0x00000000, + 0x40100000,0x00000000, 126, 0x4FC00000,0x00000000, + 0x40100000,0x00000000, 127, 0x4FE00000,0x00000000, + 0x40100000,0x00000000, 128, 0x50000000,0x00000000, + 0x40100000,0x00000000, 129, 0x50200000,0x00000000, + 0x40100000,0x00000000, 130, 0x50400000,0x00000000, + 0x40100000,0x00000000, 131, 0x50600000,0x00000000, + 0x40100000,0x00000000, 132, 0x50800000,0x00000000, + 0x40100000,0x00000000, 133, 0x50A00000,0x00000000, + 0x40100000,0x00000000, 134, 0x50C00000,0x00000000, + 0x40100000,0x00000000, 135, 0x50E00000,0x00000000, + 0x40100000,0x00000000, 136, 0x51000000,0x00000000, + 0x40100000,0x00000000, 137, 0x51200000,0x00000000, + 0x40100000,0x00000000, 138, 0x51400000,0x00000000, + 0x40100000,0x00000000, 139, 0x51600000,0x00000000, + 0x40100000,0x00000000, 140, 0x51800000,0x00000000, + 0x40100000,0x00000000, 141, 0x51A00000,0x00000000, + 0x40100000,0x00000000, 142, 0x51C00000,0x00000000, + 0x40100000,0x00000000, 143, 0x51E00000,0x00000000, + 0x40100000,0x00000000, 144, 0x52000000,0x00000000, + 0x40100000,0x00000000, 145, 0x52200000,0x00000000, + 0x40100000,0x00000000, 146, 0x52400000,0x00000000, + 0x40100000,0x00000000, 147, 0x52600000,0x00000000, + 0x40100000,0x00000000, 148, 0x52800000,0x00000000, + 0x40100000,0x00000000, 149, 0x52A00000,0x00000000, + 0x40100000,0x00000000, 150, 0x52C00000,0x00000000, + 0x40100000,0x00000000, 151, 0x52E00000,0x00000000, + 0x40100000,0x00000000, 152, 0x53000000,0x00000000, + 0x40100000,0x00000000, 153, 0x53200000,0x00000000, + 0x40100000,0x00000000, 154, 0x53400000,0x00000000, + 0x40100000,0x00000000, 155, 0x53600000,0x00000000, + 0x40100000,0x00000000, 156, 0x53800000,0x00000000, + 0x40100000,0x00000000, 157, 0x53A00000,0x00000000, + 0x40100000,0x00000000, 158, 0x53C00000,0x00000000, + 0x40100000,0x00000000, 159, 0x53E00000,0x00000000, + 0x40100000,0x00000000, 160, 0x54000000,0x00000000, + 0x40100000,0x00000000, 161, 0x54200000,0x00000000, + 0x40100000,0x00000000, 162, 0x54400000,0x00000000, + 0x40100000,0x00000000, 163, 0x54600000,0x00000000, + 0x40100000,0x00000000, 164, 0x54800000,0x00000000, + 0x40100000,0x00000000, 165, 0x54A00000,0x00000000, + 0x40100000,0x00000000, 166, 0x54C00000,0x00000000, + 0x40100000,0x00000000, 167, 0x54E00000,0x00000000, + 0x40100000,0x00000000, 168, 0x55000000,0x00000000, + 0x40100000,0x00000000, 169, 0x55200000,0x00000000, + 0x40100000,0x00000000, 170, 0x55400000,0x00000000, + 0x40100000,0x00000000, 171, 0x55600000,0x00000000, + 0x40100000,0x00000000, 172, 0x55800000,0x00000000, + 0x40100000,0x00000000, 173, 0x55A00000,0x00000000, + 0x40100000,0x00000000, 174, 0x55C00000,0x00000000, + 0x40100000,0x00000000, 175, 0x55E00000,0x00000000, + 0x40100000,0x00000000, 176, 0x56000000,0x00000000, + 0x40100000,0x00000000, 177, 0x56200000,0x00000000, + 0x40100000,0x00000000, 178, 0x56400000,0x00000000, + 0x40100000,0x00000000, 179, 0x56600000,0x00000000, + 0x40100000,0x00000000, 180, 0x56800000,0x00000000, + 0x40100000,0x00000000, 181, 0x56A00000,0x00000000, + 0x40100000,0x00000000, 182, 0x56C00000,0x00000000, + 0x40100000,0x00000000, 183, 0x56E00000,0x00000000, + 0x40100000,0x00000000, 184, 0x57000000,0x00000000, + 0x40100000,0x00000000, 185, 0x57200000,0x00000000, + 0x40100000,0x00000000, 186, 0x57400000,0x00000000, + 0x40100000,0x00000000, 187, 0x57600000,0x00000000, + 0x40100000,0x00000000, 188, 0x57800000,0x00000000, + 0x40100000,0x00000000, 189, 0x57A00000,0x00000000, + 0x40100000,0x00000000, 190, 0x57C00000,0x00000000, + 0x40100000,0x00000000, 191, 0x57E00000,0x00000000, + 0x40100000,0x00000000, 192, 0x58000000,0x00000000, + 0x40100000,0x00000000, 193, 0x58200000,0x00000000, + 0x40100000,0x00000000, 194, 0x58400000,0x00000000, + 0x40100000,0x00000000, 195, 0x58600000,0x00000000, + 0x40100000,0x00000000, 196, 0x58800000,0x00000000, + 0x40100000,0x00000000, 197, 0x58A00000,0x00000000, + 0x40100000,0x00000000, 198, 0x58C00000,0x00000000, + 0x40100000,0x00000000, 199, 0x58E00000,0x00000000, + 0x40100000,0x00000000, 200, 0x59000000,0x00000000, + 0x40100000,0x00000000, 201, 0x59200000,0x00000000, + 0x40100000,0x00000000, 202, 0x59400000,0x00000000, + 0x40100000,0x00000000, 203, 0x59600000,0x00000000, + 0x40100000,0x00000000, 204, 0x59800000,0x00000000, + 0x40100000,0x00000000, 205, 0x59A00000,0x00000000, + 0x40100000,0x00000000, 206, 0x59C00000,0x00000000, + 0x40100000,0x00000000, 207, 0x59E00000,0x00000000, + 0x40100000,0x00000000, 208, 0x5A000000,0x00000000, + 0x40100000,0x00000000, 209, 0x5A200000,0x00000000, + 0x40100000,0x00000000, 210, 0x5A400000,0x00000000, + 0x40100000,0x00000000, 211, 0x5A600000,0x00000000, + 0x40100000,0x00000000, 212, 0x5A800000,0x00000000, + 0x40100000,0x00000000, 213, 0x5AA00000,0x00000000, + 0x40100000,0x00000000, 214, 0x5AC00000,0x00000000, + 0x40100000,0x00000000, 215, 0x5AE00000,0x00000000, + 0x40100000,0x00000000, 216, 0x5B000000,0x00000000, + 0x40100000,0x00000000, 217, 0x5B200000,0x00000000, + 0x40100000,0x00000000, 218, 0x5B400000,0x00000000, + 0x40100000,0x00000000, 219, 0x5B600000,0x00000000, + 0x40100000,0x00000000, 220, 0x5B800000,0x00000000, + 0x40100000,0x00000000, 221, 0x5BA00000,0x00000000, + 0x40100000,0x00000000, 222, 0x5BC00000,0x00000000, + 0x40100000,0x00000000, 223, 0x5BE00000,0x00000000, + 0x40100000,0x00000000, 224, 0x5C000000,0x00000000, + 0x40100000,0x00000000, 225, 0x5C200000,0x00000000, + 0x40100000,0x00000000, 226, 0x5C400000,0x00000000, + 0x40100000,0x00000000, 227, 0x5C600000,0x00000000, + 0x40100000,0x00000000, 228, 0x5C800000,0x00000000, + 0x40100000,0x00000000, 229, 0x5CA00000,0x00000000, + 0x40100000,0x00000000, 230, 0x5CC00000,0x00000000, + 0x40100000,0x00000000, 231, 0x5CE00000,0x00000000, + 0x40100000,0x00000000, 232, 0x5D000000,0x00000000, + 0x40100000,0x00000000, 233, 0x5D200000,0x00000000, + 0x40100000,0x00000000, 234, 0x5D400000,0x00000000, + 0x40100000,0x00000000, 235, 0x5D600000,0x00000000, + 0x40100000,0x00000000, 236, 0x5D800000,0x00000000, + 0x40100000,0x00000000, 237, 0x5DA00000,0x00000000, + 0x40100000,0x00000000, 238, 0x5DC00000,0x00000000, + 0x40100000,0x00000000, 239, 0x5DE00000,0x00000000, + 0x40100000,0x00000000, 240, 0x5E000000,0x00000000, + 0x40100000,0x00000000, 241, 0x5E200000,0x00000000, + 0x40100000,0x00000000, 242, 0x5E400000,0x00000000, + 0x40100000,0x00000000, 243, 0x5E600000,0x00000000, + 0x40100000,0x00000000, 244, 0x5E800000,0x00000000, + 0x40100000,0x00000000, 245, 0x5EA00000,0x00000000, + 0x40100000,0x00000000, 246, 0x5EC00000,0x00000000, + 0x40100000,0x00000000, 247, 0x5EE00000,0x00000000, + 0x40100000,0x00000000, 248, 0x5F000000,0x00000000, + 0x40100000,0x00000000, 249, 0x5F200000,0x00000000, + 0x40100000,0x00000000, 250, 0x5F400000,0x00000000, + 0x40100000,0x00000000, 251, 0x5F600000,0x00000000, + 0x40100000,0x00000000, 252, 0x5F800000,0x00000000, + 0x40100000,0x00000000, 253, 0x5FA00000,0x00000000, + 0x40100000,0x00000000, 254, 0x5FC00000,0x00000000, + 0x40100000,0x00000000, 255, 0x5FE00000,0x00000000, + 0x40100000,0x00000000, 256, 0x60000000,0x00000000, + 0x40100000,0x00000000, 257, 0x60200000,0x00000000, + 0x40100000,0x00000000, 258, 0x60400000,0x00000000, + 0x40100000,0x00000000, 259, 0x60600000,0x00000000, + 0x40100000,0x00000000, 260, 0x60800000,0x00000000, + 0x40100000,0x00000000, 261, 0x60A00000,0x00000000, + 0x40100000,0x00000000, 262, 0x60C00000,0x00000000, + 0x40100000,0x00000000, 263, 0x60E00000,0x00000000, + 0x40100000,0x00000000, 264, 0x61000000,0x00000000, + 0x40100000,0x00000000, 265, 0x61200000,0x00000000, + 0x40100000,0x00000000, 266, 0x61400000,0x00000000, + 0x40100000,0x00000000, 267, 0x61600000,0x00000000, + 0x40100000,0x00000000, 268, 0x61800000,0x00000000, + 0x40100000,0x00000000, 269, 0x61A00000,0x00000000, + 0x40100000,0x00000000, 270, 0x61C00000,0x00000000, + 0x40100000,0x00000000, 271, 0x61E00000,0x00000000, + 0x40100000,0x00000000, 272, 0x62000000,0x00000000, + 0x40100000,0x00000000, 273, 0x62200000,0x00000000, + 0x40100000,0x00000000, 274, 0x62400000,0x00000000, + 0x40100000,0x00000000, 275, 0x62600000,0x00000000, + 0x40100000,0x00000000, 276, 0x62800000,0x00000000, + 0x40100000,0x00000000, 277, 0x62A00000,0x00000000, + 0x40100000,0x00000000, 278, 0x62C00000,0x00000000, + 0x40100000,0x00000000, 279, 0x62E00000,0x00000000, + 0x40100000,0x00000000, 280, 0x63000000,0x00000000, + 0x40100000,0x00000000, 281, 0x63200000,0x00000000, + 0x40100000,0x00000000, 282, 0x63400000,0x00000000, + 0x40100000,0x00000000, 283, 0x63600000,0x00000000, + 0x40100000,0x00000000, 284, 0x63800000,0x00000000, + 0x40100000,0x00000000, 285, 0x63A00000,0x00000000, + 0x40100000,0x00000000, 286, 0x63C00000,0x00000000, + 0x40100000,0x00000000, 287, 0x63E00000,0x00000000, + 0x40100000,0x00000000, 288, 0x64000000,0x00000000, + 0x40100000,0x00000000, 289, 0x64200000,0x00000000, + 0x40100000,0x00000000, 290, 0x64400000,0x00000000, + 0x40100000,0x00000000, 291, 0x64600000,0x00000000, + 0x40100000,0x00000000, 292, 0x64800000,0x00000000, + 0x40100000,0x00000000, 293, 0x64A00000,0x00000000, + 0x40100000,0x00000000, 294, 0x64C00000,0x00000000, + 0x40100000,0x00000000, 295, 0x64E00000,0x00000000, + 0x40100000,0x00000000, 296, 0x65000000,0x00000000, + 0x40100000,0x00000000, 297, 0x65200000,0x00000000, + 0x40100000,0x00000000, 298, 0x65400000,0x00000000, + 0x40100000,0x00000000, 299, 0x65600000,0x00000000, + 0x40100000,0x00000000, 300, 0x65800000,0x00000000, + 0x40140000,0x00000000, 2, 0x404BF36A,0xE31D6E46, + 0x40140000,0x00000000, 3, 0x40717822,0xCDF264EC, + 0x40140000,0x00000000, 4, 0x4095D62B,0x816EFE27, + 0x40140000,0x00000000, 5, 0x40BB4BB6,0x61CABDB0, + 0x40140000,0x00000000, 6, 0x40E10F51,0xFD1EB68E, + 0x40140000,0x00000000, 7, 0x41055326,0x7C666432, + 0x40140000,0x00000000, 8, 0x412AA7F0,0x1B7FFD3E, + 0x40140000,0x00000000, 9, 0x4150A8F6,0x112FFE47, + 0x40140000,0x00000000, 10, 0x4174D333,0x957BFDD9, + 0x40140000,0x00000000, 11, 0x419A0800,0x7ADAFD4F, + 0x40140000,0x00000000, 12, 0x41C04500,0x4CC8DE51, + 0x40140000,0x00000000, 13, 0x41E45640,0x5FFB15E6, + 0x40140000,0x00000000, 14, 0x42096BD0,0x77F9DB5F, + 0x40140000,0x00000000, 15, 0x422FC6C4,0x95F85237, + 0x40140000,0x00000000, 16, 0x4253DC3A,0xDDBB3362, + 0x40140000,0x00000000, 17, 0x4278D349,0x952A003B, + 0x40140000,0x00000000, 18, 0x429F081B,0xFA74804A, + 0x40140000,0x00000000, 19, 0x42C36511,0x7C88D02E, + 0x40140000,0x00000000, 20, 0x42E83E55,0xDBAB0439, + 0x40140000,0x00000000, 21, 0x430E4DEB,0x5295C548, + 0x40140000,0x00000000, 22, 0x4332F0B3,0x139D9B4D, + 0x40140000,0x00000000, 23, 0x4357ACDF,0xD8850220, + 0x40140000,0x00000000, 24, 0x437D9817,0xCEA642A8, + 0x40140000,0x00000000, 25, 0x43A27F0E,0xE127E9A9, + 0x40140000,0x00000000, 26, 0x43C71ED2,0x9971E413, + 0x40140000,0x00000000, 27, 0x43ECE687,0x3FCE5D18, + 0x40140000,0x00000000, 28, 0x44121014,0x87E0FA2F, + 0x40140000,0x00000000, 29, 0x44369419,0xA9D938BB, + 0x40140000,0x00000000, 30, 0x445C3920,0x144F86EA, + 0x40140000,0x00000000, 31, 0x4481A3B4,0x0CB1B452, + 0x40140000,0x00000000, 32, 0x44A60CA1,0x0FDE2166, + 0x40140000,0x00000000, 33, 0x44CB8FC9,0x53D5A9C0, + 0x40140000,0x00000000, 34, 0x44F139DD,0xD4658A18, + 0x40140000,0x00000000, 35, 0x45158855,0x497EEC9E, + 0x40140000,0x00000000, 36, 0x453AEA6A,0x9BDEA7C6, + 0x40140000,0x00000000, 37, 0x4560D282,0xA16B28DC, + 0x40140000,0x00000000, 38, 0x45850723,0x49C5F312, + 0x40140000,0x00000000, 39, 0x45AA48EC,0x1C376FD7, + 0x40140000,0x00000000, 40, 0x45D06D93,0x91A2A5E6, + 0x40140000,0x00000000, 41, 0x45F488F8,0x760B4F60, + 0x40140000,0x00000000, 42, 0x4619AB36,0x938E2338, + 0x40140000,0x00000000, 43, 0x46400B02,0x1C38D603, + 0x40140000,0x00000000, 44, 0x46640DC2,0xA3470B84, + 0x40140000,0x00000000, 45, 0x46891133,0x4C18CE65, + 0x40140000,0x00000000, 46, 0x46AF5580,0x1F1F01FE, + 0x40140000,0x00000000, 47, 0x46D39570,0x1373613F, + 0x40140000,0x00000000, 48, 0x46F87ACC,0x1850398E, + 0x40140000,0x00000000, 49, 0x471E997F,0x1E6447F2, + 0x40140000,0x00000000, 50, 0x47431FEF,0x72FEACF7, + 0x40140000,0x00000000, 51, 0x4767E7EB,0x4FBE5835, + 0x40140000,0x00000000, 52, 0x478DE1E6,0x23ADEE42, + 0x40140000,0x00000000, 53, 0x47B2AD2F,0xD64CB4E9, + 0x40140000,0x00000000, 54, 0x47D7587B,0xCBDFE224, + 0x40140000,0x00000000, 55, 0x47FD2E9A,0xBED7DAAD, + 0x40140000,0x00000000, 56, 0x48223D20,0xB746E8AC, + 0x40140000,0x00000000, 57, 0x4846CC68,0xE518A2D7, + 0x40140000,0x00000000, 58, 0x486C7F83,0x1E5ECB8D, + 0x40140000,0x00000000, 59, 0x4891CFB1,0xF2FB3F38, + 0x40140000,0x00000000, 60, 0x48B6439E,0x6FBA0F06, + 0x40140000,0x00000000, 61, 0x48DBD486,0x0BA892C7, + 0x40140000,0x00000000, 62, 0x490164D3,0xC7495BBD, + 0x40140000,0x00000000, 63, 0x4925BE08,0xB91BB2AC, + 0x40140000,0x00000000, 64, 0x494B2D8A,0xE7629F57, + 0x40140000,0x00000000, 65, 0x4970FC76,0xD09DA396, + 0x40140000,0x00000000, 66, 0x49953B94,0x84C50C7C, + 0x40140000,0x00000000, 67, 0x49BA8A79,0xA5F64F9B, + 0x40140000,0x00000000, 68, 0x49E0968C,0x07B9F1C1, + 0x40140000,0x00000000, 69, 0x4A04BC2F,0x09A86E31, + 0x40140000,0x00000000, 70, 0x4A29EB3A,0xCC1289BD, + 0x40140000,0x00000000, 71, 0x4A503304,0xBF8B9616, + 0x40140000,0x00000000, 72, 0x4A743FC5,0xEF6E7B9C, + 0x40140000,0x00000000, 73, 0x4A994FB7,0x6B4A1A83, + 0x40140000,0x00000000, 74, 0x4ABFA3A5,0x461CA123, + 0x40140000,0x00000000, 75, 0x4AE3C647,0x4BD1E4B6, + 0x40140000,0x00000000, 76, 0x4B08B7D9,0x1EC65DE3, + 0x40140000,0x00000000, 77, 0x4B2EE5CF,0x6677F55C, + 0x40140000,0x00000000, 78, 0x4B534FA1,0xA00AF95A, + 0x40140000,0x00000000, 79, 0x4B78238A,0x080DB7B0, + 0x40140000,0x00000000, 80, 0x4B9E2C6C,0x8A11259C, + 0x40140000,0x00000000, 81, 0x4BC2DBC3,0xD64AB782, + 0x40140000,0x00000000, 82, 0x4BE792B4,0xCBDD6562, + 0x40140000,0x00000000, 83, 0x4C0D7761,0xFED4BEBB, + 0x40140000,0x00000000, 84, 0x4C326A9D,0x3F44F735, + 0x40140000,0x00000000, 85, 0x4C570544,0x8F163502, + 0x40140000,0x00000000, 86, 0x4C7CC695,0xB2DBC242, + 0x40140000,0x00000000, 87, 0x4CA1FC1D,0x8FC95969, + 0x40140000,0x00000000, 88, 0x4CC67B24,0xF3BBAFC4, + 0x40140000,0x00000000, 89, 0x4CEC19EE,0x30AA9BB5, + 0x40140000,0x00000000, 90, 0x4D119034,0xDE6AA151, + 0x40140000,0x00000000, 91, 0x4D35F442,0x160549A5, + 0x40140000,0x00000000, 92, 0x4D5B7152,0x9B869C0E, + 0x40140000,0x00000000, 93, 0x4D8126D3,0xA1342189, + 0x40140000,0x00000000, 94, 0x4DA57088,0x898129EB, + 0x40140000,0x00000000, 95, 0x4DCACCAA,0xABE17466, + 0x40140000,0x00000000, 96, 0x4DF0BFEA,0xAB6CE8C0, + 0x40140000,0x00000000, 97, 0x4E14EFE5,0x564822F0, + 0x40140000,0x00000000, 98, 0x4E3A2BDE,0xABDA2BAC, + 0x40140000,0x00000000, 99, 0x4E605B6B,0x2B685B4B, + 0x40140000,0x00000000, 100, 0x4E847245,0xF642721E, + 0x40140000,0x00000000, 101, 0x4EA98ED7,0x73D30EA6, + 0x40140000,0x00000000, 102, 0x4ECFF28D,0x50C7D24F, + 0x40140000,0x00000000, 103, 0x4EF3F798,0x527CE371, + 0x40140000,0x00000000, 104, 0x4F18F57E,0x671C1C4E, + 0x40140000,0x00000000, 105, 0x4F3F32DE,0x00E32361, + 0x40140000,0x00000000, 106, 0x4F637FCA,0xC08DF61D, + 0x40140000,0x00000000, 107, 0x4F885FBD,0x70B173A4, + 0x40140000,0x00000000, 108, 0x4FAE77AC,0xCCDDD08D, + 0x40140000,0x00000000, 109, 0x4FD30ACC,0x000AA258, + 0x40140000,0x00000000, 110, 0x4FF7CD7F,0x000D4AEE, + 0x40140000,0x00000000, 111, 0x501DC0DE,0xC0109DAA, + 0x40140000,0x00000000, 112, 0x5042988B,0x380A628A, + 0x40140000,0x00000000, 113, 0x50673EAE,0x060CFB2C, + 0x40140000,0x00000000, 114, 0x508D0E59,0x879039F8, + 0x40140000,0x00000000, 115, 0x50B228F7,0xF4BA243B, + 0x40140000,0x00000000, 116, 0x50D6B335,0xF1E8AD49, + 0x40140000,0x00000000, 117, 0x50FC6003,0x6E62D89C, + 0x40140000,0x00000000, 118, 0x5121BC02,0x24FDC761, + 0x40140000,0x00000000, 119, 0x51462B02,0xAE3D393A, + 0x40140000,0x00000000, 120, 0x516BB5C3,0x59CC8788, + 0x40140000,0x00000000, 121, 0x5191519A,0x181FD4B5, + 0x40140000,0x00000000, 122, 0x51B5A600,0x9E27C9E2, + 0x40140000,0x00000000, 123, 0x51DB0F80,0xC5B1BC5B, + 0x40140000,0x00000000, 124, 0x5200E9B0,0x7B8F15B9, + 0x40140000,0x00000000, 125, 0x5225241C,0x9A72DB27, + 0x40140000,0x00000000, 126, 0x524A6D23,0xC10F91F1, + 0x40140000,0x00000000, 127, 0x52708436,0x58A9BB37, + 0x40140000,0x00000000, 128, 0x5294A543,0xEED42A04, + 0x40140000,0x00000000, 129, 0x52B9CE94,0xEA893485, + 0x40140000,0x00000000, 130, 0x52E0211D,0x1295C0D3, + 0x40140000,0x00000000, 131, 0x53042964,0x573B3108, + 0x40140000,0x00000000, 132, 0x532933BD,0x6D09FD4A, + 0x40140000,0x00000000, 133, 0x534F80AC,0xC84C7C9D, + 0x40140000,0x00000000, 134, 0x5373B06B,0xFD2FCDE2, + 0x40140000,0x00000000, 135, 0x53989C86,0xFC7BC15A, + 0x40140000,0x00000000, 136, 0x53BEC3A8,0xBB9AB1B1, + 0x40140000,0x00000000, 137, 0x53E33A49,0x7540AF0F, + 0x40140000,0x00000000, 138, 0x540808DB,0xD290DAD2, + 0x40140000,0x00000000, 139, 0x542E0B12,0xC7351187, + 0x40140000,0x00000000, 140, 0x5452C6EB,0xBC812AF4, + 0x40140000,0x00000000, 141, 0x547778A6,0xABA175B1, + 0x40140000,0x00000000, 142, 0x549D56D0,0x5689D31E, + 0x40140000,0x00000000, 143, 0x54C25642,0x361623F3, + 0x40140000,0x00000000, 144, 0x54E6EBD2,0xC39BACEF, + 0x40140000,0x00000000, 145, 0x550CA6C7,0x7482982B, + 0x40140000,0x00000000, 146, 0x5531E83C,0xA8D19F1B, + 0x40140000,0x00000000, 147, 0x5556624B,0xD30606E2, + 0x40140000,0x00000000, 148, 0x557BFADE,0xC7C7889A, + 0x40140000,0x00000000, 149, 0x55A17CCB,0x3CDCB560, + 0x40140000,0x00000000, 150, 0x55C5DBFE,0x0C13E2B8, + 0x40140000,0x00000000, 151, 0x55EB52FD,0x8F18DB66, + 0x40140000,0x00000000, 152, 0x561113DE,0x796F8920, + 0x40140000,0x00000000, 153, 0x563558D6,0x17CB6B68, + 0x40140000,0x00000000, 154, 0x565AAF0B,0x9DBE4642, + 0x40140000,0x00000000, 155, 0x5680AD67,0x4296EBE9, + 0x40140000,0x00000000, 156, 0x56A4D8C1,0x133CA6E3, + 0x40140000,0x00000000, 157, 0x56CA0EF1,0x580BD09C, + 0x40140000,0x00000000, 158, 0x56F04956,0xD7076262, + 0x40140000,0x00000000, 159, 0x57145BAC,0x8CC93AFA, + 0x40140000,0x00000000, 160, 0x57397297,0xAFFB89B9, + 0x40140000,0x00000000, 161, 0x575FCF3D,0x9BFA6C27, + 0x40140000,0x00000000, 162, 0x5783E186,0x817C8398, + 0x40140000,0x00000000, 163, 0x57A8D9E8,0x21DBA47E, + 0x40140000,0x00000000, 164, 0x57CF1062,0x2A528D9E, + 0x40140000,0x00000000, 165, 0x57F36A3D,0x5A739883, + 0x40140000,0x00000000, 166, 0x581844CC,0xB1107EA3, + 0x40140000,0x00000000, 167, 0x583E55FF,0xDD549E4C, + 0x40140000,0x00000000, 168, 0x5862F5BF,0xEA54E2F0, + 0x40140000,0x00000000, 169, 0x5887B32F,0xE4EA1BAC, + 0x40140000,0x00000000, 170, 0x58AD9FFB,0xDE24A296, + 0x40140000,0x00000000, 171, 0x58D283FD,0x6AD6E59E, + 0x40140000,0x00000000, 172, 0x58F724FC,0xC58C9F06, + 0x40140000,0x00000000, 173, 0x591CEE3B,0xF6EFC6C7, + 0x40140000,0x00000000, 174, 0x594214E5,0x7A55DC3C, + 0x40140000,0x00000000, 175, 0x59669A1E,0xD8EB534B, + 0x40140000,0x00000000, 176, 0x598C40A6,0x8F26281E, + 0x40140000,0x00000000, 177, 0x59B1A868,0x1977D913, + 0x40140000,0x00000000, 178, 0x59D61282,0x1FD5CF58, + 0x40140000,0x00000000, 179, 0x59FB9722,0xA7CB432E, + 0x40140000,0x00000000, 180, 0x5A213E75,0xA8DF09FC, + 0x40140000,0x00000000, 181, 0x5A458E13,0x1316CC7C, + 0x40140000,0x00000000, 182, 0x5A6AF197,0xD7DC7F9A, + 0x40140000,0x00000000, 183, 0x5A90D6FE,0xE6E9CFC1, + 0x40140000,0x00000000, 184, 0x5AB50CBE,0xA0A443B1, + 0x40140000,0x00000000, 185, 0x5ADA4FEE,0x48CD549D, + 0x40140000,0x00000000, 186, 0x5B0071F4,0xED8054E2, + 0x40140000,0x00000000, 187, 0x5B248E72,0x28E06A1B, + 0x40140000,0x00000000, 188, 0x5B49B20E,0xB31884A1, + 0x40140000,0x00000000, 189, 0x5B700F49,0x2FEF52E5, + 0x40140000,0x00000000, 190, 0x5B94131B,0x7BEB279E, + 0x40140000,0x00000000, 191, 0x5BB917E2,0x5AE5F185, + 0x40140000,0x00000000, 192, 0x5BDF5DDA,0xF19F6DE7, + 0x40140000,0x00000000, 193, 0x5C039AA8,0xD703A4B0, + 0x40140000,0x00000000, 194, 0x5C288153,0x0CC48DDC, + 0x40140000,0x00000000, 195, 0x5C4EA1A7,0xCFF5B153, + 0x40140000,0x00000000, 196, 0x5C732508,0xE1F98ED4, + 0x40140000,0x00000000, 197, 0x5C97EE4B,0x1A77F289, + 0x40140000,0x00000000, 198, 0x5CBDE9DD,0xE115EF2B, + 0x40140000,0x00000000, 199, 0x5CE2B22A,0xACADB57B, + 0x40140000,0x00000000, 200, 0x5D075EB5,0x57D922DA, + 0x40140000,0x00000000, 201, 0x5D2D3662,0xADCF6B90, + 0x40140000,0x00000000, 202, 0x5D5241FD,0xACA1A33A, + 0x40140000,0x00000000, 203, 0x5D76D27D,0x17CA0C09, + 0x40140000,0x00000000, 204, 0x5D9C871C,0x5DBC8F0B, + 0x40140000,0x00000000, 205, 0x5DC1D471,0xBA95D967, + 0x40140000,0x00000000, 206, 0x5DE6498E,0x293B4FC1, + 0x40140000,0x00000000, 207, 0x5E0BDBF1,0xB38A23B1, + 0x40140000,0x00000000, 208, 0x5E316977,0x1036564E, + 0x40140000,0x00000000, 209, 0x5E55C3D4,0xD443EBE2, + 0x40140000,0x00000000, 210, 0x5E7B34CA,0x0954E6DB, + 0x40140000,0x00000000, 211, 0x5EA100FE,0x45D51049, + 0x40140000,0x00000000, 212, 0x5EC5413D,0xD74A545B, + 0x40140000,0x00000000, 213, 0x5EEA918D,0x4D1CE971, + 0x40140000,0x00000000, 214, 0x5F109AF8,0x503211E7, + 0x40140000,0x00000000, 215, 0x5F34C1B6,0x643E9661, + 0x40140000,0x00000000, 216, 0x5F59F223,0xFD4E3BF9, + 0x40140000,0x00000000, 217, 0x5F803756,0x7E50E57C, + 0x40140000,0x00000000, 218, 0x5FA4452C,0x1DE51EDA, + 0x40140000,0x00000000, 219, 0x5FC95677,0x255E6691, + 0x40140000,0x00000000, 220, 0x5FEFAC14,0xEEB60035, + 0x40140000,0x00000000, 221, 0x6013CB8D,0x1531C021, + 0x40140000,0x00000000, 222, 0x6038BE70,0x5A7E302A, + 0x40140000,0x00000000, 223, 0x605EEE0C,0x711DBC34, + 0x40140000,0x00000000, 224, 0x608354C7,0xC6B295A0, + 0x40140000,0x00000000, 225, 0x60A829F9,0xB85F3B09, + 0x40140000,0x00000000, 226, 0x60CE3478,0x267709CB, + 0x40140000,0x00000000, 227, 0x60F2E0CB,0x180A661F, + 0x40140000,0x00000000, 228, 0x611798FD,0xDE0CFFA6, + 0x40140000,0x00000000, 229, 0x613D7F3D,0x55903F90, + 0x40140000,0x00000000, 230, 0x61626F86,0x557A27BA, + 0x40140000,0x00000000, 231, 0x61870B67,0xEAD8B1A9, + 0x40140000,0x00000000, 232, 0x61ACCE41,0xE58EDE13, + 0x40140000,0x00000000, 233, 0x61D200E9,0x2F794ACC, + 0x40140000,0x00000000, 234, 0x61F68123,0x7B579D7F, + 0x40140000,0x00000000, 235, 0x621C216C,0x5A2D84DE, + 0x40140000,0x00000000, 236, 0x624194E3,0xB85C730B, + 0x40140000,0x00000000, 237, 0x6265FA1C,0xA6738FCE, + 0x40140000,0x00000000, 238, 0x628B78A3,0xD01073C1, + 0x40140000,0x00000000, 239, 0x62B12B66,0x620A4859, + 0x40140000,0x00000000, 240, 0x62D5763F,0xFA8CDA6F, + 0x40140000,0x00000000, 241, 0x62FAD3CF,0xF930110A, + 0x40140000,0x00000000, 242, 0x6320C461,0xFBBE0AA7, + 0x40140000,0x00000000, 243, 0x6344F57A,0x7AAD8D50, + 0x40140000,0x00000000, 244, 0x636A32D9,0x1958F0A4, + 0x40140000,0x00000000, 245, 0x63905FC7,0xAFD79667, + 0x40140000,0x00000000, 246, 0x63B477B9,0x9BCD7C00, + 0x40140000,0x00000000, 247, 0x63D995A8,0x02C0DB00, + 0x40140000,0x00000000, 248, 0x63FFFB12,0x037111C0, + 0x40140000,0x00000000, 249, 0x6423FCEB,0x4226AB18, + 0x40140000,0x00000000, 250, 0x6448FC26,0x12B055DE, + 0x40140000,0x00000000, 251, 0x646F3B2F,0x975C6B56, + 0x40140000,0x00000000, 252, 0x649384FD,0xBE99C316, + 0x40140000,0x00000000, 253, 0x64B8663D,0x2E4033DB, + 0x40140000,0x00000000, 254, 0x64DE7FCC,0x79D040D2, + 0x40140000,0x00000000, 255, 0x65030FDF,0xCC222883, + 0x40140000,0x00000000, 256, 0x6527D3D7,0xBF2AB2A4, + 0x40140000,0x00000000, 257, 0x654DC8CD,0xAEF55F4D, + 0x40140000,0x00000000, 258, 0x65729D80,0x8D595B90, + 0x40140000,0x00000000, 259, 0x659744E0,0xB0AFB274, + 0x40140000,0x00000000, 260, 0x65BD1618,0xDCDB9F11, + 0x40140000,0x00000000, 261, 0x65E22DCF,0x8A09436B, + 0x40140000,0x00000000, 262, 0x6606B943,0x6C8B9445, + 0x40140000,0x00000000, 263, 0x662C6794,0x47AE7957, + 0x40140000,0x00000000, 264, 0x6651C0BC,0xACCD0BD6, + 0x40140000,0x00000000, 265, 0x667630EB,0xD8004ECC, + 0x40140000,0x00000000, 266, 0x669BBD26,0xCE00627F, + 0x40140000,0x00000000, 267, 0x66C15638,0x40C03D8F, + 0x40140000,0x00000000, 268, 0x66E5ABC6,0x50F04CF3, + 0x40140000,0x00000000, 269, 0x670B16B7,0xE52C6030, + 0x40140000,0x00000000, 270, 0x6730EE32,0xEF3BBC1E, + 0x40140000,0x00000000, 271, 0x675529BF,0xAB0AAB25, + 0x40140000,0x00000000, 272, 0x677A742F,0x95CD55EF, + 0x40140000,0x00000000, 273, 0x67A0889D,0xBDA055B5, + 0x40140000,0x00000000, 274, 0x67C4AAC5,0x2D086B22, + 0x40140000,0x00000000, 275, 0x67E9D576,0x784A85EB, + 0x40140000,0x00000000, 276, 0x6810256A,0x0B2E93B3, + 0x40140000,0x00000000, 277, 0x68342EC4,0x8DFA38A0, + 0x40140000,0x00000000, 278, 0x68593A75,0xB178C6C8, + 0x40140000,0x00000000, 279, 0x687F8913,0x1DD6F879, + 0x40140000,0x00000000, 280, 0x68A3B5AB,0xF2A65B4C, + 0x40140000,0x00000000, 281, 0x68C8A316,0xEF4FF21F, + 0x40140000,0x00000000, 282, 0x68EECBDC,0xAB23EEA7, + 0x40140000,0x00000000, 283, 0x69133F69,0xEAF67528, + 0x40140000,0x00000000, 284, 0x69380F44,0x65B41272, + 0x40140000,0x00000000, 285, 0x695E1315,0x7F21170F, + 0x40140000,0x00000000, 286, 0x6982CBED,0x6F74AE69, + 0x40140000,0x00000000, 287, 0x69A77EE8,0xCB51DA04, + 0x40140000,0x00000000, 288, 0x69CD5EA2,0xFE265084, + 0x40140000,0x00000000, 289, 0x69F25B25,0xDED7F253, + 0x40140000,0x00000000, 290, 0x6A16F1EF,0x568DEEE7, + 0x40140000,0x00000000, 291, 0x6A3CAE6B,0x2C316AA1, + 0x40140000,0x00000000, 292, 0x6A61ED02,0xFB9EE2A5, + 0x40140000,0x00000000, 293, 0x6A866843,0xBA869B4E, + 0x40140000,0x00000000, 294, 0x6AAC0254,0xA9284222, + 0x40140000,0x00000000, 295, 0x6AD18174,0xE9B92955, + 0x40140000,0x00000000, 296, 0x6AF5E1D2,0x242773AA, + 0x40140000,0x00000000, 297, 0x6B1B5A46,0xAD315095, + 0x40140000,0x00000000, 298, 0x6B41186C,0x2C3ED25D, + 0x40140000,0x00000000, 299, 0x6B655E87,0x374E86F4, + 0x40140000,0x00000000, 300, 0x6B8AB629,0x052228B1, + 0x40180000,0x00000000, 2, 0x40560B9F,0xD68A4554, + 0x40180000,0x00000000, 3, 0x408088B7,0xE0E7B3FF, + 0x40180000,0x00000000, 4, 0x40A8CD13,0xD15B8DFF, + 0x40180000,0x00000000, 5, 0x40D299CE,0xDD04AA7F, + 0x40180000,0x00000000, 6, 0x40FBE6B6,0x4B86FFBF, + 0x40180000,0x00000000, 7, 0x4124ED08,0xB8A53FCF, + 0x40180000,0x00000000, 8, 0x414F638D,0x14F7DFB7, + 0x40180000,0x00000000, 9, 0x41778AA9,0xCFB9E7C9, + 0x40180000,0x00000000, 10, 0x41A1A7FF,0x5BCB6DD7, + 0x40180000,0x00000000, 11, 0x41CA7BFF,0x09B124C2, + 0x40180000,0x00000000, 12, 0x41F3DCFF,0x4744DB92, + 0x40180000,0x00000000, 13, 0x421DCB7E,0xEAE7495A, + 0x40180000,0x00000000, 14, 0x4246589F,0x302D7704, + 0x40180000,0x00000000, 15, 0x4270C277,0x64221943, + 0x40180000,0x00000000, 16, 0x429923B3,0x163325E4, + 0x40180000,0x00000000, 17, 0x42C2DAC6,0x50A65C6B, + 0x40180000,0x00000000, 18, 0x42EC4829,0x78F98AA1, + 0x40180000,0x00000000, 19, 0x4315361F,0x1ABB27F9, + 0x40180000,0x00000000, 20, 0x433FD12E,0xA818BBF5, + 0x40180000,0x00000000, 21, 0x4367DCE2,0xFE128CF8, + 0x40180000,0x00000000, 22, 0x4391E5AA,0x3E8DE9BA, + 0x40180000,0x00000000, 23, 0x43BAD87F,0x5DD4DE97, + 0x40180000,0x00000000, 24, 0x43E4225F,0x865FA6F1, + 0x40180000,0x00000000, 25, 0x440E338F,0x498F7A69, + 0x40180000,0x00000000, 26, 0x4436A6AB,0x772B9BCF, + 0x40180000,0x00000000, 27, 0x4460FD00,0x9960B4DB, + 0x40180000,0x00000000, 28, 0x44897B80,0xE6110F49, + 0x40180000,0x00000000, 29, 0x44B31CA0,0xAC8CCB77, + 0x40180000,0x00000000, 30, 0x44DCAAF1,0x02D33132, + 0x40180000,0x00000000, 31, 0x45058034,0xC21E64E5, + 0x40180000,0x00000000, 32, 0x45302027,0x9196CBAC, + 0x40180000,0x00000000, 33, 0x4558303B,0x5A623182, + 0x40180000,0x00000000, 34, 0x4582242C,0x83C9A522, + 0x40180000,0x00000000, 35, 0x45AB3642,0xC5AE77B2, + 0x40180000,0x00000000, 36, 0x45D468B2,0x1442D9C6, + 0x40180000,0x00000000, 37, 0x45FE9D0B,0x1E6446A9, + 0x40180000,0x00000000, 38, 0x4626F5C8,0x56CB34FF, + 0x40180000,0x00000000, 39, 0x46513856,0x411867BF, + 0x40180000,0x00000000, 40, 0x4679D481,0x61A49B9E, + 0x40180000,0x00000000, 41, 0x46A35F61,0x093B74B7, + 0x40180000,0x00000000, 42, 0x46CD0F11,0x8DD92F12, + 0x40180000,0x00000000, 43, 0x46F5CB4D,0x2A62E34E, + 0x40180000,0x00000000, 44, 0x47205879,0xDFCA2A7A, + 0x40180000,0x00000000, 45, 0x474884B6,0xCFAF3FB7, + 0x40180000,0x00000000, 46, 0x47726389,0x1BC36FCA, + 0x40180000,0x00000000, 47, 0x479B954D,0xA9A527AE, + 0x40180000,0x00000000, 48, 0x47C4AFFA,0x3F3BDDC3, + 0x40180000,0x00000000, 49, 0x47EF07F7,0x5ED9CCA4, + 0x40180000,0x00000000, 50, 0x481745F9,0x8723597B, + 0x40180000,0x00000000, 51, 0x4841747B,0x255A831C, + 0x40180000,0x00000000, 52, 0x486A2EB8,0xB807C4AA, + 0x40180000,0x00000000, 53, 0x4893A30A,0x8A05D380, + 0x40180000,0x00000000, 54, 0x48BD748F,0xCF08BD40, + 0x40180000,0x00000000, 55, 0x48E6176B,0xDB468DF0, + 0x40180000,0x00000000, 56, 0x49109190,0xE474EA74, + 0x40180000,0x00000000, 57, 0x4938DA59,0x56AF5FAE, + 0x40180000,0x00000000, 58, 0x4962A3C3,0x010387C2, + 0x40180000,0x00000000, 59, 0x498BF5A4,0x81854BA3, + 0x40180000,0x00000000, 60, 0x49B4F83B,0x6123F8BB, + 0x40180000,0x00000000, 61, 0x49DF7459,0x11B5F518, + 0x40180000,0x00000000, 62, 0x4A079742,0xCD4877D2, + 0x40180000,0x00000000, 63, 0x4A31B172,0x19F659DD, + 0x40180000,0x00000000, 64, 0x4A5A8A2B,0x26F186CC, + 0x40180000,0x00000000, 65, 0x4A83E7A0,0x5D352519, + 0x40180000,0x00000000, 66, 0x4AADDB70,0x8BCFB7A6, + 0x40180000,0x00000000, 67, 0x4AD66494,0x68DBC9BC, + 0x40180000,0x00000000, 68, 0x4B00CB6F,0x4EA4D74D, + 0x40180000,0x00000000, 69, 0x4B293126,0xF5F742F4, + 0x40180000,0x00000000, 70, 0x4B52E4DD,0x38797237, + 0x40180000,0x00000000, 71, 0x4B7C574B,0xD4B62B52, + 0x40180000,0x00000000, 72, 0x4BA54178,0xDF88A07E, + 0x40180000,0x00000000, 73, 0x4BCFE235,0x4F4CF0BD, + 0x40180000,0x00000000, 74, 0x4BF7E9A7,0xFB79B48D, + 0x40180000,0x00000000, 75, 0x4C21EF3D,0xFC9B476A, + 0x40180000,0x00000000, 76, 0x4C4AE6DC,0xFAE8EB1F, + 0x40180000,0x00000000, 77, 0x4C742D25,0xBC2EB057, + 0x40180000,0x00000000, 78, 0x4C9E43B8,0x9A460883, + 0x40180000,0x00000000, 79, 0x4CC6B2CA,0x73B48662, + 0x40180000,0x00000000, 80, 0x4CF10617,0xD6C764CA, + 0x40180000,0x00000000, 81, 0x4D198923,0xC22B172F, + 0x40180000,0x00000000, 82, 0x4D4326DA,0xD1A05163, + 0x40180000,0x00000000, 83, 0x4D6CBA48,0x3A707A14, + 0x40180000,0x00000000, 84, 0x4D958BB6,0x2BD45B8F, + 0x40180000,0x00000000, 85, 0x4DC028C8,0xA0DF44AB, + 0x40180000,0x00000000, 86, 0x4DE83D2C,0xF14EE701, + 0x40180000,0x00000000, 87, 0x4E122DE1,0xB4FB2D41, + 0x40180000,0x00000000, 88, 0x4E3B44D2,0x8F78C3E1, + 0x40180000,0x00000000, 89, 0x4E64739D,0xEB9A92E9, + 0x40180000,0x00000000, 90, 0x4E8EAD6C,0xE167DC5D, + 0x40180000,0x00000000, 91, 0x4EB70211,0xA90DE546, + 0x40180000,0x00000000, 92, 0x4EE1418D,0x3ECA6BF5, + 0x40180000,0x00000000, 93, 0x4F09E253,0xDE2FA1EF, + 0x40180000,0x00000000, 94, 0x4F3369BE,0xE6A3B973, + 0x40180000,0x00000000, 95, 0x4F5D1E9E,0x59F5962D, + 0x40180000,0x00000000, 96, 0x4F85D6F6,0xC37830A2, + 0x40180000,0x00000000, 97, 0x4FB06139,0x129A2479, + 0x40180000,0x00000000, 98, 0x4FD891D5,0x9BE736B6, + 0x40180000,0x00000000, 99, 0x50026D60,0x34ED6908, + 0x40180000,0x00000000, 100, 0x502BA410,0x4F641D8C, + 0x40180000,0x00000000, 101, 0x5054BB0C,0x3B8B1629, + 0x40180000,0x00000000, 102, 0x507F1892,0x5950A13E, + 0x40180000,0x00000000, 103, 0x50A7526D,0xC2FC78EF, + 0x40180000,0x00000000, 104, 0x50D17DD2,0x523D5AB3, + 0x40180000,0x00000000, 105, 0x50FA3CBB,0x7B5C080C, + 0x40180000,0x00000000, 106, 0x5123AD8C,0x9C850609, + 0x40180000,0x00000000, 107, 0x514D8452,0xEAC7890E, + 0x40180000,0x00000000, 108, 0x5176233E,0x3015A6CA, + 0x40180000,0x00000000, 109, 0x51A09A6E,0xA4103D18, + 0x40180000,0x00000000, 110, 0x51C8E7A5,0xF6185BA4, + 0x40180000,0x00000000, 111, 0x51F2ADBC,0x789244BB, + 0x40180000,0x00000000, 112, 0x521C049A,0xB4DB6718, + 0x40180000,0x00000000, 113, 0x52450374,0x07A48D52, + 0x40180000,0x00000000, 114, 0x526F852E,0x0B76D3FB, + 0x40180000,0x00000000, 115, 0x5297A3E2,0x88991EFC, + 0x40180000,0x00000000, 116, 0x52C1BAE9,0xE672D73D, + 0x40180000,0x00000000, 117, 0x52EA985E,0xD9AC42DC, + 0x40180000,0x00000000, 118, 0x5313F247,0x23413225, + 0x40180000,0x00000000, 119, 0x533DEB6A,0xB4E1CB37, + 0x40180000,0x00000000, 120, 0x53667090,0x07A9586A, + 0x40180000,0x00000000, 121, 0x5390D46C,0x05BF024F, + 0x40180000,0x00000000, 122, 0x53B93EA2,0x089E8377, + 0x40180000,0x00000000, 123, 0x53E2EEF9,0x8676E299, + 0x40180000,0x00000000, 124, 0x540C6676,0x49B253E6, + 0x40180000,0x00000000, 125, 0x54354CD8,0xB745BEEC, + 0x40180000,0x00000000, 126, 0x545FF345,0x12E89E62, + 0x40180000,0x00000000, 127, 0x5487F673,0xCE2E76CA, + 0x40180000,0x00000000, 128, 0x54B1F8D6,0xDAA2D917, + 0x40180000,0x00000000, 129, 0x54DAF542,0x47F445A3, + 0x40180000,0x00000000, 130, 0x550437F1,0xB5F7343A, + 0x40180000,0x00000000, 131, 0x552E53EA,0x90F2CE57, + 0x40180000,0x00000000, 132, 0x5556BEEF,0xECB61AC1, + 0x40180000,0x00000000, 133, 0x55810F33,0xF1889411, + 0x40180000,0x00000000, 134, 0x55A996CD,0xEA4CDE1A, + 0x40180000,0x00000000, 135, 0x55D3311A,0x6FB9A693, + 0x40180000,0x00000000, 136, 0x55FCC9A7,0xA79679DD, + 0x40180000,0x00000000, 137, 0x5625973D,0xBDB0DB66, + 0x40180000,0x00000000, 138, 0x5650316E,0x4E44A48C, + 0x40180000,0x00000000, 139, 0x56784A25,0x7566F6D2, + 0x40180000,0x00000000, 140, 0x56A2379C,0x180D391E, + 0x40180000,0x00000000, 141, 0x56CB536A,0x2413D5AD, + 0x40180000,0x00000000, 142, 0x56F47E8F,0x9B0EE041, + 0x40180000,0x00000000, 143, 0x571EBDD7,0x68965062, + 0x40180000,0x00000000, 144, 0x57470E61,0x8E70BC4A, + 0x40180000,0x00000000, 145, 0x57714AC9,0x2AD48D37, + 0x40180000,0x00000000, 146, 0x5799F02D,0xC03ED3D3, + 0x40180000,0x00000000, 147, 0x57C37422,0x502F1EDE, + 0x40180000,0x00000000, 148, 0x57ED2E33,0x7846AE4D, + 0x40180000,0x00000000, 149, 0x5815E2A6,0x9A3502BA, + 0x40180000,0x00000000, 150, 0x584069FC,0xF3A7C20B, + 0x40180000,0x00000000, 151, 0x58689EFB,0x6D7BA311, + 0x40180000,0x00000000, 152, 0x5892773C,0x921CBA4D, + 0x40180000,0x00000000, 153, 0x58BBB2DA,0xDB2B1773, + 0x40180000,0x00000000, 154, 0x58E4C624,0x24605196, + 0x40180000,0x00000000, 155, 0x590F2936,0x36907A62, + 0x40180000,0x00000000, 156, 0x59375EE8,0xA8EC5BC9, + 0x40180000,0x00000000, 157, 0x5961872E,0x7EB144D7, + 0x40180000,0x00000000, 158, 0x598A4AC5,0xBE09E742, + 0x40180000,0x00000000, 159, 0x59B3B814,0x4E876D72, + 0x40180000,0x00000000, 160, 0x59DD941E,0x75CB242B, + 0x40180000,0x00000000, 161, 0x5A062F16,0xD8585B20, + 0x40180000,0x00000000, 162, 0x5A30A351,0x22424458, + 0x40180000,0x00000000, 163, 0x5A58F4F9,0xB3636684, + 0x40180000,0x00000000, 164, 0x5A82B7BB,0x468A8CE3, + 0x40180000,0x00000000, 165, 0x5AAC1398,0xE9CFD355, + 0x40180000,0x00000000, 166, 0x5AD50EB2,0xAF5BDE7F, + 0x40180000,0x00000000, 167, 0x5AFF960C,0x0709CDBF, + 0x40180000,0x00000000, 168, 0x5B27B089,0x05475A4F, + 0x40180000,0x00000000, 169, 0x5B51C466,0xC3F583BC, + 0x40180000,0x00000000, 170, 0x5B7AA69A,0x25F04599, + 0x40180000,0x00000000, 171, 0x5BA3FCF3,0x9C743433, + 0x40180000,0x00000000, 172, 0x5BCDFB6D,0x6AAE4E4C, + 0x40180000,0x00000000, 173, 0x5BF67C92,0x1002BAB9, + 0x40180000,0x00000000, 174, 0x5C20DD6D,0x8C020C0B, + 0x40180000,0x00000000, 175, 0x5C494C24,0x52031211, + 0x40180000,0x00000000, 176, 0x5C72F91B,0x3D824D8C, + 0x40180000,0x00000000, 177, 0x5C9C75A8,0xDC437453, + 0x40180000,0x00000000, 178, 0x5CC5583E,0xA532973E, + 0x40180000,0x00000000, 179, 0x5CF0022E,0xFBE5F16E, + 0x40180000,0x00000000, 180, 0x5D180346,0x79D8EA26, + 0x40180000,0x00000000, 181, 0x5D420274,0xDB62AF9C, + 0x40180000,0x00000000, 182, 0x5D6B03AF,0x4914076A, + 0x40180000,0x00000000, 183, 0x5D9442C3,0x76CF0590, + 0x40180000,0x00000000, 184, 0x5DBE6425,0x32368858, + 0x40180000,0x00000000, 185, 0x5DE6CB1B,0xE5A8E642, + 0x40180000,0x00000000, 186, 0x5E111854,0xEC3EACB1, + 0x40180000,0x00000000, 187, 0x5E39A47F,0x625E030A, + 0x40180000,0x00000000, 188, 0x5E633B5F,0x89C68247, + 0x40180000,0x00000000, 189, 0x5E8CD90F,0x4EA9C36B, + 0x40180000,0x00000000, 190, 0x5EB5A2CB,0x7AFF5290, + 0x40180000,0x00000000, 191, 0x5EE03A18,0x9C3F7DEC, + 0x40180000,0x00000000, 192, 0x5F085724,0xEA5F3CE2, + 0x40180000,0x00000000, 193, 0x5F32415B,0xAFC76DAA, + 0x40180000,0x00000000, 194, 0x5F5B6209,0x87AB247F, + 0x40180000,0x00000000, 195, 0x5F848987,0x25C05B5F, + 0x40180000,0x00000000, 196, 0x5FAECE4A,0xB8A0890F, + 0x40180000,0x00000000, 197, 0x5FD71AB8,0x0A7866CB, + 0x40180000,0x00000000, 198, 0x6001540A,0x07DA4D18, + 0x40180000,0x00000000, 199, 0x6029FE0F,0x0BC773A4, + 0x40180000,0x00000000, 200, 0x60537E8B,0x48D596BB, + 0x40180000,0x00000000, 201, 0x607D3DD0,0xED406219, + 0x40180000,0x00000000, 202, 0x60A5EE5C,0xB1F04993, + 0x40180000,0x00000000, 203, 0x60D072C5,0x8574372E, + 0x40180000,0x00000000, 204, 0x60F8AC28,0x482E52C5, + 0x40180000,0x00000000, 205, 0x6122811E,0x3622BE14, + 0x40180000,0x00000000, 206, 0x614BC1AD,0x51341D1E, + 0x40180000,0x00000000, 207, 0x6174D141,0xFCE715D6, + 0x40180000,0x00000000, 208, 0x619F39E2,0xFB5AA0C1, + 0x40180000,0x00000000, 209, 0x61C76B6A,0x3C83F891, + 0x40180000,0x00000000, 210, 0x61F1908F,0xAD62FA6D, + 0x40180000,0x00000000, 211, 0x621A58D7,0x841477A3, + 0x40180000,0x00000000, 212, 0x6243C2A1,0xA30F59BA, + 0x40180000,0x00000000, 213, 0x626DA3F2,0x74970698, + 0x40180000,0x00000000, 214, 0x62963AF5,0xD77144F2, + 0x40180000,0x00000000, 215, 0x62C0AC38,0x6194F3B5, + 0x40180000,0x00000000, 216, 0x62E90254,0x925F6D90, + 0x40180000,0x00000000, 217, 0x6312C1BF,0x6DC7922C, + 0x40180000,0x00000000, 218, 0x633C229F,0x24AB5B42, + 0x40180000,0x00000000, 219, 0x636519F7,0x5B808471, + 0x40180000,0x00000000, 220, 0x638FA6F3,0x0940C6AA, + 0x40180000,0x00000000, 221, 0x63B7BD36,0x46F09500, + 0x40180000,0x00000000, 222, 0x63E1CDE8,0xB5346FC0, + 0x40180000,0x00000000, 223, 0x640AB4DD,0x0FCEA79F, + 0x40180000,0x00000000, 224, 0x643407A5,0xCBDAFDB8, + 0x40180000,0x00000000, 225, 0x645E0B78,0xB1C87C93, + 0x40180000,0x00000000, 226, 0x6486889A,0x85565D6F, + 0x40180000,0x00000000, 227, 0x64B0E673,0xE400C613, + 0x40180000,0x00000000, 228, 0x64D959AD,0xD601291C, + 0x40180000,0x00000000, 229, 0x65030342,0x6080DED5, + 0x40180000,0x00000000, 230, 0x652C84E3,0x90C14E40, + 0x40180000,0x00000000, 231, 0x655563AA,0xAC90FAB0, + 0x40180000,0x00000000, 232, 0x65800AC0,0x016CBC04, + 0x40180000,0x00000000, 233, 0x65A81020,0x02231A06, + 0x40180000,0x00000000, 234, 0x65D20C18,0x019A5384, + 0x40180000,0x00000000, 235, 0x65FB1224,0x02677D47, + 0x40180000,0x00000000, 236, 0x66244D9B,0x01CD9DF5, + 0x40180000,0x00000000, 237, 0x664E7468,0x82B46CF0, + 0x40180000,0x00000000, 238, 0x6676D74E,0x620751B4, + 0x40180000,0x00000000, 239, 0x66A1217A,0xC9857D47, + 0x40180000,0x00000000, 240, 0x66C9B238,0x2E483BEA, + 0x40180000,0x00000000, 241, 0x66F345AA,0x22B62CF0, + 0x40180000,0x00000000, 242, 0x671CE87F,0x34114367, + 0x40180000,0x00000000, 243, 0x6745AE5F,0x670CF28E, + 0x40180000,0x00000000, 244, 0x677042C7,0x8D49B5EA, + 0x40180000,0x00000000, 245, 0x6798642B,0x53EE90DF, + 0x40180000,0x00000000, 246, 0x67C24B20,0x7EF2ECA7, + 0x40180000,0x00000000, 247, 0x67EB70B0,0xBE6C62FB, + 0x40180000,0x00000000, 248, 0x68149484,0x8ED14A3C, + 0x40180000,0x00000000, 249, 0x683EDEC6,0xD639EF5B, + 0x40180000,0x00000000, 250, 0x68672715,0x20AB7384, + 0x40180000,0x00000000, 251, 0x68915D4F,0xD88096A3, + 0x40180000,0x00000000, 252, 0x68BA0BF7,0xC4C0E1F4, + 0x40180000,0x00000000, 253, 0x68E388F9,0xD390A977, + 0x40180000,0x00000000, 254, 0x690D4D76,0xBD58FE33, + 0x40180000,0x00000000, 255, 0x6935FA19,0x0E02BEA6, + 0x40180000,0x00000000, 256, 0x69607B92,0xCA820EFD, + 0x40180000,0x00000000, 257, 0x6988B95C,0x2FC3167B, + 0x40180000,0x00000000, 258, 0x69B28B05,0x23D250DC, + 0x40180000,0x00000000, 259, 0x69DBD087,0xB5BB794A, + 0x40180000,0x00000000, 260, 0x6A04DC65,0xC84C9AF8, + 0x40180000,0x00000000, 261, 0x6A2F4A98,0xAC72E874, + 0x40180000,0x00000000, 262, 0x6A5777F2,0x81562E57, + 0x40180000,0x00000000, 263, 0x6A8199F5,0xE100A2C1, + 0x40180000,0x00000000, 264, 0x6AAA66F0,0xD180F422, + 0x40180000,0x00000000, 265, 0x6AD3CD34,0x9D20B719, + 0x40180000,0x00000000, 266, 0x6AFDB3CE,0xEBB112A6, + 0x40180000,0x00000000, 267, 0x6B2646DB,0x30C4CDFC, + 0x40180000,0x00000000, 268, 0x6B50B524,0x64939A7D, + 0x40180000,0x00000000, 269, 0x6B790FB6,0x96DD67BC, + 0x40180000,0x00000000, 270, 0x6BA2CBC8,0xF1260DCD, + 0x40180000,0x00000000, 271, 0x6BCC31AD,0x69B914B3, + 0x40180000,0x00000000, 272, 0x6BF52542,0x0F4ACF86, + 0x40180000,0x00000000, 273, 0x6C1FB7E3,0x16F0374A, + 0x40180000,0x00000000, 274, 0x6C47C9EA,0x51342977, + 0x40180000,0x00000000, 275, 0x6C71D76F,0xBCE71F19, + 0x40180000,0x00000000, 276, 0x6C9AC327,0x9B5AAEA6, + 0x40180000,0x00000000, 277, 0x6CC4125D,0xB48402FD, + 0x40180000,0x00000000, 278, 0x6CEE1B8C,0x8EC6047B, + 0x40180000,0x00000000, 279, 0x6D1694A9,0x6B14835C, + 0x40180000,0x00000000, 280, 0x6D40EF7F,0x104F6285, + 0x40180000,0x00000000, 281, 0x6D69673E,0x987713C8, + 0x40180000,0x00000000, 282, 0x6D930D6E,0xF2594ED6, + 0x40180000,0x00000000, 283, 0x6DBC9426,0x6B85F641, + 0x40180000,0x00000000, 284, 0x6DE56F1C,0xD0A478B1, + 0x40180000,0x00000000, 285, 0x6E101355,0x9C7B5A84, + 0x40180000,0x00000000, 286, 0x6E381D00,0x6AB907C7, + 0x40180000,0x00000000, 287, 0x6E6215C0,0x500AC5D5, + 0x40180000,0x00000000, 288, 0x6E8B20A0,0x781028BF, + 0x40180000,0x00000000, 289, 0x6EB45878,0x5A0C1E90, + 0x40180000,0x00000000, 290, 0x6EDE84B4,0x87122DD7, + 0x40180000,0x00000000, 291, 0x6F06E387,0x654DA262, + 0x40180000,0x00000000, 292, 0x6F312AA5,0x8BFA39C9, + 0x40180000,0x00000000, 293, 0x6F59BFF8,0x51F756AE, + 0x40180000,0x00000000, 294, 0x6F834FFA,0x3D798102, + 0x40180000,0x00000000, 295, 0x6FACF7F7,0x5C364183, + 0x40180000,0x00000000, 296, 0x6FD5B9F9,0x8528B123, + 0x40180000,0x00000000, 297, 0x70004B7B,0x23DE84DA, + 0x40180000,0x00000000, 298, 0x70287138,0xB5CDC747, + 0x40180000,0x00000000, 299, 0x705254EA,0x885A5575, + 0x40180000,0x00000000, 300, 0x707B7F5F,0xCC878030, + 0x401C0000,0x00000000, 2, 0x40603489,0xBE058693, + 0x401C0000,0x00000000, 3, 0x408C5BF1,0x0C89AB81, + 0x401C0000,0x00000000, 4, 0x40B8D072,0xEAF87611, + 0x401C0000,0x00000000, 5, 0x40E5B664,0x8D99674F, + 0x401C0000,0x00000000, 6, 0x4112FF97,0xFBE63A65, + 0x401C0000,0x00000000, 7, 0x41409FA4,0xFC697318, + 0x401C0000,0x00000000, 8, 0x416D1760,0xB9B8896B, + 0x401C0000,0x00000000, 9, 0x41997474,0xA281783D, + 0x401C0000,0x00000000, 10, 0x41C645E6,0x0E314936, + 0x401C0000,0x00000000, 11, 0x41F37D29,0x4C6B200F, + 0x401C0000,0x00000000, 12, 0x42210D84,0x22DDBC0D, + 0x401C0000,0x00000000, 13, 0x424DD7A7,0x3D040917, + 0x401C0000,0x00000000, 14, 0x427A1CB2,0x556387F4, + 0x401C0000,0x00000000, 15, 0x42A6D91C,0x0AB716F6, + 0x401C0000,0x00000000, 16, 0x42D3FDF8,0x89603417, + 0x401C0000,0x00000000, 17, 0x43017E39,0x78342D94, + 0x401C0000,0x00000000, 18, 0x432E9CE4,0x925B4FC3, + 0x401C0000,0x00000000, 19, 0x435AC948,0x000FE5CB, + 0x401C0000,0x00000000, 20, 0x4387701F,0x000DE911, + 0x401C0000,0x00000000, 21, 0x43B4821B,0x200C2BEF, + 0x401C0000,0x00000000, 22, 0x43E1F1D7,0xBC0AA671, + 0x401C0000,0x00000000, 23, 0x440F6739,0x8912A346, + 0x401C0000,0x00000000, 24, 0x443B7A52,0x57F04EDD, + 0x401C0000,0x00000000, 25, 0x44680B08,0x0CF24502, + 0x401C0000,0x00000000, 26, 0x449509A7,0x0B53FC62, + 0x401C0000,0x00000000, 27, 0x44C26872,0x29E97CD5, + 0x401C0000,0x00000000, 28, 0x44F01B63,0xE4AC4D3B, + 0x401C0000,0x00000000, 29, 0x451C2FEE,0xD02D8727, + 0x401C0000,0x00000000, 30, 0x4548A9F0,0xF627D642, + 0x401C0000,0x00000000, 31, 0x457594B2,0xD762DB7A, + 0x401C0000,0x00000000, 32, 0x45A2E21C,0x7C76800A, + 0x401C0000,0x00000000, 33, 0x45D085D8,0xECE7B009, + 0x401C0000,0x00000000, 34, 0x45FCEA3B,0x9E957410, + 0x401C0000,0x00000000, 35, 0x46294CF4,0x2AC2C58E, + 0x401C0000,0x00000000, 36, 0x46562355,0xA56A6CDC, + 0x401C0000,0x00000000, 37, 0x46835EEA,0xF0BD1F41, + 0x401C0000,0x00000000, 38, 0x46B0F30D,0x92A57B59, + 0x401C0000,0x00000000, 39, 0x46DDA957,0xC0A197DB, + 0x401C0000,0x00000000, 40, 0x4709F42C,0xC88D64E0, + 0x401C0000,0x00000000, 41, 0x4736B5A7,0x2F7BB844, + 0x401C0000,0x00000000, 42, 0x4763DEF2,0x498C413B, + 0x401C0000,0x00000000, 43, 0x47916314,0x005AB914, + 0x401C0000,0x00000000, 44, 0x47BE6D63,0x009EC3E3, + 0x401C0000,0x00000000, 45, 0x47EA9FB6,0xA08AEB66, + 0x401C0000,0x00000000, 46, 0x48174BBF,0xCC798DFA, + 0x401C0000,0x00000000, 47, 0x48446247,0xD2EA5C3A, + 0x401C0000,0x00000000, 48, 0x4871D5FE,0xD88D10B3, + 0x401C0000,0x00000000, 49, 0x489F367D,0xFAF6DD39, + 0x401C0000,0x00000000, 50, 0x48CB4FAE,0x3B980192, + 0x401C0000,0x00000000, 51, 0x48F7E5B8,0x74250160, + 0x401C0000,0x00000000, 52, 0x4924E901,0x65A06134, + 0x401C0000,0x00000000, 53, 0x49524BE1,0x38EC550D, + 0x401C0000,0x00000000, 54, 0x49800265,0x11CECA6C, + 0x401C0000,0x00000000, 55, 0x49AC0430,0xDF29E23D, + 0x401C0000,0x00000000, 56, 0x49D883AA,0xC344A5F5, + 0x401C0000,0x00000000, 57, 0x4A057335,0x6ADC1136, + 0x401C0000,0x00000000, 58, 0x4A32C4CE,0xBD808F10, + 0x401C0000,0x00000000, 59, 0x4A606C34,0xE5D07D2E, + 0x401C0000,0x00000000, 60, 0x4A8CBD5C,0x922CDB10, + 0x401C0000,0x00000000, 61, 0x4AB925B0,0xFFE73FAE, + 0x401C0000,0x00000000, 62, 0x4AE600FA,0xDFEA57B8, + 0x401C0000,0x00000000, 63, 0x4B1340DB,0x83ED0CC1, + 0x401C0000,0x00000000, 64, 0x4B40D8C0,0x136F6B29, + 0x401C0000,0x00000000, 65, 0x4B6D7B50,0x2202FB88, + 0x401C0000,0x00000000, 66, 0x4B99CBE6,0x1DC29C17, + 0x401C0000,0x00000000, 67, 0x4BC69269,0x5A0A4894, + 0x401C0000,0x00000000, 68, 0x4BF3C01C,0x2EC8FF81, + 0x401C0000,0x00000000, 69, 0x4C214818,0xA8EFDF91, + 0x401C0000,0x00000000, 70, 0x4C4E3E2B,0x27A3C73E, + 0x401C0000,0x00000000, 71, 0x4C7A7665,0xC2AF4E56, + 0x401C0000,0x00000000, 72, 0x4CA72799,0x0A59648C, + 0x401C0000,0x00000000, 73, 0x4CD442A5,0xE90E37FA, + 0x401C0000,0x00000000, 74, 0x4D01BA51,0x2BEC70FB, + 0x401C0000,0x00000000, 75, 0x4D2F060E,0x0CDDC5B7, + 0x401C0000,0x00000000, 76, 0x4D5B254C,0x4B420D00, + 0x401C0000,0x00000000, 77, 0x4D87C0A2,0xC1D9CB60, + 0x401C0000,0x00000000, 78, 0x4DB4C88E,0x699E91F4, + 0x401C0000,0x00000000, 79, 0x4DE22F7C,0x9C6ABFB6, + 0x401C0000,0x00000000, 80, 0x4E0FD31A,0x11BACF7E, + 0x401C0000,0x00000000, 81, 0x4E3BD8B6,0xCF83758E, + 0x401C0000,0x00000000, 82, 0x4E685D9F,0xF59306DC, + 0x401C0000,0x00000000, 83, 0x4E9551EB,0xF6E0A601, + 0x401C0000,0x00000000, 84, 0x4EC2A7AE,0x78049141, + 0x401C0000,0x00000000, 85, 0x4EF052B8,0xA903FF19, + 0x401C0000,0x00000000, 86, 0x4F1C90C3,0x27C6FE6B, + 0x401C0000,0x00000000, 87, 0x4F48FEAA,0xC2CE1E9E, + 0x401C0000,0x00000000, 88, 0x4F75DED5,0x6A745ACA, + 0x401C0000,0x00000000, 89, 0x4FA322FA,0xBD25CF71, + 0x401C0000,0x00000000, 90, 0x4FD0BE9B,0x65811583, + 0x401C0000,0x00000000, 91, 0x4FFD4D8F,0xF1A1E5A5, + 0x401C0000,0x00000000, 92, 0x5029A3DD,0xF36DA8F0, + 0x401C0000,0x00000000, 93, 0x50566F62,0x34FFF3D2, + 0x401C0000,0x00000000, 94, 0x5083A175,0xEE5FF558, + 0x401C0000,0x00000000, 95, 0x50B12D47,0x3093F6AD, + 0x401C0000,0x00000000, 96, 0x50DE0F3C,0x9502EFAE, + 0x401C0000,0x00000000, 97, 0x510A4D55,0x026291B9, + 0x401C0000,0x00000000, 98, 0x513703AA,0x62163F82, + 0x401C0000,0x00000000, 99, 0x51642335,0x15D37791, + 0x401C0000,0x00000000, 100, 0x51919ECE,0x7319089F, + 0x401C0000,0x00000000, 101, 0x51BED5E9,0x496BCF17, + 0x401C0000,0x00000000, 102, 0x51EAFB2C,0x203E5534, + 0x401C0000,0x00000000, 103, 0x52179BC6,0x9C368A8D, + 0x401C0000,0x00000000, 104, 0x5244A84D,0xC8AFB93C, + 0x401C0000,0x00000000, 105, 0x52721344,0x0F99C214, + 0x401C0000,0x00000000, 106, 0x529FA1B7,0x1B4D13A3, + 0x401C0000,0x00000000, 107, 0x52CBAD80,0x37E3712F, + 0x401C0000,0x00000000, 108, 0x52F837D0,0x30E70309, + 0x401C0000,0x00000000, 109, 0x532530D6,0x2ACA22A8, + 0x401C0000,0x00000000, 110, 0x53528ABB,0x6570DE53, + 0x401C0000,0x00000000, 111, 0x53803963,0xF8C2C289, + 0x401C0000,0x00000000, 112, 0x53AC646E,0xF354D46F, + 0x401C0000,0x00000000, 113, 0x53D8D7E1,0x14EA39E1, + 0x401C0000,0x00000000, 114, 0x5405BCE4,0xF24CF2A5, + 0x401C0000,0x00000000, 115, 0x54330548,0x54035450, + 0x401C0000,0x00000000, 116, 0x5460A49F,0x4982E9C6, + 0x401C0000,0x00000000, 117, 0x548D2016,0xC0A5191B, + 0x401C0000,0x00000000, 118, 0x54B97C13,0xE89075F8, + 0x401C0000,0x00000000, 119, 0x54E64C91,0x6B7E6739, + 0x401C0000,0x00000000, 120, 0x551382FF,0x3E0E9A52, + 0x401C0000,0x00000000, 121, 0x5541129F,0x564CC707, + 0x401C0000,0x00000000, 122, 0x556DE096,0xD7065C4D, + 0x401C0000,0x00000000, 123, 0x559A2483,0xFC2590C3, + 0x401C0000,0x00000000, 124, 0x55C6DFF3,0x7CA0DEAB, + 0x401C0000,0x00000000, 125, 0x55F403F5,0x0D0CC2D6, + 0x401C0000,0x00000000, 126, 0x56218376,0x6B6B2A7B, + 0x401C0000,0x00000000, 127, 0x564EA60F,0x3BFB8A57, + 0x401C0000,0x00000000, 128, 0x567AD14D,0x547C190C, + 0x401C0000,0x00000000, 129, 0x56A77723,0xA9EC95EB, + 0x401C0000,0x00000000, 130, 0x56D4883F,0x34AF032D, + 0x401C0000,0x00000000, 131, 0x5701F737,0x4E1922C8, + 0x401C0000,0x00000000, 132, 0x572F70A0,0xC8ABFCDD, + 0x401C0000,0x00000000, 133, 0x575B828C,0xAF967D42, + 0x401C0000,0x00000000, 134, 0x5788123B,0x19A3AD99, + 0x401C0000,0x00000000, 135, 0x57B50FF3,0xB66F37E6, + 0x401C0000,0x00000000, 136, 0x57E26DF5,0x3FA150E9, + 0x401C0000,0x00000000, 137, 0x58102036,0x97AD26CC, + 0x401C0000,0x00000000, 138, 0x583C385F,0x896F03E5, + 0x401C0000,0x00000000, 139, 0x5868B153,0x98412369, + 0x401C0000,0x00000000, 140, 0x58959B29,0x2538FEFC, + 0x401C0000,0x00000000, 141, 0x58C2E7C4,0x0091DF1C, + 0x401C0000,0x00000000, 142, 0x58F08ACB,0x807FA339, + 0x401C0000,0x00000000, 143, 0x591CF2E4,0x20DF5DA3, + 0x401C0000,0x00000000, 144, 0x59495487,0x9CC371EF, + 0x401C0000,0x00000000, 145, 0x597629F6,0xA92B03B1, + 0x401C0000,0x00000000, 146, 0x59A364B7,0xD405A33B, + 0x401C0000,0x00000000, 147, 0x59D0F820,0xD984EED4, + 0x401C0000,0x00000000, 148, 0x59FDB239,0x7CA8A1F2, + 0x401C0000,0x00000000, 149, 0x5A29FBF2,0x4D138DB4, + 0x401C0000,0x00000000, 150, 0x5A56BC74,0x03711BFD, + 0x401C0000,0x00000000, 151, 0x5A83E4E5,0x8302F87E, + 0x401C0000,0x00000000, 152, 0x5AB16848,0xD2A2996E, + 0x401C0000,0x00000000, 153, 0x5ADE767F,0x709C8C80, + 0x401C0000,0x00000000, 154, 0x5B0AA7AF,0x8288FAF0, + 0x401C0000,0x00000000, 155, 0x5B3752B9,0x9237DB92, + 0x401C0000,0x00000000, 156, 0x5B646862,0x5FF0E020, + 0x401C0000,0x00000000, 157, 0x5B91DB56,0x13F2C41C, + 0x401C0000,0x00000000, 158, 0x5BBF3FD6,0xA2E8D731, + 0x401C0000,0x00000000, 159, 0x5BEB57DB,0xCE8BBC4B, + 0x401C0000,0x00000000, 160, 0x5C17ECE0,0x54BA44C2, + 0x401C0000,0x00000000, 161, 0x5C44EF44,0x4A22FC29, + 0x401C0000,0x00000000, 162, 0x5C72515B,0xC0DE9CA4, + 0x401C0000,0x00000000, 163, 0x5CA00730,0x48C2C910, + 0x401C0000,0x00000000, 164, 0x5CCC0C94,0x7F54DFDB, + 0x401C0000,0x00000000, 165, 0x5CF88B01,0xEF6A43E0, + 0x401C0000,0x00000000, 166, 0x5D2579A1,0xB17CFB64, + 0x401C0000,0x00000000, 167, 0x5D52CA6D,0x7B4D5BF8, + 0x401C0000,0x00000000, 168, 0x5D80711F,0xCBE3B079, + 0x401C0000,0x00000000, 169, 0x5DACC5F7,0xA4CE74D3, + 0x401C0000,0x00000000, 170, 0x5DD92D38,0xB034A639, + 0x401C0000,0x00000000, 171, 0x5E060791,0x9A2E1172, + 0x401C0000,0x00000000, 172, 0x5E33469F,0x66E84F43, + 0x401C0000,0x00000000, 173, 0x5E60DDCB,0x7A0B455B, + 0x401C0000,0x00000000, 174, 0x5E8D8424,0x1593B95F, + 0x401C0000,0x00000000, 175, 0x5EB9D39F,0x92E14233, + 0x401C0000,0x00000000, 176, 0x5EE6992B,0xA08519ED, + 0x401C0000,0x00000000, 177, 0x5F13C606,0x2C7476AF, + 0x401C0000,0x00000000, 178, 0x5F414D45,0x66E5E7D9, + 0x401C0000,0x00000000, 179, 0x5F6E4739,0x741255BC, + 0x401C0000,0x00000000, 180, 0x5F9A7E52,0x45900B05, + 0x401C0000,0x00000000, 181, 0x5FC72E87,0xFCDE09A4, + 0x401C0000,0x00000000, 182, 0x5FF448B6,0xFD424870, + 0x401C0000,0x00000000, 183, 0x6021BFA0,0x1D99FF62, + 0x401C0000,0x00000000, 184, 0x604F0F58,0x33CD7EEB, + 0x401C0000,0x00000000, 185, 0x607B2D6D,0x2D53CF0E, + 0x401C0000,0x00000000, 186, 0x60A7C7BF,0x87A9552C, + 0x401C0000,0x00000000, 187, 0x60D4CEC7,0x96B42A86, + 0x401C0000,0x00000000, 188, 0x610234EE,0xA3DDA536, + 0x401C0000,0x00000000, 189, 0x612FDCA1,0x9EC3E11E, + 0x401C0000,0x00000000, 190, 0x615BE10D,0x6AEB64FA, + 0x401C0000,0x00000000, 191, 0x618864EB,0xBD8DF85B, + 0x401C0000,0x00000000, 192, 0x61B5584E,0x45DC3950, + 0x401C0000,0x00000000, 193, 0x61E2AD44,0x7D20B226, + 0x401C0000,0x00000000, 194, 0x6210579B,0xED7C9BE1, + 0x401C0000,0x00000000, 195, 0x623C9950,0xDF9A10CA, + 0x401C0000,0x00000000, 196, 0x62690626,0xC3A6CEB0, + 0x401C0000,0x00000000, 197, 0x6295E561,0xEB31F4DA, + 0x401C0000,0x00000000, 198, 0x62C328B5,0xADCBB63F, + 0x401C0000,0x00000000, 199, 0x62F0C39E,0xF8123F77, + 0x401C0000,0x00000000, 200, 0x631D5656,0x321FEF10, + 0x401C0000,0x00000000, 201, 0x6349AB8B,0x6BDBF12E, + 0x401C0000,0x00000000, 202, 0x63767619,0xFE607309, + 0x401C0000,0x00000000, 203, 0x63A3A756,0xBE9464A8, + 0x401C0000,0x00000000, 204, 0x63D1326B,0xE6C1D813, + 0x401C0000,0x00000000, 205, 0x63FE183C,0xD3D33A21, + 0x401C0000,0x00000000, 206, 0x642A5535,0x3958D2DC, + 0x401C0000,0x00000000, 207, 0x64570A8E,0x922DB881, + 0x401C0000,0x00000000, 208, 0x6484293C,0xBFE80171, + 0x401C0000,0x00000000, 209, 0x64B1A415,0x27EB0143, + 0x401C0000,0x00000000, 210, 0x64DEDF25,0x05DB4235, + 0x401C0000,0x00000000, 211, 0x650B0340,0x651FD9EE, + 0x401C0000,0x00000000, 212, 0x6537A2D8,0x587BDEB0, + 0x401C0000,0x00000000, 213, 0x6564AE7D,0x4D6C62DA, + 0x401C0000,0x00000000, 214, 0x659218AD,0xA3BED67F, + 0x401C0000,0x00000000, 215, 0x65BFAB2F,0xDE8DF75E, + 0x401C0000,0x00000000, 216, 0x65EBB5C9,0xE2BC3873, + 0x401C0000,0x00000000, 217, 0x66183F10,0xA664B164, + 0x401C0000,0x00000000, 218, 0x6645372E,0x91981B38, + 0x401C0000,0x00000000, 219, 0x66729048,0xBF6517D1, + 0x401C0000,0x00000000, 220, 0x66A03E3F,0xA77874D7, + 0x401C0000,0x00000000, 221, 0x66CC6CEF,0x6512CC78, + 0x401C0000,0x00000000, 222, 0x66F8DF51,0x787072E9, + 0x401C0000,0x00000000, 223, 0x6725C367,0x4962648C, + 0x401C0000,0x00000000, 224, 0x67530AFA,0x603617FA, + 0x401C0000,0x00000000, 225, 0x6780A99B,0x142F54FB, + 0x401C0000,0x00000000, 226, 0x67AD28CF,0x6352D4B7, + 0x401C0000,0x00000000, 227, 0x67D983B5,0x76E87A20, + 0x401C0000,0x00000000, 228, 0x6806533E,0xC80B6ADC, + 0x401C0000,0x00000000, 229, 0x683388D6,0xEF09FD81, + 0x401C0000,0x00000000, 230, 0x686117BC,0x1128BDD1, + 0x401C0000,0x00000000, 231, 0x688DE989,0x1E074C2D, + 0x401C0000,0x00000000, 232, 0x68BA2C57,0xFA4662A7, + 0x401C0000,0x00000000, 233, 0x68E6E6CC,0xFAFD9652, + 0x401C0000,0x00000000, 234, 0x691409F3,0x5B9DE388, + 0x401C0000,0x00000000, 235, 0x694188B4,0xF02A2717, + 0x401C0000,0x00000000, 236, 0x696EAF3C,0xA449C468, + 0x401C0000,0x00000000, 237, 0x699AD955,0x0FC08BDB, + 0x401C0000,0x00000000, 238, 0x69C77E2A,0x6DC87A60, + 0x401C0000,0x00000000, 239, 0x69F48E65,0x200F6B14, + 0x401C0000,0x00000000, 240, 0x6A21FC98,0x7C0D7DB1, + 0x401C0000,0x00000000, 241, 0x6A4F7A0A,0xD9179BF7, + 0x401C0000,0x00000000, 242, 0x6A7B8AC9,0x7DF4A878, + 0x401C0000,0x00000000, 243, 0x6AA81970,0x4E361369, + 0x401C0000,0x00000000, 244, 0x6AD51642,0x446F50FC, + 0x401C0000,0x00000000, 245, 0x6B027379,0xFBE166DC, + 0x401C0000,0x00000000, 246, 0x6B30250A,0xBC653A01, + 0x401C0000,0x00000000, 247, 0x6B5C40D2,0xC9B12581, + 0x401C0000,0x00000000, 248, 0x6B88B8B8,0x707B00D1, + 0x401C0000,0x00000000, 249, 0x6BB5A1A1,0x626BA0B7, + 0x401C0000,0x00000000, 250, 0x6BE2ED6D,0x361E2CA0, + 0x401C0000,0x00000000, 251, 0x6C108FBF,0x8F5A670C, + 0x401C0000,0x00000000, 252, 0x6C3CFB8F,0x3ADE3455, + 0x401C0000,0x00000000, 253, 0x6C695C1D,0x53826DCA, + 0x401C0000,0x00000000, 254, 0x6C963099,0xA9122011, + 0x401C0000,0x00000000, 255, 0x6CC36A86,0x73EFDC0F, + 0x401C0000,0x00000000, 256, 0x6CF0FD35,0xA571E08D, + 0x401C0000,0x00000000, 257, 0x6D1DBB1D,0xE18748F7, + 0x401C0000,0x00000000, 258, 0x6D4A03BA,0x25565FD8, + 0x401C0000,0x00000000, 259, 0x6D76C342,0xE0AB93DD, + 0x401C0000,0x00000000, 260, 0x6DA3EADA,0x84962161, + 0x401C0000,0x00000000, 261, 0x6DD16D7F,0x34035D35, + 0x401C0000,0x00000000, 262, 0x6DFE7F9E,0x9B05E31D, + 0x401C0000,0x00000000, 263, 0x6E2AAFAA,0xC7A526BA, + 0x401C0000,0x00000000, 264, 0x6E5759B5,0x6EB081E2, + 0x401C0000,0x00000000, 265, 0x6E846E7E,0xC0DA71A6, + 0x401C0000,0x00000000, 266, 0x6EB1E0AE,0xE8BF2371, + 0x401C0000,0x00000000, 267, 0x6EDF4932,0x174E7E06, + 0x401C0000,0x00000000, 268, 0x6F0B600B,0xD464AE45, + 0x401C0000,0x00000000, 269, 0x6F37F40A,0x59D8187D, + 0x401C0000,0x00000000, 270, 0x6F64F589,0x0E9D156D, + 0x401C0000,0x00000000, 271, 0x6F9256D7,0xECC972C0, + 0x401C0000,0x00000000, 272, 0x6FC00BFC,0xEF304468, + 0x401C0000,0x00000000, 273, 0x6FEC14FA,0xA29477B5, + 0x401C0000,0x00000000, 274, 0x7018925B,0x4E41E8BF, + 0x401C0000,0x00000000, 275, 0x7045800F,0xE479ABA7, + 0x401C0000,0x00000000, 276, 0x7072D00D,0xE7EA7632, + 0x401C0000,0x00000000, 277, 0x70A0760C,0x2AED276C, + 0x401C0000,0x00000000, 278, 0x70CCCE95,0x4B1F04FD, + 0x401C0000,0x00000000, 279, 0x70F934C2,0xA1BB245D, + 0x401C0000,0x00000000, 280, 0x71260E2A,0x4D83BFD1, + 0x401C0000,0x00000000, 281, 0x71534C65,0x03D347D7, + 0x401C0000,0x00000000, 282, 0x7180E2D8,0x6358DEDC, + 0x401C0000,0x00000000, 283, 0x71AD8CFA,0xADDB8601, + 0x401C0000,0x00000000, 284, 0x71D9DB5B,0x58201541, + 0x401C0000,0x00000000, 285, 0x72069FEF,0xED1C1299, + 0x401C0000,0x00000000, 286, 0x7233CBF1,0xEF789046, + 0x401C0000,0x00000000, 287, 0x72615273,0xB1897E3D, + 0x401C0000,0x00000000, 288, 0x728E504A,0x76B09CEB, + 0x401C0000,0x00000000, 289, 0x72BA8641,0x27DA894E, + 0x401C0000,0x00000000, 290, 0x72E73579,0x02DF3824, + 0x401C0000,0x00000000, 291, 0x73144EC9,0xE2835120, + 0x401C0000,0x00000000, 292, 0x7341C4F0,0xA632E6FC, + 0x401C0000,0x00000000, 293, 0x736F18A5,0x22D91438, + 0x401C0000,0x00000000, 294, 0x739B3590,0x7E7DF1B1, + 0x401C0000,0x00000000, 295, 0x73C7CEDE,0x6EAE337B, + 0x401C0000,0x00000000, 296, 0x73F4D502,0xA0D86D0C, + 0x401C0000,0x00000000, 297, 0x74223A62,0x4CBD5F6A, + 0x401C0000,0x00000000, 298, 0x744FE62C,0x064B66FA, + 0x401C0000,0x00000000, 299, 0x747BE966,0x8581FA1B, + 0x401C0000,0x00000000, 300, 0x74A86C39,0xB4D1BAD7, + 0x40200000,0x00000000, 2, 0x4066A09E,0x667F3BCD, + 0x40200000,0x00000000, 3, 0x4096A09E,0x667F3BCD, + 0x40200000,0x00000000, 4, 0x40C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 5, 0x40F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 6, 0x4126A09E,0x667F3BCD, + 0x40200000,0x00000000, 7, 0x4156A09E,0x667F3BCD, + 0x40200000,0x00000000, 8, 0x4186A09E,0x667F3BCD, + 0x40200000,0x00000000, 9, 0x41B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 10, 0x41E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 11, 0x4216A09E,0x667F3BCD, + 0x40200000,0x00000000, 12, 0x4246A09E,0x667F3BCD, + 0x40200000,0x00000000, 13, 0x4276A09E,0x667F3BCD, + 0x40200000,0x00000000, 14, 0x42A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 15, 0x42D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 16, 0x4306A09E,0x667F3BCD, + 0x40200000,0x00000000, 17, 0x4336A09E,0x667F3BCD, + 0x40200000,0x00000000, 18, 0x4366A09E,0x667F3BCD, + 0x40200000,0x00000000, 19, 0x4396A09E,0x667F3BCD, + 0x40200000,0x00000000, 20, 0x43C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 21, 0x43F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 22, 0x4426A09E,0x667F3BCD, + 0x40200000,0x00000000, 23, 0x4456A09E,0x667F3BCD, + 0x40200000,0x00000000, 24, 0x4486A09E,0x667F3BCD, + 0x40200000,0x00000000, 25, 0x44B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 26, 0x44E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 27, 0x4516A09E,0x667F3BCD, + 0x40200000,0x00000000, 28, 0x4546A09E,0x667F3BCD, + 0x40200000,0x00000000, 29, 0x4576A09E,0x667F3BCD, + 0x40200000,0x00000000, 30, 0x45A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 31, 0x45D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 32, 0x4606A09E,0x667F3BCD, + 0x40200000,0x00000000, 33, 0x4636A09E,0x667F3BCD, + 0x40200000,0x00000000, 34, 0x4666A09E,0x667F3BCD, + 0x40200000,0x00000000, 35, 0x4696A09E,0x667F3BCD, + 0x40200000,0x00000000, 36, 0x46C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 37, 0x46F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 38, 0x4726A09E,0x667F3BCD, + 0x40200000,0x00000000, 39, 0x4756A09E,0x667F3BCD, + 0x40200000,0x00000000, 40, 0x4786A09E,0x667F3BCD, + 0x40200000,0x00000000, 41, 0x47B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 42, 0x47E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 43, 0x4816A09E,0x667F3BCD, + 0x40200000,0x00000000, 44, 0x4846A09E,0x667F3BCD, + 0x40200000,0x00000000, 45, 0x4876A09E,0x667F3BCD, + 0x40200000,0x00000000, 46, 0x48A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 47, 0x48D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 48, 0x4906A09E,0x667F3BCD, + 0x40200000,0x00000000, 49, 0x4936A09E,0x667F3BCD, + 0x40200000,0x00000000, 50, 0x4966A09E,0x667F3BCD, + 0x40200000,0x00000000, 51, 0x4996A09E,0x667F3BCD, + 0x40200000,0x00000000, 52, 0x49C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 53, 0x49F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 54, 0x4A26A09E,0x667F3BCD, + 0x40200000,0x00000000, 55, 0x4A56A09E,0x667F3BCD, + 0x40200000,0x00000000, 56, 0x4A86A09E,0x667F3BCD, + 0x40200000,0x00000000, 57, 0x4AB6A09E,0x667F3BCD, + 0x40200000,0x00000000, 58, 0x4AE6A09E,0x667F3BCD, + 0x40200000,0x00000000, 59, 0x4B16A09E,0x667F3BCD, + 0x40200000,0x00000000, 60, 0x4B46A09E,0x667F3BCD, + 0x40200000,0x00000000, 61, 0x4B76A09E,0x667F3BCD, + 0x40200000,0x00000000, 62, 0x4BA6A09E,0x667F3BCD, + 0x40200000,0x00000000, 63, 0x4BD6A09E,0x667F3BCD, + 0x40200000,0x00000000, 64, 0x4C06A09E,0x667F3BCD, + 0x40200000,0x00000000, 65, 0x4C36A09E,0x667F3BCD, + 0x40200000,0x00000000, 66, 0x4C66A09E,0x667F3BCD, + 0x40200000,0x00000000, 67, 0x4C96A09E,0x667F3BCD, + 0x40200000,0x00000000, 68, 0x4CC6A09E,0x667F3BCD, + 0x40200000,0x00000000, 69, 0x4CF6A09E,0x667F3BCD, + 0x40200000,0x00000000, 70, 0x4D26A09E,0x667F3BCD, + 0x40200000,0x00000000, 71, 0x4D56A09E,0x667F3BCD, + 0x40200000,0x00000000, 72, 0x4D86A09E,0x667F3BCD, + 0x40200000,0x00000000, 73, 0x4DB6A09E,0x667F3BCD, + 0x40200000,0x00000000, 74, 0x4DE6A09E,0x667F3BCD, + 0x40200000,0x00000000, 75, 0x4E16A09E,0x667F3BCD, + 0x40200000,0x00000000, 76, 0x4E46A09E,0x667F3BCD, + 0x40200000,0x00000000, 77, 0x4E76A09E,0x667F3BCD, + 0x40200000,0x00000000, 78, 0x4EA6A09E,0x667F3BCD, + 0x40200000,0x00000000, 79, 0x4ED6A09E,0x667F3BCD, + 0x40200000,0x00000000, 80, 0x4F06A09E,0x667F3BCD, + 0x40200000,0x00000000, 81, 0x4F36A09E,0x667F3BCD, + 0x40200000,0x00000000, 82, 0x4F66A09E,0x667F3BCD, + 0x40200000,0x00000000, 83, 0x4F96A09E,0x667F3BCD, + 0x40200000,0x00000000, 84, 0x4FC6A09E,0x667F3BCD, + 0x40200000,0x00000000, 85, 0x4FF6A09E,0x667F3BCD, + 0x40200000,0x00000000, 86, 0x5026A09E,0x667F3BCD, + 0x40200000,0x00000000, 87, 0x5056A09E,0x667F3BCD, + 0x40200000,0x00000000, 88, 0x5086A09E,0x667F3BCD, + 0x40200000,0x00000000, 89, 0x50B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 90, 0x50E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 91, 0x5116A09E,0x667F3BCD, + 0x40200000,0x00000000, 92, 0x5146A09E,0x667F3BCD, + 0x40200000,0x00000000, 93, 0x5176A09E,0x667F3BCD, + 0x40200000,0x00000000, 94, 0x51A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 95, 0x51D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 96, 0x5206A09E,0x667F3BCD, + 0x40200000,0x00000000, 97, 0x5236A09E,0x667F3BCD, + 0x40200000,0x00000000, 98, 0x5266A09E,0x667F3BCD, + 0x40200000,0x00000000, 99, 0x5296A09E,0x667F3BCD, + 0x40200000,0x00000000, 100, 0x52C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 101, 0x52F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 102, 0x5326A09E,0x667F3BCD, + 0x40200000,0x00000000, 103, 0x5356A09E,0x667F3BCD, + 0x40200000,0x00000000, 104, 0x5386A09E,0x667F3BCD, + 0x40200000,0x00000000, 105, 0x53B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 106, 0x53E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 107, 0x5416A09E,0x667F3BCD, + 0x40200000,0x00000000, 108, 0x5446A09E,0x667F3BCD, + 0x40200000,0x00000000, 109, 0x5476A09E,0x667F3BCD, + 0x40200000,0x00000000, 110, 0x54A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 111, 0x54D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 112, 0x5506A09E,0x667F3BCD, + 0x40200000,0x00000000, 113, 0x5536A09E,0x667F3BCD, + 0x40200000,0x00000000, 114, 0x5566A09E,0x667F3BCD, + 0x40200000,0x00000000, 115, 0x5596A09E,0x667F3BCD, + 0x40200000,0x00000000, 116, 0x55C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 117, 0x55F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 118, 0x5626A09E,0x667F3BCD, + 0x40200000,0x00000000, 119, 0x5656A09E,0x667F3BCD, + 0x40200000,0x00000000, 120, 0x5686A09E,0x667F3BCD, + 0x40200000,0x00000000, 121, 0x56B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 122, 0x56E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 123, 0x5716A09E,0x667F3BCD, + 0x40200000,0x00000000, 124, 0x5746A09E,0x667F3BCD, + 0x40200000,0x00000000, 125, 0x5776A09E,0x667F3BCD, + 0x40200000,0x00000000, 126, 0x57A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 127, 0x57D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 128, 0x5806A09E,0x667F3BCD, + 0x40200000,0x00000000, 129, 0x5836A09E,0x667F3BCD, + 0x40200000,0x00000000, 130, 0x5866A09E,0x667F3BCD, + 0x40200000,0x00000000, 131, 0x5896A09E,0x667F3BCD, + 0x40200000,0x00000000, 132, 0x58C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 133, 0x58F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 134, 0x5926A09E,0x667F3BCD, + 0x40200000,0x00000000, 135, 0x5956A09E,0x667F3BCD, + 0x40200000,0x00000000, 136, 0x5986A09E,0x667F3BCD, + 0x40200000,0x00000000, 137, 0x59B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 138, 0x59E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 139, 0x5A16A09E,0x667F3BCD, + 0x40200000,0x00000000, 140, 0x5A46A09E,0x667F3BCD, + 0x40200000,0x00000000, 141, 0x5A76A09E,0x667F3BCD, + 0x40200000,0x00000000, 142, 0x5AA6A09E,0x667F3BCD, + 0x40200000,0x00000000, 143, 0x5AD6A09E,0x667F3BCD, + 0x40200000,0x00000000, 144, 0x5B06A09E,0x667F3BCD, + 0x40200000,0x00000000, 145, 0x5B36A09E,0x667F3BCD, + 0x40200000,0x00000000, 146, 0x5B66A09E,0x667F3BCD, + 0x40200000,0x00000000, 147, 0x5B96A09E,0x667F3BCD, + 0x40200000,0x00000000, 148, 0x5BC6A09E,0x667F3BCD, + 0x40200000,0x00000000, 149, 0x5BF6A09E,0x667F3BCD, + 0x40200000,0x00000000, 150, 0x5C26A09E,0x667F3BCD, + 0x40200000,0x00000000, 151, 0x5C56A09E,0x667F3BCD, + 0x40200000,0x00000000, 152, 0x5C86A09E,0x667F3BCD, + 0x40200000,0x00000000, 153, 0x5CB6A09E,0x667F3BCD, + 0x40200000,0x00000000, 154, 0x5CE6A09E,0x667F3BCD, + 0x40200000,0x00000000, 155, 0x5D16A09E,0x667F3BCD, + 0x40200000,0x00000000, 156, 0x5D46A09E,0x667F3BCD, + 0x40200000,0x00000000, 157, 0x5D76A09E,0x667F3BCD, + 0x40200000,0x00000000, 158, 0x5DA6A09E,0x667F3BCD, + 0x40200000,0x00000000, 159, 0x5DD6A09E,0x667F3BCD, + 0x40200000,0x00000000, 160, 0x5E06A09E,0x667F3BCD, + 0x40200000,0x00000000, 161, 0x5E36A09E,0x667F3BCD, + 0x40200000,0x00000000, 162, 0x5E66A09E,0x667F3BCD, + 0x40200000,0x00000000, 163, 0x5E96A09E,0x667F3BCD, + 0x40200000,0x00000000, 164, 0x5EC6A09E,0x667F3BCD, + 0x40200000,0x00000000, 165, 0x5EF6A09E,0x667F3BCD, + 0x40200000,0x00000000, 166, 0x5F26A09E,0x667F3BCD, + 0x40200000,0x00000000, 167, 0x5F56A09E,0x667F3BCD, + 0x40200000,0x00000000, 168, 0x5F86A09E,0x667F3BCD, + 0x40200000,0x00000000, 169, 0x5FB6A09E,0x667F3BCD, + 0x40200000,0x00000000, 170, 0x5FE6A09E,0x667F3BCD, + 0x40200000,0x00000000, 171, 0x6016A09E,0x667F3BCD, + 0x40200000,0x00000000, 172, 0x6046A09E,0x667F3BCD, + 0x40200000,0x00000000, 173, 0x6076A09E,0x667F3BCD, + 0x40200000,0x00000000, 174, 0x60A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 175, 0x60D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 176, 0x6106A09E,0x667F3BCD, + 0x40200000,0x00000000, 177, 0x6136A09E,0x667F3BCD, + 0x40200000,0x00000000, 178, 0x6166A09E,0x667F3BCD, + 0x40200000,0x00000000, 179, 0x6196A09E,0x667F3BCD, + 0x40200000,0x00000000, 180, 0x61C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 181, 0x61F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 182, 0x6226A09E,0x667F3BCD, + 0x40200000,0x00000000, 183, 0x6256A09E,0x667F3BCD, + 0x40200000,0x00000000, 184, 0x6286A09E,0x667F3BCD, + 0x40200000,0x00000000, 185, 0x62B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 186, 0x62E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 187, 0x6316A09E,0x667F3BCD, + 0x40200000,0x00000000, 188, 0x6346A09E,0x667F3BCD, + 0x40200000,0x00000000, 189, 0x6376A09E,0x667F3BCD, + 0x40200000,0x00000000, 190, 0x63A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 191, 0x63D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 192, 0x6406A09E,0x667F3BCD, + 0x40200000,0x00000000, 193, 0x6436A09E,0x667F3BCD, + 0x40200000,0x00000000, 194, 0x6466A09E,0x667F3BCD, + 0x40200000,0x00000000, 195, 0x6496A09E,0x667F3BCD, + 0x40200000,0x00000000, 196, 0x64C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 197, 0x64F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 198, 0x6526A09E,0x667F3BCD, + 0x40200000,0x00000000, 199, 0x6556A09E,0x667F3BCD, + 0x40200000,0x00000000, 200, 0x6586A09E,0x667F3BCD, + 0x40200000,0x00000000, 201, 0x65B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 202, 0x65E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 203, 0x6616A09E,0x667F3BCD, + 0x40200000,0x00000000, 204, 0x6646A09E,0x667F3BCD, + 0x40200000,0x00000000, 205, 0x6676A09E,0x667F3BCD, + 0x40200000,0x00000000, 206, 0x66A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 207, 0x66D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 208, 0x6706A09E,0x667F3BCD, + 0x40200000,0x00000000, 209, 0x6736A09E,0x667F3BCD, + 0x40200000,0x00000000, 210, 0x6766A09E,0x667F3BCD, + 0x40200000,0x00000000, 211, 0x6796A09E,0x667F3BCD, + 0x40200000,0x00000000, 212, 0x67C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 213, 0x67F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 214, 0x6826A09E,0x667F3BCD, + 0x40200000,0x00000000, 215, 0x6856A09E,0x667F3BCD, + 0x40200000,0x00000000, 216, 0x6886A09E,0x667F3BCD, + 0x40200000,0x00000000, 217, 0x68B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 218, 0x68E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 219, 0x6916A09E,0x667F3BCD, + 0x40200000,0x00000000, 220, 0x6946A09E,0x667F3BCD, + 0x40200000,0x00000000, 221, 0x6976A09E,0x667F3BCD, + 0x40200000,0x00000000, 222, 0x69A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 223, 0x69D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 224, 0x6A06A09E,0x667F3BCD, + 0x40200000,0x00000000, 225, 0x6A36A09E,0x667F3BCD, + 0x40200000,0x00000000, 226, 0x6A66A09E,0x667F3BCD, + 0x40200000,0x00000000, 227, 0x6A96A09E,0x667F3BCD, + 0x40200000,0x00000000, 228, 0x6AC6A09E,0x667F3BCD, + 0x40200000,0x00000000, 229, 0x6AF6A09E,0x667F3BCD, + 0x40200000,0x00000000, 230, 0x6B26A09E,0x667F3BCD, + 0x40200000,0x00000000, 231, 0x6B56A09E,0x667F3BCD, + 0x40200000,0x00000000, 232, 0x6B86A09E,0x667F3BCD, + 0x40200000,0x00000000, 233, 0x6BB6A09E,0x667F3BCD, + 0x40200000,0x00000000, 234, 0x6BE6A09E,0x667F3BCD, + 0x40200000,0x00000000, 235, 0x6C16A09E,0x667F3BCD, + 0x40200000,0x00000000, 236, 0x6C46A09E,0x667F3BCD, + 0x40200000,0x00000000, 237, 0x6C76A09E,0x667F3BCD, + 0x40200000,0x00000000, 238, 0x6CA6A09E,0x667F3BCD, + 0x40200000,0x00000000, 239, 0x6CD6A09E,0x667F3BCD, + 0x40200000,0x00000000, 240, 0x6D06A09E,0x667F3BCD, + 0x40200000,0x00000000, 241, 0x6D36A09E,0x667F3BCD, + 0x40200000,0x00000000, 242, 0x6D66A09E,0x667F3BCD, + 0x40200000,0x00000000, 243, 0x6D96A09E,0x667F3BCD, + 0x40200000,0x00000000, 244, 0x6DC6A09E,0x667F3BCD, + 0x40200000,0x00000000, 245, 0x6DF6A09E,0x667F3BCD, + 0x40200000,0x00000000, 246, 0x6E26A09E,0x667F3BCD, + 0x40200000,0x00000000, 247, 0x6E56A09E,0x667F3BCD, + 0x40200000,0x00000000, 248, 0x6E86A09E,0x667F3BCD, + 0x40200000,0x00000000, 249, 0x6EB6A09E,0x667F3BCD, + 0x40200000,0x00000000, 250, 0x6EE6A09E,0x667F3BCD, + 0x40200000,0x00000000, 251, 0x6F16A09E,0x667F3BCD, + 0x40200000,0x00000000, 252, 0x6F46A09E,0x667F3BCD, + 0x40200000,0x00000000, 253, 0x6F76A09E,0x667F3BCD, + 0x40200000,0x00000000, 254, 0x6FA6A09E,0x667F3BCD, + 0x40200000,0x00000000, 255, 0x6FD6A09E,0x667F3BCD, + 0x40200000,0x00000000, 256, 0x7006A09E,0x667F3BCD, + 0x40200000,0x00000000, 257, 0x7036A09E,0x667F3BCD, + 0x40200000,0x00000000, 258, 0x7066A09E,0x667F3BCD, + 0x40200000,0x00000000, 259, 0x7096A09E,0x667F3BCD, + 0x40200000,0x00000000, 260, 0x70C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 261, 0x70F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 262, 0x7126A09E,0x667F3BCD, + 0x40200000,0x00000000, 263, 0x7156A09E,0x667F3BCD, + 0x40200000,0x00000000, 264, 0x7186A09E,0x667F3BCD, + 0x40200000,0x00000000, 265, 0x71B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 266, 0x71E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 267, 0x7216A09E,0x667F3BCD, + 0x40200000,0x00000000, 268, 0x7246A09E,0x667F3BCD, + 0x40200000,0x00000000, 269, 0x7276A09E,0x667F3BCD, + 0x40200000,0x00000000, 270, 0x72A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 271, 0x72D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 272, 0x7306A09E,0x667F3BCD, + 0x40200000,0x00000000, 273, 0x7336A09E,0x667F3BCD, + 0x40200000,0x00000000, 274, 0x7366A09E,0x667F3BCD, + 0x40200000,0x00000000, 275, 0x7396A09E,0x667F3BCD, + 0x40200000,0x00000000, 276, 0x73C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 277, 0x73F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 278, 0x7426A09E,0x667F3BCD, + 0x40200000,0x00000000, 279, 0x7456A09E,0x667F3BCD, + 0x40200000,0x00000000, 280, 0x7486A09E,0x667F3BCD, + 0x40200000,0x00000000, 281, 0x74B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 282, 0x74E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 283, 0x7516A09E,0x667F3BCD, + 0x40200000,0x00000000, 284, 0x7546A09E,0x667F3BCD, + 0x40200000,0x00000000, 285, 0x7576A09E,0x667F3BCD, + 0x40200000,0x00000000, 286, 0x75A6A09E,0x667F3BCD, + 0x40200000,0x00000000, 287, 0x75D6A09E,0x667F3BCD, + 0x40200000,0x00000000, 288, 0x7606A09E,0x667F3BCD, + 0x40200000,0x00000000, 289, 0x7636A09E,0x667F3BCD, + 0x40200000,0x00000000, 290, 0x7666A09E,0x667F3BCD, + 0x40200000,0x00000000, 291, 0x7696A09E,0x667F3BCD, + 0x40200000,0x00000000, 292, 0x76C6A09E,0x667F3BCD, + 0x40200000,0x00000000, 293, 0x76F6A09E,0x667F3BCD, + 0x40200000,0x00000000, 294, 0x7726A09E,0x667F3BCD, + 0x40200000,0x00000000, 295, 0x7756A09E,0x667F3BCD, + 0x40200000,0x00000000, 296, 0x7786A09E,0x667F3BCD, + 0x40200000,0x00000000, 297, 0x77B6A09E,0x667F3BCD, + 0x40200000,0x00000000, 298, 0x77E6A09E,0x667F3BCD, + 0x40200000,0x00000000, 299, 0x7816A09E,0x667F3BCD, + 0x40200000,0x00000000, 300, 0x7846A09E,0x667F3BCD, + 0x40220000,0x00000000, 2, 0x406E6000,0x00000000, + 0x40220000,0x00000000, 3, 0x40A11600,0x00000000, + 0x40220000,0x00000000, 4, 0x40D338C0,0x00000000, + 0x40220000,0x00000000, 5, 0x41059FD8,0x00000000, + 0x40220000,0x00000000, 6, 0x413853D3,0x00000000, + 0x40220000,0x00000000, 7, 0x416B5E4D,0x60000000, + 0x40220000,0x00000000, 8, 0x419ECA17,0x0C000000, + 0x40220000,0x00000000, 9, 0x41D151AC,0xF6C00000, + 0x40220000,0x00000000, 10, 0x42037BE2,0x95980000, + 0x40220000,0x00000000, 11, 0x4235EB5E,0xE84B0000, + 0x40220000,0x00000000, 12, 0x4268A8CA,0xC5546000, + 0x40220000,0x00000000, 13, 0x429BBDE4,0x1DFEEC00, + 0x40220000,0x00000000, 14, 0x42CF35A0,0xA1BEC980, + 0x40220000,0x00000000, 15, 0x43018E2A,0x5AFB5158, + 0x40220000,0x00000000, 16, 0x4333BFEF,0xA65ABB83, + 0x40220000,0x00000000, 17, 0x436637ED,0x9B2612F3, + 0x40220000,0x00000000, 18, 0x4398FEEB,0x4E8AD552, + 0x40220000,0x00000000, 19, 0x43CC1EC8,0xB85C2FFC, + 0x40220000,0x00000000, 20, 0x43FFA2A1,0xCF67B5FC, + 0x40220000,0x00000000, 21, 0x4431CB7B,0x04AA565D, + 0x40220000,0x00000000, 22, 0x446404EA,0x653FA129, + 0x40220000,0x00000000, 23, 0x44968587,0xB1E7954E, + 0x40220000,0x00000000, 24, 0x44C95638,0xA82487F8, + 0x40220000,0x00000000, 25, 0x44FC80FF,0xBD2918F7, + 0x40220000,0x00000000, 26, 0x4530088F,0xDA671E0B, + 0x40220000,0x00000000, 27, 0x456209A1,0xD5B401CC, + 0x40220000,0x00000000, 28, 0x45944AD6,0x106A8206, + 0x40220000,0x00000000, 29, 0x45C6D430,0xD277D247, + 0x40220000,0x00000000, 30, 0x45F9AEB6,0xECC6CC8F, + 0x40220000,0x00000000, 31, 0x462CE48D,0xCA5FA621, + 0x40220000,0x00000000, 32, 0x4660408F,0xC1D5CD73, + 0x40220000,0x00000000, 33, 0x469248A1,0xBA108721, + 0x40220000,0x00000000, 34, 0x46C491B5,0xF1529805, + 0x40220000,0x00000000, 35, 0x46F723EC,0xAF7CEB06, + 0x40220000,0x00000000, 36, 0x472A086A,0x456C8867, + 0x40220000,0x00000000, 37, 0x475D4977,0x8E1A1974, + 0x40220000,0x00000000, 38, 0x47907953,0x3FEEAE51, + 0x40220000,0x00000000, 39, 0x47C2887D,0xA7EC841B, + 0x40220000,0x00000000, 40, 0x47F4D98D,0x5CEA149F, + 0x40220000,0x00000000, 41, 0x482774BF,0x08875732, + 0x40220000,0x00000000, 42, 0x485A6356,0xE9984219, + 0x40220000,0x00000000, 43, 0x488DAFC1,0xC6CB4A5C, + 0x40220000,0x00000000, 44, 0x48C0B2DC,0xFFD259D4, + 0x40220000,0x00000000, 45, 0x48F2C938,0x9FCCA50E, + 0x40220000,0x00000000, 46, 0x4925225F,0xB3C639B0, + 0x40220000,0x00000000, 47, 0x4957C6AB,0xAA3F00E6, + 0x40220000,0x00000000, 48, 0x498ABF81,0x1F86E102, + 0x40220000,0x00000000, 49, 0x49BE1771,0x4377BD23, + 0x40220000,0x00000000, 50, 0x49F0ED2F,0xB5F35A64, + 0x40220000,0x00000000, 51, 0x4A230AD5,0xACB1C5B0, + 0x40220000,0x00000000, 52, 0x4A556C30,0x6247FE66, + 0x40220000,0x00000000, 53, 0x4A8819B6,0x6E90FE33, + 0x40220000,0x00000000, 54, 0x4ABB1CED,0x3C631DF9, + 0x40220000,0x00000000, 55, 0x4AEE808A,0xE3EF81B8, + 0x40220000,0x00000000, 56, 0x4B21284E,0x2036B8F8, + 0x40220000,0x00000000, 57, 0x4B534D57,0xE43D9017, + 0x40220000,0x00000000, 58, 0x4B85B702,0xE0C54219, + 0x40220000,0x00000000, 59, 0x4BB86DE3,0x3CDDEA5D, + 0x40220000,0x00000000, 60, 0x4BEB7B9F,0xA479A7A8, + 0x40220000,0x00000000, 61, 0x4C1EEB13,0x9908DC9D, + 0x40220000,0x00000000, 62, 0x4C51643B,0x0614FC18, + 0x40220000,0x00000000, 63, 0x4C8390C2,0x66D79B9B, + 0x40220000,0x00000000, 64, 0x4CB602DA,0xB3B28F0F, + 0x40220000,0x00000000, 65, 0x4CE8C336,0x0A28E0F1, + 0x40220000,0x00000000, 66, 0x4D1BDB9C,0xCB6DFD0F, + 0x40220000,0x00000000, 67, 0x4D4F5710,0x64DBBCB1, + 0x40220000,0x00000000, 68, 0x4D81A0F9,0x38BB9A23, + 0x40220000,0x00000000, 69, 0x4DB3D518,0x5FD30D68, + 0x40220000,0x00000000, 70, 0x4DE64FBB,0x6BCD6F15, + 0x40220000,0x00000000, 71, 0x4E1919B2,0xD9471CF7, + 0x40220000,0x00000000, 72, 0x4E4C3CE9,0x34700096, + 0x40220000,0x00000000, 73, 0x4E7FC486,0x5AFE00A9, + 0x40220000,0x00000000, 74, 0x4EB1DE8B,0x932EE05F, + 0x40220000,0x00000000, 75, 0x4EE41A5D,0x0594BC6B, + 0x40220000,0x00000000, 76, 0x4F169DA8,0xA64753F8, + 0x40220000,0x00000000, 77, 0x4F49715D,0xBB103E77, + 0x40220000,0x00000000, 78, 0x4F7C9F89,0x72724646, + 0x40220000,0x00000000, 79, 0x4FB019BD,0x50604788, + 0x40220000,0x00000000, 80, 0x4FE21CF4,0xFA6C5079, + 0x40220000,0x00000000, 81, 0x50146093,0x99B9DA88, + 0x40220000,0x00000000, 82, 0x5046ECA6,0x0CF115D9, + 0x40220000,0x00000000, 83, 0x5079CA3A,0xCE8F3894, + 0x40220000,0x00000000, 84, 0x50AD0382,0x28611FA6, + 0x40220000,0x00000000, 85, 0x50E051F9,0x36B6A1CD, + 0x40220000,0x00000000, 86, 0x51125C38,0x5D8D7607, + 0x40220000,0x00000000, 87, 0x5144A7BF,0x693F24C8, + 0x40220000,0x00000000, 88, 0x51773CB7,0x56670961, + 0x40220000,0x00000000, 89, 0x51AA244E,0x4133EA8D, + 0x40220000,0x00000000, 90, 0x51DD68D8,0x095A67DF, + 0x40220000,0x00000000, 91, 0x52108AF9,0x8542DA6D, + 0x40220000,0x00000000, 92, 0x52429C58,0xB5EB35BB, + 0x40220000,0x00000000, 93, 0x5274EFE3,0xCCA89C72, + 0x40220000,0x00000000, 94, 0x52A78DE0,0x463DB001, + 0x40220000,0x00000000, 95, 0x52DA7F9C,0x4F056601, + 0x40220000,0x00000000, 96, 0x530DCF8F,0xD8E612C1, + 0x40220000,0x00000000, 97, 0x5340C4C0,0xEA016A8C, + 0x40220000,0x00000000, 98, 0x5372DD59,0x074197DE, + 0x40220000,0x00000000, 99, 0x53A53904,0x2829CADA, + 0x40220000,0x00000000, 100, 0x53D7E024,0xAD2F0435, + 0x40220000,0x00000000, 101, 0x540ADC29,0x42D4E4BC, + 0x40220000,0x00000000, 102, 0x543E37AE,0x6B2F8153, + 0x40220000,0x00000000, 103, 0x5470FF52,0x1C4AB8BF, + 0x40220000,0x00000000, 104, 0x54A31F3C,0x5FD40FD7, + 0x40220000,0x00000000, 105, 0x54D58323,0xEBCE91D1, + 0x40220000,0x00000000, 106, 0x55083388,0x6948640C, + 0x40220000,0x00000000, 107, 0x553B39F9,0x7671708D, + 0x40220000,0x00000000, 108, 0x556EA138,0xA53F9E9F, + 0x40220000,0x00000000, 109, 0x55A13AAF,0xDCF3C939, + 0x40220000,0x00000000, 110, 0x55D36205,0xD8924260, + 0x40220000,0x00000000, 111, 0x5605CE46,0x93A48AAC, + 0x40220000,0x00000000, 112, 0x5638880F,0x66191C02, + 0x40220000,0x00000000, 113, 0x566B9911,0x52DC3F82, + 0x40220000,0x00000000, 114, 0x569F0C33,0x7D37C772, + 0x40220000,0x00000000, 115, 0x56D176DC,0xF66F6030, + 0x40220000,0x00000000, 116, 0x5703A5B8,0x953D4C36, + 0x40220000,0x00000000, 117, 0x57361A6F,0xA7E4F5BD, + 0x40220000,0x00000000, 118, 0x5768DDBD,0x9CE19475, + 0x40220000,0x00000000, 119, 0x579BF975,0x507DC704, + 0x40220000,0x00000000, 120, 0x57CF78A3,0xFA8D7FE4, + 0x40220000,0x00000000, 121, 0x5801B3DC,0x3CEF97F0, + 0x40220000,0x00000000, 122, 0x5833EA57,0xC48D8AEE, + 0x40220000,0x00000000, 123, 0x586667A2,0xBD1F3C4C, + 0x40220000,0x00000000, 124, 0x58993497,0x14C323D6, + 0x40220000,0x00000000, 125, 0x58CC5B29,0xF75B8850, + 0x40220000,0x00000000, 126, 0x58FFE68F,0x3646F95A, + 0x40220000,0x00000000, 127, 0x5931F1B0,0x8E87EC43, + 0x40220000,0x00000000, 128, 0x59642FE6,0xA058E9CB, + 0x40220000,0x00000000, 129, 0x5996B5E3,0x74640705, + 0x40220000,0x00000000, 130, 0x59C98C9F,0xE2F087E5, + 0x40220000,0x00000000, 131, 0x59FCBE33,0xDF4E98E2, + 0x40220000,0x00000000, 132, 0x5A302AFD,0x2D9C35FF, + 0x40220000,0x00000000, 133, 0x5A62305C,0xD34FBCBF, + 0x40220000,0x00000000, 134, 0x5A947668,0x6DB9B457, + 0x40220000,0x00000000, 135, 0x5AC70535,0x7B70EAE2, + 0x40220000,0x00000000, 136, 0x5AF9E5DC,0x2ADF083E, + 0x40220000,0x00000000, 137, 0x5B2D2297,0xB03AE945, + 0x40220000,0x00000000, 138, 0x5B606375,0x53212337, + 0x40220000,0x00000000, 139, 0x5B926FE3,0xFD85479E, + 0x40220000,0x00000000, 140, 0x5BC4BDE0,0x7D35F092, + 0x40220000,0x00000000, 141, 0x5BF7559C,0x8CDCAEA4, + 0x40220000,0x00000000, 142, 0x5C2A4050,0x1E784478, + 0x40220000,0x00000000, 143, 0x5C5D885A,0x22474D07, + 0x40220000,0x00000000, 144, 0x5C909CB2,0xB3481B54, + 0x40220000,0x00000000, 145, 0x5CC2B049,0x09B11EBF, + 0x40220000,0x00000000, 146, 0x5CF50652,0x2AE74297, + 0x40220000,0x00000000, 147, 0x5D27A71C,0x70442AE9, + 0x40220000,0x00000000, 148, 0x5D5A9BFF,0xFE4CB047, + 0x40220000,0x00000000, 149, 0x5D8DEF7F,0xFE16464F, + 0x40220000,0x00000000, 150, 0x5DC0D6B7,0xFEEC878D, + 0x40220000,0x00000000, 151, 0x5DF2F18E,0xFECA187E, + 0x40220000,0x00000000, 152, 0x5E254FC0,0xDEA35B8E, + 0x40220000,0x00000000, 153, 0x5E57F9B8,0xFA77C700, + 0x40220000,0x00000000, 154, 0x5E8AF8F0,0x19C6BFE0, + 0x40220000,0x00000000, 155, 0x5EBE580E,0x1CFF97DC, + 0x40220000,0x00000000, 156, 0x5EF11187,0xF04FC56C, + 0x40220000,0x00000000, 157, 0x5F2333B8,0xEE59BE19, + 0x40220000,0x00000000, 158, 0x5F559A30,0x0C24F5DC, + 0x40220000,0x00000000, 159, 0x5F884D76,0x0DA99498, + 0x40220000,0x00000000, 160, 0x5FBB5724,0xCF5EC72B, + 0x40220000,0x00000000, 161, 0x5FEEC209,0x694AA010, + 0x40220000,0x00000000, 162, 0x60214D25,0x4B39FA09, + 0x40220000,0x00000000, 163, 0x605376C9,0xF4A1394A, + 0x40220000,0x00000000, 164, 0x6085E5A3,0x33356073, + 0x40220000,0x00000000, 165, 0x60B8A257,0x999C0C82, + 0x40220000,0x00000000, 166, 0x60EBB6A2,0x8CCF8E12, + 0x40220000,0x00000000, 167, 0x611F2D76,0xDE697FD4, + 0x40220000,0x00000000, 168, 0x61518992,0xDD1B57E7, + 0x40220000,0x00000000, 169, 0x6183BAC5,0x38BEC2E4, + 0x40220000,0x00000000, 170, 0x61B6321D,0xDFD69B41, + 0x40220000,0x00000000, 171, 0x61E8F861,0x9BD16EA9, + 0x40220000,0x00000000, 172, 0x621C176D,0xCF4B9C7E, + 0x40220000,0x00000000, 173, 0x624F9A5B,0x8935100E, + 0x40220000,0x00000000, 174, 0x6281C6D3,0x7D2DD908, + 0x40220000,0x00000000, 175, 0x62B3FFAD,0xECD39429, + 0x40220000,0x00000000, 176, 0x62E67FA3,0xAA6E06AE, + 0x40220000,0x00000000, 177, 0x63194F98,0x1FBBC784, + 0x40220000,0x00000000, 178, 0x634C798B,0x23B34074, + 0x40220000,0x00000000, 179, 0x6380045E,0x4414D441, + 0x40220000,0x00000000, 180, 0x63B204EA,0x0C976EC9, + 0x40220000,0x00000000, 181, 0x63E44587,0x4E2A5CA3, + 0x40220000,0x00000000, 182, 0x6416CE38,0x37EFA837, + 0x40220000,0x00000000, 183, 0x6449A7FF,0x3EED9D3E, + 0x40220000,0x00000000, 184, 0x647CDCFF,0x26CB50E5, + 0x40220000,0x00000000, 185, 0x64B03C4F,0x85D25D81, + 0x40220000,0x00000000, 186, 0x64E243D9,0x768CA931, + 0x40220000,0x00000000, 187, 0x65148C54,0xA55E3E57, + 0x40220000,0x00000000, 188, 0x65471DDF,0x3A0A0622, + 0x40220000,0x00000000, 189, 0x657A019B,0x214B46E7, + 0x40220000,0x00000000, 190, 0x65AD41CE,0x8574AFC3, + 0x40220000,0x00000000, 191, 0x65E07504,0x2B11A2DE, + 0x40220000,0x00000000, 192, 0x661283A4,0xB073D73A, + 0x40220000,0x00000000, 193, 0x6644D419,0x46825221, + 0x40220000,0x00000000, 194, 0x66776E9C,0x6F529C65, + 0x40220000,0x00000000, 195, 0x66AA5C6F,0xFD3CEFF2, + 0x40220000,0x00000000, 196, 0x66DDA7FD,0xFCE48DF0, + 0x40220000,0x00000000, 197, 0x6710AE7E,0xDE408FD7, + 0x40220000,0x00000000, 198, 0x6742C44E,0xBA08A1D2, + 0x40220000,0x00000000, 199, 0x67751CD8,0x9149B60C, + 0x40220000,0x00000000, 200, 0x67A7C073,0xA372ECCD, + 0x40220000,0x00000000, 201, 0x67DAB882,0x17E14A67, + 0x40220000,0x00000000, 202, 0x680E0F92,0x5ADD73B4, + 0x40220000,0x00000000, 203, 0x6840E8C2,0x531C9115, + 0x40220000,0x00000000, 204, 0x687305DA,0x9D802338, + 0x40220000,0x00000000, 205, 0x68A56695,0xF130279F, + 0x40220000,0x00000000, 206, 0x68D81368,0xAF562C93, + 0x40220000,0x00000000, 207, 0x690B15D5,0xC540F225, + 0x40220000,0x00000000, 208, 0x693E7890,0x7DE9106A, + 0x40220000,0x00000000, 209, 0x697123D1,0x46D3193B, + 0x40220000,0x00000000, 210, 0x69A3484B,0x6FAD7C63, + 0x40220000,0x00000000, 211, 0x69D5B154,0xDDA32BEF, + 0x40220000,0x00000000, 212, 0x6A08677F,0x7957916D, + 0x40220000,0x00000000, 213, 0x6A3B746F,0x6882839B, + 0x40220000,0x00000000, 214, 0x6A6EE2FD,0x5592D40E, + 0x40220000,0x00000000, 215, 0x6AA15FAE,0x80229748, + 0x40220000,0x00000000, 216, 0x6AD38BA4,0x5026EA31, + 0x40220000,0x00000000, 217, 0x6B05FD18,0xDA2BC777, + 0x40220000,0x00000000, 218, 0x6B38BCBB,0xF5714066, + 0x40220000,0x00000000, 219, 0x6B6BD453,0x741F6873, + 0x40220000,0x00000000, 220, 0x6B9F4EDD,0xE2A35581, + 0x40220000,0x00000000, 221, 0x6BD19C5C,0xCF7BE019, + 0x40220000,0x00000000, 222, 0x6C03CFE8,0x696B5C1C, + 0x40220000,0x00000000, 223, 0x6C3649E5,0x7698C79F, + 0x40220000,0x00000000, 224, 0x6C691322,0x256BE093, + 0x40220000,0x00000000, 225, 0x6C9C3586,0x6A195CA5, + 0x40220000,0x00000000, 226, 0x6CCFBC37,0x375C883A, + 0x40220000,0x00000000, 227, 0x6D01D9DF,0x0F240CA1, + 0x40220000,0x00000000, 228, 0x6D34151A,0xF1088E35, + 0x40220000,0x00000000, 229, 0x6D6697BE,0x4F299FFB, + 0x40220000,0x00000000, 230, 0x6D996AB6,0x190ED3FB, + 0x40220000,0x00000000, 231, 0x6DCC980C,0xDC30AE7A, + 0x40220000,0x00000000, 232, 0x6E001587,0x3BDB6225, + 0x40220000,0x00000000, 233, 0x6E321838,0x2356CE69, + 0x40220000,0x00000000, 234, 0x6E645B3F,0x27C1A836, + 0x40220000,0x00000000, 235, 0x6E96E6A7,0x0CB9DD3D, + 0x40220000,0x00000000, 236, 0x6EC9C37B,0xEE5118E5, + 0x40220000,0x00000000, 237, 0x6EFCFBEB,0x6C1B3C02, + 0x40220000,0x00000000, 238, 0x6F304DB4,0x6CCF51C1, + 0x40220000,0x00000000, 239, 0x6F62576A,0xFA693BF9, + 0x40220000,0x00000000, 240, 0x6F94A258,0x59B66378, + 0x40220000,0x00000000, 241, 0x6FC736A3,0x64ED2FE7, + 0x40220000,0x00000000, 242, 0x6FFA1D77,0xD18AD5E4, + 0x40220000,0x00000000, 243, 0x702D6126,0xCBBC30A0, + 0x40220000,0x00000000, 244, 0x706086A5,0xD299DB5A, + 0x40220000,0x00000000, 245, 0x7092977A,0x8CED16C6, + 0x40220000,0x00000000, 246, 0x70C4EA69,0xDE8AB99E, + 0x40220000,0x00000000, 247, 0x70F787B7,0x1A5C10D2, + 0x40220000,0x00000000, 248, 0x712A78AD,0xFDA792EC, + 0x40220000,0x00000000, 249, 0x715DC7C3,0xBD5C854A, + 0x40220000,0x00000000, 250, 0x7190C05E,0x1A840AFA, + 0x40220000,0x00000000, 251, 0x71C2D869,0xDDD48C59, + 0x40220000,0x00000000, 252, 0x71F53377,0x198F1DE4, + 0x40220000,0x00000000, 253, 0x7227D9E5,0xFCC101A0, + 0x40220000,0x00000000, 254, 0x725AD522,0xBC5921D4, + 0x40220000,0x00000000, 255, 0x728E2FC7,0x13E4460F, + 0x40220000,0x00000000, 256, 0x72C0FADF,0xFB306768, + 0x40220000,0x00000000, 257, 0x72F31A3B,0xFA967455, + 0x40220000,0x00000000, 258, 0x73257D83,0x79E942E0, + 0x40220000,0x00000000, 259, 0x73582D33,0xE9266B3C, + 0x40220000,0x00000000, 260, 0x738B32DA,0x664B38A4, + 0x40220000,0x00000000, 261, 0x73BE9935,0xB3149FB8, + 0x40220000,0x00000000, 262, 0x73F1362E,0x34BB99D8, + 0x40220000,0x00000000, 263, 0x74235CF3,0xFB530D12, + 0x40220000,0x00000000, 264, 0x7455C892,0x7ABD6EB5, + 0x40220000,0x00000000, 265, 0x748881A4,0xCA151C8B, + 0x40220000,0x00000000, 266, 0x74BB91D9,0x6357C01D, + 0x40220000,0x00000000, 267, 0x74EF0414,0x8FC2B820, + 0x40220000,0x00000000, 268, 0x7521724B,0x90DD8792, + 0x40220000,0x00000000, 269, 0x7553A095,0x02F93885, + 0x40220000,0x00000000, 270, 0x758614A7,0xA3585F95, + 0x40220000,0x00000000, 271, 0x75B8D73C,0x97C36B88, + 0x40220000,0x00000000, 272, 0x75EBF224,0x2ABBD8F9, + 0x40220000,0x00000000, 273, 0x761F7068,0xB0135418, + 0x40220000,0x00000000, 274, 0x7651AF3A,0xE30ADF4D, + 0x40220000,0x00000000, 275, 0x7683E522,0x3F6C3B37, + 0x40220000,0x00000000, 276, 0x76B661C6,0x8759C29E, + 0x40220000,0x00000000, 277, 0x76E92DFF,0x5844FAF2, + 0x40220000,0x00000000, 278, 0x771C53BF,0x434D9A50, + 0x40220000,0x00000000, 279, 0x774FDE37,0x2BB74D9A, + 0x40220000,0x00000000, 280, 0x7781ECFF,0x08971BA7, + 0x40220000,0x00000000, 281, 0x77B42A9E,0xE9A9FF1B, + 0x40220000,0x00000000, 282, 0x77E6AFF2,0xC6DF3EFF, + 0x40220000,0x00000000, 283, 0x781985F1,0x1FBB26DF, + 0x40220000,0x00000000, 284, 0x784CB6AF,0x43B28BBA, + 0x40220000,0x00000000, 285, 0x788026C2,0x96146E99, + 0x40220000,0x00000000, 286, 0x78B22B9A,0xE8D6FC6C, + 0x40220000,0x00000000, 287, 0x78E4710E,0x45F1DBF9, + 0x40220000,0x00000000, 288, 0x7916FF30,0x0EB01779, + 0x40220000,0x00000000, 289, 0x7949DF16,0x10861A68, + 0x40220000,0x00000000, 290, 0x797D1AF8,0xD296DDB5, + 0x40220000,0x00000000, 291, 0x79B05F2B,0xF674DCB6, + 0x40220000,0x00000000, 292, 0x79E26B11,0x7543784C, + 0x40220000,0x00000000, 293, 0x7A14B873,0xA3EBE756, + 0x40220000,0x00000000, 294, 0x7A474F82,0x18696441, + 0x40220000,0x00000000, 295, 0x7A7A3972,0x5B7690C9, + 0x40220000,0x00000000, 296, 0x7AAD80A0,0xA6E562E2, + 0x40220000,0x00000000, 297, 0x7AE0985A,0x5DE1079F, + 0x40220000,0x00000000, 298, 0x7B12AB65,0xA99D2893, + 0x40220000,0x00000000, 299, 0x7B4500D2,0x5ED0CDA5, + 0x40220000,0x00000000, 300, 0x7B77A0EC,0xAAAAE75A, + 0x40240000,0x00000000, 2, 0x4073C3A4,0xEDFA9759, + 0x40240000,0x00000000, 3, 0x40A8B48E,0x29793D2F, + 0x40240000,0x00000000, 4, 0x40DEE1B1,0xB3D78C7A, + 0x40240000,0x00000000, 5, 0x41134D0F,0x1066B7CC, + 0x40240000,0x00000000, 6, 0x41482052,0xD48065C0, + 0x40240000,0x00000000, 7, 0x417E2867,0x89A07F2F, + 0x40240000,0x00000000, 8, 0x41B2D940,0xB6044F7E, + 0x40240000,0x00000000, 9, 0x41E78F90,0xE385635D, + 0x40240000,0x00000000, 10, 0x421D7375,0x1C66BC34, + 0x40240000,0x00000000, 11, 0x42526829,0x31C035A1, + 0x40240000,0x00000000, 12, 0x42870233,0x7E304309, + 0x40240000,0x00000000, 13, 0x42BCC2C0,0x5DBC53CB, + 0x40240000,0x00000000, 14, 0x42F1F9B8,0x3A95B45F, + 0x40240000,0x00000000, 15, 0x43267826,0x493B2177, + 0x40240000,0x00000000, 16, 0x435C162F,0xDB89E9D4, + 0x40240000,0x00000000, 17, 0x43918DDD,0xE9363225, + 0x40240000,0x00000000, 18, 0x43C5F155,0x6383BEAE, + 0x40240000,0x00000000, 19, 0x43FB6DAA,0xBC64AE59, + 0x40240000,0x00000000, 20, 0x4431248A,0xB5BEECF8, + 0x40240000,0x00000000, 21, 0x44656DAD,0x632EA836, + 0x40240000,0x00000000, 22, 0x449AC918,0xBBFA5243, + 0x40240000,0x00000000, 23, 0x44D0BDAF,0x757C736A, + 0x40240000,0x00000000, 24, 0x4504ED1B,0x52DB9045, + 0x40240000,0x00000000, 25, 0x453A2862,0x27927456, + 0x40240000,0x00000000, 26, 0x4570593D,0x58BB88B6, + 0x40240000,0x00000000, 27, 0x45A46F8C,0xAEEA6AE3, + 0x40240000,0x00000000, 28, 0x45D98B6F,0xDAA5059C, + 0x40240000,0x00000000, 29, 0x460FEE4B,0xD14E4703, + 0x40240000,0x00000000, 30, 0x4643F4EF,0x62D0EC62, + 0x40240000,0x00000000, 31, 0x4678F22B,0x3B85277A, + 0x40240000,0x00000000, 32, 0x46AF2EB6,0x0A667159, + 0x40240000,0x00000000, 33, 0x46E37D31,0xC68006D7, + 0x40240000,0x00000000, 34, 0x47185C7E,0x3820088D, + 0x40240000,0x00000000, 35, 0x474E739D,0xC6280AB0, + 0x40240000,0x00000000, 36, 0x47830842,0x9BD906AE, + 0x40240000,0x00000000, 37, 0x47B7CA53,0x42CF485A, + 0x40240000,0x00000000, 38, 0x47EDBCE8,0x13831A70, + 0x40240000,0x00000000, 39, 0x48229611,0x0C31F086, + 0x40240000,0x00000000, 40, 0x48573B95,0x4F3E6CA8, + 0x40240000,0x00000000, 41, 0x488D0A7A,0xA30E07D2, + 0x40240000,0x00000000, 42, 0x48C2268C,0xA5E8C4E3, + 0x40240000,0x00000000, 43, 0x48F6B02F,0xCF62F61C, + 0x40240000,0x00000000, 44, 0x492C5C3B,0xC33BB3A3, + 0x40240000,0x00000000, 45, 0x4961B9A5,0x5A055046, + 0x40240000,0x00000000, 46, 0x4996280E,0xB086A457, + 0x40240000,0x00000000, 47, 0x49CBB212,0x5CA84D6D, + 0x40240000,0x00000000, 48, 0x4A014F4B,0x79E93064, + 0x40240000,0x00000000, 49, 0x4A35A31E,0x58637C7D, + 0x40240000,0x00000000, 50, 0x4A6B0BE5,0xEE7C5B9C, + 0x40240000,0x00000000, 51, 0x4AA0E76F,0xB50DB942, + 0x40240000,0x00000000, 52, 0x4AD5214B,0xA2512792, + 0x40240000,0x00000000, 53, 0x4B0A699E,0x8AE57177, + 0x40240000,0x00000000, 54, 0x4B408203,0x16CF66EA, + 0x40240000,0x00000000, 55, 0x4B74A283,0xDC8340A5, + 0x40240000,0x00000000, 56, 0x4BA9CB24,0xD3A410CE, + 0x40240000,0x00000000, 57, 0x4BE01EF7,0x04468A81, + 0x40240000,0x00000000, 58, 0x4C1426B4,0xC5582D21, + 0x40240000,0x00000000, 59, 0x4C493061,0xF6AE3869, + 0x40240000,0x00000000, 60, 0x4C7F7C7A,0x7459C683, + 0x40240000,0x00000000, 61, 0x4CB3ADCC,0x88B81C12, + 0x40240000,0x00000000, 62, 0x4CE8993F,0xAAE62317, + 0x40240000,0x00000000, 63, 0x4D1EBF8F,0x959FABDC, + 0x40240000,0x00000000, 64, 0x4D5337B9,0xBD83CB6A, + 0x40240000,0x00000000, 65, 0x4D8805A8,0x2CE4BE44, + 0x40240000,0x00000000, 66, 0x4DBE0712,0x381DEDD5, + 0x40240000,0x00000000, 67, 0x4DF2C46B,0x6312B4A5, + 0x40240000,0x00000000, 68, 0x4E277586,0x3BD761CF, + 0x40240000,0x00000000, 69, 0x4E5D52E7,0xCACD3A42, + 0x40240000,0x00000000, 70, 0x4E9253D0,0xDEC04469, + 0x40240000,0x00000000, 71, 0x4EC6E8C5,0x16705584, + 0x40240000,0x00000000, 72, 0x4EFCA2F6,0x5C0C6AE5, + 0x40240000,0x00000000, 73, 0x4F31E5D9,0xF987C2CF, + 0x40240000,0x00000000, 74, 0x4F665F50,0x77E9B383, + 0x40240000,0x00000000, 75, 0x4F9BF724,0x95E42063, + 0x40240000,0x00000000, 76, 0x4FD17A76,0xDDAE943E, + 0x40240000,0x00000000, 77, 0x5005D914,0x951A394E, + 0x40240000,0x00000000, 78, 0x503B4F59,0xBA60C7A1, + 0x40240000,0x00000000, 79, 0x50711198,0x147C7CC5, + 0x40240000,0x00000000, 80, 0x50A555FE,0x199B9BF6, + 0x40240000,0x00000000, 81, 0x50DAAB7D,0xA00282F3, + 0x40240000,0x00000000, 82, 0x5110AB2E,0x840191D8, + 0x40240000,0x00000000, 83, 0x5144D5FA,0x2501F64E, + 0x40240000,0x00000000, 84, 0x517A0B78,0xAE4273E1, + 0x40240000,0x00000000, 85, 0x51B0472B,0x6CE9886D, + 0x40240000,0x00000000, 86, 0x51E458F6,0x4823EA88, + 0x40240000,0x00000000, 87, 0x52196F33,0xDA2CE52A, + 0x40240000,0x00000000, 88, 0x524FCB00,0xD0B81E75, + 0x40240000,0x00000000, 89, 0x5283DEE0,0x82731309, + 0x40240000,0x00000000, 90, 0x52B8D698,0xA30FD7CB, + 0x40240000,0x00000000, 91, 0x52EF0C3E,0xCBD3CDBE, + 0x40240000,0x00000000, 92, 0x532367A7,0x3F646097, + 0x40240000,0x00000000, 93, 0x53584191,0x0F3D78BC, + 0x40240000,0x00000000, 94, 0x538E51F5,0x530CD6EC, + 0x40240000,0x00000000, 95, 0x53C2F339,0x53E80653, + 0x40240000,0x00000000, 96, 0x53F7B007,0xA8E207E8, + 0x40240000,0x00000000, 97, 0x542D9C09,0x931A89E2, + 0x40240000,0x00000000, 98, 0x54628185,0xFBF0962D, + 0x40240000,0x00000000, 99, 0x549721E7,0x7AECBBB9, + 0x40240000,0x00000000, 100, 0x54CCEA61,0x59A7EAA7, + 0x40240000,0x00000000, 101, 0x5502127C,0xD808F2A8, + 0x40240000,0x00000000, 102, 0x5536971C,0x0E0B2F52, + 0x40240000,0x00000000, 103, 0x556C3CE3,0x118DFB27, + 0x40240000,0x00000000, 104, 0x55A1A60D,0xEAF8BCF8, + 0x40240000,0x00000000, 105, 0x55D60F91,0x65B6EC36, + 0x40240000,0x00000000, 106, 0x560B9375,0xBF24A744, + 0x40240000,0x00000000, 107, 0x56413C29,0x9776E88A, + 0x40240000,0x00000000, 108, 0x56758B33,0xFD54A2AD, + 0x40240000,0x00000000, 109, 0x56AAEE00,0xFCA9CB58, + 0x40240000,0x00000000, 110, 0x56E0D4C0,0x9DEA1F17, + 0x40240000,0x00000000, 111, 0x571509F0,0xC564A6DD, + 0x40240000,0x00000000, 112, 0x574A4C6C,0xF6BDD094, + 0x40240000,0x00000000, 113, 0x57806FC4,0x1A36A25D, + 0x40240000,0x00000000, 114, 0x57B48BB5,0x20C44AF4, + 0x40240000,0x00000000, 115, 0x57E9AEA2,0x68F55DB1, + 0x40240000,0x00000000, 116, 0x58200D25,0x81995A8E, + 0x40240000,0x00000000, 117, 0x5854106E,0xE1FFB132, + 0x40240000,0x00000000, 118, 0x5889148A,0x9A7F9D7F, + 0x40240000,0x00000000, 119, 0x58BF59AD,0x411F84DE, + 0x40240000,0x00000000, 120, 0x58F3980C,0x48B3B30B, + 0x40240000,0x00000000, 121, 0x59287E0F,0x5AE09FCE, + 0x40240000,0x00000000, 122, 0x595E9D93,0x3198C7C1, + 0x40240000,0x00000000, 123, 0x5993227B,0xFEFF7CD9, + 0x40240000,0x00000000, 124, 0x59C7EB1A,0xFEBF5C0F, + 0x40240000,0x00000000, 125, 0x59FDE5E1,0xBE6F3313, + 0x40240000,0x00000000, 126, 0x5A32AFAD,0x17057FEC, + 0x40240000,0x00000000, 127, 0x5A675B98,0x5CC6DFE6, + 0x40240000,0x00000000, 128, 0x5A9D327E,0x73F897E0, + 0x40240000,0x00000000, 129, 0x5AD23F8F,0x087B5EEC, + 0x40240000,0x00000000, 130, 0x5B06CF72,0xCA9A36A7, + 0x40240000,0x00000000, 131, 0x5B3C834F,0x7D40C451, + 0x40240000,0x00000000, 132, 0x5B71D211,0xAE487AB3, + 0x40240000,0x00000000, 133, 0x5BA64696,0x19DA995F, + 0x40240000,0x00000000, 134, 0x5BDBD83B,0xA0513FB7, + 0x40240000,0x00000000, 135, 0x5C116725,0x4432C7D2, + 0x40240000,0x00000000, 136, 0x5C45C0EE,0x953F79C7, + 0x40240000,0x00000000, 137, 0x5C7B312A,0x3A8F5839, + 0x40240000,0x00000000, 138, 0x5CB0FEBA,0x64999723, + 0x40240000,0x00000000, 139, 0x5CE53E68,0xFDBFFCEC, + 0x40240000,0x00000000, 140, 0x5D1A8E03,0x3D2FFC27, + 0x40240000,0x00000000, 141, 0x5D5098C2,0x063DFD99, + 0x40240000,0x00000000, 142, 0x5D84BEF2,0x87CD7CFF, + 0x40240000,0x00000000, 143, 0x5DB9EEAF,0x29C0DC3E, + 0x40240000,0x00000000, 144, 0x5DF0352D,0x7A1889A7, + 0x40240000,0x00000000, 145, 0x5E244278,0xD89EAC11, + 0x40240000,0x00000000, 146, 0x5E595317,0x0EC65715, + 0x40240000,0x00000000, 147, 0x5E8FA7DC,0xD277ECDA, + 0x40240000,0x00000000, 148, 0x5EC3C8EA,0x038AF408, + 0x40240000,0x00000000, 149, 0x5EF8BB24,0x846DB10A, + 0x40240000,0x00000000, 150, 0x5F2EE9ED,0xA5891D4D, + 0x40240000,0x00000000, 151, 0x5F635234,0x8775B250, + 0x40240000,0x00000000, 152, 0x5F9826C1,0xA9531EE4, + 0x40240000,0x00000000, 153, 0x5FCE3072,0x13A7E69D, + 0x40240000,0x00000000, 154, 0x6002DE47,0x4C48F022, + 0x40240000,0x00000000, 155, 0x603795D9,0x1F5B2C2B, + 0x40240000,0x00000000, 156, 0x606D7B4F,0x6731F736, + 0x40240000,0x00000000, 157, 0x60A26D11,0xA07F3A81, + 0x40240000,0x00000000, 158, 0x60D70856,0x089F0922, + 0x40240000,0x00000000, 159, 0x610CCA6B,0x8AC6CB6A, + 0x40240000,0x00000000, 160, 0x6141FE83,0x36BC3F22, + 0x40240000,0x00000000, 161, 0x61767E24,0x046B4EEB, + 0x40240000,0x00000000, 162, 0x61AC1DAD,0x058622A6, + 0x40240000,0x00000000, 163, 0x61E1928C,0x2373D5A8, + 0x40240000,0x00000000, 164, 0x6215F72F,0x2C50CB12, + 0x40240000,0x00000000, 165, 0x624B74FA,0xF764FDD6, + 0x40240000,0x00000000, 166, 0x6281291C,0xDA9F1EA6, + 0x40240000,0x00000000, 167, 0x62B57364,0x1146E64F, + 0x40240000,0x00000000, 168, 0x62EAD03D,0x15989FE3, + 0x40240000,0x00000000, 169, 0x6320C226,0x2D7F63EE, + 0x40240000,0x00000000, 170, 0x6354F2AF,0xB8DF3CE9, + 0x40240000,0x00000000, 171, 0x638A2F5B,0xA7170C24, + 0x40240000,0x00000000, 172, 0x63C05D99,0x486E6796, + 0x40240000,0x00000000, 173, 0x63F474FF,0x9A8A017C, + 0x40240000,0x00000000, 174, 0x6429923F,0x812C81DB, + 0x40240000,0x00000000, 175, 0x645FF6CF,0x6177A251, + 0x40240000,0x00000000, 176, 0x6493FA41,0x9CEAC573, + 0x40240000,0x00000000, 177, 0x64C8F8D2,0x042576D0, + 0x40240000,0x00000000, 178, 0x64FF3706,0x852ED484, + 0x40240000,0x00000000, 179, 0x65338264,0x133D44D2, + 0x40240000,0x00000000, 180, 0x656862FD,0x180C9607, + 0x40240000,0x00000000, 181, 0x659E7BBC,0x5E0FBB88, + 0x40240000,0x00000000, 182, 0x65D30D55,0xBAC9D535, + 0x40240000,0x00000000, 183, 0x6607D0AB,0x297C4A83, + 0x40240000,0x00000000, 184, 0x663DC4D5,0xF3DB5D23, + 0x40240000,0x00000000, 185, 0x66729B05,0xB8691A36, + 0x40240000,0x00000000, 186, 0x66A741C7,0x268360C4, + 0x40240000,0x00000000, 187, 0x66DD1238,0xF02438F4, + 0x40240000,0x00000000, 188, 0x67122B63,0x9616A399, + 0x40240000,0x00000000, 189, 0x6746B63C,0x7B9C4C7F, + 0x40240000,0x00000000, 190, 0x677C63CB,0x9A835F9F, + 0x40240000,0x00000000, 191, 0x67B1BE5F,0x40921BC3, + 0x40240000,0x00000000, 192, 0x67E62DF7,0x10B6A2B4, + 0x40240000,0x00000000, 193, 0x681BB974,0xD4E44B61, + 0x40240000,0x00000000, 194, 0x685153E9,0x050EAF1D, + 0x40240000,0x00000000, 195, 0x6885A8E3,0x46525AE4, + 0x40240000,0x00000000, 196, 0x68BB131C,0x17E6F19D, + 0x40240000,0x00000000, 197, 0x68F0EBF1,0x8EF05702, + 0x40240000,0x00000000, 198, 0x692526ED,0xF2AC6CC2, + 0x40240000,0x00000000, 199, 0x695A70A9,0x6F5787F3, + 0x40240000,0x00000000, 200, 0x69908669,0xE596B4F8, + 0x40240000,0x00000000, 201, 0x69C4A804,0x5EFC6236, + 0x40240000,0x00000000, 202, 0x69F9D205,0x76BB7AC3, + 0x40240000,0x00000000, 203, 0x6A302343,0x6A352CBA, + 0x40240000,0x00000000, 204, 0x6A642C14,0x44C277E9, + 0x40240000,0x00000000, 205, 0x6A993719,0x55F315E3, + 0x40240000,0x00000000, 206, 0x6ACF84DF,0xAB6FDB5B, + 0x40240000,0x00000000, 207, 0x6B03B30B,0xCB25E919, + 0x40240000,0x00000000, 208, 0x6B389FCE,0xBDEF635F, + 0x40240000,0x00000000, 209, 0x6B6EC7C2,0x6D6B3C37, + 0x40240000,0x00000000, 210, 0x6BA33CD9,0x846305A3, + 0x40240000,0x00000000, 211, 0x6BD80C0F,0xE57BC70B, + 0x40240000,0x00000000, 212, 0x6C0E0F13,0xDEDAB8CE, + 0x40240000,0x00000000, 213, 0x6C42C96C,0x6B48B381, + 0x40240000,0x00000000, 214, 0x6C777BC7,0x861AE061, + 0x40240000,0x00000000, 215, 0x6CAD5AB9,0x67A19879, + 0x40240000,0x00000000, 216, 0x6CE258B3,0xE0C4FF4C, + 0x40240000,0x00000000, 217, 0x6D16EEE0,0xD8F63F1F, + 0x40240000,0x00000000, 218, 0x6D4CAA99,0x0F33CEE6, + 0x40240000,0x00000000, 219, 0x6D81EA9F,0xA9806150, + 0x40240000,0x00000000, 220, 0x6DB66547,0x93E079A4, + 0x40240000,0x00000000, 221, 0x6DEBFE99,0x78D8980D, + 0x40240000,0x00000000, 222, 0x6E217F1F,0xEB875F08, + 0x40240000,0x00000000, 223, 0x6E55DEE7,0xE66936CA, + 0x40240000,0x00000000, 224, 0x6E8B56A1,0xE003847D, + 0x40240000,0x00000000, 225, 0x6EC11625,0x2C0232CE, + 0x40240000,0x00000000, 226, 0x6EF55BAE,0x7702BF81, + 0x40240000,0x00000000, 227, 0x6F2AB29A,0x14C36F62, + 0x40240000,0x00000000, 228, 0x6F60AFA0,0x4CFA259D, + 0x40240000,0x00000000, 229, 0x6F94DB88,0x6038AF04, + 0x40240000,0x00000000, 230, 0x6FCA126A,0x7846DAC5, + 0x40240000,0x00000000, 231, 0x70004B82,0x8B2C48BB, + 0x40240000,0x00000000, 232, 0x70345E63,0x2DF75AEA, + 0x40240000,0x00000000, 233, 0x706975FB,0xF97531A5, + 0x40240000,0x00000000, 234, 0x709FD37A,0xF7D27E0E, + 0x40240000,0x00000000, 235, 0x70D3E42C,0xDAE38EC9, + 0x40240000,0x00000000, 236, 0x7108DD38,0x119C727B, + 0x40240000,0x00000000, 237, 0x713F1486,0x16038F1A, + 0x40240000,0x00000000, 238, 0x71736CD3,0xCDC23970, + 0x40240000,0x00000000, 239, 0x71A84808,0xC132C7CC, + 0x40240000,0x00000000, 240, 0x71DE5A0A,0xF17F79BF, + 0x40240000,0x00000000, 241, 0x7212F846,0xD6EFAC17, + 0x40240000,0x00000000, 242, 0x7247B658,0x8CAB971D, + 0x40240000,0x00000000, 243, 0x727DA3EE,0xAFD67CE5, + 0x40240000,0x00000000, 244, 0x72B28675,0x2DE60E0F, + 0x40240000,0x00000000, 245, 0x72E72812,0x795F9193, + 0x40240000,0x00000000, 246, 0x731CF217,0x17B775F7, + 0x40240000,0x00000000, 247, 0x7352174E,0x6ED2A9BB, + 0x40240000,0x00000000, 248, 0x73869D22,0x0A875429, + 0x40240000,0x00000000, 249, 0x73BC446A,0x8D292933, + 0x40240000,0x00000000, 250, 0x73F1AAC2,0x9839B9C0, + 0x40240000,0x00000000, 251, 0x74261573,0x3E482830, + 0x40240000,0x00000000, 252, 0x745B9AD0,0x0DDA323C, + 0x40240000,0x00000000, 253, 0x749140C2,0x08A85F66, + 0x40240000,0x00000000, 254, 0x74C590F2,0x8AD2773F, + 0x40240000,0x00000000, 255, 0x74FAF52F,0x2D87150F, + 0x40240000,0x00000000, 256, 0x7530D93D,0x7C746D29, + 0x40240000,0x00000000, 257, 0x75650F8C,0xDB918874, + 0x40240000,0x00000000, 258, 0x759A5370,0x1275EA91, + 0x40240000,0x00000000, 259, 0x75D07426,0x0B89B29A, + 0x40240000,0x00000000, 260, 0x7604912F,0x8E6C1F41, + 0x40240000,0x00000000, 261, 0x7639B57B,0x72072711, + 0x40240000,0x00000000, 262, 0x7670116D,0x2744786B, + 0x40240000,0x00000000, 263, 0x76A415C8,0x71159685, + 0x40240000,0x00000000, 264, 0x76D91B3A,0x8D5AFC27, + 0x40240000,0x00000000, 265, 0x770F6209,0x30B1BB30, + 0x40240000,0x00000000, 266, 0x77439D45,0xBE6F14FE, + 0x40240000,0x00000000, 267, 0x77788497,0x2E0ADA3E, + 0x40240000,0x00000000, 268, 0x77AEA5BC,0xF98D90CD, + 0x40240000,0x00000000, 269, 0x77E32796,0x1BF87A80, + 0x40240000,0x00000000, 270, 0x7817F17B,0xA2F69920, + 0x40240000,0x00000000, 271, 0x784DEDDA,0x8BB43F68, + 0x40240000,0x00000000, 272, 0x7882B4A8,0x9750A7A1, + 0x40240000,0x00000000, 273, 0x78B761D2,0xBD24D18A, + 0x40240000,0x00000000, 274, 0x78ED3A47,0x6C6E05EC, + 0x40240000,0x00000000, 275, 0x7922446C,0xA3C4C3B4, + 0x40240000,0x00000000, 276, 0x7956D587,0xCCB5F4A0, + 0x40240000,0x00000000, 277, 0x798C8AE9,0xBFE371C8, + 0x40240000,0x00000000, 278, 0x79C1D6D2,0x17EE271D, + 0x40240000,0x00000000, 279, 0x79F64C86,0x9DE9B0E5, + 0x40240000,0x00000000, 280, 0x7A2BDFA8,0x45641D1E, + 0x40240000,0x00000000, 281, 0x7A616BC9,0x2B5E9233, + 0x40240000,0x00000000, 282, 0x7A95C6BB,0x763636BF, + 0x40240000,0x00000000, 283, 0x7ACB386A,0x53C3C46F, + 0x40240000,0x00000000, 284, 0x7B010342,0x745A5AC5, + 0x40240000,0x00000000, 285, 0x7B354413,0x1170F177, + 0x40240000,0x00000000, 286, 0x7B6A9517,0xD5CD2DD4, + 0x40240000,0x00000000, 287, 0x7BA09D2E,0xE5A03CA5, + 0x40240000,0x00000000, 288, 0x7BD4C47A,0x9F084BCE, + 0x40240000,0x00000000, 289, 0x7C09F599,0x46CA5EC1, + 0x40240000,0x00000000, 290, 0x7C40397F,0xCC3E7B39, + 0x40240000,0x00000000, 291, 0x7C7447DF,0xBF4E1A07, + 0x40240000,0x00000000, 292, 0x7CA959D7,0xAF21A089, + 0x40240000,0x00000000, 293, 0x7CDFB04D,0x9AEA08AB, + 0x40240000,0x00000000, 294, 0x7D13CE30,0x80D2456B, + 0x40240000,0x00000000, 295, 0x7D48C1BC,0xA106D6C6, + 0x40240000,0x00000000, 296, 0x7D7EF22B,0xC9488C77, + 0x40240000,0x00000000, 297, 0x7DB3575B,0x5DCD57CA, + 0x40240000,0x00000000, 298, 0x7DE82D32,0x3540ADBD, + 0x40240000,0x00000000, 299, 0x7E1E387E,0xC290D92C, + 0x40240000,0x00000000, 300, 0x7E52E34F,0x399A87BC, + }; + +LOCAL_D const TUint32 Power10TestNegative[] = + { + 0x3FB99999,0x9999999A, + 0x3F847AE1,0x47AE147B, + 0x3F50624D,0xD2F1A9FC, + 0x3F1A36E2,0xEB1C432D, + 0x3EE4F8B5,0x88E368F1, + 0x3EB0C6F7,0xA0B5ED8D, + 0x3E7AD7F2,0x9ABCAF48, + 0x3E45798E,0xE2308C3A, + 0x3E112E0B,0xE826D695, + 0x3DDB7CDF,0xD9D7BDBB, + 0x3DA5FD7F,0xE1796495, + 0x3D719799,0x812DEA11, + 0x3D3C25C2,0x68497682, + 0x3D06849B,0x86A12B9B, + 0x3CD203AF,0x9EE75616, + 0x3C9CD2B2,0x97D889BC, + 0x3C670EF5,0x4646D497, + 0x3C32725D,0xD1D243AC, + 0x3BFD83C9,0x4FB6D2AC, + 0x3BC79CA1,0x0C924223, + 0x3B92E3B4,0x0A0E9B4F, + 0x3B5E3920,0x10175EE6, + 0x3B282DB3,0x4012B251, + 0x3AF357C2,0x99A88EA7, + 0x3ABEF2D0,0xF5DA7DD9, + 0x3A88C240,0xC4AECB14, + 0x3A53CE9A,0x36F23C10, + 0x3A1FB0F6,0xBE506019, + 0x39E95A5E,0xFEA6B347, + 0x39B4484B,0xFEEBC2A0, + 0x398039D6,0x65896880, + 0x3949F623,0xD5A8A733, + 0x3914C4E9,0x77BA1F5C, + 0x38E09D87,0x92FB4C49, + 0x38AA95A5,0xB7F87A0F, + 0x38754484,0x932D2E72, + 0x3841039D,0x428A8B8F, + 0x380B38FB,0x9DAA78E4, + 0x37D5C72F,0xB1552D83, + 0x37A16C26,0x2777579C, + 0x376BE03D,0x0BF225C7, + 0x37364CFD,0xA3281E39, + 0x3701D731,0x4F534B61, + 0x36CC8B82,0x18854567, + 0x3696D601,0xAD376AB9, + 0x366244CE,0x242C5561, + 0x362D3AE3,0x6D13BBCE, + 0x35F7624F,0x8A762FD8, + 0x35C2B50C,0x6EC4F313, + 0x358DEE7A,0x4AD4B81F, + 0x3557F1FB,0x6F10934C, + 0x352327FC,0x58DA0F70, + 0x34EEA660,0x8E29B24D, + 0x34B8851A,0x0B548EA4, + 0x34839DAE,0x6F76D883, + 0x344F62B0,0xB257C0D2, + 0x34191BC0,0x8EAC9A41, + 0x33E41633,0xA556E1CE, + 0x33B011C2,0xEAABE7D8, + 0x3379B604,0xAAACA626, + 0x3344919D,0x5556EB52, + 0x3310747D,0xDDDF22A8, + 0x32DA53FC,0x9631D10D, + 0x32A50FFD,0x44F4A73D, + 0x3270D997,0x6A5D5297, + 0x323AF5BF,0x109550F2, + 0x32059165,0xA6DDDA5B, + 0x31D1411E,0x1F17E1E3, + 0x319B9B63,0x64F30304, + 0x316615E9,0x1D8F359D, + 0x3131AB20,0xE472914A, + 0x30FC4501,0x6D841BAA, + 0x30C69D9A,0xBE034955, + 0x309217AE,0xFE690777, + 0x305CF2B1,0x970E7258, + 0x3027288E,0x1271F513, + 0x2FF286D8,0x0EC190DC, + 0x2FBDA48C,0xE468E7C7, + 0x2F87B6D7,0x1D20B96C, + 0x2F52F8AC,0x174D6123, + 0x2F1E5AAC,0xF2156838, + 0x2EE8488A,0x5B445360, + 0x2EB36D3B,0x7C36A91A, + 0x2E7F152B,0xF9F10E90, + 0x2E48DDBC,0xC7F40BA6, + 0x2E13E497,0x065CD61F, + 0x2DDFD424,0xD6FAF031, + 0x2DA97683,0xDF2F268D, + 0x2D745ECF,0xE5BF520B, + 0x2D404BD9,0x84990E6F, + 0x2D0A12F5,0xA0F4E3E5, + 0x2CD4DBF7,0xB3F71CB7, + 0x2CA0AFF9,0x5CC5B092, + 0x2C6AB328,0x946F80EA, + 0x2C355C20,0x76BF9A55, + 0x2C011680,0x5EFFAEAA, + 0x2BCB5733,0xCB32B111, + 0x2B95DF5C,0xA28EF40D, + 0x2B617F7D,0x4ED8C33E, + 0x2B2BFF2E,0xE48E0530, + 0x2AF665BF,0x1D3E6A8D, + 0x2AC1EAFF,0x4A98553D, + 0x2A8CAB32,0x10F3BB95, + 0x2A56EF5B,0x40C2FC77, + 0x2A225915,0xCD68C9F9, + 0x29ED5B56,0x1574765B, + 0x29B77C44,0xDDF6C516, + 0x2982C9D0,0xB1923745, + 0x294E0FB4,0x4F50586E, + 0x29180C90,0x3F7379F2, + 0x28E33D40,0x32C2C7F5, + 0x28AEC866,0xB79E0CBA, + 0x2878A052,0x2C7E7095, + 0x2843B374,0xF06526DE, + 0x280F8587,0xE7083E30, + 0x27D9379F,0xEC069826, + 0x27A42C7F,0xF0054685, + 0x27702399,0x8CD10537, + 0x2739D28F,0x47B4D525, + 0x2704A872,0x9FC3DDB7, + 0x26D086C2,0x19697E2C, + 0x269A7136,0x8F0F3047, + 0x2665275E,0xD8D8F36C, + 0x2630EC4B,0xE0AD8F89, + 0x25FB13AC,0x9AAF4C0F, + 0x25C5A956,0xE225D672, + 0x25915445,0x81B7DEC2, + 0x255BBA08,0xCF8C979D, + 0x25262E6D,0x72D6DFB0, + 0x24F1BEBD,0xF578B2F4, + 0x24BC6463,0x225AB7EC, + 0x2486B6B5,0xB5155FF0, + 0x24522BC4,0x90DDE65A, + 0x241D12D4,0x1AFCA3C3, + 0x23E74243,0x48CA1C9C, + 0x23B29B69,0x070816E3, + 0x237DC574,0xD80CF16B, + 0x2347D12A,0x4670C123, + 0x23130DBB,0x6B8D674F, + 0x22DE7C5F,0x127BD87E, + 0x22A8637F,0x41FCAD32, + 0x227382CC,0x34CA2428, + 0x223F37AD,0x21436D0C, + 0x2208F957,0x4DCF8A70, + 0x21D3FAAC,0x3E3FA1F3, + 0x219FF779,0xFD329CB9, + 0x216992C7,0xFDC216FA, + 0x2134756C,0xCB01ABFB, + 0x21005DF0,0xA267BCC9, + 0x20CA2FE7,0x6A3F9475, + 0x2094F31F,0x8832DD2A, + 0x2060C27F,0xA028B0EF, + 0x202AD0CC,0x33744E4B, + 0x1FF573D6,0x8F903EA2, + 0x1FC12978,0x72D9CBB5, + 0x1F8B758D,0x848FAC55, + 0x1F55F7A4,0x6A0C89DD, + 0x1F2192E9,0xEE706E4B, + 0x1EEC1E43,0x171A4A11, + 0x1EB67E9C,0x127B6E74, + 0x1E81FEE3,0x41FC585D, + 0x1E4CCB05,0x36608D61, + 0x1E1708D0,0xF84D3DE7, + 0x1DE26D73,0xF9D764B9, + 0x1DAD7BEC,0xC2F23AC2, + 0x1D779657,0x025B6235, + 0x1D42DEAC,0x01E2B4F7, + 0x1D0E3113,0x363787F2, + 0x1CD82742,0x91C6065B, + 0x1CA3529B,0xA7D19EAF, + 0x1C6EEA92,0xA61C3118, + 0x1C38BBA8,0x84E35A7A, + 0x1C03C953,0x9D82AEC8, + 0x1BCFA885,0xC8D117A6, + 0x1B99539E,0x3A40DFB8, + 0x1B6442E4,0xFB671960, + 0x1B303583,0xFC527AB3, + 0x1AF9EF39,0x93B72AB8, + 0x1AC4BF61,0x42F8EEFA, + 0x1A90991A,0x9BFA58C8, + 0x1A5A8E90,0xF9908E0D, + 0x1A253EDA,0x614071A4, + 0x19F0FF15,0x1A99F483, + 0x19BB31BB,0x5DC320D2, + 0x1985C162,0xB168E70E, + 0x19516782,0x27871F3E, + 0x191BD8D0,0x3F3E9864, + 0x18E6470C,0xFF6546B6, + 0x18B1D270,0xCC51055F, + 0x187C83E7,0xAD4E6EFE, + 0x1846CFEC,0x8AA52598, + 0x18123FF0,0x6EEA847A, + 0x17DD331A,0x4B10D3F6, + 0x17A75C15,0x08DA432B, + 0x1772B010,0xD3E1CF56, + 0x173DE681,0x5302E556, + 0x1707EB9A,0xA8CF1DDE, + 0x16D322E2,0x20A5B17E, + 0x169E9E36,0x9AA2B597, + 0x16687E92,0x154EF7AC, + 0x16339874,0xDDD8C623, + 0x15FF5A54,0x9627A36C, + 0x15C91510,0x781FB5F0, + 0x159410D9,0xF9B2F7F3, + 0x15600D7B,0x2E28C65C, + 0x1529AF2B,0x7D0E0A2D, + 0x14F48C22,0xCA71A1BD, + 0x14C0701B,0xD527B498, + 0x148A4CF9,0x550C5426, + 0x14550A61,0x10D6A9B8, + 0x1420D51A,0x73DEEE2D, + 0x13EAEE90,0xB964B047, + 0x13B58BA6,0xFAB6F36C, + 0x13813C85,0x955F2923, + 0x134B9408,0xEEFEA839, + 0x13161007,0x25988694, + 0x12E1A66C,0x1E139EDD, + 0x12AC3D79,0xC9B8FE2E, + 0x12769794,0xA160CB58, + 0x124212DD,0x4DE70913, + 0x120CEAFB,0xAFD80E85, + 0x11D72262,0xF3133ED1, + 0x11A281E8,0xC275CBDA, + 0x116D9CA7,0x9D89462A, + 0x1137B086,0x17A104EE, + 0x1102F39E,0x794D9D8B, + 0x10CE5297,0x287C2F45, + 0x10984212,0x86C9BF6B, + 0x1063680E,0xD23AFF89, + 0x102F0CE4,0x839198DB, + 0x0FF8D71D,0x360E13E2, + 0x0FC3DF4A,0x91A4DCB5, + 0x0F8FCBAA,0x82A16121, + 0x0F596FBB,0x9BB44DB4, + 0x0F245962,0xE2F6A490, + 0x0EF04782,0x4F2BB6DA, + 0x0EBA0C03,0xB1DF8AF6, + 0x0E84D669,0x5B193BF8, + 0x0E50AB87,0x7C142FFA, + 0x0E1AAC0B,0xF9B9E65C, + 0x0DE5566F,0xFAFB1EB0, + 0x0DB111F3,0x2F2F4BC0, + 0x0D7B4FEB,0x7EB212CD, + 0x0D45D989,0x32280F0A, + 0x0D117AD4,0x28200C08, + 0x0CDBF7B9,0xD9CCE00D, + 0x0CA65FC7,0xE170B33E, + 0x0C71E639,0x8126F5CB, + 0x0C3CA38F,0x350B22DF, + 0x0C06E93F,0x5DA2824C, + 0x0BD25432,0xB14ECEA3, + 0x0B9D5384,0x4EE47DD1, + 0x0B677603,0x725064A8, + 0x0B32C4CF,0x8EA6B6EC, + 0x0AFE07B2,0x7DD78B14, + 0x0AC80628,0x64AC6F43, + 0x0A933820,0x5089F29C, + 0x0A5EC033,0xB40FEA93, + 0x0A2899C2,0xF6732210, + 0x09F3AE35,0x91F5B4D9, + 0x09BF7D22,0x8322BAF5, + 0x098930E8,0x68E89591, + 0x09542720,0x53ED4474, + 0x09201F4D,0x0FF10390, + 0x08E9CBAE,0x7FE805B3, + 0x08B4A2F1,0xFFECD15C, + 0x0880825B,0x3323DAB0, + 0x084A6A2B,0x85062AB3, + 0x081521BC,0x6A6B555C, + 0x07E0E7C9,0xEEBC444A, + 0x07AB0C76,0x4AC6D3A9, + 0x0775A391,0xD56BDC87, + 0x07414FA7,0xDDEFE3A0, + 0x070BB2A6,0x2FE638FF, + 0x06D62884,0xF31E93FF, + 0x06A1BA03,0xF5B21000, + 0x066C5CD3,0x22B67FFF, + 0x0636B0A8,0xE891FFFF, + 0x060226ED,0x86DB3333, + 0x05CD0B15,0xA491EB84, + 0x05973C11,0x5074BC6A, + 0x05629674,0x405D6388, + 0x052DBD86,0xCD6238D9, + 0x04F7CAD2,0x3DE82D7B, + 0x04C308A8,0x31868AC9, + 0x048E7440,0x4F3DAADB, + 0x04585D00,0x3F6488AF, + 0x04237D99,0xCC506D59, + 0x03EF2F5C,0x7A1A488E, + 0x03B8F2B0,0x61AEA072, + 0x0383F559,0xE7BEE6C1, + 0x034FEEF6,0x3F97D79C, + 0x03198BF8,0x32DFDFB0, + 0x02E46FF9,0xC24CB2F3, + 0x02B05994,0x9B708F29, + 0x027A28ED,0xC580E50E, + 0x0244ED8B,0x04671DA5, + 0x0210BE08,0xD0527E1D, + 0x01DAC9A7,0xB3B7302F, + 0x01A56E1F,0xC2F8F359, + 0x017124E6,0x3593F5E1, + 0x013B6E3D,0x22865634, + 0x0105F1CA,0x820511C3, + 0x00D18E3B,0x9B374169, + 0x009C16C5,0xC5253575, + 0x0066789E,0x3750F791, + 0x0031FA18,0x2C40C60D, + 0x000730D6,0x7819E8D2, + 0x0000B815,0x7268FDAF, + 0x00001268,0x8B70E62B, + 0x000001D7,0x4124E3D1, + 0x0000002F,0x201D49FB, + 0x00000004,0xB6695433, + 0x00000000,0x78A42205, + 0x00000000,0x0C1069CD, + 0x00000000,0x0134D761, + 0x00000000,0x001EE257, + 0x00000000,0x000316A2, + 0x00000000,0x00004F10, + 0x00000000,0x000007E8, + 0x00000000,0x000000CA, + 0x00000000,0x00000014, + 0x00000000,0x00000002 + }; + +LOCAL_D const TUint32 Power10TestPositive[] = + { + 0x3FF00000,0x00000000, + 0x40240000,0x00000000, + 0x40590000,0x00000000, + 0x408F4000,0x00000000, + 0x40C38800,0x00000000, + 0x40F86A00,0x00000000, + 0x412E8480,0x00000000, + 0x416312D0,0x00000000, + 0x4197D784,0x00000000, + 0x41CDCD65,0x00000000, + 0x4202A05F,0x20000000, + 0x42374876,0xE8000000, + 0x426D1A94,0xA2000000, + 0x42A2309C,0xE5400000, + 0x42D6BCC4,0x1E900000, + 0x430C6BF5,0x26340000, + 0x4341C379,0x37E08000, + 0x43763457,0x85D8A000, + 0x43ABC16D,0x674EC800, + 0x43E158E4,0x60913D00, + 0x4415AF1D,0x78B58C40, + 0x444B1AE4,0xD6E2EF50, + 0x4480F0CF,0x064DD592, + 0x44B52D02,0xC7E14AF6, + 0x44EA7843,0x79D99DB4, + 0x45208B2A,0x2C280291, + 0x4554ADF4,0xB7320335, + 0x4589D971,0xE4FE8402, + 0x45C027E7,0x2F1F1281, + 0x45F431E0,0xFAE6D721, + 0x46293E59,0x39A08CEA, + 0x465F8DEF,0x8808B024, + 0x4693B8B5,0xB5056E17, + 0x46C8A6E3,0x2246C99C, + 0x46FED09B,0xEAD87C03, + 0x47334261,0x72C74D82, + 0x476812F9,0xCF7920E3, + 0x479E17B8,0x4357691B, + 0x47D2CED3,0x2A16A1B1, + 0x48078287,0xF49C4A1D, + 0x483D6329,0xF1C35CA5, + 0x48725DFA,0x371A19E7, + 0x48A6F578,0xC4E0A061, + 0x48DCB2D6,0xF618C879, + 0x4911EFC6,0x59CF7D4C, + 0x49466BB7,0xF0435C9E, + 0x497C06A5,0xEC5433C6, + 0x49B18427,0xB3B4A05C, + 0x49E5E531,0xA0A1C873, + 0x4A1B5E7E,0x08CA3A8F, + 0x4A511B0E,0xC57E649A, + 0x4A8561D2,0x76DDFDC0, + 0x4ABABA47,0x14957D30, + 0x4AF0B46C,0x6CDD6E3E, + 0x4B24E187,0x8814C9CE, + 0x4B5A19E9,0x6A19FC41, + 0x4B905031,0xE2503DA9, + 0x4BC4643E,0x5AE44D13, + 0x4BF97D4D,0xF19D6057, + 0x4C2FDCA1,0x6E04B86D, + 0x4C63E9E4,0xE4C2F344, + 0x4C98E45E,0x1DF3B015, + 0x4CCF1D75,0xA5709C1B, + 0x4D037269,0x87666191, + 0x4D384F03,0xE93FF9F5, + 0x4D6E62C4,0xE38FF872, + 0x4DA2FDBB,0x0E39FB47, + 0x4DD7BD29,0xD1C87A19, + 0x4E0DAC74,0x463A989F, + 0x4E428BC8,0xABE49F64, + 0x4E772EBA,0xD6DDC73D, + 0x4EACFA69,0x8C95390C, + 0x4EE21C81,0xF7DD43A7, + 0x4F16A3A2,0x75D49491, + 0x4F4C4C8B,0x1349B9B5, + 0x4F81AFD6,0xEC0E1411, + 0x4FB61BCC,0xA7119916, + 0x4FEBA2BF,0xD0D5FF5B, + 0x502145B7,0xE285BF99, + 0x50559725,0xDB272F7F, + 0x508AFCEF,0x51F0FB5F, + 0x50C0DE15,0x93369D1B, + 0x50F5159A,0xF8044462, + 0x512A5B01,0xB605557B, + 0x516078E1,0x11C3556D, + 0x51949719,0x56342AC8, + 0x51C9BCDF,0xABC1357A, + 0x5200160B,0xCB58C16C, + 0x52341B8E,0xBE2EF1C7, + 0x52692272,0x6DBAAE39, + 0x529F6B0F,0x092959C7, + 0x52D3A2E9,0x65B9D81D, + 0x53088BA3,0xBF284E24, + 0x533EAE8C,0xAEF261AD, + 0x53732D17,0xED577D0C, + 0x53A7F85D,0xE8AD5C4F, + 0x53DDF675,0x62D8B363, + 0x5412BA09,0x5DC7701E, + 0x5447688B,0xB5394C25, + 0x547D42AE,0xA2879F2E, + 0x54B249AD,0x2594C37D, + 0x54E6DC18,0x6EF9F45C, + 0x551C931E,0x8AB87173, + 0x5551DBF3,0x16B346E8, + 0x558652EF,0xDC6018A2, + 0x55BBE7AB,0xD3781ECA, + 0x55F170CB,0x642B133F, + 0x5625CCFE,0x3D35D80E, + 0x565B403D,0xCC834E12, + 0x56910826,0x9FD210CB, + 0x56C54A30,0x47C694FE, + 0x56FA9CBC,0x59B83A3D, + 0x5730A1F5,0xB8132466, + 0x5764CA73,0x2617ED80, + 0x5799FD0F,0xEF9DE8E0, + 0x57D03E29,0xF5C2B18C, + 0x58044DB4,0x73335DEF, + 0x58396121,0x9000356B, + 0x586FB969,0xF40042C5, + 0x58A3D3E2,0x388029BB, + 0x58D8C8DA,0xC6A0342A, + 0x590EFB11,0x78484135, + 0x59435CEA,0xEB2D28C1, + 0x59783425,0xA5F872F1, + 0x59AE412F,0x0F768FAD, + 0x59E2E8BD,0x69AA19CC, + 0x5A17A2EC,0xC414A03F, + 0x5A4D8BA7,0xF519C84F, + 0x5A827748,0xF9301D32, + 0x5AB7151B,0x377C247E, + 0x5AECDA62,0x055B2D9E, + 0x5B22087D,0x4358FC82, + 0x5B568A9C,0x942F3BA3, + 0x5B8C2D43,0xB93B0A8C, + 0x5BC19C4A,0x53C4E697, + 0x5BF6035C,0xE8B6203D, + 0x5C2B8434,0x22E3A84D, + 0x5C6132A0,0x95CE4930, + 0x5C957F48,0xBB41DB7C, + 0x5CCADF1A,0xEA12525B, + 0x5D00CB70,0xD24B7379, + 0x5D34FE4D,0x06DE5057, + 0x5D6A3DE0,0x4895E46D, + 0x5DA066AC,0x2D5DAEC4, + 0x5DD48057,0x38B51A75, + 0x5E09A06D,0x06E26112, + 0x5E400444,0x244D7CAB, + 0x5E740555,0x2D60DBD6, + 0x5EA906AA,0x78B912CC, + 0x5EDF4855,0x16E7577F, + 0x5F138D35,0x2E5096AF, + 0x5F487082,0x79E4BC5B, + 0x5F7E8CA3,0x185DEB72, + 0x5FB317E5,0xEF3AB327, + 0x5FE7DDDF,0x6B095FF1, + 0x601DD557,0x45CBB7ED, + 0x6052A556,0x8B9F52F4, + 0x60874EAC,0x2E8727B1, + 0x60BD2257,0x3A28F19D, + 0x60F23576,0x84599702, + 0x6126C2D4,0x256FFCC3, + 0x615C7389,0x2ECBFBF4, + 0x6191C835,0xBD3F7D78, + 0x61C63A43,0x2C8F5CD6, + 0x61FBC8D3,0xF7B3340C, + 0x62315D84,0x7AD00087, + 0x6265B4E5,0x998400A9, + 0x629B221E,0xFFE500D4, + 0x62D0F553,0x5FEF2084, + 0x630532A8,0x37EAE8A5, + 0x633A7F52,0x45E5A2CF, + 0x63708F93,0x6BAF85C1, + 0x63A4B378,0x469B6732, + 0x63D9E056,0x584240FE, + 0x64102C35,0xF729689F, + 0x64443743,0x74F3C2C6, + 0x64794514,0x5230B378, + 0x64AF9659,0x66BCE056, + 0x64E3BDF7,0xE0360C36, + 0x6518AD75,0xD8438F43, + 0x654ED8D3,0x4E547314, + 0x65834784,0x10F4C7EC, + 0x65B81965,0x1531F9E8, + 0x65EE1FBE,0x5A7E7861, + 0x6622D3D6,0xF88F0B3D, + 0x665788CC,0xB6B2CE0C, + 0x668D6AFF,0xE45F818F, + 0x66C262DF,0xEEBBB0F9, + 0x66F6FB97,0xEA6A9D38, + 0x672CBA7D,0xE5054486, + 0x6761F48E,0xAF234AD4, + 0x679671B2,0x5AEC1D89, + 0x67CC0E1E,0xF1A724EB, + 0x680188D3,0x57087713, + 0x6835EB08,0x2CCA94D7, + 0x686B65CA,0x37FD3A0D, + 0x68A11F9E,0x62FE4448, + 0x68D56785,0xFBBDD55A, + 0x690AC167,0x7AAD4AB1, + 0x6940B8E0,0xACAC4EAF, + 0x6974E718,0xD7D7625A, + 0x69AA20DF,0x0DCD3AF1, + 0x69E0548B,0x68A044D6, + 0x6A1469AE,0x42C8560C, + 0x6A498419,0xD37A6B8F, + 0x6A7FE520,0x48590673, + 0x6AB3EF34,0x2D37A408, + 0x6AE8EB01,0x38858D0A, + 0x6B1F25C1,0x86A6F04C, + 0x6B537798,0xF4285630, + 0x6B88557F,0x31326BBB, + 0x6BBE6ADE,0xFD7F06AA, + 0x6BF302CB,0x5E6F642A, + 0x6C27C37E,0x360B3D35, + 0x6C5DB45D,0xC38E0C82, + 0x6C9290BA,0x9A38C7D1, + 0x6CC734E9,0x40C6F9C6, + 0x6CFD0223,0x90F8B837, + 0x6D322156,0x3A9B7323, + 0x6D66A9AB,0xC9424FEB, + 0x6D9C5416,0xBB92E3E6, + 0x6DD1B48E,0x353BCE70, + 0x6E0621B1,0xC28AC20C, + 0x6E3BAA1E,0x332D728F, + 0x6E714A52,0xDFFC6799, + 0x6EA59CE7,0x97FB817F, + 0x6EDB0421,0x7DFA61DF, + 0x6F10E294,0xEEBC7D2C, + 0x6F451B3A,0x2A6B9C76, + 0x6F7A6208,0xB5068394, + 0x6FB07D45,0x7124123D, + 0x6FE49C96,0xCD6D16CC, + 0x7019C3BC,0x80C85C7F, + 0x70501A55,0xD07D39CF, + 0x708420EB,0x449C8843, + 0x70B92926,0x15C3AA54, + 0x70EF736F,0x9B3494E9, + 0x7123A825,0xC100DD11, + 0x7158922F,0x31411456, + 0x718EB6BA,0xFD91596B, + 0x71C33234,0xDE7AD7E3, + 0x71F7FEC2,0x16198DDC, + 0x722DFE72,0x9B9FF153, + 0x7262BF07,0xA143F6D4, + 0x72976EC9,0x8994F489, + 0x72CD4A7B,0xEBFA31AB, + 0x73024E8D,0x737C5F0B, + 0x7336E230,0xD05B76CD, + 0x736C9ABD,0x04725481, + 0x73A1E0B6,0x22C774D0, + 0x73D658E3,0xAB795204, + 0x740BEF1C,0x9657A686, + 0x74417571,0xDDF6C814, + 0x7475D2CE,0x55747A18, + 0x74AB4781,0xEAD1989E, + 0x74E10CB1,0x32C2FF63, + 0x75154FDD,0x7F73BF3C, + 0x754AA3D4,0xDF50AF0B, + 0x7580A665,0x0B926D67, + 0x75B4CFFE,0x4E7708C0, + 0x75EA03FD,0xE214CAF1, + 0x7620427E,0xAD4CFED6, + 0x7654531E,0x58A03E8C, + 0x768967E5,0xEEC84E2F, + 0x76BFC1DF,0x6A7A61BB, + 0x76F3D92B,0xA28C7D15, + 0x7728CF76,0x8B2F9C5A, + 0x775F0354,0x2DFB8370, + 0x77936214,0x9CBD3226, + 0x77C83A99,0xC3EC7EB0, + 0x77FE4940,0x34E79E5C, + 0x7832EDC8,0x2110C2F9, + 0x7867A93A,0x2954F3B8, + 0x789D9388,0xB3AA30A5, + 0x78D27C35,0x704A5E67, + 0x79071B42,0xCC5CF601, + 0x793CE213,0x7F743382, + 0x79720D4C,0x2FA8A031, + 0x79A6909F,0x3B92C83D, + 0x79DC34C7,0x0A777A4D, + 0x7A11A0FC,0x668AAC70, + 0x7A46093B,0x802D578C, + 0x7A7B8B8A,0x6038AD6F, + 0x7AB13736,0x7C236C65, + 0x7AE58504,0x1B2C477F, + 0x7B1AE645,0x21F7595E, + 0x7B50CFEB,0x353A97DB, + 0x7B8503E6,0x02893DD2, + 0x7BBA44DF,0x832B8D46, + 0x7BF06B0B,0xB1FB384C, + 0x7C2485CE,0x9E7A065F, + 0x7C59A742,0x461887F6, + 0x7C900889,0x6BCF54FA, + 0x7CC40AAB,0xC6C32A38, + 0x7CF90D56,0xB873F4C7, + 0x7D2F50AC,0x6690F1F8, + 0x7D63926B,0xC01A973B, + 0x7D987706,0xB0213D0A, + 0x7DCE94C8,0x5C298C4C, + 0x7E031CFD,0x3999F7B0, + 0x7E37E43C,0x8800759C, + 0x7E6DDD4B,0xAA009303, + 0x7EA2AA4F,0x4A405BE2, + 0x7ED754E3,0x1CD072DA, + 0x7F0D2A1B,0xE4048F90, + 0x7F423A51,0x6E82D9BA, + 0x7F76C8E5,0xCA239029, + 0x7FAC7B1F,0x3CAC7433, + 0x7FE1CCF3,0x85EBC8A0 + }; + + +LOCAL_C TReal IEEERemainder(TReal a1, TReal a2) +// +// Implement the IEEE remainder operation as per IEEE 754. Since fmod() +// doesn't do the correct thing for infinity in the divisor, we have +// to patch up the return values in some of those cases. Then we have +// to adjust the domain of the results to be -|d/2| <= rem <= |d/2|. +// +// Copied from the Javasoft Win32 implementation + { + if (!Math::IsFinite(a2)) + { + if (Math::IsNaN(a2)) + return a2; + if (Math::IsFinite(a1)) + return a1; + } + TReal q; + Math::Mod(q,a1,a2); + + TReal d=a2; + if (d<0) + d=-d; + if (q < 0) + { + if (-q > d / 2) + q += d; + } + else + { + if (q > d / 2) + q -= d; + } + return q; + } + +LOCAL_C TReal GetTestValue(TUint32*& aValue) + { + TReal x; + TUint32* p=(TUint32*)&x; +#ifdef __DOUBLE_WORDS_SWAPPED__ + p[0]=*aValue++; + p[1]=*aValue++; +#else + p[1]=*aValue++; + p[0]=*aValue++; +#endif + return x; + } + +LOCAL_C TBool CompareExact(TReal aValue, TUint32*& anExpected) + { + TReal x=aValue; + TUint32* p=(TUint32*)&x; + TUint32 hi; + TUint32 lo; + TUint32 xhi; + TUint32 xlo; +#ifdef __DOUBLE_WORDS_SWAPPED__ + hi=p[0]; + lo=p[1]; +#else + hi=p[1]; + lo=p[0]; +#endif + xhi=*anExpected++; + xlo=*anExpected++; + if (hi==xhi && lo==xlo) + return ETrue; + test.Printf(_L("Expected %08x %08x, Actual %08x %08x\n"),xhi,xlo,hi,lo); + return EFalse; + } + +LOCAL_C void TestIEEERem() + { + TInt n=sizeof(IEEERemainderTestVectors)/(6*sizeof(TUint32)); + test.Printf(_L("%d tests\n"),n); + + TUint32* pV=IEEERemainderTestVectors; + TInt i; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=SineTest; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=CosineTest; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=TanTest; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=ExpTest; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=LnTest; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=SqrtTest; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=ArctanTest; + for (i=0; i>=2; + TReal input,obtained,expected; + TReal acc; + TReal minacc=99; + TInt i; + const TUint32 *p=ArcsinTest; + for (i=0; i>=1; + TReal obtained,expected; + TReal acc; + TReal minacc=99; + TInt input; + const TUint32 *p=Power10TestPositive; + for (input=0; input>=1; + p=Power10TestNegative; + for (input=-1; input>=(-n); input--) + { + Get(expected,p); + p+=2; + Math::Pow10(obtained,input); + acc=Accuracy(expected,obtained); + //test.Printf(_L("IN: %d OUT: %15g EXP: %15g ACC:%15g\n"), input, obtained, expected, acc); + if (acc=52); + + test.Next(_L("Cosine")); + TInt cosacc=TestCosine(); + test.Printf(_L("Cos accuracy %d bits\n"),cosacc); + test(cosacc>=52); + + test.Next(_L("Tangent")); + TInt tanacc=TestTangent(); + test.Printf(_L("Tan accuracy %d bits\n"),tanacc); + test(tanacc>=52); + + test.Next(_L("Exponential")); + TInt expacc=TestExp(); + test.Printf(_L("Exp accuracy %d bits\n"),expacc); + test(expacc>=52); + + test.Next(_L("Logarithm")); + TInt lnacc=TestLn(); + test.Printf(_L("Ln accuracy %d bits\n"),lnacc); + test(lnacc>=52); + + test.Next(_L("Square root")); + TInt sqrtacc=TestSqrt(); + test.Printf(_L("Sqrt accuracy %d bits\n"),sqrtacc); + test(sqrtacc>=52); + + test.Next(_L("Arctangent")); + TInt atnacc=TestArctan(); + test.Printf(_L("ATan accuracy %d bits\n"),atnacc); + test(atnacc>=52); + + test.Next(_L("Arcsine")); + TInt asnacc=TestArcsin(); + test.Printf(_L("ASin accuracy %d bits\n"),asnacc); + test(asnacc>=52); + + test.Next(_L("Powers 1")); + TInt pow1acc=TestPowers(); + test.Printf(_L("Pow accuracy %d bits\n"),pow1acc); + test(pow1acc>=52); + + test.Next(_L("Powers 2")); + TInt pow2acc=TestPowers2(); + test.Printf(_L("Pow accuracy %d bits\n"),pow2acc); + test(pow2acc>=52); + + test.Next(_L("Powers 3")); + TInt pow3acc=TestPowers3(); + test.Printf(_L("Pow accuracy %d bits\n"),pow3acc); + test(pow3acc>=52); + + test.Next(_L("Powers of 10")); + TInt pow10acc=TestPowersOf10(); + test.Printf(_L("Pow10 accuracy %d bits\n"),pow3acc); + test(pow10acc>=52); + + test.End(); + + return(KErrNone); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/math/t_vals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/math/t_vals.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,83 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\math\t_vals.h +// +// + +#include + +class TInt32x + { +public: + TInt32x(TInt32 aInt) {iInt=aInt;} +public: + TInt32 iInt; + }; + +#if defined (__DOUBLE_WORDS_SWAPPED__) +#define TINT64(a,b) MAKE_TINT64(b,a) +#else // for WINS and X86 (little-endian doubles) +#define TINT64(a,b) MAKE_TINT64(a,b) +#endif + +const TInt64 minTReal32in64 = TINT64(0x38100000,0x0); +const TInt64 maxTReal32in64 = TINT64(0x47efffff,0xe0000000); +const TInt64 sqrtMaxTReal64 = TINT64(0x5fefffff,0xffd9c605); +const TInt64 sqrtMinTReal64 = TINT64(0x20000000,0x0); +const TInt64 negZeroTReal64 = TINT64(0x80000000,0x0); +const TInt64 posInfTReal64 = TINT64(0x7ff00000,0x0); +const TInt64 negInfTReal64 = TINT64(0xfff00000,0x0); +const TInt64 NaNTReal64 = TINT64(0x7fffffff,0xffffffff); +const TInt64 K1EMinus322 = TINT64(0x00000000, 0x00000014); +const TInt64 K1EMinus313 = TINT64(0x00000004, 0xB6695433); +const TInt64 K5EMinus324 = TINT64(0x00000000, 0x00000001); +const TInt64 K4EMinus320 = TINT64(0x00000000, 0x00001FA0); +const TInt64 K1EMinus310 = TINT64(0x00001268, 0x8B70E62B); +const TInt64 K1EMinus323 = TINT64(0x00000000, 0x00000002); +const TInt64 K1Point2EMinus320 = TINT64(0x00000000, 0x0000097D); +const TInt64 K5EMinus321 = TINT64(0x00000000, 0x000003F4); +const TInt64 K2EMinus321 = TINT64(0x00000000, 0x00000195); +const TInt64 K1Point234EMinus316 = TINT64(0x000000000, 0x017D1C36); +const TInt64 K1EMinus324 = TINT64(0x000000000, 0x00000000); + +const TInt32x sqrtMaxTReal32 = TInt32x(0x5f7ffffd); +const TInt32x sqrtMinTReal32 = TInt32x(0x20000000); +const TInt32x negZeroTReal32 = TInt32x(0x80000000); +const TReal64 KMinTReal32in64 = *(TReal64*)&minTReal32in64; +const TReal64 KMaxTReal32in64 = *(TReal64*)&maxTReal32in64; +const TReal64 KSqrtMaxTReal64 = *(TReal64*)&sqrtMaxTReal64; +const TReal64 KSqrtMinTReal64 = *(TReal64*)&sqrtMinTReal64; +const TReal64 KNegZeroTReal64 = *(TReal64*)&negZeroTReal64; +const TReal64 KPosInfTReal64 = *(TReal64*)&posInfTReal64; +const TReal64 KNegInfTReal64 = *(TReal64*)&negInfTReal64; +const TReal64 KNaNTReal64 = *(TReal64*)&NaNTReal64; +const TReal32 KSqrtMaxTReal32 = *(TReal32*)&sqrtMaxTReal32; +const TReal32 KSqrtMinTReal32 = *(TReal32*)&sqrtMinTReal32; +const TReal32 KNegZeroTReal32 = *(TReal32*)&negZeroTReal32; +const TReal KMinTReal32inTReal = TReal(KMinTReal32in64); +const TReal KMaxTReal32inTReal = TReal(KMaxTReal32in64); +const TReal KNegZeroTReal = TReal(KNegZeroTReal64); +const TReal64 K1EMinus322Real64 = *(TReal64*)&K1EMinus322; +const TReal64 K1EMinus313Real64 = *(TReal64*)&K1EMinus313; +const TReal64 K5EMinus324Real64 = *(TReal64*)&K5EMinus324; +const TReal64 K4EMinus320Real64 = *(TReal64*)&K4EMinus320; +const TReal64 K1EMinus310Real64 = *(TReal64*)&K1EMinus310; +const TReal64 K1EMinus323Real64 = *(TReal64*)&K1EMinus323; +const TReal64 K1Point2EMinus320Real64 = *(TReal64*)&K1Point2EMinus320; +const TReal64 K5EMinus321Real64 = *(TReal64*)&K5EMinus321; +const TReal64 K2EMinus321Real64 = *(TReal64*)&K2EMinus321; +const TReal64 K1Point234EMinus316Real64 = *(TReal64*)&K1Point234EMinus316; +const TReal64 K1EMinus324Real64 = *(TReal64*)&K1EMinus324; + + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/misc/prbs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/misc/prbs.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,34 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\misc\prbs.h +// +// + +#ifndef __PRBS_H__ +#define __PRBS_H__ +#include + +LOCAL_C TUint Random(TUint* aSeed) + { + TUint x = aSeed[0]; + TUint r3 = x >> 1; + r3 |= (aSeed[1] << 31); + aSeed[1] = x & 1; + r3 ^= (x << 12); + x = r3 ^ (r3 >> 20); + aSeed[0] = x; + return x; + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/e32test/system/t_ctrap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/system/t_ctrap.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1592 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\system\t_ctrap.cpp +// Overview: +// Test the CCleanup, CTrapCleanup and TAutoClose classes +// API Information: +// CCleanup, CTrapCleanup, TAutoClose +// Details: +// - Test cleanup stack reallocation during cleanup. +// - Test cleanup stack modifications during the cleanup operation +// will cause a panic. +// - Test single-level cleanup of cells, objects, items and a mix: +// Create a CCleanup object, call a combination of methods, verify +// the results are as expected and verify the heap has not been +// corrupted. +// - Test multi-level cleanup of cells, objects, items and a mix: +// Create a CCleanup object, call a combination of methods, verify +// the results are as expected and verify the heap has not been +// corrupted. +// - Test a variety of special case cleanup tasks. Verify that the +// results are as expected. +// - Test CTrapCleanup cleanup of objects that either exit normally +// or leave. Also test the cleanup of multiple objects that leave. +// Verify results are as expected. +// - Test TAutoClose: create a TAutoClose object, verify that it is +// closed when it goes out of scope, push it on the cleanup stack, +// verify cleanup results are as expected. +// - Test that the Cleanup stack can go re-entrant. +// - Ensure that the stack is properly balanced with and without +// leaving. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#define __E32TEST_EXTENSION__ + +#include +#include +#include + + +const TInt KInitialCount=2; +const TInt KInitialCountAll=3; +const TInt KLeaveValue=0x12345678; +const TInt KMaxAlloc=6; + +static const TInt KHeapSize = 0x2000; + +enum TWhat {EPop,EPopAndDestroy,EMulti,ENull}; + +class CTest : public CBase + { +public: + void ConstructL(); +private: + TInt iData; + }; + +class CTest2: public CBase + { +public: + ~CTest2(); + }; + +class CTest3: public CBase + { +public: + ~CTest3(); + }; + +class RItem + { +public: + RItem() : iOpen(EFalse) {} + void Open() {iOpen=ETrue;} + void Close() {iOpen=EFalse;} + operator TCleanupItem() {return TCleanupItem(Cleanup,this);} + TBool IsOpen() const {return(iOpen);} +private: + static void Cleanup(TAny* aPtr); +private: + TBool iOpen; + }; + +LOCAL_D RTest test(_L("T_CTRAP")); +LOCAL_D TAny* gP1; +LOCAL_D CBufFlat* gP2; + + +LOCAL_C void ReallocateStackL() + { + TInt n = 0; + for(TInt i = 0; i < KMaxAlloc; ++i) + { + HBufC *p1 = HBufC::NewLC(4); //Stack re-allocation will be performed due to the additional objects pushed + //into the cleanup stack + n = p1->Length(); //include this line to avoid warnigs for unused "p1" variable + } + test.Printf(_L("ReallocateStackL(): PopAndDestroy KMaxAlloc pointers\n")); + CleanupStack::PopAndDestroy(KMaxAlloc); + } + +CTest2::~CTest2() + { + TInt err = KErrNoMemory; + + test.Printf(_L("~CTest2(): call ReallocateStackL()\n")); + + TRAP(err, ReallocateStackL() ); + } + +CTest3::~CTest3() + { + RDebug::Printf("~CTest3(): Modify Cleanup stack by pushing items"); + + TInt n = 0; + for(TInt i = 0; i < KMaxAlloc; ++i) + { + HBufC *p1 = HBufC::NewLC(4); //Stack re-allocation will be performed due to the additional objects pushed + //into the cleanup stack + n = p1->Length(); //include this line to avoid warnigs for unused "p1" variable + } + } + +#ifndef __TOOLS2__ +LOCAL_C void ModifyStack() + { + CTest3* ptr6 = new(ELeave)CTest3; + CleanupStack::PushL(ptr6); + + RDebug::Printf("ModifyStack(): PopAndDestroy ptr6"); + CleanupStack::PopAndDestroy(); + } + +LOCAL_C TInt PanicStackModifiedFn(TAny* aNopFn) + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + + aNopFn = NULL; //avoid warnings for unused "aNopFn" variable + + TInt err = KErrNoMemory; + + RDebug::Printf("PanicStackModifiedFn(): call TRAP(err, ModifyStack())"); + + if(NULL != cleanup) + { + TRAP(err, ModifyStack()); + delete cleanup; + } + __UHEAP_MARKEND; + return err; + } + +LOCAL_C void PushAndCleanupL() + { + CTest2* ptr1 = new(ELeave)CTest2; + CleanupStack::PushL(ptr1); + + CTest2* ptr2 = new(ELeave)CTest2; + CleanupStack::PushL(ptr2); + + CTest2* ptr3 = new(ELeave)CTest2; + CleanupStack::PushL(ptr3); + + test.Printf(_L("PushAndCleanupL(): PopAndDestroy ptr3, ptr2 and ptr1\n")); + CleanupStack::PopAndDestroy(3); + + CTest2* ptr4 = new(ELeave)CTest2; + CleanupStack::PushL(ptr4); + + CTest2* ptr5 = new(ELeave)CTest2; + CleanupStack::PushL(ptr5); + + test.Printf(_L("PushAndCleanupL(): PopAndDestroy ptr5 and ptr4\n")); + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(); + } + +LOCAL_C void testDestructorStackReallocation() + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + + TInt err = KErrNoMemory; + + if(NULL != cleanup) + { + TRAP(err, PushAndCleanupL()); + delete cleanup; + } + __UHEAP_MARKEND; + + test_KErrNone(err); + + test.Printf(_L("Verify cleanup stack modification during cleanup operation causes EClnStackModified panic\n")); + + // + //To verify the above case a new thread is created which does modify the cleanup stack during cleanup. + //The exit reason is then checked for the appropriate value(EClnStackModified) + // + + RThread panicThread; + + TInt r = panicThread.Create(_L("Panic EClnStackModified Thread"), PanicStackModifiedFn, KDefaultStackSize, KHeapSize, KHeapSize, NULL); + + test_KErrNone(r); + + TRequestStatus panicThreadStatus; + panicThread.Logon(panicThreadStatus); + + //don't want just in time debugging as we trap panics + TBool justInTime=User::JustInTime(); + User::SetJustInTime(EFalse); + + panicThread.Resume(); + + User::WaitForRequest(panicThreadStatus); + + test_Equal(EExitPanic, panicThread.ExitType()); + test_Equal(EClnStackModified, panicThread.ExitReason()); + + User::SetJustInTime(justInTime); + + CLOSE_AND_WAIT(panicThread); + } +#endif + +LOCAL_C void createMultiL() +// +// Create an object on the cleanup list and leave +// + { + + CBufFlat* pT=CBufFlat::NewL(8); + User::LeaveIfNull(pT); + CleanupStack::PushL(pT); + __UHEAP_CHECK(3); + User::Leave(KLeaveValue+1); + } + +LOCAL_C void createL(TWhat aWhat,TBool aLeave) +// +// Create objects and then either leave or return. +// Optionally pop them again. +// + { + + gP1=User::AllocL(0x10); + test.Printf(_L("createL 1")); + CleanupStack::PushL(gP1); + test.Printf(_L("createL 2")); + __UHEAP_CHECK(1); + test.Printf(_L("createL 3")); + gP2=CBufFlat::NewL(8); + test.Printf(_L("createL 4")); + User::LeaveIfNull(gP2); + test.Printf(_L("createL 5")); + CleanupStack::PushL(gP2); + test.Printf(_L("createL 6")); + __UHEAP_CHECK(2); + test.Printf(_L("createL 7")); + if (aWhat==EPop) + { + test.Printf(_L("createL 8")); + CleanupStack::Pop(); + test.Printf(_L("createL 9")); + CleanupStack::Pop(1); + test.Printf(_L("createL 10")); + } + if (aWhat==EPopAndDestroy) + { + test.Printf(_L("createL 11")); + CleanupStack::PopAndDestroy(); + test.Printf(_L("createL 12")); + CleanupStack::PopAndDestroy(1); + test.Printf(_L("createL 13")); + } + if (aWhat==EMulti) + { + test.Printf(_L("createL 14")); + TRAPD(r,createMultiL()) + test.Printf(_L("createL 15")); + test(r==(KLeaveValue+1)); + test.Printf(_L("createL 16")); + __UHEAP_CHECK(2); + test.Printf(_L("createL 17")); + } + if (aLeave) + { + test.Printf(_L("createL 18")); + User::Leave(KLeaveValue); + } + test.Printf(_L("createL 19")); + } + +LOCAL_C void createAllL(TBool aLeave) +// +// Call all functions which autmatically put objects on the cleanup list. +// + { + + __UHEAP_CHECK(KInitialCountAll); + TLex* pL=new(ELeave) TLex; // ::new, 1 cell + CleanupStack::PushL(pL); // Push + __UHEAP_CHECK(KInitialCountAll+1); + CTest* pT=new(ELeave) CTest; // CBase::new, 1 cell + CleanupStack::PushL(pT); // Push + __UHEAP_CHECK(KInitialCountAll+2); + pT->ConstructL(); // 1 more cell // Push + __UHEAP_CHECK(KInitialCountAll+3); + User::AllocLC(0x10); // Test RHeap::AllocLC as well // Push + __UHEAP_CHECK(KInitialCountAll+4); + _L("Hello").AllocLC(); // Test HBufC::NewLC() as well // Push + __UHEAP_CHECK(KInitialCountAll+5); + HBufC* pH=HBufC::NewMaxLC(8); // Push + test(pH->Length()==8); + __UHEAP_CHECK(KInitialCountAll+6); + if (aLeave) + User::Leave(KLeaveValue); + // new behavior for TCleanupTrapHander requires Pushes to the + // cleanup stack to be balanced by Pops + CleanupStack::PopAndDestroy(6); + } + +LOCAL_C void testSingleLevelCellsCleanup() +// +// Test single level cells cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("PopAll when empty")); + pC->NextLevel(); + pC->PopAll(); + pC->NextLevel(); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop")); + TAny* p=User::Alloc(0x10); + test(p!=NULL); + __UHEAP_CHECK(1); + pC->NextLevel(); + pC->PushL(p); + pC->Pop(); + __UHEAP_CHECK(1); + User::Free(p); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop N")); + TAny* p1=User::Alloc(0x10); + test(p1!=NULL); + __UHEAP_CHECK(1); + TAny* p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->Pop(2); + __UHEAP_CHECK(2); + User::Free(p1); + User::Free(p2); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop all")); + p1=User::Alloc(0x10); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + TAny* p3=User::Alloc(0x10); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PushL(p3); + pC->PopAll(); + __UHEAP_CHECK(3); + User::Free(p1); + User::Free(p2); + User::Free(p3); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop and destroy")); + p=User::Alloc(0x10); + test(p!=NULL); + __UHEAP_CHECK(1); + pC->NextLevel(); + pC->PushL(p); + pC->PopAndDestroy(); + __UHEAP_CHECK(0); + pC->PopAll(); +// + test.Next(_L("Push and pop and destroy N")); + p1=User::Alloc(0x10); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PopAndDestroy(2); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop and destroy all")); + p1=User::Alloc(0x10); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + p3=User::Alloc(0x10); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PushL(p3); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(0); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testSingleLevelObjCleanup() +// +// Test single level object cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("Push and pop")); + CBufFlat* p=CBufFlat::NewL(8); + test(p!=NULL); + __UHEAP_CHECK(1); + pC->NextLevel(); + pC->PushL(p); + pC->Pop(); + __UHEAP_CHECK(1); + User::Free(p); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop N")); + CBufFlat* p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + CBufFlat* p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(2); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->Pop(2); + __UHEAP_CHECK(2); + User::Free(p1); + User::Free(p2); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop all")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(2); + CBufFlat* p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PushL(p3); + pC->PopAll(); + __UHEAP_CHECK(3); + User::Free(p1); + User::Free(p2); + User::Free(p3); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop and destroy")); + p=CBufFlat::NewL(8); + test(p!=NULL); + __UHEAP_CHECK(1); + pC->NextLevel(); + pC->PushL(p); + pC->PopAndDestroy(); + __UHEAP_CHECK(0); + pC->PopAll(); +// + test.Next(_L("Push and pop and destroy N")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(2); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PopAndDestroy(2); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("Push and pop and destroy all")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(2); + p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PushL(p3); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(0); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testSingleLevelItemCleanup() +// +// Test single level object cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("Push and pop")); + RItem r; + r.Open(); + test(r.IsOpen()); + pC->NextLevel(); + pC->PushL(r); + pC->Pop(); + test(r.IsOpen()); + r.Close(); + test(!r.IsOpen()); + pC->PopAll(); +// + test.Next(_L("Push and pop N")); + RItem r1; + r1.Open(); + RItem r2; + r2.Open(); + pC->NextLevel(); + pC->PushL(r1); + pC->PushL(r2); + pC->Pop(2); + test(r1.IsOpen()); + test(r2.IsOpen()); + r1.Close(); + r2.Close(); + pC->PopAll(); +// + test.Next(_L("Push and pop all")); + r1.Open(); + r2.Open(); + RItem r3; + r3.Open(); + pC->NextLevel(); + pC->PushL(r1); + pC->PushL(r2); + pC->PushL(r3); + pC->PopAll(); + test(r1.IsOpen()); + test(r2.IsOpen()); + test(r3.IsOpen()); + r1.Close(); + r2.Close(); + r3.Close(); +// + test.Next(_L("Push and pop and destroy")); + r.Open(); + pC->NextLevel(); + pC->PushL(r); + pC->PopAndDestroy(); + test(!r.IsOpen()); + pC->PopAll(); +// + test.Next(_L("Push and pop and destroy N")); + r1.Open(); + r2.Open(); + pC->NextLevel(); + pC->PushL(r1); + pC->PushL(r2); + pC->PopAndDestroy(2); + test(!r1.IsOpen()); + test(!r2.IsOpen()); + pC->PopAll(); +// + test.Next(_L("Push and pop and destroy all")); + r1.Open(); + r2.Open(); + r3.Open(); + pC->NextLevel(); + pC->PushL(r1); + pC->PushL(r2); + pC->PushL(r3); + pC->PopAndDestroyAll(); + test(!r1.IsOpen()); + test(!r2.IsOpen()); + test(!r3.IsOpen()); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testSingleLevelMixCleanup() +// +// Test single level mixed cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("PushO PushC PushI and pop N")); + CBufFlat* p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + TAny* p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + RItem r; + r.Open(); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PushL(r); + pC->Pop(3); + __UHEAP_CHECK(2); + test(r.IsOpen()); + User::Free(p1); + User::Free(p2); + r.Close(); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("PushO PushI PushC PushO and pop all")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + r.Open(); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + CBufFlat* p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(r); + pC->PushL(p2); + pC->PushL(p3); + pC->PopAll(); + __UHEAP_CHECK(3); + test(r.IsOpen()); + User::Free(p1); + User::Free(p2); + User::Free(p3); + r.Close(); + __UHEAP_CHECK(0); +// + test.Next(_L("PushO PushC PushI and pop and destroy N")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + r.Open(); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PushL(r); + pC->PopAndDestroy(3); + test(!r.IsOpen()); + __UHEAP_CHECK(0); + pC->PopAll(); + __UHEAP_CHECK(0); +// + test.Next(_L("PushO PushI PushC PushO and pop and destroy all")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + r.Open(); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(r); + pC->PushL(p2); + pC->PushL(p3); + pC->PopAndDestroyAll(); + test(!r.IsOpen()); + __UHEAP_CHECK(0); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testMultiLevelCellsCleanup() +// +// Test multi level cells cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("Nest push push nest push popall popall")); + TAny* p1=User::Alloc(0x10); + test(p1!=NULL); + __UHEAP_CHECK(1); + TAny* p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + TAny* p3=User::Alloc(0x10); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->NextLevel(); + pC->PushL(p3); + pC->PopAll(); + __UHEAP_CHECK(3); + pC->PopAll(); + __UHEAP_CHECK(3); + User::Free(p1); + User::Free(p2); + User::Free(p3); + __UHEAP_CHECK(0); +// + test.Next(_L("Nest push push nest push popallD popallD")); + p1=User::Alloc(0x10); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + p3=User::Alloc(0x10); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->NextLevel(); + pC->PushL(p3); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(2); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(0); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testMultiLevelObjCleanup() +// +// Test multi level object cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("Nest push push nest push popall popall")); + CBufFlat* p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + CBufFlat* p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(2); + CBufFlat* p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->NextLevel(); + pC->PushL(p3); + pC->PopAll(); + __UHEAP_CHECK(3); + pC->PopAll(); + __UHEAP_CHECK(3); + User::Free(p1); + User::Free(p2); + User::Free(p3); + __UHEAP_CHECK(0); +// + test.Next(_L("Nest push push nest push popallD popallD")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(2); + p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(3); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->NextLevel(); + pC->PushL(p3); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(2); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(0); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testMultiLevelItemCleanup() +// +// Test multi level item cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("Nest push push nest push popall popall")); + RItem r1; + r1.Open(); + RItem r2; + r2.Open(); + RItem r3; + r3.Open(); + pC->NextLevel(); + pC->PushL(r1); + pC->PushL(r2); + pC->NextLevel(); + pC->PushL(r3); + pC->PopAll(); + test(r1.IsOpen()); + test(r2.IsOpen()); + test(r3.IsOpen()); + pC->PopAll(); + test(r1.IsOpen()); + test(r2.IsOpen()); + test(r3.IsOpen()); + r1.Close(); + r2.Close(); + r3.Close(); +// + test.Next(_L("Nest push push nest push popallD popallD")); + r1.Open(); + r2.Open(); + r3.Open(); + pC->NextLevel(); + pC->PushL(r1); + pC->PushL(r2); + pC->NextLevel(); + pC->PushL(r3); + pC->PopAndDestroyAll(); + test(r1.IsOpen()); + test(r2.IsOpen()); + test(!r3.IsOpen()); + pC->PopAndDestroyAll(); + test(!r1.IsOpen()); + test(!r2.IsOpen()); + test(!r3.IsOpen()); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testMultiLevelMixCleanup() +// +// Test multi level mixed cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("Nest pushO pushC nest pushI popall popall")); + CBufFlat* p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + TAny* p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + RItem r3; + r3.Open(); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->NextLevel(); + pC->PushL(r3); + pC->PopAll(); + __UHEAP_CHECK(2); + test(r3.IsOpen()); + pC->PopAll(); + __UHEAP_CHECK(2); + test(r3.IsOpen()); + User::Free(p1); + User::Free(p2); + r3.Close(); + __UHEAP_CHECK(0); +// + test.Next(_L("Nest pushO pushC nest pushI popallD popallD")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(1); + p2=User::Alloc(0x10); + test(p2!=NULL); + __UHEAP_CHECK(2); + r3.Open(); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->NextLevel(); + pC->PushL(r3); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(2); + test(!r3.IsOpen()); + pC->PopAndDestroyAll(); + test(!r3.IsOpen()); + __UHEAP_CHECK(0); +// + __UHEAP_MARKEND; +// + delete pC; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testSpecialCaseCleanup() +// +// Test special case cleanup +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); + __UHEAP_CHECK(KInitialCount); +// + test.Next(_L("Nest push push push fail")); + CBufFlat* p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(KInitialCount+1); + CBufFlat* p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(KInitialCount+2); + CBufFlat* p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(KInitialCount+3); + CBufFlat* p4=CBufFlat::NewL(8); + test(p4!=NULL); + __UHEAP_CHECK(KInitialCount+4); + CBufFlat* p5=CBufFlat::NewL(8); + test(p5!=NULL); + __UHEAP_CHECK(KInitialCount+5); + CBufFlat* p6=CBufFlat::NewL(8); + test(p6!=NULL); + __UHEAP_CHECK(KInitialCount+6); + pC->NextLevel(); + pC->PushL(p1); + pC->PushL(p2); + pC->PushL(p3); + pC->PushL(p4); + pC->PushL(p5); +// +// The granularity is 4 so this should try and grow the array +// since room is always made for a free slot. We set the allocator +// to fail so that we can test that the free slot is re-established +// when we do the cleanup. This test only works in debug mode. +// + __UHEAP_FAILNEXT(1); + TRAPD(r,pC->PushL(p6)); +#if defined(_DEBUG) + test(r==KErrNoMemory); +#endif + __UHEAP_CHECK(KInitialCount+6); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(KInitialCount); +// + test.Next(_L("Nest push push push push popallD")); + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(KInitialCount+1); + p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(KInitialCount+2); + p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(KInitialCount+3); + p4=CBufFlat::NewL(8); + test(p4!=NULL); + __UHEAP_CHECK(KInitialCount+4); + pC->NextLevel(); + pC->PushL(p1); + pC->NextLevel(); + pC->PushL(p2); + pC->PushL(p3); + pC->PushL(p4); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(KInitialCount+1); + pC->PopAndDestroyAll(); + __UHEAP_CHECK(KInitialCount); +// + test.Next(_L("Destroy cleanup object")); +// + p1=CBufFlat::NewL(8); + test(p1!=NULL); + __UHEAP_CHECK(KInitialCount+1); + p2=CBufFlat::NewL(8); + test(p2!=NULL); + __UHEAP_CHECK(KInitialCount+2); + p3=CBufFlat::NewL(8); + test(p3!=NULL); + __UHEAP_CHECK(KInitialCount+3); + p4=CBufFlat::NewL(8); + test(p4!=NULL); + __UHEAP_CHECK(KInitialCount+4); + pC->NextLevel(); + pC->PushL(p1); + pC->NextLevel(); + pC->PushL(p2); + pC->PushL(p3); + pC->PushL(p4); + delete pC; + __UHEAP_CHECK(0); +// + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testUnTrap() +// +// Test cleanup with normal exits +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CTrapCleanup* pT=CTrapCleanup::New(); + test(pT!=NULL); + __UHEAP_CHECK(KInitialCountAll); +// + __UHEAP_MARK; +// + test.Next(_L("PushC PushO EPop cleanup empty")); + TRAPD(r,createL(EPop,EFalse)) + test.Next(_L("PushC PushO EPop cleanup empty 1")); + test(r==KErrNone); + test.Next(_L("PushC PushO EPop cleanup empty 2")); + __UHEAP_CHECK(2); + test.Next(_L("PushC PushO EPop cleanup empty 3")); + User::Free(gP1); + test.Next(_L("PushC PushO EPop cleanup empty 4")); + delete gP2; + test.Next(_L("PushC PushO EPop cleanup empty 5")); + __UHEAP_CHECK(0); +// + test.Next(_L("PushC PushO EPopAndDestroy cleanup empty")); + TRAP(r,createL(EPopAndDestroy,EFalse)) + test(r==KErrNone); + __UHEAP_CHECK(0); +// +/* +// Change of behavior for TCleanupTrapHandler means that the current +// cleanup stack must be empty when UnTrap is called. IE. calls to +// Push should be balanced with a Pop within the same function. + test.Next(_L("PushC PushO ENull cleanup 2 objects")); + TRAP(r,createL(ENull,EFalse)) + test(r==KErrNone); + __UHEAP_CHECK(0); +*/ + __UHEAP_MARKEND; +// + test.Next(_L("Test all LC functions")); + TRAP(r,createAllL(EFalse)) + test(r==KErrNone); + __UHEAP_CHECK(KInitialCountAll); +// + delete pT; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testLeave() +// +// Test cleanup with leave exits +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CTrapCleanup* pT=CTrapCleanup::New(); + test(pT!=NULL); + __UHEAP_CHECK(KInitialCountAll); +// + __UHEAP_MARK; +// + test.Next(_L("PushC PushO EPop cleanup empty and leave")); + TRAPD(r,createL(EPop,ETrue)) + test(r==KLeaveValue); + __UHEAP_CHECK(2); + User::Free(gP1); + delete gP2; + __UHEAP_CHECK(0); +// + test.Next(_L("PushC PushO EPopAndDestroy cleanup empty and leave")); + TRAP(r,createL(EPopAndDestroy,ETrue)) + test(r==KLeaveValue); + __UHEAP_CHECK(0); +// + test.Next(_L("PushC PushO ENull cleanup 2 objects and leave")); + TRAP(r,createL(ENull,ETrue)) + test(r==KLeaveValue); + __UHEAP_CHECK(0); + __UHEAP_MARKEND; +// + test.Next(_L("Test all LC functions and leave")); + TRAP(r,createAllL(ETrue)) + test(r==KLeaveValue); + __UHEAP_CHECK(KInitialCountAll); +// + delete pT; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void testMultiLeave() +// +// Test cleanup with multiple leave exits +// + { + + test.Start(_L("Creating")); +// + __UHEAP_MARK; + CTrapCleanup* pT=CTrapCleanup::New(); + test(pT!=NULL); +// + __UHEAP_MARK; +// + test.Next(_L("PushC PushO nest PushO cleanup leave leave")); + TRAPD(r,createL(EMulti,ETrue)) + test(r==KLeaveValue); + __UHEAP_CHECK(0); + __UHEAP_MARKEND; +// + delete pT; + __UHEAP_MARKEND; +// + test.End(); + } + +LOCAL_C void addNullItemL() + { + CleanupStack::PushL((TAny*)0); + } + +LOCAL_C void addCellL() + { + User::AllocLC(4); + } + +LOCAL_C void useCleanupStackL() + { + addNullItemL(); + addCellL(); + CleanupStack::PopAndDestroy(); + CleanupStack::Pop(); + } + +LOCAL_C void reentrantCleanup(TAny*) +// +// A cleanup operation which uses a trap harness and the cleanup stack +// + { + TRAPD(ignore,useCleanupStackL()) + } + +LOCAL_C void addReentrantItemL() + { + CleanupStack::PushL(TCleanupItem(reentrantCleanup)); + } + +LOCAL_C void addItemsL(TInt aCount) +// +// add number of reentrant items to make stack fail +// + { + while (--aCount>=0) + addReentrantItemL(); +#if !defined(_DEBUG) + User::Leave(KErrNoMemory); // heap failure not available +#endif + } + +const TInt KInitialStackSize=8; // from UC_CLN.CPP +const TInt KGrowItems=KInitialStackSize-3; + +LOCAL_C void testReentrancyL() +// +// Test the Cleanup stack can go re-entrant +// + { + + test.Next(_L("PopAndDestroy()")); + __UHEAP_MARK; + addNullItemL(); + addCellL(); + addReentrantItemL(); + CleanupStack::PopAndDestroy(2); + CleanupStack::Pop(); + __UHEAP_MARKEND; +// + test.Next(_L("cleanup after a leave")); + addNullItemL(); + TRAPD(r,addReentrantItemL();User::Leave(KLeaveValue);) + test(r==KLeaveValue); + CleanupStack::Pop(); +// + test.Next(_L("cleanup after stack failure")); + // Ensuring stack reallocate fails by placing following cell + TInt* forceAlloc=(TInt*)User::AllocL(4); + for (TInt i=0;i tim; + tim.iObj.CreateLocal(); + test.Next(_L("Push it on the cleanup stack")); + tim.PushL(); + test.Next(_L("Leave before object goes out of scope")); + User::Leave(KErrGeneral); + tim.Pop(); + } + +LOCAL_C void testAutoClose() +// +// Test the TAutoClose class +// + { + + // Kill the granules + RTimer s[20]; + TInt i; + for (i=0; i<20; i++) + s[i].CreateLocal(); + for (i=0; i<20; i++) + s[i].Close(); + + __KHEAP_MARK; + test.Start(_L("Make a TAutoClose object")); + { + TAutoClose tim; + tim.iObj.CreateLocal(); + + test.Next(_L("Let it fall out of scope")); + } + test.Next(_L("Check the object has closed")); + __KHEAP_CHECK(0); + + TRAPD(r, testAutoCloseL()); + test.Next(_L("Check object has been closed and cleaned up after leave")); + __KHEAP_MARKEND; + test.End(); + } +#endif // __TOOLS2__ + +void CTest::ConstructL() +// +// Allocate a cell with CBase::new +// + { + + TLex* pL=new(ELeave) TLex; + CleanupStack::PushL(pL); + } + +void RItem::Cleanup(TAny* aPtr) +// +// Invoke the Close member on the RItem at aPtr +// + { + + ((RItem*)aPtr)->Close(); + } + +LOCAL_C TInt getStackPointer() + { + static TUint8 there; + TUint8 here; + return &here-&there; + } +LOCAL_C void sheLeavesMe(TBool sheLeavesMeNot) + { + if (!sheLeavesMeNot) + User::Leave(KErrBadName); // Montague + } + +LOCAL_C void testStackBalance() +// +// Ensure that we get the stack properly balanced +// + { + + TInt i; + TInt r=KErrNone; + test.Start(_L("Stack balance without leaving")); + TInt before=getStackPointer(); + for (i=0; i<20;i++) + TRAP(r,sheLeavesMe(ETrue)); + TInt after=getStackPointer(); + test(r==KErrNone); + test(before==after); + +// + test.Next(_L("Stack balance after Leave")); + before=getStackPointer(); + for (i=0; i<20;i++) + TRAP(r,sheLeavesMe(EFalse)); + after=getStackPointer(); + test(r==KErrBadName); + test(before==after); +// + test.End(); + } + +void Inc(TAny* aPtr) + { + ++(*(TInt*)aPtr); + } + +void testTrapIgnore() + { + test.Start(_L("Create cleanup")); + CCleanup* pC=CCleanup::New(); + test(pC!=NULL); + TInt count = 0; + + test.Next(_L("TRAP_IGNORE with no leave")); + TRAP_IGNORE( + CleanupStack::PushL(TCleanupItem(Inc,&count)); + CleanupStack::Pop(); + ); + test(count==0); + + test.Next(_L("TRAP_IGNORE with leave")); + TRAP_IGNORE( + CleanupStack::PushL(TCleanupItem(Inc,&count)); + User::Leave(KErrGeneral); + ); + test(count==1); + + delete pC; + test.End(); + } + +GLDEF_C TInt E32Main() + { + test.Title(); + + test.Start(_L("Test destructor causing stack reallocation")); +#ifndef __TOOLS2__ + testDestructorStackReallocation(); +#endif // __TOOLS2__ + + test.Next(_L("CCleanup single level tests just alloc cells")); + testSingleLevelCellsCleanup(); + + test.Next(_L("CCleanup single level tests just objects")); + testSingleLevelObjCleanup(); + + test.Next(_L("CCleanup single level tests just items")); + testSingleLevelItemCleanup(); + + test.Next(_L("CCleanup single level tests mixed")); + testSingleLevelMixCleanup(); + + test.Next(_L("CCleanup multi level tests just alloc cells")); + testMultiLevelCellsCleanup(); + + test.Next(_L("CCleanup multi level tests just objects")); + testMultiLevelObjCleanup(); + + test.Next(_L("CCleanup multi level tests just items")); + testMultiLevelItemCleanup(); + + test.Next(_L("CCleanup multi level tests mixed")); + testMultiLevelMixCleanup(); + + test.Next(_L("CCleanup special case test")); + testSpecialCaseCleanup(); + + test.Next(_L("Install trap handler")); + CTrapCleanup* pT=CTrapCleanup::New(); + test(pT!=NULL); + + test.Next(_L("Untrap handling tests")); + testUnTrap(); + + test.Next(_L("Leave handling tests")); + testLeave(); + + test.Next(_L("Multi level leave handling tests")); + testMultiLeave(); + +#ifndef __TOOLS2__ + test.Next(_L("Test TAutoClose")); + testAutoClose(); +#endif // __TOOLS2__ + + test.Next(_L("Test Re-entrancy of cleanup stack")); + testReentrancy(); + + test.Next(_L("Test stack safety of TRAP and Leave")); +#ifdef _DEBUG + testStackBalance(); +#endif + + test.Next(_L("Test TRAP_IGNORE")); + testTrapIgnore(); + + test.End(); + return(0); + } + diff -r c55016431358 -r 0a7b44b10206 symport/e32test/system/t_trap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/system/t_trap.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,726 @@ +// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\system\t_trap.cpp +// Overview: +// Test TRAP, Leave and Assert +// API Information: +// TRAP, User::Leave, __ASSERT_DEBUG_NO_LEAVE, __ASSERT_ALWAYS_NO_LEAVE +// Details: +// - Test TRAP macro works as expected. +// - Test User::Leave works as expected including leave from +// within nested calls. +// - Verify that a leave without a TRAP causes the thread to panic. +// - Create a thread that asserts and verify the exit type and other +// results are as expected. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#include +#include + +const TInt KLeaveVal=1111; +const TInt KUnLeaveVal=2222; +const TInt KRecursiveUnLeaveVal=3333; +const TInt KRecursiveSingleLeaveVal=4444; +const TInt KMaxDepth=20; + +//#define __TEST_BREAKPOINT_IN_TRAP__ + +LOCAL_D RTest test(_L("T_TRAP")); + + +LOCAL_C TInt UnLeaveFunction(void) + { + + return(KUnLeaveVal); + } + +LOCAL_C TInt LeaveFunction(void) + { + + User::Leave(KLeaveVal); + return(0); + } + +LOCAL_C TInt RecursiveUnLeave(TInt level) + { + + if (level==0) + return(KRecursiveUnLeaveVal); + else + return(RecursiveUnLeave(--level)); + } + +LOCAL_C TInt RecursiveSingleLeave(TInt level) + { + + if (level==0) + User::Leave(KRecursiveSingleLeaveVal); + else + RecursiveSingleLeave(--level); + return(0); + } + +LOCAL_C TInt RecursiveMultiLeave1(TInt level) + { + + TInt ret=0; + TRAP(ret,{if (level==0) User::Leave(level); else ret=RecursiveMultiLeave1(level-1); test(EFalse);}) + test(ret==level); + User::Leave(level+1); + return(0); + } + +LOCAL_C TInt RecursiveMultiLeave2(TInt level) + { + + if (level==0) + return(1); + TInt ret=0; + TRAP(ret,ret=RecursiveMultiLeave2(level-1)) + test(ret==level); + User::Leave(level+1); + return(0); + } + +LOCAL_C TInt doTrap(TInt aVal) +// +// Nest trap function. +// + { + + if (aVal) + { + TInt j=(-1); + TRAP(j,j=doTrap(aVal-1)) + test(j==aVal); + } + return(aVal+1); + } + +#ifdef __TEST_BREAKPOINT_IN_TRAP__ +void bkpt() + { + __BREAKPOINT(); + } +#endif + +LOCAL_C void doLeave(TInt aLevel,TInt aVal) +// +// Nest trap with leave function. +// + { + + if (aLevel) + doLeave(aLevel-1,aVal); + else + User::Leave(aVal); + } + +LOCAL_C void testTrap() +// +// Test trap functions O.K. +// + { + + test.Start(_L("Trap level 1")); +// + TInt i=2; + TRAP(i,i=1); + test(i==1); +#ifdef __TEST_BREAKPOINT_IN_TRAP__ + TRAP(i,bkpt()); + TRAP(i,TRAP(i,bkpt())); +#endif +// + test.Next(_L("Trap level n")); + for (i=1;i + +#include "../mmu/mmudetect.h" + +const TInt KHeapSize=0x2000; + +_LIT(KServerName,"Display"); + +class CMySession : public CSession2 + { +public: + CMySession(); + virtual void ServiceL(const RMessage2& aMessage); + }; + +class CMyServer : public CServer2 + { +public: + enum {ERead,EStop}; +public: + CMyServer(TInt aPriority); + static CMyServer* New(TInt aPriority); + virtual CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;//Overloading + }; + +class RDisplay : public RSessionBase + { +public: + TInt Open(); + void Read(TRequestStatus& aStatus); + TInt Stop(); + }; + +LOCAL_D RTest testSvr(_L("T_TRAP Server")); +LOCAL_D RSemaphore client; +LOCAL_D RSemaphore server; +LOCAL_D RDisplay display; +LOCAL_D const RMessage2* message; + +// Constructor +// +// +CMySession::CMySession() + {} + +CMyServer* CMyServer::New(TInt aPriority) +// +// Create a new CMyServer. +// + { + return new CMyServer(aPriority); + } + +CMyServer::CMyServer(TInt aPriority) +// +// Constructor. +// + : CServer2(aPriority) + {} + +CSession2* CMyServer::NewSessionL(const TVersion& /*aVersion*/, const RMessage2&) const +// +// Create a new client for this server. +// + { + return(new(ELeave) CMySession()); + } + +void CMySession::ServiceL(const RMessage2& aMessage) +// +// Handle messages for this server. +// + { + TInt r=KErrNone; + switch (aMessage.Function()) + { + case CMyServer::ERead: + testSvr.Printf(_L("read message received\n")); + if (HaveVirtMem()) + { + message = &aMessage; + } + client.Signal(); + server.Wait(); + break; + case CMyServer::EStop: + testSvr.Printf(_L("stop message received\n")); + CActiveScheduler::Stop(); + break; + default: + r=KErrNotSupported; + } + aMessage.Complete(r); + } + +TInt RDisplay::Open() +// +// Open the server. +// + { + return(CreateSession(KServerName,TVersion(),1)); + } + +void RDisplay::Read(TRequestStatus& aStatus) +// +// Get session to test CSession2::ReadL. +// + { + TBuf<0x10>* bad = (TBuf<0x10> *)(0x30000000); + SendReceive(CMyServer::ERead, TIpcArgs(bad), aStatus); + } + +TInt RDisplay::Stop() +// +// Stop the server. +// + { + return SendReceive(CMyServer::EStop, TIpcArgs()); + } + +LOCAL_C TInt serverThreadEntryPoint(TAny*) +// +// The entry point for the server thread. +// + { + testSvr.Title(); + testSvr.Start(_L("Create CActiveScheduler")); + CActiveScheduler* pR=new CActiveScheduler; + testSvr(pR!=NULL); + CActiveScheduler::Install(pR); +// + testSvr.Next(_L("Create CMyServer")); + CMyServer* pS=CMyServer::New(0); + testSvr(pS!=NULL); +// + testSvr.Next(_L("Start CMyServer")); + TInt r=pS->Start(KServerName); + testSvr(r==KErrNone); +// + testSvr.Next(_L("Signal to client that we have started")); + client.Signal(); +// + testSvr.Next(_L("Start CActiveScheduler")); + CActiveScheduler::Start(); +// + testSvr.Next(_L("Exit server")); + delete pS; + testSvr.Close(); + return(KErrNone); + } + +void CreateServer() + { + test.Next(_L("Creating client semaphore")); + TInt r=client.CreateLocal(0); + test(r==KErrNone); +// + test.Next(_L("Creating server semaphore")); + r=server.CreateLocal(0); + test(r==KErrNone); +// + test.Next(_L("Creating server thread")); + RThread server; + r=server.Create(_L("Server"),serverThreadEntryPoint,KDefaultStackSize,KHeapSize,KHeapSize,NULL); + test(r==KErrNone); + server.SetPriority(EPriorityMore); +// + test.Next(_L("Resume server thread")); + server.Resume(); + test(ETrue); +// + test.Next(_L("Wait for server to start")); + client.Wait(); +// + test.Next(_L("Connect to server")); + r=display.Open(); + test(r==KErrNone); + } + +void StopServer() + { + test.Next(_L("Stop server")); + TInt r=display.Stop(); + test(r==KErrNone); +// + test.Next(_L("Close connection")); + display.Close(); +// + test.Next(_L("Close all")); + server.Close(); + client.Close(); + } + +/*============== end of server for testing exceptions in TRAP implementation ====================*/ + +#undef TRAP_INSTRUMENTATION_START +#undef TRAP_INSTRUMENTATION_NOLEAVE +#undef TRAP_INSTRUMENTATION_LEAVE +#define TRAP_INSTRUMENTATION_START ++TrapStart; +#define TRAP_INSTRUMENTATION_NOLEAVE ++TrapNoLeave; TestExcInInstrumentation(); +#define TRAP_INSTRUMENTATION_LEAVE(aReason) TrapLeave=aReason; + +TInt TrapStart = 0; +TInt TrapNoLeave = 0; +TInt TrapLeave = 123; + +// +// This is mostly for the benefit of WINS, where Win32 exceptions +// have a nasty habit of interacting badly with C++ exceptions +// + +void TestExcInInstrumentation() + { + TRequestStatus status; + display.Read(status); + test(status.Int() == KRequestPending); + + client.Wait(); + + TBuf<0x100> buf; + if (message) + test(message->Read(0,buf) == KErrBadDescriptor); + + server.Signal(); + + User::WaitForRequest(status); + test(status.Int() == KErrNone); + } + +void TestTrapInstrumentation() + { + CreateServer(); + + test.Start(_L("TRAPD No Leave")); + TRAPD(r,User::LeaveIfError(0)); + test(TrapStart==1); + test(TrapLeave==123); + test(r==0); + test(TrapNoLeave==1); + + test.Next(_L("TRAP No Leave")); + TRAP(r,User::LeaveIfError(0)); + test(TrapStart==2); + test(TrapLeave==123); + test(r==0); + test(TrapNoLeave==2); + + test.Next(_L("TRAP_IGNORE No Leave")); + TRAP_IGNORE(User::LeaveIfError(0)); + test(TrapStart==3); + test(TrapLeave==123); + test(TrapNoLeave==3); + + test.Next(_L("TRAPD Leave")); + TRAPD(r2,User::LeaveIfError(-999)); + test(TrapStart==4); + test(TrapLeave==-999); + test(r2==TrapLeave); + test(TrapNoLeave==3); + + test.Next(_L("TRAP Leave")); + TRAP(r2,User::LeaveIfError(-666)); + test(TrapStart==5); + test(TrapLeave==-666); + test(r2==TrapLeave); + test(TrapNoLeave==3); + + test.Next(_L("TRAP_IGNORE Leave")); + TRAP_IGNORE(User::LeaveIfError(-333)); + test(TrapStart==6); + test(TrapLeave==-333); + test(TrapNoLeave==3); + + test.Next(_L("Leave")); + test.End(); + + StopServer(); + } +#endif // __TOOLS2__ + +#undef TRAP_INSTRUMENTATION_START +#undef TRAP_INSTRUMENTATION_NOLEAVE +#undef TRAP_INSTRUMENTATION_LEAVE +#define TRAP_INSTRUMENTATION_START +#define TRAP_INSTRUMENTATION_NOLEAVE +#define TRAP_INSTRUMENTATION_LEAVE(aReason) + +#ifdef __WINS__ +TUint32* Stack; +volatile TInt* volatile Q; +const TInt A[] = {17,19,23,29,31,37,41,43,47,53}; + +void ExceptionHandler(TExcType) + { + TUint32* sp = Stack; + for (; *sp!=0xfacefeed; --sp) {} + *sp = (TUint32)(Q++); + } + +__NAKED__ TInt GetNext() + { + _asm mov Stack, esp + _asm mov eax, 0facefeedh + _asm mov eax, [eax] + _asm ret + } + +void testExceptionsInTrap() + { + TInt ix = 0; + TInt r; + User::SetExceptionHandler(&ExceptionHandler, 0xffffffff); + Q = (volatile TInt* volatile)A; + r = GetNext(); + test(r==A[ix++]); + TInt i; + TRAP(i,r=GetNext()); + test(i==0); + test(r==A[ix++]); + TRAP(i,TRAP(i,r=GetNext())); + test(i==0); + test(r==A[ix++]); + TRAP(i, TRAP(i,User::Leave(271));r=GetNext(); ); + test(i==271); + test(r==A[ix++]); + TRAP(i, TRAP(i, TRAP(i,User::Leave(487));r=GetNext(); ); ); + test(i==487); + test(r==A[ix++]); + TInt s=-1; + TRAP(i, TRAP(i, TRAP(i, TRAP(i,User::Leave(999));r=GetNext(); ); s=GetNext(); ); ); + test(i==999); + test(r==A[ix++]); + test(s==A[ix++]); + TInt j=-1, k=-1, l=-1; + TRAP(l, \ + TRAP(k, \ + TRAP(j, \ + TRAP(i,User::Leave(9991)); \ + r=GetNext(); \ + ); \ + User::Leave(9992); \ + ); \ + s=GetNext(); \ + ); + test(i==9991); + test(j==0); + test(k==9992); + test(l==0); + test(r==A[ix++]); + test(s==A[ix++]); + } +#endif + +GLDEF_C TInt E32Main() + { + test.Title(); +// + test.Start(_L("Trap")); + testTrap(); +// + test.Next(_L("Leave")); + testLeave(); +// + test.Next(_L("Assorted")); + testMH(); +// +#ifndef __TOOLS2__ + test.Next(_L("Leave without Trap")); + TestLeaveNoTrap(); +// + test.Next(_L("Assertions")); + TestAssert(0); + TestAssert(EAssertTest_Debug); + TestAssert(EAssertTest_Leave); + TestAssert(EAssertTest_Leave | EAssertTest_Debug); + +#ifdef __LEAVE_EQUALS_THROW__ + test.Next(_L("Trap instrumentation")); + TestTrapInstrumentation(); +#endif +#endif // __TOOLS2__ + +#ifdef __WINS__ + testExceptionsInTrap(); +#endif + + test.End(); + return(0); + } diff -r c55016431358 -r 0a7b44b10206 symport/f32/inc/f32file.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/f32/inc/f32file.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,3096 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedAll + @released +*/ + +#if !defined(__F32FILE_H__) +#define __F32FILE_H__ + +#if !defined(__E32BASE_H__) +#include +#endif + +#if !defined(__E32SVR_H__) +#include +#endif + +#include + + +/** +@publishedAll +@released + +The session default drive. +*/ +const TInt KDefaultDrive=KMaxTInt; + + + + +/** +@publishedAll +@released + +Indicates a drive letter which is not in use. + +This is useful when scanning a drive list to find which drives are available. +*/ +const TInt KDriveAbsent=0x00; + + + + +/** +@publishedAll +@released + +The default value for the number of message slots passed to RFs::Connect(). + +@see RFs::Connect +*/ +const TInt KFileServerDefaultMessageSlots=-1; + + + + +/** +@publishedAll +@released + +The size of the array of TEntry items contained in a TEntryArray object. + +@see TEntryArray +@see TEntry +*/ +const TInt KEntryArraySize=(0x200*sizeof(TText)); + + + + +/** +@publishedAll +@released + +The character used to separate directories in the path name. +*/ +const TInt KPathDelimiter='\\'; + + + + +/** +@publishedAll +@released + +The character used to separate the drive letter from the path. +*/ +const TInt KDriveDelimiter=':'; + + + + +/** +@publishedAll +@released + +The character used to separate the filename from the extension. +*/ +const TInt KExtDelimiter='.'; + + + + +/** +@publishedAll +@released + +The maximum number of available drives. +*/ +const TInt KMaxDrives=26; + + +/** +@publishedAll +@released + +The maximum number of available proxy drives. +*/ +const TInt KMaxProxyDrives=KMaxDrives-KMaxLocalDrives; + + +/** +@publishedAll +@released + +Defines a modifiable buffer descriptor to contain a drive list. + +The descriptor has maximum length KMaxDrives, sufficient to contain +all possible drive letters. + +@see RFs::DriveList +@see KMaxDrives +*/ +typedef TBuf8 TDriveList; + + + +/** +@publishedAll +@released + +The maximum length of a drivename. + +Sufficient for a drive letter and colon. +*/ +const TInt KMaxDriveName=0x02; + + + + +/** +@publishedAll +@released + +Defines a modifiable buffer descriptor to contain a drive name. + +A drive name comprises a drive letter (A through Z) and a colon. +KMaxDriveName (2 bytes) is sufficient for a drive letter and colon. + +@see TDriveUnit::Name +@see KMaxDriveName +*/ +typedef TBuf TDriveName; + + + + +/** +@publishedAll +@released + +The maximum length of a file system name or file system sub type name. +32 characters is sufficient for a file system or sub type name. +*/ +const TInt KMaxFSNameLength=0x0020; + + + + +/** +@publishedAll +@released + +Defines a modifiable buffer descriptor to contain a file system or file system sub type name. + +@see KMaxFSNameLength +*/ +typedef TBuf TFSName; + + + + +/** +@publishedAll +@released + +File/directory attribute: any file without the hidden or system attribute. +*/ +const TUint KEntryAttNormal=0x0000; + + + + +/** +@publishedAll +@released + +File/directory attribute: read-only file or directory. +*/ +const TUint KEntryAttReadOnly=0x0001; + + + + +/** +@publishedAll +@released + +File/directory attribute: hidden file or directory. +*/ +const TUint KEntryAttHidden=0x0002; + + + + +/** +@publishedAll +@released + +File/directory attribute: system file. +*/ +const TUint KEntryAttSystem=0x0004; + + + + +/** +@publishedAll +@released + +File/directory attribute: volume name directory. +*/ +const TUint KEntryAttVolume=0x0008; + + + + +/** +@publishedAll +@released + +File/directory attribute: a directory without the hidden or system attribute. +*/ +const TUint KEntryAttDir=0x0010; + + + + +/** +@publishedAll +@released + +File/directory attribute: an archive file. +*/ +const TUint KEntryAttArchive=0x0020; + + + + +/** +@publishedAll +@released + +File/directory attribute: ROM eXecute In Place file +*/ +const TUint KEntryAttXIP=0x0080; + + + + +/** +@publishedAll +@released + +This file attribute bit is set if the file exists only on a remote file +system and is not locally cached. + +Due to the potential high-latency of remote file systems, applications +(or users of applications) may make use of this bit to modify their +behaviour when working with remote files. + +This is a read-only attribute, so any attempt to set this attribute will +will be ignored. +*/ +const TUint KEntryAttRemote=0x0100; + + + + +/** +@publishedAll +@released + +The range of entry attributes reserved for file-system specific meanings. +File systems may assign meaning to these bits, but their definition will +not be supported nor maintained by Symbian. + +All other file attribute bits are reserved for use by Symbian. + +The following table summarises the assignment of attribute bits: + + 0 - KEntryAttReadOnly + 1 - KEntryAttHidden + 2 - KEntryAttSystem + 3 - KEntryAttVolume + + 4 - KEntryAttDir + 6 - KEntryAttArchive + 7 - KEntryAttXIP + + 8 - KEntryAttRemote + 9 - Reserved + 10 - Reserved + 11 - Reserved + + 12 - Reserved + 13 - Reserved + 14 - Reserved + 15 - Reserved + + 16 - File System Specific + 17 - File System Specific + 18 - File System Specific + 19 - File System Specific + + 20 - File System Specific + 22 - File System Specific + 22 - File System Specific + 23 - File System Specific + + 24 - Reserved + 25 - Reserved + 26 - Reserved + 27 - KEntryAttMatchExclude + + 28 - KEntryAttAllowUid + 29 - Reserved + 30 - KEntryAttMatchExclusive + 31 - Reserved +*/ +const TUint KEntryAttMaskFileSystemSpecific=0x00FF0000; + + + + +/** +@publishedAll +@released + +Bit mask for matching file and directory entries. + +This mask ensures that directories and hidden and +system files are matched. + +(Note that KEntryAttNormal matches all entry types except directories, hidden +and system entries). + +@see RFs::GetDir +*/ +const TUint KEntryAttMatchMask=(KEntryAttHidden|KEntryAttSystem|KEntryAttDir); + + + + + +/** +@publishedAll +@released + +Bit mask for matching file and directory entries. + +This is used when all entry types, including hidden and system files, +but excluding the volume entry are to be matched. + +@see RFs::GetDir +*/ +const TUint KEntryAttMaskSupported=0x3f; + + + + +/** +@publishedAll +@released + +Bit mask for matching file and directory entries. + +This is used for exclusive matching. When OR'ed with one or more file attribute +constants, for example, KEntryAttNormal, it ensures that only the files with +those attributes are matched. +When OR’ed with KEntryAttDir, directories only (not hidden or system) are matched. + +@see KEntryAttDir +@see KEntryAttNormal +@see RFs::GetDir +*/ +const TUint KEntryAttMatchExclusive=0x40000000; + + + + +/** +@publishedAll +@released + +Bit mask for feature manager file entries. + +It is used in order to identify each ROM feature set data file +uniquely in the mount order of ROM sections. + +*/ +const TUint KEntryAttUnique=0x01000000; + + + + +/** +@publishedAll +@released + +Bit mask for matching file and directory entries. + +It is used to exclude files or directories with certain attributes from +directory listings. This bitmask has the opposite effect +to KEntryAttMatchExclusive. For example: + +@code +KEntryAttMatchExclude|KEntryAttReadOnly +@endcode + +excludes all read only entries from the directory listing. + +@code +KEntryAttMatchExclusive|KEntryAttReadOnly +@endcode +lists only read only entries. + +@see KEntryAttMatchExclusive +@see RFs::GetDir +*/ +const TUint KEntryAttMatchExclude=0x08000000; + + + + +/** +@publishedAll +@released + +Bit mask for matching file and directory entries. + +Bit mask flag used when UID information should be included in the directory +entry listing. + +@see RFs::GetDir +*/ +const TUint KEntryAttAllowUid=0x10000000; + + + + +/** +@publishedPartner +@released + +Bit mask used when evaluating whether or not a session gets notified of a +debug event. + +@see DebugNotifySessions +*/ +const TUint KDebugNotifyMask=0xFF000000; // Reserved for debug notification + +/** + +*/ +const TUint KMaxMapsPerCall = 0x8; + + + + +/** +@publishedPartner +@released + +The default blocksize value. + +This value is returned when you query the blocksize for a media type that does not +support the concept of 'block' (e.g. NOR flash media). + +@see TVolumeIOParamInfo +*/ +const TUint KDefaultVolumeBlockSize = 512; + + + + +enum TNotifyType +/** +@publishedAll +@released + +A set of change notification flags. + +These flags indicate the kind of change that should result in notification. + +This is useful for programs that maintain displays of file lists that +must be dynamically updated. + +@see RFs::NotifyChange +@see RFs +@see RFile +@see RRawDisk +*/ + { + /** + Any change, including mounting and unmounting drives. + */ + ENotifyAll=0x01, + + + /** + Addition or deletion of a directory entry, or changing or formatting a disk. + */ + ENotifyEntry=0x02, + + + /** + Change resulting from file requests: + RFile::Create(), RFile::Replace(), RFile::Rename(), RFs::Delete(), + RFs::Replace(), and RFs::Rename(). + */ + ENotifyFile=0x04, + + + /** + Change resulting from directory requests: + RFs::MkDir(), RFs::RmDir(), and RFs::Rename(). + */ + ENotifyDir=0x08, + + + /** + Change resulting from: RFs::SetEntry(), RFile::Set(), RFile::SetAtt(), + RFile::SetModified() and RFile::SetSize() requests. + */ + ENotifyAttributes=0x10, + + + /** + Change resulting from the RFile::Write() request. + */ + ENotifyWrite=0x20, + + + /** + Change resulting from the RRawDisk::Write() request. + */ + ENotifyDisk=0x40 + }; + +enum TNotifyDismountMode +/** +@publishedAll +@released + +Notification modes for safe media removal notification API + +@see RFs::NotifyDismount +*/ + { + /** + Used by a client to register for notification of pending dismount. + - This is the default behaviour for RFs::NotifyDismount + */ + EFsDismountRegisterClient=0x01, + + /** + Used to notify clients of a pending dismount. + */ + EFsDismountNotifyClients=0x02, + + /** + Used to forcibly dismount the file system without notifying clients. + */ + EFsDismountForceDismount=0x03, + }; + + +enum TFileCacheFlags +/** +@publishedPartner +@released + +Flags used to enable file server drive-specific caching +*/ + { + /** + Enable read caching - if file explicitly opened in EFileReadBuffered mode + */ + EFileCacheReadEnabled = 0x01, + + /** + Enable read caching for all files, regardless of file open mode + */ + EFileCacheReadOn = 0x02, + + /** + Enable read-ahead caching - if file explicitly opened in EFileReadAheadOn mode + */ + EFileCacheReadAheadEnabled = 0x04, + + /** + Enable read-ahead caching, regardless of file open mode + */ + EFileCacheReadAheadOn = 0x08, + + /** + Enable write caching, if file explicitly opened in EFileWriteBuffered mode + */ + EFileCacheWriteEnabled = 0x10, + + /** + Enable write caching for all files, regardless of file open mode + */ + EFileCacheWriteOn = 0x20, + }; + + +enum TStartupConfigurationCmd +/** +@publishedPartner +@released + +Command used to set file server configuration at startup. + +@see RFs::SetStartupConfiguration() +*/ + { + /** + Set loader thread priority + */ + ELoaderPriority, + + /** + Set TDrive flags. Value should be ETrue or EFalse + */ + ESetRugged, + /** + Command upper boundary + */ + EMaxStartupConfigurationCmd + }; + +/** +@publishedPartner +@released + +Commands to query specific volume information. + +@see TVolumeIOParamInfo +*/ +enum TQueryVolumeInfoExtCmd + { + /** + Queries the sub type of the file system mounted on a specified volume. + For example, FAT12, FAT16 or FAT32. + */ + EFileSystemSubType, + + /** + Queries the I/O parameters of a specificed volume. + This includes the block size, the cluster size and the recommended read and write sizes for the media. + */ + EIOParamInfo, + + /** + This command determines whether the volume is synchronous or asynchronous. + A boolean value is returned within the buffer defined as TPckgBuf. + ETrue for Synchronous and EFalse for Asynchronous. + */ + EIsDriveSync, + + /** + Query if the given drive is finalised. See RFs::FinaliseDrive() + Not all file systems may support this query. + A boolean value is returned within the buffer defined as TPckgBuf. + ETrue value means that the drive is finalised + */ + EIsDriveFinalised, + }; + +/** +@publishedAll +@released + +Volume IO parameter information. + +This class is used to return IO parameter information for a specified volume. + +The volume parameter information holds recommended buffer sizes for the creation of efficient buffers for +reading and writing. + +@see RFs::VolumeIOParam() +*/ +class TVolumeIOParamInfo + { +public: + /** + The size of a block in bytes. + + Reads and writes that are aligned on block boundaries are up to twice as fast as when + mis-aligned. + + Read and write operations on certain underlying media is done in blocks. + A write operation that modifies only part of a block is less efficient, in general, than + one that modifies an entire block. Data throughput degrades linearly for reads and writes in smaller + sized units. + */ + TInt iBlockSize; + /** + The size in bytes of a single disk cluster. + + Read and write operations that are aligned on cluster boundaries are more efficient. + + The file system organises and allocates the file data on the disk in clusters where each cluster is + one or more blocks. Files that are not zero length occupy at least one cluster of the disk, + so large numbers of very small files use up more disk space than expected. + */ + TInt iClusterSize; + /** + The recommended buffer size for optimised reading performance. + + The given buffer size is based on sensible benchmark testing results produced by the mobile device vendor. + The buffer size is then added to the estart.txt file + + The figure is included in the estart.txt file along with the drive number and the variable name. + The example below shows the required format: + + [DriveC] + RecReadBufSize 8192 + + When no value is provided, value KErrNotSupported is returned. + */ + TInt iRecReadBufSize; + /** + The recommended buffer size for optimised writing performance. + + The given buffer size is based on sensible benchmark testing results produced by the mobile device vendor. + The buffer size is then added to the estart.txt file + + The figure is included in the estart.txt file along with the drive number and the variable name. + The example below shows the required format: + + [DriveC] + RecWriteBufSize 16384 + + When no value is provided, value KErrNotSupported is returned. + */ + TInt iRecWriteBufSize; + +private: + /* + Reserved space for future use + */ + TInt iReserved[4]; + }; + +enum TDriveNumber +/** +@publishedAll +@released + +The drive number enumeration. +*/ + { + EDriveA, EDriveB, EDriveC, EDriveD, EDriveE, + EDriveF, EDriveG, EDriveH, EDriveI, EDriveJ, + EDriveK, EDriveL, EDriveM, EDriveN, EDriveO, + EDriveP, EDriveQ, EDriveR, EDriveS, EDriveT, + EDriveU, EDriveV, EDriveW, EDriveX, EDriveY, + EDriveZ + }; + + + + +enum TEntryKey +/** +@publishedAll +@released + +Flags indicating the order in which directory entries are to be sorted. + +@see RFs::GetDir +@see CDirScan::SetScanDataL +@see CDir::Sort +*/ + { + /** + The default; no sorting takes place + */ + ESortNone=0, + + + /** + Sort according to alphabetic order of file and directory name. + + This setting is mutually exclusive with ESortByExt, ESortBySize, + ESortByDate and ESortByUid. + */ + ESortByName, + + + /** + Sort according to alphabetic order of file extension. + + Files without an extension take precedence over files with an extension. + For files with the same extension or without an extension, the default is + to sort by name. + + This setting is mutually exclusive with ESortByName, ESortBySize, + ESortByDate and ESortByUid. + */ + ESortByExt, + + + /** + Sort according to file size. + + This setting is mutually exclusive with ESortByName, ESortByExt, + ESortByDate and ESortByUid. + */ + ESortBySize, + + + /** + Sort according to files' last modified time and date. + + By default, most recent last. + + This setting is mutually exclusive with ESortByName, ESortByExt, + ESortBySize and ESortByUid. + */ + ESortByDate, + + + /** + Sort according to file UID. + + This setting is mutually exclusive with ESortByName, ESortByExt, + ESortBySize and ESortByDate. + */ + ESortByUid, + + + /** + Qualifies the sort order; if set, directories are listed in the order in + which they occur. + + This is the default. + + This flag is mutually exclusive with EDirsFirst and EDirslast. + */ + EDirsAnyOrder=0, + + + /** + Qualifies the sort order; if set, directories come before files in sort order. + + This flag is mutually exclusive with EDirsAnyOrder and EDirsLast. + */ + EDirsFirst=0x100, + + + /** + Qualifies the sort order; if set, files come before directories in sort order. + + This flag is mutually exclusive with EDirsAnyOrder and EDirsFirst. + */ + EDirsLast=0x200, + + + /** + Qualifies the sort order; files are sorted in ascending order, i.e. from A to Z. + This is the default behaviour. + + This flag is mutually exclusive with EDescending and EDirDescending. + */ + EAscending=0, + + + /** + Qualifies the sort order; files are sorted in descending order, i.e. from Z to A. + + This flag is mutually exclusive with EAscending and EDirDescending. + */ + EDescending=0x400, + + + /** + Qualifies the sort order; directories are sorted in descending order, i.e. from Z to A. + + This flag shall be used in combination with either EDirsFirst or EDirsLast. + This flag is mutually exclusive with EAscending and EDescending. + */ + EDirDescending=0x800 + }; + + + + +enum TFileMode +/** +@publishedAll +@released + +Access and share modes available when opening a file. + +The access mode indicates whether the file is opened just for reading or +for writing. + +The share mode indicates whether other RFile objects can access the +open file, and whether this access is read only. + +Use EFileShareReadersOrWriters if a client does not care whether the file has +been previously opened for ReadOnly or Read/Write access. + +If EFileShareReadersOrWriters is not used, then a client needs to cooperate with +other clients in order to open the file with the correct share mode, either +EFileShareReadersOnly or EFileShareAny, depending on the share mode used when +the file was originally opened. + +To open a file for reading and writing with read and write shared access, +use: + +@code +_LIT(KFilename, "filename.ext"); +RFile file; +file.Open(theFs, KFilename, EFileShareAny|EFileWrite); +@endcode + +If another instance of RFile tries to open this file in EFileShareExclusive +or EFileShareReadersOnly mode, access is denied. However, it can be opened +in EFileShareAny mode or EFileShareReadersOrWriters mode. + +If a file is opened with EFileShareReadersOrWriters, and the file is opened for +sharing by another client, then the file share mode is promoted to the new share +mode. When the file handle is closed then the share mode is demoted back to +EFileShareReadersOrWriters. + +@code + +Table of FileShare promotion rules +---------------------------------- + +Client A Client B Resultant Share Mode +-------- -------- -------------------- +ReadersOnly ReadersOnly ReadersOnly +ReadersOnly ReadersOrWriters|EFileRead ReadersOnly +ReadersOnly ReadersOrWriters|EFileWrite INCOMPATIBLE +ReadersOnly Any INCOMPATIBLE + +ReadersOrWriters|EFileRead ReadersOnly ReadersOnly +ReadersOrWriters|EFileRead ReadersOrWriters|EFileRead ReadersOrWriters +ReadersOrWriters|EFileRead ReadersOrWriters|EFileWrite ReadersOrWriters +ReadersOrWriters|EFileRead Any Any + +ReadersOrWriters|EFileWrite ReadersOnly INCOMPATIBLE +ReadersOrWriters|EFileWrite ReadersOrWriters|EFileRead ReadersOrWriters +ReadersOrWriters|EFileWrite ReadersOrWriters|EFileWrite ReadersOrWriters +ReadersOrWriters|EFileWrite Any Any + +Any ReadersOnly INCOMPATIBLE +Any ReadersOrWriters|EFileRead Any +Any ReadersOrWriters|EFileWrite Any +Any Any Any +@endcode + +Use the following guidance notes for selecting FileShare mode with shared RFile objects: + +EFileShareAny +- Use this mode to request both read and write access when another client needs +to write to the file and respective client access to the file is coordinated. +- To open a file for non-exclusive write, use EFileShareAny | EFileWrite. +- It is recommended that either EFileShareAny or EFileShareAny | EFileRead are +not used. These combinations will block users attempting to use the +EFileShareReadersOnly mode even if all the EFileShareAny handles do not have +the EFileWrite bit set as the EFileRead and EFileWrite bits have no affect on +sharing. Use either EFileShareReadersOnly or EFileShareReadersOrWriters. + +EFileShareReadersOrWriters +- Use this mode when it does not matter if another file writes to the file and +file access can not be coordinated as other clients are unknown. +- To open a file for shared read access whilst permitting writers, use +EFileShareReadersOrWriters | EFileRead. + +- For write access with unrestricted share mode, +EFileShareReadersOrWriters | EFileWrite may be used however +EFilesShareAny | EFileWrite is preferred. + +EFileShareReadersOnly +- Use this mode to get read access to the file and deny write access for any +other handles on this file. +- To open a file for shared read access whilst disallowing writers use +EFileShareReadersOnly. + + +Files may be opened in text or binary mode. Native Symbian OS application +files are nearly all binary, (so they will usually be opened in binary mode). +However, they can be opened in text mode (to support testing, and to make them +compatible with text formats on remote systems). +Symbian OS native text format uses CR-LF (ASCII 0x0d, 0x0a) to denote the end of +a line. When reading, however, any combination of CR, LF, LF-CR or CR-LF is +recognised as the end of a line. Where a remote file system uses a different +format, it is the responsibility of the installable file system to present +an interface for text files which conforms with this format. + +The share mode may be OR’ed with either EFileStream or EFileStreamText. + +Additionally, it may be OR’ed with either EFileRead or EFileWrite. +*/ + { + /** + Exclusive access for the program opening the file. + + No other program can access the file until it is closed. + If another program is already accessing the file in any share mode, then + an attempt to open it with an EFileShareExclusive will fail. + */ + EFileShareExclusive, + + + /** + Read-only sharing. + + This means that the file may only be accessed for reading. + A file cannot be opened using a share mode of EFileShareReadersOnly with + an EFileWrite flag. + */ + EFileShareReadersOnly, + + + /** + Shared access for reading and writing. + + This means that other programs may share access to the file for reading + and writing with the program which opened the file. + + When using this mode, the program is expecting another program to be able + to write to the file, so is not compatible with EFileShareReadersOnly. + */ + EFileShareAny, + + + /** + Shared access for reading and writing. + + This means that other programs may share access to the file for reading + and writing with the program which opened the file. + + When using this mode, the program does not care if another program has + the file open for read or write access. + */ + EFileShareReadersOrWriters, + + + /** + For files to be opened in binary mode. + */ + EFileStream=0, + + + /** + For files to be opened in text mode. + */ + EFileStreamText=0x100, + + + /** + The file may be read from but not written to. + */ + EFileRead=0, + + + /** + The file may be read from and written to + + Cannot be combined with a share mode of EFileShareReadersOnly. + */ + EFileWrite=0x200, + + /** + Specifies that an asynchronous read request should not be completed + until all requested data becomes available. + + Cannot be combined with the EFileShareExclusive or EFileShareReadersOnly + share modes as this will prohibit a writer from updating the file. + */ + EFileReadAsyncAll=0x400, + + /** + Enables write buffering + */ + EFileWriteBuffered =0x00000800, + + /** + Disables write buffering + */ + EFileWriteDirectIO =0x00001000, + + /** + Enables read buffering + */ + EFileReadBuffered =0x00002000, + + /** + Disables read buffering + */ + EFileReadDirectIO =0x00004000, + + /** + Enables read ahead. + */ + EFileReadAheadOn =0x00008000, + + /** + Disables read ahead. + */ + EFileReadAheadOff =0x00010000, + + /** + Enable delete on close + */ + EDeleteOnClose =0x00020000 + }; + + + + +/** +@publishedAll +@released + +Bit mask provided for retrieving a file's share mode. + +@see TFileMode +*/ +const TUint KFileShareMask=0xff; + + + + +enum TFormatMode +/** +@publishedAll +@released + +The format method. +*/ + { + /** + Indicates a high density floppy disk to be formatted. + */ + EHighDensity, + + + /** + Indicates a standard floppy disk to be formatted. + */ + ELowDensity, + + + /** + Performs a full format, erasing existing content and resetting the FAT + and root directory. + + This is the default, and can be ORed with bit EHighDensity or ELowDensity. + */ + EFullFormat=0, + + + /** + Does the minimum required to format the device, only resetting the FAT + and root directory. + + This is the default, and can be ORed with bit EHighDensity or ELowDensity. + */ + EQuickFormat=0x100, + + + /** + Indicates a custom formatting mode. + */ + ESpecialFormat=0x200, + + /** + Forced erase of locked media + */ + EForceErase=0x400 + }; + + + + +enum TSeek +/** +@publishedAll +@released + +Flags indicating the destination of a seek operation. + +File locations are specified as a 32-bit signed integer, +allowing offsets of ?GB from the origin of the seek. + +@see RFile::Seek +*/ + { + /** + This can only be used for file systems with execute-in-place facilities, + such as the ROM file system: the offset specifies the absolute address of + the data. + */ + ESeekAddress, + + + /** + Destination is the start of file. + */ + ESeekStart, + + + /** + Destination is the current position in file. + */ + ESeekCurrent, + + + /** + Destination is the end of file. + */ + ESeekEnd + }; + +/** + +*/ +class TBlockMapEntry : public TBlockMapEntryBase + { +public: + IMPORT_C TBlockMapEntry(); + IMPORT_C void SetNumberOfBlocks( TUint aNumberOfBlocks ); + IMPORT_C void SetStartBlock( TUint aStartBlock ); + }; + +/** + +*/ +typedef TBuf8 TBlockArrayDes; + +struct SBlockMapInfo : public SBlockMapInfoBase + { + TBlockArrayDes iMap; + }; + +/** + +*/ +enum TBlockMapUsage + { + /* */ + EBlockMapUsagePaging, + /* */ + ETestDebug + }; + +class TEntry +/** +@publishedAll +@released + +Encapsulates an entry in a directory, which can be another (nested) directory, +a file or a volume label. + +Each directory entry has a name which is relative to its owning directory +and a type, which is indicated by its unique identifier (UID). + +An entry can be interrogated for the following properties: + +1. the kind of entry: stored in the entry UIDs, stored in iType + +2. the entry attributes, stored in iAtt + +3. the size of entry + +4. the time the entry was last modified. + +@see RDir +@see RFs::Entry +@see RFs::SetEntry +@see CfileBase::CurrentEntry +*/ + { +public: + IMPORT_C TEntry(); + IMPORT_C TEntry(const TEntry& aEntry); + IMPORT_C TEntry& operator=(const TEntry& aEntry); + IMPORT_C TBool IsReadOnly() const; + IMPORT_C TBool IsHidden() const; + IMPORT_C TBool IsSystem() const; + IMPORT_C TBool IsDir() const; + IMPORT_C TBool IsArchive() const; + inline const TUid& operator[](TInt anIndex) const; + inline TBool IsUidPresent(TUid aUid) const; + inline TBool IsTypeValid() const; + inline TUid MostDerivedUid() const; +public: + /** + The individual bits within this byte indicate which attributes + have been set. + + @see KEntryAttNormal + @see KEntryAttReadOnly + @see KEntryAttHidden + @see KEntryAttSystem + */ + TUint iAtt; + + + /** + The size of the file in bytes. + For files larger that 2G it must be cast to TUint in order to avoid looking like negative signed. + */ + TInt iSize; + + + /** + The local time of last modification. + */ + TTime iModified; + + + /** + The file's UIDtype + */ + TUidType iType; + + + /** + The name of the file relative to the owning directory, + with a maximum of KMaxFileName characters. + + @see KMaxFileName + */ + TBufC iName; + +private: + /** + Reserved for future expansion + */ + TUint32 iReserved[2]; + }; + + + + +class RDir; +class TEntryArray +/** +@publishedAll +@released + +Array of directory entries. + +It contains the results of a call to RDir::Read(): it will contain all +the TEntry items in the directory. Thus, a directory can be read in +a single call, minimising client/server communication overheads. + +@see TEntry +@see RDir::Read +*/ + { +public: + IMPORT_C TEntryArray(); + IMPORT_C TInt Count() const; + IMPORT_C const TEntry& operator[](TInt anIndex) const; +private: + TInt iCount; + TInt iIndex; + const TEntry* iPos; + TBuf8 iBuf; + friend class RDir; + friend class RFs; + friend class TRawEntryArray; + }; + + + + +class TDriveInfo +/** +@publishedAll +@released + +Contains drive information. + +@see RFs::Drive +*/ + { +public: + /** + The type of media mounted on the drive. + */ + TMediaType iType; + + + /** + Indicates whether the drive supports a battery, and if so, its state. + */ + TBatteryState iBattery; + + + /** + The drive attributes. + + @see KDriveAttLocal + @see KDriveAttRom + @see KDriveAttRedirected + @see KDriveAttSubsted + @see KDriveAttInternal + @see KDriveAttRemovable + */ + TUint iDriveAtt; + + + /** + The attributes of the media mounted on the drive. + + @see KMediaAttVariableSize + @see KMediaAttDualDensity + @see KMediaAttFormattable + @see KMediaAttWriteProtected + @see KMediaAttLockable + @see KMediaAttLocked + */ + TUint iMediaAtt; +private: + /** + Reserved for future expansion + */ + TUint32 iReserved; + }; + + + + +class TVolumeInfo +/** +@publishedAll +@released + +Contains information about a volume mounted on a drive. Use RFs::Drive() if only +the drive information is required. + +If a drive supports removable media it may contain different volumes over time. + +Volume information is made up of information concerning the drive on which it is mounted, +which can also be accessed through RFs::Drive(), and the volume information, this is made +up of the size of the volume, the free space, its unique identifying number and a name. + +TVolumeInfo is initialised by RFs::Volume(). + +@see RFs::Volume() +@see RFs::Drive() +*/ + { +public: + IMPORT_C TVolumeInfo(); + + /** + Information about the drive on which the volume is mounted. + + @see TDriveInfo + */ + TDriveInfo iDrive; + + + /** + The volume’s unique identifying number. + */ + TUint iUniqueID; + + + /** + The maximum size of the volume in bytes. The current amount of memory + in use plus the amount of free memory. + */ + TInt64 iSize; + + + /** + The amount of free space on the volume in bytes. + */ + TInt64 iFree; + + + /** + Name of the volume, with a maximum of KMaxFileName characters. + + This field is optional. + + @see KMaxFileName + */ + TBufC iName; + + /** + Flags which define the default file-caching behaviour for this volume + + @see TFileCacheFlags + */ + TFileCacheFlags iFileCacheFlags; + + /** + @prototype + @internalTechnology + Internal flag, used in the case of non-blocking getting volume information. + @see RFs::Volume(TVolumeInfo& aVol,TInt aDrive, TRequestStatus& aStat) + + If this flag is set, it means that the volume information will be obtained + asynchronously. More specific, on return iFree will reflect the _current_ amount of free space on volume at the moment of + RFs::Volume() call, not the exact final value. This is because in this case getting volume information will be asynchronous, + and the client will not be suspended until the mount finish calculating free space. At present appicable to FAT32 file system only. + */ + TUint8 iVolSizeAsync : 1; + +private: + /** + Reserved for future expansion + */ + TUint8 i8Reserved1; + TUint16 i16Reserved1; + TUint32 i32Reserved1; + TUint32 i32Reserved2; + }; + + + + +class TDriveUnit +/** +@publishedAll +@released + +Drive numbers and letters. + +A drive may be represented by either an integer between zero and twenty five +inclusive, or by a buffer descriptor containing a character between "A" and "Z" +inclusive, followed by a colon. +This class encapsulates both representations. +An instance of this class is constructed specifying either the drive number +or the drive letter and may be converted between the two representations. +*/ + { +public: + inline TDriveUnit() {}; + IMPORT_C TDriveUnit(TInt aDrive); + IMPORT_C TDriveUnit(const TDesC& aDrive); + IMPORT_C TDriveUnit& operator=(TInt aDrive); + IMPORT_C TDriveUnit& operator=(const TDesC& aDrive); + inline operator TInt() const; + IMPORT_C TDriveName Name() const; +private: + TInt iDrive; + }; + + + + +class RFs; +// +class TParseBase +/** +@publishedAll +@released + +Base class for file name parsing. + +You first need to set up the path to be parsed using either a TParse, TParsePtr +or TParsePtrC object. + +The interrogation and extraction functions in this class allow you to test +whether a component has been specified in the pathname, and if so, +to extract it. If a component is not present in the pathname, +the extraction function returns an empty string. + +This class also allows directories to be added to, and popped from the path. + +Notes: + +1. the filename modification functions cannot be used by the TParsePtrC class. + +2. navigation using .. and . is not supported. + +@see TParse +@see TParsePtr +@see TParsePtrC +*/ + { +private: + struct SField {TUint8 pos;TUint8 len;TUint8 present;TUint8 filler;}; + enum TField {EDrive,EPath,EName,EExt,EMaxFields}; + enum TWild {EWildName=0x01,EWildExt=0x02,EWildEither=0x04,EIsRoot=0x08,EWildIsKMatchOne=0x10,EWildIsKMatchAny=0x20}; +public: + IMPORT_C TParseBase(); + IMPORT_C TInt PopDir(); + IMPORT_C TInt AddDir(const TDesC& aName); + IMPORT_C const TDesC& FullName() const; + IMPORT_C TPtrC Drive() const; + IMPORT_C TPtrC Path() const; + IMPORT_C TPtrC DriveAndPath() const; + IMPORT_C TPtrC Name() const; + IMPORT_C TPtrC Ext() const; + IMPORT_C TPtrC NameAndExt() const; + IMPORT_C TBool DrivePresent() const; + IMPORT_C TBool PathPresent() const; + IMPORT_C TBool NamePresent() const; + IMPORT_C TBool ExtPresent() const; + IMPORT_C TBool NameOrExtPresent() const; + IMPORT_C TBool IsRoot() const; + IMPORT_C TBool IsWild() const; + IMPORT_C TBool IsKMatchOne() const; + IMPORT_C TBool IsKMatchAny() const; + IMPORT_C TBool IsNameWild() const; + IMPORT_C TBool IsExtWild() const; +protected: + virtual TDes& NameBuf() = 0; // Reference to derived class descriptor containing the filename. + virtual const TDesC& NameBufC() const = 0; // const reference to derived class descriptor containing the filename. + TInt Set(const TDesC* aName,const TDesC* aRelated,const TDesC* aDefault,TBool allowWild); +private: + TInt ParseDrive(TLex& aName,TBool& aDone); + TInt ParsePath(TLex& aName,TBool& aDone); + TInt ParseName(TLex& aName,TBool& aDone); + TInt ParseExt(TLex& aName,TBool& aDone); +protected: + TInt16 iMod; // Non-zero indicates File name modification functionality is enabled. +private: + TInt16 iWild; + SField iField[EMaxFields]; + }; + + + + +class TParsePtr : public TParseBase +/** +@publishedAll +@released + +Parses filenames using less space on the stack than TParse. + +Stores a reference to a filename, unlike TParse, which uses +a 512 byte TFileName object as an internal buffer to store +a copy of the filename. +The filename's components (drive, path, etc.) can be retrieved using +the functions provided by the base class, TParseBase. +This class should be used in preference to TParse when minimising stack +usage is a priority. + +@see TParse +@see TFileName +*/ + { +public: + IMPORT_C TParsePtr(TDes& aName); +protected: + IMPORT_C TDes& NameBuf(); + IMPORT_C const TDesC& NameBufC() const; +private: + TPtr iNameBuf; + }; + + + + +class TParsePtrC : public TParseBase +/** +@publishedAll +@released + +Parses, but cannot modify, filenames using less space on the stack than TParse. + +Stores a reference to a filename, unlike TParse, which uses +a 512 byte TFileName object as an internal buffer to store +a copy of the filename. +The filename's components (drive, path, etc.) can be retrieved using +the functions provided by the base class, TParseBase. +Note that because the filename cannot be modified through this class, +the base class functions PopDir() and AddDir() cannot be called, because +a panic will be raised. + +@see TParse +@see TFileName +*/ + { +public: + IMPORT_C TParsePtrC(const TDesC& aName); +protected: + IMPORT_C TDes& NameBuf(); + IMPORT_C const TDesC& NameBufC() const; +private: + TPtrC iNameBuf; + }; + + + + +class TParse : public TParseBase +/** +@publishedAll +@released + +Parses filenames. + +The class uses the full filename structure supported by Symbian OS. + +TParse works by using the Set() function to set up the filename to be parsed. +Then, various getter functions defined in the base class, TParseBase, such as: +FullName(), Drive(), Path(), DriveAndPath(), Name(), Ext() and NameAndExt() +may be used to retrieve path components. + +There are a number of restrictions to valid path components, which are +described in guide documentation. +*/ + { +public: + IMPORT_C TParse(); + IMPORT_C TInt Set(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault); + IMPORT_C TInt SetNoWild(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault); +protected: + IMPORT_C TDes& NameBuf(); + IMPORT_C const TDesC& NameBufC() const; +private: + TFileName iNameBuf; + }; + + + + +class CDir : public CBase +/** +@publishedAll +@released + +Array of directory entries that has been read into memory from the file system. + +It can be read and sorted by user programs, but cannot be created by them. +*/ + { +public: + IMPORT_C virtual ~CDir(); + IMPORT_C TInt Count() const; + IMPORT_C const TEntry& operator[](TInt anIndex) const; + IMPORT_C TInt Sort(TUint aEntrySortKey); +protected: + IMPORT_C CDir(); + IMPORT_C static CDir* NewL(); + IMPORT_C void AddL(const TEntry& anEntry); + IMPORT_C void ExtractL(TBool aRemove,CDir*& aDir); + IMPORT_C void Compress(); +protected: + CArrayPakFlat* iArray; + friend class RFs; + friend class TOpenFileScan; + }; + + +#if defined SYMBIAN_PRIVATE_EFSRV + #define EFSRV_EXPORT_C + #define EFSRV_IMPORT_C +#else + #define EFSRV_EXPORT_C EXPORT_C + #define EFSRV_IMPORT_C IMPORT_C +#endif + + +class RFs : public RSessionBase +/** +@publishedAll +@released + +A handle to a file server session. + +A program or thread may have arbitrarily many sessions open simultaneously. + +Use this class for all file system manipulation, including: + +1. adding, removing, moving and renaming files and directories + +2. inspecting and changing file attributes and directory entry details. + These include the time and date when the file or directory was last + written to, its size and various attribute flags such as read-only, + hidden, archive or system. + +3. finding a file’s real name; if the file system on which it is stored + has to "mangle" the name into a shorter format + +4. getting directory listings + +5. maintaining a default path; unlike some other systems, there is a single + system default path, rather than one for each drive: the default path + consists of a drive and a path specification. + +6. performing context-sensitive parses using TParse objects, and + the session path + +7. obtaining information on drives and volumes + +8. formatting and labelling volumes + +9. obtaining a list of valid drives + +10. emulating the DOS subst command, which allows any directory to appear + as if it were a separate drive + +11. requesting notification of when significant change occurs. + This can be used for programs which maintain file lists, but must + update those lists when change occurs. + +12. finding the version number of the file server + +13. resource counting to ensure that all resources are closed when + the session terminates. + +This class is not intended for user derivation. + +The following restrictions apply when a path is specified: + +1. its total length must not exceed 256 characters + +2. wildcards cannot be used in the drive or in any directory name, + although they may be allowed in the filename and extension. + +3. double backslashes are not allowed in the path. + +4. the following characters must not be included anywhere in the path: < > " / | + +5. a colon may only be included between the drive and path + +6. no directory name or filename plus extension may consist solely + of space characters, or of a single or double dot. + +7. spaces between the drive, if specified, and the first directory in + the path are illegal, although there may be spaces between other + path components, for instance between directories. +*/ + { +public: + EFSRV_IMPORT_C TInt Connect(TInt aMessageSlots=KFileServerDefaultMessageSlots); + EFSRV_IMPORT_C TVersion Version() const; + EFSRV_IMPORT_C TInt AddFileSystem(const TDesC& aFileName) const; + EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,TInt aDrive) const; + EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,TInt aDrive, TBool aIsSync) const; + EFSRV_IMPORT_C TInt MountFileSystemAndScan(const TDesC& aFileSystemName,TInt aDrive,TBool& aIsMountSuccess) const; + EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive); + EFSRV_IMPORT_C TInt MountFileSystem(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive, TBool aIsSync); + EFSRV_IMPORT_C TInt MountFileSystemAndScan(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive,TBool& aIsMountSuccess) const; + EFSRV_IMPORT_C TInt DismountFileSystem(const TDesC& aFileSystemName,TInt aDrive) const; + EFSRV_IMPORT_C TInt RemoveFileSystem(const TDesC& aFileSystemName) const; + EFSRV_IMPORT_C TInt FileSystemName(TDes& aName,TInt aDrive) const; + EFSRV_IMPORT_C TInt AddExtension(const TDesC& aFileName); + EFSRV_IMPORT_C TInt MountExtension(const TDesC& aExtensionName,TInt aDrive); + EFSRV_IMPORT_C TInt DismountExtension(const TDesC& aExtensionName,TInt aDrive); + EFSRV_IMPORT_C TInt RemoveExtension(const TDesC& aExtensionName); + EFSRV_IMPORT_C TInt ExtensionName(TDes& aExtensionName,TInt aDrive,TInt aPos); + EFSRV_IMPORT_C TInt RemountDrive(TInt aDrive,const TDesC8* aMountInfo=NULL,TUint aFlags=0); + EFSRV_IMPORT_C void NotifyChange(TNotifyType aType,TRequestStatus& aStat); + EFSRV_IMPORT_C void NotifyChange(TNotifyType aType,TRequestStatus& aStat,const TDesC& aPathName); + EFSRV_IMPORT_C void NotifyChangeCancel(); + EFSRV_IMPORT_C void NotifyChangeCancel(TRequestStatus& aStat); + EFSRV_IMPORT_C void NotifyDiskSpace(TInt64 aThreshold,TInt aDrive,TRequestStatus& aStat); + EFSRV_IMPORT_C void NotifyDiskSpaceCancel(TRequestStatus& aStat); + EFSRV_IMPORT_C void NotifyDiskSpaceCancel(); + EFSRV_IMPORT_C TInt DriveList(TDriveList& aList) const; + EFSRV_IMPORT_C TInt DriveList(TDriveList& aList, TUint aFlags) const; + EFSRV_IMPORT_C TInt Drive(TDriveInfo& anInfo,TInt aDrive=KDefaultDrive) const; + EFSRV_IMPORT_C TInt Volume(TVolumeInfo& aVol,TInt aDrive=KDefaultDrive) const; + EFSRV_IMPORT_C void Volume(TVolumeInfo& aVol,TInt aDrive, TRequestStatus& aStat) const; + EFSRV_IMPORT_C TInt SetVolumeLabel(const TDesC& aName,TInt aDrive=KDefaultDrive); + EFSRV_IMPORT_C TInt Subst(TDes& aPath,TInt aDrive=KDefaultDrive) const; + EFSRV_IMPORT_C TInt SetSubst(const TDesC& aPath,TInt aDrive=KDefaultDrive); + EFSRV_IMPORT_C TInt RealName(const TDesC& aName,TDes& aResult) const; + EFSRV_IMPORT_C TInt GetMediaSerialNumber(TMediaSerialNumber& aSerialNum, TInt aDrive); + EFSRV_IMPORT_C TInt SessionPath(TDes& aPath) const; + EFSRV_IMPORT_C TInt SetSessionPath(const TDesC& aPath); + EFSRV_IMPORT_C TInt Parse(const TDesC& aName,TParse& aParse) const; + EFSRV_IMPORT_C TInt Parse(const TDesC& aName,const TDesC& aRelated,TParse& aParse) const; + EFSRV_IMPORT_C TInt MkDir(const TDesC& aPath); + EFSRV_IMPORT_C TInt MkDirAll(const TDesC& aPath); + EFSRV_IMPORT_C TInt RmDir(const TDesC& aPath); + EFSRV_IMPORT_C TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList) const; + EFSRV_IMPORT_C TInt GetDir(const TDesC& aName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,CDir*& aDirList) const; + EFSRV_IMPORT_C TInt GetDir(const TDesC& aName,const TUidType& anEntryUid,TUint anEntrySortKey,CDir*& aFileList) const; + EFSRV_IMPORT_C TInt Delete(const TDesC& aName); + EFSRV_IMPORT_C TInt Rename(const TDesC& anOldName,const TDesC& aNewName); + EFSRV_IMPORT_C TInt Replace(const TDesC& anOldName,const TDesC& aNewName); + EFSRV_IMPORT_C TInt Att(const TDesC& aName,TUint& aAttValue) const; + EFSRV_IMPORT_C TInt SetAtt(const TDesC& aName,TUint aSetAttMask,TUint aClearAttMask); + EFSRV_IMPORT_C TInt Modified(const TDesC& aName,TTime& aTime) const; + EFSRV_IMPORT_C TInt SetModified(const TDesC& aName,const TTime& aTime); + EFSRV_IMPORT_C TInt Entry(const TDesC& aName,TEntry& anEntry) const; + EFSRV_IMPORT_C TInt SetEntry(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask); + EFSRV_IMPORT_C TInt ReadFileSection(const TDesC& aName,TInt aPos,TDes8& aDes,TInt aLength) const; + EFSRV_IMPORT_C static TBool IsValidDrive(TInt aDrive); + EFSRV_IMPORT_C static TInt CharToDrive(TChar aChar,TInt& aDrive); + EFSRV_IMPORT_C static TInt DriveToChar(TInt aDrive,TChar& aChar); + EFSRV_IMPORT_C static TBool IsRomAddress(TAny* aAny); + EFSRV_IMPORT_C static TDriveNumber GetSystemDrive(); + EFSRV_IMPORT_C static TChar GetSystemDriveChar(); + EFSRV_IMPORT_C TInt SetSystemDrive(TDriveNumber aSystemDrive); + EFSRV_IMPORT_C void ResourceCountMarkStart() const; + EFSRV_IMPORT_C void ResourceCountMarkEnd() const; + EFSRV_IMPORT_C TInt ResourceCount() const; + EFSRV_IMPORT_C TInt IsFileOpen(const TDesC& aFile,TBool& anAnswer) const; + EFSRV_IMPORT_C TInt CheckDisk(const TDesC& aDrive) const; + EFSRV_IMPORT_C TInt ScanDrive(const TDesC& aDrive) const; + EFSRV_IMPORT_C TInt GetShortName(const TDesC& aLongName,TDes& aShortName) const; + EFSRV_IMPORT_C TInt GetLongName(const TDesC& aShortName,TDes& aLongName) const; + EFSRV_IMPORT_C TBool GetNotifyUser(); + EFSRV_IMPORT_C void SetNotifyUser(TBool aValue); + EFSRV_IMPORT_C TUint8* IsFileInRom(const TDesC& aFileName) const; + EFSRV_IMPORT_C TBool IsValidName(const TDesC& anEntryName) const; + EFSRV_IMPORT_C TBool IsValidName(const TDesC& aFileName,TText& aBadChar) const; + EFSRV_IMPORT_C TInt GetDriveName(TInt aDrive,TDes& aDriveName) const; + EFSRV_IMPORT_C TInt SetDriveName(TInt aDrive,const TDesC& aDriveName); + EFSRV_IMPORT_C TInt LoaderHeapFunction(TInt aFunction, TAny *aArg1=NULL, TAny *aArg2=NULL); + EFSRV_IMPORT_C TInt SetErrorCondition(TInt anError,TInt aCount=0); + EFSRV_IMPORT_C TInt SetDebugRegister(TInt aVal); + EFSRV_IMPORT_C TInt SetAllocFailure(TInt aAllocNum); + EFSRV_IMPORT_C void DebugNotify(TInt aDrive,TUint aNotifyType,TRequestStatus& aStat); + EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand); + EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand,TDes8& aParam1); + EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand,TDes8& aParam1,TDes8& aParam2); + EFSRV_IMPORT_C TInt ControlIo(TInt aDrive,TInt aCommand,TAny* aParam1,TAny* aParam2); + EFSRV_IMPORT_C TInt LockDrive(TInt aDrv, const TMediaPassword &aOld, const TMediaPassword &aNew, TBool aStr); + EFSRV_IMPORT_C TInt UnlockDrive(TInt aDrv, const TMediaPassword &Pswd, TBool aStr); + EFSRV_IMPORT_C TInt ClearPassword(TInt aDrv, const TMediaPassword &aPswd); + EFSRV_IMPORT_C TInt ErasePassword(TInt aDrv); + EFSRV_IMPORT_C TInt SetSessionToPrivate(TInt aDrive); + EFSRV_IMPORT_C TInt PrivatePath(TDes& aPath); + EFSRV_IMPORT_C TInt CreatePrivatePath(TInt aDrive); + EFSRV_IMPORT_C void StartupInitComplete(TRequestStatus& aStat); + EFSRV_IMPORT_C TInt SetLocalDriveMapping(const TDesC8& aMapping); + + EFSRV_IMPORT_C TInt FinaliseDrives(); + + /** specifies drive finalisation modes */ + enum TFinaliseDrvMode + { + EFinal_RW, ///< after successful finalisation the drive remains writable and will become "not finalised" after the first write operation. + EFinal_RO, ///< after successful finalisation the drive becomes read-only + EForceUnfinalise///< @internalComponent mark the drive as "not finalised" can result in KErrAbort if the dive is in inconsistent state. + }; + + EFSRV_IMPORT_C TInt FinaliseDrive(TInt aDriveNo, TFinaliseDrvMode aMode) const; + + EFSRV_IMPORT_C TInt SwapFileSystem(const TDesC& aOldFileSystemName,const TDesC& aNewFileSystemName,TInt aDrive) const; + EFSRV_IMPORT_C TInt ReserveDriveSpace(TInt aDriveNo, TInt aSpace); + EFSRV_IMPORT_C TInt GetReserveAccess(TInt aDriveNo); + EFSRV_IMPORT_C TInt ReleaseReserveAccess(TInt aDriveNo); + + EFSRV_IMPORT_C TInt AddPlugin(const TDesC& aFileName) const; + EFSRV_IMPORT_C TInt RemovePlugin(const TDesC& aPluginName) const; + EFSRV_IMPORT_C TInt PluginName(TDes& aPluginName,TInt aDrive,TInt aPos); + + EFSRV_IMPORT_C TInt MountPlugin(const TDesC& aPluginName) const; + EFSRV_IMPORT_C TInt MountPlugin(const TDesC& aPluginName,TInt aDrive) const; + EFSRV_IMPORT_C TInt MountPlugin(const TDesC& aPluginName,TInt aDrive, TInt aPos) const; + + EFSRV_IMPORT_C TInt DismountPlugin(const TDesC& aPluginName) const; + EFSRV_IMPORT_C TInt DismountPlugin(const TDesC& aPluginName,TInt aDrive) const; + EFSRV_IMPORT_C TInt DismountPlugin(const TDesC& aPluginName,TInt aDrive,TInt aPos) const; + + EFSRV_IMPORT_C void NotifyDismount(TInt aDrive, TRequestStatus& aStat, TNotifyDismountMode aMode=EFsDismountRegisterClient) const; + EFSRV_IMPORT_C void NotifyDismountCancel(TRequestStatus& aStat) const; + EFSRV_IMPORT_C void NotifyDismountCancel() const; + EFSRV_IMPORT_C TInt AllowDismount(TInt aDrive) const; + EFSRV_IMPORT_C TInt SetStartupConfiguration(TInt aCommand,TAny* aParam1,TAny* aParam2) const; + EFSRV_IMPORT_C TInt AddCompositeMount(const TDesC& aFileSystemName,TInt aLocalDriveToMount,TInt aCompositeDrive, TBool aSync) const; + EFSRV_IMPORT_C TInt SetNotifyChange(TBool aNotifyChange); + EFSRV_IMPORT_C TInt QueryVolumeInfoExt(TInt aDrive, TQueryVolumeInfoExtCmd aCommand, TDes8& aInfo) const; + EFSRV_IMPORT_C TInt VolumeIOParam(TInt aDriveNo, TVolumeIOParamInfo& aParamInfo) const; + EFSRV_IMPORT_C TInt FileSystemSubType(TInt aDriveNo, TDes& aName) const; + EFSRV_IMPORT_C TInt InitialisePropertiesFile(const TPtrC8& aPtr) const; + + IMPORT_C TInt AddProxyDrive(const TDesC& aFileName); + IMPORT_C TInt RemoveProxyDrive(const TDesC& aDriveName); + + template inline TInt MountProxyDrive(const TUint aDrive, const TDesC& aName, T0 a0, T1 a1) + { return(DoMountProxyDrive(TIpcArgs(aDrive, &aName, a0, a1))); }; + IMPORT_C TInt DismountProxyDrive(const TUint aDrive); + + TInt Unclamp(const RFileClamp& aHandle); + EFSRV_IMPORT_C void Close(); +protected: + TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const; + +private: + void GetDirL(const TDesC& aMatchName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,CDir*& aDirList,RDir& aDir) const; + void GetDirL(const TDesC& aMatchName,TUint anEntryAttMask,TUint anEntrySortKey,CDir*& anEntryList,RDir& aDir) const; + void GetDirL(const TDesC& aMatchName,const TUidType& aUidType,TUint anEntrySortKey,CDir*& anEntryList,RDir& aDir) const; + void DoGetDirL(TUint anEntrySortKey,CDir*& anEntryList,RDir& aDir) const; + TInt GetOpenFileList(TInt& aSessionNum,TInt& aLocalPos,TThreadId& aThreadId,TEntryArray& anArray) const; + + IMPORT_C TInt DoMountProxyDrive(const TIpcArgs& ipcArgs); + + friend class TOpenFileScan; + friend class RFsPlugin; + }; + + + + + + + +/** +@publishedAll +@released + +Creates and opens a file, and performs all operations on a single open file. + +These include: + +- reading from and writing to the file + +- seeking to a position within the file + +- locking and unlocking within the file + +- setting file attributes + +Before using any of these services, a connection to a file server session must +have been made, and the file must be open. + +Opening Files: + +- use Open() to open an existing file for reading or writing; an error is + returned if it does not already exist. + To open an existing file for reading only, use Open() with an access mode of + EFileRead, and a share mode of EFileShareReadersOnly. + +- use Create() to create and open a new file for writing; an error is returned + if it already exists. + +- use Replace() to open a file for writing, replacing any existing file of + the same name if one exists, or creating a new file if one does not exist. + Note that if a file exists, its length is reset to zero. + +- use Temp() to create and open a temporary file with a unique name, + for writing and reading. + +When opening a file, you must specify the file server session to use for +operations with that file. If you do not close the file explicitly, it is +closed when the server session associated with it is closed. + +Reading and Writing: + +There are several variants of both Read() and Write(). +The basic Read(TDes8& aDes) and Write(const TDesC8& aDes) are supplemented +by variants allowing the descriptor length to be overridden, or the seek +position of the first byte to be specified, or asynchronous completion, +or any combination. + +Reading transfers data from a file to a descriptor, and writing transfers +data from a descriptor to a file. In all cases, the file data is treated +as binary and byte descriptors are used (TDes8, TDesC8). + +@see TDes8 +@see TDesC8 +*/ +class RFile : public RSubSessionBase + { +public: + EFSRV_IMPORT_C TInt Open(RFs& aFs,const TDesC& aName,TUint aFileMode); + EFSRV_IMPORT_C void Close(); + EFSRV_IMPORT_C TInt Create(RFs& aFs,const TDesC& aName,TUint aFileMode); + EFSRV_IMPORT_C TInt Replace(RFs& aFs,const TDesC& aName,TUint aFileMode); + EFSRV_IMPORT_C TInt Temp(RFs& aFs,const TDesC& aPath,TFileName& aName,TUint aFileMode); + EFSRV_IMPORT_C TInt Read(TDes8& aDes) const; + EFSRV_IMPORT_C void Read(TDes8& aDes,TRequestStatus& aStatus) const; + EFSRV_IMPORT_C TInt Read(TDes8& aDes,TInt aLength) const; + EFSRV_IMPORT_C void Read(TDes8& aDes,TInt aLength,TRequestStatus& aStatus) const; + EFSRV_IMPORT_C TInt Read(TInt aPos,TDes8& aDes) const; + EFSRV_IMPORT_C void Read(TInt aPos,TDes8& aDes,TRequestStatus& aStatus) const; + EFSRV_IMPORT_C TInt Read(TInt aPos,TDes8& aDes,TInt aLength) const; + EFSRV_IMPORT_C void Read(TInt aPos,TDes8& aDes,TInt aLength,TRequestStatus& aStatus) const; + EFSRV_IMPORT_C void ReadCancel(TRequestStatus& aStatus) const; + EFSRV_IMPORT_C void ReadCancel() const; + EFSRV_IMPORT_C TInt Write(const TDesC8& aDes); + EFSRV_IMPORT_C void Write(const TDesC8& aDes,TRequestStatus& aStatus); + EFSRV_IMPORT_C TInt Write(const TDesC8& aDes,TInt aLength); + EFSRV_IMPORT_C void Write(const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus); + EFSRV_IMPORT_C TInt Write(TInt aPos,const TDesC8& aDes); + EFSRV_IMPORT_C void Write(TInt aPos,const TDesC8& aDes,TRequestStatus& aStatus); + EFSRV_IMPORT_C TInt Write(TInt aPos,const TDesC8& aDes,TInt aLength); + EFSRV_IMPORT_C void Write(TInt aPos,const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus); + EFSRV_IMPORT_C TInt Lock(TInt aPos,TInt aLength) const; + EFSRV_IMPORT_C TInt UnLock(TInt aPos,TInt aLength) const; + EFSRV_IMPORT_C TInt Seek(TSeek aMode,TInt& aPos) const; + EFSRV_IMPORT_C TInt Flush(); + EFSRV_IMPORT_C void Flush(TRequestStatus& aStatus); + EFSRV_IMPORT_C TInt Size(TInt& aSize) const; + EFSRV_IMPORT_C TInt SetSize(TInt aSize); + EFSRV_IMPORT_C TInt Att(TUint& aAttValue) const; + EFSRV_IMPORT_C TInt SetAtt(TUint aSetAttMask,TUint aClearAttMask); + EFSRV_IMPORT_C TInt Modified(TTime& aTime) const; + EFSRV_IMPORT_C TInt SetModified(const TTime& aTime); + EFSRV_IMPORT_C TInt Set(const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask); + EFSRV_IMPORT_C TInt ChangeMode(TFileMode aNewMode); + EFSRV_IMPORT_C TInt Rename(const TDesC& aNewName); + EFSRV_IMPORT_C TInt Drive(TInt &aDriveNumber, TDriveInfo &aDriveInfo) const; + EFSRV_IMPORT_C TInt Adopt(RFs& aFs, TInt aHandle); + EFSRV_IMPORT_C TInt AdoptFromClient(const RMessage2& aMsg, TInt aFsHandleIndex, TInt aFileHandleIndex); + EFSRV_IMPORT_C TInt AdoptFromServer(TInt aFsHandle, TInt aFileHandle); + EFSRV_IMPORT_C TInt AdoptFromCreator(TInt aFsIndex, TInt aFileHandleIndex); + EFSRV_IMPORT_C TInt Name(TDes& aName) const; + EFSRV_IMPORT_C TInt TransferToServer(TIpcArgs& aIpcArgs, TInt aFsHandleIndex, TInt aFileHandleIndex) const; + EFSRV_IMPORT_C TInt TransferToClient(const RMessage2& aMsg, TInt aFileHandleIndex) const; + EFSRV_IMPORT_C TInt TransferToProcess(RProcess& aProcess, TInt aFsHandleIndex, TInt aFileHandleIndex) const; + EFSRV_IMPORT_C TInt Duplicate(const RFile& aFile, TOwnerType aType=EOwnerProcess); + EFSRV_IMPORT_C TInt FullName(TDes& aName) const; + EFSRV_IMPORT_C TInt BlockMap(SBlockMapInfo& aInfo, TInt64& aStartPos, TInt64 aEndPos=-1, TInt aBlockMapusage=EBlockMapUsagePaging) const; + TInt Clamp(RFileClamp& aHandle); + +protected: + // RSubSessionBase overrides + TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs); + void CloseSubSession(TInt aFunction); + TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const; + + TInt DuplicateHandle(TInt& aSubSessionHandle) const; + + friend class RFilePlugin; + }; + + + +class RDir : public RSubSessionBase +/** +@publishedAll +@released + +Reads the entries contained in a directory. + +You must first open the directory, specifying an attribute mask which is used +by Read() calls to filter the entry types required. Then, use one of +the Read() functions to read the filtered entries. When the operation +is complete, the directory should be closed using Close() + +There are two types of Read(): one works with a single entry at a time, +requiring programs to iterate through the entries explicitly. +The other works with an entire TEntryArray, allowing multiple entries to be +read in one call. +As well as making application program logic somewhat simpler, this type +uses fewer calls to the server, and is more efficient. + +Each type of Read() can be performed either synchronously or asynchronously. + +It may be more convenient to use RFs::GetDir() than the Read() calls supported +by this class. +RFs::GetDir() has the advantage that it allows a directory’s entries to be +sorted in various ways. +However, it does not provide asynchronous as well as synchronous variants +and does not allow entries to be read individually. + +@see RFs +*/ + { +public: + EFSRV_IMPORT_C TInt Open(RFs& aFs,const TDesC& aMatchName,const TUidType& aUidType); + EFSRV_IMPORT_C TInt Open(RFs& aFs,const TDesC& aMatchName,TUint anAttMask); + EFSRV_IMPORT_C void Close(); + EFSRV_IMPORT_C TInt Read(TEntryArray& anArray) const; + EFSRV_IMPORT_C void Read(TEntryArray& anArray,TRequestStatus& aStatus) const; + EFSRV_IMPORT_C TInt Read(TEntry& anEntry) const; + EFSRV_IMPORT_C void Read(TPckg& anEntry,TRequestStatus& aStatus) const; + +private: + // RSubSessionBase overrides + TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const; + + friend class RDirPlugin; + }; + + +class RFormat : public RSubSessionBase +/** +@publishedAll +@released + +Formats a device, one step at a time. + +RFormat must first be opened on a device before formatting each +track using Next(). + +There is also an asynchronous version of Next() which, if encapsulated into +a suitable active object, can be used to implement a +user-interruptible formatting process. +*/ + { +public: + IMPORT_C TInt Open(RFs& aFs,const TDesC& aName,TUint aFormatMode,TInt& aCount); + IMPORT_C TInt Open(RFs& aFs,const TDesC& aName,TUint aFormatMode,TInt& aCount,const TDesC8& anInfo); + IMPORT_C void Close(); + IMPORT_C TInt Next(TInt& aStep); + IMPORT_C void Next(TPckgBuf& aStep,TRequestStatus& aStatus); + }; + + + + +class RRawDisk : public RSubSessionBase +/** +@publishedAll +@released + +Enables direct disk access. + +No other resources can access the disk while direct access to it is in effect. + +This class is not intended for user derivation. +*/ + { +public: + IMPORT_C TInt Open(RFs& aFs,TInt aDrive); + IMPORT_C void Close(); + IMPORT_C TInt Read(TInt64 aPos,TDes8& aDes); + IMPORT_C TInt Write(TInt64 aPos,TDesC8& aDes); + IMPORT_C TInt Caps(TDes8& aCaps); +private: + TInt iDrive; + }; + + + + +class CDirStack; +NONSHARABLE_CLASS(CDirScan) : public CBase +/** +@publishedAll +@released + +Scans a directory structure. + +The scan moves from directory to directory through the hierarchy, returning +a list of the entries contained in each. The order in which the directories +are scanned is determined by a sort key which is specified when setting up +the scan. The base directory to be scanned and the entry types of interest +must also be specified before performing the scan. + +This class is not intended for user derivation +*/ + { +public: + /** + Defines the scan direction. + */ + enum TScanDirection + { + /** + Scan upwards from the lowest level directory in the hierarchy to + the top level directory. + */ + EScanUpTree, + + /** + Scan downwards from the top level directory in the hierarchy to + the bottom level directory. + */ + EScanDownTree + }; +public: + IMPORT_C static CDirScan* NewL(RFs& aFs); + IMPORT_C static CDirScan* NewLC(RFs& aFs); + IMPORT_C ~CDirScan(); + IMPORT_C void SetScanDataL(const TDesC& aMatchName,TUint anEntryAttMask,TUint anEntrySortMask,TScanDirection aScanDir=EScanDownTree); + IMPORT_C void NextL(CDir*& aDirEntries); + IMPORT_C TPtrC AbbreviatedPath(); + IMPORT_C TPtrC FullPath(); +protected: + CDirScan(RFs& aFs); +private: + inline RFs& Fs(); + void UpdateAbbreviatedPath(); + void ScanUpTreeL(CDir*& aDirEntries); + void ScanDownTreeL(CDir*& aDirEntries); + void GetDirEntriesL(CDir*& aDirEntries); +private: + RFs* const iFs; + TParse iFullPath; + TPtrC iAbbreviatedPath; + TInt iAbbreviatedPathPos; + TUint iEntryAttMask; + TUint iEntrySortMask; + TBool iScanning; + TScanDirection iScanDir; + CDirStack* iStack; + }; + + + + +enum TFileManError +/** +@publishedAll +@released + +A list of CFileMan error codes. + +@see CFileMan +*/ + { + /** + No additional error information is available, either because + the latest CFileMan operation did not return an error, or if it did, + the error was not one for which additional information is available. + */ + ENoExtraInformation, + + + /** + A leave occurred while setting up the initial scan. + + This indicates that the operation did not begin. + + @see CDirScan. + */ + EInitializationFailed, + + + /** + A leave occurred while scanning the next directory in the course of a file + management function. + + This indicates that the operation did begin. + + @see CDirScan. + */ + EScanNextDirectoryFailed, + + + /** + Error occurred when attempting to open the source file for a file copy + or move. + */ + ESrcOpenFailed, + + + /** + Error occurred while attempting to create, or, if overwriting is in effect, + replace the target file for a file copy or move. + */ + ETrgOpenFailed, + + + /** + The operation completed without processing any files because no matching + files were found. + */ + ENoFilesProcessed + }; + + + + +class MFileManObserver +/** +@publishedAll +@released + +Provides notification of the progress of synchronous or asynchronous +file management operations. + +It should be inherited by classes which implement this protocol. + +The enquiry functions provided by CFileBase and CFileMan may be used by +the observer to display information about the progress of the operation +such as error messages, the names of the target and destination files, +and the number of bytes transferred during a copy operation. +Notification may take place before or after an entry has been processed, +or during a file copy or move. +Each notification function returns a value which can be used to enable +the user to control the progress of the operation, for example to cancel +a long-running multiple file copy. +To use this class, pass a pointer to an instance of the class to +the CFileMan constructor, or use SetObserver(), defined in CFileBase. +*/ + { +public: + /** + Control for the current CFileMan operation. + */ + enum TControl + { + /** + Proceed with the current or the next entry. + */ + EContinue, + + + /** + Retry processing the previous entry. + */ + ERetry, + + + /** + Abort operation, causes function to return KErrCancel. + */ + EAbort, + + + /** + Cancel processing the current entry. + */ + ECancel + }; +public: + IMPORT_C virtual TControl NotifyFileManStarted(); + IMPORT_C virtual TControl NotifyFileManOperation(); + IMPORT_C virtual TControl NotifyFileManEnded(); + }; + + + + +class CFileBase : public CBase +/** +@publishedAll +@released + +Abstract base class for file management. + +It provides functions to set an observer for the derived class +CFileMan, and to get information about the entry being processed. + +@see CFileMan +*/ + { +public: + IMPORT_C void SetObserver(MFileManObserver* anObserver); +public: + IMPORT_C const TEntry& CurrentEntry(); + IMPORT_C TPtrC AbbreviatedPath(); + IMPORT_C TPtrC FullPath(); + IMPORT_C TInt GetLastError(); + IMPORT_C TFileManError GetMoreInfoAboutError(); +protected: + IMPORT_C CFileBase(RFs& anFs); + IMPORT_C void ConstructL(); + IMPORT_C ~CFileBase(); + IMPORT_C void RunL(); + IMPORT_C void RunInSeparateThreadL(TThreadFunction aThreadFunction); +// virtual + /** + Called from RunL to perform tidy up after an operation. + + @see CFileMan + @see CFileBase::RunL + */ + virtual void CompleteOperationL() {}; + +//pure virtual + /** + Called from RunL to perform the requested operation. + + @see CFileMan + @see CFileBase::RunL + */ + virtual void DoOperationL() = 0; +protected: + RFs iFs; + RFs iFsOld; + RThread iFManThread; + RSemaphore iSynchronizer; + CDirScan* iScanner; + CDir* iDirList; + TInt iCurrentEntry; + TUint iMatchEntry; + TUint iSwitches; + TParse iSrcFile; + MFileManObserver* iObserver; + TInt iLastError; + TFileManError iErrorInfo; + TRequestStatus* iStatus; + HBufC* iSessionPath; + TInt iNumberOfFilesProcessed; + + + + +friend void DoFManBaseOperationL(TAny* aPtr); +friend TInt FManBaseThreadFunction(TAny* aPtr); + }; + + + + +NONSHARABLE_CLASS(CFileMan) : public CFileBase +/** +@publishedAll +@released + +Offers file management services which accept the use of wildcards; +synchronous and asynchronous. + +It also provides enquiry functions, which, like those provided by +the base class CFileBase, may be used by an observer class object +to provide the user with information about the progress of the operation. + +All of the file management functions provided by this class accept the use of +wildcards, and may operate either synchronously or asynchronously. +When CFileMan is operating asynchronously, the operation takes place in +a separate thread from the calling code. + +A file notification observer (an instance of a class deriving +from MFileManObserver) may optionally be used by CFileMan when operating +synchronously or asynchronously. If provided, the appropriate notification +function is called before or after each entry has been processed, +or during a file copy or move. +This notification can be used to provide information about the state of +the operation, such as the number of bytes transferred during a +large-scale file copy. It can also be used to allow the user to cancel, +retry or continue processing an entry, or to abort the whole operation. +If such notification is required, specify an object deriving from +MFileManObserver class in the constructor, or call SetObserver(), +defined in the base class, CFileBase. + +All of the file manipulation functions except Rename() may operate recursively, +and all can operate non-recursively. When operating recursively, +these functions will act on all matching files located throughout +the source directory’s hierarchy. When operating non-recursively, +these functions act upon files contained in the single top level source +directory only. Recursion is set or unset using the switch parameter to +these functions. + +This class is not intended for user derivation. + +@see MFileManObserver +*/ + { +public: + /** + An enumeration that identifies CFileMan tasks. This enumeration is used + by CurrentAction() to identify which task currently being carried out. + + @see CFileMan::CurrentAction + */ + enum TAction + { + /** + Inactive + */ + ENone, + + + /** + Setting attributes + */ + EAttribs, + + + /** + Copying files + */ + ECopy, + + + /** + Deleting files + */ + EDelete, + + + /** + Moving files + */ + EMove, + + + /** + Renaming files + */ + ERename, + + + /** + Deleting a directory and all contents + */ + ERmDir, + + + /** + Renaming component to VFAT short name (guaranteed to be unique) + */ + ERenameInvalidEntry, + + /** + Copying file from open file handle + */ + ECopyFromHandle, + }; + + + /** + Overwriting and recursion switch. + + Used in CFileMan functions to set whether operations are applied to + the specified directory and all directories below it, or + the specified directory only. + */ + enum TSwitch + { + /** + Any files in the destination directory that have the same name as + the source files in a rename, move or copy operation, will + be overwritten. + */ + EOverWrite=1, + + + /** + Recursive operation. + */ + ERecurse=2 + }; +public: + IMPORT_C static CFileMan* NewL(RFs& aFs); + IMPORT_C static CFileMan* NewL(RFs& aFs,MFileManObserver* anObserver); + ~CFileMan(); + IMPORT_C TAction CurrentAction(); + IMPORT_C void GetCurrentTarget(TFileName& aFile); + IMPORT_C void GetCurrentSource(TFileName& aFile); + IMPORT_C TInt BytesTransferredByCopyStep(); +public: + IMPORT_C TInt Attribs(const TDesC& aName,TUint aSetMask,TUint aClearMask,const TTime& aTime,TUint aSwitch=0); + IMPORT_C TInt Attribs(const TDesC& aName,TUint aSetMask,TUint aClearMask,const TTime& aTime,TUint aSwitch,TRequestStatus& aStatus); + IMPORT_C TInt Copy(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite); + IMPORT_C TInt Copy(const TDesC& anOld,const TDesC& aNew,TUint aSwitch,TRequestStatus& aStatus); + IMPORT_C TInt Delete(const TDesC& aName,TUint aSwitch=0); + IMPORT_C TInt Delete(const TDesC& aName,TUint aSwitch,TRequestStatus& aStatus); + IMPORT_C TInt Move(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite); + IMPORT_C TInt Move(const TDesC& anOld,const TDesC& aNew,TUint aSwitch,TRequestStatus& aStatus); + IMPORT_C TInt Rename(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite); + IMPORT_C TInt Rename(const TDesC& anOld,const TDesC& aNew,TUint aSwitch,TRequestStatus& aStatus); + IMPORT_C TInt RmDir(const TDesC& aDirName); + IMPORT_C TInt RmDir(const TDesC& aDirName,TRequestStatus& aStatus); + IMPORT_C TInt Copy(const RFile& anOld,const TDesC& aNew,TUint aSwitches=EOverWrite); + IMPORT_C TInt Copy(const RFile& anOld,const TDesC& aNew,TUint aSwitches,TRequestStatus& aStatus); +protected: + CFileMan(RFs& aFs); + TInt RenameInvalidEntry(const TDesC& anOld,const TDesC& aNew,TUint aSwitch=EOverWrite); +private: + /** + This is an internal enumeration for CFileMan implementation. + THis enumeration is mapped into TAction when user wants to identify the current + task of CFileMan by CurrentAction(). + + @see CFileMan::TAction + @see CFileMan::CurrentAction + */ + enum TInternalAction + { + /** + Internal indicator for None operation. + This is mapped to CFileMan::ENone. + */ + EInternalNone, + + /** + Internal indicator for Attribs() operation. + This is mapped to CFileMan::EAttribs. + */ + EInternalAttribs, + + /** + Internal indicator for Copy() operation. + This is mapped to CFileMan::ECopy. + */ + EInternalCopy, + + /** + Internal indicator for Delete() operation. + This is mapped to CFileMan::EDelete. + */ + EInternalDelete, + + /** + Internal indicator for Move() operation on different drives. + This is mapped to CFileMan::Move. + */ + EInternalCopyForMove, + + /** + Internal indicator for Move() operation on the same drive. + This is mapped to CFileMan::Rename. + Note for compatibility reasons, it is not mapped to CFileMan::Move. + */ + EInternalRenameForMove, + + /** + Internal indicator for Rename() operation. + This is mapped to CFileMan::ERename. + */ + EInternalRename, + + /** + Internal indicator for RmDir() operation. + This is mapped to CFileMan::ERmDir. + */ + EInternalRmDir, + + /** + Internal indicator for RenameInvalidEntry() operation. + This is mapped to CFileMan::ERenameInvalidEntry. + */ + EInternalRenameInvalidEntry, + + /** + Internal indicator for CopyFromHandle() operation. + This is mapped to CFileMan::ECopyFromHandle. + */ + EInternalCopyFromHandle, + }; + + void CompleteOperationL(); + void DoOperationL(); + void CheckForDirectory(); + void SetFlags(TBool aOverWrite,TBool aRecurse,TBool aScanDirection,TBool aMoveRename); + void GetSrcAndTrg(TParse& aSrcName,TFileName& aTrgName); + void DoSynchronize(TInt aRetVal); + TInt CheckRenameAllowed(const TDesC& aSrcName,const TDesC& aTrgName); + TInt SetupMoveOnSameDrive(TUint aSwitches, TBool& aComplete); + TInt SetupMoveAcrossDrives(TUint aSwitches); + TInt SetupTargetDirectory(TBool aOverWrite, TBool& aComplete); + TBool SrcTrgDrivesIdentical(); + TBool SetupDirectoryForMove(); +private: + void DoAttribsL(); + void DoCopyOrMoveL(); + void DoDeleteL(); + void DoRenameL(); + void DoRmDirL(); + void DoCopyFromHandleL(); + TInt DoCopy(const RFile& aSrcFile, RFile& aDstFile, TInt& aRet); +private: + TParse iTrgFile; + TInternalAction iAction; + TUint iSetMask; + TUint iClearMask; + TTime iTime; + TInt iBytesTransferred; + RFile iSrcFileHandle; + TBool iMovingContents; + TEntry iTmpEntry; + TParse iTmpParse; + TFileName iTmpName1; + TFileName iTmpName2; + +friend void RenameInvalidEntryL(RFs& aFs,TParse& aSrcFile); + }; + + + + +class TFindFile +/** +@publishedAll +@released + +Searches for files and directories. + +Each function has a variant which searches for multiple files/directories, +using one or more wildcard characters in the filename. +If an initial search is successful, further searches can be carried out +using Find() or FindWild(). +You can also retrieve the fully qualified file specification, +and manipulate and interrogate it using the TParse class (or related classes). + +Note that when specifying the path of a directory to search, the path should +always end with a backslash character.When trailing backslash is not present +then it is considered as file. And path will be taken till last backslash. +The client must have appropriate capabilities for the directory to be searched. +For example without ALL FILES Capability, it is not possible to successfully +find any files under \sys\bin directory. + +By default if the file is not found in the current drive the rest of the drives, +excluding the remote ones, will be searched. Using function SetFindMask it is +possible to specify a combination of drive attributes(aMask) that the drives to +be searched must match. + +*/ + { +public: + IMPORT_C TFindFile(RFs& aFs); + IMPORT_C TInt FindByPath(const TDesC& aFileName,const TDesC* aPathList); + IMPORT_C TInt FindByDir(const TDesC& aFileName,const TDesC& aDirPath); + IMPORT_C TInt Find(); + IMPORT_C TInt FindWildByPath(const TDesC& aFileName,const TDesC* aPathList,CDir*& aDirList); + IMPORT_C TInt FindWildByDir(const TDesC& aFileName,const TDesC& aDirPath,CDir*& aDir); + IMPORT_C TInt FindWild(CDir*& aDirList); + IMPORT_C TInt SetFindMask(TUint aMask); + inline const TDesC& File() const; +private: + TInt DoFind(); + TInt DoFindByPath(const TDesC& aFileName,const TDesC* aPathList); + TInt DoFindByDir(const TDesC& aFileName,const TDesC& aDir); + TInt DoFindInDir(); + TInt DoFindNextInPath(); + TInt DoFindNextInDriveList(); +private: + RFs* const iFs; + TParse iFile; + TInt iPathPos; + TInt iCurrentDrive; + TInt iMode; + const TDesC* iPath; + TDriveList iDrvList; + CDir** iDir; + TUint32 iMatchMask; + }; + + + + +/** +@publishedAll +@released + +Contains a list of entries for the files which were opened in +a file server session. + +@see CDir +*/ +typedef CDir CFileList; + + + + +class TOpenFileScan +/** +@publishedAll +@released + +Scans open files to get a list of the entries for all files which are currently +open in a particular file server session. + +NextL() creates a list of the files opened by the session. +The ID of the thread which opened the files listed may be obtained by calling ThreadId(). +If multiple sessions are in use, repeatedly calling NextL() will return a list +of open files in each session. +*/ + { +public: + IMPORT_C TOpenFileScan(RFs& aFs); + IMPORT_C void NextL(CFileList*& aFileList); + IMPORT_C TThreadId ThreadId() const; +private: + RFs* iFs; + TThreadId iThreadId; + TInt iScanPos; + TInt iEntryListPos; + }; + + + + +class TFileText +/** +@publishedAll +@released + +Reads and writes single lines of text to or from a Unicode file. +*/ + { +public: + /** + @internalComponent + */ + enum TFileState + { + EStartOfFile, + ENormal, + EReverse + }; +public: + IMPORT_C TFileText(); + IMPORT_C void Set(RFile& aFile); + IMPORT_C TInt Read(TDes& aDes); + IMPORT_C TInt Write(const TDesC& aDes); + IMPORT_C TInt Seek(TSeek aMode); +private: + void NextRecord(); + TInt CheckForTerminator(TBool& anAnswer); + TInt FillBuffer(); +private: + const TText* iNext; + const TText* iEnd; + TFileState iState; + RFile iFile; + TBuf8<0x100> iReadBuf; + }; + + + + +/** +@publishedAll +@released +*/ +IMPORT_C TBool FileNamesIdentical(const TDesC& aFileName1,const TDesC& aFileName2); + + + +/** +Local drive mapping list - passed as argument to RFs::SetLocalDriveMapping(). + +@publishedPartner +@released +*/ +class TLocalDriveMappingInfo + { +public: + enum TDrvMapOperation {EWriteMappingsAndSet=0,EWriteMappingsNoSet=1,ESwapIntMappingAndSet=2}; +public: + TInt iDriveMapping[KMaxLocalDrives]; + TDrvMapOperation iOperation; + }; +typedef TPckgBuf TLocalDriveMappingInfoBuf; + +/** +Client side plugin API. + +@publishedPartner +@released +*/ +class RPlugin : public RSubSessionBase + { +public: + IMPORT_C TInt Open(RFs& aFs, TInt aPos); + IMPORT_C void Close(); +protected: + IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus) const; + IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TDes8& a1) const; + IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TDes8& a1,TDes8& a2) const; + IMPORT_C TInt DoControl(TInt aFunction) const; + IMPORT_C TInt DoControl(TInt aFunction,TDes8& a1) const; + IMPORT_C TInt DoControl(TInt aFunction,TDes8& a1,TDes8& a2) const; + IMPORT_C void DoCancel(TUint aReqMask) const; + }; + +/** +@publishedPartner +@released + +Specifies that a plugin should determine for itself which drives it attaches to. + +@see RFs::MountPlugin +@see RFs::DismountPlugin +*/ +const TInt KPluginAutoAttach = 0x19; + +/** +@publishedPartner +@released + +Specifies that a plugin should mount on drive Z. + +@see RFs::MountPlugin +@see RFs::DismountPlugin +*/ +const TInt KPluginMountDriveZ = 0x1A; + + +/** +@publishedPartner +@released + +Specifies that a plugin should be mounted on all drives. + +@see RFs::MountPlugin +@see RFs::DismountPlugin +*/ +const TInt KPluginSupportAllDrives = 0x3FFFFFF; //All 26 bits (each corrosponding to a drive) are set to one. + +/** +@publishedPartner +@released + +Used to determine if a plugin is of version 2, meaning it can support drive Z. + +*/ +const TInt KPluginVersionTwo = 0x4000000; //bit 27 is set to one. + +/** +@publishedPartner +@released + +Specifies that a plugin should determine its own position in the plugin stack. + +@see RFs::MountPlugin +@see RFs::DismountPlugin +*/ +const TInt KPluginAutoLocate = 0xC8; + +/** +@publishedAll +@released + +The UID of the File Server process +*/ +const TInt KFileServerUidValue = 0x100039e3; + +enum TSessionFlags +/** +@internalTechnology + +A set of session specific configuration flags. +*/ + { + /** + Notify the user or write failures + */ + EFsSessionNotifyUser = KBit0, + + /** + Notify clients registered for change notification + */ + EFsSessionNotifyChange = KBit1, + + /** + Enables all session flags + */ + EFsSessionFlagsAll = KSet32, + }; + +/** +@internalTechnology +*/ +struct SBlockMapArgs + { + TInt64 iStartPos; + TInt64 iEndPos; + }; + + +/** +@internalTechnology + +Validates the mask used to match drive attributes. + +@see RFs::DriveList +@see TFindFile::SetFindMask +*/ +TInt ValidateMatchMask( TUint aMask); + + + + +#include "f32file.inl" +#endif diff -r c55016431358 -r 0a7b44b10206 symport/f32/inc/f32file.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/f32/inc/f32file.inl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,151 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32\inc\f32file.inl +// +// + + + + +// Class TEntry +inline const TUid& TEntry::operator[](TInt anIndex) const +/** +Gets any one of the file's three UIDs. + +@param anIndex Identifies the UID required. This can be zero, one or + two. Specifiying any other value raises a panic. + +@return On return, contains the requested UID. + +@see TUidType +*/ + {return(iType[anIndex]);} + + + + +inline TBool TEntry::IsUidPresent(TUid aUid) const +/** +Tests whether the specified UID matches any of the UIDs in the UID type. + +@param aUid The UID to be checked. + +@return True if the specified UID is present, false otherwise. + +@see TUidType::IsPresent +@see TUidType +*/ + {return(iType.IsPresent(aUid));} + + + + +inline TBool TEntry::IsTypeValid() const +/** +Test whether the file has a valid UID. + +@return True if the entry has a valid UID, false otherwise. + +@see TUidType::IsValid +@see TUidType +*/ + {return(iType.IsValid());} + + + + +inline TUid TEntry::MostDerivedUid() const +/** +Gets the most derived (i.e. the most specific) UID. + +@return The entry's most derived UID. + +@see TUidType::MostDerived +@see TUidType +*/ + {return(iType.MostDerived());} + + + + +// Returns the entire size of the TEntry... +inline TInt EntrySize(const TEntry& anEntry) + {return(sizeof(TUint)+sizeof(TInt)+sizeof(TTime)+sizeof(TInt)+sizeof(TUidType)+anEntry.iName.Size());} + + + + +// Class TFindFile +inline const TDesC& TFindFile::File() const +/** +Gets the full file specification of a file which was found by a successful +call to any of the search variants that do not accept wildcards. + +The file specification includes drive, path and filename. + +Notes: + +1. When called after a successful search using wildcards the only valid + components of the retrieved file specification are drive letter and + directory. + +@return The full path and filename. +*/ + {return iFile.FullName();} + + + +// Class CDirScan +inline RFs& CDirScan::Fs() + {return(*iFs);} + + + + +// Class TDriveUnit +inline TDriveUnit::operator TInt() const +/** +Converts the drive unit to an integer value. +*/ + {return(iDrive);} + + + + +inline TInt ValidateMatchMask( TUint aMask) +/** +Validates the mask used to match drive attributes. +*/ + { + const TUint matchedFlags= aMask & KDriveAttMatchedFlags; //KDriveAttMatchedFlags = 0xFFF + const TUint matchedAtt = aMask & KDriveAttMatchedAtt; //KDriveAttMatchedAtt = 0x0FFF0000 + + switch(matchedAtt) + { + case KDriveAttExclude: + return matchedFlags==0?KErrArgument:KErrNone; + case KDriveAttExclusive : + return matchedFlags==0?KErrArgument:KErrNone; + case KDriveAttExclude | KDriveAttExclusive: + return matchedFlags==0?KErrArgument:KErrNone; + case KDriveAttAll: + return matchedFlags==0?KErrNone:KErrArgument; + case 0: + return KErrNone; + default: + return KErrArgument; + } + } + +inline void RFs::Close(){} diff -r c55016431358 -r 0a7b44b10206 symport/f32/sfsrv/cl_cli.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/f32/sfsrv/cl_cli.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1339 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32\sfsrv\cl_cli.cpp +// +// + +#include +#include + +#include "cl_std.h" + +#ifdef _WIN32 +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include + +#include +#endif + +// *** +// Map a Posix error to a Symbian error code +// +TInt mapErrSwitch(TInt aErr) + { + switch (aErr) + { + case ENOENT: + return KErrNotFound; + case EACCES: + case EPIPE: + case EROFS: + return KErrAccessDenied; + case EINVAL: + case EISDIR: + case ENOTDIR: + return KErrArgument; + case ENOTEMPTY: + case EBUSY: + return KErrInUse; + case EEXIST: + return KErrAlreadyExists; + case EBADF: + return KErrBadHandle; + case ENOMEM: + return KErrNoMemory; + case EFBIG: + return KErrTooBig; + default: + return -aErr; + } + return aErr; + } + +// *** +// Map a Posix error to a Symbian error code +// +TInt mapErr(TInt aErr) + { + TInt symErr = mapErrSwitch(aErr); + +#ifdef _DEBUG_LOGGING + if (aErr != KErrNone) + RDebug::Print(_L("DEBUG: mapErr> %d => %d\n"), aErr, symErr); +#endif + return symErr; + } + +#ifdef _WIN32 +const char KNativeSlashChar = '\\'; +#else +const char KNativeSlashChar = '/'; +#endif + +// *** +// Is the character a Symbian path separator? +// +TBool IsPathSep(TChar aChar) + { + return aChar == TChar('\\'); + } + +// *** +// Perform posix filename conversions +// +const char* PosixFilename(const TDesC &aIn, TDes8& aOut) + { + aOut.Zero(); + for(TInt pos = 0; pos < aIn.Length(); pos++) + { + TChar c(aIn[pos]); + + // Magic for using epocroot + if (pos == 0 && aIn.Length() >= 7 && IsPathSep(aIn[0]) && aIn.Mid(1, 6).CompareF(_L("epoc32")) == 0) + { + char* epocroot = getenv("EPOCROOT"); + if (epocroot) + { + aOut.Append(TPtrC8(reinterpret_cast(epocroot), strlen(epocroot))); + + // If the last character of EPOCROOT is not a slash then we have to add one + if (aOut[aOut.Length() - 1] != KNativeSlashChar) + aOut.Append(KNativeSlashChar); + + continue; + } + } + +#ifndef _WIN32 + // Drive letters ignored - go back home! + if (pos == 0 && aIn[1] == ':' && IsPathSep(aIn[2])) + { + char* home = getenv("HOME"); + if (home) + aOut.Append(TPtrC8(reinterpret_cast(home), strlen(home))); + pos++; + continue; + } + + // Convert backslashes to forward slashes + if (c == '\\') + { + aOut.Append('/'); + continue; + } + + // Lower case everything + c = c.GetLowerCase(); +#endif + aOut.Append(c); + } + + const char* ret = reinterpret_cast(aOut.PtrZ()); +#ifdef _DEBUG_LOGGING + RDebug::Printf("DEBUG: PosixFilename> %s\n", ret); +#endif + return ret; + } +TBuf8<0x200> gFilenameBuf; +const char* PosixFilename(const TDesC &aIn) + { + // Return the result + return PosixFilename(aIn, gFilenameBuf); + } + +EXPORT_C TBool RFs::IsValidDrive(TInt aDrive) +/** +Tests whether the specified drive number is valid. + +A valid drive number is any number between 0 and (KMaxDrives-1) inclusive, +or the specific value KDefaultDrive (implying the session default drive). + +@param aDrive The drive number. + +@return True if the drive is valid; false if not. + +@see TDriveNumber +*/ + { + return((aDrive>=0 && aDrive='A' && aChar<='Z') + { + aDrive=(TInt)aChar-'A'; + return(KErrNone); + } + return(KErrArgument); + } + +EXPORT_C TInt RFs::DriveToChar(TInt aDrive,TChar& aChar) +/** +Maps a drive number to the corresponding character. + +The drive number must be in the range 0 to (KMaxDrives-1). For example, drive +number zero (EDriveA) corresponds to drive A, one (EDriveB) +corresponds to drive B. For the drive number enumeration, see TDriveNumber. + +The drive number can also be KDefaultDrive, implying the default drive. In this +case the current drive is taken and converted. + +@param aDrive The drive number. +@param aChar On return, contains the drive character. + +@return KErrNone, if successful; + KErrArgument, if the drive number is invalid; + otherwise one of the other system-wide error codes. +*/ + { + + if (aDrive==KDefaultDrive) + { + +#ifdef _WIN32 + RFs fs; + TFileName path; + TInt r=fs.Connect(); + if (r!=KErrNone) + return(r); + r=fs.SessionPath(path); + fs.Close(); + if (r!=KErrNone) + return(r); + + aChar=path[0]; + return(KErrNone); + +#else + + aChar='C'; + + return KErrNone; + +#endif + } + if (!IsValidDrive(aDrive)) + return(KErrArgument); + aChar=aDrive+'A'; + return(KErrNone); + } + +/** +Obtain the system drive number. + +The System Drive is a defined drive on the device which is: + - Read/Writeable + - Internal: Always available and not removable from the device + - Non-Volatile (e.g. Flash memory, battery-backed RAM) + - Only Accessible via Rfs (e.g. not available via USB mass storage) + +The System drive is utilised as: + - Storage for Persistent settings from system and application software + - Storage for Localisation resources + - A Default Drive for user data + - A Target Drive for Software installations + +It the system drive is not set previously (see RFs::SetSystemDrive) EDriveC is returned by default. + +@see RFs::GetSystemDriveChar +@see RFs::SetSystemDrive +@see TDriveNumber +@return TDriveNumber contains the drive number of the system drive. + */ +EXPORT_C TDriveNumber RFs::GetSystemDrive() + { + return EDriveC; + } + +/** +This is a wrapper around GetSystemDrive() function. It returns the character corresponding to the system drive. + +@parameter aDriveChar On return, contains the system drive character +@return KErrNone if successful, otherwise one of the other system-wide error codes +@see RFs::GetSystemDrive +*/ +EXPORT_C TChar RFs::GetSystemDriveChar() + { + return 'A' + GetSystemDrive(); + } + +EXPORT_C TInt RFs::Connect(TInt) +/** +Connects a client to the file server. + +To end the file server session, use Close(). + +@param aMessageSlots The number of message slots required. The default value of + KFileServerDefaultMessageSlots indicates that message + slots will be acquired dynamically from the system + wide pool. Override this value with a fixed number, if + a fixed number of slots are to be allocated to the session. + If overriding, note that the number of message slots + represents the number of operations, such as reads + and writes, that can be outstanding at once; + always remember to provide a spare slot for + the cancel operation. + +@return KErrNone, if successful, otherwise one of the other system-wide + error codes. +*/ + { + return KErrNone; + } + +EXPORT_C TInt RFs::Drive(TDriveInfo& anInfo, TInt aDrive) const +/** +Gets information about a drive and the medium mounted on it. + +Note that Volume() can also be used to give information about the drive and +the volume mounted on it. These two functions are separate because, while +the characteristics of a drive cannot change, those of a +volume can, by mounting different media, reformatting etc. + +@param anInfo On return, contains information describing the drive + and the medium mounted on it. The value of TDriveInfo::iType + shows whether the drive contains media. +@param aDrive The drive for which information is requested. + Specify KDefaultDrive for the session default drive. + Specify a drive in the range EDriveA to EDriveZ for drives + A to Z respectively. + +@return KErrNone, if successful, otherwise one of the other + system-wide error codes. + +@see RFs::Volume +*/ + { + if (aDrive != EDriveC && aDrive != KDefaultDrive) + return KErrBadName; + + anInfo.iType = EMediaHardDisk; + anInfo.iBattery = EBatNotSupported; + anInfo.iDriveAtt = KDriveAttLocal|KDriveAttInternal; + anInfo.iMediaAtt = 0; + + return KErrNone; + } + +EXPORT_C TInt RFs::SessionPath(TDes& aPath) const +/** +Gets the session path. + +When a client connects to the file server, its session path is initialised to +the system default path. The session path of an existing client can only be +changed by this function. + +@param aPath On return, contains the session path, including a trailing + backslash. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. +*/ + { + +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: SessionPath\n"), &aPath); + +#endif + + + TBuf8 copy; + copy.Copy(aPath.Left(KMaxFileName)); + + // As the system for the current work directory + const char* path = reinterpret_cast(copy.PtrZ()); + if (getcwd(const_cast(path), copy.MaxLength() - 1) == NULL) + return mapErr(errno); + + // Get the length of the data + TInt len = strlen(path); + copy.SetLength(len); + + // We need one extra character of space for the backslash on the end + if (len == KMaxFileName) + return KErrOverflow; + + // Make sure we use backslash rather than forward + while(len--) + { + if (copy[len] == '/') + copy[len] = '\\'; + } + + // Copy the data and append a back slash, as Symbian expects it + aPath.Copy(copy); + aPath.Append(TChar('\\')); + + return KErrNone; + } + +EXPORT_C TInt RFs::SetSessionPath(const TDesC& aPath) +/** +Sets the session path for the current file server client. + +When the client first connects to the file server, its session path +is initialised to the system default path. + +Note that the session path is text-only. It does not cause any locking. +Thus, although the path must be syntactically correct, its components +do not need to be valid at the time the path is set, and any component may be +deleted, removed or unmounted while the path is set. + +On TOOLS2 this function modifies the session path for ALL RFs sessions. + +@param aPath The new session path. Consists of a drive and path. Normally, a + drive should be specified, but if not, the drive specified in + the existing session path is preserved. If a file is specified, + then the function fails and returns an error code. Therefore, + the final component in the path must have a trailing backslash + to indicate that it is a directory. All components of the + path must be syntactically correct, for example, wildcard + characters and double backslashes are not allowed in any + part of it. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +@capability Dependent If aPath is /Sys then AllFiles capability is required. +@capability Dependent If aPath begins with /Private and does not match this process' SID + then AllFiles capability is required. + +*/ + { + +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: SetSessionPath> path=%S\n"), &aPath); + +#endif + + + const char* name = PosixFilename(aPath); + if (chdir(name) != 0) + return mapErr(errno); + return KErrNone; + } + +/** +Makes a directory. + +It should be a sub-directory of an existing directory and its name should be +unique within its parent directory, otherwise the function returns error code KErrAlreadyExists. + +Note that if a filename is specified in the argument, it is ignored. +Therefore, there should be a trailing backslash after the final +directory name in the argument to indicate that it is a directory, not a filename. + +For example, following code will create directory "C:\\DIR1\\" + +@code +fs.MkDir(_L("C:\\DIR1\\")); +@endcode + +The last line in the following example will result in KErrAlreadyExists because "DIR2" doesn't have a trailing backslash, +therefore is considered as a file name and discarded. Directory "C:\\DIR1\\" has already been created. + +@code +fs.MkDir(_L("C:\\DIR1\\")); // shall create DIR1 in the root directory +fs.MkDir(_L("C:\\DIR1\\DIR2")); // No trailing backslash, fails with KErrAlreadyExists +@endcode + +This example will always fail because "DIR1" doesn't have a trailing backslash and discarded while the root +directory always exists. + +@code +fs.MkDir(_L("C:\\DIR1")); // No trailing backslash, will always fail with KErrAlreadyExists +@endcode + +Note, the following case + +@code +fs.MkDir(_L("C:\\example.txt\\")); // would normally create a directory "c:\\example.txt\\" with KErrNone +@endcode + +But if there is a file named "example.txt", which exists at the same location, KErrAccessDenied is returned. + +Note also that because this method can return an error code (eg. because +the disk is full) before checking whether the path already exists, it +is not appropriate to use it just to work out whether a path exists or not. + +See MkDirAll(), which may also create intermediate directories. + +@param aPath The name of the new directory. Any path components which are + not specified here will be taken from the session path. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. Even if another error code is returned, + (for example, if the disk is full) it is still possible that the + path may already exist. + +@capability Dependent If aPath is /Sys then Tcb capability is required. +@capability Dependent If aPath begins with /Private and does not match this process' SID + then AllFiles capability is required. +@capability Dependent If aPath is /Resource then Tcb capability is required. + +@see RFs::MkDirAll +*/ +EXPORT_C TInt RFs::MkDir(const TDesC& aPath) + { +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: MkDir> path=%S\n"), &aPath); + +#endif + + + + // Skip the file on the end + TInt len = aPath.Length(); + while(len > 0 && !IsPathSep(aPath[len-1])) + len--; + TPtrC path(aPath.Left(len)); + + // Check if it exists already + TUint att; + if (RFs::Att(path, att) == KErrNone) + { + if (att&KEntryAttDir) + return KErrAlreadyExists; + else + // A file exists with the same name + return KErrAccessDenied; + } + const char* name = PosixFilename(path); + +#ifdef _WIN32 + if (mkdir(name) != 0) +#else + if (mkdir(name, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) +#endif + return mapErr(errno); + return KErrNone; + } + +/** +Makes one or more directories. + +Any valid path component specified in aPath which does not already exist is +created as a directory. + +Note that if a filename is specified in the argument, it is ignored. +Therefore, there should be a trailing backslash after the final +directory name in the argument to indicate that it is a directory, not a +filename. + +See also notes on RFs::MkDir() about trailing backslashes in directory names. + +Note also that because this method can return an error code (eg. because +the disk is full) before checking whether the path already exists, it +is not appropriate to use it just to work out whether a path exists or not. + +See MkDir(), which creates only a single new directory. + +@param aPath The path name specifiying the directory or directories to + create. If the function completes successfully, this path + identifies a valid directory. Any path components which are not + specified here are taken from the session path. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. Even if another error code is returned, + (for example, if the disk is full) it is still possible that the + path may already exist. + + +@capability Dependent If aPath is /Sys then Tcb capability is required. +@capability Dependent If aPath begins with /Private and does not match this process' SID + then AllFiles capability is required. +@capability Dependent If aPath is /Resource then Tcb capability is required. + +@see RFs::MkDir +*/ +EXPORT_C TInt RFs::MkDirAll(const TDesC& aPath) + { +#ifdef _DEBUG_LOGGING + RDebug::Print(_L("DEBUG: MkDirAll> path=%S\n"), &aPath); +#endif + + // Skip the file on the end + TInt len = aPath.Length(); + while(len > 0 && !IsPathSep(aPath[len-1])) + len--; + TPtrC path(aPath.Left(len)); + + // Check if it exists already + TUint att; + if (RFs::Att(path, att) == KErrNone) + { + if (att&KEntryAttDir) + return KErrAlreadyExists; + else + // A file exists with the same name + return KErrAccessDenied; + } + + // Skip drive letter + TInt start = 1; + if (len >= 3 && path[1] == TChar(':') && IsPathSep(path[2])) + { + start = 3; + } + + for (TInt pos = start; pos < len; pos++) + { + if (IsPathSep(path[pos])) + { + TPtrC parent(path.Ptr(), pos + 1); + + TUint att; + TInt err = RFs::Att(parent, att); + if (err == KErrNotFound) + { + TInt err = RFs::MkDir(parent); +#ifdef _DEBUG_LOGGING + RDebug::Print(_L("DEBUG: MkDirAll> parent=%S err=%d\n"), &parent, err); +#endif + if (err != KErrNone) + return err; + } + else if (!(att & KEntryAttDir)) + { + // Path element is not a directory + return KErrAccessDenied; + } + } + } + return KErrNone; + } + +EXPORT_C TInt RFs::RmDir(const TDesC& aPath) +/** +Removes a directory. + +The directory must be empty and cannot be the root directory. + +Note that if a filename is specified in the argument, it is +ignored. + +For example, following code will result in directory "C:\\SRC\\" being removed as long as +it is empty, the existance of "ENTRY" will not be checked: + +@code +fs.RmDir(_L("C:\\SRC\\ENTRY")); +@endcode + +Similarly, following code will try to remove "C:\\SRC\\" instead of "C:\\SRC\DIR\\": +@code +fs.RmDir(_L("C:\\SRC\\DIR")); +@endcode + +Therefore, there should be a trailing backslash after the final +directory name in the argument to indicate that it is a directory, not a +filename. + +See class CFileMan for information on deleting a +non-empty directory and all of its contents. + +@param aPath The path name of the directory to be removed. Any path components + which are not specified here are taken from the session path. Only + the lowest-level directory identified is removed. + +@return KErrNone, if successful; + KErrInUse, if trying to remove a non-empty directory or root directory; + otherwise, one of the other system-wide error codes. + +@capability Dependent If aPath is /Sys then Tcb capability is required. +@capability Dependent If aPath begins with /Private and does not match this process' SID + then AllFiles capability is required. +@capability Dependent If aPath is /Resource then Tcb capability is required. + +@see CFileMan +*/ + { + +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: RmDir> path=%S\n"), &aPath); + +#endif + + + // Skip the file on the end + TInt len = aPath.Length(); + while(len > 0 && !IsPathSep(aPath[len-1])) + len--; + TPtrC path(aPath.Left(len)); + + // Return error on an attempt to delete root! + if (len == 0 || (len <= 2 && IsPathSep(path[0])) || (len >= 3 && len < 5 && path[1] == TChar(':') && IsPathSep(path[2]))) + return KErrInUse; + + // Return an error if the directory doesn't exist or isn't a directory + TUint att; + if (RFs::Att(path, att) != KErrNone || !(att&KEntryAttDir)) + return KErrNotFound; + + const char* name = PosixFilename(path); + if (rmdir(name) != 0) + return mapErr(errno); + return KErrNone; + } + +EXPORT_C TInt RFs::Parse(const TDesC& aName, TParse& aParse) const +/** +Parses a filename specification. + +Parsing is done with wildcard resolution, using the session path as +the default. You can then use TParse's getter functions to extract individual +components of the resulting name. All the path components that are included +in aName are put into the resulting filename. Any components that are still +missing are taken from the session path. + +Specifying: + +@code +TParse fp; +@endcode +@code +fs.Parse(name,fp); +@endcode + +is equivalent to + +@code +TParse fp; +@endcode +@code +fp.Set(name,NULL,&fs.SessionPath()); +@endcode + +Note that the function does not check for illegal characters, or for +illegal path components in either of the paths specified. + +@param aName The file name to be parsed, using the session path to provide + the missing components. +@param aParse A TParse objct that provides functions for + extracting individual components of the resulting file name. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. +*/ + { + TFileName session_path; + TInt r = SessionPath(session_path); + if (r==KErrNone) + r = aParse.Set(aName, NULL, &session_path); + return r; + } + +EXPORT_C TInt RFs::Parse(const TDesC& aName,const TDesC& aRelated,TParse& aParse) const +/** +Parses a filename specification, specifying related file path components. + +Parsing is done with wildcard resolution, using the session path as +the default. You can then use TParse's getter functions to extract individual +components of the resulting name. All the path components that are included +in aName are put into the resulting filename. Any missing components are taken +from the optional aRelated argument, which has the next order of precedence. +Finally, any components that are still missing are taken from the session path. + +Specifying: + +@code +TParse fp; +@endcode +@code +fs.Parse(name,related,fp); +@endcode + +is equivalent to + +@code +TParse fp; +@endcode +@code +fp.Set(name,related,&fs.SessionPath()); +@endcode + +Note that the function does not check for illegal characters, or for +illegal path components in any of the paths specified. + +@param aName The file name to be parsed, using the session path and the + related path to provide the missing components. +@param aRelated The related file specification. +@param aParse A TParse objct that provides functions for + extracting individual components of the resulting file name. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. +*/ + { + TFileName session_path; + TInt r = SessionPath(session_path); + if (r==KErrNone) + r = aParse.Set(aName, &aRelated, &session_path); + return r; + } + +EXPORT_C TInt RFs::Delete(const TDesC& aName) +/** +Deletes a single file. + +Wildcards are not allowed in either the file name or the extension, +otherwise an error is returned. + +Note that the file must be closed and must not be read-only. +Hidden files can be deleted but system files cannot. + +See class CFileMan for information on deleting multiple files. + +@param aName The name of the file to be deleted. Any path components which + are not specified here will be taken from the session path. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +@capability Dependent If aName is /Sys then Tcb capability is required. +@capability Dependent If aName begins with /Private and does not match this process' SID + then AllFiles capability is required. +@capability Dependent If aName is /Resource then Tcb capability is required. + +@see CFileMan +*/ + { + +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Delete> name=%S\n"), &aName); + +#endif + + + + TUint att; + + TInt err = Att(aName, att); + + if (err != KErrNone) + + return err; + + + + // Don't allow deletion of directories + + if (att & KEntryAttDir) + + return KErrAccessDenied; + + + const char* name = PosixFilename(aName); + if (remove(name) != 0) + return mapErr(errno); + return KErrNone; + } + +EXPORT_C TInt RFs::Rename(const TDesC& anOldName, const TDesC& aNewName) +/** +Renames a single file or directory. + +It can also be used to move a file or directory by specifying different +destination and source directories. If so, the destination and source +directories must be on the same drive. If a directory is moved, then +the directory structure beneath it is also moved. + +If a directory specified by aNewName is different from one specified +by anOldName, then the file or directory is moved to the new directory. +The file or directory cannot be moved to another device by this means, +either explicitly (by another drive specified in the name) or implicitly +(because the directory has been mapped to another device with SetSubst(). + +The function fails and returns an error code in the following +circumstances: + +1. If either the old or new name includes wildcards. + +2. If a file or directory with the new name already exists in + the target directory. Overwriting is not permitted. + +3. If file anOldName does not exist, or is open. + +Read-only, system and hidden files may be renamed. The renamed +file's attributes are preserved. + +Note that when this function is operating on directories, a trailing backslash +is not required after the final directory name in either anOldName or aNewName. + +See class CFileMan for information on renaming multiple files. + +@param anOldName File or directory to be renamed. Any path components which are + not specified here will be taken from the session path. +@param aNewName Path specifying the new name for the file or directory and/or + its new parent directory. All directories specified in this path + must exist. + Any path components which are not specified here will be taken + from the session path. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +@capability Dependent If either anOldName or aNewName is /Sys then Tcb capability is required. +@capability Dependent If either anOldName or aNewName begins with /Private and does not match + this process' SID then AllFiles capability is required. +@capability Dependent If either anOldName or aNewName is /Resource then Tcb capability is required. + +@see CFileMan +*/ + { +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Rename> old=%S new=%S\n"), &anOldName, &aNewName); + +#endif + + + + // Lose path separator on the end + TInt len = anOldName.Length(); + while(len > 0 && IsPathSep(anOldName[len-1])) + len--; + + TBuf8 copyold; + const char* oldname = PosixFilename(anOldName, copyold); + + + // If new file exists already - return an error + + TUint newAtt; + + if (Att(aNewName, newAtt)== KErrNone) + + return KErrAlreadyExists; + + + // Lose path separator on the end + len = aNewName.Length(); + while(len > 0 && IsPathSep(aNewName[len-1])) + len--; + + TBuf8 copynew; + const char* newname = PosixFilename(aNewName, copynew); + + if (rename(oldname, newname) != 0) + return mapErr(errno); + return KErrNone; + } + +EXPORT_C TInt RFs::Replace(const TDesC& anOldName, const TDesC& aNewName) +/** +Replaces a single file with another. + +This function does not support the use of wildcards. Unlike Rename(), it only +applies to files. + +This function operates as follows: + +1. if the aNewName file does not exist, it is created. + +2. anOldName's contents, attributes and the date and time of its last + modification are copied to file aNewName, overwriting any existing contents + and attribute details. + +3. anOldName is deleted. + +anOldName may be hidden, read-only or a system file. However, +neither anOldName, nor, if it exists, aNewName, can be open; +aNewName must not be read-only. +Both files must be on the same drive. + +@param anOldName The file to be replaced. Must exist and must be closed. It is + deleted by this function. +@param aNewName The file to replace anOldName. Does not need to exist, but if + it does exist, it must be closed. If it exists, its name + remains unchanged but its contents, attributes and the date + and time of its last modification are replaced by those + of anOldName. + If it does not exist, it will be created and is assigned + the contents and attributes of anOldName. Must not be followed + by a trailing backslash. + +@return KErrNone, if successful; + KErrAccessDenied, if an attempt is made to replace a directory; + otherwise one of the other system-wide error codes. + +@capability Dependent If either anOldName or aNewName is /Sys then Tcb capability is required. +@capability Dependent If either anOldName or aNewName begins with /Private and does not match + this process' SID then AllFiles capability is required. +@capability Dependent If either anOldName or aNewName is /Resource then Tcb capability is required. + +*/ + { +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Replace> old=%S new=%S\n"), &anOldName, &aNewName); + +#endif + + + + TInt err = RFs::Delete(aNewName); + if (err aName=%S\n"), &aName); +#endif + + TBuf copy; + copy.Copy(aName.Left(KMaxFileName)); + + // Get rid of trailing backslash or forward slash + if (copy.Length() > 0 && IsPathSep(copy[copy.Length() - 1])) + copy.SetLength(copy.Length() - 1); + + // It seems you can't retrieve the attributes of root + if (copy.Length() == 0 || (copy.Length() == 2 && copy[1] == ':')) + return KErrBadName; + + const char* name = PosixFilename(copy); + + struct stat sb; + if(stat(name, &sb) != 0) + return mapErr(errno); + + aAttValue = 0; + if (S_ISREG(sb.st_mode)) + aAttValue = KEntryAttNormal; + else if(S_ISDIR(sb.st_mode)) + aAttValue |= KEntryAttDir; + + // Bit Value Specifier File Directory + // 0 1 x executable can search directory + // 1 2 w write access can modify (delete/add files) + // 2 4 r read access read access + + // Test readonly flag - no write access + if (!(sb.st_mode & 0222)) + aAttValue |= KEntryAttReadOnly; + + return KErrNone; + } + +EXPORT_C TInt RFs::SetAtt(const TDesC& aName, TUint aSetAttMask, TUint aClearAttMask) +/** +Sets or clears the attributes of a single file or directory. + +The function uses two bitmasks. The first bitmask specifies the attributes +to be set; the second specifies the attributes to be cleared. + +An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote +attributes have no effect. + +@param aName File or directory name. Any path components which are not + specified here will be taken from the session path. Must + not include wildcard characters. The file must be closed. +@param aSetAttMask Bitmask indicating the attributes to be set. +@param aClearAttMask Bitmask indicating the attributes to be cleared. For more + information, see KEntryAttNormal and the other file or + directory attributes. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +@panic FSCLIENT 21 if any attribute appears in both bitmasks. + + +@capability Dependent If aName is /Sys then Tcb capability is required. +@capability Dependent If aName begins with /Private and does not match + this process' SID then AllFiles capability is required. +@capability Dependent If aName is /Resource then Tcb capability is required. + +@see RFs::SetEntry + +*/ + { + +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: SetAtt> aName=%S set=%x clear=%x\n"), &aName, aSetAttMask, aClearAttMask); + +#endif + + + const char* name = PosixFilename(aName); + struct stat sb; + if(stat(name, &sb) != 0) + return mapErr(errno); + + // Clear readonly flag - write access + if (aClearAttMask&KEntryAttReadOnly) + sb.st_mode |= 0222; + + // Set readonly flag - no write access + if (aSetAttMask&KEntryAttReadOnly) + sb.st_mode &= ~0222; + + return mapErr(chmod(name, sb.st_mode)); + } + +EXPORT_C TInt RFs::Modified(const TDesC& aName,TTime& aTime) const +/** +Gets the last modification date and time of a file or a directory, +in UTC. + +If there has been no modification, the function gets the date and +time of the file or directory's creation. + +@param aName File or directory name. +@param aTime On return, contains the date and time of the file or + directory's last modification in universal time. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +@capability Dependent If aName contains /sys/ then AllFiles capability is required. +@capability Dependent If aName contains /Private/ and does not match + this process' SID then AllFiles capability is required. + +*/ + { + + TEntry e; + TInt r=Entry(aName,e); + if (r==KErrNone) + aTime=e.iModified; + return(r); + } + +TInt ReadUid(const char* aName,TEntry& anEntry) +// +// Read the entry uid if present +// + { + FILE* hFile = fopen(aName, "rb"); + if (!hFile) + return KErrGeneral; + + // First check to see if the first sixteen bytes form a valid UID + TBuf8 checkedUidBuf; + checkedUidBuf.SetLength(sizeof(TCheckedUid)); + TInt ret = fread(&checkedUidBuf[0], sizeof(TCheckedUid), 1, hFile); + fclose(hFile); + if (ret != 1) + return KErrCorrupt; + + TCheckedUid checkedUid(checkedUidBuf); + if(checkedUid.UidType()!=TUidType(TUid::Null(),TUid::Null(),TUid::Null())) + anEntry.iType=checkedUid.UidType(); + + return KErrNone; + } + +EXPORT_C TInt RFs::Entry(const TDesC& aName, TEntry& anEntry) const +/** +Gets the entry details for a file or directory. + +This information includes UID information. + +@param aName Name of file or directory. +@param anEntry On return, contains the entry details for the file or directory. TEntry::iModified contains UTC date and time. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +@capability Dependent If aName contains "\\Sys\\" and includes an additional file or directory then AllFiles capability + is required. For example, the paths "c:\\sys" and "c:\\sys\\" will always be readable, whereas + the path "c:\\sys\\abc\\" will only be readable with AllFiles capability. + +@capability Dependent If aName contains \\Private\\ and includes an additional file, or a directory which does not match + this process' SID, then AllFiles capability is required. For example, the paths "c:\\private" and + "c:\\private\\" will always be readable, whereas the path "c:\\private\\\\" will only be + readable with AllFiles capability or if matches the process' SID. +*/ + { + +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Entry> aName=%S\n"), &aName); + +#endif + + + TInt err = RFs::Att(aName, anEntry.iAtt); + if (err < KErrNone) + return err; + + struct stat sb; + TBuf copy; + copy.Copy(aName.Left(KMaxFileName)); + + // Get rid of trailing backslash + if (copy.Length() > 0 && IsPathSep(copy[copy.Length() - 1])) + copy.SetLength(copy.Length() - 1); + + const char* name = PosixFilename(copy); + if(stat(name, &sb) < 0) + return KErrNotFound; + + + // On Symbian directories have zero size + anEntry.iSize = (anEntry.iAtt&KEntryAttDir) ? 0 : sb.st_size; + + anEntry.iType = TUidType(TUid::Null(), TUid::Null(), TUid::Null()); + ReadUid(name, anEntry); + + struct tm *tm = gmtime(&sb.st_mtime); + anEntry.iModified = TDateTime(1900 + tm->tm_year, TMonth(tm->tm_mon), tm->tm_mday - 1, tm->tm_hour, tm->tm_min, tm->tm_sec, 0); + + // Just return the name + TInt start = aName.LocateReverse('\\'); + if (start > 0) + { + if (anEntry.iAtt&KEntryAttDir) + { + anEntry.iName = aName.Left(start); + start = anEntry.iName.LocateReverse('\\'); + if (start > 0) + anEntry.iName = anEntry.iName.Mid(start + 1); + } + else + anEntry.iName = aName.Mid(start + 1); + } + else + anEntry.iName = aName; + + return KErrNone; + } + +EXPORT_C TInt RFs::SetEntry(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask) +/** +Sets both the attributes and the last modified date and time for a file or directory. + +The function uses two bitmasks. The first bitmask determines +which attributes should be set. The second bitmask determines which should be cleared. + +An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote +attributes have no effect. + +@param aName File or directory name. +@param aTime New date and time. UTC date and time should be used. +@param aSetAttMask Bitmask indicating which attributes are to be set. +@param aClearAttMask Bitmask indicating which attributes are cleared. For more + information, see KEntryAttNormal, and the other file + or directory attributes. + +@return KErrNone, if successful; + KErrInUse, if the file is open; + otherwise one of the other system-wide error codes. + +@panic FSCLIENT 21 if any attribute appears in both bitmasks. + +@capability Dependent If aName is /Sys then Tcb capability is required. +@capability Dependent If aName begins with /Private and does not match + this process' SID then AllFiles capability is required. +@capability Dependent If aName is /Resource then Tcb capability is required. + +@see KEntryAttNormal +@see KEntryAttDir +@see KEntryAttVolume +*/ + { + // No way to set modified date + return SetAtt(aName, aSetAttMask, aClearAttMask); + } + +TInt gBlockSize = 4096; +TInt gClusterSize = 4096; +EXPORT_C TInt RFs::VolumeIOParam(TInt aDriveNo, TVolumeIOParamInfo& aParamInfo) const +/** +This function queries a set of I/O parameters on the specified volume, this includes the block size of underlying media, +cluster size of the mounted file system and the recommended read/write buffer sizes. + +The volume information is retuned through aParamInfo. Even if VolumeIOParam() returns successful, errors +can effect the return value of each field within aParamInfo. + +@param aDrive A drive number, specifies which volume to query. +@param aParamInfo A TVolumeIOParamInfo containing the volume parameters. + +@return KErrNone if successful; otherwise, another system wide error code is returned. +*/ + { + aParamInfo.iBlockSize = gBlockSize; + aParamInfo.iClusterSize = gClusterSize; + aParamInfo.iRecReadBufSize = 4096; + aParamInfo.iRecWriteBufSize = 4096; + return KErrNone; + } + +EXPORT_C TInt RFs::SetErrorCondition(TInt anError, TInt aCount) + { + return KErrNotSupported; + } + +void Panic(TClientPanic aPanic) +// +// Panic the current client with a file server client side panic. +// + { + + User::Panic(_L("FSCLIENT panic"),aPanic); + } diff -r c55016431358 -r 0a7b44b10206 symport/f32/sfsrv/cl_drive.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/f32/sfsrv/cl_drive.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,127 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32\sfsrv\cl_drive.cpp +// +// + +#include "cl_std.h" + + + + +EXPORT_C TDriveUnit::TDriveUnit(TInt aDrive) +/** +Constructor taking a drive number. + +@param aDrive The drive number. + +@panic FSCLIENT 0 if aDrive is greater than or equal to KMaxDrives or less than 0. + +@see KMaxDrives +*/ + { + __ASSERT_ALWAYS((aDrive>=0 && aDrive; //-- initialise broken descriptor + } + + + + +EXPORT_C TBool TEntry::IsReadOnly() const +/** +Tests whether the file or directory is read-only. + +@return ETrue if entry is read-only, EFalse if not. + +@see KEntryAttReadOnly +*/ + { + return(iAtt&KEntryAttReadOnly); + } + + + + +EXPORT_C TBool TEntry::IsHidden() const +/** +Tests whether the file or directory is hidden. + +@return ETrue if entry is hidden, EFalse if not. + +@see KEntryAttHidden +*/ + { + + return(iAtt&KEntryAttHidden); + } + + + + +EXPORT_C TBool TEntry::IsSystem() const +/** +Tests whether the file or directory has the system attribute set. + +@return ETrue if entry is a system entry, EFalse if not. + +@see KEntryAttSystem +*/ + { + + return(iAtt&KEntryAttSystem); + } + + + + +EXPORT_C TBool TEntry::IsDir() const +/** +Tests whether the entry is a directory. + +@return ETrue if entry indicates a directory, EFalse if not. + +@see KEntryAttDir +*/ + { + + return(iAtt&KEntryAttDir); + } + + + + +EXPORT_C TBool TEntry::IsArchive() const +/** +Tests whether the file is an archive file. + +@return ETrue if file is archive, EFalse if not. + +@see KEntryAttArchive +*/ + { + + return(iAtt&KEntryAttArchive); + } + + + + +EXPORT_C TEntryArray::TEntryArray() + : iCount(0) +/** +Default constructor. + +Initialises its count of contained TEntry objects to zero. +*/ + {} + + + + +EXPORT_C TInt TEntryArray::Count() const +/** +Gets the number of entries in the array. + +@return The number of entries in the array. +*/ + { + + if (iCount==KCountNeeded) + { + const TEntry* pE=(const TEntry*)iBuf.Ptr(); + const TEntry* pEnd=PtrAdd(pE,iBuf.Length()); + TInt c=0; + while (pE +#include + +#include +#include +#include +#include + +class TFileInfo + { +public: + FILE* iHandle; + TFileName iName; + TUint iMode; + }; + +#define GETFILEHANDLE(A,B) TFileInfo* A; memcpy(&A, B, 4); +#define FILEHANDLE(A) GETFILEHANDLE(A,this); + +extern TInt mapErr(TInt); +extern const char* PosixFilename(const TDesC &aIn); +extern const char* PosixFilename(const TDesC &aIn, TDes8& aOut); + +/** +Make a duplicate of the passed file handle in the same thread. + +By default, any thread in the process can use the duplicated handle to access the +file. However, specifying EOwnerThread as the second parameter to this function, +means that only the creating thread can use the handle. + +@param aFile The file handle to duplicate +@param aType An enumeration whose enumerators define the ownership of this + handle. If not explicitly specified, EOwnerProcess is taken + as default. + +@return one of the other system-wide error codes. +*/ +EXPORT_C TInt RFile::Duplicate(const RFile& aFile, TOwnerType aType) + { + GETFILEHANDLE(h,&aFile); + TFileName name(h->iName); + RFs fs; // This doesn't actually get used in the Open function + TUint mode = h->iMode; + + // Get the file position + TInt pos = ftell(h->iHandle); + if (pos < 0) + return mapErr(errno); + + // Open the file + TInt err = Open(fs, name, mode); + if (err != KErrNone) + return err; + + // Set the file position + return Seek(ESeekStart, pos); + } + +EXPORT_C TInt RFile::Name(TDes &aName) const +/** +Gets the final part of a filename + +This is used to retrieve the name and extension of a file that has been +passed from one process to another using the RFile::AdoptXXX() methods. + +@param aName On return, contains the name of the file, including the name and + extension but excluding the drive letter and path. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +*/ + { + FILEHANDLE(h); + TParsePtrC ptr(h->iName); + aName = ptr.NameAndExt(); + return KErrNone; + } + + +EXPORT_C TInt RFile::FullName(TDes& aName) const +/** +Gets the full filename + +This is used to retrieve the full filename, including drive and path, +of a file that has been passed from one process to another using the +RFile::AdoptXXX() methods. + +@param aName On return, contains the full name of the file, including drive and path. + +@return KErrNone if successful, otherwise one of the other + system-wide error codes. + +*/ + { + FILEHANDLE(h); + aName = h->iName; + return KErrNone; + } + + + +/* +"r" Open a text file for reading +"r+" Open a text file for read/write + +"rb" Open a binary file for reading +"rb+" Open a binary file for read/write + +"w" Create a text file for writing +"w+" Create a text file for read/write + +"wb" Create a binary file for writing +"wb+" Create a binary file for read/write + +"a" Append to a text file +"ab" Append to a binary file +*/ +void GetFileMode(TDes8& aBuf, TUint aFileMode, TBool aOpen) + { + if (aOpen) + { + if (aFileMode & EFileWrite) + // Open a binary file for read/write + aBuf = _L8("rb+"); + else + // Open a binary file for reading + aBuf = _L8("rb"); + } + else + // Create a binary file for read/write + aBuf = _L8("wb+"); + } + +TInt DoOpen(RFile* aFile, const TDesC &aName, TUint aFileMode, TBool aOpen) + { + const char* name = PosixFilename(aName); + + TFileInfo* info = new TFileInfo; + if (!info) + return KErrNoMemory; + + TBuf8<4> mode; + GetFileMode(mode, aFileMode, aOpen); + info->iHandle = fopen(name, reinterpret_cast(mode.PtrZ())); + +#ifdef _DEBUG_LOGGING + RDebug::Print(_L("DEBUG: DoOpen> file=%S id=%x\n"), &aName, info->iHandle); +#endif + + if (!info->iHandle) + { + delete info; + return mapErr(errno); + } + + // Symbian expects file pos at the begining + if (aOpen && aFileMode|EFileWrite) + { + if (fseek(info->iHandle, 0, SEEK_SET) != 0) + { + fclose(info->iHandle); + delete info; + return mapErr(errno); + } + } + + info->iName = aName; + info->iMode = aFileMode; + memcpy(aFile, &info, 4); + return KErrNone; + } + +EXPORT_C TInt RFile::Open(RFs& aFs, const TDesC& aName, TUint aFileMode) +/** +Opens an existing file for reading or writing. + +If the file does not already exist, an error is returned. + +Notes: + +1. To close the file, use Close() + +2. Attempting to open a file with the read-only attribute using the EFileWrite + access mode results in an error. + +3. Attempting to open a file which is greater than or equal to 2GByte (2,147,483,648 bytes) + will fail with KErrTooBig + +4. After a file has been opened, the current write position is set to the start + of the file. + If necessary, use RFile::Seek() to move to a different position within + the file. + +@param aFs The file server session. +@param aName The name of the file. Any path components (i.e. drive letter + or directory), which are not specified, are taken from + the session path. +@param aMode The mode in which the file is opened. See TFileMode. + +@return KErrNone if successful, otherwise one of the other system-wide + error codes. + +@see TFileMode + +@capability Dependent If the path for aName is /Sys and aMode is neither + EFileShareReadersOnly nor EFileRead then Tcb capability is required. +@capability Dependent If the path for aName is /Sys and aMode is either + EFileShareReadersOnly or EFileRead then Allfiles capability is required. +@capability Dependent If the path for aName begins with /Private and does not match this process' + SID then AllFiles capability is required. +@capability Dependent If the path for aName begins with /Resource and aMode is neither + EFileShareReadersOrWriters|EFileRead nor EFileShareReadersOnly + nor EFileRead then Tcb capability is required. + +*/ + { +#ifdef _DEBUG_LOGGING + RDebug::Print(_L("DEBUG: RFile::Open> name=%S mode=%x\n"), &aName, aFileMode); +#endif + + return DoOpen(this, aName, aFileMode, ETrue); + } + +EXPORT_C void RFile::Close() +/** +Closes the file. + +Any open files are closed when the file server session is closed. + +Close() is guaranteed to return, and provides no indication whether +it completed successfully or not. When closing a file you have written to, +you should ensure that data is committed to the file by invoking RFile::Flush() +before closing. If Flush() completes successfully, Close() is essentially a +no-operation. +*/ + { + FILEHANDLE(h); + if (h) + { + fflush(h->iHandle); + fclose(h->iHandle); + delete h; + + // Make sure the handle is null + memset(this, 0, 4); + } + } + +EXPORT_C TInt RFile::Create(RFs& aFs, const TDesC& aName, TUint aFileMode) +/** +Creates and opens a new file for writing. + +If the file already exists, an error is returned. + +If the resulting path does not exist, then the operation cannot proceed and +the function returns an error code. + +Notes: + +1. To close the file, use Close() + +2. It automatically sets the file's archive attribute. + +@param aFs The file server session. +@param aName The name of the file. Any path components (i.e. drive letter + or directory), which are not specified, are taken from + the session path. +@param aMode The mode in which the file is opened. The access mode is + automatically set to EFileWrite. See TFileMode. + +@return KErrNone if successful, otherwise one of the other system-wide + error codes. + +@see TFileMode + +@capability Dependent If the path in aName starts with /Sys then capability Tcb is required +@capability Dependent If the path in aName starts with /Resource then capability Tcb is required +@capability Dependent If the path in aName starts with /Private and does not match this process' + SID then AllFiles capability is required. + +*/ + { +#ifdef _DEBUG_LOGGING + RDebug::Print(_L("DEBUG: RFile::Create> name=%S mode=%x\n"), &aName, aFileMode); +#endif + + TUint att; + if (aFs.Att(aName, att) == KErrNone) + return KErrAlreadyExists; + return DoOpen(this, aName, aFileMode|EFileWrite, EFalse); + } + +EXPORT_C TInt RFile::Replace(RFs& aFs, const TDesC& aName, TUint aFileMode) +/** +Opens a file for writing, replacing the content of any existing file of the +same name if it exists, or creating a new file if it does not exist. + +If the resulting path exists, then: + +- the length of an existing file with the same filename is re-set to zero + +- a new file is created, if no existing file with the same filename can be found. + +If the resulting path does not exist, then the operation cannot proceed and +the function returns an error code. + +Notes: + +- To close the file, use Close(), defined in the base class RFsBase. + +- It automatically sets the file's archive attribute. + +@param aFs The file server session. +@param aName The name of the file. Any path components (i.e. drive letter + or directory), which are not specified, are taken from + the session path. +@param aMode The mode in which the file is opened. The access mode is + automatically set to EFileWrite. See TFileMode. + +@return KErrNone if successful, otherwise one of the other system-wide + error codes. + +@see TFileMode + +@capability Dependent If the path in aName starts with /Sys then capability Tcb is required +@capability Dependent If the path in aName starts with /Resource then capability Tcb is required +@capability Dependent If the path in aName starts with /Private and does not match this process' + SID then AllFiles capability is required. + +*/ + { +#ifdef _DEBUG_LOGGING + RDebug::Print(_L("DEBUG: RFile::Replace> name=%S mode=%x\n"), &aName, aFileMode); +#endif + + return DoOpen(this, aName, aFileMode|EFileWrite, EFalse); + } + +EXPORT_C TInt RFile::Temp(RFs& aFs, const TDesC& aPath, TFileName& aName, TUint aFileMode) +/** +Creates and opens a temporary file with a unique name for writing and reading. + +Notes: + +1. To close the file, use Close() + +@param aFs The file server session. +@param aPath The directory in which the file is created. +@param aName On return, contains the full path and file name of the file. + The filename is guaranteed to be unique within the directory + specified by aPath. +@param aMode The mode in which the file is opened. The access mode is + automatically set to EFileWrite. See TFileMode. + +@return KErrNone if successful, otherwise one of the other system-wide + error codes. + +@see TFileMode + +@capability Dependent If aPath starts with /Sys then capability Tcb is required +@capability Dependent If aPath starts with /Resource then capability Tcb is required +@capability Dependent If aPath starts with /Private and does not match this process' + SID then AllFiles capability is required. +*/ + { + // Check for a valid path + if (aPath.Length() > 0 && aPath[aPath.Length() - 1] != '\\') + return KErrBadName; + + // Create a temporary file name + TFileName name; + while(1) + { + name.Format(_L("%Ssymport%d.tmp"), &aPath, Math::Random()); + + TUint att; + TInt err = aFs.Att(name, att); + if (err == KErrNotFound) + break; + else if (err != KErrNone) + return err; + } + + TInt err = Create(aFs, name, aFileMode); + if (err == KErrNone) + { + aName = name; + return KErrNone; + } + // The path couldn't be found + else if (err == KErrNotFound) + return KErrBadName; + + return err; + } + +EXPORT_C TInt RFile::Read(TDes8& aDes) const +/** +Reads from the file at the current position. + +This is a synchronous function. + +Note that when an attempt is made to read beyond the end of the file, +no error is returned. +The descriptor's length is set to the number of bytes read into +it. Therefore, when reading through a file,the end of file has been reached +when the descriptor length, as returned by TDesC8::Length(), is zero. + +@param aDes Descriptor into which binary data is read. Any existing contents + are overwritten. On return, its length is set to the number of + bytes read. +@return KErrNone if successful, otherwise one of the other system-wide error + codes. + +@see TDesC8::Length +*/ + { + return Read(aDes, aDes.MaxLength()); + } + +EXPORT_C TInt RFile::Read(TDes8& aDes, TInt aLength) const +/** +Reads the specified number of bytes of binary data from the file at the current position. + +This is a synchronous function. + +Note that when an attempt is made to read beyond the end of the file, +no error is returned. +The descriptor's length is set to the number of bytes read into +it. Therefore, when reading through a file,the end of file has been reached +when the descriptor length, as returned by TDesC8::Length(), is zero. +Assuming aLength is less than the maximum length of the descriptor, the only circumstances +in which Read() can return fewer bytes than requested, is when the end of +file is reached or if an error occurs. + +@param aDes Descriptor into which binary data is read. Any existing + contents are overwritten. On return, its length is set to + the number of bytes read. + +@param aLength The number of bytes to be read from the file into the descriptor. + If an attempt is made to read more bytes than the descriptor's + maximum length, the function returns KErrOverflow. + This value must not be negative, otherwise the function + returns KErrArgument. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Read1> length=%d\n"), aLength); + +#endif + + + FILEHANDLE(h); + if (aLength > aDes.MaxLength()) + return KErrOverflow; + + // If the file has been written then you have set the position for a read to succeed + fseek(h->iHandle, 0, SEEK_CUR); + + size_t len = fread(const_cast(aDes.Ptr()), 1, aLength, h->iHandle); + TInt err = ferror(h->iHandle); + if (err != 0) + return mapErr(err); + aDes.SetLength(len); + + return KErrNone; + } + +EXPORT_C TInt RFile::Read(TInt aPos, TDes8& aDes) const +/** +Reads from the file at the specified offset within the file + +This is a synchronous function. + +Note that when an attempt is made to read beyond the end of the file, +no error is returned. +The descriptor's length is set to the number of bytes read into it. +Therefore, when reading through a file, the end of file has been reached +when the descriptor length, as returned by TDesC8::Length(), is zero. + +@param aPos Position of first byte to be read. This is an offset from + the start of the file. If no position is specified, reading + begins at the current file position. + If aPos is beyond the end of the file, the function returns + a zero length descriptor. + +@param aDes The descriptor into which binary data is read. Any existing content + is overwritten. On return, its length is set to the number of + bytes read. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. + +@panic FSCLIENT 19 if aPos is negative. +*/ + { + return Read(aPos, aDes, aDes.MaxLength()); + } + +EXPORT_C TInt RFile::Read(TInt aPos, TDes8& aDes, TInt aLength) const +/** +Reads the specified number of bytes of binary data from the file at a specified +offset within the file. + +This is a synchronous function. + +Note that when an attempt is made to read beyond the end of the file, +no error is returned. +The descriptor's length is set to the number of bytes read into it. +Therefore, when reading through a file, the end of file has been reached +when the descriptor length, as returned by TDesC8::Length(), is zero. +Assuming aLength is less than the maximum length of the descriptor, the only +circumstances in which Read() can return fewer bytes than requested is when +the end of file is reached or if an error has occurred. + +@param aPos Position of first byte to be read. This is an offset from + the start of the file. If no position is specified, + reading begins at the current file position. + If aPos is beyond the end of the file, the function returns + a zero length descriptor. + +@param aDes The descriptor into which binary data is read. Any existing + contents are overwritten. On return, its length is set to + the number of bytes read. +@param aLength The number of bytes to read from the file into the descriptor. + If an attempt is made to read more bytes than the descriptor's + maximum length, then the function updates aStatus parameter with KErrOverflow. + It must not be negative otherwise the function updates aStatus with KErrArgument. + +@return KErrNone if successful, otherwise one of the other system-wide + error codes. + +@panic FSCLIENT 19 if aPos is negative. +*/ + { +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Read2> length=%d\n"), aLength); + +#endif + + + + FILEHANDLE(h); + if (aLength > aDes.MaxLength()) + return KErrOverflow; + + // Check pos doesn't go past the end of the file + TInt size; + TInt err = Size(size); + if (err != KErrNone) + return err; + aPos = Min(size, aPos); + + if (fseek(h->iHandle, aPos, SEEK_SET) == 0) + { + size_t len = fread(const_cast(aDes.Ptr()), 1, aLength, h->iHandle); + if (len == 0 && ferror(h->iHandle) != 0) + return mapErr(ferror(h->iHandle)); + aDes.SetLength(len); + return KErrNone; + } + return mapErr(errno); + } + +EXPORT_C TInt RFile::Write(const TDesC8& aDes) +/** +Writes to the file at the current offset within the file. + +This is a synchronous function. + +NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig + +@param aDes The descriptor from which binary data is written. + The function writes the entire contents of aDes to the file. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + return Write(aDes, aDes.Length()); + } + +EXPORT_C TInt RFile::Write(const TDesC8& aDes, TInt aLength) +/** +Writes a portion of a descriptor to the file at the current offset within +the file. + +This is a synchronous function. + +NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig + +@param aDes The descriptor from which binary data is written. +@param aLength The number of bytes to be written from the descriptor. + This must not be greater than the length of the descriptor. + It must not be negative. + +@return KErrNone if successful; KErrArgument if aLength is negative; + otherwise one of the other system-wide error codes. + +@panic FSCLIENT 27 in debug mode, if aLength is greater than the length + of the descriptor aDes. +*/ + { +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Write1> length=%d\n"), aLength); + +#endif + + + + FILEHANDLE(h); + if (aLength < 0) + return KErrArgument; + + + // Trying to write to a file that hasn't been opened for write? + + if (!(h->iMode&EFileWrite)) + + return KErrAccessDenied; + + + // If the file has been read then you have set the position for a write to succeed + fseek(h->iHandle, 0, SEEK_CUR); + + size_t sz = fwrite(aDes.Ptr(), 1, aLength, h->iHandle); + if (sz != (TUint)aLength) + return mapErr(ferror(h->iHandle)); + return KErrNone; + } + +EXPORT_C TInt RFile::Write(TInt aPos, const TDesC8& aDes) +/** +Writes to the file at the specified offset within the file + +This is a synchronous function. + +NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig + +@param aPos The offset from the start of the file at which the first + byte is written. + If a position beyond the end of the file is specified, then + the write operation begins at the end of the file. + If the position has been locked, then the write fails. + +@param aDes The descriptor from which binary data is written. The function writes + the entire contents of aDes to the file. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. + +@panic FSCLIENT 19 if aPos is negative. +*/ + { + return Write(aPos, aDes, aDes.Length()); + } + +EXPORT_C TInt RFile::Write(TInt aPos, const TDesC8& aDes, TInt aLength) +/** +Writes the specified number of bytes to the file at the specified offset within the file. + +This is a synchronous function. + +NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig + +@param aPos The offset from the start of the file at which the first + byte is written. + If a position beyond the end of the file is specified, then + the write operation begins at the end of the file. + If the position has been locked, then the write fails. + +@param aDes The descriptor from which binary data is written. +@param aLength The number of bytes to be written from aDes . + It must not be negative. + +@return KErrNone if successful; KErrArgument if aLength is negative; + otherwise one of the other system-wide error codes. + +@panic FSCLIENT 19 if aPos is negative. +*/ + { +#ifdef _DEBUG_LOGGING + + RDebug::Print(_L("DEBUG: Write2> length=%d\n"), aLength); + +#endif + + + + FILEHANDLE(h); + if (aLength < 0) + return KErrArgument; + + + // Trying to write to a file that hasn't been opened for write? + + if (!(h->iMode&EFileWrite)) + + return KErrAccessDenied; + + + // Check pos doesn't go past the end of the file + TInt size; + TInt err = Size(size); + if (err != KErrNone) + return err; + aPos = Min(size, aPos); + + if (fseek(h->iHandle, aPos, SEEK_SET) == 0) + { + size_t sz = fwrite(aDes.Ptr(), 1, aLength, h->iHandle); + if (sz != (TUint)aDes.Length()) + return mapErr(ferror(h->iHandle)); + return KErrNone; + } + return mapErr(errno); + } + +EXPORT_C TInt RFile::Seek(TSeek aMode, TInt& aPos) const +/** +Sets the the current file position. + +The function can also be used to get the current file +position without changing it. The file position is the position at which +reading and writing takes place. The start of the file is position zero. + +To retrieve the current file position without changing it, specify ESeekCurrent +for the seek mode, and zero for the offset. + +If the seek mode is ESeekStart, then: + +1. the function does not modify the aPos argument, + +2. the function returns an error if the offset specified is negative. + +If the seek mode is ESeekAddress, an error is returned if: + +1. the file is not in ROM, + +2. the offset specified is greater than the size of the file. + +@param aMode Seek mode. Controls the destination of the seek operation. +@param aPos Offset from location specified in aMode. Can be negative. + On return contains the new file position. + If the seek mode is either ESeekCurrent or ESeekEnd and the offset + specifies a position before the start of the file + or beyond the end of the file, then on return, aPos is set to + the new file position (either the start or the end of the file). + If the seek mode is ESeekAddress, aPos returns the address of + the byte at the specified offset within the file. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + FILEHANDLE(h); + + // Get file size + TInt size; + TInt ret = Size(size); + if (ret != KErrNone) + return ret; + + switch(aMode) + { + case ESeekStart: + { + // Make sure you don't seek past the end + ret = fseek(h->iHandle, Min(aPos, size), SEEK_SET); + break; + } + case ESeekCurrent: + { + // Get file position + if ((ret = ftell(h->iHandle)) >= 0) + { + TInt current = ret; + ret = 0; + + // Try and move the file position + // fseek will move past the end of the file but RFile doesn't allow this + // fseek thinks it's invalid to move before the start, RFile allows this and sets file pos to zero + TInt request = Max(0, Min(current + aPos, size)); + if ((ret = fseek(h->iHandle, request, SEEK_SET)) == 0) + aPos = request; + } + break; + } + case ESeekEnd: + { + // Try and move the file position + // fseek will move past the end of the file but RFile doesn't allow this + TInt request = Max(0, Min(size + aPos, size)); + if ((ret = fseek(h->iHandle, request, SEEK_SET)) == 0) + aPos = request; + break; + } + default: // Applies to ESeekAddress + return KErrNotSupported; + } + if (ret) + return mapErr(errno); + return KErrNone; + } + +EXPORT_C TInt RFile::Flush() +/** +Commits data to the storage device and flushes internal buffers without closing +the file. + +Although RFile::Close() also flushes internal buffers, it is often useful +to call Flush() before a file is closed. This is because Close() returns no +error information, so there is no way of telling whether the final data was +written to the file successfully or not. Once data has been flushed, Close() +is effectively a no-operation. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + FILEHANDLE(h); + + // Flush messes with the file pointer! + TInt oldpos = ftell(h->iHandle); + if (oldpos < 0) + return mapErr(errno); + if (fflush(h->iHandle) != 0) + return mapErr(errno); + if (fseek(h->iHandle, oldpos, SEEK_SET) != 0) + return mapErr(errno); + + return KErrNone; + } + +EXPORT_C TInt RFile::Size(TInt& aSize) const +/** +Gets the current file size. + +@param aSize On return, the size of the file in bytes. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + FILEHANDLE(h); + + // Have to flush data before changing size - flush messes with the file pointer! + TInt oldpos = ftell(h->iHandle); + if (oldpos < 0) + return mapErr(errno); + if (fflush(h->iHandle) != 0) + return mapErr(errno); + if (fseek(h->iHandle, oldpos, SEEK_SET) != 0) + return mapErr(errno); + + struct stat sb; + if (fstat(fileno(h->iHandle), &sb) == 0) + { + aSize = sb.st_size; + return KErrNone; + } + + return mapErr(errno); + } + +EXPORT_C TInt RFile::SetSize(TInt aSize) +/** +Sets the file size. + +If the size of the file is reduced, data may be lost from +the end of the file. + +Note: + +1. The current file position remains unchanged unless SetSize() reduces the size + of the file in such a way that the current file position is now beyond + the end of the file. In this case, the current file position is set to + the end of file. + +2. If the file was not opened for writing, an error is returned. + +@param aSize The new size of the file, in bytes. This value must not be negative, otherwise the function raises a panic. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. + +@panic FSCLIENT 20 If aSize is negative. + +*/ + { + FILEHANDLE(h); + + + // Trying to set size on a file that hasn't been opened for write? + + if (!(h->iMode&EFileWrite)) + + return KErrAccessDenied; + + + // fflush messes with the file position! + TInt oldpos = ftell(h->iHandle); + if (oldpos < 0) + return mapErr(errno); + if (fflush(h->iHandle) != 0) + return mapErr(errno); + if (fseek(h->iHandle, oldpos, SEEK_SET) != 0) + return mapErr(errno); + + // Now change the file size + if (ftruncate(fileno(h->iHandle), aSize) != 0) + return mapErr(errno); + return KErrNone; + } + +EXPORT_C TInt RFile::Att(TUint& aVal) const +/** +Gets the file's attributes. + +@param aVal A bitmask which, on return, contains the file’s attributes. + For more information, see KEntryAttNormal and the other + file/directory attributes. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. + +@see KEntryAttNormal +*/ + { + FILEHANDLE(h); + RFs fs; + return fs.Att(h->iName, aVal); + } + +EXPORT_C TInt RFile::SetAtt(TUint aSetAttMask,TUint aClearAttMask) +/** +Sets or clears file attributes using two bitmasks. + +The first mask controls which attributes are set. +The second controls which attributes are cleared. + +Notes: + +1. The file must have been opened for writing, or an error is returned. + +2. A panic is raised if any attribute is specified in both bitmasks. + +3. An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote + attributes have no effect. + +4. The new attribute values take effect when the file is flushed or closed (which + implies a flush). + +@param aSetAttMask A bitmask indicating the file attributes to be set +@param aClearAttMask A bitmask indicating the attributes to be cleared. For + more information see KEntryAttNormal, and the other + file/directory attributes. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. + +@panic FSCLIENT 21 if the same attribute bit is set in both bitmasks. +*/ + { + FILEHANDLE(h); + RFs fs; + return fs.SetAtt(h->iName, aSetAttMask, aClearAttMask); + } + +EXPORT_C TInt RFile::Modified(TTime& aTime) const +/** +Gets local date and time the file was last modified, in universal time. + +@param aTime On return, contains the date and time the file was last modified in UTC. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + FILEHANDLE(h); + RFs fs; + TEntry entry; + TInt err = fs.Entry(h->iName, entry); + if (err < KErrNone) + return err; + aTime = entry.iModified; + return KErrNone; + } + +EXPORT_C TInt RFile::ChangeMode(TFileMode aNewMode) +/** +Switches an open file's access mode between EFileShareExclusive and EFileShareReadersOnly. + +This allows or disallows read-only access without having to close and re-open the file. + +@param aNewMode The new access mode. + +@return KErrNone, if successful; + KErrArgument, if aNewMode has any value other than the two specified; + KErrAccessDenied, if: + a) the function is called when the current file share + mode is EFileShareAny; + b) the file has multiple readers, and an attempt is made + to change the share mode to EFileShareExclusive; + c) the file has been opened for writing in EFileShareExclusive mode, and an + attempt is made to change the access mode to EFileShareReadersOnly. + +@capability Dependent If the path starts with /Resource then capability DiskAdmin is required + +*/ + { + // Pretend it worked! + return KErrNone; + } + +EXPORT_C TInt RFile::Drive(TInt &aDriveNumber, TDriveInfo &aDriveInfo) const +/** +Gets information about the drive on which this file resides. + +@param aDriveNumber On return, the drive number. + +@param aDriveInfo On return, contains information describing the drive + and the medium mounted on it. The value of TDriveInfo::iType + shows whether the drive contains media. + +@return KErrNone, if successful, otherwise one of the other + system-wide error codes + +@see RFs::Drive +*/ + { + aDriveNumber = EDriveC; + aDriveInfo.iType = EMediaHardDisk; + aDriveInfo.iBattery = EBatNotSupported; + aDriveInfo.iDriveAtt = KDriveAttLocal|KDriveAttInternal; + aDriveInfo.iMediaAtt = 0; + return KErrNone; + } + +EXPORT_C TInt RFile::Rename(const TDesC& aNewName) +/** +Renames a file. + +If aNewName specifies a different directory to the one in which +the file is currently located, then the file is moved. + +@param aNewName The new file name and/or directory path. No part may contain + wildcard characters or an error is returned. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + FILEHANDLE(h); + TFileName name(h->iName); + + // Need the file to be opened for write + if (!(h->iMode & EFileWrite)) + return KErrAccessDenied; + + TBuf8 copyOld; + const char* oldName = PosixFilename(name, copyOld); + + TBuf8 copyNew; + const char* newName = PosixFilename(aNewName, copyNew); + + // Remember the file position + TInt pos = 0; + TInt err = Seek(ESeekCurrent, pos); + if (err != KErrNone) + return err; + + // Close the file + Close(); + + // Rename the file + if (rename(oldName, newName) != 0) + return mapErr(errno); + + // Open the file again + RFs fs; + err = Open(fs, aNewName, EFileWrite); + if (err != KErrNone) + return err; + + // Reposition the file pointer + return Seek(ESeekStart, pos); + } + diff -r c55016431358 -r 0a7b44b10206 symport/f32/sfsrv/cl_find.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/f32/sfsrv/cl_find.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,93 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32\sfsrv\cl_find.cpp +// +// + +#include "cl_std.h" + +EXPORT_C TFindFile::TFindFile(RFs& aFs) + : iFs(&aFs), iPathPos(0), iCurrentDrive(0), iMode(-1), iMatchMask(0) +/** +Constructor taking a file server session. + +@param aFs File server session. +*/ + { + + iFile.Set(_L(""),NULL,NULL); + } + +TInt TFindFile::DoFindByPath(const TDesC& aFileName,const TDesC* aPath) +// +// Look for a file in each directory in the path +// Make initial check for aFileName in the current directory +// + { + TUint att; + +#ifdef _DEBUG_LOGGING + RDebug::Print(_L("DEBUG: FindByPath> aFileName=%S id=%x\n"), &aFileName); +#endif + + // At the moment this is just looking for an exact match for the file + // or does the file exist in the current directory + iFile.Set(aFileName, NULL, NULL); + if (iFs->Att(iFile.FullName(), att) == KErrNone) + return KErrNone; + + iFile.Set(iFile.NameAndExt(), NULL, NULL); + return iFs->Att(iFile.FullName(), att); + } + +EXPORT_C TInt TFindFile::FindByPath(const TDesC& aFileName,const TDesC* aPath) +/** +Searches for a file/directory in one or more directories in the path. + +The search ends when the file/directory is found, or when every directory +specified in the path list has been unsuccessfully searched. + +Notes: + +1. For the equivalent search using wildcards, use FindWildByPath(). + +2. After a file has been found, use TFindFile::File() to get the fully qualified path of the file. To + search for the next occurrence, use TFindFile::Find(). + +@param aFileName The filename to search for. If this specifies a directory as well + as a filename, then that directory is searched first. +@param aPath A list of directories to be searched. Paths in this list must + be separated by a semicolon character, but a semicolon is not + required after the final path. The directories are searched in + the order in which they occur in the list. If a path in + the list contains a drive letter, that drive alone is searched. + If a path contains no drive letter, the function searches for + the file in that directory on every available drive in turn, + beginning with drive Y:, in descending alphabetical order + and ending with drive Z:.When path is empty then session path + will be used for the search. + +@return KErrNone, if the filename was found; + KErrNotFound, if the filename was not found. + KErrArgument, if the filename is empty. + +@see TFindFile::FindWildByPath +@see TFindFile::File +@see TFindFile::Find +*/ + { + + iDir=NULL; + return(DoFindByPath(aFileName,aPath)); + } diff -r c55016431358 -r 0a7b44b10206 symport/f32/sfsrv/cl_ftext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/f32/sfsrv/cl_ftext.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,327 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32\sfsrv\cl_ftext.cpp +// +// + +#include "cl_std.h" + + + + +EXPORT_C TFileText::TFileText() +/** +Default constructor. +*/ + {} + + + + +EXPORT_C void TFileText::Set(RFile& aFile) +/** +Sets the Unicode file to be read from, or written to. + +This function must be called before +Read(), Write() or Seek() can be used. + +@param aFile The file to be used. Must be open. + +@see TFileText::Read +@see TFileText::Write +@see TFileText::Seek +*/ + { + + iFile=aFile; + iReadBuf.Zero(); + iNext=(TText*)iReadBuf.Ptr(); + iEnd=iNext; + TInt pos = 0; + iFile.Seek(ESeekCurrent,pos); + if (pos == 0) + iState = EStartOfFile; + else + iState = ENormal; + } + + + + +EXPORT_C TInt TFileText::Read(TDes& aDes) +/** +Reads single line text record from a Unicode file into the specified descriptor. + +The read operation begins at the current file position, and ends when +a line delimiter character is read. + +If the maximum length of the descriptor is insufficient to hold the record, +the function returns KErrTooBig and the descriptor is filled to its maximum +length. + +If Read() is called when the current position is the end of the file (that +is, after the last line delimiter in the file), KErrEof is returned, and the +length of the buffer is set to zero. + +@param aDes On return, contains the single record read from the file. Any + previous contents are overwritten. + +@return KErrNone if successful, otherwise one of the other system-wide error + codes. +*/ + { + + TText* pD=(TText*)aDes.Ptr(); + TInt len=aDes.MaxLength(); + TInt newLen=0; + while (newLen=iEnd) + { + TInt r=FillBuffer(); + if (r!=KErrNone && r!=KErrEof) + return(r); + if (r==KErrEof) + { + aDes.SetLength(newLen); + return(newLen ? KErrNone : KErrEof); + } + continue; + } + TBool terminate=newLen; + TInt r=CheckForTerminator(terminate); + if (r!=KErrNone || terminate) + { + aDes.SetLength(newLen); + return(r); + } + *pD++=(*iNext++); + newLen++; + } + aDes.SetLength(newLen); + TBool terminate=newLen; + TInt r=CheckForTerminator(terminate); + if (r!=KErrNone || terminate) + return(r); + NextRecord(); + return(KErrTooBig); + } + +void TFileText::NextRecord() +// +// Move to the start of the next record +// + { + + FOREVER + { + TBool terminate=EFalse; + TInt r=CheckForTerminator(terminate); + if (r!=KErrNone || terminate) + return; + iNext++; + } + } + +static void SwapWords(TText* aStart,TInt aCount) + { + TUint8* p = (TUint8*)aStart; + while (aCount-- > 0) + { + TUint8 temp = *p; + *p = p[1]; + p[1] = temp; + p += 2; + } + } + +TInt TFileText::FillBuffer() +// +// Read the new data from the file +// + { + + TInt r=iFile.Read(iReadBuf); + if (r!=KErrNone) + return(r); + if (iReadBuf.Length()==0) + return(KErrEof); + iNext=(const TText*)iReadBuf.Ptr(); + iEnd=iNext+iReadBuf.Length()/sizeof(TText); + + // Use any leading byte order marker to determine endianness. + if (iState == EStartOfFile) + { + iState = ENormal; + + // Ignore an ordinary byte order marker. + if (*iNext == 0xFEFF) + iNext++; + + // Set the endianness state to 'reverse' if a reversed byte order marker is found. + else if (*iNext == 0xFFFE) + { + iNext++; + iState = EReverse; + } + + if (iNext == iEnd) + return KErrEof; + } + + if (iState == EReverse) + SwapWords((TText*)iNext,(iEnd - iNext)); + + return(KErrNone); + } + +TInt TFileText::CheckForTerminator(TBool& anAnswer) +// +// Return ETrue if the next char is a record terminator: PARAGRAPH SEPARATOR (U+2029), LINE SEPARATOR (U+2028), +// CR-LF (U+000D, U+000A), or LF (U+000A) +// + { + + if (iNext>=iEnd) + { + TInt r=FillBuffer(); + if (r!=KErrNone) + { + if (r==KErrEof && anAnswer) + return(KErrNone); + return(r); + } + } + + anAnswer=EFalse; + const TText* oldNext=iNext; + TInt oldBufferLength=iReadBuf.Length(); + TText c=(*iNext); + TBool peek=EFalse; + + // Check for unambiguous paragraph or line separator. + if (c == 0x2029 || c == 0x2028) + { + iNext++; + anAnswer = ETrue; + return KErrNone; + } + + // Check for CR-LF or LF. + if (c == 0x000D) + { + iNext++; + if (iNextKMaxFileName) + return(KErrBadName); + NameBuf()+=d.Left(n); + } + aDone=ETrue; + } + aName.SkipAndMark(n); + return(KErrNone); + } + +LOCAL_C TBool IsSpace(const TDesC& aDes) +// +// Returns ETrue if aDes only contains spaces or is zero length +// + { + + TInt len=aDes.Length(); + for (TInt i=0;iKMaxFileName) + return(KErrBadName); + NameBuf()+=v; + if (n==d.Length()) + NameBuf().TrimRight(); + } + aDone=ETrue; + } + aName.SkipAndMark(n); + return(KErrNone); + } + +TInt TParseBase::ParseExt(TLex& aName,TBool& aDone) +// +// Parse the extension. +// + { + + TPtrC d=aName.RemainderFromMark(); + if (d.Length() && !IsSpace(d) && !aDone) + { + if (d.Locate(KMatchOne)!=KErrNotFound || d.Locate(KMatchAny)!=KErrNotFound) + iWild|=(EWildExt|EWildEither); + if(iMod) + { + if (NameBuf().Length()+d.Length()>KMaxFileName) + return(KErrBadName); + NameBuf()+=d; + NameBuf().TrimRight(); + } + else + aName.SkipAndMark(d.Length()); + aDone=ETrue; + } + return(KErrNone); + } + +TInt TParseBase::Set(const TDesC* aName,const TDesC* aRelated,const TDesC* aDefault,TBool allowWild) +// +// Parse a name. Optionally allow wild cards. +// + { + + TInt (TParseBase::*parse[KLexComponents])(TLex& aName,TBool& aDone); + parse[0]=&TParseBase::ParseDrive; + parse[1]=&TParseBase::ParsePath; + parse[2]=&TParseBase::ParseName; + parse[3]=&TParseBase::ParseExt; + + iWild=0; + + Mem::FillZ(&iField[0],sizeof(iField)); + + TLex name(*aName); + TLex def; + TLex rel; + TInt lexnames; + if(iMod) + { + if (aRelated) + rel=(*aRelated); + if (aDefault) + def=(*aDefault); + NameBuf().Zero(); + lexnames = KLexNames; + } + else + { + lexnames = 1; + } + + TLex* lex[KLexNames]; + lex[0]=(&name); + lex[1]=(&rel); + lex[2]=(&def); + + name.Mark(); + rel.Mark(); + def.Mark(); + + TInt r; + TInt pos=0; + + for (TInt i=0;i*parse[i])(*lex[j],done))NameBuf().MaxLength()) + return(KErrGeneral); + TInt pos=aName.Locate(KPathDelimiter); + if (pos!=KErrNotFound) + return(KErrBadName); + TFileName n=aName; + n.Append(KPathDelimiter); + NameBuf().Insert(iField[EName].pos,n); + iField[EPath].len=(TUint8)(iField[EPath].len+len); + iField[EName].pos=(TUint8)(iField[EName].pos+len); + iField[EExt].pos=(TUint8)(len+iField[EExt].pos); + if (IsRoot()) + iWild&=~EIsRoot; + return(KErrNone); + } + + + + +EXPORT_C const TDesC& TParseBase::FullName() const +/** +Gets the complete file specification. + +This is in the form: + +drive-letter: \\path\\filename.extension + +@return The fully parsed file specification. +*/ + { + + return(NameBufC()); + } + + + + +EXPORT_C TPtrC TParseBase::Drive() const +/** +Gets the drive letter. + +The drive letter is in the form: + +drive-letter: + +Note that the drive letter is folded. + +@return The drive letter and colon. +*/ + { + + const SField& f=iField[EDrive]; + return(NameBufC().Mid(f.pos,f.len)); + } + + + + +EXPORT_C TPtrC TParseBase::Path() const +/** +Gets the path. + +The path is in the form: + +\\path\\ + +@return The path. It always begins and ends in a backslash. +*/ + { + + const SField& f=iField[EPath]; + return(NameBufC().Mid(f.pos,f.len)); + } + + + + +EXPORT_C TPtrC TParseBase::DriveAndPath() const +/** +Gets the drive letter and path. + +This is in the form + +drive-letter:\\path\\ + +Note that the drive letter is folded + +@return The drive and path. +*/ + { + + const SField& f=iField[EDrive]; + return(NameBufC().Mid(f.pos,f.len+iField[EPath].len)); + } + + + + +EXPORT_C TPtrC TParseBase::Name() const +/** +Gets the filename. + +This is in the form + +filename + +@return The filename. +*/ + { + + const SField& f=iField[EName]; + return(NameBufC().Mid(f.pos,f.len)); + } + + + + +EXPORT_C TPtrC TParseBase::Ext() const +/** +Gets the extension. + +This is in the form: + +.extension + +@return The extension and preceding dot. +*/ + { + + const SField& f=iField[EExt]; + return(NameBufC().Mid(f.pos,f.len)); + } + + + + +EXPORT_C TPtrC TParseBase::NameAndExt() const +/** +Gets the filename and extension. + +This is in the form: + +filename.ext + +@return The filename and extension. +*/ + { + + const SField& f=iField[EName]; + return(NameBufC().Mid(f.pos,f.len+iField[EExt].len)); + } + + + + +EXPORT_C TBool TParseBase::DrivePresent() const +/** +Tests whether a drive is present. + +Note that this function refers to a component +in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() +or RFs::Parse(), not to the resulting fully parsed file specification. + +@return True if a drive present, false if not. + +@see TParse +@see RFs +*/ + { + + return(iField[EDrive].present); + } + + + + +EXPORT_C TBool TParseBase::PathPresent() const +/** +Tests whether a path is present. + +Note that this function refers to a component +in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() +or RFs::Parse(), not to the resulting fully parsed file specification. + +@return True if a path present, false if not. + +@see TParse +@see RFs +*/ + { + + return(iField[EPath].present); + } + + + + +EXPORT_C TBool TParseBase::NamePresent() const +/** +Tests whether a file name is present. + +Note that this function refers to a component +in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() +or RFs::Parse(), not to the resulting fully parsed file specification. + +This function returns true even if the filename specified in aName contains +only wildcards. It only returns false if nothing is specified. + +@return True if a name present, false if not. +*/ + { + + return(iField[EName].present); + } + + + + +EXPORT_C TBool TParseBase::ExtPresent() const +/** +Tests whether an extension is present. + +Note that this function refers to a component +in the aName argument specified in calls to TParse::Set(), TParse::SetNoWild() +or RFs::Parse(), not to the resulting fully parsed file specification. + +This function returns true even if the extension contains only wildcards. +It only returns false if nothing is specified. + +@return True if an extension present, false if not. +*/ + { + + return(iField[EExt].present); + } + + + + +EXPORT_C TBool TParseBase::NameOrExtPresent() const +/** +Tests whether a filename or an extension are present. + +Note that this function refers to a component in the aName argument +specified in calls to TParse::Set(), TParse::SetNoWild() or RFs::Parse(), not +to the resulting fully parsed file specification. + +This function returns true even if the filename or extension specified in +aName contain only wildcards. It only returns false if nothing is specified. + +@return True if either a name or an extension or both are present, + otherwise false. +*/ + { + + return(iField[EName].present || iField[EExt].present); + } + + + + + +EXPORT_C TBool TParseBase::IsRoot() const +/** +Tests whether the path in the fully parsed specification is the root directory. + +@return True if path is root, false if not. +*/ + { + + return(iWild&EIsRoot); + } + + + + +EXPORT_C TBool TParseBase::IsWild() const +/** +Tests whether the filename or the extension in the fully parsed specification +contains one or more wildcard characters. + +@return True if wildcards are present, false if not. +*/ + { + + return(iWild&EWildEither); + } + + + + +EXPORT_C TBool TParseBase::IsKMatchOne() const +/** +Tests whether the name or the extension contains a question mark wildcard. + +@return True if either the name or extension has a ? wild card, + false otherwise. +*/ + { + + return(iWild&EWildIsKMatchOne); + } + + + + +EXPORT_C TBool TParseBase::IsKMatchAny() const +/** +Tests whether the name or the extension contains asterisk wildcards. + +@return True if either the name or extension has a * wild card, + false otherwise. +*/ + { + + return(iWild&EWildIsKMatchAny); + } + + + + +EXPORT_C TBool TParseBase::IsNameWild() const +/** +Tests whether the filename in the fully parsed specification contains one or +more wildcard characters. + +@return True if the filename contains wildcard characters, false if not. +*/ + { + + return(iWild&EWildName); + } + + + + +EXPORT_C TBool TParseBase::IsExtWild() const +/** +Tests whether the extension in the fully parsed specification contains one +or more wildcard characters. + +@return True if the extension contains wildcard characters, false if not. +*/ + { + + return(iWild&EWildExt); + } + + + + +EXPORT_C TParse::TParse() +/** +Default constructor. +*/ + { + iMod=1; + } + + + + +EXPORT_C TInt TParse::Set(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault) +/** +Parses a file specification, allowing wildcards in the filename and extension. + +This function sets up the TParse object so that it can be used to provide +useful information. + +@param aName The file specification to be parsed. +@param aRelated The related file specification. This is optional, + set to NULL to omit. +@param aDefault The default file specification. This is optional, + set to NULL to omit. + +@return KErrNone, if successful, otherwise one of the other system-wide error + codes. +*/ + { + + return(TParseBase::Set(&aName,aRelated,aDefault,ETrue)); + } + + + + +EXPORT_C TInt TParse::SetNoWild(const TDesC& aName,const TDesC* aRelated,const TDesC* aDefault) +/** +Parses a file specification; disallows wildcards in any part of the file name +or extension. + +If you need to specify wildcards use Set(). Otherwise, this +function behaves in the same way as Set(). + +@param aName The file specification to be parsed. +@param aRelated The related file specification. This is optional, + set to NULL to omit. +@param aDefault The default file specification. This is optional, + set to NULL to omit. + +@return KErrNone, if successful, otherwise one of the other system-wide error + codes. + +@see TParse::Set +*/ + { + + return(TParseBase::Set(&aName,aRelated,aDefault,EFalse)); + } + + + + +EXPORT_C TDes& TParse::NameBuf() +/** +Gets a reference to the descriptor containing the file specification passed to +the constructor of this object. + +@return A reference to the descriptor containing the filename. +*/ + { + + return(iNameBuf); + } + + + + +EXPORT_C const TDesC& TParse::NameBufC() const +/** +Gets a const reference to the descriptor containing the file specification +passed to the constructor of this object. + +@return A const reference to the descriptor containing the file specification. +*/ + { + + return(iNameBuf); + } + + + + +EXPORT_C TParsePtr::TParsePtr(TDes& aName) + : iNameBuf((TText*)aName.Ptr(),aName.Length(),aName.MaxLength()) +/** +Constructor taking a reference to a filename. + +The specified filename is parsed and if this fails, a panic is raised. + +@param aName Reference to the filename to be parsed. On return contains + the fully parsed path specification. If a filename and extension + are specified, they may both contain wildcards. + The maximum length is KMaxFileName characters. + +@panic FSCLIENT 24 if the the specified name fails to parse. + +@see KMaxFileName +*/ + { + iMod=1; + TInt r=TParseBase::Set(&aName,NULL,NULL,ETrue); + __ASSERT_ALWAYS(r==KErrNone,Panic(EParsePtrBadDescriptor0)); + } + + + + +EXPORT_C TDes& TParsePtr::NameBuf() +/** +Gets a reference to the descriptor containing the filename passed to +the constructor of this object. + +@return A reference to the descriptor containing the filename. +*/ + { + + return(iNameBuf); + } + + + + +EXPORT_C const TDesC& TParsePtr::NameBufC() const +/** +Gets a const reference to the descriptor containing the filename passed to +the constructor of this object. + +@return A const reference to the descriptor containing the filename. +*/ + { + + return(iNameBuf); + } + + + + +EXPORT_C TParsePtrC::TParsePtrC(const TDesC& aName) +/** +Constructor taking a constant reference to a filename. + +The filename is parsed and if this fails, a panic is raised. +Note that the filename cannot be modified using this class. + +@param aName Constant reference to the filename to be parsed. + On return contains the fully parsed filename. + If a file and extension are specified, they may both + contain wildcards. + The maximum length is KMaxFileName characters. + +@panic FSCLIENT 24 if the the specified name fails to parse. + +@see KMaxFileName +*/ + { + iMod=0; + iNameBuf.Set(aName); + TInt r = TParseBase::Set(&aName,NULL,NULL,ETrue); + __ASSERT_ALWAYS(r==KErrNone,Panic(EParsePtrBadDescriptor0)); + } + + + + +EXPORT_C TDes& TParsePtrC::NameBuf() +/** +Gets a reference to the descriptor containing the filename passed to +the constructor of this object. + +@return A reference to the descriptor containing the filename. +*/ + { + + Panic(EParsePtrCAccessError); + return(*(TDes*)&iNameBuf); + } + + + + +EXPORT_C const TDesC& TParsePtrC::NameBufC() const +/** +Gets a const reference to the descriptor containing the filename passed to +the constructor of this object. + +@return A const reference to the descriptor containing the filename. +*/ + { + + return(iNameBuf); + } + diff -r c55016431358 -r 0a7b44b10206 symport/f32/sfsrv/cl_std.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/f32/sfsrv/cl_std.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,75 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32\sfsrv\cl_std.h +// +// + +#ifndef __TOOLS2__ +#include +#include +#endif +#include +#ifndef __TOOLS2__ +#include +#include +#include +#else +const TInt KCountNeeded=KMinTInt; +#endif + +enum TClientPanic + { + EDriveUnitBadDrive, + EDriveUnitBadDriveText, + EFindFileIllegalMode, + EBadUidIndex, + ERawDiskCannotClose, + EFTextIllegalSeekMode, + ENotImplemented, + EFManNotActive, + EFManActive, + EFManNoActionSet, + EFManUnknownAction, + EFManCurrentEntryInvalid, + EFManBadValueFromObserver, + EFManBadNames, + EFManRecursiveRename, + EDirListError, + EAddDirBadName, + ELockLengthZero, + EUnlockLengthZero, + EPosNegative, + ESizeNegative, + EAttributesIllegal, + EEntryArrayBadIndex, + ECDirBadSortType, + EParsePtrBadDescriptor0, + EParsePtrBadDescriptor1, + EParsePtrCAccessError, + EBadLength, + EDefaultPathCalled, + ESetDefaultPathCalled, + EFindFileIllegalAttribute, + }; +// +enum TClientFault + { + ENotifyChangeCancel, + ESessionClose, + ESubSessionClose + }; +// +GLREF_C void Panic(TClientPanic aPanic); +GLREF_C void Fault(TClientFault aFault); +// diff -r c55016431358 -r 0a7b44b10206 symport/flm/export.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/flm/export.pl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,73 @@ +#!/usr/bin/perl + +# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +use strict; +use warnings; +use Getopt::Long; +use File::Spec::Functions; +use Pod::Usage; +use File::Copy; + +# Version of the script - just use the date +$main::VERSION = '13-Oct-08'; + +# Get command line arguments +my ( $version, $help, $verbose ); +GetOptions("verbose|v" => \$verbose, "version|ver" => \$version, "help|h" => \$help) or pod2usage(2); + +# Handle help and version +pod2usage({ verbose => 1, exitval => 0}) if $help; +version() if $version; + +# Check we can find the build system +die "SBS_HOME environment variable not defined" if !$ENV{SBS_HOME}; +die "Can't find SBS in $ENV{SBS_HOME}" if !-d $ENV{SBS_HOME}; + +# Now do the work +doCopy('x86tool.flm', catfile($ENV{SBS_HOME}, 'lib', 'flm', 'tools', 'x86tool.flm')); +doCopy('x86tool.xml', catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml')); + +# Copy files +sub doCopy + { + my ( $src, $dst ) = @_; + print "Copying $src to $dst\n" if $verbose; + unlink $dst; + copy($src, $dst) or die "Failed to copy $src to $dst: $!"; + } + +# New getopt::long provides this - but old version doesn't? +sub version + { + print sprintf("$0: $main::VERSION\n$^X: %vd\nos: $^O", $^V); + exit; + } + +=head1 NAME + +export.pl - Copies FLM files to the right place + +=head1 SYNOPSIS + +export.pl [-help] [-version] [-verbose] + + Options: + -help brief help message + -version version of the script + -verbose print what the scripts does + +=cut diff -r c55016431358 -r 0a7b44b10206 symport/flm/x86tool.flm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/flm/x86tool.flm Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,158 @@ +# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# FLM to build x86 exes, libs and dlls +# + +include $(FLMHOME)/flmtools.mk +include $(FLMHOME)/metaflm.mk + +CREATABLEPATHS:= +CLEANTARGETS:= + +# Handle Window/Linux differences +ifeq ($(OSTYPE),cygwin) + DOTDLL:=.dll + WIN32:=1 + GCOVDIR:=$(if $(CODE_COVERAGE),$(EPOCROOT)/epoc32/gcc_mingw/libgcc/mingw32/3.4.5/) +else + DOTDLL:=.so +endif + +# Product include files are different for S60 +ifdef S60_BUILD + PRODUCT_INCLUDE:=$(EPOCROOT)/epoc32/include/oem/bldvariant.hrh +else + PRODUCT_INCLUDE:=$(EPOCROOT)/epoc32/include/variant/Symbian_OS.hrh +endif + +# Define macros we need +CXXDEFS:=$(foreach def,$(MACROS),-D$(def)) -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__X86__ -D_UNICODE -D__SUPPORT_CPP_EXCEPTIONS__ -D__TOOLS2__ -D'__PRODUCT_INCLUDE__="$(PRODUCT_INCLUDE)"' +ifeq ($(CFG_PATH),deb) + CXXDEFS+= -D_DEBUG +endif + +# Setup the command line options for the compiler +OPTIMISE:=-fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fif-conversion -fif-conversion2 -fguess-branch-probability -fcprop-registers -fforce-mem -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -funit-at-a-time -falign-functions -falign-jumps -falign-loops -falign-labels -fcrossjumping + +PREINC=$(EPOCROOT)/epoc32/include/x86tool/x86tool.h +ifeq ($(CFG_PATH),deb) + CXXOPT:=-fshort-wchar -x c++ -O0 -g3 -Wall -c -fmessage-length=0 -include $(PREINC) +else + CXXOPT:=-fshort-wchar -x c++ -Wall -c -fmessage-length=0 -include $(PREINC) $(if $(CODE_COVERAGE),-O0,$(OPTIMISE)) +endif + +# Allow specification of additional build include file +ifdef BUILDINC + CXXOPT+= -include $(BUILDINC) +endif + +# Extra options needed for cia files +ASMOPT:=-fomit-frame-pointer -masm=intel + +# Linker options for DLL +ifndef DLL_WIN_LINKER_OPTS + DLL_WIN_LINKER_OPTS:=$(if $(CODE_COVERAGE),-lgcov) -Wl,-export-all-symbols -Wl,--enable-auto-import +endif +ifndef DLL_LIN_LINKER_OPTS + DLL_LIN_LINKER_OPTS:=$(if $(CODE_COVERAGE),-lgcov) -Wl,-export-all-symbols -ldl +endif + +# Source files to scan for in a directory +# Note that CPP and cpp will match on the same files - so a sort is necessary on wildcard results +SOURCE_EXT:=CPP cpp c cia + +# Source code assumed to be all cpp/cia files in supplied directories +SOURCE_FILES:=$(foreach dir,$(SOURCE_DIRS),$(sort $(foreach ext,$(SOURCE_EXT),$(wildcard $(EXTENSION_ROOT)/$(dir)/*.$(ext))))) \ + $(foreach src,$(SOURCE),$(EXTENSION_ROOT)/$(if $(SOURCE_FOLDER),$(SOURCE_FOLDER)/)$(src)) + +# Include folders +CXXINC:=$(foreach inc,$(INCLUDES) $(SOURCE_DIRS),-I$(EXTENSION_ROOT)/$(inc)) \ + $(foreach inc,$(SYS_INCLUDES),-I$(EPOCROOT)/$(inc)) -I$(EXTENSION_ROOT) + +# Add standard include paths? +ifndef NO_STD_INCLUDE + CXXINC+= -I$(EPOCROOT)/epoc32/include/x86tool -I$(EPOCROOT)/epoc32/include + ifdef S60_BUILD + CXXINC+= -I$(EPOCROOT)/epoc32/include/oem + endif +endif + +# Generate target folder names +TARGET_DIR:=$(EPOCROOT)/epoc32/release/tools2$(TOOLPLATFORMDIR)/$(CFG_PATH)/ +OUTPUTPATH:=$(EPOCROOT)/epoc32/build/x86tools/$(CFG_PATH)/$(TARGET_NAME)/ + +# Target names differ depending on what we're building +ifeq ($(TARGET_TYPE),lib) + TARGET_FULLNAME:=$(TARGET_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a) +endif +ifeq ($(TARGET_TYPE),exe) + TARGET_FULLNAME:=$(TARGET_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(DOTEXE)) + LIBS+=symexestub +endif +ifeq ($(TARGET_TYPE),dll) + TARGET_FULLNAME:=$(TARGET_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(DOTDLL)) +endif + +# Object files are the same name as the source files with a .o extension +OBJECTFILES:=$(foreach src,$(SOURCE_FILES),$(OUTPUTPATH)$(subst $(EPOCROOT),,$(src)).o) + +# Remember what we're going to create for later +CLEANTARGETS:=$(TARGET_FULLNAME) $(OBJECTFILES) +RELEASEABLES:=$(TARGET_FULLNAME) +CREATABLEPATHS:=$(dir $(OBJECTFILES)) + +# Standard targets +$(ALLTARGET):: $(RELEASEABLES) +TARGET:: $(RELEASEABLES) + +# *** +# x86targets +# +define x86targets + # Compile + $(OBJECTFILES) : $(PREINC) $(SOURCE_FILES) + $(call startrule,compile) \ + $(CXX) $(CXXDEFS) $(CXXINC) -I$(EPOCROOT)$$(subst $(OUTPUTPATH),,$$(dir $$@)) $(CXXOPT) $$(if $$(findstring .cia,$$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) $(COMPILE_OPTIONS) -o$$@ $(EPOCROOT)$$(subst $(OUTPUTPATH),,$$(basename $$@)) \ + $(call endrule,compile) + + # Link + $(TARGET_FULLNAME) : $(OBJECTFILES) $(foreach lib,$(LIBS),$(TARGET_DIR)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR)lib$(lib)$(DOTDLL)) + ifeq ($(TARGET_TYPE),lib) + $(call startrule,linklib) \ + $(AR) -r $$@ $(OBJECTFILES) \ + $(call endrule,linklib) + endif + ifeq ($(TARGET_TYPE),exe) + $(call startrule,linkexe) \ + $(CXX) -L$(TARGET_DIR) $(if $(GCOVDIR),-L$(GCOVDIR)) -o$$@ $(OBJECTFILES) $(foreach lib,$(LIBS) $(SHARED_LIBS),-l$(lib)) $(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),-Wl$(CHAR_COMMA)--enable-auto-import,-ldl) \ + $(call endrule,linkexe) + endif + ifeq ($(TARGET_TYPE),dll) + $(call startrule,linkdll) \ + $(CXX) -L$(TARGET_DIR) $(if $(GCOVDIR),-L$(GCOVDIR)) -shared -o$$@ $(OBJECTFILES) $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) $(if $(WIN32),$(DLL_WIN_LINKER_OPTS),$(DLL_LIN_LINKER_OPTS)) \ + $(call endrule,linkdll) + endif +endef + +# Generate the rules +$(eval $(x86targets)) + +# Create folders we need +$(call makepath,$(CREATABLEPATHS)) + +# Cleanup after ourselves +$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(CREATABLEPATHS))) + +# Tell SBS what we're building +$(eval $(call whatmacro,$(RELEASEABLES),WHATTOOLS2)) diff -r c55016431358 -r 0a7b44b10206 symport/flm/x86tool.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/flm/x86tool.xml Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff -r c55016431358 -r 0a7b44b10206 symport/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/group/bld.inf Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,112 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_PLATFORMS +TOOLS2 + +PRJ_EXPORTS + +../inc/x86tool.h /epoc32/include/x86tool/x86tool.h +../f32/inc/f32file.h /epoc32/include/x86tool/f32file.h +../f32/inc/f32file.inl /epoc32/include/x86tool/f32file.inl + +../e32/include/cpudefs.h /epoc32/include/x86tool/cpudefs.h +../e32/include/d32locd.h /epoc32/include/x86tool/d32locd.h +../e32/include/d32locd.inl /epoc32/include/x86tool/d32locd.inl +../e32/include/e32base.h /epoc32/include/x86tool/e32base.h +../e32/include/e32base.inl /epoc32/include/x86tool/e32base.inl +../e32/include/e32btrace.h /epoc32/include/x86tool/e32btrace.h +../e32/include/e32cmn.h /epoc32/include/x86tool/e32cmn.h +../e32/include/e32cmn.inl /epoc32/include/x86tool/e32cmn.inl +../e32/include/e32const.h /epoc32/include/x86tool/e32const.h +../e32/include/e32def.h /epoc32/include/x86tool/e32def.h +../e32/include/e32kpan.h /epoc32/include/x86tool/e32kpan.h +../e32/include/e32lang.h /epoc32/include/x86tool/e32lang.h +../e32/include/e32ldr.h /epoc32/include/x86tool/e32ldr.h +../e32/include/e32math.h /epoc32/include/x86tool/e32math.h +../e32/include/e32panic.h /epoc32/include/x86tool/e32panic.h +../e32/include/e32rom.h /epoc32/include/x86tool/e32rom.h +../e32/include/e32std.h /epoc32/include/x86tool/e32std.h +../e32/include/e32std.inl /epoc32/include/x86tool/e32std.inl +../e32/include/e32ver.h /epoc32/include/x86tool/e32ver.h +../e32/include/partitions.h /epoc32/include/x86tool/partitions.h +../e32/include/u32exec.h /epoc32/include/x86tool/u32exec.h +../e32/include/u32hal.h /epoc32/include/x86tool/u32hal.h +../e32/include/u32std.h /epoc32/include/x86tool/u32std.h +../e32/include/e32shbufcmn.h /epoc32/include/x86tool/e32shbufcmn.h +../e32/include/e32shbuf_priv.h /epoc32/include/x86tool/e32shbuf_priv.h +../e32/include/collate.h /epoc32/include/x86tool/collate.h +../e32/include/e32base_private.h /epoc32/include/x86tool/e32base_private.h +../e32/include/e32capability.h /epoc32/include/x86tool/e32capability.h +../e32/include/e32cmn_private.h /epoc32/include/x86tool/e32cmn_private.h +../e32/include/e32cons.h /epoc32/include/x86tool/e32cons.h +../e32/include/e32const_private.h /epoc32/include/x86tool/e32const_private.h +../e32/include/e32debug.h /epoc32/include/x86tool/e32debug.h +../e32/include/e32def_private.h /epoc32/include/x86tool/e32def_private.h +../e32/include/e32des16.h /epoc32/include/x86tool/e32des16.h +../e32/include/e32des16_private.h /epoc32/include/x86tool/e32des16_private.h +../e32/include/e32des8.h /epoc32/include/x86tool/e32des8.h +../e32/include/e32des8_private.h /epoc32/include/x86tool/e32des8_private.h +../e32/include/e32err.h /epoc32/include/x86tool/e32err.h +../e32/include/e32event.h /epoc32/include/x86tool/e32event.h +../e32/include/e32event_private.h /epoc32/include/x86tool/e32event_private.h +../e32/include/e32hal.h /epoc32/include/x86tool/e32hal.h +../e32/include/e32hashtab.h /epoc32/include/x86tool/e32hashtab.h +../e32/include/e32huffman.h /epoc32/include/x86tool/e32huffman.h +../e32/include/e32keys.h /epoc32/include/x86tool/e32keys.h +../e32/include/e32ktran.h /epoc32/include/x86tool/e32ktran.h +../e32/include/e32lmsg.h /epoc32/include/x86tool/e32lmsg.h +../e32/include/e32math.inl /epoc32/include/x86tool/e32math.inl +../e32/include/e32notif.h /epoc32/include/x86tool/e32notif.h +../e32/include/e32power.h /epoc32/include/x86tool/e32power.h +../e32/include/e32property.h /epoc32/include/x86tool/e32property.h +../e32/include/e32std_private.h /epoc32/include/x86tool/e32std_private.h +../e32/include/e32svr.h /epoc32/include/x86tool/e32svr.h +../e32/include/e32test.h /epoc32/include/x86tool/e32test.h +../e32/include/u32property.h /epoc32/include/x86tool/u32property.h +../e32/include/unicode.h /epoc32/include/x86tool/unicode.h +../e32/include/videodriver.h /epoc32/include/x86tool/videodriver.h + +// Export the symport dll import library +// This is only needed for the old build system to avoid a build order dependency with anything using the symport dll +libsymport.a /epoc32/release/tools2/deb/libsymport.a +libsymport.a /epoc32/release/tools2/rel/libsymport.a + +#include "../symuser/bld.inf" +#include "../symfile/bld.inf" +#include "../symutil/group/bld.inf" + +PRJ_EXTENSIONS + +#ifdef TOOLS2 +// Build DLL version of the port - contains both symuser and symfile +start extension tools/x86tool + + option TARGET_NAME symport + option TARGET_TYPE dll + + option MACROS __MINIMUM_MACHINE_CODE__ __CPU_HAS_CP15_THREAD_ID_REG __USERSIDE_THREAD_DATA__ + option INCLUDES ../e32/include ../bafl/inc ../charconv/framework/inc ../f32/inc ../symuser + + option SOURCE_DIRS ../e32/common ../e32/euser ../e32/euser/cbase ../e32/euser/epoc/x86 ../e32/euser/maths ../e32/euser/unicode \ + ../bafl/src ../charconv/framework/src/charconv \ + ../f32/sfsrv + + option SOURCE_FOLDER ../symuser + option SOURCE symuser.cpp exec.cpp new.cpp loader.cpp x86hlp.cia \ + ../group/ver.cpp + option COMPILE_OPTIONS -Wno-return-type +end +#endif diff -r c55016431358 -r 0a7b44b10206 symport/group/how to build Symport.doc Binary file symport/group/how to build Symport.doc has changed diff -r c55016431358 -r 0a7b44b10206 symport/group/how to use symport.doc Binary file symport/group/how to use symport.doc has changed diff -r c55016431358 -r 0a7b44b10206 symport/group/libsymport.a Binary file symport/group/libsymport.a has changed diff -r c55016431358 -r 0a7b44b10206 symport/group/release.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/group/release.txt Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,20 @@ +NOTESRC_RELEASER +Nokia Corporation + +NOTESRC_RELEASE_REASON +PDT tool + +NOTESRC_GENERAL_COMMENTS +N/A + +NOTESRC_KNOWN_DEVIATIONS +N/A + +NOTESRC_BUGS_FIXED +N/A + +NOTESRC_BUGS_REMAINING +N/A + +NOTESRC_OTHER_CHANGES + diff -r c55016431358 -r 0a7b44b10206 symport/group/symport.mrp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/group/symport.mrp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,21 @@ +component dev_hostenv_cpptoolsplat_symport + +source /src/tools/dev/hostenv/cpptoolsplat/symport +binary /src/tools/dev/hostenv/cpptoolsplat/symport/group all +exports /src/tools/dev/hostenv/cpptoolsplat/symport/group + +notes_source /src/tools/dev/hostenv/cpptoolsplat/symport/group/release.txt + +ipr T +ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/bafl +ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/bldtest +ipr E /src/tools/dev/hostenv/cpptoolsplat/symport/charconv +ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/e32 +ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/f32/inc +ipr A /src/tools/dev/hostenv/cpptoolsplat/symport/f32/sfsrv +ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/flm +ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/group +ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/inc +ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/symfile +ipr D /src/tools/dev/hostenv/cpptoolsplat/symport/symuser +ipr T /src/tools/dev/hostenv/cpptoolsplat/symport/symutil diff -r c55016431358 -r 0a7b44b10206 symport/group/test.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/group/test.pl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,298 @@ +#!/usr/bin/perl + +# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +use strict; +use Test::Harness; +use Getopt::Long qw(:config auto_version auto_help); +use File::Spec::Functions; +use Cwd; + +$Test::Harness::Verbose = 1; + +# Version of the script - just use the date +$main::VERSION = '17-Oct-08'; + +# a list of all the tests. +my @all = ( +'../bldtest/test.pl', +'../symuser/test.pl', +'../symfile/test.pl' +); + +my ( $verbose, $ignore, $coverage ); +GetOptions("verbose" => \$verbose, "ignore" => \$ignore, "coverage" => \$coverage) or pod2usage(2); + +# Get OS version +my $win32 = 1 if $^O =~ /MSWin32/; +print "Running on Win32\n" if $win32 && $verbose; +print "Running on Linux\n" if !$win32 && $verbose; + +# Clear coverage stats and rebuild the code with coverage enabled +if ($coverage) + { + clearCoverageStats(); + setCoverage(1); + } + +# Run all the tests +my $fail; +eval { runtests(@all); }; +$fail = $@ if $@; + +# Show coverage stats and rebuild the code with coverage disabled +if ($coverage) + { + showCoverageStats(); + setCoverage(0); + clearCoverageStats(); + } +die $fail if $fail; + +# Show coverage stats +sub showCoverageStats + { + my %hits; + + my $loc = cwd(); + print "Calculating converage stats...\n"; + + # Find all the GCDA files + my @dirs = "$ENV{EPOCROOT}epoc32/build"; + foreach my $dir ( @dirs ) + { + opendir DIR, $dir or die "Failed on $dir: $!"; + foreach my $child ( readdir DIR ) + { + next if $child =~ /^\./; + + push @{ $hits{$dir} }, "$child" if $child =~ /\.gcda$/; + push @dirs, "$dir/$child" if -d "$dir/$child"; + } + closedir DIR; + } + + # Collect the stats + my %result; + foreach my $dir ( keys %hits ) + { + chdir($dir) or die "Failed: $!"; + my $cmd = $win32 ? "$ENV{EPOCROOT}epoc32/gcc_mingw/bin/gcov.exe @{ $hits{$dir} }" : "gcov @{ $hits{$dir} }"; + print "Executing: $cmd\n"; + open CMD, "$cmd|" or die "Failed: $!"; + while(my $line = ) + { + if ($line =~ /Lines executed:(\d+.\d+)% of (\d+)/) + { + my ($total, $coverage) = ( $2, int(($2 / 100) * $1)); + my $oldline = $line; + $line = ; + + # Filter by filename symport/ + if ($line =~ m[symport/([^/]+)/]) + { + print "\t$oldline"; + my $comp = $1; + + $result{$comp}{total} = $result{$comp}{total} ? $result{$comp}{total} + $total : $total; + $result{$comp}{coverage} = $result{$comp}{coverage} ? $result{$comp}{coverage} + $coverage : $coverage; + } + else + { + print STDERR "Unknown: Line $. - $line" if $verbose; + } + } + } + close CMD; + } + + # Print a summary of the stats + print "\nTEST COVERAGE RESULTS\n"; + foreach ( keys %result ) + { + my $percent = ($result{$_}{coverage}/$result{$_}{total})*100; + print "$_: $result{$_}{coverage}/$result{$_}{total} (${percent}%)\n"; + } + chdir($loc); + } + +# Make sure all GCDA files are deleted +sub clearCoverageStats + { + print "Clearing converage stats...\n" if $verbose; + + my @dirs = "$ENV{EPOCROOT}epoc32/build"; + foreach my $dir ( @dirs ) + { + opendir DIR, $dir or die "Failed on $dir: $!"; + foreach my $child ( readdir DIR ) + { + next if $child =~ /^\./; + + if ($child =~ /\.gcda$/) + { + print "Deleting: $dir/$child\n" if $verbose; + unlink "$dir/$child"; + } + push @dirs, "$dir/$child" if -d "$dir/$child"; + } + closedir DIR; + } + } + +# Enables/Disables code coverage +sub setCoverage + { + my $enable = shift; + + if ($verbose) { print $enable ? "Enabling code coverage...\n" : "Disabling code coverage...\n"; } + my $makefile = catfile($ENV{EPOCROOT}, 'epoc32', 'tools', 'makefile_templates', 'tools', 'x86tool.mk'); + die "Can't find makefile $makefile" if !-e $makefile; + + # Read the makefile + my @lines; + open IN, $makefile or die "Failed to open $makefile: $!"; + while() + { + if (/CODE_COVERAGE:=/) + { + push @lines, $enable ? "CODE_COVERAGE:=1\n" : "CODE_COVERAGE:=\n"; + next; + } + push @lines, $_; + } + close IN; + + # Write out the makefile with the change + open OUT, ">$makefile" or die "Failed to open $makefile for writing: $!"; + print OUT @lines; + close OUT; + + # Now do the same for the new build system + my $xml = catfile($ENV{SBS_HOME}, 'lib', 'flm', 'x86tool.xml'); + die "Can't find xml $xml" if !-e $xml; + + # Read the makefile + @lines = (); + open IN, $xml or die "Failed to open $xml: $!"; + while() + { + if (/(\s*)/) + { + push @lines, sprintf("$1%s$2\n", $enable ? '1' : ''); + next; + } + push @lines, $_; + } + close IN; + + # Write out the makefile with the change + open OUT, ">$xml" or die "Failed to open $xml for writing: $!"; + print OUT @lines; + close OUT; + + doClean(); + doBuild(); + } + +# *** +# Get the version of the build system +# * +sub getBuildVersion + { + # First of all see if SBSv2 is installed + my $sbs_ver = 1; + open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!"; + while() + { + if (/^sbs version/) + { + $sbs_ver = 2; + last; + } + } + close SBS; + + # Override the result using environment variable + $sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1; + return $sbs_ver; + } + +# *** +# Cleans the code +# * +sub doClean + { + print "Cleaning code...\n" if $verbose; + my $sbs_ver = getBuildVersion(); + my $redir = $verbose?'':' >nul 2>&1'; + + if ($sbs_ver == 1) + { + # Use the old build system + system("bldmake bldfiles$redir"); + system("abld makefile$redir"); + system("abld clean$redir"); + } + else + { + # Use the new build system + system("sbs -c tools2 CLEAN$redir"); + system("sbs -c winscw CLEAN$redir"); + } + } + +# *** +# Builds the code +# * +sub doBuild + { + print "Building code...\n" if $verbose; + my $sbs_ver = getBuildVersion(); + my $redir = $verbose?'':' >nul 2>&1'; + + # Now build the test code - assumes current working directory is correct! + print "Using SBSv$sbs_ver\n" if $verbose; + if ($sbs_ver == 1) + { + + # Use the old build system + system("bldmake bldfiles$redir"); + system("abld build$redir"); + } + else + { + # Use the new build system + system("sbs -c tools2$redir"); + system("sbs -c winscw$redir"); + } + } + +=head1 NAME + +test.pl - A script for running other tests + +=head1 SYNOPSIS + +test.pl [-help] [-version] [-verbose] [-coverage] + + Options: + -help brief help message + -version version of the script + -verbose print what the scripts does + -coverage gather code coverage stats (rebuilds everything twice) + +=cut diff -r c55016431358 -r 0a7b44b10206 symport/group/ver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/group/ver.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,21 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +EXPORT_C TVersion SymPortVersion() + { + return TVersion(1, 0, 0); + } diff -r c55016431358 -r 0a7b44b10206 symport/inc/x86tool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/inc/x86tool.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,112 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// This is the preinclude file for SYMPORT +// +// + +/** + @file + @publishedAll + @released +*/ + +// compiler and STLport things first +#define _STLP_THREADS +#define _STLP_DESIGNATED_DLL + +// Pick up relevant macros under __GCC32__, since __GCC32__ is not a valid macro for TOOLS2 + +#define __NO_CLASS_CONSTS__ +#define __NORETURN__ __attribute__ ((noreturn)) + +#ifdef __GCCV3__ +#define __NORETURN_TERMINATOR() +#else +#define __NORETURN_TERMINATOR() abort() +#endif + +#define IMPORT_C +#define IMPORT_D +#ifdef _WIN32 +#define EXPORT_C __declspec(dllexport) +#define EXPORT_D __declspec(dllexport) +#else +#define EXPORT_C +#define EXPORT_D +#endif + +#define NONSHARABLE_CLASS(x) class x +#define NONSHARABLE_STRUCT(x) struct x + +#ifndef __TOOLS2__ +#define __NO_THROW +#else +#include +#ifndef _WIN32 +#include +#endif +#define __NO_THROW throw(std::bad_alloc) +#endif + +typedef long long Int64; +typedef unsigned long long Uint64; +#define I64LIT(x) x##LL +#define UI64LIT(x) x##ULL +#define TEMPLATE_SPECIALIZATION template<> +#define __TText_defined +#ifdef __TOOLS2__ +#ifndef _WIN32 +#include // Linux definition of wchar_t +#endif +#endif + +typedef wchar_t __TText; + +// Symbian things next /////////////////////////////////////////////////////// + +#ifdef __PRODUCT_INCLUDE__ +#include __PRODUCT_INCLUDE__ +#endif + +// Do not use inline new in e32cmn.h +#define __PLACEMENT_NEW_INLINE +#define __PLACEMENT_VEC_NEW_INLINE +// avoid e32tools/filesystem/include/mingw.inl nonsense +#ifdef _WIN32 +#define _MINGW_INL +#endif + +// Varargs +typedef __builtin_va_list va_list; +#define va_start(v, l) __builtin_va_start(v, l) +#define va_arg(v, l) __builtin_va_arg(v, l) +#define va_end(v) __builtin_va_end(v) +#define VA_LIST va_list +#define _VA_LIST_DEFINED //To deal with stdarg.h +#define __VA_LIST_defined //To deal with e32def.h +#define VA_START(ap,pn) va_start(ap, pn) +#define VA_ARG(ap,type) va_arg(ap,type) +#define VA_END(ap) va_end(ap) + +#ifdef __TOOLS2__ +#ifndef _WIN32 + #define asm(EXPR) __asm(".intel_syntax noprefix\n\t" EXPR) +#else + #define asm __asm +#endif +#endif + + +// the end of the pre-include + diff -r c55016431358 -r 0a7b44b10206 symport/symfile/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symfile/bld.inf Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,59 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_PLATFORMS +WINSCW TOOLS2 + +PRJ_EXTENSIONS + +#ifdef TOOLS2 +start extension tools/x86tool + + option TARGET_NAME symfile + option TARGET_TYPE lib + + option SOURCE_DIRS ../f32/sfsrv + option INCLUDES ../e32/include ../f32/inc + +// option MACROS _DEBUG_LOGGING +end +#endif + +PRJ_TESTMMPFILES + +#ifdef WINSCW +t_symfile +#endif + +PRJ_TESTEXTENSIONS + +#ifdef TOOLS2 +start extension tools/x86tool + + option TARGET_NAME t_symfile + option TARGET_TYPE exe + option SOURCE test.cpp + option LIBS symfile symuser +end + +start extension tools/x86tool + + option TARGET_NAME t_symfile_dll + option TARGET_TYPE exe + option SOURCE test.cpp + option SHARED_LIBS symport + option MACROS USING_SYMPORT_DLL +end +#endif diff -r c55016431358 -r 0a7b44b10206 symport/symfile/t_symfile.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symfile/t_symfile.mmp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,21 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +TARGET t_symfile.exe +TARGETTYPE exe +SOURCEPATH . +SOURCE test.cpp +LIBRARY EUSER.LIB EFSRV.LIB +SYSTEMINCLUDE \EPOC32\INCLUDE diff -r c55016431358 -r 0a7b44b10206 symport/symfile/test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symfile/test.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,2676 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifdef __TOOLS2__ +#include +#include +#ifdef linux +#include +#endif +#endif + +#include +#include + +RTest test(_L("SymFile RFs Tests")); + +void testAtt() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestDir1, "c:\\symport_test_rfs1\\"); + _LIT(KTestFile, "c:\\symport_test_rfs1\\test.txt"); + + // Test with root + TUint att; + test(fs.Att(_L("C:\\"), att) == KErrBadName); + test(fs.Att(_L("\\"), att) == KErrBadName); + + // Make sure the directory doesn't exist + TInt err = fs.Delete(KTestFile); + test(err == KErrNone || err == KErrNotFound || err == KErrPathNotFound); + err = fs.RmDir(KTestDir1); + test(err == KErrNone || err == KErrNotFound); + + // Check it fails + test(fs.Att(KTestDir1, att) == KErrNotFound); + + // See if it works for directories + test(fs.MkDir(KTestDir1) == KErrNone); + test(fs.Att(KTestDir1, att) == KErrNone && att&KEntryAttDir); + + // See if it works for normal files + test(fs.Att(KTestFile, att) == KErrNotFound); + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + test(fs.Att(KTestFile, att) == KErrNone); + test(!(att&KEntryAttDir)); + + // Check readonly flag + test(!(att&KEntryAttReadOnly)); + test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone); + test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly); + + // Clear the flag + test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone); + test(fs.Att(KTestFile, att) == KErrNone); + test(!(att&KEntryAttReadOnly)); + + // Delete the file and make sure it goes away + test(fs.RmDir(KTestDir1) == KErrInUse); + test(fs.Delete(KTestFile) == KErrNone); + test(fs.Att(KTestFile, att) == KErrNotFound); + + // Delete directory and make sure it really went away + test(fs.RmDir(KTestDir1) == KErrNone); + test(fs.Att(KTestDir1, att) == KErrNotFound); + + fs.Close(); + } + +void testSetAtt() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + // Make sure the file doesn't exist + _LIT(KTestFile, "c:\\symport_test_rfs2_test.txt"); + fs.SetAtt(KTestFile, 0, KEntryAttReadOnly); + fs.Delete(KTestFile); + + // File doesn't exist + test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNotFound); + + // Create a file + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + // Set readonly flag + TUint att; + test(fs.Att(KTestFile, att) == KErrNone); + test(!(att&KEntryAttReadOnly)); + test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone); + test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly); + + // Clear readonly flag + test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone); + test(fs.Att(KTestFile, att) == KErrNone); + test(!(att&KEntryAttReadOnly)); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testModified() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + // Make sure the file doesn't exist + _LIT(KTestFile, "c:\\symport_test_rfs2a_test.txt"); + fs.Delete(KTestFile); + + // Get time now + TTime start; + start.UniversalTime(); + + // File doesn't exist + TTime time1; + test(fs.Modified(KTestFile, time1) == KErrNotFound); + User::After(1000000); + + // Create a file + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + // Get modified time + test(fs.Modified(KTestFile, time1) == KErrNone && time1 > start); + User::After(1000000); + + // Edit the file + test(file.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + // Get modified time + TTime time2; + test(fs.Modified(KTestFile, time2) == KErrNone && time2 > time1); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testMkDirAll() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child"); + fs.Delete(KTestFile); + + // Make sure the directories don't exist already + _LIT(KTestDirParent1, "c:\\symport_test_rfs3_parent\\"); + _LIT(KTestDir1, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child\\"); + fs.RmDir(KTestDir1); + fs.RmDir(KTestDirParent1); + + // Check it can handle drive letter + test(fs.MkDirAll(KTestDir1) == KErrNone); + test(fs.MkDirAll(KTestDir1) == KErrAlreadyExists); + TUint att; + test(fs.Att(KTestDir1, att) == KErrNone && att&KEntryAttDir); + + // Delete the folder for the next test + test(fs.RmDir(KTestDir1) == KErrNone && fs.RmDir(KTestDirParent1) == KErrNone); + TInt err = fs.Att(KTestDir1, att); + test(err == KErrNotFound || err == KErrPathNotFound); + + // Check it fails if file is encountered + test(fs.MkDir(KTestDirParent1) == KErrNone); + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + test(fs.MkDirAll(KTestDir1) == KErrAccessDenied); + + // Check for failure on itermediate file + _LIT(KTestDir3, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child\\wibble\\"); + test(fs.MkDirAll(KTestDir3) == KErrAccessDenied); + + test(fs.Delete(KTestFile) == KErrNone); + test(fs.RmDir(KTestDirParent1) == KErrNone); + + fs.Close(); + } + +void testMkDir() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestDir1, "c:\\symport_test_rfs5\\"); + _LIT(KTestFile, "c:\\symport_test_rfs5"); + _LIT(KTestDir1Sub, "c:\\symport_test_rfs5\\sub\\"); + + // Make sure the test stuff doesn't exist already + fs.RmDir(KTestDir1Sub); + fs.Delete(KTestFile); + fs.RmDir(KTestDir1); + + // Check the directory can be created + TUint att; + test(fs.MkDir(KTestDir1) == KErrNone); + test(fs.MkDir(KTestDir1) == KErrAlreadyExists); + test(fs.Att(KTestDir1, att) == KErrNone); + test(fs.MkDir(KTestDir1Sub) == KErrNone); + test(fs.MkDir(KTestDir1Sub) == KErrAlreadyExists); + test(fs.RmDir(KTestDir1Sub) == KErrNone); + test(fs.RmDir(KTestDir1) == KErrNone); + test(fs.Att(KTestDir1, att) == KErrNotFound); + + // Check file error + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + test(fs.MkDir(KTestDir1) == KErrAccessDenied); + test(fs.Delete(KTestFile) == KErrNone); + + fs.Close(); + } + +void testRmDir() + { + RFs fs; + test(fs.Connect() == KErrNone); + + // Make sure the test stuff isn't there + _LIT(KTestDir1, "c:\\symport_test_rfs6\\"); + _LIT(KTestFile, "c:\\symport_test_rfs6\\testfile"); + _LIT(KTestDir3, "c:\\symport_test_rfs6\\testfile\\"); + fs.Delete(KTestFile); + fs.RmDir(KTestDir1); + + // Create the directory and make sure you can delete it + TUint att; + test(fs.MkDir(KTestDir1) == KErrNone); + test(fs.Att(KTestDir1, att) == KErrNone && att|KEntryAttDir); + test(fs.RmDir(KTestDir1) == KErrNone); + test(fs.RmDir(KTestDir1) == KErrNotFound); + test(fs.Att(KTestDir1, att) == KErrNotFound); + + test(fs.MkDir(KTestDir1) == KErrNone); + test(fs.Att(KTestDir1, att) == KErrNone && att|KEntryAttDir); + + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + // Check you can't delete a file or a none empty directory + TInt err = fs.RmDir(KTestDir3); + test(err == KErrNotFound || err == KErrPathNotFound); + test(fs.RmDir(KTestDir1) == KErrInUse); + test(fs.Delete(KTestFile) == KErrNone); + test(fs.RmDir(KTestDir1) == KErrNone); + + // KErrInUse when removing a root directory + test(fs.RmDir(_L("c:\\")) == KErrInUse); + + fs.Close(); + } + +void testParse() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile, "c:\\symport_test_rfs7.txt"); + fs.Delete(KTestFile); + + // Parse file spec + TParse parse; + test(fs.Parse(KTestFile, parse) == KErrNone); + + // See if we can create the file + RFile file; + test(file.Create(fs, parse.FullName(), EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + test(fs.Delete(parse.FullName()) == KErrNone); + + fs.Close(); + } + +void testSessionPath() + { + RFs fs; + test(fs.Connect() == KErrNone); + + // Check we get a session path + TFileName name; + test(fs.SessionPath(name) == KErrNone); + test(name.Length() > 0); + + // Check there's a backslash on the end and no forward slashes + test(name[name.Length() - 1] == TChar('\\')); + test(name.Locate(TChar('/')) == KErrNotFound); + + fs.Close(); + } + +void testSetSessionPath() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestDir1, "c:\\symport_test_rfs8\\"); + _LIT(KTestFile1, "c:\\symport_test_rfs8\\test"); + _LIT(KTestFilename1, "test"); + fs.Delete(KTestFile1); + fs.RmDir(KTestDir1); + + // Check we get a session path + TFileName name; + test(fs.SessionPath(name) == KErrNone); + test(name.Length() > 0); + + // Check we can set it + fs.SetSessionPath(KTestDir1); + test(fs.MkDir(KTestDir1) == KErrNone); + test(fs.SetSessionPath(KTestDir1) == KErrNone); + + // See if we can create a file in the session path + RFile file; + test(file.Create(fs, KTestFilename1, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + // Check the file is there + TUint att; + test(fs.Att(KTestFile1, att) == KErrNone); + test(fs.Delete(KTestFilename1) == KErrNone); + + // Reset session path! + test(fs.SetSessionPath(name) == KErrNone); + test(fs.RmDir(KTestDir1) == KErrNone); + + fs.Close(); + } + +void testDelete() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestDir, "c:\\symport_test_rfs9\\"); + _LIT(KTestFile, "c:\\symport_test_rfs9"); + fs.Delete(KTestFile); + fs.RmDir(KTestDir); + + // Error if the file doesn't exist + test(fs.Delete(KTestFile) == KErrNotFound); + + // Create the file + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + + + +// On Linux it seems it's perfectly correct to "delete" an open file + +// Removing an open file is sometimes recommended to hide the names of temporary files that may be prone to attack! + + TInt err = 0; +#ifndef linux + + // Should be locked + + err = fs.Delete(KTestFile); + test(err == KErrInUse || err == KErrAccessDenied); +#endif + + file.Close(); + + // Check success + test(fs.Delete(KTestFile) == KErrNone); + test(fs.Delete(KTestFile) == KErrNotFound); + + // Check you can't delete a directory + test(fs.MkDir(KTestDir) == KErrNone); + test(fs.Delete(KTestFile) == KErrAccessDenied); + + err = fs.Delete(KTestDir); + test(err == KErrBadName || err == KErrAccessDenied); + test(fs.RmDir(KTestDir) == KErrNone); + + fs.Close(); + } + +// This is only valid for TOOLS2 +#ifdef __TOOLS2__ +extern TInt gBlockSize; +extern TInt gClusterSize; +void testVolumeIOParam() + { + RFs fs; + test(fs.Connect() == KErrNone); + + // We rely on this error code being returned - preventing STORE cleverness? + TVolumeIOParamInfo param; + param.iBlockSize = 0; + param.iClusterSize = 0; + param.iRecReadBufSize = 0; + param.iRecWriteBufSize = 0; + + test(fs.VolumeIOParam(EDriveC, param) == KErrNone); + + test(param.iBlockSize == 4096); + test(param.iClusterSize == 4096); + test(param.iRecReadBufSize == 4096); + test(param.iRecWriteBufSize == 4096); + + gBlockSize = 8096; + gClusterSize = 8096; + + test(fs.VolumeIOParam(EDriveC, param) == KErrNone); + + test(param.iBlockSize == 8096); + test(param.iClusterSize == 8096); + test(param.iRecReadBufSize == 4096); + test(param.iRecWriteBufSize == 4096); + + fs.Close(); + } +#endif + +void testEntry() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile, "c:\\symport_test_rfs10"); + _LIT(KTestDir, "c:\\symport_test_rfs10_dir\\"); + fs.Delete(KTestFile); + fs.RmDir(KTestDir); + + // Check error when file doesn't exist + TEntry entry; + test(fs.Entry(KTestFile, entry) == KErrNotFound); + + // Create test data + TUidType testUid(TUid::Uid(0x1), TUid::Uid(0x2), TUid::Uid(0x3)); + TCheckedUid checkedUid(testUid); + TPckg checkedUidBuf(checkedUid); + + // Create the file + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(checkedUidBuf) == KErrNone); + file.Close(); + + // Get file details + User::After(1000000); + test(fs.Entry(KTestFile, entry) == KErrNone); + + // Check the data looks right + test(entry.iSize == checkedUidBuf.Length()); + test(entry.iType == testUid); + test(entry.iName == KTestFile().Mid(3)); // No path + test(!(entry.iAtt&KEntryAttDir)); + + TTimeIntervalSeconds sec; + TTime now; now.UniversalTime(); + test(now.SecondsFrom(entry.iModified, sec) == KErrNone); + test(sec.Int() >= 1); + + _LIT8(KTestText, "Some junk that is not a uid"); + User::After(2000000); + + test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(KTestText) == KErrNone); + file.Close(); + + // Get file details + test(fs.Entry(KTestFile, entry) == KErrNone); + + // Check the data looks right + test(entry.iSize == KTestText().Length()); + test(entry.iType == TUidType(TUid::Uid(0), TUid::Uid(0), TUid::Uid(0))); + test(entry.iName == KTestFile().Mid(3)); // No path + + test(now.SecondsFrom(entry.iModified, sec) == KErrNone); + test(sec.Int() <= -1); + + // Test it works for directories + test(fs.Entry(KTestDir, entry) == KErrNotFound); + test(fs.MkDir(KTestDir) == KErrNone); + test(fs.Entry(KTestDir, entry) == KErrNone); + test(entry.iSize == 0); + test(entry.iType == TUidType(TUid::Null(), TUid::Null(), TUid::Null())); + test(entry.iName == KTestDir().Mid(3, KTestDir().Length() - 4)); // Lose path and end slash + test(entry.iAtt&KEntryAttDir); + + test(fs.Delete(KTestFile) == KErrNone); + test(fs.RmDir(KTestDir) == KErrNone); + fs.Close(); + } + +void testSetEntry() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + TTime start; + start.UniversalTime(); + + // Make sure the file doesn't exist + _LIT(KTestFile, "c:\\symport_test_rfs2b_test.txt"); + fs.SetEntry(KTestFile, start, 0, KEntryAttReadOnly); + fs.Delete(KTestFile); + + // File doesn't exist + test(fs.SetEntry(KTestFile, start, KEntryAttReadOnly, 0) == KErrNotFound); + + // Create a file + RFile file; + test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + // Set readonly flag + TUint att; + test(fs.Att(KTestFile, att) == KErrNone && !(att&KEntryAttReadOnly)); + test(fs.SetEntry(KTestFile, start, KEntryAttReadOnly, 0) == KErrNone); + test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly); + + // Clear readonly flag + test(fs.SetEntry(KTestFile, start, 0, KEntryAttReadOnly) == KErrNone); + test(fs.Att(KTestFile, att) == KErrNone && !(att&KEntryAttReadOnly)); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +// Only relevant to TOOLS2 +#ifdef __TOOLS2__ +void testSetErrorCondition() + { + RFs fs; + test(fs.Connect() == KErrNone); + test(fs.SetErrorCondition(KErrGeneral, 1) == KErrNotSupported); + fs.Close(); + } +#endif + +void testCharToDrive() + { + RFs fs; + test(fs.Connect() == KErrNone); + + TInt drive; + + // Test invalid + test(fs.CharToDrive(TChar('$'), drive) == KErrArgument); + + // Test valid - upper and lower case + test(fs.CharToDrive(TChar('a'), drive) == KErrNone && drive == EDriveA); + test(fs.CharToDrive(TChar('A'), drive) == KErrNone && drive == EDriveA); + test(fs.CharToDrive(TChar('z'), drive) == KErrNone && drive == EDriveZ); + test(fs.CharToDrive(TChar('Z'), drive) == KErrNone && drive == EDriveZ); + + fs.Close(); + } + +void testDriveToChar() + { + RFs fs; + test(fs.Connect() == KErrNone); + + TChar dChar; + + // Test invalid + test(fs.DriveToChar(99, dChar) == KErrArgument); + + // Ask for default drive + test(fs.DriveToChar(KDefaultDrive, dChar) == KErrNone); + + test(TUint(dChar) >= TUint(TChar('A'))); + + test(TUint(dChar) <= TUint(TChar('Z'))); + + // Check valid + test(fs.DriveToChar(EDriveA, dChar) == KErrNone && dChar == TChar('A')); + test(fs.DriveToChar(EDriveZ, dChar) == KErrNone && dChar == TChar('Z')); + + fs.Close(); + } + +void testIsValidDrive() + { + RFs fs; + test(fs.Connect() == KErrNone); + + // Invalid + test(!fs.IsValidDrive(99)); + test(!fs.IsValidDrive(-99)); + + // Valid + test(fs.IsValidDrive(KDefaultDrive)); + test(fs.IsValidDrive(EDriveA)); + test(fs.IsValidDrive(EDriveZ)); + + fs.Close(); + } + +void testDrive() + { + RFs fs; + test(fs.Connect() == KErrNone); + + // Test invalid drive + TDriveInfo drive; + test(fs.Drive(drive, 99) == KErrBadName); + +#ifdef __TOOLS2__ + // Test valid drives + test(fs.Drive(drive, EDriveC) == KErrNone); + test(drive.iType == EMediaHardDisk && drive.iBattery == EBatNotSupported && drive.iDriveAtt&KDriveAttLocal|KDriveAttInternal && drive.iMediaAtt == 0); + test(fs.Drive(drive, KDefaultDrive) == KErrNone); + test(drive.iType == EMediaHardDisk && drive.iBattery == EBatNotSupported && drive.iDriveAtt&KDriveAttLocal|KDriveAttInternal && drive.iMediaAtt == 0); +#endif + + fs.Close(); + } + +void testGetSystemDrive() + { + RFs fs; + test(fs.Connect() == KErrNone); + test(fs.GetSystemDrive() == EDriveC); + test(fs.GetSystemDriveChar() == TChar('C')); + fs.Close(); + } + +void testReplace() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile1, "c:\\symport_test_rfs11a"); + _LIT(KTestFile2, "c:\\symport_test_rfs11b"); + + fs.Delete(KTestFile1); + fs.Delete(KTestFile2); + + // Error when file doesn't exist + test(fs.Replace(KTestFile1, KTestFile2) == KErrNotFound); + + RFile file; + test(file.Create(fs, KTestFile1, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + // Test success + test(fs.Replace(KTestFile1, KTestFile2) == KErrNone); + + TUint att; + test(fs.Att(KTestFile1, att) == KErrNotFound); + test(fs.Att(KTestFile2, att) == KErrNone); + test(fs.Replace(KTestFile2, KTestFile1) == KErrNone); + test(fs.Att(KTestFile1, att) == KErrNone); + test(fs.Att(KTestFile2, att) == KErrNotFound); + + // Test when both files exist + test(file.Create(fs, KTestFile2, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + test(fs.Att(KTestFile1, att) == KErrNone); + test(fs.Att(KTestFile2, att) == KErrNone); + test(fs.Replace(KTestFile1, KTestFile2) == KErrNone); + test(fs.Att(KTestFile1, att) == KErrNotFound); + test(fs.Att(KTestFile2, att) == KErrNone); + + test(fs.Replace(KTestFile2, KTestFile1) == KErrNone); + test(fs.Att(KTestFile1, att) == KErrNone); + test(fs.Att(KTestFile2, att) == KErrNotFound); + + test(fs.Delete(KTestFile1) == KErrNone); + fs.Close(); + } + +void testRename() + { + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile1, "c:\\symport_test_rfs12a"); + _LIT(KTestFile2, "c:\\symport_test_rfs12b"); + + _LIT(KTestDir1, "c:\\symport_test_rfs12a\\"); + _LIT(KTestDir2, "c:\\symport_test_rfs12b\\"); + + fs.Delete(KTestFile1); + fs.Delete(KTestFile2); + fs.RmDir(KTestDir1); + fs.RmDir(KTestDir2); + + // Error when source doesn't exist + test(fs.Rename(KTestFile1, KTestFile2) == KErrNotFound); + + // Error when destination does exist + RFile file; + test(file.Create(fs, KTestFile1, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + test(file.Create(fs, KTestFile2, EFileShareAny|EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + test(fs.Rename(KTestFile1, KTestFile2) == KErrAlreadyExists); + test(fs.Delete(KTestFile2) == KErrNone); + + // Test Success + test(fs.SetAtt(KTestFile1, 0, KEntryAttReadOnly) == KErrNone); + test(fs.Rename(KTestFile1, KTestFile2) == KErrNone); + + TUint att; + test(fs.Att(KTestFile1, att) == KErrNotFound); + test(fs.Att(KTestFile2, att) == KErrNone); + test(fs.Rename(KTestFile2, KTestFile1) == KErrNone); + test(fs.Att(KTestFile1, att) == KErrNone); + test(fs.Att(KTestFile2, att) == KErrNotFound); + + test(fs.Delete(KTestFile1) == KErrNone); + + fs.Close(); + } + +TPtrC test_string=_L("Y:\\"); +LOCAL_C void TestTParse1() +// +// Test all TParse methods +// + { + TBuf<16> relatedFiles(_L(".CCC")); + TBuf<16> defaultPath(_L("C:\\")); + TParse parser; + TInt r=parser.Set(_L("\\WWW\\XXX\\YYY\\ZZZ\\AAA"),&relatedFiles,&defaultPath); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC")); + test(parser.Drive()==_L("C:")); + test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\")); + test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\")); + test(parser.Name()==_L("AAA")); + test(parser.Ext()==_L(".CCC")); + test(parser.NameAndExt()==_L("AAA.CCC")); + test(parser.DrivePresent()==EFalse); + test(parser.PathPresent()); + test(parser.NamePresent()); + test(parser.ExtPresent()==EFalse); + test(parser.NameOrExtPresent()); + test(parser.IsRoot()==EFalse); + test(parser.IsWild()==EFalse); + test(parser.IsNameWild()==EFalse); + test(parser.IsExtWild()==EFalse); + r=parser.SetNoWild(_L("\\WWW\\XXX\\YYY\\ZZZ\\AAA.EXT"),&relatedFiles,&defaultPath); + test(r==KErrNone); + test(parser.PopDir()==KErrNone); + test(parser.AddDir(_L("BBB"))==KErrNone); + } + +LOCAL_C void TestTParse2() +// +// Test multiple PopDirs +// + { + + TParse parser; + TInt r=parser.Set(_L("\\WWW\\XXX\\YYY\\ZZZ\\"),NULL,NULL); +// TParsePtrC parser(_L("\\WWW\\XXX\\YYY\\ZZZ\\")); + test(r==KErrNone); + r=parser.PopDir(); + test(r==KErrNone); + test(parser.Path()==_L("\\WWW\\XXX\\YYY\\")); + r=parser.PopDir(); + test(r==KErrNone); + test(parser.Path()==_L("\\WWW\\XXX\\")); + r=parser.PopDir(); + test(r==KErrNone); + test(parser.Path()==_L("\\WWW\\")); + r=parser.PopDir(); + test(r==KErrNone); + test(parser.Path()==_L("\\")); + r=parser.PopDir(); + test(r==KErrGeneral); +// + test(parser.Set(_L("C:\\Documents\\.TXT"),NULL,NULL)==KErrNone); + test(parser.PopDir()==KErrNone); + test(parser.FullName()==_L("C:\\.TXT")); + } + +LOCAL_C void TestTParse3() +// +// Test conflicting drive letters +// + { + + TParse parser; + TPtrC one=_L("\\ONE\\"); + TPtrC null=_L("\\"); + TPtrC x=_L("X:"); + TPtrC x2=_L("X:\\"); + TPtrC z=_L("Z:"); + TInt r=parser.Set(_L("Z:\\Hello"),&one,&null); + test(r==KErrNone); + test(parser.FullName()==_L("Z:\\Hello")); + TPtrC sht=_L("*.SHT"); + r=parser.Set(_L("Z:"),&sht,&x); + test(r==KErrNone); + test(parser.FullName()==_L("Z:*.SHT")); + r=parser.Set(_L("Hello"),&z,&x2); + test(r==KErrNone); + test(parser.FullName()==_L("Z:\\Hello")); + r=parser.Set(_L("W:\\Hello"),&z,&x2); + test(r==KErrNone); + test(parser.FullName()==_L("W:\\Hello")); + TPtrC abcdefg=_L("abcdefg"); + TPtrC onetwo=_L("X:\\ONE\\TWO\\.CCC"); + r=parser.Set(_L("W:"),&abcdefg,&onetwo); + test(r==KErrNone); + test(parser.FullName()==_L("W:\\ONE\\TWO\\abcdefg.CCC")); + TPtrC y=_L("Y:"); + TPtrC xhello=_L("X:\\HELLO\\"); + r=parser.Set(_L("World"),&y,&xhello); + test(r==KErrNone); + test(parser.FullName()==_L("Y:\\HELLO\\World")); + TPtrC xhelloext=_L("X:\\HELLO\\.EXT"); + r=parser.Set(_L("World"),&y,&xhelloext); + test(r==KErrNone); + test(parser.FullName()==_L("Y:\\HELLO\\World.EXT")); + } + +LOCAL_C void TestTParse4() +// +// Conflicting relative path drives and names +// + { + + TParse parser; + TPtrC xone=_L("X:\\ONE\\"); + TPtrC y=_L("Y:\\"); + TInt r=parser.Set(_L("Z:\\Hello"),&xone,&y); + test(r==KErrNone); + test(parser.FullName()==_L("Z:\\Hello")); + TPtrC zone=_L("Z:\\ONE\\"); + TPtrC xnew=_L("X:\\NEW\\"); + r=parser.Set(_L("\\Hello"),&zone,&xnew); + test(r==KErrNone); + test(parser.FullName()==_L("Z:\\Hello")); + TPtrC aone=_L("A:\\ONE\\"); + TPtrC anew=_L("A:\\NEW\\"); + r=parser.Set(_L("A:Hello"),&aone,&anew); + test(r==KErrNone); + test(parser.FullName()==_L("A:\\ONE\\Hello")); + TPtrC a=_L("A:\\"); + r=parser.Set(_L("Hello"),&a,&xnew); + test(r==KErrNone); + test(parser.FullName()==_L("A:\\Hello")); + r=parser.Set(_L("Hello"),&aone,&xnew); + test(r==KErrNone); + test(parser.FullName()==_L("A:\\ONE\\Hello")); + } + + +LOCAL_C void TestTParse5() +// +// Test illegal paths +// + { + + TParse parser; + TInt r=parser.Set(_L("FOO\\"),NULL,NULL); + test(r==KErrBadName); + r=parser.Set(_L("C:\\FOO\\\\"),NULL,NULL); + test(r==KErrNone); + } + +LOCAL_C void TestTParse6() +// +// Test AddDir +// + { + + TParse parser; + test(parser.Set(_L("C:\\"),NULL,NULL)==KErrNone); + test(parser.IsRoot()); + test(parser.FullName()==_L("C:\\")); + test(parser.AddDir(_L("HELLO"))==KErrNone); + test(parser.IsRoot()==EFalse); + test(parser.FullName()==_L("C:\\HELLO\\")); + test(parser.AddDir(_L("BYEBYE"))==KErrNone); + test(parser.IsRoot()==EFalse); + test(parser.FullName()==_L("C:\\HELLO\\BYEBYE\\")); + test(parser.PopDir()==KErrNone); + test(parser.IsRoot()==EFalse); + test(parser.FullName()==_L("C:\\HELLO\\")); + test(parser.PopDir()==KErrNone); + test(parser.IsRoot()); + test(parser.FullName()==_L("C:\\")); +// + test(parser.AddDir(_L(""))==KErrNone); + test(parser.IsRoot()); + test(parser.FullName()==_L("C:\\")); + test(parser.AddDir(_L("HELLO"))==KErrNone); + test(parser.IsRoot()==EFalse); + test(parser.FullName()==_L("C:\\HELLO\\")); + test(parser.AddDir(_L(""))==KErrNone); + test(parser.IsRoot()==EFalse); + test(parser.FullName()==_L("C:\\HELLO\\")); +// + test(parser.Set(_L("C:\\Documents\\.TXT"),NULL,NULL)==KErrNone); + test(parser.AddDir(_L("Documents"))==KErrNone); + test(parser.FullName()==_L("C:\\Documents\\Documents\\.TXT")); + } + +LOCAL_C void TestTParse7() +// +// Test TParsePtr +// + { + + TBuf<128> nameBuf=_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"); + TParsePtr parser(nameBuf); + + test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC")); + test(parser.Drive()==_L("C:")); + test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\")); + test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\")); + test(parser.Name()==_L("AAA")); + test(parser.Ext()==_L(".CCC")); + test(parser.NameAndExt()==_L("AAA.CCC")); + test(parser.DrivePresent()); + test(parser.PathPresent()); + test(parser.NamePresent()); + test(parser.ExtPresent()); + test(parser.NameOrExtPresent()); + test(parser.IsRoot()==EFalse); + test(parser.IsWild()==EFalse); + test(parser.IsNameWild()==EFalse); + test(parser.IsExtWild()==EFalse); + + test(parser.AddDir(_L("HELLO"))==KErrNone); + test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\HELLO\\")); + + TBuf<16> shortName=_L("1234567812345678"); + TParsePtr parser2(shortName); + test(parser2.FullName()==_L("1234567812345678")); + test(parser2.Path()==_L("")); + test(parser2.DriveAndPath()==_L("")); + test(parser2.Ext()==_L("")); + test(parser2.Name()==_L("1234567812345678")); + test(parser2.AddDir(_L("TOOBIG"))==KErrGeneral); + } + +LOCAL_C void TestTParse8() +// +// Test TParsePtrC +// + { + + TBuf<128> nameBuf=_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"); + TParsePtrC parser(nameBuf); + + test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC")); + test(parser.Drive()==_L("C:")); + test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\")); + test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\")); + test(parser.Name()==_L("AAA")); + test(parser.Ext()==_L(".CCC")); + test(parser.NameAndExt()==_L("AAA.CCC")); + test(parser.DrivePresent()); + test(parser.PathPresent()); + test(parser.NamePresent()); + test(parser.ExtPresent()); + test(parser.NameOrExtPresent()); + test(parser.IsRoot()==EFalse); + test(parser.IsWild()==EFalse); + test(parser.IsNameWild()==EFalse); + test(parser.IsExtWild()==EFalse); + } + +LOCAL_C void TestTParse9() +// +// Test names with leading spaces +// + { + + TParse parser; + TBuf<16> nameBuf=_L(" name.txt"); + TBuf<16> pathBuf=_L("\\PATH\\"); + + TInt r=parser.Set(pathBuf,NULL,&nameBuf); + test(r==KErrNone); + test(parser.FullName()==_L("\\PATH\\ name.txt")); + r=parser.Set(_L(""),&nameBuf,&pathBuf); + test(r==KErrNone); + test(parser.FullName()==_L("\\PATH\\ name.txt")); + r=parser.Set(_L(" name.txt"),NULL,&pathBuf); + test(r==KErrNone); + test(parser.FullName()==_L("\\PATH\\ name.txt")); + r=parser.Set(nameBuf,&pathBuf,NULL); + test(r==KErrNone); + test(parser.FullName()==_L("\\PATH\\ name.txt")); + + TBuf<16> badPath=_L(" \\PATH\\"); + r=parser.Set(_L("C:\\"),NULL,&badPath); + test(r==KErrBadName); + r=parser.Set(_L("C:\\"),&badPath,NULL); + test(r==KErrBadName); + + TBuf<16> spacePath=_L("\\ PATH\\"); + r=parser.Set(_L("C:"),&nameBuf,&spacePath); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\ PATH\\ name.txt")); + + TBuf<32> spacename=_L("\\ name . txt "); + r=parser.Set(_L("C:"),&spacename,NULL); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\ name . txt")); + +// Illegal (?) values + + TBuf<16> pureSpace=_L(" "); + r=parser.Set(_L("C:\\NAME\\"),NULL,&pureSpace); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\NAME\\")); // Trims right off name + r=parser.Set(_L("C:\\NAME\\ "),NULL,NULL); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\NAME\\")); + + TBuf<16> spacePlusExt=_L(" . ext "); + r=parser.Set(_L("C:\\NAME\\"),NULL,&spacePlusExt); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\NAME\\ . ext")); // Trims right off ext + r=parser.Set(_L("C:\\NAME\\ . ext "),NULL,NULL); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\NAME\\ . ext")); + + TBuf<32> pathSpace=_L("\\asdf\\zxcv\\ \\asdf\\"); + r=parser.Set(_L("C:"),NULL,&pathSpace); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\asdf\\zxcv\\ \\asdf\\")); // Leaves spaces in path + r=parser.Set(_L("C:\\NAME\\ \\alt.sdf"),NULL,NULL); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\NAME\\ \\alt.sdf")); + + + TBuf<32> zeroPath=_L("\\asdf\\wqer\\\\asdf\\"); + r=parser.Set(_L("NAME.TXT"),NULL,&zeroPath); + test(r==KErrNone); + test(parser.FullName()==_L("\\asdf\\wqer\\\\asdf\\NAME.TXT")); // Leaves zerolength path + r=parser.Set(_L("C:\\NAME\\\\alt.sdf"),NULL,NULL); + test(r==KErrNone); + test(parser.FullName()==_L("C:\\NAME\\\\alt.sdf")); + } + +LOCAL_C void TestTParse10() +// +// Test a very long path +// + { + + TBuf<16> pathPart=_L("\\2345678"); + TBuf<512> testPath; + + for(TInt i=0;i<63;i++) + testPath+=pathPart; + + RFs fs; + TInt r=fs.Connect(); + test(r==KErrNone); + TParse parse; + r=fs.Parse(testPath,parse); + test(r==KErrBadName); + fs.Close(); + + TFileName longFileName; + longFileName.SetLength(254); +// Mem::Fill((TUint8*)longFileName.Ptr(),254,'A'); + Mem::Fill((TUint8*)longFileName.Ptr(),254*sizeof(TText),'A'); + longFileName[0]='\\'; + longFileName[253]='\\'; + r=parse.Set(longFileName,&test_string,NULL); + test(r==KErrNone); + r=parse.PopDir(); + test(r==KErrNone); + + longFileName[123]='\\'; + r=parse.Set(longFileName,&test_string,NULL); + test(r==KErrNone); + r=parse.PopDir(); + test(r==KErrNone); + TPtrC startPath((TText*)longFileName.Ptr(),124); + test(parse.Path()==startPath); + + TPtrC endPath((TText*)longFileName.Ptr()+124,252-124+1); + r=parse.AddDir(endPath); + test(r==KErrNone); + test(parse.Path()==longFileName); + } + +LOCAL_C void testTFileTextApi() +// +// Test TFileText class methods +// + { + + TPtrC record[5]; + record[0].Set(_L("First record")); + record[1].Set(_L("Second record")); + record[2].Set(_L("Third record")); + record[3].Set(_L("Fourth record")); + record[4].Set(_L("Fifth record")); + + RFs fs; + test(fs.Connect() == KErrNone); + + RFile f; + TInt r=f.Replace(fs,_L("TEXTFILE.TXT"),0); + test(r==KErrNone); + TFileText textFile; + textFile.Set(f); + TInt i=0; + for (i=0;i<5;i++) + { + r=textFile.Write(record[i]); + test(r==KErrNone); + } + r=textFile.Seek(ESeekStart); + test(r==KErrNone); + TBuf<16> recBuf; + for(i=0;i<5;i++) + { + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==record[i]); + } + r=textFile.Read(recBuf); + test(r==KErrEof); + test(recBuf.Length()==0); + f.Close(); + + test.Next(_L("Test dosfile terminator")); + TPtrC8 trecord[7]; + TPtrC tTextrecord[7]; + tTextrecord[0].Set(_L("First record\r\n")); + tTextrecord[1].Set(_L("Second record\r\n")); + tTextrecord[2].Set(_L("Third record\r\n")); + tTextrecord[3].Set(_L("Fourth record\r\n")); + tTextrecord[4].Set(_L("Fifth record\r\n")); + tTextrecord[5].Set(_L("Sixth record\n\r")); + tTextrecord[6].Set(_L("Seventh record\n")); + trecord[0].Set((TUint8*)tTextrecord[0].Ptr(),tTextrecord[0].Length()*sizeof(TText)); + trecord[1].Set((TUint8*)tTextrecord[1].Ptr(),tTextrecord[1].Length()*sizeof(TText)); + trecord[2].Set((TUint8*)tTextrecord[2].Ptr(),tTextrecord[2].Length()*sizeof(TText)); + trecord[3].Set((TUint8*)tTextrecord[3].Ptr(),tTextrecord[3].Length()*sizeof(TText)); + trecord[4].Set((TUint8*)tTextrecord[4].Ptr(),tTextrecord[4].Length()*sizeof(TText)); + trecord[5].Set((TUint8*)tTextrecord[5].Ptr(),tTextrecord[5].Length()*sizeof(TText)); + trecord[6].Set((TUint8*)tTextrecord[6].Ptr(),tTextrecord[6].Length()*sizeof(TText)); + r=f.Replace(fs,_L("TEXTFILE.TXT"),0); + test(r==KErrNone); + for(i=0;i<7;i++) + { + TBuf8<256> buf; + buf.Copy(trecord[i]); + r=f.Write(buf); + test(r==KErrNone); + } + textFile.Set(f); + textFile.Seek(ESeekStart); + for(i=0;i<5;i++) + { + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==record[i]); + } + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==_L("Sixth record")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==_L("\rSeventh record")); + r=textFile.Read(recBuf); + test(r==KErrEof); + test(recBuf.Length()==0); + f.Close(); + + test.Next(_L("Test read with bufferSize == dataSize")); + r=f.Replace(fs,_L("TEXTFILE.TXT"),0); + test(r==KErrNone); + record[0].Set(_L("1234567890123456")); +// trecord[0].Set(_L8("1234567890123456\r\n")); +// trecord[1].Set(_L8("1234567890123456\n")); + + TPtrC tmpTextrecord; + tmpTextrecord.Set(_L("1234567890123456\r\n")); + trecord[0].Set((TUint8*)tmpTextrecord.Ptr(),tmpTextrecord.Length()*sizeof(TText)); + + tmpTextrecord.Set(_L("1234567890123456\n")); + trecord[1].Set((TUint8*)tmpTextrecord.Ptr(),tmpTextrecord.Length()*sizeof(TText)); + + for (i=0;i<2;i++) + { + r=f.Write(trecord[i]); + test(r==KErrNone); + } + textFile.Set(f); + textFile.Seek(ESeekStart); + for(i=0;i<2;i++) + { + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==record[0]); + } + r=textFile.Read(recBuf); + test(r==KErrEof); + test(recBuf.Length()==0); + f.Close(); + + test.Next(_L("Read into a buffer < recordSize")); + TBuf<8> smallBuf; + r=f.Open(fs,_L("TEXTFILE.txt"),0); + test(r==KErrNone); + textFile.Set(f); + for(i=0;i<2;i++) + { + r=textFile.Read(smallBuf); + test(r==KErrTooBig); + test(smallBuf==_L("12345678")); + } + f.Close(); + + test.Next(_L("Nasty cases: 1) split over buffer boundary")); + r=f.Replace(fs,_L("TEXTFILE.txt"),0); + test(r==KErrNone); + HBufC* largeRecord=HBufC::NewL(600); + largeRecord->Des().SetLength(250); + largeRecord->Des().Fill('A'); + largeRecord->Des()[249]='\n'; + TPtrC8 bufPtr; + bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size()); // Size() returns length in bytes + r=f.Write(bufPtr); + test(r==KErrNone); + TBuf<16> boundaryBuf=_L("12345\r\n"); + bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + r=f.Write(trecord[0]); + test(r==KErrNone); + + textFile.Set(f); + textFile.Seek(ESeekStart); + r=textFile.Read(recBuf); + test(r==KErrTooBig); + test(recBuf==_L("AAAAAAAAAAAAAAAA")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==_L("12345")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==record[0]); + f.Close(); + + test.Next(_L("Nasty cases: 2) on buffer boundary")); + r=f.Replace(fs,_L("TEXTFILE.txt"),0); + test(r==KErrNone); + largeRecord->Des().SetLength(250); + largeRecord->Des().Fill('A'); + largeRecord->Des()[249]='\n'; + bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + boundaryBuf=_L("12345\rxyz\n"); + bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + r=f.Write(trecord[0]); + test(r==KErrNone); + + textFile.Set(f); + textFile.Seek(ESeekStart); + r=textFile.Read(recBuf); + test(r==KErrTooBig); + test(recBuf==_L("AAAAAAAAAAAAAAAA")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==_L("12345\rxyz")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==record[0]); + f.Close(); + + test.Next(_L("Nasty cases: 3) record size > buffer size")); + r=f.Replace(fs,_L("TEXTFILE.txt"),0); + test(r==KErrNone); + largeRecord->Des().SetLength(600); + largeRecord->Des().Fill('Z'); + largeRecord->Des()[511]='\r'; + largeRecord->Des()[599]='\n'; + bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + boundaryBuf=_L("12345\rxyz\n"); + bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + r=f.Write(trecord[0]); + test(r==KErrNone); + + textFile.Set(f); + textFile.Seek(ESeekStart); + r=textFile.Read(recBuf); + test(r==KErrTooBig); + test(recBuf==_L("ZZZZZZZZZZZZZZZZ")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==_L("12345\rxyz")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==record[0]); + + TBuf<601> bigBuf; + TPtrC largePtr((TText*)largeRecord->Ptr(),(largeRecord->Length()-1)); + textFile.Seek(ESeekStart); + r=textFile.Read(bigBuf); + test(r==KErrNone); + test(bigBuf==largePtr); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==_L("12345\rxyz")); + r=textFile.Read(recBuf); + test(r==KErrNone); + test(recBuf==record[0]); + f.Close(); + + User::Free(largeRecord); + test(fs.Delete(_L("TEXTFILE.txt")) == KErrNone); + fs.Close(); + } + +LOCAL_C void testTFileTextEndRecord() +// +// Test terminating record +// + { + RFs fs; + test(fs.Connect() == KErrNone); + + RFile f; + TInt r=f.Replace(fs,_L("TextFile"),0); + test(r==KErrNone); + TPtrC8 bufPtr; + TBuf<16>boundaryBuf=_L("Record1\n"); + bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + boundaryBuf=_L("Record2\n"); + bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + boundaryBuf=_L("Record3\n"); + bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + + TFileText fText; + fText.Set(f); + r=fText.Seek(ESeekStart); + test(r==KErrNone); + TBuf<32> recBuf; + r=fText.Read(recBuf); + test(r==KErrNone); + test(recBuf.MatchF(_L("record1"))!=KErrNotFound); + r=fText.Read(recBuf); + test(r==KErrNone); + test(recBuf.MatchF(_L("record2"))!=KErrNotFound); + r=fText.Read(recBuf); + test(r==KErrNone); + test(recBuf.MatchF(_L("record3"))!=KErrNotFound); + r=fText.Read(recBuf); + test(r==KErrEof); + test(recBuf.Length()==0); + f.Close(); + + TBuf<0x100> bigBuf(0x100); + bigBuf.Fill('A'); + r=f.Replace(fs,_L("TextFile"),0); + test(r==KErrNone); + + bufPtr.Set((TUint8*)bigBuf.Ptr(),bigBuf.Size()); + r=f.Write(bufPtr); + test(r==KErrNone); + + fText.Set(f); + r=fText.Seek(ESeekStart); + test(r==KErrNone); + bigBuf.SetLength(0); + r=fText.Read(bigBuf); +// test.Printf(_L("fText.Read returns %d\n"),r); + test(r==KErrNone); +// test.Printf(_L("BigBuf.Length()==%d\n"),bigBuf.Length()); + test(bigBuf.Length()==0x100); + r=fText.Read(bigBuf); + test(r==KErrEof); + test(bigBuf.Length()==0); + f.Close(); + + test(fs.Delete(_L("TextFile")) == KErrNone); + fs.Close(); + } + +void testRFileOpen() + { + _LIT(KTestFile, "c:\\symport_test_rfile_open"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + + fs.SetAtt(KTestFile, 0, KEntryAttReadOnly); + fs.Delete(KTestFile); + + // File doesn't exist + RFile file; + test(file.Open(fs, KTestFile, 0) == KErrNotFound); + + // Create the file + test(file.Create(fs, KTestFile, 0) == KErrNone); + test(file.Write(KTestText) == KErrNone); + + // Should be okay to close a file twice + file.Close(); + file.Close(); + + // Open the file for reading + TBuf8<26> buf; + test(file.Open(fs, KTestFile, EFileShareAny) == KErrNone); + test(file.Read(buf) == KErrNone && buf == KTestText); + + // Check you can't write to it + test(file.Write(KTestText) == KErrAccessDenied); + + // Check another file can be opened at the same time + RFile file2; + test(file2.Open(fs, KTestFile, EFileShareAny) == KErrNone); + test(file2.Read(buf) == KErrNone && buf == KTestText); + file2.Close(); + test(file2.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + file2.Close(); + file.Close(); + + // Open the file for writing + test(file.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + test(file.Read(buf) == KErrNone && buf == KTestText); + + // Check you can write to it + test(file.Write(KTestText) == KErrNone); + + // Check another file can be opened at the same time + test(file2.Open(fs, KTestFile, EFileShareAny|EFileRead) == KErrNone); + file2.Close(); + test(file2.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + file2.Close(); + + // Read back what we just wrote + file.Close(); + test(file.Open(fs, KTestFile, 0) == KErrNone); + test(file.Read(buf) == KErrNone && buf == KTestText); + test(file.Read(buf) == KErrNone && buf == KTestText); + file.Close(); + + // Check error on read only file + test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone); + test(file.Open(fs, KTestFile, EFileWrite) == KErrAccessDenied); + test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone); + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + file.Close(); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileCreate() + { + _LIT(KTestFile, "c:\\symport_test_rfile_create"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + fs.Delete(KTestFile); + + // Create should work when file doesn't exist + RFile file; + test(file.Create(fs, KTestFile, 0) == KErrNone); + test(file.Write(KTestText) == KErrNone); + file.Close(); + + // Create should fail when file does exist + test(file.Create(fs, KTestFile, 0) == KErrAlreadyExists); + test(fs.Delete(KTestFile) == KErrNone); + + // Check you can read from the file + test(file.Create(fs, KTestFile, 0) == KErrNone); + test(file.Write(KTestText) == KErrNone); + TInt pos = 0; + test(file.Seek(ESeekStart, pos) == KErrNone); + TBuf8<26> buf; + test(file.Read(buf) == KErrNone && buf == KTestText); + test(file.Write(KTestText) == KErrNone); + pos = 26; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(file.Read(buf) == KErrNone && buf == KTestText); + file.Close(); + + // Check error on read only file + test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone); + test(file.Replace(fs, KTestFile, EFileWrite) == KErrAccessDenied); + test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone); + test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone); + file.Close(); + + fs.Delete(KTestFile); + fs.Close(); + } + +void testRFileReplace() + { + _LIT(KTestFile, "c:\\symport_test_rfile_replace"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + fs.Delete(KTestFile); + + // Reaplce should work when file doesn't exist + RFile file; + test(file.Replace(fs, KTestFile, 0) == KErrNone); + test(file.Write(KTestText) == KErrNone); + file.Close(); + + // Replace should also work when file does exist + test(file.Replace(fs, KTestFile, 0) == KErrNone); + test(file.Write(KTestText) == KErrNone); + + // Check you can read from the file + TInt pos = 0; + test(file.Seek(ESeekStart, pos) == KErrNone); + TBuf8<26> buf; + test(file.Read(buf) == KErrNone && buf == KTestText); + test(file.Write(KTestText) == KErrNone); + pos = 26; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(file.Read(buf) == KErrNone && buf == KTestText); + file.Close(); + + fs.Delete(KTestFile); + fs.Close(); + } + +void testRFileTemp() + { + _LIT(KTestDir, "c:\\symport_test_rfile_temp\\"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + fs.MkDir(KTestDir); + + TFileName f1; + RFile file; + + // Use invalid path + test(file.Temp(fs, _L("invalid"), f1, 0) == KErrBadName); + test(file.Temp(fs, _L("invalid\\"), f1, 0) == KErrBadName); + + // Try to use a file for the path + test(file.Replace(fs, _L("invalid"), 0) == KErrNone); + file.Close(); + test(file.Temp(fs, _L("invalid"), f1, 0) == KErrBadName); + test(fs.Delete(_L("invalid")) == KErrNone); + + test(file.Temp(fs, KTestDir, f1, 0) == KErrNone); + test(file.Write(KTestText) == KErrNone); + file.Close(); + + // Check it works a second time + TFileName f2; + test(file.Temp(fs, KTestDir, f2, 0) == KErrNone); + + // Check you can read from the file + test(file.Write(KTestText) == KErrNone); + TInt pos = 0; + test(file.Seek(ESeekStart, pos) == KErrNone); + TBuf8<26> buf; + test(file.Read(buf) == KErrNone && buf == KTestText); + test(file.Write(KTestText) == KErrNone); + pos = 26; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(file.Read(buf) == KErrNone && buf == KTestText); + file.Close(); + + test(fs.Delete(f1) == KErrNone); + test(fs.Delete(f2) == KErrNone); + + // See if you can create a temp on root + test(file.Temp(fs, _L("C:\\"), f1, 0) == KErrNone); + file.Close(); + test(fs.Delete(f1) == KErrNone); + + // See if empty path is okay + test(file.Temp(fs, KNullDesC, f1, 0) == KErrNone); + file.Close(); + test(fs.Delete(f1) == KErrNone); + + fs.RmDir(KTestDir); + fs.Close(); + } + +void testRFileRead() + { + _LIT(KTestFile, "c:\\symport_test_rfile_read"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + + // Create a test file + RFile file; + test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Write(KTestText) == KErrNone); + file.Close(); + + TBuf8<13> buf; + test(file.Open(fs, KTestFile, 0) == KErrNone); + + // File position at the start + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + + test(file.Read(buf) == KErrNone); + test(buf.Length() == 13 && buf == KTestText().Left(13)); + + // Check file position is updated + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 13); + + test(file.Read(buf) == KErrNone); + test(buf.Length() == 13 && buf == KTestText().Right(13)); + test(file.Read(buf) == KErrNone); + test(buf.Length() == 0); + + pos = 13; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(file.Read(buf) == KErrNone); + test(buf.Length() == 13 && buf == KTestText().Right(13)); + test(file.Read(buf) == KErrNone); + test(buf.Length() == 0); + + // Move back to the start + pos = 0; + test(file.Seek(ESeekStart, pos) == KErrNone); + + test(file.Read(buf, 6) == KErrNone); + test(buf.Length() == 6 && buf == KTestText().Left(6)); + pos = 20; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(file.Read(buf, 6) == KErrNone); + test(buf.Length() == 6 && buf == KTestText().Right(6)); + test(file.Read(buf, 1) == KErrNone); + test(buf.Length() == 0); + + test(file.Read(0, buf) == KErrNone); + test(buf.Length() == 13 && buf == KTestText().Left(13)); + test(file.Read(13, buf) == KErrNone); + test(buf.Length() == 13 && buf == KTestText().Right(13)); + test(file.Read(23, buf) == KErrNone); + test(buf.Length() == 3 && buf == KTestText().Right(3)); + test(file.Read(27, buf) == KErrNone); + test(buf.Length() == 0); + + test(file.Read(0, buf, 6) == KErrNone); + test(buf.Length() == 6 && buf == KTestText().Left(6)); + test(file.Read(20, buf, 6) == KErrNone); + test(buf.Length() == 6 && buf == KTestText().Right(6)); + test(file.Read(23, buf, 6) == KErrNone); + test(buf.Length() == 3 && buf == KTestText().Right(3)); + test(file.Read(27, buf, 6) == KErrNone); + test(buf.Length() == 0); + + file.Close(); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileWrite() + { + _LIT(KTestFile, "c:\\symport_test_rfile_write"); + _LIT8(KTestText, "abcdefghijklm"); + + RFs fs; + test(fs.Connect() == KErrNone); + + TBuf8<26> buf; + RFile file; + test(file.Replace(fs, KTestFile, 0) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 0); + + // File position at the start + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + + test(file.Write(KTestText) == KErrNone); //13 + + // Check position updated + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 13); + + test(file.Read(0, buf) == KErrNone && buf == KTestText); + test(file.Write(KTestText) == KErrNone); //26 + test(file.Read(0, buf) == KErrNone && buf.Length() == 26 && buf.Left(13) == KTestText && buf.Right(13) == KTestText); + file.Close(); + + // Test read after write + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Write(KTestText) == KErrNone); + test(file.Read(buf) == KErrNone); + test(buf.Length() == 13); + file.Close(); + + // Test write after read + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 26); + test(file.Write(KTestText) == KErrNone); + test(file.Read(26, buf) == KErrNone && buf.Length() == 13); + file.Close(); + + test(file.Replace(fs, KTestFile, 0) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 0); + test(file.Write(KTestText, 6) == KErrNone); //6 + test(file.Read(0, buf) == KErrNone && buf == KTestText().Left(6)); + test(file.Write(KTestText, 6) == KErrNone); //12 + test(file.Read(0, buf) == KErrNone && buf.Length() == 12 && buf.Left(6) == KTestText().Left(6) && buf.Right(6) == KTestText().Left(6)); + file.Close(); + + // Test read after write + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Write(KTestText, 6) == KErrNone); //6 + test(file.Read(buf) == KErrNone && buf.Length() == 6); + file.Close(); + + // Test write after read + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 12); + test(file.Write(KTestText, 6) == KErrNone); + test(file.Read(12, buf) == KErrNone && buf.Length() == 6); + file.Close(); + + test(file.Replace(fs, KTestFile, 0) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 0); + test(file.Write(3, KTestText) == KErrNone); //0+13=13 + test(file.Read(0, buf) == KErrNone); + test(buf.Length() == 13); + test(buf == KTestText); + test(file.Write(7, KTestText) == KErrNone); //7+13=20 + test(file.Read(0, buf) == KErrNone && buf.Length() == 20 && buf.Mid(7,13) == KTestText()); + file.Close(); + + // Test read after write + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Write(0, KTestText) == KErrNone); //13 + test(file.Read(buf) == KErrNone && buf.Length() == 7); + file.Close(); + + // Test write after read + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 20); + test(file.Write(10, KTestText) == KErrNone); //10+13=23 + test(file.Read(0, buf) == KErrNone && buf.Length() == 23); + file.Close(); + + test(file.Replace(fs, KTestFile, 0) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 0); + test(file.Write(3, KTestText, 10) == KErrNone); //0+10=10 + test(file.Read(0, buf) == KErrNone); + test(buf.Length() == 10 && buf == KTestText().Left(10)); + test(file.Write(0, KTestText, 3) == KErrNone); //10 + test(file.Read(0, buf) == KErrNone ); + test(buf.Length() == 10); + test(buf.Left(3) == KTestText().Left(3)); + file.Close(); + + // Test read after write + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Write(0, KTestText, 3) == KErrNone); //3 + test(file.Read(buf) == KErrNone); + test(buf.Length() == 7); + file.Close(); + + // Test write after read + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Read(buf) == KErrNone && buf.Length() == 10); + test(file.Write(13, KTestText, 6) == KErrNone); //10+6=16 + test(file.Read(0, buf) == KErrNone && buf.Length() == 16); + file.Close(); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileSeek() + { + _LIT(KTestFile, "c:\\symport_test_rfile_seek"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + + // Create the file + RFile file; + test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Write(KTestText) == KErrNone); + + // ESeekAddress is invalid + TInt pos = 0; + test(file.Seek(ESeekAddress, pos) == KErrNotSupported); + + // Error on negative offset + pos = -999; + test(file.Seek(ESeekStart, pos) == KErrArgument); + + // Test you can get the file position + pos = 12; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(pos == 12); + TBuf8<26> buf; + test(file.Read(buf, 1) == KErrNone); + test(buf == _L8("m")); //13 + + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 13); + + // Move to the end of the file + pos = 30; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(pos == 30); + test(file.Size(pos) == KErrNone); + test(pos == 26); + + // Move back from the end + pos = -1; + test(file.Seek(ESeekEnd, pos) == KErrNone); + test(pos == 25); + test(file.Read(buf) == KErrNone); + test(buf == _L8("z")); + + // Move past the end + pos = 10; + test(file.Seek(ESeekEnd, pos) == KErrNone); + test(pos == 26); + test(file.Read(buf) == KErrNone); + test(buf.Length() == 0); + + // Move before the start + pos = -30; + test(file.Seek(ESeekEnd, pos) == KErrNone); + test(pos == 0); + test(file.Read(buf) == KErrNone); + test(buf.Length() == 26); + + // Check seek to current + pos = 13; + test(file.Seek(ESeekStart, pos) == KErrNone); + test(file.Read(buf, 1) == KErrNone); //14 + test(buf == _L8("n")); + pos = -13; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 1); + test(file.Read(buf, 1) == KErrNone); //2 + test(buf == _L8("b")); + + // Before the start + pos = -10; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + test(file.Read(buf, 1) == KErrNone); //1 + test(buf == _L8("a")); + + // After the end + pos = 26; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 26); + test(file.Read(buf, 1) == KErrNone); + test(buf.Length() == 0); + + // Check current pos + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 26); + + // And check you can go back + pos = -1; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(file.Read(buf, 1) == KErrNone); + test(buf == _L8("z")); + + file.Close(); + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileFlush() + { + _LIT(KTestFile, "c:\\symport_test_rfile_flush"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + fs.Delete(KTestFile); + + // Create the file + RFile file; + test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone); + + // Check file pos + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + + test(file.Write(KTestText) == KErrNone); + + // Check file pos + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 26); + + test(file.Flush() == KErrNone); + + // Check file pos hasn't changed + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 26); + + file.Close(); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileSize() + { + _LIT(KTestFile, "c:\\symport_test_rfile_flush"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + fs.Delete(KTestFile); + + // Create the file + RFile file; + test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone); + + TInt size = 0; + test(file.Size(size) == KErrNone); + test(size == 0); + + // Check file pos + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + + test(file.Write(KTestText) == KErrNone); + + size = 0; + test(file.Size(size) == KErrNone); + test(size == 26); + + // Check file pos + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 26); + + file.Close(); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileSetSize() + { + _LIT(KTestFile, "c:\\symport_test_rfile_flush"); + _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz"); + + RFs fs; + test(fs.Connect() == KErrNone); + fs.Delete(KTestFile); + + // Create the file + RFile file; + test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone); + + // Check file pos + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + + test(file.Write(KTestText) == KErrNone); //26 + + // Set the size to bigger + test(file.SetSize(30) == KErrNone); + + // Check file pos is unchanged + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 26); + + // Set the size to smaller + test(file.SetSize(20) == KErrNone); + + // Check file pos is at the end + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 20); + + file.Close(); + + // Open for reading + test(file.Open(fs, KTestFile, 0) == KErrNone); + + // Shouldn't be allowed to set the size + test(file.SetSize(10) == KErrAccessDenied); + + file.Close(); + + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileAtt() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile, "c:\\symport_test_rile_att.txt"); + + // See if it works for normal files + TUint att; + RFile file; + test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + + // Check file pos is at the start + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + + test(file.Write(_L8("test")) == KErrNone); + test(file.Att(att) == KErrNone); + test(!(att&KEntryAttDir)); + + // Check file pos is correct + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 4); + + // Check readonly flag + test(!(att&KEntryAttReadOnly)); + test(file.SetAtt(KEntryAttReadOnly, 0) == KErrNone); + test(file.Att(att) == KErrNone && att&KEntryAttReadOnly); + + // Clear the flag + test(file.SetAtt(0, KEntryAttReadOnly) == KErrNone); + test(file.Att(att) == KErrNone); + test(!(att&KEntryAttReadOnly)); + file.Close(); + + // Delete the file + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileModified() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile, "c:\\symport_test_rile_modified.txt"); + + // See if it works for normal files + RFile file; + test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + + // Check file pos is at the start + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + + test(file.Write(_L8("test")) == KErrNone); + test(file.Flush() == KErrNone); + + TTime then; + test(file.Modified(then) == KErrNone); + User::After(2000000); + + // Check file pos is correct + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 4); + + file.Close(); + + test(file.Open(fs, KTestFile, EFileWrite) == KErrNone); + test(file.Write(_L8("test")) == KErrNone); + test(file.Flush() == KErrNone); + + TTime now; + test(file.Modified(now) == KErrNone); + + TTimeIntervalSeconds sec; + test(now.SecondsFrom(then, sec) == KErrNone); + test(sec.Int() >= 1); + + file.Close(); + + // Delete the file + test(fs.Delete(KTestFile) == KErrNone); + fs.Close(); + } + +void testRFileDrive() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile, "c:\\symport_test_rile_drive.txt"); + + // See if it works for normal files + RFile file; + test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone); + + TInt drive; + TDriveInfo info; + + test(file.Drive(drive, info) == KErrNone); + test(drive == EDriveC); + +#ifdef __TOOLS2__ + test(info.iType == EMediaHardDisk); + test(info.iBattery == EBatNotSupported); + test(info.iDriveAtt&(KDriveAttLocal|KDriveAttInternal)); + test(info.iMediaAtt == 0); +#endif + + file.Close(); + + // Delete the file + test(fs.Delete(KTestFile) == KErrNone); + file.Close(); + fs.Close(); + } + +void testRFileRename() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile1, "c:\\symport_test_rile_rename_a.txt"); + _LIT(KTestFile2, "c:\\symport_test_rile_rename_b.txt"); + fs.Delete(KTestFile1); + fs.Delete(KTestFile2); + + // See if it works for normal files + RFile file; + test(file.Replace(fs, KTestFile1, EFileShareExclusive|EFileWrite) == KErrNone); + + // Check file pos is correct + TInt pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + test(file.Write(_L8("test")) == KErrNone); + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 4); + + test(file.Rename(KTestFile2) == KErrNone); + + // Check file pos is correct + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 4); + test(file.Write(_L8("test")) == KErrNone); + file.Close(); + + test(file.Open(fs, KTestFile2, EFileShareExclusive) == KErrNone); + + // Check file pos is correct + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 0); + TBuf8<16> buf; + test(file.Read(buf) == KErrNone); + test(buf.Length() == 8); + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 8); + + // Should fail because not opened for write + test(file.Rename(KTestFile1) == KErrAccessDenied); + + // Check file pos is correct + pos = 0; + test(file.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 8); + + // Check you can't write to the file + test(file.Write(_L8("test")) == KErrAccessDenied); + file.Close(); + + // Recreate the first file + test(file.Replace(fs, KTestFile1, EFileShareExclusive|EFileWrite) == KErrNone); + file.Close(); + + // Check error if renaming to existing file + test(file.Open(fs, KTestFile2, EFileShareExclusive) == KErrNone); + test(file.Rename(KTestFile1) == KErrAccessDenied); + file.Close(); + + // Cleanup + test(fs.Delete(KTestFile1) == KErrNone); + test(fs.Delete(KTestFile2) == KErrNone); + fs.Close(); + } + +void testRFileDuplicate() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile1, "c:\\symport_test_rile_duplicate.txt"); + + RFile file1; + test(file1.Replace(fs, KTestFile1, EFileWrite) == KErrNone); + test(file1.Write(_L8("Test")) == KErrNone); + test(file1.Flush() == KErrNone); + + // Test you can duplicate the handle and read from it + RFile file2; + test(file2.Duplicate(file1) == KErrNone); + + // File position should match + TInt pos = 0; + test(file2.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 4); + + // Move back to the start + pos = 0; + test(file2.Seek(ESeekStart, pos) == KErrNone); + test(pos == 0); + + // Check you can read from the file + TBuf8<8> buf; + test(file2.Read(buf) == KErrNone); + test(buf.Length() == 4); + + // Check you can write to the file + test(file2.Write(_L8("Test")) == KErrNone); + + file1.Close(); + file2.Close(); + + // Now open readonly + test(file1.Open(fs, KTestFile1, 0) == KErrNone); + pos = 4; + test(file1.Seek(ESeekStart, pos) == KErrNone); + test(pos == 4); + + // Test you can duplicate the handle and read from it + test(file2.Duplicate(file1) == KErrNone); + + // File position should match + pos = 0; + test(file2.Seek(ESeekCurrent, pos) == KErrNone); + test(pos == 4); + + // Move back to the start + pos = 0; + test(file2.Seek(ESeekStart, pos) == KErrNone); + test(pos == 0); + + // Check you can read from the file + test(file2.Read(buf) == KErrNone); + test(buf.Length() == 8); + + // Check you can't write to the file + test(file2.Write(_L8("Test")) == KErrAccessDenied); + + file1.Close(); + file2.Close(); + + test(fs.Delete(KTestFile1) == KErrNone); + fs.Close(); + } + +void testRFileName() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + _LIT(KTestFile1, "C:\\symport_test_rile_filename.txt"); + + RFile file1; + test(file1.Replace(fs, KTestFile1, 0) == KErrNone); + + TFileName name; + test(file1.Name(name) == KErrNone); + test(name == KTestFile1().Mid(3)); + test(file1.FullName(name) == KErrNone); + test(name == KTestFile1); + file1.Close(); + + test(fs.Delete(KTestFile1) == KErrNone); + fs.Close(); + } + +void testRFs() + { + test.Start(_L("Att")); + testAtt(); + + test.Next(_L("SetAtt")); + testSetAtt(); + + test.Next(_L("Modified")); + testModified(); + + test.Next(_L("MkDir")); + testMkDir(); + + test.Next(_L("MkDirAll")); + testMkDirAll(); + + test.Next(_L("RmDir")); + testRmDir(); + + test.Next(_L("Parse")); + testParse(); + + test.Next(_L("SessionPath")); + testSessionPath(); + + test.Next(_L("SetSessionPath")); + testSetSessionPath(); + + test.Next(_L("Delete")); + testDelete(); + + test.Next(_L("VolumeIOParam")); +#ifdef __TOOLS2__ + testVolumeIOParam(); +#endif + + test.Next(_L("Entry")); + testEntry(); + + test.Next(_L("SetEntry")); + testSetEntry(); + + test.Next(_L("SetErrorCondition")); +#ifdef __TOOLS2__ + testSetErrorCondition(); +#endif + + test.Next(_L("CharToDrive")); + testCharToDrive(); + + test.Next(_L("DriveToChar")); + testDriveToChar(); + + test.Next(_L("IsValidDrive")); + testIsValidDrive(); + + test.Next(_L("Drive")); + testDrive(); + + test.Next(_L("GetSystemDrive")); + testGetSystemDrive(); + + test.Next(_L("Replace")); + testReplace(); + + test.Next(_L("Rename")); + testRename(); + + test.End(); + } + +void testTParse() + { + test.Start(_L("Test all TParse methods")); + TestTParse1(); + + test.Next(_L("Test multiple PopDirs")); + TestTParse2(); + + test.Next(_L("Test conflicting default drive letters")); + TestTParse3(); + + test.Next(_L("Test conflicting relative drive letters")); + TestTParse4(); + + test.Next(_L("Test errors returned by illegal paths")); + TestTParse5(); + + test.Next(_L("Test AddDir")); + TestTParse6(); + + test.Next(_L("Test TParsePtr")); + TestTParse7(); + + test.Next(_L("Test TParsePtrC")); + TestTParse8(); + + test.Next(_L("Test names with leading spaces")); + TestTParse9(); + + test.Next(_L("Test a Path > 256 chars")); + TestTParse10(); + + test.End(); + } + +void testTFileText() + { + test.Start(_L("Test file text")); + testTFileTextApi(); + + test.Next(_L("Test FileText last record has no terminator")); + testTFileTextEndRecord(); + + test.End(); + } + +void testRFile() + { + test.Start(_L("Open")); + testRFileOpen(); + + test.Next(_L("Create")); + testRFileCreate(); + + test.Next(_L("Replace")); + testRFileReplace(); + + test.Next(_L("Temp")); + testRFileTemp(); + + test.Next(_L("Read")); + testRFileRead(); + + test.Next(_L("Write")); + testRFileWrite(); + + test.Next(_L("Seek")); + testRFileSeek(); + + test.Next(_L("Flush")); + testRFileFlush(); + + test.Next(_L("Size")); + testRFileSize(); + + test.Next(_L("SetSize")); + testRFileSetSize(); + + test.Next(_L("Att")); + testRFileAtt(); + + test.Next(_L("Modified")); + testRFileModified(); + + test.Next(_L("Drive")); + testRFileDrive(); + + test.Next(_L("Rename")); + testRFileRename(); + + test.Next(_L("Duplicate")); + testRFileDuplicate(); + + test.Next(_L("Name")); + testRFileName(); + + test.End(); + } + +// This following isn't relevant to WINSCW +#ifdef __TOOLS2__ +void testSpecialFilenameProcessing() + { + // Connect to the file system + RFs fs; + test(fs.Connect() == KErrNone); + + fs.RmDir(_L("c:\\testMisc\\epoc32\\test1\\")); + fs.RmDir(_L("c:\\testMisc\\epoc32\\test2\\")); + fs.RmDir(_L("c:\\testMisc\\epoc32\\")); + fs.RmDir(_L("c:\\testMisc\\")); + + TUint att; + _LIT(KCDriveTest1, "c:\\testMisc\\epoc32\\test1\\"); + test(fs.MkDirAll(KCDriveTest1) == KErrNone); + test(fs.Att(KCDriveTest1, att) == KErrNone); + + struct stat sb; +#ifdef _WIN32 + test(stat("c:\\testMisc\\epoc32\\test1", &sb) == 0); +#else + // Get home + char* env = getenv("HOME"); + test(env != NULL); + char home[0x100]; + strcpy(home, env); + + // Check it's replaced c: with HOME + char testpath[0x100]; + strcpy(testpath, home); + strcat(testpath, "/testmisc/epoc32/test1"); + test(stat(testpath, &sb) == 0); +#endif + +#ifdef _WIN32 + static char *env = "EPOCROOT=\\"; + test(putenv(env) == 0); +#else + test(setenv("EPOCROOT", home, 1) == 0); +#endif + + _LIT(KEpocRootTest, "\\epoc32\\winscw\\c\\testMisc\\test1\\"); + test(fs.MkDirAll(KEpocRootTest) == KErrNone); + test(fs.Att(KEpocRootTest, att) == KErrNone); + +#ifdef _WIN32 + test(stat("\\epoc32\\winscw\\c\\testMisc\\test1", &sb) == 0); +#else + // Check it's replaced \epoc32 with $(EPOCROOT)epoc32 + strcpy(testpath, home); + strcat(testpath, "/epoc32/winscw/c/testmisc/test1"); + test(stat(testpath, &sb) == 0); +#endif + + test(fs.RmDir(KEpocRootTest) == KErrNone); + test(fs.RmDir(_L("\\epoc32\\winscw\\c\\testMisc\\")) == KErrNone); + + // Now set EPOCROOT to something a bit more complicated +#ifdef _WIN32 + env = "EPOCROOT=c:\\testMisc"; + test(putenv(env) == 0); +#else + strcpy(testpath, home); + strcat(testpath, "/testmisc/"); + test(setenv("EPOCROOT", testpath, 1) == 0); +#endif + + _LIT(KCDriveTest2, "\\epoc32\\test2\\"); + test(fs.MkDirAll(KCDriveTest2) == KErrNone); + test(fs.Att(_L("\\epoc32\\test1\\"),att) == KErrNone); + test(fs.Att(_L("\\epoc32\\test2\\"),att) == KErrNone); + +#ifdef _WIN32 + test(stat("c:\\testMisc\\epoc32\\test2", &sb) == 0); +#else + strcpy(testpath, home); + strcat(testpath, "/testmisc/epoc32/test2"); + test(stat(testpath, &sb) == 0); +#endif + +#ifdef _WIN32 + env = "EPOCROOT=\\"; + test(putenv(env) == 0); +#else + test(setenv("EPOCROOT", home, 1) == 0); +#endif + + test(fs.RmDir(_L("c:\\testMisc\\epoc32\\test1\\")) == KErrNone); + test(fs.RmDir(_L("c:\\testMisc\\epoc32\\test2\\")) == KErrNone); + test(fs.RmDir(_L("c:\\testMisc\\epoc32\\")) == KErrNone); + test(fs.RmDir(_L("c:\\testMisc\\")) == KErrNone); + + fs.Close(); + } + +#ifdef USING_SYMPORT_DLL +IMPORT_C TVersion SymPortVersion(); +void testVersion() + { + TVersion ver(SymPortVersion()); + test(ver.iMajor >= 1); + + TPtrC name(ver.Name()); + test.Printf(_L("Symport Version: %S\n"), &name); + } +#endif +#endif + +void doMainL() + { + test.Start(_L("RFs")); + testRFs(); + + test.Next(_L("TParse")); + testTParse(); + + test.Next(_L("TFileText")); + testTFileText(); + + test.Next(_L("RFile")); + testRFile(); + + test.Next(_L("Misc")); +#ifdef __TOOLS2__ + testSpecialFilenameProcessing(); +#ifdef USING_SYMPORT_DLL + testVersion(); +#endif +#endif + + test.End(); + } +int E32Main() + { + __UHEAP_MARK; + CTrapCleanup* theCleanup = CTrapCleanup::New(); + TRAPD(ret, doMainL()); + test(ret == KErrNone); + test.Close(); + delete theCleanup; + __UHEAP_MARKEND; + return ret; + } diff -r c55016431358 -r 0a7b44b10206 symport/symfile/test.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symfile/test.pl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,199 @@ +#!/usr/bin/perl + +# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +use strict; +use warnings; +use Test; +use Getopt::Long qw(:config auto_version auto_help); +use File::Spec::Functions; +use File::Basename; + +# The following are the tests to run +BEGIN { plan tests => 6 } + +# Make sure we're in the correct folder +chdir('../symfile') or die "Failed to set folder: $!"; + +# Version of the script - just use the date +$main::VERSION = '02-Oct-08'; + +# Get command line arguments +print "\n"; +my ( $verbose, $skip ); +GetOptions("verbose" => \$verbose, "skip" => \$skip) or pod2usage(2); + +# Get OS version +my $win32 = 1 if $^O =~ /MSWin32/; +print "Running on Win32\n" if $win32 && $verbose; +print "Running on Linux\n" if !$win32 && $verbose; + +# Build the code +doBuild() if (!$skip); + +# Run the tests +doTest('deb', 't_symfile'); +doTest('rel', 't_symfile'); +doTest('deb', 't_symfile_dll'); +doTest('rel', 't_symfile_dll'); + +# Run tests in emulator to check compatibility +if ($win32) + { + doEmuTest(catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'winscw', 'udeb', 't_symfile.exe')); + doEmuTest(catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'winscw', 'urel', 't_symfile.exe')); + } +else + { + # No emulator on Linux + ok(1); + ok(1); + } + +# *** +# Runs test code +# +sub doTest + { + my ( $variant, $name ) = @_; + + my $test; + if ($win32) + { + $test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', $variant, "$name.exe"); + } + else + { + # Have to set library path for Linux + $ENV{LD_LIBRARY_PATH} =~ s[/epoc32[^:]+:/][]; + $ENV{LD_LIBRARY_PATH} = "$ENV{EPOCROOT}epoc32/release/tools2/linux-i386/$variant:$ENV{LD_LIBRARY_PATH}"; + $test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', 'linux-i386', $variant, $name); + } + + die "Can't find test exe: $test" if !-e $test; + print "Running test: $test\n" if $verbose; + + my $pass; + open TEST, "$test|" or die "Failed to start test $test: $!"; + while(my $line = ) + { + next unless $line =~ /RTEST: /; + print "\t$line" if $verbose; + $pass = 1 if $line =~ /^RTEST: SUCCESS/ or $line =~ /TEST Successfully Completed/; + } + + close TEST; + print "FAIL: $test\n" if (!$pass); + ok($pass); + } + +# *** +# Runs emulator test code +# +sub doEmuTest + { + my $test = shift; + die "Can't find test exe: $test" if !-e $test; + print "Running emulator test: $test\n" if $verbose; + my $vis = $verbose ? 'textshell' : 'NoGui'; + + # Make sure the log file doesn't exist + my $logfile = catfile($ENV{TEMP}, 'epocwind.out'); + unlink $logfile; + + # Start the emulator + die "Failed to Launch emulator for $test: $!" if system("$test -D$vis --") != 0; + + # Check the log file + my $pass; + open LOG, $logfile, or die "Failed open log file $logfile: $!"; + while(my $line = ) + { + next unless $line =~ /RTEST: /; + + $line =~ s/^.*\t//; + chomp $line; + + # Next line contains the test description + my $nextline = ; + $nextline =~ s/^.*\t//; + $line .= $nextline; + + print "\t$line" if $verbose; + $pass = 1 if $line =~ /^RTEST: SUCCESS/ or $line =~ /TEST Successfully Completed/; + } + close LOG; + print "FAIL: $test\n" if (!$pass); + ok($pass); + } + +# *** +# Builds the test code +# * +sub doBuild + { + # First of all see if SBSv2 is installed + my $sbs_ver = 1; + open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!"; + while() + { + if (/^sbs version/) + { + $sbs_ver = 2; + last; + } + } + close SBS; + + # Override the result using environment variable + $sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1; + my $redir = $verbose?'':' >nul 2>&1'; + + # Now build the test code - assumes current working directory is correct! + print "Building test code using SBSv$sbs_ver\n"; + if ($sbs_ver == 1) + { + # Use the old build system + system("bldmake bldfiles$redir"); + system("abld test makefile$redir"); + system("abld test clean$redir"); + system("abld test build$redir"); + } + else + { + # Use the new build system + system("sbs -c tools2.test CLEAN$redir"); + system("sbs -c tools2.test$redir"); + system("sbs -c winscw.test CLEAN$redir"); + system("sbs -c winscw.test$redir"); + } + } + +=head1 NAME + +test.pl - A script for running tests + +=head1 SYNOPSIS + +test.pl [-help] [-version] [-verbose] [-skip] + + Options: + -help brief help message + -version version of the script + -verbose print what the scripts does + -skip skip building the code + +=cut diff -r c55016431358 -r 0a7b44b10206 symport/symuser/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/bld.inf Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,275 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_PLATFORMS +TOOLS2 + +PRJ_EXTENSIONS + +#ifdef TOOLS2 +start extension tools/x86tool + + option TARGET_NAME symuser + option TARGET_TYPE lib + + option MACROS __MINIMUM_MACHINE_CODE__ __CPU_HAS_CP15_THREAD_ID_REG __USERSIDE_THREAD_DATA__ + option INCLUDES ../e32/include ../bafl/inc ../charconv/framework/inc + + option SOURCE_DIRS ../e32/common ../e32/euser ../e32/euser/cbase ../e32/euser/epoc/x86 ../e32/euser/maths ../e32/euser/unicode \ + ../bafl/src ../charconv/framework/src/charconv + + option SOURCE_FOLDER . + option SOURCE symuser.cpp exec.cpp new.cpp loader.cpp x86hlp.cia + option COMPILE_OPTIONS -Wno-return-type +end + +start extension tools/x86tool + + option TARGET_NAME symexestub + option TARGET_TYPE lib + option SOURCE exestub.cpp + + option INCLUDES ../e32/include +end +#endif + +PRJ_TESTEXPORTS + +../e32test/buffer/UnicodeData.txt z:/test/unicodedata.txt + +PRJ_TESTEXTENSIONS + +#ifdef TOOLS2 +start extension tools/x86tool + option TARGET_NAME t_bflat + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_bflat.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_bseg + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_bseg.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_buf + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_buf.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_rbuf + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_rbuf.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_char + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_char.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_circ + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_circ.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_collate + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_collate.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_des + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_des.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_farray + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_farray.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_func + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_func.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_graph + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_graph.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_key + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_key.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_lex + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_lex.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_match + option TARGET_TYPE exe + option INCLUDES ../e32/euser/unicode + option SOURCE ../e32test/buffer/t_match.cpp + option LIBS symuser symfile +end + +start extension tools/x86tool + option TARGET_NAME t_parray + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_parray.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_que + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_que.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_readar + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_readar.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_regn + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_regn.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_sque + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_sque.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_varray + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_varray.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_versio + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_versio.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_hashtab + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_hashtab.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME T_FoldPerf + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/T_FoldPerf.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_huff + option TARGET_TYPE exe + option SOURCE ../e32test/buffer/t_huff.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_float + option TARGET_TYPE exe + option SOURCE ../e32test/math/t_float.cpp ../e32test/math/t_float1.cpp ../e32test/math/t_float2.cpp ../e32test/math/t_float3.cpp ../e32test/math/t_fltcl.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_i64 + option TARGET_TYPE exe + option SOURCE ../e32test/math/t_i64.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_i64_2 + option TARGET_TYPE exe + option SOURCE ../e32test/math/t_i64_2.cpp ../e32test/math/largeint.cpp + option LIBS symuser +end + + +start extension tools/x86tool + option TARGET_NAME t_math + option TARGET_TYPE exe + option SOURCE ../e32test/math/t_math.cpp + option LIBS symuser +end + + +start extension tools/x86tool + option TARGET_NAME t_math2 + option TARGET_TYPE exe + option SOURCE ../e32test/math/t_math2.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_trap + option TARGET_TYPE exe + option SOURCE ../e32test/system/t_trap.cpp + option LIBS symuser +end + +start extension tools/x86tool + option TARGET_NAME t_ctrap + option TARGET_TYPE exe + option SOURCE ../e32test/system/t_ctrap.cpp + option LIBS symuser +end + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/symuser/exec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/exec.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,151 @@ +// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#else +#include +#endif + +#include "e32base.h" + +extern int gArgc; +extern char **gArgv; + +// The exec class implements low level functionality needed by the TOOLS2 port +// These are normally kernel executive calls +class Exec + { + static TInt TimeNow(TInt64&, TInt&); + static TInt TimeNowSecure(TInt64&, TInt&); + static void DebugPrint(TAny* aPtr, TInt); + static TUint32 MathRandom(); + static void ProcessCommandLine(TInt, TDes8&); + static TInt ProcessCommandLineLength(TInt); + static TUint TickCount(); + static TUint32 NTickCount(); + static void After(TInt, TRequestStatus&); + static void AfterHighRes(TInt, TRequestStatus&); + }; + +// *** +// after +// + +void Exec::After(TInt aInterval, TRequestStatus&) + { +#ifdef _WIN32 + Sleep(aInterval/1000); +#else + sleep(aInterval/1000000); +#endif + } + +void Exec::AfterHighRes(TInt aInterval, TRequestStatus&) + { +#ifdef _WIN32 + Sleep(aInterval/1000); +#else + sleep(aInterval/1000000); +#endif + } + +// *** +// tick +// +TUint Exec::TickCount() + { + return (TUint)clock(); + } + +TUint32 Exec::NTickCount() + { + return (TUint32)clock(); + } + +// *** +// command line +// +void Exec::ProcessCommandLine(TInt, TDes8& aCmd) + { + TPtr16 aCommand16((TUint16*)aCmd.Ptr(),aCmd.MaxLength()>>1); + for(TInt i = 1; i < gArgc; i++) + { + if (i > 0) + aCommand16.Append(' '); + + for(TUint s = 0; s < strlen(gArgv[i]); s++) + { + aCommand16.Append(gArgv[i][s]); + } + } + aCmd.SetLength(aCommand16.Length()<<1); + } + +TInt Exec::ProcessCommandLineLength(TInt) + { + TInt len = 0; + for(TInt i = 1; i < gArgc; i++) + { + if (i > 0) + len++; + len += strlen(gArgv[i]); + } + return len; + } + +// *** +// debug +// +void Exec::DebugPrint(TAny* aPtr, TInt) + { + TPtr8* p = (TPtr8*)aPtr; + for(TInt i = 0; i < p->Length(); i++) + putchar((*p)[i]); + + } + +// *** +// rand +// +TUint32 Exec::MathRandom() + { + return rand(); + } + +// *** +// time +// +TInt Exec::TimeNow(TInt64& aUniversalTime, TInt& aUniversalTimeOffset) + { + aUniversalTimeOffset = 0; + + time_t t = time(NULL); + struct tm *tm = gmtime(&t); + TTime tt = TDateTime(1900 + tm->tm_year, TMonth(tm->tm_mon), tm->tm_mday - 1, tm->tm_hour, tm->tm_min, tm->tm_sec, 0); + aUniversalTime = tt.Int64(); + + return KErrNone; + } + +TInt Exec::TimeNowSecure(TInt64& aUniversalTime, TInt& aUniversalTimeOffset) + { + return Exec::TimeNow(aUniversalTime, aUniversalTimeOffset); + } diff -r c55016431358 -r 0a7b44b10206 symport/symuser/exec_enum.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/exec_enum.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,303 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalComponent +*/ + + +enum TFastExecDispatch + { + EFastExecWaitForAnyRequest = 0, + EFastExecHeap = 1, + EFastExecHeapSwitch = 2, + EFastExecPushTrapFrame = 3, + EFastExecPopTrapFrame = 4, + EFastExecActiveScheduler = 5, + EFastExecSetActiveScheduler = 6, + EFastExecLockPeriod = 7, + EFastExecTrapHandler = 8, + EFastExecSetTrapHandler = 9, + EFastExecLockedInc = 10, + EFastExecLockedDec = 11, + EFastExecDebugMask = 12, + EFastExecDebugMaskIndex = 13, + EFastExecSetDebugMask = 14, + EFastExecFastCounter = 15, + EFastExecNTickCount = 16, + EFastExecLockRamDrive = 17, + EFastExecUnlockRamDrive = 18, + EFastExecRomHeaderAddress = 19, + EFastExecRomRootDirectoryAddress = 20, + EFastExecSafeInc = 21, + EFastExecSafeDec = 22, + EFastExecSetReentryPoint = 23, + EFastExecKernelConfigFlags = 24, + EFastExecUTCOffset = 25, + EFastExecGetGlobalUserData = 26, + EFastExecCheckFilter = 27, + }; + +enum TExecDispatch + { + EExecObjectNext = 0, + EExecChunkBase = 1, + EExecChunkSize = 2, + EExecChunkMaxSize = 3, + EExecHandleAttributes = 4, + EExecTickCount = 5, + EExecLogicalDeviceGetCaps = 6, + EExecLogicalDeviceQueryVersionSupported = 7, + EExecLogicalDeviceIsAvailable = 8, + EExecLocaleExports = 9, + EExecChannelRequest = 10, + EExecMathRandom = 11, + EExecIMBRange = 12, + EExecResetMachine = 13, + EExecLibraryLookup = 14, + EExecLibraryFileName = 15, + EExecExecuteInSupervisorMode = 16, + EExecMutexWait = 17, + EExecMutexSignal = 18, + EExecProcessId = 19, + EExecDllFileName = 20, + EExecProcessResume = 21, + EExecProcessFileName = 22, + EExecProcessCommandLine = 23, + EExecProcessExitType = 24, + EExecProcessExitReason = 25, + EExecProcessExitCategory = 26, + EExecProcessPriority = 27, + EExecProcessSetPriority = 28, + EExecProcessFlags = 29, + EExecProcessSetFlags = 30, + EExecSemaphoreWait = 31, + EExecSemaphoreSignal1 = 32, + EExecSemaphoreSignalN = 33, + EExecServerReceive = 34, + EExecServerCancel = 35, + EExecSetSessionPtr = 36, + EExecSessionSend = 37, + EExecThreadId = 38, + EExecSessionShare = 39, + EExecThreadResume = 40, + EExecThreadSuspend = 41, + EExecThreadPriority = 42, + EExecThreadSetPriority = 43, + EExecThreadProcessPriority = 44, + EExecThreadSetProcessPriority = 45, + EExecThreadFlags = 46, + EExecThreadSetFlags = 47, + EExecThreadRequestCount = 48, + EExecThreadExitType = 49, + EExecThreadExitReason = 50, + EExecThreadExitCategory = 51, + EExecTimerCancel = 52, + EExecTimerAfter = 53, + EExecTimerAt = 54, + EExecTimerLock = 55, + EExecChangeNotifierLogon = 56, + EExecChangeNotifierLogoff = 57, + EExecRequestSignal = 58, + EExecHandleName = 59, + EExecHandleFullName = 60, + EExecHandleInfo = 61, + EExecHandleCount = 62, + EExecAfter = 63, + EExecAt = 64, + EExecMessageComplete = 65, + EExecMessageCompleteWithHandle = 66, + EExecTimeNow = 67, + EExecTimeNowSecure = 68, + EExecSetUTCTimeAndOffset = 69, + EExecSetMachineConfiguration = 70, + EExecCaptureEventHook = 71, + EExecReleaseEventHook = 72, + EExecRequestEvent = 73, + EExecRequestEventCancel = 74, + EExecAddEvent = 75, + EExecSessionSendSync = 76, + EExecDllTls = 77, + EExecHalFunction = 78, + EExecWsRegisterThread = 79, + EExecFsRegisterThread = 80, + EExecProcessCommandLineLength = 81, + EExecTimerInactivity = 82, + EExecUserInactivityTime = 83, + EExecResetInactivityTime = 84, + EExecDebugPrint = 85, + EExecBreakPoint = 86, + EExecProfileStart = 87, + EExecProfileEnd = 88, + EExecExceptionHandler = 89, + EExecSetExceptionHandler = 90, + EExecModifyExceptionMask = 91, + EExecRaiseException = 92, + EExecIsExceptionHandled = 93, + EExecProcessGetMemoryInfo = 94, + EExecLibraryGetMemoryInfo = 95, + EExecMachineConfiguration = 96, + EExecSetMemoryThresholds = 97, + EExecLibraryType = 98, + EExecProcessType = 99, + EExecChunkBottom = 100, + EExecChunkTop = 101, + EExecThreadContext = 102, + EExecThreadCreate = 103, + EExecFindHandleOpen = 104, + EExecHandleClose = 105, + EExecChunkCreate = 106, + EExecChunkAdjust = 107, + EExecOpenObject = 108, + EExecHandleDuplicate = 109, + EExecMutexCreate = 110, + EExecSemaphoreCreate = 111, + EExecThreadOpenById = 112, + EExecProcessOpenById = 113, + EExecThreadKill = 114, + EExecThreadLogon = 115, + EExecThreadLogonCancel = 116, + EExecDllSetTls = 117, + EExecDllFreeTls = 118, + EExecThreadRename = 119, + EExecProcessRename = 120, + EExecProcessKill = 121, + EExecProcessLogon = 122, + EExecProcessLogonCancel = 123, + EExecThreadProcess = 124, + EExecServerCreate = 125, + EExecSessionCreate = 126, + EExecSessionCreateFromHandle = 127, + EExecDeviceLoad = 128, + EExecDeviceFree = 129, + EExecChannelCreate = 130, + EExecTimerCreate = 131, + EExecTimerHighRes = 132, + EExecAfterHighRes = 133, + EExecChangeNotifierCreate = 134, + EExecUndertakerCreate = 135, + EExecUndertakerLogon = 136, + EExecUndertakerLogonCancel = 137, + EExecKernelHeapDebug = 138, + EExecThreadGetCpuTime = 139, + EExecCodeSegCreate = 140, + EExecCodeSegLoaded = 141, + EExecLibraryCreate = 142, + EExecCodeSegOpen = 143, + EExecCodeSegClose = 144, + EExecCodeSegNext = 145, + EExecCodeSegInfo = 146, + EExecCodeSegAddDependency = 147, + EExecCodeSegDeferDeletes = 148, + EExecCodeSegEndDeferDeletes = 149, + EExecProcessCreate = 150, + EExecProcessLoaded = 151, + EExecCheckLoaderClientState = 152, + EExecThreadProcessCodeSeg = 153, + EExecCodeSegReadExportDir = 154, + EExecWaitDllLock = 155, + EExecReleaseDllLock = 156, + EExecLibraryAttach = 157, + EExecLibraryAttached = 158, + EExecStaticCallList = 159, + EExecLibraryDetach = 160, + EExecLibraryDetached = 161, + EExecLastThreadHandle = 162, + EExecThreadRendezvous = 163, + EExecProcessRendezvous = 164, + EExecMessageGetDesLength = 165, + EExecMessageGetDesMaxLength = 166, + EExecMessageIpcCopy = 167, + EExecMessageClient = 168, + EExecMessageSetProcessPriority = 169, + EExecMessageConstructFromPtr = 170, + EExecMessageKill = 171, + EExecMessageOpenObject = 172, + EExecProcessSecurityInfo = 173, + EExecThreadSecurityInfo = 174, + EExecMessageSecurityInfo = 175, + EExecCreatorSecurityInfo = 176, + EExecDisabledCapabilities = 177, + EExecChunkSetRestrictions = 178, + EExecMsgQueueCreate = 179, + EExecMsgQueueSend = 180, + EExecMsgQueueReceive = 181, + EExecMsgQueueNotifySpaceAvailable = 182, + EExecMsgQueueCancelSpaceAvailable = 183, + EExecMsgQueueNotifyDataAvailable = 184, + EExecMsgQueueCancelDataAvailable = 185, + EExecMsgQueueSize = 186, + EExecPropertyDefine = 187, + EExecPropertyDelete = 188, + EExecPropertyAttach = 189, + EExecPropertySubscribe = 190, + EExecPropertyCancel = 191, + EExecPropertyGetI = 192, + EExecPropertyGetB = 193, + EExecPropertySetI = 194, + EExecPropertySetB = 195, + EExecPropertyFindGetI = 196, + EExecPropertyFindGetB = 197, + EExecPropertyFindSetI = 198, + EExecPropertyFindSetB = 199, + EExecPowerEnableWakeupEvents = 200, + EExecPowerDisableWakeupEvents = 201, + EExecPowerRequestWakeupEventNotification = 202, + EExecPowerCancelWakeupEventNotification = 203, + EExecPowerDown = 204, + EExecProcessSetHandleParameter = 205, + EExecProcessSetDataParameter = 206, + EExecProcessGetHandleParameter = 207, + EExecProcessGetDataParameter = 208, + EExecProcessDataParameterLength = 209, + EExecMessageClientProcessFlags = 210, + EExecThreadStackInfo = 211, + EExecThreadGetHeap = 212, + EExecThreadAsProcess = 213, + EExecCondVarCreate = 214, + EExecCondVarWait = 215, + EExecCondVarSignal = 216, + EExecCondVarBroadcast = 217, + EExecPlatSecDiagnostic = 218, + EExecExceptionDescriptor = 219, + EExecThreadRequestSignal = 220, + EExecMutexIsHeld = 221, + EExecLeaveStart = 222, + EExecLeaveEnd = 223, + EExecSetDebugMaskIndex = 224, + EExecGetModuleNameFromAddress = 225, + EExecNotifyChanges = 226, + EExecSetGlobalUserData = 227, + EExecSessionSecurityInfo = 228, + EExecMessageClientStatus = 229, + EExecSetFloatingPointMode = 230, + EExecBTraceOut = 231, + EExecBTraceOutBig = 232, + EExecCheckFilter2 = 233, + EExecProcessExeExportData = 234, + EExecNotifyIfCodeSegDestroyed = 235, + EExecGetDestroyedCodeSegInfo = 236, + EExecSetWin32RuntimeHook = 237, + EExecGetBTraceId = 238, + EExecNotifyOnIdle = 239, + EExecCancelMiscNotifier = 240, + EExecNotifyObjectDestruction = 241, + EExecRegisterTrustedChunk = 242, + EExecUserThreadExiting = 243, + EExecKernMsgTest = 244, + EExecGetLatencyValues = 245, + EExecCalcKernelHeapUsed = 246, + }; diff -r c55016431358 -r 0a7b44b10206 symport/symuser/exec_user.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/exec_user.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,1601 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalComponent +*/ + +class Exec + { +public: + static void WaitForAnyRequest(); + static RAllocator* Heap(); + static RAllocator* HeapSwitch(RAllocator*); + static TTrapHandler* PushTrapFrame(TTrap*); + static TTrap* PopTrapFrame(); + static CActiveScheduler* ActiveScheduler(); + static void SetActiveScheduler(CActiveScheduler*); + static TTimerLockSpec LockPeriod(); + static TTrapHandler* TrapHandler(); + static TTrapHandler* SetTrapHandler(TTrapHandler*); + static TInt LockedInc(TInt&); + static TInt LockedDec(TInt&); + static TUint32 DebugMask(); + static TUint32 DebugMaskIndex(TUint); + static void SetDebugMask(TUint32); + static TUint32 FastCounter(); + static TUint32 NTickCount(); + static TInt SafeInc(TInt&); + static TInt SafeDec(TInt&); + static void SetReentryPoint(TLinAddr); + static TUint32 KernelConfigFlags(); + static TInt UTCOffset(); + static TInt GetGlobalUserData(TInt); + static TInt ObjectNext(TObjectType, TBuf8&, TFindHandle&); + static TUint8* ChunkBase(TInt); + static TInt ChunkSize(TInt); + static TInt ChunkMaxSize(TInt); + static TUint HandleAttributes(TInt); + static TUint TickCount(); + static void LogicalDeviceGetCaps(TInt, TDes8&); + static TBool LogicalDeviceQueryVersionSupported(TInt, const TVersion&); + static TBool LogicalDeviceIsAvailable(TInt, TInt, const TDesC8*, const TDesC8*); + static TInt ChannelRequest(TInt, TInt, TAny*, TAny*); + static TUint32 MathRandom(); + static void IMB_Range(TAny*, TUint); + static TInt ResetMachine(TMachineStartupType); + static TLibraryFunction LibraryLookup(TInt, TInt); + static void LibraryFileName(TInt, TDes8&); + static void MutexWait(TInt); + static void MutexSignal(TInt); + static TInt ProcessId(TInt); + static void DllFileName(TInt, TDes8&); + static void ProcessResume(TInt); + static void ProcessFileName(TInt, TDes8&); + static void ProcessCommandLine(TInt, TDes8&); + static TExitType ProcessExitType(TInt); + static TInt ProcessExitReason(TInt); + static void ProcessExitCategory(TInt, TDes8&); + static TProcessPriority ProcessPriority(TInt); + static void ProcessSetPriority(TInt, TProcessPriority); + static TUint ProcessFlags(TInt); + static void ProcessSetFlags(TInt, TUint, TUint); + static TInt SemaphoreWait(TInt, TInt); + static void SemaphoreSignal1(TInt); + static void SemaphoreSignalN(TInt, TInt); + static void ServerReceive(TInt, TRequestStatus&, TAny*); + static void ServerCancel(TInt); + static void SetSessionPtr(TInt, const TAny*); + static TInt SessionSend(TInt, TInt, TAny*, TRequestStatus*); + static TInt ThreadId(TInt); + static TInt SessionShare(TInt&, TInt); + static void ThreadResume(TInt); + static void ThreadSuspend(TInt); + static TThreadPriority ThreadPriority(TInt); + static void ThreadSetPriority(TInt, TThreadPriority); + static TProcessPriority ThreadProcessPriority(TInt); + static void ThreadSetProcessPriority(TInt, TProcessPriority); + static TUint ThreadFlags(TInt); + static void ThreadSetFlags(TInt, TUint, TUint); + static TInt ThreadRequestCount(TInt); + static TExitType ThreadExitType(TInt); + static TInt ThreadExitReason(TInt); + static void ThreadExitCategory(TInt, TDes8&); + static void TimerCancel(TInt); + static void TimerAfter(TInt, TRequestStatus&, TInt); + static void TimerAt(TInt, TRequestStatus&, const EXEC_TIME&); + static void TimerLock(TInt, TRequestStatus&, TTimerLockSpec); + static TInt ChangeNotifierLogon(TInt, TRequestStatus&); + static TInt ChangeNotifierLogoff(TInt); + static void RequestSignal(TInt); + static void HandleName(TInt, TDes8&); + static void HandleFullName(TInt, TDes8&); + static void HandleInfo(TInt, THandleInfo*); + static void HandleCount(TInt, TInt&, TInt&); + static void After(TInt, TRequestStatus&); + static void At(const EXEC_TIME&, TRequestStatus&); + static void MessageComplete(TInt, TInt); + static void MessageCompleteWithHandle(TInt, TInt); + static TInt TimeNow(EXEC_TIME&, TInt&); + static TInt TimeNowSecure(EXEC_TIME&, TInt&); + static TInt SetUTCTimeAndOffset(const EXEC_TIME&, TInt, TUint, TUint); + static TInt SetMachineConfiguration(const TDesC8&); + static void CaptureEventHook(); + static void ReleaseEventHook(); + static void RequestEvent(TRawEventBuf&, TRequestStatus&); + static void RequestEventCancel(); + static TInt AddEvent(const TRawEvent&); + static TInt SessionSendSync(TInt, TInt, TAny*, TRequestStatus*); + static TAny* DllTls(TInt, TInt); + static TInt HalFunction(TInt, TInt, TAny*, TAny*); + static void WsRegisterThread(); + static void FsRegisterThread(); + static TInt ProcessCommandLineLength(TInt); + static void TimerInactivity(TInt, TRequestStatus&, TInt); + static TInt UserInactivityTime(); + static void ResetInactivityTime(); + static void DebugPrint(TAny*, TInt); + static TInt BreakPoint(); + static TInt ProfileStart(TInt); + static TInt ProfileEnd(TInt); + static TExceptionHandler ExceptionHandler(TInt); + static TInt SetExceptionHandler(TInt, TExceptionHandler, TUint32); + static void ModifyExceptionMask(TInt, TUint32, TUint32); + static TInt RaiseException(TInt, TExcType); + static TInt IsExceptionHandled(TInt, TExcType, TBool); + static TInt ProcessGetMemoryInfo(TInt, TModuleMemoryInfo&); + static TInt LibraryGetMemoryInfo(TInt, TModuleMemoryInfo&); + static TInt MachineConfiguration(TDes8&, TInt&); + static TInt SetMemoryThresholds(TInt, TInt); + static void LibraryType(TInt, TUidType&); + static void ProcessType(TInt, TUidType&); + static TInt ChunkBottom(TInt); + static TInt ChunkTop(TInt); + static void ThreadContext(TInt, TDes8&); + static TInt ThreadCreate(const TDesC8&, TOwnerType, SThreadCreateInfo8&); + static TInt FindHandleOpen(TOwnerType, const TFindHandle&); + static TInt HandleClose(TInt); + static TInt ChunkCreate(TOwnerType, const TDesC8*, TChunkCreate&); + static TInt ChunkAdjust(TInt, TInt, TInt, TInt); + static TInt OpenObject(TObjectType, const TDesC8&, TOwnerType); + static TInt HandleDuplicate(TInt, TOwnerType, TInt); + static TInt MutexCreate(const TDesC8*, TOwnerType); + static TInt SemaphoreCreate(const TDesC8*, TInt, TOwnerType); + static TInt ThreadOpenById(TUint, TOwnerType); + static TInt ProcessOpenById(TUint, TOwnerType); + static void ThreadKill(TInt, TExitType, TInt, const TDesC8*); + static void ThreadLogon(TInt, TRequestStatus*, TBool); + static TInt ThreadLogonCancel(TInt, TRequestStatus*, TBool); + static TInt DllSetTls(TInt, TInt, TAny*); + static void DllFreeTls(TInt); + static TInt ThreadRename(TInt, const TDesC8&); + static TInt ProcessRename(TInt, const TDesC8&); + static void ProcessKill(TInt, TExitType, TInt, const TDesC8*); + static void ProcessLogon(TInt, TRequestStatus*, TBool); + static TInt ProcessLogonCancel(TInt, TRequestStatus*, TBool); + static TInt ThreadProcess(TInt); + static TInt ServerCreate(const TDesC8*, TInt); + static TInt SessionCreate(const TDesC8&, TInt, const TSecurityPolicy*, TInt); + static TInt SessionCreateFromHandle(TInt, TInt, const TSecurityPolicy*, TInt); + static TInt DeviceFree(const TDesC8&, TInt); + static TInt ChannelCreate(const TDesC8&, TChannelCreateInfo8&, TInt); + static TInt TimerCreate(); + static void TimerHighRes(TInt, TRequestStatus&, TInt); + static void AfterHighRes(TInt, TRequestStatus&); + static TInt ChangeNotifierCreate(TOwnerType); + static TInt UndertakerCreate(TOwnerType); + static TInt UndertakerLogon(TInt, TRequestStatus&, TInt&); + static TInt UndertakerLogonCancel(TInt); + static void KernelHeapDebug(TInt, TInt, TAny*); + static TInt ThreadGetCpuTime(TInt, EXEC_INT64&); + static TInt LastThreadHandle(); + static void ThreadRendezvous(TInt); + static void ProcessRendezvous(TInt); + static TInt MessageGetDesLength(TInt, TInt); + static TInt MessageGetDesMaxLength(TInt, TInt); + static TInt MessageIpcCopy(TInt, TInt, SIpcCopyInfo&, TInt); + static TInt MessageClient(TInt, TOwnerType); + static TInt MessageSetProcessPriority(TInt, TProcessPriority); + static void MessageConstructFromPtr(TInt, TAny*); + static void MessageKill(TInt, TExitType, TInt, const TDesC8*); + static TInt MessageOpenObject(TInt, TObjectType, TInt, TOwnerType); + static void ProcessSecurityInfo(TInt, SSecurityInfo&); + static void ThreadSecurityInfo(TInt, SSecurityInfo&); + static void MessageSecurityInfo(TInt, SSecurityInfo&); + static void CreatorSecurityInfo(SSecurityInfo&); + static void DisabledCapabilities(SCapabilitySet&); + static TInt ChunkSetRestrictions(TInt, TUint); + static TInt MsgQueueCreate(const TDesC8*, TInt, TInt, TOwnerType); + static TInt MsgQueueSend(TInt, const TAny*, TInt); + static TInt MsgQueueReceive(TInt, TAny*, TInt); + static void MsgQueueNotifySpaceAvailable(TInt, TRequestStatus&); + static void MsgQueueCancelSpaceAvailable(TInt); + static void MsgQueueNotifyDataAvailable(TInt, TRequestStatus&); + static void MsgQueueCancelDataAvailable(TInt); + static TInt MsgQueueSize(TInt); + static TInt PropertyDefine(TUint, TUint, TPropertyInfo*); + static TInt PropertyDelete(TUint, TUint); + static TInt PropertyAttach(TUint, TUint, TOwnerType); + static void PropertySubscribe(TInt, TRequestStatus*); + static void PropertyCancel(TInt); + static TInt PropertyGetI(TInt, TInt*); + static TInt PropertyGetB(TInt, TUint8*, TInt); + static TInt PropertySetI(TInt, TInt); + static TInt PropertySetB(TInt, const TUint8*, TInt); + static TInt PropertyFindGetI(TUint, TUint, TInt*); + static TInt PropertyFindGetB(TUint, TUint, TUint8*, TInt); + static TInt PropertyFindSetI(TUint, TUint, TInt); + static TInt PropertyFindSetB(TUint, TUint, TUint8*, TInt); + static TInt PowerEnableWakeupEvents(TPowerState); + static void PowerDisableWakeupEvents(); + static void PowerRequestWakeupEventNotification(TRequestStatus*); + static void PowerCancelWakeupEventNotification(); + static TInt PowerDown(); + static TInt ProcessSetHandleParameter(TInt, TInt, TInt); + static TInt ProcessSetDataParameter(TInt, TInt, const TUint8*, TInt); + static TInt ProcessGetHandleParameter(TInt, TObjectType, TOwnerType); + static TInt ProcessGetDataParameter(TInt, TUint8*, TInt); + static TInt ProcessDataParameterLength(TInt); + static TUint MessageClientProcessFlags(TInt); + static TInt ThreadStackInfo(TInt, TThreadStackInfo&); + static RAllocator* ThreadGetHeap(TInt); + static TInt ThreadAsProcess(TInt, TInt); + static TInt CondVarCreate(const TDesC8*, TOwnerType); + static TInt CondVarWait(TInt, TInt, TInt); + static void CondVarSignal(TInt); + static void CondVarBroadcast(TInt); + static TInt PlatSecDiagnostic(TPlatSecDiagnostic*); + static TLinAddr ExceptionDescriptor(TLinAddr); + static void ThreadRequestSignal(TInt); + static TBool MutexIsHeld(TInt); + static TTrapHandler* LeaveStart(); + static void LeaveEnd(); + static void SetDebugMaskIndex(TUint32, TUint); + static TInt GetModuleNameFromAddress(TAny*, TDes8&); + static void NotifyChanges(TUint); + static TInt SetGlobalUserData(TInt, TInt); + static TInt SessionSecurityInfo(TInt, SSecurityInfo&); + static const TRequestStatus* MessageClientStatus(TInt); + static TInt SetFloatingPointMode(TFloatingPointMode, TFloatingPointRoundingMode); + static TBool BTraceOut(TUint32, TUint32, const BTrace::SExecExtension&, TInt); + static TBool BTraceOutBig(TUint32, TUint32, const BTrace::SExecExtension&, TInt); + static TAny* ProcessExeExportData(); + IMPORT_C static TInt SetWin32RuntimeHook(TAny*); + static TInt GetBTraceId(TInt); + static void NotifyOnIdle(TRequestStatus*); + static void CancelMiscNotifier(TRequestStatus*); + static void NotifyObjectDestruction(TInt, TRequestStatus*); + static void RegisterTrustedChunk(TInt); + static TBool UserThreadExiting(TInt); + }; + +#ifdef __GEN_USER_EXEC_CODE__ +__EXECDECL__ void Exec::WaitForAnyRequest() + { + FAST_EXEC0(EFastExecWaitForAnyRequest); + } + +__EXECDECL__ RAllocator* Exec::Heap() + { + FAST_EXEC0(EFastExecHeap); + } + +__EXECDECL__ RAllocator* Exec::HeapSwitch(RAllocator*) + { + FAST_EXEC1(EFastExecHeapSwitch); + } + +__EXECDECL__ TTrapHandler* Exec::PushTrapFrame(TTrap*) + { + FAST_EXEC1(EFastExecPushTrapFrame); + } + +__EXECDECL__ TTrap* Exec::PopTrapFrame() + { + FAST_EXEC0(EFastExecPopTrapFrame); + } + +__EXECDECL__ CActiveScheduler* Exec::ActiveScheduler() + { + FAST_EXEC0(EFastExecActiveScheduler); + } + +__EXECDECL__ void Exec::SetActiveScheduler(CActiveScheduler*) + { + FAST_EXEC1(EFastExecSetActiveScheduler); + } + +__EXECDECL__ TTimerLockSpec Exec::LockPeriod() + { + FAST_EXEC0(EFastExecLockPeriod); + } + +__EXECDECL__ TTrapHandler* Exec::TrapHandler() + { + FAST_EXEC0(EFastExecTrapHandler); + } + +__EXECDECL__ TTrapHandler* Exec::SetTrapHandler(TTrapHandler*) + { + FAST_EXEC1(EFastExecSetTrapHandler); + } + +__EXECDECL__ TInt Exec::LockedInc(TInt&) + { + FAST_EXEC1(EFastExecLockedInc); + } + +__EXECDECL__ TInt Exec::LockedDec(TInt&) + { + FAST_EXEC1(EFastExecLockedDec); + } + +__EXECDECL__ TUint32 Exec::DebugMask() + { + FAST_EXEC0(EFastExecDebugMask); + } + +__EXECDECL__ TUint32 Exec::DebugMaskIndex(TUint) + { + FAST_EXEC1(EFastExecDebugMaskIndex); + } + +__EXECDECL__ void Exec::SetDebugMask(TUint32) + { + FAST_EXEC1(EFastExecSetDebugMask); + } + +__EXECDECL__ TUint32 Exec::FastCounter() + { + FAST_EXEC0(EFastExecFastCounter); + } + +__EXECDECL__ TUint32 Exec::NTickCount() + { + FAST_EXEC0(EFastExecNTickCount); + } + +EXPORT_C __EXECDECL__ void UserSvr::LockRamDrive() + { + FAST_EXEC0(EFastExecLockRamDrive); + } + +EXPORT_C __EXECDECL__ void UserSvr::UnlockRamDrive() + { + FAST_EXEC0(EFastExecUnlockRamDrive); + } + +EXPORT_C __EXECDECL__ TLinAddr UserSvr::RomHeaderAddress() + { + FAST_EXEC0(EFastExecRomHeaderAddress); + } + +EXPORT_C __EXECDECL__ TLinAddr UserSvr::RomRootDirectoryAddress() + { + FAST_EXEC0(EFastExecRomRootDirectoryAddress); + } + +__EXECDECL__ TInt Exec::SafeInc(TInt&) + { + FAST_EXEC1(EFastExecSafeInc); + } + +__EXECDECL__ TInt Exec::SafeDec(TInt&) + { + FAST_EXEC1(EFastExecSafeDec); + } + +__EXECDECL__ void Exec::SetReentryPoint(TLinAddr) + { + FAST_EXEC1(EFastExecSetReentryPoint); + } + +__EXECDECL__ TUint32 Exec::KernelConfigFlags() + { + FAST_EXEC0(EFastExecKernelConfigFlags); + } + +__EXECDECL__ TInt Exec::UTCOffset() + { + FAST_EXEC0(EFastExecUTCOffset); + } + +__EXECDECL__ TInt Exec::GetGlobalUserData(TInt) + { + FAST_EXEC1(EFastExecGetGlobalUserData); + } + +EXPORT_C __EXECDECL__ TBool BTrace::CheckFilter(TUint32) + { + FAST_EXEC1(EFastExecCheckFilter); + } + +__EXECDECL__ TInt Exec::ObjectNext(TObjectType, TBuf8&, TFindHandle&) + { + SLOW_EXEC3(EExecObjectNext); + } + +__EXECDECL__ TUint8* Exec::ChunkBase(TInt) + { + SLOW_EXEC1(EExecChunkBase); + } + +__EXECDECL__ TInt Exec::ChunkSize(TInt) + { + SLOW_EXEC1(EExecChunkSize); + } + +__EXECDECL__ TInt Exec::ChunkMaxSize(TInt) + { + SLOW_EXEC1(EExecChunkMaxSize); + } + +__EXECDECL__ TUint Exec::HandleAttributes(TInt) + { + SLOW_EXEC1(EExecHandleAttributes); + } + +__EXECDECL__ TUint Exec::TickCount() + { + SLOW_EXEC0(EExecTickCount); + } + +__EXECDECL__ void Exec::LogicalDeviceGetCaps(TInt, TDes8&) + { + SLOW_EXEC2(EExecLogicalDeviceGetCaps); + } + +__EXECDECL__ TBool Exec::LogicalDeviceQueryVersionSupported(TInt, const TVersion&) + { + SLOW_EXEC2(EExecLogicalDeviceQueryVersionSupported); + } + +__EXECDECL__ TBool Exec::LogicalDeviceIsAvailable(TInt, TInt, const TDesC8*, const TDesC8*) + { + SLOW_EXEC4(EExecLogicalDeviceIsAvailable); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::LocaleExports(TAny*, TLibraryFunction*) + { + SLOW_EXEC2(EExecLocaleExports); + } + +__EXECDECL__ TInt Exec::ChannelRequest(TInt, TInt, TAny*, TAny*) + { + SLOW_EXEC4(EExecChannelRequest); + } + +__EXECDECL__ TUint32 Exec::MathRandom() + { + SLOW_EXEC0(EExecMathRandom); + } + +__EXECDECL__ void Exec::IMB_Range(TAny*, TUint) + { + SLOW_EXEC2(EExecIMBRange); + } + +__EXECDECL__ TInt Exec::ResetMachine(TMachineStartupType) + { + SLOW_EXEC1(EExecResetMachine); + } + +__EXECDECL__ TLibraryFunction Exec::LibraryLookup(TInt, TInt) + { + SLOW_EXEC2(EExecLibraryLookup); + } + +__EXECDECL__ void Exec::LibraryFileName(TInt, TDes8&) + { + SLOW_EXEC2(EExecLibraryFileName); + } + +EXPORT_C __EXECDECL__ TInt UserSvr::ExecuteInSupervisorMode(TSupervisorFunction, TAny*) + { + SLOW_EXEC2(EExecExecuteInSupervisorMode); + } + +__EXECDECL__ void Exec::MutexWait(TInt) + { + SLOW_EXEC1(EExecMutexWait); + } + +__EXECDECL__ void Exec::MutexSignal(TInt) + { + SLOW_EXEC1(EExecMutexSignal); + } + +__EXECDECL__ TInt Exec::ProcessId(TInt) + { + SLOW_EXEC1(EExecProcessId); + } + +__EXECDECL__ void Exec::DllFileName(TInt, TDes8&) + { + SLOW_EXEC2(EExecDllFileName); + } + +__EXECDECL__ void Exec::ProcessResume(TInt) + { + SLOW_EXEC1(EExecProcessResume); + } + +__EXECDECL__ void Exec::ProcessFileName(TInt, TDes8&) + { + SLOW_EXEC2(EExecProcessFileName); + } + +__EXECDECL__ void Exec::ProcessCommandLine(TInt, TDes8&) + { + SLOW_EXEC2(EExecProcessCommandLine); + } + +__EXECDECL__ TExitType Exec::ProcessExitType(TInt) + { + SLOW_EXEC1(EExecProcessExitType); + } + +__EXECDECL__ TInt Exec::ProcessExitReason(TInt) + { + SLOW_EXEC1(EExecProcessExitReason); + } + +__EXECDECL__ void Exec::ProcessExitCategory(TInt, TDes8&) + { + SLOW_EXEC2(EExecProcessExitCategory); + } + +__EXECDECL__ TProcessPriority Exec::ProcessPriority(TInt) + { + SLOW_EXEC1(EExecProcessPriority); + } + +__EXECDECL__ void Exec::ProcessSetPriority(TInt, TProcessPriority) + { + SLOW_EXEC2(EExecProcessSetPriority); + } + +__EXECDECL__ TUint Exec::ProcessFlags(TInt) + { + SLOW_EXEC1(EExecProcessFlags); + } + +__EXECDECL__ void Exec::ProcessSetFlags(TInt, TUint, TUint) + { + SLOW_EXEC3(EExecProcessSetFlags); + } + +__EXECDECL__ TInt Exec::SemaphoreWait(TInt, TInt) + { + SLOW_EXEC2(EExecSemaphoreWait); + } + +__EXECDECL__ void Exec::SemaphoreSignal1(TInt) + { + SLOW_EXEC1(EExecSemaphoreSignal1); + } + +__EXECDECL__ void Exec::SemaphoreSignalN(TInt, TInt) + { + SLOW_EXEC2(EExecSemaphoreSignalN); + } + +__EXECDECL__ void Exec::ServerReceive(TInt, TRequestStatus&, TAny*) + { + SLOW_EXEC3(EExecServerReceive); + } + +__EXECDECL__ void Exec::ServerCancel(TInt) + { + SLOW_EXEC1(EExecServerCancel); + } + +__EXECDECL__ void Exec::SetSessionPtr(TInt, const TAny*) + { + SLOW_EXEC2(EExecSetSessionPtr); + } + +__EXECDECL__ TInt Exec::ThreadId(TInt) + { + SLOW_EXEC1(EExecThreadId); + } + +__EXECDECL__ TInt Exec::SessionShare(TInt&, TInt) + { + SLOW_EXEC2(EExecSessionShare); + } + +__EXECDECL__ void Exec::ThreadResume(TInt) + { + SLOW_EXEC1(EExecThreadResume); + } + +__EXECDECL__ void Exec::ThreadSuspend(TInt) + { + SLOW_EXEC1(EExecThreadSuspend); + } + +__EXECDECL__ TThreadPriority Exec::ThreadPriority(TInt) + { + SLOW_EXEC1(EExecThreadPriority); + } + +__EXECDECL__ void Exec::ThreadSetPriority(TInt, TThreadPriority) + { + SLOW_EXEC2(EExecThreadSetPriority); + } + +__EXECDECL__ TProcessPriority Exec::ThreadProcessPriority(TInt) + { + SLOW_EXEC1(EExecThreadProcessPriority); + } + +__EXECDECL__ void Exec::ThreadSetProcessPriority(TInt, TProcessPriority) + { + SLOW_EXEC2(EExecThreadSetProcessPriority); + } + +__EXECDECL__ TUint Exec::ThreadFlags(TInt) + { + SLOW_EXEC1(EExecThreadFlags); + } + +__EXECDECL__ void Exec::ThreadSetFlags(TInt, TUint, TUint) + { + SLOW_EXEC3(EExecThreadSetFlags); + } + +__EXECDECL__ TInt Exec::ThreadRequestCount(TInt) + { + SLOW_EXEC1(EExecThreadRequestCount); + } + +__EXECDECL__ TExitType Exec::ThreadExitType(TInt) + { + SLOW_EXEC1(EExecThreadExitType); + } + +__EXECDECL__ TInt Exec::ThreadExitReason(TInt) + { + SLOW_EXEC1(EExecThreadExitReason); + } + +__EXECDECL__ void Exec::ThreadExitCategory(TInt, TDes8&) + { + SLOW_EXEC2(EExecThreadExitCategory); + } + +__EXECDECL__ void Exec::TimerCancel(TInt) + { + SLOW_EXEC1(EExecTimerCancel); + } + +__EXECDECL__ void Exec::TimerAfter(TInt, TRequestStatus&, TInt) + { + SLOW_EXEC3(EExecTimerAfter); + } + +__EXECDECL__ void Exec::TimerAt(TInt, TRequestStatus&, const EXEC_TIME&) + { + SLOW_EXEC3(EExecTimerAt); + } + +__EXECDECL__ void Exec::TimerLock(TInt, TRequestStatus&, TTimerLockSpec) + { + SLOW_EXEC3(EExecTimerLock); + } + +__EXECDECL__ TInt Exec::ChangeNotifierLogon(TInt, TRequestStatus&) + { + SLOW_EXEC2(EExecChangeNotifierLogon); + } + +__EXECDECL__ TInt Exec::ChangeNotifierLogoff(TInt) + { + SLOW_EXEC1(EExecChangeNotifierLogoff); + } + +__EXECDECL__ void Exec::RequestSignal(TInt) + { + SLOW_EXEC1(EExecRequestSignal); + } + +__EXECDECL__ void Exec::HandleName(TInt, TDes8&) + { + SLOW_EXEC2(EExecHandleName); + } + +__EXECDECL__ void Exec::HandleFullName(TInt, TDes8&) + { + SLOW_EXEC2(EExecHandleFullName); + } + +__EXECDECL__ void Exec::HandleInfo(TInt, THandleInfo*) + { + SLOW_EXEC2(EExecHandleInfo); + } + +__EXECDECL__ void Exec::HandleCount(TInt, TInt&, TInt&) + { + SLOW_EXEC3(EExecHandleCount); + } + +__EXECDECL__ void Exec::After(TInt, TRequestStatus&) + { + SLOW_EXEC2(EExecAfter); + } + +__EXECDECL__ void Exec::At(const EXEC_TIME&, TRequestStatus&) + { + SLOW_EXEC2(EExecAt); + } + +__EXECDECL__ void Exec::MessageComplete(TInt, TInt) + { + SLOW_EXEC2(EExecMessageComplete); + } + +__EXECDECL__ void Exec::MessageCompleteWithHandle(TInt, TInt) + { + SLOW_EXEC2(EExecMessageCompleteWithHandle); + } + +__EXECDECL__ TInt Exec::TimeNow(EXEC_TIME&, TInt&) + { + SLOW_EXEC2(EExecTimeNow); + } + +__EXECDECL__ TInt Exec::TimeNowSecure(EXEC_TIME&, TInt&) + { + SLOW_EXEC2(EExecTimeNowSecure); + } + +__EXECDECL__ TInt Exec::SetUTCTimeAndOffset(const EXEC_TIME&, TInt, TUint, TUint) + { + SLOW_EXEC4(EExecSetUTCTimeAndOffset); + } + +__EXECDECL__ TInt Exec::SetMachineConfiguration(const TDesC8&) + { + SLOW_EXEC1(EExecSetMachineConfiguration); + } + +__EXECDECL__ void Exec::CaptureEventHook() + { + SLOW_EXEC0(EExecCaptureEventHook); + } + +__EXECDECL__ void Exec::ReleaseEventHook() + { + SLOW_EXEC0(EExecReleaseEventHook); + } + +__EXECDECL__ void Exec::RequestEvent(TRawEventBuf&, TRequestStatus&) + { + SLOW_EXEC2(EExecRequestEvent); + } + +__EXECDECL__ void Exec::RequestEventCancel() + { + SLOW_EXEC0(EExecRequestEventCancel); + } + +__EXECDECL__ TInt Exec::AddEvent(const TRawEvent&) + { + SLOW_EXEC1(EExecAddEvent); + } + +__EXECDECL__ TAny* Exec::DllTls(TInt, TInt) + { + SLOW_EXEC2(EExecDllTls); + } + +__EXECDECL__ TInt Exec::HalFunction(TInt, TInt, TAny*, TAny*) + { + SLOW_EXEC4(EExecHalFunction); + } + +__EXECDECL__ void Exec::WsRegisterThread() + { + SLOW_EXEC0(EExecWsRegisterThread); + } + +__EXECDECL__ void Exec::FsRegisterThread() + { + SLOW_EXEC0(EExecFsRegisterThread); + } + +__EXECDECL__ TInt Exec::ProcessCommandLineLength(TInt) + { + SLOW_EXEC1(EExecProcessCommandLineLength); + } + +__EXECDECL__ void Exec::TimerInactivity(TInt, TRequestStatus&, TInt) + { + SLOW_EXEC3(EExecTimerInactivity); + } + +__EXECDECL__ TInt Exec::UserInactivityTime() + { + SLOW_EXEC0(EExecUserInactivityTime); + } + +__EXECDECL__ void Exec::ResetInactivityTime() + { + SLOW_EXEC0(EExecResetInactivityTime); + } + +__EXECDECL__ void Exec::DebugPrint(TAny*, TInt) + { + SLOW_EXEC2(EExecDebugPrint); + } + +__EXECDECL__ TInt Exec::BreakPoint() + { + SLOW_EXEC0(EExecBreakPoint); + } + +__EXECDECL__ TInt Exec::ProfileStart(TInt) + { + SLOW_EXEC1(EExecProfileStart); + } + +__EXECDECL__ TInt Exec::ProfileEnd(TInt) + { + SLOW_EXEC1(EExecProfileEnd); + } + +__EXECDECL__ TExceptionHandler Exec::ExceptionHandler(TInt) + { + SLOW_EXEC1(EExecExceptionHandler); + } + +__EXECDECL__ TInt Exec::SetExceptionHandler(TInt, TExceptionHandler, TUint32) + { + SLOW_EXEC3(EExecSetExceptionHandler); + } + +__EXECDECL__ void Exec::ModifyExceptionMask(TInt, TUint32, TUint32) + { + SLOW_EXEC3(EExecModifyExceptionMask); + } + +__EXECDECL__ TInt Exec::RaiseException(TInt, TExcType) + { + SLOW_EXEC2(EExecRaiseException); + } + +__EXECDECL__ TInt Exec::IsExceptionHandled(TInt, TExcType, TBool) + { + SLOW_EXEC3(EExecIsExceptionHandled); + } + +__EXECDECL__ TInt Exec::ProcessGetMemoryInfo(TInt, TModuleMemoryInfo&) + { + SLOW_EXEC2(EExecProcessGetMemoryInfo); + } + +__EXECDECL__ TInt Exec::LibraryGetMemoryInfo(TInt, TModuleMemoryInfo&) + { + SLOW_EXEC2(EExecLibraryGetMemoryInfo); + } + +__EXECDECL__ TInt Exec::MachineConfiguration(TDes8&, TInt&) + { + SLOW_EXEC2(EExecMachineConfiguration); + } + +__EXECDECL__ TInt Exec::SetMemoryThresholds(TInt, TInt) + { + SLOW_EXEC2(EExecSetMemoryThresholds); + } + +__EXECDECL__ void Exec::LibraryType(TInt, TUidType&) + { + SLOW_EXEC2(EExecLibraryType); + } + +__EXECDECL__ void Exec::ProcessType(TInt, TUidType&) + { + SLOW_EXEC2(EExecProcessType); + } + +__EXECDECL__ TInt Exec::ChunkBottom(TInt) + { + SLOW_EXEC1(EExecChunkBottom); + } + +__EXECDECL__ TInt Exec::ChunkTop(TInt) + { + SLOW_EXEC1(EExecChunkTop); + } + +__EXECDECL__ void Exec::ThreadContext(TInt, TDes8&) + { + SLOW_EXEC2(EExecThreadContext); + } + +__EXECDECL__ TInt Exec::ThreadCreate(const TDesC8&, TOwnerType, SThreadCreateInfo8&) + { + SLOW_EXEC3(EExecThreadCreate); + } + +__EXECDECL__ TInt Exec::FindHandleOpen(TOwnerType, const TFindHandle&) + { + SLOW_EXEC2(EExecFindHandleOpen); + } + +__EXECDECL__ TInt Exec::HandleClose(TInt) + { + SLOW_EXEC1(EExecHandleClose); + } + +__EXECDECL__ TInt Exec::ChunkCreate(TOwnerType, const TDesC8*, TChunkCreate&) + { + SLOW_EXEC3(EExecChunkCreate); + } + +__EXECDECL__ TInt Exec::ChunkAdjust(TInt, TInt, TInt, TInt) + { + SLOW_EXEC4(EExecChunkAdjust); + } + +__EXECDECL__ TInt Exec::OpenObject(TObjectType, const TDesC8&, TOwnerType) + { + SLOW_EXEC3(EExecOpenObject); + } + +__EXECDECL__ TInt Exec::HandleDuplicate(TInt, TOwnerType, TInt) + { + SLOW_EXEC3(EExecHandleDuplicate); + } + +__EXECDECL__ TInt Exec::MutexCreate(const TDesC8*, TOwnerType) + { + SLOW_EXEC2(EExecMutexCreate); + } + +__EXECDECL__ TInt Exec::SemaphoreCreate(const TDesC8*, TInt, TOwnerType) + { + SLOW_EXEC3(EExecSemaphoreCreate); + } + +__EXECDECL__ TInt Exec::ThreadOpenById(TUint, TOwnerType) + { + SLOW_EXEC2(EExecThreadOpenById); + } + +__EXECDECL__ TInt Exec::ProcessOpenById(TUint, TOwnerType) + { + SLOW_EXEC2(EExecProcessOpenById); + } + +__EXECDECL__ void Exec::ThreadKill(TInt, TExitType, TInt, const TDesC8*) + { + SLOW_EXEC4(EExecThreadKill); + } + +__EXECDECL__ void Exec::ThreadLogon(TInt, TRequestStatus*, TBool) + { + SLOW_EXEC3(EExecThreadLogon); + } + +__EXECDECL__ TInt Exec::ThreadLogonCancel(TInt, TRequestStatus*, TBool) + { + SLOW_EXEC3(EExecThreadLogonCancel); + } + +__EXECDECL__ TInt Exec::DllSetTls(TInt, TInt, TAny*) + { + SLOW_EXEC3(EExecDllSetTls); + } + +__EXECDECL__ void Exec::DllFreeTls(TInt) + { + SLOW_EXEC1(EExecDllFreeTls); + } + +__EXECDECL__ TInt Exec::ThreadRename(TInt, const TDesC8&) + { + SLOW_EXEC2(EExecThreadRename); + } + +__EXECDECL__ TInt Exec::ProcessRename(TInt, const TDesC8&) + { + SLOW_EXEC2(EExecProcessRename); + } + +__EXECDECL__ void Exec::ProcessKill(TInt, TExitType, TInt, const TDesC8*) + { + SLOW_EXEC4(EExecProcessKill); + } + +__EXECDECL__ void Exec::ProcessLogon(TInt, TRequestStatus*, TBool) + { + SLOW_EXEC3(EExecProcessLogon); + } + +__EXECDECL__ TInt Exec::ProcessLogonCancel(TInt, TRequestStatus*, TBool) + { + SLOW_EXEC3(EExecProcessLogonCancel); + } + +__EXECDECL__ TInt Exec::ThreadProcess(TInt) + { + SLOW_EXEC1(EExecThreadProcess); + } + +__EXECDECL__ TInt Exec::ServerCreate(const TDesC8*, TInt) + { + SLOW_EXEC2(EExecServerCreate); + } + +__EXECDECL__ TInt Exec::SessionCreate(const TDesC8&, TInt, const TSecurityPolicy*, TInt) + { + SLOW_EXEC4(EExecSessionCreate); + } + +__EXECDECL__ TInt Exec::SessionCreateFromHandle(TInt, TInt, const TSecurityPolicy*, TInt) + { + SLOW_EXEC4(EExecSessionCreateFromHandle); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::DeviceLoad(TAny*, TInt) + { + SLOW_EXEC2(EExecDeviceLoad); + } + +__EXECDECL__ TInt Exec::DeviceFree(const TDesC8&, TInt) + { + SLOW_EXEC2(EExecDeviceFree); + } + +__EXECDECL__ TInt Exec::ChannelCreate(const TDesC8&, TChannelCreateInfo8&, TInt) + { + SLOW_EXEC3(EExecChannelCreate); + } + +__EXECDECL__ TInt Exec::TimerCreate() + { + SLOW_EXEC0(EExecTimerCreate); + } + +__EXECDECL__ void Exec::TimerHighRes(TInt, TRequestStatus&, TInt) + { + SLOW_EXEC3(EExecTimerHighRes); + } + +__EXECDECL__ void Exec::AfterHighRes(TInt, TRequestStatus&) + { + SLOW_EXEC2(EExecAfterHighRes); + } + +__EXECDECL__ TInt Exec::ChangeNotifierCreate(TOwnerType) + { + SLOW_EXEC1(EExecChangeNotifierCreate); + } + +__EXECDECL__ TInt Exec::UndertakerCreate(TOwnerType) + { + SLOW_EXEC1(EExecUndertakerCreate); + } + +__EXECDECL__ TInt Exec::UndertakerLogon(TInt, TRequestStatus&, TInt&) + { + SLOW_EXEC3(EExecUndertakerLogon); + } + +__EXECDECL__ TInt Exec::UndertakerLogonCancel(TInt) + { + SLOW_EXEC1(EExecUndertakerLogonCancel); + } + +__EXECDECL__ void Exec::KernelHeapDebug(TInt, TInt, TAny*) + { + SLOW_EXEC3(EExecKernelHeapDebug); + } + +__EXECDECL__ TInt Exec::ThreadGetCpuTime(TInt, EXEC_INT64&) + { + SLOW_EXEC2(EExecThreadGetCpuTime); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegCreate(TCodeSegCreateInfo&) + { + SLOW_EXEC1(EExecCodeSegCreate); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegLoaded(TCodeSegCreateInfo&) + { + SLOW_EXEC1(EExecCodeSegLoaded); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::LibraryCreate(TLibraryCreateInfo&) + { + SLOW_EXEC1(EExecLibraryCreate); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegOpen(TAny*, TInt) + { + SLOW_EXEC2(EExecCodeSegOpen); + } + +EXPORT_C __EXECDECL__ void E32Loader::CodeSegClose(TAny*) + { + SLOW_EXEC1(EExecCodeSegClose); + } + +EXPORT_C __EXECDECL__ void E32Loader::CodeSegNext(TAny*&, const TFindCodeSeg&) + { + SLOW_EXEC2(EExecCodeSegNext); + } + +EXPORT_C __EXECDECL__ void E32Loader::CodeSegInfo(TAny*, TCodeSegCreateInfo&) + { + SLOW_EXEC2(EExecCodeSegInfo); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::CodeSegAddDependency(TAny*, TAny*) + { + SLOW_EXEC2(EExecCodeSegAddDependency); + } + +EXPORT_C __EXECDECL__ void E32Loader::CodeSegDeferDeletes() + { + SLOW_EXEC0(EExecCodeSegDeferDeletes); + } + +EXPORT_C __EXECDECL__ void E32Loader::CodeSegEndDeferDeletes() + { + SLOW_EXEC0(EExecCodeSegEndDeferDeletes); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::ProcessCreate(TProcessCreateInfo&, const TDesC8*) + { + SLOW_EXEC2(EExecProcessCreate); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::ProcessLoaded(TProcessCreateInfo&) + { + SLOW_EXEC1(EExecProcessLoaded); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::CheckClientState(TInt) + { + SLOW_EXEC1(EExecCheckLoaderClientState); + } + +EXPORT_C __EXECDECL__ TAny* E32Loader::ThreadProcessCodeSeg(TInt) + { + SLOW_EXEC1(EExecThreadProcessCodeSeg); + } + +EXPORT_C __EXECDECL__ void E32Loader::ReadExportDir(TAny*, TLinAddr*) + { + SLOW_EXEC2(EExecCodeSegReadExportDir); + } + +__EXECDECL__ TInt E32Loader::WaitDllLock() + { + SLOW_EXEC0(EExecWaitDllLock); + } + +__EXECDECL__ TInt E32Loader::ReleaseDllLock() + { + SLOW_EXEC0(EExecReleaseDllLock); + } + +__EXECDECL__ TInt E32Loader::LibraryAttach(TInt, TInt&, TLinAddr*) + { + SLOW_EXEC3(EExecLibraryAttach); + } + +__EXECDECL__ TInt E32Loader::LibraryAttached(TInt) + { + SLOW_EXEC1(EExecLibraryAttached); + } + +__EXECDECL__ TInt E32Loader::StaticCallList(TInt&, TLinAddr*) + { + SLOW_EXEC2(EExecStaticCallList); + } + +__EXECDECL__ TInt E32Loader::LibraryDetach(TInt&, TLinAddr*) + { + SLOW_EXEC2(EExecLibraryDetach); + } + +__EXECDECL__ TInt E32Loader::LibraryDetached() + { + SLOW_EXEC0(EExecLibraryDetached); + } + +__EXECDECL__ TInt Exec::LastThreadHandle() + { + SLOW_EXEC0(EExecLastThreadHandle); + } + +__EXECDECL__ void Exec::ThreadRendezvous(TInt) + { + SLOW_EXEC1(EExecThreadRendezvous); + } + +__EXECDECL__ void Exec::ProcessRendezvous(TInt) + { + SLOW_EXEC1(EExecProcessRendezvous); + } + +__EXECDECL__ TInt Exec::MessageGetDesLength(TInt, TInt) + { + SLOW_EXEC2(EExecMessageGetDesLength); + } + +__EXECDECL__ TInt Exec::MessageGetDesMaxLength(TInt, TInt) + { + SLOW_EXEC2(EExecMessageGetDesMaxLength); + } + +__EXECDECL__ TInt Exec::MessageClient(TInt, TOwnerType) + { + SLOW_EXEC2(EExecMessageClient); + } + +__EXECDECL__ TInt Exec::MessageSetProcessPriority(TInt, TProcessPriority) + { + SLOW_EXEC2(EExecMessageSetProcessPriority); + } + +__EXECDECL__ void Exec::MessageConstructFromPtr(TInt, TAny*) + { + SLOW_EXEC2(EExecMessageConstructFromPtr); + } + +__EXECDECL__ void Exec::MessageKill(TInt, TExitType, TInt, const TDesC8*) + { + SLOW_EXEC4(EExecMessageKill); + } + +__EXECDECL__ TInt Exec::MessageOpenObject(TInt, TObjectType, TInt, TOwnerType) + { + SLOW_EXEC4(EExecMessageOpenObject); + } + +__EXECDECL__ void Exec::ProcessSecurityInfo(TInt, SSecurityInfo&) + { + SLOW_EXEC2(EExecProcessSecurityInfo); + } + +__EXECDECL__ void Exec::ThreadSecurityInfo(TInt, SSecurityInfo&) + { + SLOW_EXEC2(EExecThreadSecurityInfo); + } + +__EXECDECL__ void Exec::MessageSecurityInfo(TInt, SSecurityInfo&) + { + SLOW_EXEC2(EExecMessageSecurityInfo); + } + +__EXECDECL__ void Exec::CreatorSecurityInfo(SSecurityInfo&) + { + SLOW_EXEC1(EExecCreatorSecurityInfo); + } + +__EXECDECL__ void Exec::DisabledCapabilities(SCapabilitySet&) + { + SLOW_EXEC1(EExecDisabledCapabilities); + } + +__EXECDECL__ TInt Exec::ChunkSetRestrictions(TInt, TUint) + { + SLOW_EXEC2(EExecChunkSetRestrictions); + } + +__EXECDECL__ TInt Exec::MsgQueueCreate(const TDesC8*, TInt, TInt, TOwnerType) + { + SLOW_EXEC4(EExecMsgQueueCreate); + } + +__EXECDECL__ TInt Exec::MsgQueueSend(TInt, const TAny*, TInt) + { + SLOW_EXEC3(EExecMsgQueueSend); + } + +__EXECDECL__ TInt Exec::MsgQueueReceive(TInt, TAny*, TInt) + { + SLOW_EXEC3(EExecMsgQueueReceive); + } + +__EXECDECL__ void Exec::MsgQueueNotifySpaceAvailable(TInt, TRequestStatus&) + { + SLOW_EXEC2(EExecMsgQueueNotifySpaceAvailable); + } + +__EXECDECL__ void Exec::MsgQueueCancelSpaceAvailable(TInt) + { + SLOW_EXEC1(EExecMsgQueueCancelSpaceAvailable); + } + +__EXECDECL__ void Exec::MsgQueueNotifyDataAvailable(TInt, TRequestStatus&) + { + SLOW_EXEC2(EExecMsgQueueNotifyDataAvailable); + } + +__EXECDECL__ void Exec::MsgQueueCancelDataAvailable(TInt) + { + SLOW_EXEC1(EExecMsgQueueCancelDataAvailable); + } + +__EXECDECL__ TInt Exec::MsgQueueSize(TInt) + { + SLOW_EXEC1(EExecMsgQueueSize); + } + +__EXECDECL__ TInt Exec::PropertyDefine(TUint, TUint, TPropertyInfo*) + { + SLOW_EXEC3(EExecPropertyDefine); + } + +__EXECDECL__ TInt Exec::PropertyDelete(TUint, TUint) + { + SLOW_EXEC2(EExecPropertyDelete); + } + +__EXECDECL__ TInt Exec::PropertyAttach(TUint, TUint, TOwnerType) + { + SLOW_EXEC3(EExecPropertyAttach); + } + +__EXECDECL__ void Exec::PropertySubscribe(TInt, TRequestStatus*) + { + SLOW_EXEC2(EExecPropertySubscribe); + } + +__EXECDECL__ void Exec::PropertyCancel(TInt) + { + SLOW_EXEC1(EExecPropertyCancel); + } + +__EXECDECL__ TInt Exec::PropertyGetI(TInt, TInt*) + { + SLOW_EXEC2(EExecPropertyGetI); + } + +__EXECDECL__ TInt Exec::PropertyGetB(TInt, TUint8*, TInt) + { + SLOW_EXEC3(EExecPropertyGetB); + } + +__EXECDECL__ TInt Exec::PropertySetI(TInt, TInt) + { + SLOW_EXEC2(EExecPropertySetI); + } + +__EXECDECL__ TInt Exec::PropertySetB(TInt, const TUint8*, TInt) + { + SLOW_EXEC3(EExecPropertySetB); + } + +__EXECDECL__ TInt Exec::PropertyFindGetI(TUint, TUint, TInt*) + { + SLOW_EXEC3(EExecPropertyFindGetI); + } + +__EXECDECL__ TInt Exec::PropertyFindGetB(TUint, TUint, TUint8*, TInt) + { + SLOW_EXEC4(EExecPropertyFindGetB); + } + +__EXECDECL__ TInt Exec::PropertyFindSetI(TUint, TUint, TInt) + { + SLOW_EXEC3(EExecPropertyFindSetI); + } + +__EXECDECL__ TInt Exec::PropertyFindSetB(TUint, TUint, TUint8*, TInt) + { + SLOW_EXEC4(EExecPropertyFindSetB); + } + +__EXECDECL__ TInt Exec::PowerEnableWakeupEvents(TPowerState) + { + SLOW_EXEC1(EExecPowerEnableWakeupEvents); + } + +__EXECDECL__ void Exec::PowerDisableWakeupEvents() + { + SLOW_EXEC0(EExecPowerDisableWakeupEvents); + } + +__EXECDECL__ void Exec::PowerRequestWakeupEventNotification(TRequestStatus*) + { + SLOW_EXEC1(EExecPowerRequestWakeupEventNotification); + } + +__EXECDECL__ void Exec::PowerCancelWakeupEventNotification() + { + SLOW_EXEC0(EExecPowerCancelWakeupEventNotification); + } + +__EXECDECL__ TInt Exec::PowerDown() + { + SLOW_EXEC0(EExecPowerDown); + } + +__EXECDECL__ TInt Exec::ProcessSetHandleParameter(TInt, TInt, TInt) + { + SLOW_EXEC3(EExecProcessSetHandleParameter); + } + +__EXECDECL__ TInt Exec::ProcessSetDataParameter(TInt, TInt, const TUint8*, TInt) + { + SLOW_EXEC4(EExecProcessSetDataParameter); + } + +__EXECDECL__ TInt Exec::ProcessGetHandleParameter(TInt, TObjectType, TOwnerType) + { + SLOW_EXEC3(EExecProcessGetHandleParameter); + } + +__EXECDECL__ TInt Exec::ProcessGetDataParameter(TInt, TUint8*, TInt) + { + SLOW_EXEC3(EExecProcessGetDataParameter); + } + +__EXECDECL__ TInt Exec::ProcessDataParameterLength(TInt) + { + SLOW_EXEC1(EExecProcessDataParameterLength); + } + +__EXECDECL__ TUint Exec::MessageClientProcessFlags(TInt) + { + SLOW_EXEC1(EExecMessageClientProcessFlags); + } + +__EXECDECL__ TInt Exec::ThreadStackInfo(TInt, TThreadStackInfo&) + { + SLOW_EXEC2(EExecThreadStackInfo); + } + +__EXECDECL__ RAllocator* Exec::ThreadGetHeap(TInt) + { + SLOW_EXEC1(EExecThreadGetHeap); + } + +__EXECDECL__ TInt Exec::ThreadAsProcess(TInt, TInt) + { + SLOW_EXEC2(EExecThreadAsProcess); + } + +__EXECDECL__ TInt Exec::CondVarCreate(const TDesC8*, TOwnerType) + { + SLOW_EXEC2(EExecCondVarCreate); + } + +__EXECDECL__ TInt Exec::CondVarWait(TInt, TInt, TInt) + { + SLOW_EXEC3(EExecCondVarWait); + } + +__EXECDECL__ void Exec::CondVarSignal(TInt) + { + SLOW_EXEC1(EExecCondVarSignal); + } + +__EXECDECL__ void Exec::CondVarBroadcast(TInt) + { + SLOW_EXEC1(EExecCondVarBroadcast); + } + +__EXECDECL__ TInt Exec::PlatSecDiagnostic(TPlatSecDiagnostic*) + { + SLOW_EXEC1(EExecPlatSecDiagnostic); + } + +__EXECDECL__ TLinAddr Exec::ExceptionDescriptor(TLinAddr) + { + SLOW_EXEC1(EExecExceptionDescriptor); + } + +__EXECDECL__ void Exec::ThreadRequestSignal(TInt) + { + SLOW_EXEC1(EExecThreadRequestSignal); + } + +__EXECDECL__ TBool Exec::MutexIsHeld(TInt) + { + SLOW_EXEC1(EExecMutexIsHeld); + } + +__EXECDECL__ TTrapHandler* Exec::LeaveStart() + { + SLOW_EXEC0(EExecLeaveStart); + } + +__EXECDECL__ void Exec::LeaveEnd() + { + SLOW_EXEC0(EExecLeaveEnd); + } + +__EXECDECL__ void Exec::SetDebugMaskIndex(TUint32, TUint) + { + SLOW_EXEC2(EExecSetDebugMaskIndex); + } + +__EXECDECL__ TInt Exec::GetModuleNameFromAddress(TAny*, TDes8&) + { + SLOW_EXEC2(EExecGetModuleNameFromAddress); + } + +__EXECDECL__ void Exec::NotifyChanges(TUint) + { + SLOW_EXEC1(EExecNotifyChanges); + } + +__EXECDECL__ TInt Exec::SetGlobalUserData(TInt, TInt) + { + SLOW_EXEC2(EExecSetGlobalUserData); + } + +__EXECDECL__ TInt Exec::SessionSecurityInfo(TInt, SSecurityInfo&) + { + SLOW_EXEC2(EExecSessionSecurityInfo); + } + +__EXECDECL__ const TRequestStatus* Exec::MessageClientStatus(TInt) + { + SLOW_EXEC1(EExecMessageClientStatus); + } + +__EXECDECL__ TInt Exec::SetFloatingPointMode(TFloatingPointMode, TFloatingPointRoundingMode) + { + SLOW_EXEC2(EExecSetFloatingPointMode); + } + +EXPORT_C __EXECDECL__ TBool BTrace::CheckFilter2(TUint32, TUint32) + { + SLOW_EXEC2(EExecCheckFilter2); + } + +__EXECDECL__ TAny* Exec::ProcessExeExportData() + { + SLOW_EXEC0(EExecProcessExeExportData); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::NotifyIfCodeSegDestroyed(TRequestStatus&) + { + SLOW_EXEC1(EExecNotifyIfCodeSegDestroyed); + } + +EXPORT_C __EXECDECL__ TInt E32Loader::GetDestroyedCodeSegInfo(TCodeSegLoaderCookie&) + { + SLOW_EXEC1(EExecGetDestroyedCodeSegInfo); + } + +EXPORT_C __EXECDECL__ TInt Exec::SetWin32RuntimeHook(TAny*) + { + SLOW_EXEC1(EExecSetWin32RuntimeHook); + } + +__EXECDECL__ TInt Exec::GetBTraceId(TInt) + { + SLOW_EXEC1(EExecGetBTraceId); + } + +__EXECDECL__ void Exec::NotifyOnIdle(TRequestStatus*) + { + SLOW_EXEC1(EExecNotifyOnIdle); + } + +__EXECDECL__ void Exec::CancelMiscNotifier(TRequestStatus*) + { + SLOW_EXEC1(EExecCancelMiscNotifier); + } + +__EXECDECL__ void Exec::NotifyObjectDestruction(TInt, TRequestStatus*) + { + SLOW_EXEC2(EExecNotifyObjectDestruction); + } + +__EXECDECL__ void Exec::RegisterTrustedChunk(TInt) + { + SLOW_EXEC1(EExecRegisterTrustedChunk); + } + +__EXECDECL__ TBool Exec::UserThreadExiting(TInt) + { + SLOW_EXEC1(EExecUserThreadExiting); + } + +#endif diff -r c55016431358 -r 0a7b44b10206 symport/symuser/exestub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/exestub.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,25 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +extern TInt E32Main(); +IMPORT_C void SymInit(int argc, char *argv[]); + +int main(int argc, char *argv[]) + { + SymInit(argc, argv); + return E32Main(); + } diff -r c55016431358 -r 0a7b44b10206 symport/symuser/loader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/loader.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,142 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +#include +#include +#include + +#ifndef __linux__ +#include +#include + +// Windows version of the function +TInt RLoader::LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList) + { + typedef int (__cdecl *MYPROC)(LPWSTR); + MYPROC myFunc; + TBuf<256> nameBuf; + nameBuf.Copy(aLocaleDllName); + nameBuf.ZeroTerminate(); + + iHandle = (TAny*)LoadLibraryEx((const WCHAR*)(nameBuf.Ptr()), NULL, DONT_RESOLVE_DLL_REFERENCES|LOAD_WITH_ALTERED_SEARCH_PATH); + if ( iHandle == NULL ) + { + DWORD err = GetLastError(); + printf("Error loading locale: Win system error %lu", (unsigned long)err); + return KErrGeneral; + } + + for ( TInt i = 1 ; i < KNumLocaleExports ; i ++ ) + { + myFunc = (MYPROC) GetProcAddress((HMODULE)iHandle, (LPCSTR)i); + if ( myFunc != NULL ) + { + aExportList[i] = (TLibraryFunction)myFunc; + } + else + { + DWORD err = GetLastError(); + printf("Error loading locale function: Win system error %lu", (unsigned long)err); + FreeLibrary((HMODULE)iHandle); + return KErrGeneral; + } + } + return KErrNone; + } + +void RLoader::Free() + { + if (iHandle != NULL) + { + FreeLibrary((HMODULE)iHandle); + iHandle = NULL; + } + } + +#else + +#include + +// Mangled function names +const char funcnames [22][60] = + { + "Dummy", + "_ZN4Locl9AmPmTableEv", + "_ZN4Locl7CharSetEv", + "_ZN4Locl9CollTableEv", + "_ZN4Locl14CurrencySymbolEv", + "_ZN4Locl15DateSuffixTableEv", + "_ZN4Locl11DayAbbTableEv", + "_ZN4Locl8DayTableEv", + "_ZN4Locl9FoldTableEv", + "_ZN4Locl8LanguageEv", + "_ZN4Locl10LocaleDataEP11SLocaleData", + "_ZN4Locl10LowerTableEv", + "_ZN4Locl13MonthAbbTableEv", + "_ZN4Locl10MonthTableEv", + "_ZN4Locl8MsgTableEv", + "_ZN4Locl9TypeTableEv", + "_ZN4Locl7UniCodeEv", + "_ZN4Locl10UpperTableEv", + "_ZN4Locl19ShortDateFormatSpecEv", + "_ZN4Locl18LongDateFormatSpecEv", + "_ZN4Locl19FatUtilityFunctionsEv", + }; + +// Linux version of the function +TInt RLoader::LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList) + { + TBuf8<256> nameBuf; + nameBuf.Copy(aLocaleDllName); + const char* name = reinterpret_cast(nameBuf.PtrZ()); + + iHandle = dlopen(name, RTLD_NOW); + TLibraryFunction myFunc; + + if(iHandle == NULL) { + printf("Error loading locale: %s\n", dlerror()); + return KErrGeneral; + } + + for ( TInt i = 1 ; i < KNumLocaleExports ; i ++ ) + { + myFunc = (TLibraryFunction) dlsym(iHandle, funcnames[i]); + if ( myFunc != NULL ) + { + aExportList[i] = (TLibraryFunction)myFunc; + } + else + { + printf("Error loading locale function: %s\n", dlerror()); + dlclose(iHandle); + return KErrGeneral; + } + } + return KErrNone; + } + +void RLoader::Free() + { + if ( iHandle != NULL ) + { + dlclose(iHandle); + iHandle = NULL; + } + } + +#endif + diff -r c55016431358 -r 0a7b44b10206 symport/symuser/new.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/new.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,50 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "e32std.h" + +EXPORT_C TAny* operator new(TUint aSize) __NO_THROW +// +// The global new operator. +// + { + return User::Alloc(aSize); + } + +EXPORT_C TAny* operator new[](TUint aSize) __NO_THROW + { + return User::Alloc(aSize); + } + +EXPORT_C TAny* operator new(TUint aSize, TUint aExtraSize) __NO_THROW +// +// Allocate the requested size plus the extra. +// + { + return User::Alloc(aSize + aExtraSize); + } + +EXPORT_C void operator delete(TAny* aPtr) __NO_THROW +// +// The replacement delete operator. +// + { + User::Free(aPtr); + } + +EXPORT_C void operator delete[](TAny* aPtr) __NO_THROW + { + User::Free(aPtr); + } diff -r c55016431358 -r 0a7b44b10206 symport/symuser/symuser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/symuser.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,67 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// main.cpp +// +// + +#include +#include + +#include "e32base.h" +#include "us_data.h" +#include "e32const.h" + +// Globals +TLocalThreadData gThreadData; +int gArgc = 0; +char **gArgv = NULL; + +// *** +// LocalThreadData +// +TLocalThreadData* LocalThreadData() + { + return &gThreadData; + } + +// *** +// ForceKeyFunction +// This is the key function that forces the class impedimenta to be get exported +// +#if (defined(__TOOLS2__) && defined(__linux__)) +EXPORT_C void XLeaveException::ForceKeyFunction() + { + } +#endif + +// *** +// main +// +EXPORT_C void SymInit(int argc, char *argv[]) + { + gArgc = argc; + gArgv = argv; + srand(time(NULL)); + } + +const TInt KIrrelevantInt = 1; + +EXPORT_C TThreadId RThread::Id() const{ return KIrrelevantInt;} + +EXPORT_C void RThread::SetPriority(TThreadPriority aPriority) const{} + +EXPORT_C TThreadPriority RThread::Priority() const{ return EPriorityNormal; } + +//end of file + diff -r c55016431358 -r 0a7b44b10206 symport/symuser/test.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/test.pl Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,152 @@ +#!/usr/bin/perl + +# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +use strict; +use warnings; +use Test; +use Getopt::Long qw(:config auto_version auto_help); +use File::Spec::Functions; +use File::Basename; +use File::Copy; + +# The following are the tests to run +BEGIN { plan tests => 60 } +my @tests = qw/t_bflat t_bseg t_buf t_rbuf t_char t_circ t_collate t_des t_farray t_func t_graph t_key t_lex t_match t_parray t_que t_readar t_regn t_sque t_varray t_versio t_hashtab t_huff t_float t_i64 t_i64_2 t_math t_math2 t_trap t_ctrap/; + +# Make sure we're in the correct folder +chdir('../symuser') or die "Failed to set folder: $!"; + +# Version of the script - just use the date +$main::VERSION = '13-Oct-08'; + +# Get command line arguments +print "\n"; +my ( $verbose, $skip ); +GetOptions("verbose" => \$verbose, "skip" => \$skip) or pod2usage(2); + +my $win32 = 1 if $^O =~ /MSWin32/; +print "Running on Win32\n" if $win32 && $verbose; +print "Running on Linux\n" if !$win32 && $verbose; + +# Some files have to be copied to an accessible location +unlink 'UnicodeData.txt'; +copy(catfile('..', 'e32test', 'buffer', 'UnicodeData.txt'), 'unicodedata.txt') or die "Failed to copy file: $!"; + +# Build the code and run the tests +doBuild() if (!$skip); +foreach my $test ( @tests ) + { + doTest('deb', $test); + doTest('rel', $test); + } + +# *** +# Runs test code +# +sub doTest + { + my ( $variant, $name ) = @_; + + my $test; + if ($win32) + { + $test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', $variant, "$name.exe"); + } + else + { + # Have to set library path for Linux + $ENV{LD_LIBRARY_PATH} =~ s[/epoc32[^:]+:/][]; + $ENV{LD_LIBRARY_PATH} = "$ENV{EPOCROOT}epoc32/release/tools2/linux-i386/$variant:$ENV{LD_LIBRARY_PATH}"; + $test = catfile($ENV{EPOCROOT}, 'epoc32', 'release', 'tools2', 'linux-i386', $variant, $name); + } + + die "Can't find test exe: $test" if !-e $test; + print "Running test: $test\n" if $verbose; + + my $pass; + open TEST, "$test|" or die "Failed to start test $test: $!"; + while() + { + print "\t$_" if $verbose; + $pass = 1 if /^RTEST: SUCCESS/ or /TEST Successfully Completed/; + } + + print "FAIL: $test\n" if (!$pass); + ok($pass); + close TEST; + } + +# *** +# Builds the test code +# * +sub doBuild + { + # First of all see if SBSv2 is installed + my $sbs_ver = 1; + open SBS, 'sbs -v 2>&1|' or die "Failed to execute command: $!"; + while() + { + if (/^sbs version/) + { + $sbs_ver = 2; + last; + } + } + close SBS; + + # Override the result using environment variable + $sbs_ver = 1 if $ENV{SBS_VERSION} && $ENV{SBS_VERSION} == 1; + my $nul = $win32 ? 'nul' : '/dev/null'; + my $redir = $verbose? '' : " >$nul 2>&1"; + + # Now build the test code - assumes current working directory is correct! + print "Building test code using SBSv$sbs_ver\n" if $verbose; + if ($sbs_ver == 1) + { + print "Building test code using SBSv1\n"; + + # Use the old build system + system("bldmake bldfiles$redir"); + system("abld test makefile$redir"); + system("abld test clean$redir"); + system("abld test build$redir"); + } + else + { + print "Building test code using SBSv2\n"; + + # Use the new build system + system("sbs -c tools2.test CLEAN$redir"); + system("sbs -c tools2.test$redir"); + } + } + +=head1 NAME + +test.pl - A script for running tests + +=head1 SYNOPSIS + +test.pl [-help] [-version] [-verbose] [-skip] + + Options: + -help brief help message + -version version of the script + -verbose print what the scripts does + -skip skip building the code + +=cut diff -r c55016431358 -r 0a7b44b10206 symport/symuser/x86hlp.cia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symuser/x86hlp.cia Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,18 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "u32std.h" +#include + diff -r c55016431358 -r 0a7b44b10206 symport/symutil/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symutil/group/bld.inf Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,35 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_EXPORTS + +../inc/errorstrings.h /epoc32/include/x86tool/ +../inc/errortranslator.h /epoc32/include/x86tool/ +../inc/utils.h /epoc32/include/x86tool/ + +PRJ_PLATFORMS +TOOLS2 + + +PRJ_EXTENSIONS + +#ifdef TOOLS2 +start extension tools/x86tool +option TARGET_NAME symutil +option TARGET_TYPE lib +option SOURCE_DIRS ../src +option INCLUDES ../inc ../../e32/include +end +#endif diff -r c55016431358 -r 0a7b44b10206 symport/symutil/inc/errorstrings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symutil/inc/errorstrings.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,62 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +ERRORSTRING(No error [KErrNone]), +ERRORSTRING(Unable to find the specified object [KErrNotFound]), +ERRORSTRING(General (unspecified) error [KErrGeneral]), +ERRORSTRING(The operation was cancelled [KErrCancel]), +ERRORSTRING(Not enough memory. Close some applications and try again [KErrNoMemory]), +ERRORSTRING(The operation requested is not supported [KErrNotSupported]), +ERRORSTRING(Malformed query [KErrArgument]), +ERRORSTRING(Total loss of precision [KErrTotalLossOfPrecision]), +ERRORSTRING(Bad object [KErrBadHandle]), +ERRORSTRING(Overflow [KErrOverflow]), +ERRORSTRING(Underflow [KErrUnderflow]), +ERRORSTRING(Already exists [KErrAlreadyExists]), +ERRORSTRING(Unable to find the specified folder [KErrPathNotFound]), +ERRORSTRING(Closed [KErrDied]), +ERRORSTRING(The specified object is currently in use by another program [KErrInUse]), +ERRORSTRING(Server has closed [KErrServerTerminated]), +ERRORSTRING(Server busy [KErrServerBusy]), +ERRORSTRING(Completion error [KErrCompletion]), +ERRORSTRING(Not ready [KErrNotReady]), +ERRORSTRING(Unknown error [KErrUnknown]), +ERRORSTRING(Corrupt [KErrCorrupt]), +ERRORSTRING(Access denied [KErrAccessDenied]), +ERRORSTRING(Locked [KErrLocked]), +ERRORSTRING(Failed to write [KErrWrite]), +ERRORSTRING(Wrong disk present [KErrDisMounted]), +ERRORSTRING(Unexpected end of file [KErrEof]), +ERRORSTRING(Disk full [KErrDiskFull]), +ERRORSTRING(Bad device driver [KErrBadDriver]), +ERRORSTRING(Bad name [KErrBadName]), +ERRORSTRING(Comms line failed [KErrCommsLineFail]), +ERRORSTRING(Comms frame error [KErrCommsFrame]), +ERRORSTRING(Comms overrun error [KErrCommsOverrun]), +ERRORSTRING(Comms parity error [KErrCommsParity]), +ERRORSTRING(Timed out [KErrTimedOut]), +ERRORSTRING(Failed to connect [KErrCouldNotConnect]), +ERRORSTRING(Failed to disconnect [KErrCouldNotDisconnect]), +ERRORSTRING(Disconnected [KErrDisconnected]), +ERRORSTRING(Bad library entry point [KErrBadLibraryEntryPoint]), +ERRORSTRING(Bad descriptor [KErrBadDescriptor]), +ERRORSTRING(Interrupted [KErrAbort]), +ERRORSTRING(Too big [KErrTooBig]), +ERRORSTRING(Divide by zero [KErrDivideByZero]), +ERRORSTRING(Batteries too low [KErrBadPower]), +ERRORSTRING(Folder full [KErrDirFull]), +ERRORSTRING(Hardware not available [KErrHardwareNotAvailable]), +ERRORSTRING(Session closed [KErrSessionClosed]), +ERRORSTRING(Permission denied when attempting operatio [KErrPermissionDenied]) diff -r c55016431358 -r 0a7b44b10206 symport/symutil/inc/errortranslator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symutil/inc/errortranslator.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,18 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +void TranslateError(TInt aErrorCode, TDes8& aTarget); diff -r c55016431358 -r 0a7b44b10206 symport/symutil/inc/utils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symutil/inc/utils.h Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,40 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include + +/** + * Creates a NULL terminated string from aSource and stores into aTarget. + */ +extern const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC8& aSource); + +/** + * Creates a NULL terminated string from aSource and stores into aTarget. + * The 16 to 8 bit conversion is performed via TDes16::Collapse + */ +extern const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC& aSource); + +/** + * Creates a NULL terminated string from aSource and stores into aTarget. + */ +extern const TInt CreateNullTerminatedString(TDes& aTarget, const TDesC& aSource); + + +extern const void TTime_to_time_t(TTime& aSource, time_t& aTarget) ; + +extern const void TTime_to_tm(TTime& aTime, struct tm& aTarget ) ; + +extern const void time_t_to_TTime(time_t& aSource, TTime& aTarget) ; diff -r c55016431358 -r 0a7b44b10206 symport/symutil/src/errortranslator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symutil/src/errortranslator.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,51 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +const TInt KMaxErrorStringLength = 100; +static const TText8 KErrorMessages[][KMaxErrorStringLength+1]= + { +#define ERRORSTRING(s) #s +#include "errorstrings.h" +#undef ERRORSTRING + }; + + +void TranslateError(TInt aErrorCode, TDes8& aTarget) + { + aErrorCode = - aErrorCode; + if ( aErrorCode > 46 ) + { + _LIT8(KNoTranslationAvailable, ""); + aTarget.Copy(KNoTranslationAvailable); + aTarget.Append(' '); + aTarget.Append('-'); + aTarget.AppendNum(aErrorCode); + } + else if ( aErrorCode >= 0 ) + { + aTarget.Copy(KErrorMessages[aErrorCode]); + } + else + { + _LIT8(KNoTranslationAvailable, ""); + aTarget.Copy(KNoTranslationAvailable); + aTarget.Append(' '); + aTarget.AppendNum(aErrorCode); + } + } + +// end of file diff -r c55016431358 -r 0a7b44b10206 symport/symutil/src/utils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/symutil/src/utils.cpp Thu Jun 25 15:59:54 2009 +0100 @@ -0,0 +1,91 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +/** + * Creates a NULL terminated string from aSource and stores into aTarget. + */ +const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC8& aSource) + { + aTarget.Append(aSource); + aTarget.Append('\0'); + return KErrNone; + } + +/** + * Creates a NULL terminated string from aSource and stores into aTarget. + * The 16 to 8 bit conversion is performed via TDes16::Collapse + */ +const TInt CreateNullTerminatedString(TDes8& aTarget, const TDesC& aSource) + { + aTarget.Copy(aSource); + aTarget.Append('\0'); + return KErrNone; + } + +/** + * Creates a NULL terminated string from aSource and stores into aTarget. + */ +const TInt CreateNullTerminatedString(TDes& aTarget, const TDesC& aSource) + { + aTarget.Append(aSource); + aTarget.Append('\0'); + return KErrNone; + } + +const void TTime_to_time_t(TTime& aSource, time_t& aTarget) + { + TDateTime dateTime = aSource.DateTime(); + struct tm stm; + + stm.tm_year = dateTime.Year() - 1900; + stm.tm_mon = (int)dateTime.Month(); + stm.tm_mday = 1 + dateTime.Day(); + stm.tm_hour = dateTime.Hour(); + stm.tm_min = dateTime.Minute(); + stm.tm_sec = dateTime.Second(); + + aTarget = mktime(&stm); + } + +const void TTime_to_tm(TTime& aSource, tm& aTarget ) + { + TDateTime dateTime = aSource.DateTime(); + aTarget.tm_year = dateTime.Year() - 1900; + aTarget.tm_mon = (int)dateTime.Month(); + aTarget.tm_mday = 1 + dateTime.Day(); + aTarget.tm_hour = dateTime.Hour(); + aTarget.tm_min = dateTime.Minute(); + aTarget.tm_sec = dateTime.Second(); + } + +const void time_t_to_TTime(time_t& aSource, TTime& aTarget) + { + struct tm* ptm = localtime( &aSource ); + + TDateTime datetime ( + ptm->tm_year +1900, + (TMonth)(EJanuary + ptm->tm_mon), + ptm->tm_mday - 1, + ptm->tm_hour, + ptm->tm_min, + ptm->tm_sec, 0 + ); + TTime tmp(datetime); + aTarget = tmp; + } + +//end of file